ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDQ2NTg5M2QuLmM4N2MyNmYgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNiwzICs2LDQgQEAKIC90ZXN0X3NpdGUKIC8uaWRlYQogL2dlcnJpdC1wYXJlbnQuaW1sCisqLnN1YmxpbWUtKgpkaWZmIC0tZ2l0IGEvLmdpdG1vZHVsZXMgYi8uZ2l0bW9kdWxlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjdmZGFiCi0tLSAvZGV2L251bGwKKysrIGIvLmdpdG1vZHVsZXMKQEAgLTAsMCArMSwxMSBAQAorW3N1Ym1vZHVsZSAicGx1Z2lucy9yZXBsaWNhdGlvbiJdCisJcGF0aCA9IHBsdWdpbnMvcmVwbGljYXRpb24KKwl1cmwgPSBodHRwczovL2dlcnJpdC5nb29nbGVzb3VyY2UuY29tL3BsdWdpbnMvcmVwbGljYXRpb24KKworW3N1Ym1vZHVsZSAicGx1Z2lucy9yZXZpZXdub3RlcyJdCisJcGF0aCA9IHBsdWdpbnMvcmV2aWV3bm90ZXMKKwl1cmwgPSBodHRwczovL2dlcnJpdC5nb29nbGVzb3VyY2UuY29tL3BsdWdpbnMvcmV2aWV3bm90ZXMKKworW3N1Ym1vZHVsZSAicGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yIl0KKwlwYXRoID0gcGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yCisJdXJsID0gaHR0cHM6Ly9nZXJyaXQuZ29vZ2xlc291cmNlLmNvbS9wbHVnaW5zL2NvbW1pdC1tZXNzYWdlLWxlbmd0aC12YWxpZGF0b3IKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlCmluZGV4IDRjNjRkZmUuLjU5ZGUyMDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogCiBBU0NJSURPQyAgICAgICA/PSBhc2NpaWRvYwogQVNDSUlET0NfRVhUUkEgPz0KK0FTQ0lJRE9DX1ZFUiAgID89IDguNi4zCiBTVk4gICAgICAgICAgICA/PSBzdm4KIFBVQl9ST09UICAgICAgID89IGh0dHBzOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24KIApAQCAtMjMsNiArMjQsMTYgQEAKIAlybSAtZiAqLmh0bWwKIAlybSAtcmYgJChMT0NBTF9ST09UKQogCitBU0NJSURPQ19FWEUgOj0gJChzaGVsbCB3aGljaCAkKEFTQ0lJRE9DKSkKK2lmZXEgKCQod2lsZGNhcmQgJChBU0NJSURPQ19FWEUpKSwpCisgICQoZXJyb3IgJChBU0NJSURPQykgbXVzdCBiZSBhdmFpbGFibGUpCitlbHNlCisgIEFTQ0lJRE9DX09LIDo9ICQoc2hlbGwgZXhwciBgYXNjaWlkb2MgLS12ZXJzaW9uIHwgY3V0IC1mMiAtZCcgJ2AgXD49ICQoQVNDSUlET0NfVkVSKSkKKyAgaWZlcSAoJChBU0NJSURPQ19PSyksMCkKKyAgICAkKGVycm9yICQoQVNDSUlET0MpIHZlcnNpb24gJChBU0NJSURPQ19WRVIpIG9yIGhpZ2hlciBpcyByZXF1aXJlZCkKKyAgZW5kaWYKK2VuZGlmCisKIGlmZXEgKCQob3JpZ2luIFZFUlNJT04pLCB1bmRlZmluZWQpCiAgIFZFUlNJT04gOj0gJChzaGVsbCAuL0dFTi1ET0MtVkVSU0lPTiAyPi9kZXYvbnVsbCkKIGVuZGlmCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjY2Vzcy1jb250cm9sLnR4dCBiL0RvY3VtZW50YXRpb24vYWNjZXNzLWNvbnRyb2wudHh0CmluZGV4IDg3OWQxYWMuLjEwMGU0NzMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYWNjZXNzLWNvbnRyb2wudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYWNjZXNzLWNvbnRyb2wudHh0CkBAIC0xNSw2ICsxNSw3IEBACiBpbiB0aGUgYHN5c3RlbV9jb25maWdgIHRhYmxlIHdpdGhpbiB0aGUgZGF0YWJhc2UsIHNvIHRoZSBncm91cHMKIGNhbiBiZSByZW5hbWVkIGFmdGVyIGluc3RhbGxhdGlvbiBpZiBkZXNpcmVkLgogCisKIFtbYWRtaW5pc3RyYXRvcnNdXQogQWRtaW5pc3RyYXRvcnMKIH5+fn5+fn5+fn5+fn5+CkBAIC0zMyw2ICszNCw3IEBACiB0byBwZXJtaXQgYWRtaW5pc3RyYXRpdmUgdXNlcnMgdG8gb3RoZXJ3aXNlIGFjY2VzcyBHZXJyaXQgYXMgYW55CiBvdGhlciBub3JtYWwgdXNlciB3b3VsZCwgd2l0aG91dCBuZWVkaW5nIHR3byBkaWZmZXJlbnQgYWNjb3VudHMuCiAKKwogW1thbm9ueW1vdXNfdXNlcnNdXQogQW5vbnltb3VzIFVzZXJzCiB+fn5+fn5+fn5+fn5+fn4KQEAgLTQ4LDEyICs1MCwxMyBAQAogdG8gZ3JhbnQgYFJlYWRgIGFjY2VzcyB0byB0aGlzIGdyb3VwIGFzIEdlcnJpdCByZXF1aXJlcyBhbiBhY2NvdW50CiBpZGVudGl0eSBmb3IgYWxsIG90aGVyIG9wZXJhdGlvbnMuCiAKKwogW1tub24taW50ZXJhY3RpdmVfdXNlcnNdXQogTm9uLUludGVyYWN0aXZlIFVzZXJzCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogVGhpcyBpcyBhbiBpbnRlcm5hbCB1c2VyIGdyb3VwLCBtZW1iZXJzIG9mIHRoaXMgZ3JvdXAgYXJlIG5vdCBleHBlY3RlZAotdG8gcGVyZm9ybSBpbnRlcmFjdGl2ZSBvcGVyYXRpb25zIG9uIHRoZSBHZXJyaXQgd2ViIGZyb250ZW5kLgordG8gcGVyZm9ybSBpbnRlcmFjdGl2ZSBvcGVyYXRpb25zIG9uIHRoZSBHZXJyaXQgd2ViIGZyb250LWVuZC4KIAogSG93ZXZlciwgc29tZXRpbWVzIHN1Y2ggYSB1c2VyIG1heSBuZWVkIGEgc2VwYXJhdGUgdGhyZWFkIHBvb2wgaW4KIG9yZGVyIHRvIHByZXZlbnQgaXQgZnJvbSBncmFiYmluZyB0aHJlYWRzIGZyb20gdGhlIGludGVyYWN0aXZlIHVzZXJzLgpAQCAtNjMsNiArNjYsNyBAQAogdXNlcnMuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBpbnRlcmFjdGl2ZSB1c2VycyBjYW4ga2VlcCB3b3JraW5nIHdoZW4KIHJlc291cmNlcyBhcmUgdGlnaHQuCiAKKwogW1twcm9qZWN0X293bmVyc11dCiBQcm9qZWN0IE93bmVycwogfn5+fn5+fn5+fn5+fn4KQEAgLTgwLDYgKzg0LDcgQEAKIGF2b2lkIHRoZSBuZWVkIHRvIGluaXRpYWxseSBjb25maWd1cmUgYWNjZXNzIHJpZ2h0cyBmb3IKIG5ld2x5IGNyZWF0ZWQgY2hpbGQgcHJvamVjdHMuCiAKKwogW1tyZWdpc3RlcmVkX3VzZXJzXV0KIFJlZ2lzdGVyZWQgVXNlcnMKIH5+fn5+fn5+fn5+fn5+fn4KQEAgLTkzLDcgKzk4LDcgQEAKIGdyb3VwIGlzIHZlcnkgZWFzeS4gIENhdXRpb24gc2hvdWxkIGJlIHRha2VuIHdoZW4gYXNzaWduaW5nIGFueQogcGVybWlzc2lvbnMgdG8gdGhpcyBncm91cC4KIAotSXQgaXMgdHlwaWNhbCB0byBhc3NpZ24gYENvZGUgUmV2aWV3IC0xLi4rMWAgdG8gdGhpcyBncm91cCwKK0l0IGlzIHR5cGljYWwgdG8gYXNzaWduIGBDb2RlLVJldmlldyAtMS4uKzFgIHRvIHRoaXMgZ3JvdXAsCiBhbGxvd2luZyBzaWduZWQtaW4gdXNlcnMgdG8gdm90ZSBvbiBhIGNoYW5nZSwgYnV0IG5vdCBhY3R1YWxseQogY2F1c2UgaXQgdG8gYmVjb21lIGFwcHJvdmVkIG9yIHJlamVjdGVkLgogCkBAIC0xMzUsNiArMTQwLDE4IEBACiBgRm9vLWFkbWluYCB0eXBpY2FsbHkgZG8gbm90IG5lZWQgdG8gaGF2ZSBzdWNoIHJpZ2h0cy4KIAogCitbW2xkYXBfZ3JvdXBzXV0KK0xEQVAgR3JvdXBzCistLS0tLS0tLS0tLQorCitMREFQIGdyb3VwcyBhcmUgQWNjb3VudCBHcm91cHMgdGhhdCBhcmUgbWFpbnRhaW5lZCBpbnNpZGUgb2YgeW91cgorTERBUCBpbnN0YW5jZS4gSWYgeW91IGFyZSB1c2luZyBMREFQIHRvIG1hbmFnZSB5b3VyIGdyb3VwcyB0aGV5IHdpbGwKK25vdCBhcHBlYXIgaW4gdGhlIEdyb3VwcyBsaXN0LiBIb3dldmVyIHlvdSBjYW4gdXNlIHRoZW0ganVzdCBsaWtlCityZWd1bGFyIEFjY291bnQgR3JvdXBzIGJ5IHByZWZpeGluZyB5b3VyIGdyb3VwIHdpdGggImxkYXAvIiBpbiB0aGUKK0FjY2VzcyBDb250cm9sIGZvciBhIHByb2plY3QuIEZvciBleGFtcGxlICJsZGFwL2Zvby1wcm9qZWN0IiB3aWxsCithZGQgdGhlIExEQVAgImZvby1wcm9qZWN0IiBncm91cCB0byB0aGUgYWNjZXNzIGxpc3QuCisKKwogUHJvamVjdCBBY2Nlc3MgQ29udHJvbCBMaXN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xNDUsMTYgKzE2MiwxNiBAQAogUGVyLXByb2plY3QgYWNjZXNzIGNvbnRyb2wgbGlzdHMgYXJlIGFsc28gc3VwcG9ydGVkLgogCiBVc2VycyBhcmUgcGVybWl0dGVkIHRvIHVzZSB0aGUgbWF4aW11bSByYW5nZSBncmFudGVkIHRvIGFueSBvZiB0aGVpcgotZ3JvdXBzIGluIGFuIGFwcHJvdmFsIGNhdGVnb3J5LiAgRm9yIGV4YW1wbGUsIGEgdXNlciBpcyBhIG1lbWJlciBvZgotYEZvbyBMZWFkc2AsIGFuZCB0aGUgZm9sbG93aW5nIEFDTHMgYXJlIGdyYW50ZWQgb24gYSBwcm9qZWN0OgorZ3JvdXBzIG9uIGEgbGFiZWwuICBGb3IgZXhhbXBsZSwgYSB1c2VyIGlzIGEgbWVtYmVyIG9mIGBGb28gTGVhZHNgLCBhbmQKK3RoZSBmb2xsb3dpbmcgQUNMcyBhcmUgZ3JhbnRlZCBvbiBhIHByb2plY3Q6CiAKIFtvcHRpb25zPSJoZWFkZXIiXQotfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXxHcm91cCAgICAgICAgICAgfFJlZmVyZW5jZSBOYW1lIHxDYXRlZ29yeXxSYW5nZQotfEFub255bW91cyBVc2VycyB8cmVmcy9oZWFkcy8qfENvZGUgUmV2aWV3fC0xLi4rMQotfFJlZ2lzdGVyZWQgVXNlcnN8cmVmcy9oZWFkcy8qfENvZGUgUmV2aWV3fC0xLi4rMgotfEZvbyBMZWFkcyAgICAgICB8cmVmcy9oZWFkcy8qfENvZGUgUmV2aWV3fC0yLi4wCi18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWUgfExhYmVsICAgICAgfFJhbmdlCit8QW5vbnltb3VzIFVzZXJzIHxyZWZzL2hlYWRzLyogICB8Q29kZS1SZXZpZXd8LTEuLisxCit8UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogICB8Q29kZS1SZXZpZXd8LTEuLisyCit8Rm9vIExlYWRzICAgICAgIHxyZWZzL2hlYWRzLyogICB8Q29kZS1SZXZpZXd8LTIuLjAKK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhlbiB0aGUgZWZmZWN0aXZlIHJhbmdlIHBlcm1pdHRlZCB0byBiZSB1c2VkIGJ5IHRoZSB1c2VyIGlzCiBgLTIuLisyYCwgYXMgdGhlIHVzZXIgaXMgYSBtZW1iZXIgb2YgYWxsIHRocmVlIGdyb3VwcyAoc2VlIGFib3ZlCkBAIC0xOTUsMTAgKzIxMiwxMCBAQAogCiBbb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXxHcm91cCAgICAgICAgICAgIHxSZWZlcmVuY2UgTmFtZXxDYXRlZ29yeSAgIHxSYW5nZSAgIHxFeGNsdXNpdmUKLXxSZWdpc3RlcmVkIFVzZXJzIHxyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTEuLisxIHwKLXxGb28gTGVhZHMgICAgICAgIHxyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTIuLisyIHwKLXxRQSBMZWFkcyAgICAgICAgIHxyZWZzL2hlYWRzL3FhIHxDb2RlIFJldmlld3wgLTIuLisyIHwKK3xHcm91cCAgICAgICAgICAgIHxSZWZlcmVuY2UgTmFtZXxMYWJlbCAgICAgIHxSYW5nZSAgIHxFeGNsdXNpdmUKK3xSZWdpc3RlcmVkIFVzZXJzIHxyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTEuLisxIHwKK3xGb28gTGVhZHMgICAgICAgIHxyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTIuLisyIHwKK3xRQSBMZWFkcyAgICAgICAgIHxyZWZzL2hlYWRzL3FhIHxDb2RlLVJldmlld3wgLTIuLisyIHwKIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhlbiB0aGUgZWZmZWN0aXZlIHJhbmdlIHBlcm1pdHRlZCB0byBiZSB1c2VkIGJ5IHRoZSB1c2VyIGlzCkBAIC0yMTksMzEgKzIzNiwzMiBAQAogCiBbb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWV8Q2F0ZWdvcnkgICB8UmFuZ2UgICB8RXhjbHVzaXZlCi18UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTEuLisxIHwKLXxGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUgUmV2aWV3fCAtMi4uKzIgfAotfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZSBSZXZpZXd8IC0yLi4rMiB8WAorfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWV8TGFiZWwgICAgICB8UmFuZ2UgICB8RXhjbHVzaXZlCit8UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTEuLisxIHwKK3xGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUtUmV2aWV3fCAtMi4uKzIgfAorfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZS1SZXZpZXd8IC0yLi4rMiB8WAogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZW4gdGhpcyB1c2VyIHdpbGwgbm90IGhhdmUgYENvZGUgUmV2aWV3YCByaWdodHMgb24gdGhhdCBjaGFuZ2UsCitUaGVuIHRoaXMgdXNlciB3aWxsIG5vdCBoYXZlIGBDb2RlLVJldmlld2AgcmlnaHRzIG9uIHRoYXQgY2hhbmdlLAogc2luY2UgdGhlcmUgaXMgYW4gZXhjbHVzaXZlIGFjY2VzcyByaWdodCBpbiBwbGFjZSBmb3IgdGhlCiBgcmVmcy9oZWFkcy9xYWAgYnJhbmNoLiBUaGlzIGFsbG93cyBsb2NraW5nIGRvd24gYWNjZXNzIGZvciBhCiBwYXJ0aWN1bGFyIGJyYW5jaCB0byBhIGxpbWl0ZWQgc2V0IG9mIHVzZXJzLCBieXBhc3NpbmcgaW5oZXJpdGVkCiByaWdodHMgYW5kIHdpbGRjYXJkcy4KIAotSW4gb3JkZXIgdG8gZ3JhbnQgdGhlIGFiaWxpdHkgdG8gYENvZGUgUmV2aWV3YCB0byB0aGUgbWVtYmVycyBvZgorSW4gb3JkZXIgdG8gZ3JhbnQgdGhlIGFiaWxpdHkgdG8gYENvZGUtUmV2aWV3YCB0byB0aGUgbWVtYmVycyBvZgogYEZvbyBMZWFkc2AsIGluIGByZWZzL2hlYWRzL3FhYCB0aGVuIHRoZSBmb2xsb3dpbmcgYWNjZXNzIHJpZ2h0cwogd291bGQgYmUgbmVlZGVkOgogCiBbb3B0aW9ucz0iaGVhZGVyIl0KIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogfEdyb3VwICAgICAgICAgICB8UmVmZXJlbmNlIE5hbWV8Q2F0ZWdvcnkgICB8UmFuZ2UgICB8RXhjbHVzaXZlCi18UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlIFJldmlld3wgLTEuLisxIHwKLXxGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUgUmV2aWV3fCAtMi4uKzIgfAotfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZSBSZXZpZXd8IC0yLi4rMiB8WAotfEZvbyBMZWFkcyAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZSBSZXZpZXd8IC0yLi4rMiB8Cit8UmVnaXN0ZXJlZCBVc2Vyc3xyZWZzL2hlYWRzLyogIHxDb2RlLVJldmlld3wgLTEuLisxIHwKK3xGb28gTGVhZHMgICAgICAgfHJlZnMvaGVhZHMvKiAgfENvZGUtUmV2aWV3fCAtMi4uKzIgfAorfFFBIExlYWRzICAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZS1SZXZpZXd8IC0yLi4rMiB8WAorfEZvbyBMZWFkcyAgICAgICB8cmVmcy9oZWFkcy9xYSB8Q29kZS1SZXZpZXd8IC0yLi4rMiB8CiB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorCiBPcGVuSUQgQXV0aGVudGljYXRpb24KIH5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0yNTMsNiArMjcxLDcgQEAKIG9mIGl0cyBPcGVuSUQgaWRlbnRpdGllcyBtYXRjaCBvbmUgb3IgbW9yZSBvZiB0aGUgcGF0dGVybnMgbGlzdGVkCiBpbiB0aGUgYGF1dGgudHJ1c3RlZE9wZW5JRGAgbGlzdCBmcm9tIGBnZXJyaXQuY29uZmlnYC4KIAorCiBBbGwgUHJvamVjdHMKIH5+fn5+fn5+fn5+fgogCkBAIC0yNzIsNiArMjkxLDcgQEAKIGBBZG1pbmlzdHJhdG9yc2AgZG9lcywgYXMgZ3JvdXAgbWVtYmVycyB3b3VsZCBiZSBhYmxlIHRvIGFsdGVyCiBwZXJtaXNzaW9ucyBmb3IgZXZlcnkgbWFuYWdlZCBwcm9qZWN0IGluY2x1ZGluZyBnbG9iYWwgY2FwYWJpbGl0aWVzLgogCisKIFBlci1Qcm9qZWN0CiB+fn5+fn5+fn5+fgogCkBAIC0yODEsMTMgKzMwMSwxMTQgQEAKIGdyYW50aW5nICdERU5ZJyB3aXRoaW4gYSBzcGVjaWZpYyBwcm9qZWN0IHRvIGRlbnkgYSBncm91cCBhY2Nlc3MuCiAKIAotW1thY2Nlc3NfY2F0ZWdvcnldXQorW1tyZWZlcmVuY2VzXV0KK1NwZWNpYWwgYW5kIG1hZ2ljIHJlZmVyZW5jZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJlZmVyZW5jZSBuYW1lc3BhY2VzIHVzZWQgaW4gZ2l0IGFyZSBnZW5lcmFsbHkgdHdvLCBvbmUgZm9yIGJyYW5jaGVzIGFuZAorb25lIGZvciB0YWdzOgorCisqICtyZWZzL2hlYWRzLyorCisqICtyZWZzL3RhZ3MvKisKKworSG93ZXZlciwgZXZlcnkgcmVmZXJlbmNlIHVuZGVyICtyZWZzLyorIGlzIHJlYWxseSBhdmFpbGFibGUsIGFuZCBpbiBHZXJyaXQgdGhpcworb3Bwb3J0dW5pdHkgZm9yIGdpdmluZyBvdGhlciByZWZzIGEgc3BlY2lhbCBtZWFuaW5nIGlzIHVzZWQuICBJbiBHZXJyaXQgdGhleQorYXJlIHNvbWV0aW1lcyB1c2VkIGFzIG1hZ2ljL3ZpcnR1YWwgcmVmZXJlbmNlcyB0aGF0IGdpdmUgdGhlIHB1c2ggdG8gR2Vycml0IGEKK3NwZWNpYWwgbWVhbmluZy4KKworCitbW3JlZmVyZW5jZXNfc3BlY2lhbF1dCitTcGVjaWFsIHJlZmVyZW5jZXMKK35+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgc3BlY2lhbCByZWZlcmVuY2VzIGhhdmUgY29udGVudCB0aGF0J3MgZWl0aGVyIGdlbmVyYXRlZCBieSBHZXJyaXQgb3IKK2NvbnRhaW5zIGltcG9ydGFudCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gdGhhdCBHZXJyaXQgbmVlZHMuIFdoZW4gbWFraW5nCitjaGFuZ2VzIHRvIHRoZXNlIHJlZmVyZW5jZXMsIEdlcnJpdCB3aWxsIHRha2UgZXh0cmEgcHJlY2F1dGlvbnMgdG8gdmVyaWZ5IHRoZQorY29udGVudHMgY29tcGF0aWJpbGl0eSBhdCB1cGxvYWQgdGltZS4KKworCityZWZzL2NoYW5nZXMvKgorXl5eXl5eXl5eXl5eXl4KKworVW5kZXIgdGhpcyBuYW1lc3BhY2UgZWFjaCB1cGxvYWRlZCBwYXRjaCBzZXQgZm9yIGV2ZXJ5IGNoYW5nZSBnZXRzIGEgc3RhdGljCityZWZlcmVuY2UgaW4gdGhlaXIgZ2l0LiAgVGhlIGZvcm1hdCBpcyBjb252ZW5pZW50IGJ1dCBzdGlsbCBpbnRlbmRlZCB0byBzY2FsZSB0bworaHVuZHJlZHMgb2YgdGhvdXNhbmRzIG9mIHBhdGNoIHNldHMuICBUbyBhY2Nlc3MgYSBnaXZlbiBwYXRjaCBzZXQgeW91IHdpbGwKK25lZWQgdGhlIGNoYW5nZSBudW1iZXIgYW5kIHBhdGNoIHNldCBudW1iZXIuCisKK1t2ZXJzZV0KKydyZWZzL2NoYW5nZXMvJzxsYXN0IHR3byBkaWdpdHMgb2YgY2hhbmdlIG51bWJlcj4vCisgIDxjaGFuZ2UgbnVtYmVyPi8KKyAgPHBhdGNoIHNldCBudW1iZXI+CisKK1lvdSBjYW4gYWxzbyBmaW5kIHRoZXNlIHN0YXRpYyByZWZlcmVuY2VzIGxpbmtlZCBvbiB0aGUgcGFnZSBvZiBlYWNoIGNoYW5nZS4KKworCityZWZzL21ldGEvY29uZmlnCiteXl5eXl5eXl5eXl5eXl5eCisKK1RoaXMgaXMgd2hlcmUgdGhlIEdlcnJpdCBjb25maWd1cmF0aW9uIG9mIGVhY2ggcHJvamVjdCBpcyByZXNpZGluZy4gIFRoaXMKK2JyYW5jaCBjb250YWlucyBzZXZlcmFsIGZpbGVzIG9mIGltcG9ydGFuY2U6ICtwcm9qZWN0LmNvbmZpZyssICtncm91cHMrIGFuZAorK3J1bGVzLnBsKy4gIFRvcmdldGhlciB0aGV5IGNvbnRyb2wgYWNjZXNzIGFuZCBiZWhhdmlvdXIgZHVyaW5nIHRoZSBjaGFuZ2UKK3JldmlldyBwcm9jZXNzLgorCisKK3JlZnMvbWV0YS9kYXNoYm9hcmRzLyoKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVGhlcmUncyBhIGRlZGljYXRlZCBwYWdlIHdoZXJlIHlvdSBjYW4gcmVhZCBtb3JlIGFib3V0CitsaW5rOnVzZXItZGFzaGJvYXJkcy5odG1sW1VzZXIgRGFzaGJvYXJkc10uCisKKworcmVmcy9ub3Rlcy9yZXZpZXcKK15eXl5eXl5eXl5eXl5eXl5eCisKK0F1dG9nZW5lcmF0ZWQgY29weSBvZiByZXZpZXcgbm90ZXMgZm9yIGFsbCBjaGFuZ2VzIGluIHRoZSBnaXQuICBFYWNoIGxvZyBlbnRyeQorb24gdGhlIHJlZnMvbm90ZXMvcmV2aWV3IGJyYW5jaCBhbHNvIHJlZmVyZW5jZXMgdGhlIHBhdGNoIHNldCBvbiB3aGljaCB0aGUKK3JldmlldyBpcyBtYWRlLiAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IHRoZSByZXZpZXctbm90ZXMgcGx1Z2luLgorCisKK1tbcmVmZXJlbmNlc19tYWdpY11dCitNYWdpYyByZWZlcmVuY2VzCit+fn5+fn5+fn5+fn5+fn5+CisKK1RoZXNlIGFyZSByZWZlcmVuY2VzIHdpdGggYWRkZWQgZnVuY3Rpb25hbGl0eSB0byB0aGVtIGNvbXBhcmVkIHRvIGEgcmVndWxhcgorZ2l0IHB1c2ggb3BlcmF0aW9uLgorCisKK3JlZnMvZm9yLzxicmFuY2ggcmVmPgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK01vc3QgcHJvbWluZW50IGlzIHRoZSBgcmVmcy9mb3IvPGJyYW5jaCByZWY+YCByZWZlcmVuY2Ugd2hpY2ggaXMgdGhlIHJlZmVyZW5jZQordXBvbiB3aGljaCB3ZSBidWlsZCB0aGUgY29kZSByZXZpZXcgaW50ZXJjZXB0IGJlZm9yZSBzdWJtaXR0aW5nIGEgY29tbWl0IHRvCit0aGUgYnJhbmNoIGl0J3MgdXBsb2FkZWQgdG8uCisKK0Z1cnRoZXIgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gcHVzaCBjYW4gYmUgZm91bmQgb24gdGhlCitsaW5rOnVzZXItdXBsb2FkLmh0bWwjcHVzaF9jcmVhdGVbVXBsb2FkIGNoYW5nZXNdIHBhZ2UuCisKKworcmVmcy9wdWJsaXNoLyoKK15eXl5eXl5eXl5eXl5eCisKK2ByZWZzL3B1Ymxpc2gvKmAgaXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSB0byBgcmVmcy9mb3IvKmAgd2hlbiBwdXNoaW5nIG5ldyBjaGFuZ2VzCithbmQgcGF0Y2ggc2V0cy4KKworCityZWZzL2RyYWZ0cy8qCiteXl5eXl5eXl5eXl5eCisKK1B1c2ggdG8gYHJlZnMvZHJhZnRzLypgIGNyZWF0ZXMgYSBjaGFuZ2UgbGlrZSBwdXNoIHRvIGByZWZzL2Zvci8qYCwgZXhjZXB0IHRoZQorcmVzdWx0aW5nIGNoYW5nZSByZW1haW5zIGhpZGRlbiBmcm9tIHB1YmxpYyByZXZpZXcuICBZb3UgdGhlbiBoYXZlIHRoZSBvcHRpb24KK29mIGFkZGluZyBpbmRpdmlkdWFsIHJldmlld2VycyBiZWZvcmUgbWFraW5nIHRoZSBjaGFuZ2UgcHVibGljIHRvIGFsbC4gIFRoZQorY2hhbmdlIHBhZ2Ugd2lsbCBoYXZlIGEgJ1B1Ymxpc2gnIGJ1dHRvbiB3aGljaCBhbGxvd3MgeW91IHRvIGNvbnZlcnQgaW5kaXZpZHVhbAorZHJhZnQgcGF0Y2ggc2V0cyBvZiBhIGNoYW5nZSBpbnRvIHB1YmxpYyBwYXRjaCBzZXRzIGZvciByZXZpZXcuCisKKworW1thY2Nlc3NfY2F0ZWdvcmllc11dCiBBY2Nlc3MgQ2F0ZWdvcmllcwogLS0tLS0tLS0tLS0tLS0tLS0KIAotR2Vycml0IGNvbWVzIHByZS1jb25maWd1cmVkIHdpdGggc2V2ZXJhbCBkZWZhdWx0IGNhdGVnb3JpZXMgdGhhdAotY2FuIGJlIGdyYW50ZWQgdG8gZ3JvdXBzIHdpdGhpbiBwcm9qZWN0cywgZW5hYmxpbmcgZnVuY3Rpb25hbGl0eQotZm9yIHRoYXQgZ3JvdXAncyBtZW1iZXJzLgorR2Vycml0IGhhcyBzZXZlcmFsIHBlcm1pc3Npb24gY2F0ZWdvcmllcyB0aGF0IGNhbiBiZSBncmFudGVkIHRvIGdyb3Vwcword2l0aGluIHByb2plY3RzLCBlbmFibGluZyBmdW5jdGlvbmFsaXR5IGZvciB0aGF0IGdyb3VwJ3MgbWVtYmVycy4KIAogV2l0aCB0aGUgcmVsZWFzZSBvZiB0aGUgR2Vycml0IDIuMi54IHNlcmllcywgdGhlIHdlYiBHVUkgZm9yIEFDTAogY29uZmlndXJhdGlvbiB3YXMgcmV3cml0dGVuIGZyb20gc2NyYXRjaC4gIFVzZSB0aGlzCkBAIC0yOTUsMTU1ICs0MTYsNiBAQAogY29udmVyc2lvbnMgZnJvbSB0aGUgR2Vycml0IDIuMS54IHRvIHRoZSBHZXJyaXQgMi4yLnggc2VyaWVzLgogCiAKLVtbY2F0ZWdvcnlfbGFiZWwtVmVyaWZpZWRdXQotTGFiZWw6IFZlcmlmaWVkCi1+fn5+fn5+fn5+fn5+fn4KLQotVGhlIHZlcmlmaWVkIGNhdGVnb3J5IGlzIG9uZSBvZiB0d28gZGVmYXVsdCBjYXRlZ29yaWVzIHRoYXQgaXMKLWNvbmZpZ3VyZWQgdXBvbiB0aGUgY3JlYXRpb24gb2YgYSBHZXJyaXQgaW5zdGFuY2UuIEl0IG1heSBoYXZlCi1hbnkgbWVhbmluZyB0aGUgcHJvamVjdCBkZXNpcmVzLiAgSXQgd2FzIG9yaWdpbmFsbHkgaW52ZW50ZWQgYnkKLXRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgdG8gbWVhbgotJ2NvbXBpbGVzLCBwYXNzZXMgYmFzaWMgdW5pdCB0ZXN0cycuCi0KLVRoZSByYW5nZSBvZiB2YWx1ZXMgaXM6Ci0KLSogLTEgRmFpbHMKLSsKLVRyaWVkIHRvIGNvbXBpbGUsIGJ1dCBnb3QgYSBjb21waWxlIGVycm9yLCBvciB0cmllZCB0byBydW4gdGVzdHMsCi1idXQgb25lIG9yIG1vcmUgdGVzdHMgZGlkIG5vdCBwYXNzLiAgVGhpcyB2YWx1ZSBpcyB2YWxpZAotYWNyb3NzIGFsbCBwYXRjaCBzZXRzIGluIHRoZSBzYW1lIGNoYW5nZSwgaS5lLiB0aGUgcmV2aWV3ZXIgbXVzdAotYWN0aXZlbHkgY2hhbmdlIGhpcy9oZXIgcmV2aWV3IHRvIHNvbWV0aGluZyBlbHNlIGJlZm9yZSB0aGUgY2hhbmdlCi1pcyBzdWJtaXR0YWJsZS4KLSsKLSpBbnkgLTEgYmxvY2tzIHN1Ym1pdC4qCi0KLSogMCBObyBzY29yZQotKwotRGlkbid0IHRyeSB0byBwZXJmb3JtIHRoZSB2ZXJpZmljYXRpb24gdGFza3MuCi0KLSogKzEgVmVyaWZpZWQKLSsKLUNvbXBpbGVkIChhbmQgcmFuIHRlc3RzKSBzdWNjZXNzZnVsbHkuCi0rCi0qQW55ICsxIGVuYWJsZXMgc3VibWl0LioKLQotRm9yIGEgY2hhbmdlIHRvIGJlIHN1Ym1pdHRhYmxlLCB0aGUgY2hhbmdlIG11c3QgaGF2ZSBhIGArMSBWZXJpZmllZGAKLWluIHRoaXMgY2F0ZWdvcnkgZnJvbSBhdCBsZWFzdCBvbmUgYXV0aG9yaXplZCB1c2VyLCBhbmQgbm8gYC0xIEZhaWxzYAotZnJvbSBhbiBhdXRob3JpemVkIHVzZXIuICBUaHVzLCBgLTEgRmFpbHNgIGNhbiBibG9jayBhIHN1Ym1pdCwKLXdoaWxlIGArMSBWZXJpZmllZGAgZW5hYmxlcyBhIHN1Ym1pdC4KLQotSWYgYSBHZXJyaXQgaW5zdGFsbGF0aW9uIGRvZXMgbm90IHdpc2ggdG8gdXNlIHRoaXMgY2F0ZWdvcnkgaW4gYW55Ci1wcm9qZWN0LCBpdCBjYW4gYmUgZGVsZXRlZCBmcm9tIHRoZSBkYXRhYmFzZToKLQotPT09PQotICBERUxFVEUgRlJPTSBhcHByb3ZhbF9jYXRlZ29yaWVzICAgICAgV0hFUkUgY2F0ZWdvcnlfaWQgPSAnVlJJRic7Ci0gIERFTEVURSBGUk9NIGFwcHJvdmFsX2NhdGVnb3J5X3ZhbHVlcyBXSEVSRSBjYXRlZ29yeV9pZCA9ICdWUklGJzsKLT09PT0KLQotSWYgYSBHZXJyaXQgaW5zdGFsbGF0aW9uIHdhbnRzIHRvIG1vZGlmeSB0aGUgZGVzY3JpcHRpb24gdGV4dAotYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGNhdGVnb3J5IHZhbHVlcywgdGhlIHRleHQgY2FuIGJlIHVwZGF0ZWQKLWluIHRoZSBgbmFtZWAgY29sdW1uIG9mIHRoZSBgY2F0ZWdvcnlfaWQgPSAnVlJJRidgIHJvd3MgaW4gdGhlCi1gYXBwcm92YWxfY2F0ZWdvcnlfdmFsdWVzYCB0YWJsZS4KLQotQWRkaXRpb25hbCB2YWx1ZXMgY291bGQgYWxzbyBiZSBhZGRlZCB0byB0aGlzIGNhdGVnb3J5LCB0byBhbGxvdyBpdAotdG8gYmVoYXZlIG1vcmUgbGlrZSBgQ29kZSBSZXZpZXdgIChiZWxvdykuICBJbnNlcnQgLTIgYW5kICsyIHZhbHVlCi1yb3dzIGludG8gdGhlIGBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgIHdpdGggYGNhdGVnb3J5X2lkYCBzZXQgdG8KLWBWUklGYCB0byBnZXQgdGhlIHNhbWUgYmVoYXZpb3IuCi0KLVtOT1RFXQotQSByZXN0YXJ0IGlzIHJlcXVpcmVkIGFmdGVyIG1ha2luZyBkYXRhYmFzZSBjaGFuZ2VzLgotU2VlIDw8cmVzdGFydF9jaGFuZ2VzLGJlbG93Pj4uCi0KLVtbY2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXddXQotTGFiZWw6IENvZGUgUmV2aWV3Ci1+fn5+fn5+fn5+fn5+fn5+fn4KLQotVGhlIGNvZGUgcmV2aWV3IGNhdGVnb3J5IGlzIHRoZSBzZWNvbmQgb2YgdHdvIGRlZmF1bHQgY2F0ZWdvcmllcyB0aGF0Ci1pcyBjb25maWd1cmVkIHVwb24gdGhlIGNyZWF0aW9uIG9mIGEgR2Vycml0IGluc3RhbmNlLiBJdCBtYXkgaGF2ZQotYW55IG1lYW5pbmcgdGhlIHByb2plY3QgZGVzaXJlcy4gIEl0IHdhcyBvcmlnaW5hbGx5IGludmVudGVkIGJ5IHRoZQotQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IHRvIG1lYW4gJ0kgcmVhZCB0aGUgY29kZSBhbmQgaXQgc2VlbXMKLXJlYXNvbmFibHkgY29ycmVjdCcuCi0KLVRoZSByYW5nZSBvZiB2YWx1ZXMgaXM6Ci0KLSogLTIgRG8gbm90IHN1Ym1pdAotKwotVGhlIGNvZGUgaXMgc28gaG9ycmlibHkgaW5jb3JyZWN0L2J1Z2d5L2Jyb2tlbiB0aGF0IGl0IG11c3Qgbm90IGJlCi1zdWJtaXR0ZWQgdG8gdGhpcyBwcm9qZWN0LCBvciB0byB0aGlzIGJyYW5jaC4gIFRoaXMgdmFsdWUgaXMgdmFsaWQKLWFjcm9zcyBhbGwgcGF0Y2ggc2V0cyBpbiB0aGUgc2FtZSBjaGFuZ2UsIGkuZS4gdGhlIHJldmlld2VyIG11c3QKLWFjdGl2ZWx5IGNoYW5nZSBoaXMvaGVyIHJldmlldyB0byBzb21ldGhpbmcgZWxzZSBiZWZvcmUgdGhlIGNoYW5nZQotaXMgc3VibWl0dGFibGUuCi0rCi0qQW55IC0yIGJsb2NrcyBzdWJtaXQuKgotCi0qIC0xIEkgd291bGQgcHJlZmVyIHRoYXQgeW91IGRpZG4ndCBzdWJtaXQgdGhpcwotKwotVGhlIGNvZGUgZG9lc24ndCBsb29rIHJpZ2h0LCBvciBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5LCBidXQKLXRoZSByZXZpZXdlciBpcyB3aWxsaW5nIHRvIGxpdmUgd2l0aCBpdCBhcy1pcyBpZiBhbm90aGVyIHJldmlld2VyCi1hY2NlcHRzIGl0LCBwZXJoYXBzIGJlY2F1c2UgaXQgaXMgYmV0dGVyIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgaW4KLXRoZSBwcm9qZWN0LiAgT2Z0ZW4gdGhpcyBpcyBhbHNvIHVzZWQgYnkgY29udHJpYnV0b3JzIHdobyBkb24ndCBsaWtlCi10aGUgY2hhbmdlLCBidXQgYWxzbyBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIHRoZSBwcm9qZWN0IGxvbmctdGVybQotYW5kIHRodXMgZG9uJ3QgaGF2ZSBmaW5hbCBzYXkgb24gY2hhbmdlIHN1Ym1pc3Npb24uCi0rCi1Eb2VzIG5vdCBibG9jayBzdWJtaXQuCi0KLSogMCBObyBzY29yZQotKwotRGlkbid0IHRyeSB0byBwZXJmb3JtIHRoZSBjb2RlIHJldmlldyB0YXNrLCBvciBnbGFuY2VkIG92ZXIgaXQgYnV0Ci1kb24ndCBoYXZlIGFuIGluZm9ybWVkIG9waW5pb24geWV0LgotCi0qICsxIExvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlCi0rCi1UaGUgY29kZSBsb29rcyByaWdodCB0byB0aGlzIHJldmlld2VyLCBidXQgdGhlIHJldmlld2VyIGRvZXNuJ3QKLWhhdmUgYWNjZXNzIHRvIHRoZSBgKzJgIHZhbHVlIGZvciB0aGlzIGNhdGVnb3J5LiAgT2Z0ZW4gdGhpcyBpcwotdXNlZCBieSBjb250cmlidXRvcnMgdG8gYSBwcm9qZWN0IHdobyB3ZXJlIGFibGUgdG8gcmV2aWV3IHRoZSBjaGFuZ2UKLWFuZCBsaWtlIHdoYXQgaXQgaXMgZG9pbmcsIGJ1dCBkb24ndCBoYXZlIGZpbmFsIGFwcHJvdmFsIG92ZXIgd2hhdAotZ2V0cyBzdWJtaXR0ZWQuCi0KLSogKzIgTG9va3MgZ29vZCB0byBtZSwgYXBwcm92ZWQKLSsKLUJhc2ljYWxseSB0aGUgc2FtZSBhcyBgKzFgLCBidXQgZm9yIHRob3NlIHdobyBoYXZlIGZpbmFsIHNheSBvdmVyCi1ob3cgdGhlIHByb2plY3Qgd2lsbCBkZXZlbG9wLgotKwotKkFueSArMiBlbmFibGVzIHN1Ym1pdC4qCi0KLUZvciBhIGNoYW5nZSB0byBiZSBzdWJtaXR0YWJsZSwgdGhlIGxhdGVzdCBwYXRjaCBzZXQgbXVzdCBoYXZlIGEKLWArMiBMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZGAgaW4gdGhpcyBjYXRlZ29yeSBmcm9tIGF0IGxlYXN0IG9uZQotYXV0aG9yaXplZCB1c2VyLCBhbmQgbm8gYC0yIERvIG5vdCBzdWJtaXRgIGZyb20gYW4gYXV0aG9yaXplZCB1c2VyLgotVGh1cyBgLTJgIG9uIGFueSBwYXRjaCBzZXQgY2FuIGJsb2NrIGEgc3VibWl0LCB3aGlsZSBgKzJgIG9uIHRoZQotbGF0ZXN0IHBhdGNoIHNldCBjYW4gZW5hYmxlIGl0LgotCi1JZiBhIEdlcnJpdCBpbnN0YWxsYXRpb24gZG9lcyBub3Qgd2lzaCB0byB1c2UgdGhpcyBjYXRlZ29yeSBpbiBhbnkKLXByb2plY3QsIGl0IGNhbiBiZSBkZWxldGVkIGZyb20gdGhlIGRhdGFiYXNlOgotCi09PT09Ci0gIERFTEVURSBGUk9NIGFwcHJvdmFsX2NhdGVnb3JpZXMgICAgICBXSEVSRSBjYXRlZ29yeV9pZCA9ICdDUlZXJzsKLSAgREVMRVRFIEZST00gYXBwcm92YWxfY2F0ZWdvcnlfdmFsdWVzIFdIRVJFIGNhdGVnb3J5X2lkID0gJ0NSVlcnOwotPT09PQotCi1JZiBhIEdlcnJpdCBpbnN0YWxsYXRpb24gd2FudHMgdG8gbW9kaWZ5IHRoZSBkZXNjcmlwdGlvbiB0ZXh0Ci1hc3NvY2lhdGVkIHdpdGggdGhlc2UgY2F0ZWdvcnkgdmFsdWVzLCB0aGUgdGV4dCBjYW4gYmUgdXBkYXRlZAotaW4gdGhlIGBuYW1lYCBjb2x1bW4gb2YgdGhlIGBjYXRlZ29yeV9pZCA9ICdDUlZXJ2Agcm93cyBpbiB0aGUKLWBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgIHRhYmxlLgotCi1BZGRpdGlvbmFsIHZhbHVlcyBjb3VsZCBiZSBpbnNlcnRlZCBpbnRvIGBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgCi10byBmdXJ0aGVyIGV4dGVuZCB0aGUgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIHJhbmdlLCBidXQgdGhlcmUgaXMKLWxpa2VseSBsaXR0bGUgdmFsdWUgaW4gZG9pbmcgc28gYXMgdGhpcyBvbmx5IGV4cGFuZHMgdGhlIG1pZGRsZQotcmVnaW9uLiAgVGhpcyBjYXRlZ29yeSBpcyBhIGBNYXhXaXRoQmxvY2tgIHR5cGUsIHdoaWNoIG1lYW5zIHRoYXQKLXRoZSBsb3dlc3QgbmVnYXRpdmUgdmFsdWUgaWYgcHJlc2VudCBibG9ja3MgYSBzdWJtaXQsIHdoaWxlIHRoZQotaGlnaGVzdCBwb3NpdGl2ZSB2YWx1ZSBpcyByZXF1aXJlZCB0byBlbmFibGUgc3VibWl0LgotCi1bW2Z1bmN0aW9uX01heE5vQmxvY2tdXQotVGhlcmUgaXMgYWxzbyBhIGBNYXhOb0Jsb2NrYCBjYXRlZ29yeSB3aGljaCBzdGlsbCByZXF1aXJlcyB0aGUKLWhpZ2hlc3QgcG9zaXRpdmUgdmFsdWUgdG8gc3VibWl0LCBidXQgdGhlIGxvd2VzdCBuZWdhdGl2ZSB2YWx1ZSB3aWxsCi1ub3QgYmxvY2sgdGhlIGNoYW5nZSwgYW5kIGRvZXMgbm90IGNhcnJ5IG92ZXIgYmV0d2VlbiBwYXRjaCBzZXRzLgotVGhpcyBsZXZlbCBpcyBtb3N0bHkgdXNlZnVsIGZvciBhdXRvbWF0ZWQgY29kZS1yZXZpZXdzIHRoYXQgbWF5Ci1oYXZlIGZhbHNlLW5lZ2F0aXZlcyB0aGF0IHNob3VsZG4ndCBibG9jayB0aGUgY2hhbmdlLgotCi1bTk9URV0KLUEgcmVzdGFydCBpcyByZXF1aXJlZCBhZnRlciBtYWtpbmcgZGF0YWJhc2UgY2hhbmdlcy4KLVNlZSA8PHJlc3RhcnRfY2hhbmdlcyxiZWxvdz4+LgotCiBbW2NhdGVnb3J5X2FiYW5kb25dXQogQWJhbmRvbgogfn5+fn5+fgpAQCAtNDU1LDYgKzQyNyw3IEBACiBUaGlzIGFsc28gZ3JhbnRzIHRoZSBwZXJtaXNzaW9uIHRvIHJlc3RvcmUgYSBjaGFuZ2UgaWYgdGhlIGNoYW5nZQogY2FuIGJlIHVwbG9hZGVkLgogCisKIFtbY2F0ZWdvcnlfY3JlYXRlXV0KIENyZWF0ZSByZWZlcmVuY2UKIH5+fn5+fn5+fn5+fn5+fn4KQEAgLTU2Miw3ICs1MzUsNyBAQAogT3duZXJzaGlwIG92ZXIgYSBwYXJ0aWN1bGFyIGJyYW5jaCBzdWJzcGFjZSBtYXkgYmUgZGVsZWdhdGVkIGJ5CiBlbnRlcmluZyBhIGJyYW5jaCBwYXR0ZXJuLiAgVG8gZGVsZWdhdGUgY29udHJvbCBvdmVyIGFsbCBicmFuY2hlcwogdGhhdCBiZWdpbiB3aXRoIGBxYS9gIHRvIHRoZSBRQSBncm91cCwgYWRkIGBPd25lcmAgY2F0ZWdvcnkKLWZvciByZWZlcmVuY2UgYHJlZnMvaGVhZHMvcWEvXCpgLiAgTWVtYmVycyBvZiB0aGUgUUEgZ3JvdXAgY2FuCitmb3IgcmVmZXJlbmNlIGByZWZzL2hlYWRzL3FhLypgLiAgTWVtYmVycyBvZiB0aGUgUUEgZ3JvdXAgY2FuCiBmdXJ0aGVyIHJlZmluZSBhY2Nlc3MsIGJ1dCBvbmx5IGZvciByZWZlcmVuY2VzIHRoYXQgYmVnaW4gd2l0aAogYHJlZnMvaGVhZHMvcWEvYC4gU2VlIDw8cHJvamVjdF9vd25lcnMscHJvamVjdCBvd25lcnM+PiB0byBmaW5kCiBvdXQgbW9yZSBhYm91dCB0aGlzIHJvbGUuCkBAIC01ODUsNyArNTU4LDcgQEAKIF5eXl5eXl5eXl5eCiAKIEFueSBleGlzdGluZyBicmFuY2ggY2FuIGJlIGZhc3QtZm9yd2FyZGVkIHRvIGEgbmV3IGNvbW1pdC4KLUNyZWF0aW9uIG9mIG5ldyBicmFuY2hlcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAKK0NyZWF0aW9uIG9mIG5ldyBicmFuY2hlcyBpcyBjb250cm9sbGVkIGJ5IHRoZQogbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X2NyZWF0ZVsnQ3JlYXRlIFJlZmVyZW5jZSddCiBjYXRlZ29yeS4gIERlbGV0aW9uIG9mIGV4aXN0aW5nIGJyYW5jaGVzIGlzIHJlamVjdGVkLiAgVGhpcyBpcyB0aGUKIHNhZmVzdCBtb2RlIGFzIGNvbW1pdHMgY2Fubm90IGJlIGRpc2NhcmRlZC4KQEAgLTYzNCw3ICs2MDcsNyBAQAogfn5+fn5+fn5+fn5+fn5+fn5+fn4KIAogVGhlIGBQdXNoIE1lcmdlIENvbW1pdGAgYWNjZXNzIHJpZ2h0IHBlcm1pdHMgdGhlIHVzZXIgdG8gdXBsb2FkIG1lcmdlCi1jb21taXRzLiAgSXQncyBhbiBhZGRvbiB0byB0aGUgPDxjYXRlZ29yeV9wdXNoLFB1c2g+PiBhY2Nlc3MgcmlnaHQsIGFuZAorY29tbWl0cy4gIEl0J3MgYW4gYWRkLW9uIHRvIHRoZSA8PGNhdGVnb3J5X3B1c2gsUHVzaD4+IGFjY2VzcyByaWdodCwgYW5kCiBzbyBpdCB3b24ndCBiZSBzdWZmaWNpZW50IHdpdGggb25seSBgUHVzaCBNZXJnZSBDb21taXRgIGdyYW50ZWQgZm9yIGEKIHB1c2ggdG8gaGFwcGVuLiAgU29tZSBwcm9qZWN0cyB3aXNoIHRvIHJlc3RyaWN0IG1lcmdlcyB0byBiZWluZyBjcmVhdGVkCiBieSBHZXJyaXQuIEJ5IGdyYW50aW5nIGBQdXNoYCB3aXRob3V0IGBQdXNoIE1lcmdlIENvbW1pdGAsIHRoZSBvbmx5CkBAIC02NDcsMjAgKzYyMCwyNyBAQAogdGhlIGludGVudGlvbiBvZiB0aGUgYFB1c2ggTWVyZ2UgQ29tbWl0YCBlbnRyeSBpcyB0byBhbGxvdyBkaXJlY3QgcHVzaGVzCiBvZiBtZXJnZSBjb21taXRzLgogCisKIFtbY2F0ZWdvcnlfcHVzaF9hbm5vdGF0ZWRdXQogUHVzaCBBbm5vdGF0ZWQgVGFnCiB+fn5+fn5+fn5+fn5+fn5+fn4KIAotVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1c2ggYW4gYW5ub3RhdGVkIHRhZyBvYmplY3Qgb3ZlcgotU1NIIGludG8gdGhlIHByb2plY3QncyByZXBvc2l0b3J5LiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgZG9uZQotd2l0aCBhIGNvbW1hbmQgbGluZSBzdWNoIGFzOgorVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1c2ggYW4gYW5ub3RhdGVkIHRhZyBvYmplY3QgaW50byB0aGUKK3Byb2plY3QncyByZXBvc2l0b3J5LiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgZG9uZSB3aXRoIGEgY29tbWFuZCBsaW5lCitzdWNoIGFzOgogCiA9PT09CiAgIGdpdCBwdXNoIHNzaDovL1VTRVJASE9TVDpQT1JUL1BST0pFQ1QgdGFnIHYxLjAKID09PT0KIAotVGFncyBtdXN0IGJlIGFubm90YXRlZCAoY3JlYXRlZCB3aXRoIGBnaXQgdGFnIC1hYCBvciBgZ2l0IHRhZyAtc2ApLAotc2hvdWxkIGV4aXN0IGluIHRoZSBgcmVmcy90YWdzL2AgbmFtZXNwYWNlLCBhbmQgc2hvdWxkIGJlIG5ldy4KK09yOgorCis9PT09CisgIGdpdCBwdXNoIGh0dHBzOi8vSE9TVC9QUk9KRUNUIHRhZyB2MS4wCis9PT09CisKK1RhZ3MgbXVzdCBiZSBhbm5vdGF0ZWQgKGNyZWF0ZWQgd2l0aCBgZ2l0IHRhZyAtYWApLCBzaG91bGQgZXhpc3QgaW4KK3RoZSBgcmVmcy90YWdzL2AgbmFtZXNwYWNlLCBhbmQgc2hvdWxkIGJlIG5ldy4KIAogVGhpcyBjYXRlZ29yeSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHB1Ymxpc2ggdGFncyB3aGVuIGEgcHJvamVjdAogcmVhY2hlcyBhIHN0YWJsZSByZWxlYXNlIHBvaW50IHdvcnRoIHJlbWVtYmVyaW5nIGluIGhpc3RvcnkuCkBAIC02ODIsNiArNjYyLDI4IEBACiByZXF1aXJlcyB0aGUgc2FtZSBwZXJtaXNzaW9uIGFzIGRlbGV0aW5nIGEgYnJhbmNoLgogCiAKK1tbY2F0ZWdvcnlfcHVzaF9zaWduZWRdXQorUHVzaCBTaWduZWQgVGFnCit+fn5+fn5+fn5+fn5+fn4KKworVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1c2ggYSBQR1Agc2lnbmVkIHRhZyBvYmplY3QgaW50byB0aGUKK3Byb2plY3QncyByZXBvc2l0b3J5LiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgZG9uZSB3aXRoIGEgY29tbWFuZAorbGluZSBzdWNoIGFzOgorCis9PT09CisgIGdpdCBwdXNoIHNzaDovL1VTRVJASE9TVDpQT1JUL1BST0pFQ1QgdGFnIHYxLjAKKz09PT0KKworT3I6CisKKz09PT0KKyAgZ2l0IHB1c2ggaHR0cHM6Ly9IT1NUL1BST0pFQ1QgdGFnIHYxLjAKKz09PT0KKworVGFncyBtdXN0IGJlIHNpZ25lZCAoY3JlYXRlZCB3aXRoIGBnaXQgdGFnIC1zYCksIHNob3VsZCBleGlzdCBpbiB0aGUKK2ByZWZzL3RhZ3MvYCBuYW1lc3BhY2UsIGFuZCBzaG91bGQgYmUgbmV3LgorCisKIFtbY2F0ZWdvcnlfcmVhZF1dCiBSZWFkCiB+fn5+CkBAIC03MjksNiArNzMxLDM1IEBACiBwYXRjaCBzZXQuCiAKIAorW1tjYXRlZ29yeV9yZW1vdmVfcmV2aWV3ZXJdXQorUmVtb3ZlIFJldmlld2VyCit+fn5+fn5+fn5+fn5+fn4KKworVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHJlbW92ZSBvdGhlciB1c2VycyBmcm9tIHRoZSBsaXN0IG9mCityZXZpZXdlcnMgb24gYSBjaGFuZ2UuCisKK1RoZSBjaGFuZ2Ugb3duZXIsIHByb2plY3Qgb3duZXIgYW5kIHNpdGUgYWRtaW5pc3RyYXRvciBjYW4gYWx3YXlzCityZW1vdmUgcmV2aWV3ZXJzIChldmVuIHdpdGhvdXQgaGF2aW5nIHRoZSBgUmVtb3ZlIFJldmlld2VyYCBhY2Nlc3MKK3JpZ2h0IGFzc2lnbmVkKS4KKworVXNlcnMgd2l0aG91dCB0aGlzIGFjY2VzcyByaWdodCBjYW4gb25seSByZW1vdmUgdGhlbXNlbHZlcyBmcm9tIHRoZQorcmV2aWV3ZXIgbGlzdCBvbiBhIGNoYW5nZS4KKworCitbW2NhdGVnb3J5X3Jldmlld19sYWJlbHNdXQorUmV2aWV3IExhYmVscworfn5+fn5+fn5+fn5+fgorCitGb3IgZXZlcnkgY29uZmlndXJlZCBsYWJlbCBgTXktTmFtZWAgaW4gdGhlIHByb2plY3QsIHRoZXJlIGlzIGEKK2NvcnJlc3BvbmRpbmcgcGVybWlzc2lvbiBgbGFiZWwtTXktTmFtZWAgd2l0aCBhIHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8KK3RoZSBkZWZpbmVkIHZhbHVlcy4KKworR2Vycml0IGNvbWVzIHByZS1jb25maWd1cmVkIHdpdGggYSBkZWZhdWx0ICdDb2RlLVJldmlldycgbGFiZWwgdGhhdCBjYW4KK2JlIGdyYW50ZWQgdG8gZ3JvdXBzIHdpdGhpbiBwcm9qZWN0cywgZW5hYmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgdGhhdAorZ3JvdXAncyBtZW1iZXJzLiBsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbFtDdXN0b20gbGFiZWxzXSBtYXkgYWxzbyBiZQorZGVmaW5lZCBnbG9iYWxseSBvciBvbiBhIHBlci1wcm9qZWN0IGJhc2lzLgorCisKIFtbY2F0ZWdvcnlfc3VibWl0XV0KIFN1Ym1pdAogfn5+fn5+CkBAIC03NDAsODUgKzc3MSw1NSBAQAogYnJhbmNoIGFzIHNvb24gYXMgcG9zc2libGUsIG1ha2luZyBpdCBhIHBlcm1hbmVudCBwYXJ0IG9mIHRoZQogcHJvamVjdCdzIGhpc3RvcnkuCiAKLUluIG9yZGVyIHRvIHN1Ym1pdCwgYWxsIGFwcHJvdmFsIGNhdGVnb3JpZXMgKHN1Y2ggYXMgYFZlcmlmaWVkYCBhbmQKLWBDb2RlIFJldmlld2AsIGFib3ZlKSBtdXN0IGVuYWJsZSBzdWJtaXQsIGFuZCBhbHNvIG11c3Qgbm90IGJsb2NrIGl0LgotU2VlIGFib3ZlIGZvciBkZXRhaWxzIG9uIGVhY2ggY2F0ZWdvcnkuCitJbiBvcmRlciB0byBzdWJtaXQsIGFsbCBsYWJlbHMgKHN1Y2ggYXMgYFZlcmlmaWVkYCBhbmQgYENvZGUtUmV2aWV3YCwKK2Fib3ZlKSBtdXN0IGVuYWJsZSBzdWJtaXQsIGFuZCBhbHNvIG11c3Qgbm90IGJsb2NrIGl0LiAgU2VlIGFib3ZlIGZvcgorZGV0YWlscyBvbiBlYWNoIGxhYmVsLgogCiAKLVtbY2F0ZWdvcnlfbWFrZW9uZXVwXV0KLVlvdXIgQ2F0ZWdvcnkgSGVyZQotfn5+fn5+fn5+fn5+fn5+fn5+CitbW2NhdGVnb3J5X3ZpZXdfZHJhZnRzXV0KK1ZpZXcgRHJhZnRzCit+fn5+fn5+fn5+fgogCi1HZXJyaXQgYWRtaW5pc3RyYXRvcnMgY2FuIGFsc28gbWFrZSB1cCB0aGVpciBvd24gY2F0ZWdvcmllcy4KK1RoaXMgY2F0ZWdvcnkgcGVybWl0cyB1c2VycyB0byB2aWV3IGRyYWZ0IGNoYW5nZXMgdXBsb2FkZWQgYnkgb3RoZXIKK3VzZXJzLgogCi1TZWUgYWJvdmUgZm9yIGRlc2NyaXB0aW9ucyBvZiBob3cgPDxjYXRlZ29yeV92ZXJpZmllZCxgVmVyaWZpZWRgPj4KLWFuZCA8PGNhdGVnb3J5X3JldmlldyxgQ29kZSBSZXZpZXdgPj4gd29yaywgYW5kIGluc2VydCB5b3VyIG93bgotY2F0ZWdvcnkgd2l0aCBgZnVuY3Rpb25fbmFtZSA9ICdNYXhXaXRoQmxvY2snYCB0byBnZXQgdGhlIHNhbWUKLWJlaGF2aW9yIG92ZXIgeW91ciBvd24gcmFuZ2Ugb2YgdmFsdWVzLCBpbiBhbnkgY2F0ZWdvcnkgeW91IGRlc2lyZS4KK1RoZSBjaGFuZ2Ugb3duZXIgYW5kIGFueSBleHBsaWNpdGx5IGFkZGVkIHJldmlld2VycyBjYW4gYWx3YXlzIHNlZQorZHJhZnQgY2hhbmdlcyAoZXZlbiB3aXRob3V0IGhhdmluZyB0aGUgYFZpZXcgRHJhZnRzYCBhY2Nlc3MgcmlnaHQKK2Fzc2lnbmVkKS4KIAotRW5zdXJlIGBjYXRlZ29yeV9pZGAgaXMgdW5pcXVlIHdpdGhpbiB5b3VyIGBhcHByb3ZhbF9jYXRlZ29yaWVzYAotdGFibGUuICBUaGUgZGVmYXVsdCB2YWx1ZXMgYFZSSUZgIGFuZCBgQ1ZSRmAgdXNlZCBmb3IgdGhlIGNhdGVnb3JpZXMKLWRlc2NyaWJlZCBhYm92ZSBhcmUgc2ltcGx5IHRoYXQsIGRlZmF1bHRzLCBhbmQgaGF2ZSBubyBzcGVjaWFsCi1tZWFuaW5nIHRvIEdlcnJpdC4KIAotVGhlIGBwb3NpdGlvbmAgY29sdW1uIG9mIGBhcHByb3ZhbF9jYXRlZ29yaWVzYCBjb250cm9scyB3aGljaCBjb2x1bW4KLW9mIHRoZSAnQXBwcm92YWxzJyB0YWJsZSB0aGUgY2F0ZWdvcnkgYXBwZWFycyBpbiwgcHJvdmlkaW5nIHNvbWUKLWxheW91dCBjb250cm9sIHRvIHRoZSBhZG1pbmlzdHJhdG9yLgorW1tjYXRlZ29yeV9wdWJsaXNoX2RyYWZ0c11dCitQdWJsaXNoIERyYWZ0cworfn5+fn5+fn5+fn5+fn4KIAotQWxsIGBNYXhXaXRoQmxvY2tgIGNhdGVnb3JpZXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwb3NpdGl2ZSB2YWx1ZQotaW4gdGhlIGBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXNgIHRhYmxlLCBvciBlbHNlIHN1Ym1pdCB3aWxsIG5ldmVyCi1iZSBlbmFibGVkLgorVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIHB1Ymxpc2ggZHJhZnQgY2hhbmdlcyB1cGxvYWRlZCBieSBvdGhlcgordXNlcnMuCiAKLVRvIHBlcm1pdCBibG9ja2luZyBzdWJtaXRzLCBlbnN1cmUgYSBuZWdhdGl2ZSB2YWx1ZSBpcyBkZWZpbmVkIGZvcgoteW91ciBuZXcgY2F0ZWdvcnkuICBJZiB5b3UgZG8gbm90IHdpc2ggdG8gaGF2ZSBhIGJsb2NraW5nIHN1Ym1pdAotbGV2ZWwgZm9yIHlvdXIgY2F0ZWdvcnksIGRvIG5vdCBkZWZpbmUgdmFsdWVzIGxlc3MgdGhhbiAwLgorVGhlIGNoYW5nZSBvd25lciBjYW4gYWx3YXlzIHB1Ymxpc2ggZHJhZnQgY2hhbmdlcyAoZXZlbiB3aXRob3V0IGhhdmluZwordGhlIGBQdWJsaXNoIERyYWZ0c2AgYWNjZXNzIHJpZ2h0IGFzc2lnbmVkKS4KIAotS2VlcCBpbiBtaW5kIHRoYXQgY2F0ZWdvcnkgZGVmaW5pdGlvbnMgYXJlIGN1cnJlbnRseSBnbG9iYWwgdG8KLXRoZSBlbnRpcmUgR2Vycml0IGluc3RhbmNlLCBhbmQgYWZmZWN0IGFsbCBwcm9qZWN0cyBob3N0ZWQgb24gaXQuCi1BbnkgY2hhbmdlIHRvIGEgY2F0ZWdvcnkgZGVmaW5pdGlvbiBhZmZlY3RzIGV2ZXJ5b25lLgogCi1Gb3IgZXhhbXBsZSwgdG8gZGVmaW5lIGEgbmV3IDMtdmFsdWVkIGNhdGVnb3J5IHRoYXQgYmVoYXZlcyBleGFjdGx5Ci1saWtlIGBWZXJpZmllZGAsIGJ1dCBoYXMgZGlmZmVyZW50IG5hbWVzL2xhYmVsczoKK1tbY2F0ZWdvcnlfZGVsZXRlX2RyYWZ0c11dCitEZWxldGUgRHJhZnRzCit+fn5+fn5+fn5+fn5+CiAKLT09PT0KLSAgSU5TRVJUIElOVE8gYXBwcm92YWxfY2F0ZWdvcmllcwotICAgIChuYW1lCi0gICAgLHBvc2l0aW9uCi0gICAgLGZ1bmN0aW9uX25hbWUKLSAgICAsY2F0ZWdvcnlfaWQpCi0gIFZBTFVFUwotICAgICgnQ29weXJpZ2h0IENoZWNrJwotICAgICwzCi0gICAgLCdNYXhXaXRoQmxvY2snCi0gICAgLCdjb3B5Jyk7CitUaGlzIGNhdGVnb3J5IHBlcm1pdHMgdXNlcnMgdG8gZGVsZXRlIGRyYWZ0IGNoYW5nZXMgdXBsb2FkZWQgYnkgb3RoZXIKK3VzZXJzLgogCi0gIElOU0VSVCBJTlRPIGFwcHJvdmFsX2NhdGVnb3J5X3ZhbHVlcwotICAgIChjYXRlZ29yeV9pZCx2YWx1ZSxuYW1lKQotICBWQUxVRVMKLSAgICAoJ2NvcHknLCAtMSwgJ0RvIG5vdCBoYXZlIGNvcHlyaWdodCcpOworVGhlIGNoYW5nZSBvd25lciBjYW4gYWx3YXlzIGRlbGV0ZSBkcmFmdCBjaGFuZ2VzIChldmVuIHdpdGhvdXQgaGF2aW5nCit0aGUgYERlbGV0ZSBEcmFmdHNgIGFjY2VzcyByaWdodCBhc3NpZ25lZCkuCiAKLSAgSU5TRVJUIElOVE8gYXBwcm92YWxfY2F0ZWdvcnlfdmFsdWVzCi0gICAgKGNhdGVnb3J5X2lkLHZhbHVlLG5hbWUpCi0gIFZBTFVFUwotICAgICgnY29weScsIDAsICdObyBzY29yZScpOwogCi0gIElOU0VSVCBJTlRPIGFwcHJvdmFsX2NhdGVnb3J5X3ZhbHVlcwotICAgIChjYXRlZ29yeV9pZCx2YWx1ZSxuYW1lKQotICBWQUxVRVMKLSAgICAoJ2NvcHknLCAxLCAnQ29weXJpZ2h0IGNsZWFyJyk7Ci09PT09CitbW2NhdGVnb3J5X2VkaXRfdG9waWNfbmFtZV1dCitFZGl0IFRvcGljIE5hbWUKK35+fn5+fn5+fn5+fn5+fgogCi1UaGUgbmV3IGNvbHVtbiB3aWxsIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSAoaW4gcG9zaXRpb24gMyksCi1hbmQgYC0xIERvIG5vdCBoYXZlIGNvcHlyaWdodGAgd2lsbCBibG9jayBzdWJtaXQsIHdoaWxlIGArMSBDb3B5cmlnaHQKLWNsZWFyYCBpcyByZXF1aXJlZCB0byBlbmFibGUgc3VibWl0LgorVGhpcyBjYXRlZ29yeSBwZXJtaXRzIHVzZXJzIHRvIGVkaXQgdGhlIHRvcGljIG5hbWUgb2YgYSBjaGFuZ2UgdGhhdAoraXMgdXBsb2FkZWQgZm9yIHJldmlldy4KIAotW1tyZXN0YXJ0X2NoYW5nZXNdXQotW05PVEVdCi1SZXN0YXJ0IHRoZSBHZXJyaXQgd2ViIGFwcGxpY2F0aW9uIGFuZCByZWxvYWQgYWxsIGJyb3dzZXJzIGFmdGVyCi1tYWtpbmcgYW55IGRhdGFiYXNlIGNoYW5nZXMgdG8gYXBwcm92YWwgY2F0ZWdvcmllcy4gIEJyb3dzZXJzIGFyZQotc2VudCB0aGUgbGlzdCBvZiBrbm93biBjYXRlZ29yaWVzIHdoZW4gdGhleSBmaXJzdCB2aXNpdCB0aGUgc2l0ZSwKLWFuZCBkb24ndCBub3RpY2UgY2hhbmdlcyB1bnRpbCB0aGUgcGFnZSBpcyBjbG9zZWQgYW5kIG9wZW5lZCBhZ2FpbiwKLW9yIGlzIHJlbG9hZGVkLgorVGhlIGNoYW5nZSBvd25lciwgYnJhbmNoIG93bmVycywgcHJvamVjdCBvd25lcnMsIGFuZCBzaXRlIGFkbWluaXN0cmF0b3JzCitjYW4gYWx3YXlzIGVkaXQgdGhlIHRvcGljIG5hbWUgKGV2ZW4gd2l0aG91dCBoYXZpbmcgdGhlIGBFZGl0IFRvcGljIE5hbWVgCithY2Nlc3MgcmlnaHQgYXNzaWduZWQpLgogCiAKIEV4YW1wbGVzIG9mIHR5cGljYWwgcm9sZXMgaW4gYSBwcm9qZWN0CkBAIC04MjksNiArODMwLDcgQEAKIGdlbmVyYWwgZ3VpZGVsaW5lcyBmb3IgYSB0eXBpY2FsIHdheSB0byBzZXQgdXAgeW91ciBwcm9qZWN0IG9uIGEKIGJyYW5kIG5ldyBHZXJyaXQgaW5zdGFuY2UuCiAKKwogW1tleGFtcGxlc19jb250cmlidXRvcl1dCiBDb250cmlidXRvcgogfn5+fn5+fn5+fn4KQEAgLTg0MCw5ICs4NDIsOSBAQAogCiBTdWdnZXN0ZWQgYWNjZXNzIHJpZ2h0cyB0byBncmFudDoKIAotKiA8PGNhdGVnb3J5X3JlYWQsYFJlYWRgPj4gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCi0qIDw8Y2F0ZWdvcnlfcHVzaCxgUHVzaGA+PiB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL2NoYW5nZXMvKicKLSogPDxjYXRlZ29yeV9sYWJlbC1Db2RlLVJldmlldyxgQ29kZSByZXZpZXdgPj4gd2l0aCByYW5nZSAnLTEnIHRvICcrMScKKyogeHJlZjpjYXRlZ29yeV9yZWFkW2BSZWFkYF0gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaFtgUHVzaGBdIHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzLyonCisqIGxpbms6Y29uZmlnLWxhYmVscy5odG1sI2xhYmVsX0NvZGUtUmV2aWV3W2BDb2RlLVJldmlld2BdIHdpdGggcmFuZ2UgJy0xJyB0byAnKzEnIGZvciAncmVmcy9oZWFkcy8qJwogCiAKIFtbZXhhbXBsZXNfZGV2ZWxvcGVyXV0KQEAgLTg2NCwxMyArODY2LDEzIEBACiAKIFN1Z2dlc3RlZCBhY2Nlc3MgcmlnaHRzIHRvIGdyYW50OgogCi0qIDw8Y2F0ZWdvcnlfcmVhZCxgUmVhZGA+PiBvbiAncmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL3RhZ3MvKicKLSogPDxjYXRlZ29yeV9wdXNoLGBQdXNoYD4+IHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzL1wqJyBhbmQgJ3JlZnMvY2hhbmdlcy8qJwotKiA8PGNhdGVnb3J5X3B1c2hfbWVyZ2UsYFB1c2ggbWVyZ2UgY29tbWl0YD4+IHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzL1wqJyBhbmQgJ3JlZnMvY2hhbmdlcy8qJwotKiA8PGNhdGVnb3J5X2ZvcmdlX2F1dGhvcixgRm9yZ2UgQXV0aG9yIElkZW50aXR5YD4+Ci0qIDw8Y2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXcsYExhYmVsOiBDb2RlIHJldmlld2A+PiB3aXRoIHJhbmdlICctMicgdG8gJysyJwotKiA8PGNhdGVnb3J5X2xhYmVsLVZlcmlmaWVkLGBMYWJlbDogVmVyaWZ5YD4+IHdpdGggcmFuZ2UgJy0xJyB0byAnKzEnCi0qIDw8Y2F0ZWdvcnlfc3VibWl0LGBTdWJtaXRgPj4KKyogeHJlZjpjYXRlZ29yeV9yZWFkW2BSZWFkYF0gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaFtgUHVzaGBdIHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaF9tZXJnZVtgUHVzaCBtZXJnZSBjb21taXRgXSB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy8qJworKiB4cmVmOmNhdGVnb3J5X2ZvcmdlX2F1dGhvcltgRm9yZ2UgQXV0aG9yIElkZW50aXR5YF0gdG8gJ3JlZnMvaGVhZHMvKicKKyogbGluazpjb25maWctbGFiZWxzLmh0bWwjbGFiZWxfQ29kZS1SZXZpZXdbYExhYmVsOiBDb2RlLVJldmlld2BdIHdpdGggcmFuZ2UgJy0yJyB0byAnKzInIGZvciAncmVmcy9oZWFkcy8qJworKiBsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbCNsYWJlbF9WZXJpZmllZFtgTGFiZWw6IFZlcmlmeWBdIHdpdGggcmFuZ2UgJy0xJyB0byAnKzEnIGZvciAncmVmcy9oZWFkcy8qJworKiB4cmVmOmNhdGVnb3J5X3N1Ym1pdFtgU3VibWl0YF0KIAogSWYgdGhlIHByb2plY3QgaXMgc21hbGwgb3IgdGhlIGRldmVsb3BlcnMgYXJlIHNlYXNvbmVkIGl0IG1pZ2h0IG1ha2UKIHNlbnNlIHRvIGdpdmUgdGhlbSB0aGUgZnJlZWRvbSB0byBwdXNoIGNvbW1pdHMgZGlyZWN0bHkgdG8gYSBicmFuY2guCkBAIC04ODUsNyArODg3LDcgQEAKIENJIHN5c3RlbQogfn5+fn5+fn5+CiAKLUEgdHlwaWNhbCBDb250aW5vdXMgSW50ZWdyYXRpb24gc3lzdGVtIHNob3VsZCBiZSBhYmxlIHRvIGRvd25sb2FkIG5ldyBjaGFuZ2VzCitBIHR5cGljYWwgQ29udGludW91cyBJbnRlZ3JhdGlvbiBzeXN0ZW0gc2hvdWxkIGJlIGFibGUgdG8gZG93bmxvYWQgbmV3IGNoYW5nZXMKIHRvIGJ1aWxkIGFuZCB0aGVuIGxlYXZlIGEgdmVyZGljdCBzb21laG93LgogCiBBcyBhbiBleGFtcGxlLCB0aGUgcG9wdWxhcgpAQCAtOTIwLDE0ICs5MjIsMTQgQEAKIAogU3VnZ2VzdGVkIGFjY2VzcyByaWdodHMgdG8gZ3JhbnQsIHRoYXQgd29uJ3QgYmxvY2sgY2hhbmdlczoKIAotKiA8PGNhdGVnb3J5X3JlYWQsYFJlYWRgPj4gb24gJ3JlZnMvaGVhZHMvXConIGFuZCAncmVmcy90YWdzLyonCi0qIDw8Y2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXcsYExhYmVsOiBDb2RlIHJldmlld2A+PiB3aXRoIHJhbmdlICctMScgdG8gJzAnCi0qIDw8Y2F0ZWdvcnlfbGFiZWwtVmVyaWZpZWQsYExhYmVsOiBWZXJpZnlgPj4gd2l0aCByYW5nZSAnMCcgdG8gJysxJworKiB4cmVmOmNhdGVnb3J5X3JlYWRbYFJlYWRgXSBvbiAncmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL3RhZ3MvKicKKyogbGluazpjb25maWctbGFiZWxzLmh0bWwjbGFiZWxfQ29kZS1SZXZpZXdbYExhYmVsOiBDb2RlLVJldmlld2BdIHdpdGggcmFuZ2UgJy0xJyB0byAnMCcgZm9yICdyZWZzL2hlYWRzLyonCisqIGxpbms6Y29uZmlnLWxhYmVscy5odG1sI2xhYmVsX1ZlcmlmaWVkW2BMYWJlbDogVmVyaWZ5YF0gd2l0aCByYW5nZSAnMCcgdG8gJysxJyBmb3IgJ3JlZnMvaGVhZHMvKicKIAogT3B0aW9uYWwgYWNjZXNzIHJpZ2h0cyB0byBncmFudDoKIAotKiA8PGNhdGVnb3J5X2xhYmVsLUNvZGUtUmV2aWV3LGBMYWJlbDogQ29kZSByZXZpZXdgPj4gd2l0aCByYW5nZSAnLTEnIHRvICcrMScKLSogPDxjYXRlZ29yeV9wdXNoLGBQdXNoYD4+IHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzL1wqJyBhbmQgJ3JlZnMvY2hhbmdlcy8qJworKiBsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbCNsYWJlbF9Db2RlLVJldmlld1tgTGFiZWw6IENvZGUtUmV2aWV3YF0gd2l0aCByYW5nZSAnLTEnIHRvICcrMScgZm9yICdyZWZzL2hlYWRzLyonCisqIHhyZWY6Y2F0ZWdvcnlfcHVzaFtgUHVzaGBdIHRvICdyZWZzL2Zvci9yZWZzL2hlYWRzLyonCiAKIAogW1tleGFtcGxlc19pbnRlZ3JhdG9yXV0KQEAgLTk0NCw3ICs5NDYsNyBAQAogKiA8PGV4YW1wbGVzX2RldmVsb3BlcixEZXZlbG9wZXIgcmlnaHRzPj4KICogPDxjYXRlZ29yeV9wdXNoLGBQdXNoYD4+IHRvICdyZWZzL2hlYWRzLyonCiAqIDw8Y2F0ZWdvcnlfcHVzaF9tZXJnZSxgUHVzaCBtZXJnZSBjb21taXRgPj4gdG8gJ3JlZnMvaGVhZHMvKicKLSogPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsYEZvcmdlIENvbW1pdHRlciBJZGVudGl0eWA+PiB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy9cKicgYW5kICdyZWZzL2NoYW5nZXMvKicKKyogPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsYEZvcmdlIENvbW1pdHRlciBJZGVudGl0eWA+PiB0byAncmVmcy9mb3IvcmVmcy9oZWFkcy8qJwogKiA8PGNhdGVnb3J5X2NyZWF0ZSxgQ3JlYXRlIFJlZmVyZW5jZWA+PiB0byAncmVmcy9oZWFkcy8qJwogKiA8PGNhdGVnb3J5X3B1c2hfYW5ub3RhdGVkLGBQdXNoIEFubm90YXRlZCBUYWdgPj4gdG8gJ3JlZnMvdGFncy8qJwogCkBAIC05NTgsNyArOTYwLDcgQEAKIGFsc28gaGF2ZSB0aGUgcG93ZXIgdG8gY29uZmlndXJlIGFjY2VzcyByaWdodHMgaW4gZ2l0cyBhc3NpZ25lZCB0byB0aGVtLgogCiBbV0FSTklOR10KLVRoZXNlIHVzZXJzIHNob3VsZCBiZSByZWFsbHkga25vd2xlZGdhYmxlIGFib3V0IGdpdCwgZm9yIGluc3RhbmNlIGtub3dpbmcgd2h5CitUaGVzZSB1c2VycyBzaG91bGQgYmUgcmVhbGx5IGtub3dsZWRnZWFibGUgYWJvdXQgZ2l0LCBmb3IgaW5zdGFuY2Uga25vd2luZyB3aHkKIHRhZ3MgbmV2ZXIgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBhIHNlcnZlci4gIFRoaXMgcm9sZSBpcyBncmFudGVkIHBvdGVudGlhbGx5CiBkZXN0cnVjdGl2ZSBhY2Nlc3MgcmlnaHRzIGFuZCBjbGVhbmluZyB1cCBhZnRlciBzdWNoIGEgbWlzaGFwIGNvdWxkIGJlIHRpbWUKIGNvbnN1bWluZyEKQEAgLTk3Miw2ICs5NzQsNyBAQAogCiAqIDw8Y2F0ZWdvcnlfb3duZXIsYE93bmVyYD4+IGluIHRoZSBnaXRzIHRoZXkgbW9zdGx5IHdvcmsgd2l0aC4KIAorCiBbW2V4YW1wbGVzX2FkbWluaXN0cmF0b3JdXQogQWRtaW5pc3RyYXRvcgogfn5+fn5+fn5+fn5+fgpAQCAtOTkwLDYgKzk5MywxMjggQEAKICogPDxleGFtcGxlc19wcm9qZWN0LW93bmVyLFByb2plY3Qgb3duZXIgcmlnaHRzPj4KIAogCitFbmZvcmNpbmcgc2l0ZSB3aWRlIGFjY2VzcyBwb2xpY2llcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnkgZ3JhbnRpbmcgdGhlIDw8Y2F0ZWdvcnlfb3duZXIsYE93bmVyYD4+IGFjY2VzcyByaWdodCBvbiB0aGUgYHJlZnMvKmAgdG8gYQorZ3JvdXAsIEdlcnJpdCBhZG1pbmlzdHJhdG9ycyBjYW4gZGVsZWdhdGUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIG1haW50YWluaW5nCithY2Nlc3MgcmlnaHRzIGZvciB0aGF0IHByb2plY3QgdG8gdGhhdCBncm91cC4KKworSW4gYSBjb3Jwb3JhdGUgZGVwbG95bWVudCBpdCBpcyBvZnRlbiBuZWNlc3NhcnkgdG8gZW5mb3JjZSBzb21lIGFjY2VzcworcG9saWNpZXMuIEFuIGV4YW1wbGUgY291bGQgYmUgdGhhdCBuby1vbmUgY2FuIHVwZGF0ZSBvciBkZWxldGUgYSB0YWcsIG5vdCBldmVuCit0aGUgcHJvamVjdCBvd25lcnMuIFRoZSAnQUxMT1cnIGFuZCAnREVOWScgcnVsZXMgYXJlIG5vdCBlbm91Z2ggZm9yIHRoaXMKK3B1cnBvc2UgYXMgcHJvamVjdCBvd25lcnMgY2FuIGdyYW50IHRoZW1zZWx2ZXMgYW55IGFjY2VzcyByaWdodCB0aGV5IHdpc2ggYW5kLAordGh1cywgZWZmZWN0aXZlbHkgb3ZlcnJpZGUgYW55IGluaGVyaXRlZCBhY2Nlc3MgcmlnaHRzIGZyb20gdGhlCisiYEFsbC1Qcm9qZWN0c2AiIG9yIHNvbWUgb3RoZXIgY29tbW9uIHBhcmVudCBwcm9qZWN0LgorCitXaGF0IGlzIG5lZWRlZCBpcyBhIG1lY2hhbmlzbSB0byBibG9jayBhIHBlcm1pc3Npb24gaW4gYSBwYXJlbnQgcHJvamVjdCBzbwordGhhdCBldmVuIHByb2plY3Qgb3duZXJzIGNhbm5vdCBhbGxvdyBhIGJsb2NrZWQgcGVybWlzc2lvbiBpbiB0aGVpciBjaGlsZAorcHJvamVjdC4gU3RpbGwsIHByb2plY3Qgb3duZXJzIHNob3VsZCByZXRhaW4gdGhlIHBvc3NpYmlsaXR5IHRvIG1hbmFnZSBhbGwKK25vbi1ibG9ja2VkIHJ1bGVzIGFzIHRoZXkgd2lzaC4gVGhpcyBnaXZlcyBiZXN0IG9mIGJvdGggd29ybGRzOgorCisqIEdlcnJpdCBhZG1pbmlzdHJhdG9ycyBjYW4gY29uY2VudHJhdGUgb24gZW5mb3JjaW5nIHNpdGUgd2lkZSBwb2xpY2llcworICBhbmQgcHJvdmlkaW5nIGEgbWVhbmluZ2Z1bCBzZXQgb2YgZGVmYXVsdCBhY2Nlc3MgcGVybWlzc2lvbnMKKyogUHJvamVjdCBvd25lcnMgY2FuIG1hbmFnZSBhY2Nlc3MgcmlnaHRzIG9mIHRoZWlyIHByb2plY3RzIHdpdGhvdXQgYSBkYW5nZXIKKyAgb2YgdmlvbGF0aW5nIGEgc2l0ZSB3aWRlIHBvbGljeQorCisKK1tbYmxvY2tdXQorJ0JMT0NLJyBhY2Nlc3MgcnVsZQorfn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgJ0JMT0NLJyBydWxlIGJsb2NrcyBhIHBlcm1pc3Npb24gZ2xvYmFsbHkuIEFuIGluaGVyaXRlZCAnQkxPQ0snIHJ1bGUgY2Fubm90CitiZSBvdmVycmlkZGVuIGluIHRoZSBpbmhlcml0aW5nIHByb2plY3QuIEFueSAnQUxMT1cnIHJ1bGUsIGZyb20gYSBkaWZmZXJlbnQKK2FjY2VzcyBzZWN0aW9uIG9yIGZyb20gYW4gaW5oZXJpdGluZyBwcm9qZWN0LCB3aGljaCBjb25mbGljdHMgd2l0aCBhbgoraW5oZXJpdGVkICdCTE9DSycgcnVsZSB3aWxsIG5vdCBiZSBob25vcmVkLiAgU2VhcmNoaW5nIGZvciAnQkxPQ0snIHJ1bGVzLCBpbgordGhlIGNoYWluIG9mIHBhcmVudCBwcm9qZWN0cywgaWdub3JlcyB0aGUgRXhjbHVzaXZlIGZsYWcgdGhhdCBpcyBub3JtYWxseQorYXBwbGllZCB0byBhY2Nlc3Mgc2VjdGlvbnMuCisKK0EgJ0JMT0NLJyBydWxlIHRoYXQgYmxvY2tzIHRoZSAncHVzaCcgcGVybWlzc2lvbiBibG9ja3MgYW55IHR5cGUgb2YgcHVzaCwKK2ZvcmNlIG9yIG5vdC4gQSBibG9ja2luZyBmb3JjZSBwdXNoIHJ1bGUgYmxvY2tzIG9ubHkgZm9yY2UgcHVzaGVzLCBidXQKK2FsbG93cyBub24tZm9yY2VkIHB1c2hlcyBpZiBhbiAnQUxMT1cnIHJ1bGUgd291bGQgaGF2ZSBwZXJtaXR0ZWQgaXQuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gYmxvY2sgbGFiZWwgcmFuZ2VzLiAgVG8gYmxvY2sgYSBncm91cCAnWCcgZnJvbSB2b3RpbmcKKyctMicgYW5kICcrMicsIGJ1dCBrZWVwIHRoZWlyIGV4aXN0aW5nIHZvdGluZyBwZXJtaXNzaW9ucyBmb3IgdGhlICctMS4uKzEnCityYW5nZSBpbnRhY3Qgd2Ugd291bGQgZGVmaW5lOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvaGVhZHMvKiJdCisgICAgbGFiZWwtQ29kZS1SZXZpZXcgPSBibG9jayAtMi4uKzIgZ3JvdXAgWAorPT09PQorCitUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICdtaW4uLm1heCcgcmFuZ2UgaW4gY2FzZSBvZiBhIGJsb2NraW5nIHJ1bGUgaXM6IGJsb2NrCitldmVyeSB2b3RlIGZyb20gJy1JTkZJTklURS4ubWluJyBhbmQgJ21heC4uSU5GSU5JVEUnLiBGb3IgdGhlIGV4YW1wbGUgYWJvdmUgaXQKK21lYW5zIHRoYXQgdGhlIHJhbmdlICctMS4uKzEnIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIGJsb2NrLgorCisnQkxPQ0snIGFuZCAnQUxMT1cnIHJ1bGVzIGluIHRoZSBzYW1lIGFjY2VzcyBzZWN0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1doZW4gYW4gYWNjZXNzIHNlY3Rpb24gb2YgYSBwcm9qZWN0IGNvbnRhaW5zIGEgJ0JMT0NLJyBhbmQgYW4gJ0FMTE9XJyBydWxlIGZvcgordGhlIHNhbWUgcGVybWlzc2lvbiB0aGVuIHRoaXMgJ0FMTE9XJyBydWxlIG92ZXJyaWRlcyB0aGUgJ0JMT0NLJyBydWxlOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvaGVhZHMvKiJdCisgICAgcHVzaCA9IGJsb2NrIGdyb3VwIFgKKyAgICBwdXNoID0gZ3JvdXAgWQorPT09PQorCitJbiB0aGlzIGNhc2UgYSB1c2VyIHdoaWNoIGlzIGEgbWVtYmVyIG9mIHRoZSBncm91cCAnWScgd2lsbCBzdGlsbCBiZSBhbGxvd2VkIHRvCitwdXNoIHRvICdyZWZzL2hlYWRzLyonIGV2ZW4gaWYgaXQgaXMgYSBtZW1iZXIgb2YgdGhlIGdyb3VwICdYJy4KKworTk9URTogQW4gJ0FMTE9XJyBydWxlIG92ZXJyaWRlcyBhICdCTE9DSycgcnVsZSBvbmx5IHdoZW4gYm90aCBvZiB0aGVtIGFyZQoraW5zaWRlIHRoZSBzYW1lIGFjY2VzcyBzZWN0aW9uIG9mIHRoZSBzYW1lIHByb2plY3QuIEFuICdBTExPVycgcnVsZSBpbiBhCitkaWZmZXJlbnQgYWNjZXNzIHNlY3Rpb24gb2YgdGhlIHNhbWUgcHJvamVjdCBvciBpbiBhbnkgYWNjZXNzIHNlY3Rpb24gaW4gYW4KK2luaGVyaXRpbmcgcHJvamVjdCBjYW5ub3Qgb3ZlcnJpZGUgYSAnQkxPQ0snIHJ1bGUuCisKKworRXhhbXBsZXMKK35+fn5+fn5+CisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBzb21lIHBvc3NpYmxlIHVzZSBjYXNlcyBmb3IgdGhlICdCTE9DSycgcnVsZXMuCisKK01ha2Ugc3VyZSBubyBvbmUgY2FuIHVwZGF0ZSBvciBkZWxldGUgYSB0YWcKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVGhpcyByZXF1aXJlbWVudCBpcyBxdWl0ZSBjb21tb24gaW4gYSBjb3Jwb3JhdGUgZGVwbG95bWVudCB3aGVyZQorcmVwcm9kdWNpYmlsaXR5IG9mIGEgYnVpbGQgbXVzdCBiZSBndWFyYW50ZWVkLiBUbyBhY2hpZXZlIHRoYXQgd2UgYmxvY2sgJ3B1c2gnCitwZXJtaXNzaW9uIGZvciB0aGUgPDxhbm9ueW1vdXNfdXNlcnMsJ0Fub255bW91cyBVc2Vycyc+PiBpbiAiYEFsbC1Qcm9qZWN0c2AiOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvdGFncy8qIl0KKyAgICBwdXNoID0gYmxvY2sgZ3JvdXAgQW5vbnltb3VzIFVzZXJzCis9PT09CisKK0J5IGJsb2NraW5nIHRoZSA8PGFub255bW91c191c2VycywnQW5vbnltb3VzIFVzZXJzJz4+IHdlIGVmZmVjdGl2ZWx5IGJsb2NrCitldmVyeW9uZSBhcyBldmVyeW9uZSBpcyBhIG1lbWJlciBvZiB0aGF0IGdyb3VwLiBOb3RlIHRoYXQgdGhlIHBlcm1pc3Npb24gdG8KK2NyZWF0ZSBhIHRhZyBpcyBzdGlsbCBuZWNlc3NhcnkuIEFzc3VtaW5nIHRoYXQgb25seSA8PGNhdGVnb3J5X293bmVyLHByb2plY3QKK293bmVycz4+IGFyZSBhbGxvd2VkIHRvIGNyZWF0ZSB0YWdzLCB3ZSB3b3VsZCBleHRlbmQgdGhlIGV4YW1wbGUgYWJvdmU6CisKKz09PT0KKyAgW2FjY2VzcyAicmVmcy90YWdzLyoiXQorICAgIHB1c2ggPSBibG9jayBncm91cCBBbm9ueW1vdXMgVXNlcnMKKyAgICBjcmVhdGUgPSBncm91cCBQcm9qZWN0IE93bmVycworICAgIHB1c2hUYWcgPSBncm91cCBQcm9qZWN0IE93bmVycworPT09PQorCisKK0xldCBvbmx5IGEgZGVkaWNhdGVkIGdyb3VwIHZvdGUgaW4gYSBzcGVjaWFsIGNhdGVnb3J5CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitBc3N1bWUgdGhlcmUgaXMgYSBtb3JlIHJlc3RyaWN0aXZlIHByb2Nlc3MgZm9yIHN1Ym1pdHRpbmcgY2hhbmdlcyBpbiBzdGFibGUKK3JlbGVhc2UgYnJhbmNoZXMgd2hpY2ggaXMgbWFuaWZlc3RlZCBhcyBhIG5ldyB2b3RpbmcgY2F0ZWdvcnkKKydSZWxlYXNlLVByb2Nlc3MnLiBBc3N1bWUgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBvbmx5IGEgJ1JlbGVhc2UgRW5naW5lZXJzJworZ3JvdXAgY2FuIHZvdGUgaW4gdGhpcyBjYXRlZ29yeSBhbmQgdGhhdCBldmVuIHByb2plY3Qgb3duZXJzIGNhbm5vdCBhcHByb3ZlCit0aGlzIGNhdGVnb3J5LiBXZSBoYXZlIHRvIGJsb2NrIGV2ZXJ5b25lIGV4Y2VwdCB0aGUgJ1JlbGVhc2UgRW5naW5lZXJzJyB0byB2b3RlCitpbiB0aGlzIGNhdGVnb3J5IGFuZCwgb2YgY291cnNlLCBhbGxvdyAnUmVsZWFzZSBFbmdpbmVlcnMnIHRvIHZvdGUgaW4gdGhhdAorY2F0ZWdvcnkuIEluIHRoZSAiYEFsbC1Qcm9qZWN0c2AiIHdlIGRlZmluZSB0aGUgZm9sbG93aW5nIHJ1bGVzOgorCis9PT09CisgIFthY2Nlc3MgInJlZnMvaGVhZHMvc3RhYmxlKiJdCisgICAgbGFiZWwtUmVsZWFzZS1Qcm9jZXNzID0gYmxvY2sgLTEuLisxIGdyb3VwIEFub255bW91cyBVc2VycworICAgIGxhYmVsLVJlbGVhc2UtUHJvY2VzcyA9IC0xLi4rMSBncm91cCBSZWxlYXNlIEVuZ2luZWVycworPT09PQorCisKIFtbY29udmVyc2lvbl90YWJsZV1dCiBDb252ZXJzaW9uIHRhYmxlIGZyb20gMi4xLnggc2VyaWVzIHRvIDIuMi54IHNlcmllcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk5Nyw4ICsxMTIyLDggQEAKIFtvcHRpb25zPSJoZWFkZXIiXQogfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogfEdlcnJpdCAyLjEueCAgICAgICAgICAgICAgICAgfEdlcnJpdCAyLjIueAotfENvZGUgcmV2aWV3ICAgICAgICAgICAgICAgICAgfDw8Y2F0ZWdvcnlfbGFiZWwtQ29kZS1SZXZpZXcsTGFiZWw6IENvZGUgcmV2aWV3Pj4KLXxWZXJpZnkgICAgICAgICAgICAgICAgICAgICAgIHw8PGNhdGVnb3J5X2xhYmVsLVZlcmlmaWVkLExhYmVsOiBWZXJpZnk+PgorfENvZGUgcmV2aWV3ICAgICAgICAgICAgICAgICAgfGxpbms6Y29uZmlnLWxhYmVscy5odG1sI2xhYmVsX0NvZGUtUmV2aWV3W0xhYmVsOiBDb2RlLVJldmlld10KK3xWZXJpZnkgICAgICAgICAgICAgICAgICAgICAgIHxsaW5rOmNvbmZpZy1sYWJlbHMuaHRtbCNsYWJlbF9WZXJpZmllZFtMYWJlbDogVmVyaWZ5XQogfEZvcmdlIElkZW50aXR5ICsxICAgICAgICAgICAgfEZvcmdlIDw8Y2F0ZWdvcnlfZm9yZ2VfYXV0aG9yLGF1dGhvcj4+IGlkZW50aXR5CiB8Rm9yZ2UgSWRlbnRpdHkgKzIgICAgICAgICAgICB8Rm9yZ2UgPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsY29tbWl0dGVyPj4gJiA8PGNhdGVnb3J5X2ZvcmdlX2F1dGhvcixhdXRob3I+PiBpZGVudGl0eQogfEZvcmdlIElkZW50aXR5ICszICAgICAgICAgICAgfEZvcmdlIDw8Y2F0ZWdvcnlfZm9yZ2Vfc2VydmVyLHNlcnZlcj4+ICYgPDxjYXRlZ29yeV9mb3JnZV9jb21taXR0ZXIsY29tbWl0dGVyPj4gJiA8PGNhdGVnb3J5X2ZvcmdlX2F1dGhvcixhdXRob3I+PiBpZGVudGl0eQpAQCAtMTAyMSwxNSArMTE0NiwxNiBAQAogSW4gR2Vycml0IDIuMi54LCB0aGUgd2F5IHRvIHNldCBwZXJtaXNzaW9ucyBmb3IgdXBsb2FkIGhhcyBjaGFuZ2VkIGVudGlyZWx5LgogVG8gdXBsb2FkIGEgY2hhbmdlIGZvciByZXZpZXcgaXMgbm8gbG9uZ2VyIGEgc2VwYXJhdGUgcGVybWlzc2lvbiB0eXBlLAogaW5zdGVhZCB5b3UgZ3JhbnQgb3JkaW5hcnkgcHVzaCBwZXJtaXNzaW9ucyB0byB0aGUgYWN0dWFsCi1yZWNpZXZpbmcgcmVmZXJlbmNlLiBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQgeW91IHNldCBwdXNoIHBlcm1pc3Npb25zCityZWNlaXZpbmcgcmVmZXJlbmNlLiBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQgeW91IHNldCBwdXNoIHBlcm1pc3Npb25zCiBvbiBgcmVmcy9mb3IvcmVmcy9oZWFkcy88YnJhbmNoPmAgcmF0aGVyIHRoYW4gcGVybWlzc2lvbnMgdG8gdXBsb2FkIGNoYW5nZXMKIG9uIGByZWZzL2hlYWRzLzxicmFuY2g+YC4KIAogCi1TeXN0ZW0gY2FwYWJpbGl0aWVzCitbW2dsb2JhbF9jYXBhYmlsaXRpZXNdXQorR2xvYmFsIENhcGFiaWxpdGllcwogLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1UaGUgc3lzdGVtIGNhcGFiaWxpdGllcyBjb250cm9sIGFjdGlvbnMgdGhhdCB0aGUgYWRtaW5pc3RyYXRvcnMgb2YKK1RoZSBnbG9iYWwgY2FwYWJpbGl0aWVzIGNvbnRyb2wgYWN0aW9ucyB0aGF0IHRoZSBhZG1pbmlzdHJhdG9ycyBvZgogdGhlIHNlcnZlciBjYW4gcGVyZm9ybSB3aGljaCB1c3VhbGx5IGFmZmVjdCB0aGUgZW50aXJlCiBzZXJ2ZXIgaW4gc29tZSB3YXkuICBUaGUgYWRtaW5pc3RyYXRvcnMgbWF5IGRlbGVnYXRlIHRoZXNlCiBjYXBhYmlsaXRpZXMgdG8gdHJ1c3RlZCBncm91cHMgb2YgdXNlcnMuCkBAIC0xMDQwLDYgKzExNjYsOSBAQAoga2VlcCBmZXdlciB1c2VycyBpbiB0aGUgYWRtaW5pc3RyYXRvcnMgZ3JvdXAsIGV2ZW4gd2hpbGUgc3ByZWFkaW5nCiBtdWNoIG9mIHRoZSBzZXJ2ZXIgYWRtaW5pc3RyYXRpb24gYnVyZGVuIG91dCB0byBtb3JlIHVzZXJzLgogCitHbG9iYWwgY2FwYWJpbGl0aWVzIGFyZSBhc3NpZ25lZCB0byBncm91cHMgaW4gdGhlIGFjY2VzcyByaWdodHMgc2V0dGluZ3MKK29mIHRoZSByb290IHByb2plY3QgKCJgQWxsLVByb2plY3RzYCIpLgorCiBCZWxvdyB5b3UgZmluZCBhIGxpc3Qgb2YgY2FwYWJpbGl0aWVzIGF2YWlsYWJsZToKIAogCkBAIC0xMDgxLDYgKzEyMTAsNyBAQAogZWl0aGVyIGxpbms6Y21kLWNyZWF0ZS1wcm9qZWN0Lmh0bWxbY3JlYXRlIG5ldyBnaXQgcHJvamVjdHMgdmlhIHNzaF0KIG9yIHZpYSB0aGUgd2ViIFVJLgogCisKIFtbY2FwYWJpbGl0eV9lbWFpbFJldmlld2Vyc11dCiBFbWFpbCBSZXZpZXdlcnMKIH5+fn5+fn5+fn5+fn5+fgpAQCAtMTA5MSw2ICsxMjIxLDcgQEAKIGVtYWlsZWQuICBUaGUgYWxsb3cgcnVsZXMgYXJlIGV2YWx1YXRlZCBiZWZvcmUgZGVueSBydWxlcywgaG93ZXZlciB0aGUgZGVmYXVsdAogaXMgdG8gYWxsb3cgZW1haWxpbmcsIGlmIG5vIGV4cGxpY2l0IHJ1bGUgaXMgbWF0Y2hlZC4KIAorCiBbW2NhcGFiaWxpdHlfZmx1c2hDYWNoZXNdXQogRmx1c2ggQ2FjaGVzCiB+fn5+fn5+fn5+fn4KQEAgLTExMTAsNyArMTI0MSw3IEBACiBBbGxvdyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBsaW5rOmNtZC1raWxsLmh0bWxba2lsbCBjb21tYW5kIG92ZXIgc3NoXS4gIFRoZQoga2lsbCBjb21tYW5kIGVuZHMgdGFza3MgdGhhdCBjdXJyZW50bHkgb2NjdXB5IHRoZSBHZXJyaXQgc2VydmVyLCB1c3VhbGx5CiBhIHJlcGxpY2F0aW9uIHRhc2sgb3IgYSB1c2VyIGluaXRpYXRlZCB0YXNrIHN1Y2ggYXMgYW4gdXBsb2FkLXBhY2sgb3IKLXJlY2lldmUtcGFjay4KK3JlY2VpdmUtcGFjay4KIAogCiBbW2NhcGFiaWxpdHlfcHJpb3JpdHldXQpAQCAtMTE1OCw2ICsxMjg5LDIxIEBACiBjb21tYW5kLCBidXQgYWxzbyB0byB0aGUgd2ViIFVJIHJlc3VsdHMgcGFnaW5hdGlvbiBzaXplLgogCiAKK1tbY2FwYWJpbGl0eV9hY2Nlc3NEYXRhYmFzZV1dCitBY2Nlc3MgRGF0YWJhc2UKK35+fn5+fn5+fn5+fn5+fgorCitBbGxvdyB1c2VycyB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlIHVzaW5nIHRoZSBgZ3NxbGAgY29tbWFuZC4KKworCitbW2NhcGFiaWxpdHlfcnVuR0NdXQorUnVuIEdhcmJhZ2UgQ29sbGVjdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBbGxvdyB1c2VycyB0byBydW4gdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHRoZSByZXBvc2l0b3JpZXMgb2YKK2FsbCBwcm9qZWN0cy4KKworCiBbW2NhcGFiaWxpdHlfc3RhcnRSZXBsaWNhdGlvbl1dCiBTdGFydCBSZXBsaWNhdGlvbgogfn5+fn5+fn5+fn5+fn5+fn4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZiBiL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZgppbmRleCA5MjQyZjA5Li4yZmU2MjEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYKKysrIGIvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mCkBAIC0xNiwzICsxNiwxNCBAQAogICBtYXJnaW4tdG9wOiAxLjJlbTsKICAgbWFyZ2luLWJvdHRvbTogMC41ZW07CiAiPgorCitbbWFjcm9zXQorKD91KV4oP1A8bmFtZT5nZXQpOjooP1A8dGFyZ2V0PlxTKj8pJD0jCisKK1tnZXQtYmxvY2ttYWNyb10KKzxhIGlkPSJ7dGFyZ2V0fSIgb25tb3VzZWRvd249ImphdmFzY3JpcHQ6CisgIHZhciBpID0gIGRvY3VtZW50LlVSTC5sYXN0SW5kZXhPZignL0RvY3VtZW50YXRpb24vJyk7CisgIHZhciB1cmwgPSBkb2N1bWVudC5VUkwuc3Vic3RyaW5nKDAsIGkpICsgJ3t0YXJnZXR9JzsKKyAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3t0YXJnZXR9JykuaHJlZiA9IHVybDsiPgorICAgIEdFVCB7dGFyZ2V0fSBIVFRQLzEuMAorPC9hPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbWQtY3JlYXRlLWFjY291bnQudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtY3JlYXRlLWFjY291bnQudHh0CmluZGV4IDE2YjJlYjUuLjg1YjliNTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY21kLWNyZWF0ZS1hY2NvdW50LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NtZC1jcmVhdGUtYWNjb3VudC50eHQKQEAgLTE4LDkgKzE4LDExIEBACiAKIERFU0NSSVBUSU9OCiAtLS0tLS0tLS0tLQotQ3JlYXRlcyBhIG5ldyBpbnRlcm5hbCBvbmx5IHVzZXIgYWNjb3VudCBmb3IgYmF0Y2gvcm9sZSBhY2Nlc3MsIHN1Y2gKLWFzIGZyb20gYW4gYXV0b21hdGVkIGJ1aWxkIHN5c3RlbSBvciBldmVudCBtb25pdG9yaW5nIG92ZXIKLWxpbms6Y21kLXN0cmVhbS1ldmVudHMuaHRtbFtnZXJyaXQgc3RyZWFtLWV2ZW50c10uCitDcmVhdGVzIGEgbmV3IGludGVybmFsLW9ubHkgdXNlciBhY2NvdW50LgorCitJZiB0aGUgYWNjb3VudCBpcyBjcmVhdGVkIHdpdGhvdXQgYW4gZW1haWwgYWRkcmVzcywgaXQgbWF5IG9ubHkgYmUKK3VzZWQgZm9yIGJhdGNoL3JvbGUgYWNjZXNzLCBzdWNoIGFzIGZyb20gYW4gYXV0b21hdGVkIGJ1aWxkIHN5c3RlbQorb3IgZXZlbnQgbW9uaXRvcmluZyBvdmVyIGxpbms6Y21kLXN0cmVhbS1ldmVudHMuaHRtbFtnZXJyaXQgc3RyZWFtLWV2ZW50c10uCiAKIElmIExEQVAgYXV0aGVudGljYXRpb24gaXMgYmVpbmcgdXNlZCwgdGhlIHVzZXIgYWNjb3VudCBpcyBjcmVhdGVkCiB3aXRob3V0IGNoZWNraW5nIHRoZSBMREFQIGRpcmVjdG9yeS4gIENvbnNlcXVlbnRseSB1c2VycyBjYW4gYmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLWdjLnR4dCBiL0RvY3VtZW50YXRpb24vY21kLWdjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I4OTlhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtZ2MudHh0CkBAIC0wLDAgKzEsNzIgQEAKK2dlcnJpdCBnYworPT09PT09PT09CisKK05BTUUKKy0tLS0KK2dlcnJpdCBnYyAtIFJ1biB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbgorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCBnYycKKyAgWy0tYWxsXQorICA8TkFNRT4gLi4uCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUnVucyB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0cy4KKworQSBHZXJyaXQgc3lzdGVtIGFkbWluaXN0cmF0b3IgY2FuIGRlZmluZSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHRoYXQKK3Nob3VsZCBiZSB1c2VkIGZvciBydW5uaW5nIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gdGhlIHVzZXIgZ2xvYmFsCitHaXQgY29uZmlndXJhdGlvbiBmaWxlIG9mIHRoZSBzeXN0ZW0gdXNlciB0aGF0IHJ1bnMgdGhlIEdlcnJpdAorc2VydmVyLgorCitTaW5jZSB0aGUgdXNlciBnbG9iYWwgR2l0IGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBvdmVybGFpZCB3aXRoIHRoZSBHaXQKK2NvbmZpZ3VyYXRpb24gb24gcmVwb3NpdG9yeSBsZXZlbCBpdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5CityZXBvc2l0b3J5IHNwZWNpZmljIHBhcmFtZXRlcnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gdGhlIEdpdAorcmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIG9mIGV2ZXJ5IHByb2plY3QuCisKK0FDQ0VTUworLS0tLS0tCitDYWxsZXIgbXVzdCBiZSBhIG1lbWJlciBvZiB0aGUgcHJpdmlsZWdlZCAnQWRtaW5pc3RyYXRvcnMnIGdyb3VwLAorb3IgaGF2ZSBiZWVuIGdyYW50ZWQgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9ydW5HQ1tSdW4gR2FyYmFnZSBDb2xsZWN0aW9uXQorZ2xvYmFsIGNhcGFiaWxpdHkuCisKK1NDUklQVElORworLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBzY3JpcHRzLgorCitPUFRJT05TCistLS0tLS0tCis8TkFNRT46OgorCU5hbWUgb2YgdGhlIHByb2plY3RzIGZvciB3aGljaCB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbiBzaG91bGQgYmUgcnVuLgorCistLWFsbDo6CisJSWYgc3BlY2lmaWVkIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIHJ1biBmb3IgYWxsIHByb2plY3RzCisJc2VxdWVudGlhbGx5LgorCitFWEFNUExFUworLS0tLS0tLS0KKworUnVuIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciB0aGUgcHJvamVjdHMgJ215UHJvamVjdCcgYW5kCisneW91clByb2plY3QnOgorPT09PT0KKwkkIHNzaCAtcCAyOTQxOCByZXZpZXcuZXhhbXBsZS5jb20gZ2Vycml0IGdjIG15UHJvamVjdCB5b3VyUHJvamVjdAorCWNvbGxlY3RpbmcgZ2FyYmFnZSBmb3IgIm15UHJvamVjdCI6CisJLi4uCisJZG9uZS4KKworCWNvbGxlY3RpbmcgZ2FyYmFnZSBmb3IgInlvdXJQcm9qZWN0IjoKKwkuLi4KKwlkb25lLgorPT09PT0KKworUnVuIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBhbGwgcHJvamVjdHM6Cis9PT09PQorCSQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgZ2MgLS1hbGwKKz09PT09CisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1nc3FsLnR4dCBiL0RvY3VtZW50YXRpb24vY21kLWdzcWwudHh0CmluZGV4IDNjNGYxYjUuLmI1MzY3MGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY21kLWdzcWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLWdzcWwudHh0CkBAIC00OSw3ICs0OSw3IEBACiAKIAlUeXBlICdcaCcgZm9yIGhlbHAuICBUeXBlICdccicgdG8gY2xlYXIgdGhlIGJ1ZmZlci4KIAotCWdlcnJpdD4gdXBkYXRlIGFjY291bnRzIHNldCBzc2hfdXNlcl9uYW1lID0gJ2FsaWNlJyB3aGVyZSBhY2NvdW50X2lkPTE7ICAgICAgIAorCWdlcnJpdD4gdXBkYXRlIGFjY291bnRzIHNldCBzc2hfdXNlcl9uYW1lID0gJ2FsaWNlJyB3aGVyZSBhY2NvdW50X2lkPTE7CiAJVVBEQVRFIDE7IDEgbXMKIAlnZXJyaXQ+IFxxCiAJQnllCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1pbmRleC50eHQgYi9Eb2N1bWVudGF0aW9uL2NtZC1pbmRleC50eHQKaW5kZXggY2NkOWZmYy4uNzgwMjMxYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jbWQtaW5kZXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLWluZGV4LnR4dApAQCAtODEsNiArODEsOSBAQAogbGluazpjbWQtc3RyZWFtLWV2ZW50cy5odG1sW2dlcnJpdCBzdHJlYW0tZXZlbnRzXTo6CiAJTW9uaXRvciBldmVudHMgb2NjdXJyaW5nIGluIHJlYWwgdGltZS4KIAorbGluazpjbWQtdmVyc2lvbi5odG1sW2dlcnJpdCB2ZXJzaW9uXTo6CisJU2hvdyB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyB2ZXJzaW9uIG9mIEdlcnJpdC4KKwogZ2l0IHVwbG9hZC1wYWNrOjoKIAlTdGFuZGFyZCBHaXQgc2VydmVyIHNpZGUgY29tbWFuZCBmb3IgY2xpZW50IHNpZGUgYGdpdCBmZXRjaGAuCiAKQEAgLTExMSwxMiArMTE0LDE4IEBACiBsaW5rOmNtZC1mbHVzaC1jYWNoZXMuaHRtbFtnZXJyaXQgZmx1c2gtY2FjaGVzXTo6CiAJRmx1c2ggc29tZS9hbGwgc2VydmVyIGNhY2hlcyBmcm9tIG1lbW9yeS4KIAorbGluazpjbWQtZ2MuaHRtbFtnZXJyaXQgZ2NdOjoKKwlSdW4gdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24uCisKIGxpbms6Y21kLWdzcWwuaHRtbFtnZXJyaXQgZ3NxbF06OgogCUFkbWluaXN0cmF0aXZlIGludGVyZmFjZSB0byBhY3RpdmUgZGF0YWJhc2UuCiAKIGxpbms6Y21kLXNldC1wcm9qZWN0LXBhcmVudC5odG1sW2dlcnJpdCBzZXQtcHJvamVjdC1wYXJlbnRdOjoKIAlDaGFuZ2UgdGhlIHByb2plY3QgcGVybWlzc2lvbnMgYXJlIGluaGVyaXRlZCBmcm9tLgogCitsaW5rOmNtZC1scy11c2VyLXJlZnMuaHRtbFtnZXJyaXQgbHMtdXNlci1yZWZzXTo6CisJTGlzdHMgcmVmcyB2aXNpYmxlIGZvciBhIHNwZWNpZmllZCB1c2VyLgorCiBsaW5rOmNtZC1zaG93LWNhY2hlcy5odG1sW2dlcnJpdCBzaG93LWNhY2hlc106OgogCURpc3BsYXkgY3VycmVudCBjYWNoZSBzdGF0aXN0aWNzLgogCkBAIC0xNDcsOSArMTU2LDEyIEBACiBsaW5rOmNtZC1wbHVnaW4tcmVtb3ZlLmh0bWxbZ2Vycml0IHBsdWdpbiBybV06OgogICAgIEFsaWFzIGZvciAnZ2Vycml0IHBsdWdpbiByZW1vdmUnLgogCi1saW5rOmNtZC10ZXN0LXN1Ym1pdC1ydWxlLmh0bWxbZ2Vycml0IHRlc3Qtc3VibWl0LXJ1bGVdOjoKK2xpbms6Y21kLXRlc3Qtc3VibWl0LXJ1bGUuaHRtbFtnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZV06OgogCVRlc3QgcHJvbG9nIHN1Ym1pdCBydWxlcy4KIAorbGluazpjbWQtdGVzdC1zdWJtaXQtdHlwZS5odG1sW2dlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlXTo6CisJVGVzdCBwcm9sb2cgc3VibWl0IHR5cGUuCisKIGxpbms6Y21kLWtpbGwuaHRtbFtraWxsXTo6CiAJS2lsbHMgYSBzY2hlZHVsZWQgb3IgcnVubmluZyB0YXNrLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1scy1ncm91cHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtbHMtZ3JvdXBzLnR4dAppbmRleCAzMDZiYjkyLi4xN2ViYmExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1scy1ncm91cHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLWxzLWdyb3Vwcy50eHQKQEAgLTExLDggKzExLDEwIEBACiAnc3NoJyAtcCA8cG9ydD4gPGhvc3Q+ICdnZXJyaXQgbHMtZ3JvdXBzJwogICBbLS1wcm9qZWN0IDxOQU1FPiB8IC1wIDxOQU1FPl0KICAgWy0tdXNlciA8TkFNRT4gfCAtdSA8TkFNRT5dCisgIFstLW93bmVkXQogICBbLS12aXNpYmxlLXRvLWFsbF0KICAgWy0tdHlwZSB7aW50ZXJuYWwgfCBzeXN0ZW19XQorICBbLXEgPEdST1VQPl0KICAgWy0tdmVyYm9zZSB8IC12XQogCiBERVNDUklQVElPTgpAQCAtNjEsNiArNjMsMTEgQEAKICsKIFRoaXMgb3B0aW9uIGNhbid0IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgJy0tcHJvamVjdCcgb3B0aW9uLgogCistLW93bmVkOjoKKwlMaXN0cyBvbmx5IHRoZSBncm91cHMgdGhhdCBhcmUgb3duZWQgYnkgdGhlIHVzZXIgdGhhdCB3YXMgc3BlY2lmaWVkCisJYnkgdGhlIGAtLXVzZXJgIG9wdGlvbiBvciBpZiBubyB1c2VyIHdhcyBzcGVjaWZpZWQgdGhlIGdyb3VwcyB0aGF0CisJYXJlIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHVzZXIuCisKIC0tdmlzaWJsZS10by1hbGw6OgogCURpc3BsYXlzIG9ubHkgZ3JvdXBzIHRoYXQgYXJlIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMKIAkoZ3JvdXBzIHRoYXQgYXJlIGV4cGxpY2l0bHkgbWFya2VkIGFzIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQKQEAgLTc1LDEyICs4MiwxOSBAQAogYHN5c3RlbWA6OiBBbnkgc3lzdGVtIGRlZmluZWQgYW5kIG1hbmFnZWQgZ3JvdXAuCiAtLQogCistcTo6CisJR3JvdXAgdGhhdCBzaG91bGQgYmUgaW5zcGVjdGVkLiBUaGUgYC1xYCBvcHRpb24gY2FuIGJlIHNwZWNpZmllZAorCW11bHRpcGxlIHRpbWVzIHRvIGRlZmluZSBzZXZlcmFsIGdyb3VwcyB0byBiZSBpbnNwZWN0ZWQuIElmCisJc3BlY2lmaWVkIHRoZSBsaXN0ZWQgZ3JvdXBzIHdpbGwgb25seSBjb250YWluIGdyb3VwcyB0aGF0IHdlcmUKKwlzcGVjaWZpZWQgdG8gYmUgaW5zcGVjdGVkLiBUaGlzIGlzIGUuZy4gdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGgKKwl0aGUgYC0tb3duZWRgIGFuZCBgLS11c2VyYCBvcHRpb25zIHRvIGNoZWNrIHdoZXRoZXIgYSBncm91cCBpcworCW93bmVkIGJ5IGEgdXNlci4KKwogLS12ZXJib3NlOjoKIC12OjoKIAlFbmFibGUgdmVyYm9zZSBvdXRwdXQgd2l0aCB0YWItc2VwYXJhdGVkIGNvbHVtbnMgZm9yIHRoZQotCWdyb3VwIG5hbWUsIFVVSUQsIGRlc2NyaXB0aW9uLCB0eXBlIChgU1lTVEVNYCBvciBgSU5URVJOQUxgKSwKLQlvd25lciBncm91cCBuYW1lLCBvd25lciBncm91cCBVVUlEIGFuZCB3aGV0aGVyIHRoZSBncm91cCBpcwotCXZpc2libGUgdG8gYWxsIChgdHJ1ZWAgb3IgYGZhbHNlYCkuCisJZ3JvdXAgbmFtZSwgVVVJRCwgZGVzY3JpcHRpb24sIG93bmVyIGdyb3VwIG5hbWUsIG93bmVyIGdyb3VwIFVVSUQKKwlhbmQgd2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwgKGB0cnVlYCBvciBgZmFsc2VgKS4KICsKIElmIGEgZ3JvdXAgaGFzIGJlZW4gIm9ycGhhbmVkIiwgaS5lLiBpdHMgb3duZXIgZ3JvdXAgVVVJRCByZWZlcnMgdG8gYQogbm9uZXhpc3RlbnQgZ3JvdXAsIHRoZSBvd25lciBncm91cCBuYW1lIGZpZWxkIHdpbGwgcmVhZCBgbi9hYC4KQEAgLTEwNyw2ICsxMjEsMjEgQEAKIAlSZWdpc3RlcmVkIFVzZXJzCiA9PT09PQogCitMaXN0IGFsbCBncm91cHMgd2hpY2ggYXJlIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHVzZXI6Cis9PT09PQorCSQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgbHMtZ3JvdXBzIC0tb3duZWQKKwlNeVByb2plY3RfQ29tbWl0dGVycworCU15UHJvamVjdF9WZXJpZmllcnMKKz09PT09CisKK0NoZWNrIGlmIHRoZSBjYWxsaW5nIHVzZXIgb3ducyB0aGUgZ3JvdXAgYE15UHJvamVjdF9Db21taXR0ZXJzYC4gSWYKK2BNeVByb2plY3RfQ29tbWl0dGVyc2AgaXMgcmV0dXJuZWQgdGhlIGNhbGxpbmcgdXNlciBvd25zIHRoaXMgZ3JvdXAuCitJZiB0aGUgcmVzdWx0IGlzIGVtcHR5LCB0aGUgY2FsbGluZyB1c2VyIGRvZXNuJ3Qgb3duIHRoZSBncm91cC4KKz09PT09CisJJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCBscy1ncm91cHMgLS1vd25lZCAtcSBNeVByb2plY3RfQ29tbWl0dGVycworCU15UHJvamVjdF9Db21taXR0ZXJzCis9PT09PQorCiBFeHRyYWN0IHRoZSBVVUlEIG9mIHRoZSAnQWRtaW5pc3RyYXRvcnMnIGdyb3VwOgogCiA9PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbWQtbHMtcHJvamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtbHMtcHJvamVjdHMudHh0CmluZGV4IGQ3ZDVhYTUuLjI2NTMwYmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY21kLWxzLXByb2plY3RzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NtZC1scy1wcm9qZWN0cy50eHQKQEAgLTE2LDYgKzE2LDcgQEAKICAgWy0tZm9ybWF0IHt0ZXh0IHwganNvbiB8IGpzb25fY29tcGFjdH1dCiAgIFstLWFsbF0KICAgWy0tbGltaXQgPE4+XQorICBbLS1oYXMtYWNsLWZvciBHUk9VUF0KIAogREVTQ1JJUFRJT04KIC0tLS0tLS0tLS0tCkBAIC05MSw2ICs5MiwxMyBAQAogLS1saW1pdDo6CiAJQ2FwIHRoZSBudW1iZXIgb2YgcmVzdWx0cyB0byB0aGUgZmlyc3QgTiBtYXRjaGVzLgogCistLWhhcy1hY2wtZm9yOjoKKwlEaXNwbGF5IG9ubHkgcHJvamVjdHMgb24gd2hpY2ggYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBncm91cCBhcmUKKwlkaXJlY3RseSBhc3NpZ25lZC4gUHJvamVjdHMgd2hpY2ggb25seSBpbmhlcml0IGFjY2VzcyByaWdodHMgZm9yCisJdGhpcyBncm91cCBhcmUgbm90IGxpc3RlZC4KKysKK1dpdGggdGhpcyBvcHRpb24geW91IGNhbiBmaW5kIG91dCBvbiB3aGljaCBwcm9qZWN0cyBhIGdyb3VwIGlzIHVzZWQuCisKIEhUVFAKIC0tLS0KIFRoaXMgY29tbWFuZCBpcyBhbHNvIGF2YWlsYWJsZSBvdmVyIEhUVFAsIGFzIGAvcHJvamVjdHMvYCBmb3IKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLWxzLXVzZXItcmVmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2NtZC1scy11c2VyLXJlZnMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTk5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2NtZC1scy11c2VyLXJlZnMudHh0CkBAIC0wLDAgKzEsNTUgQEAKK2dlcnJpdCBscy11c2VyLXJlZnMKKz09PT09PT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorZ2Vycml0IGxzLXVzZXItcmVmcyAtIExpc3QgcmVmcyB2aXNpYmxlIHRvIGEgc3BlY2lmaWMgdXNlcgorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCBscy11c2VyLXJlZnMnCisgIFstLXByb2plY3QgUFJPSkVDVD4gfCAtcCA8UFJPSkVDVD5dCisgIFstLXVzZXIgPFVTRVI+IHwgLXUgPFVTRVI+XQorICBbLS1vbmx5LXJlZnMtaGVhZHNdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgYWxsIHJlZnMgdGhhdCB0aGUgc3BlY2lmaWVkIHVzZXIgY2FuIHNlZS4KKworQWxsb3dzIGFuIGFkbWluaXN0cmF0b3IgdG8gcXVlcnkgd2hpY2ggcmVmcyBhcmUgdmlzaWJsZSBmb3IKK2EgdXNlci4gVGhlIGNvbW1hbmQgaXMgaGVscGZ1bCBmb3IgYWRtaW5zIHdoZW4gZGVidWdnaW5nIHdoeSBhCit1c2VyIGNhbm5vdCBhY2Nlc3MgY2VydGFpbiByZWZzIGFuZCBhbHNvIHRvIGhlbHAgYWRtaW5zCit2ZXJpZnkgdGhhdCBjZXJ0YWluIHNlY3JldCByZWZzIGFyZSBub3QgZXhwb3NlZCB0byB0aGUgd3JvbmcKK2dyb3Vwcy4KKworQUNDRVNTCistLS0tLS0KK0FkbWluaXN0cmF0b3JzCisKK09QVElPTlMKKy0tLS0tLS0KKy0tcHJvamVjdDo6CistcDo6CisJUmVxdWlyZWQ7IE5hbWUgb2YgdGhlIHByb2plY3QgZm9yIHdoaWNoIHRoZSByZWZzIHNob3VsZCBiZSBsaXN0ZWQuCisKKy0tdXNlcjo6CistdTo6CisJUmVxdWlyZWQ7IFVzZXIgZm9yIHdoaWNoIHRoZSB2aXNpYmxlIHJlZnMgc2hvdWxkIGJlIGxpc3RlZC4gR2Vycml0CisJd2lsbCBxdWVyeSB0aGUgZGF0YWJhc2UgdG8gZmluZCBtYXRjaGluZyB1c2Vycywgc28gdGhlCisJZnVsbCBpZGVudGl0eS9uYW1lIGRvZXMgbm90IG5lZWQgdG8gYmUgc3BlY2lmaWVkLgorCistLW9ubHktcmVmcy1oZWFkczo6CisJT25seSBsaXN0IHRoZSByZWZzIGZvdW5kIHVuZGVyIHJlZnMvaGVhZHMvKgorCitFWEFNUExFUworLS0tLS0tLS0KKworTGlzdCB2aXNpYmxlIHJlZnMgZm9yIHRoZSB1c2VyICJtci5kZXZlbG9wZXIiIGluIHByb2plY3QgImdlcnJpdCIKKz09PT09CisJJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCBscy11c2VyLXJlZnMgLXAgZ2Vycml0IC11IG1yLmRldmVsb3BlcgorPT09PT0KKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXF1ZXJ5LnR4dCBiL0RvY3VtZW50YXRpb24vY21kLXF1ZXJ5LnR4dAppbmRleCAyZmVlYTExLi42NmJkODQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1xdWVyeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtcXVlcnkudHh0CkBAIC0yOCw3ICsyOCw5IEBACiBRdWVyaWVzIHRoZSBjaGFuZ2UgZGF0YWJhc2UgYW5kIHJldHVybnMgcmVzdWx0cyBkZXNjcmliaW5nIGNoYW5nZXMKIHRoYXQgbWF0Y2ggdGhlIGlucHV0IHF1ZXJ5LiAgTW9yZSByZWNlbnRseSB1cGRhdGVkIGNoYW5nZXMgYXBwZWFyCiBiZWZvcmUgb2xkZXIgY2hhbmdlcywgd2hpY2ggaXMgdGhlIHNhbWUgb3JkZXIgcHJlc2VudGVkIGluIHRoZQotd2ViIGludGVyZmFjZS4KK3dlYiBpbnRlcmZhY2UuICBGb3IgZWFjaCBtYXRjaGluZyBjaGFuZ2UsIHRoZSByZXN1bHQgY29udGFpbnMgZGF0YQorZm9yIHRoZSBjaGFuZ2UncyBsYXRlc3QgcGF0Y2ggc2V0LCBldmVuIGlmIHRoZSBxdWVyeSBtYXRjaGVkIG9uIGFuCitvbGRlciBwYXRjaCBzZXQgKGZvciBleGFtcGxlIGFuIG9sZGVyIHBhdGNoIHNldCdzIHNoYTEgcmV2aXNpb24pLgogCiBBIHF1ZXJ5IG1heSBiZSBsaW1pdGVkIG9uIHRoZSBudW1iZXIgb2YgcmVzdWx0cyBpdCByZXR1cm5zIHdpdGggdGhlCiAnbGltaXQ6JyBvcGVyYXRvci4gIElmIG5vIGxpbWl0IGlzIHN1cHBsaWVkIGFuIGludGVybmFsIGRlZmF1bHQKQEAgLTM3LDE2ICszOSwyMSBAQAogdG8gcmVzdW1lIHRoZSBxdWVyeSBhdCB0aGUgY2hhbmdlIHRoYXQgZm9sbG93cyB0aGUgbGFzdCBjaGFuZ2Ugb2YKIHRoZSBwcmlvciByZXN1bHQgc2V0LgogCi1Ob24tb3B0aW9uIGFyZ3VtZW50cyB0byB0aGlzIGNvbW1hbmQgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcyBhbmQgdGhlbgotcGFyc2VkIGFzIGEgcXVlcnkuICBUaGlzIHNpbXBsaWZpZXMgY2FsbGluZyBjb252ZW50aW9ucyBvdmVyIFNTSAotYnkgcGVybWl0dGluZyBvcGVyYXRvcnMgdG8gYXBwZWFyIGluIGRpZmZlcmVudCBhcmd1bWVudHMgd2l0aG91dAotbXVsdGlwbGUgbGV2ZWxzIG9mIHF1b3RpbmcgcmVxdWlyZWQuCitOb24tb3B0aW9uIGFyZ3VtZW50cyB0byB0aGlzIGNvbW1hbmQgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcyBhbmQKK3RoZW4gcGFyc2VkIGFzIGEgcXVlcnkuIFRoaXMgc2ltcGxpZmllcyBjYWxsaW5nIGNvbnZlbnRpb25zIG92ZXIKK1NTSCBieSBwZXJtaXR0aW5nIG9wZXJhdG9ycyB0byBhcHBlYXIgaW4gZGlmZmVyZW50IGFyZ3VtZW50cy4KKworUXVlcnkgb3BlcmF0b3JzIG1heSBxdW90ZSB2YWx1ZXMgdXNpbmcgbWF0Y2hlZCBjdXJseSBicmFjZXMKKyhlLmcuIGByZXZpZXdlcmluOntEZXZlbG9wZXIgR3JvdXB9YCkgdG8gc2lkZXN0ZXAgaXNzdWVzIHdpdGggMgorbGV2ZWxzIG9mIHNoZWxsIHF1b3RpbmcgKGNhbGxlciBzaGVsbCBpbnZva2luZyBTU0gsIGFuZCB0aGUgU1NICitjb21tYW5kIGxpbmUgcGFyc2VyIGluIHRoZSBzZXJ2ZXIpLgogCiBPUFRJT05TCiAtLS0tLS0tCiAtLWZvcm1hdDo6Ci0JRm9ybWF0dGluZyBtZXRob2QgZm9yIHRoZSByZXN1bHRzLiBURVhUIGlzIHRoZSBkZWZhdWx0LAotCXByZXNlbnRpbmcgYSBodW1hbiByZWFkYWJsZSBkaXNwbGF5LiBKU09OIGNyZWF0ZXMgb25lIGxpbmUKKwlGb3JtYXR0aW5nIG1ldGhvZCBmb3IgdGhlIHJlc3VsdHMuIGBURVhUYCBpcyB0aGUgZGVmYXVsdCwKKwlwcmVzZW50aW5nIGEgaHVtYW4gcmVhZGFibGUgZGlzcGxheS4gYEpTT05gIHJldHVybnMKKwlsaW5rOmpzb24uaHRtbCNjaGFuZ2VbY2hhbmdlIGF0dHJpYnV0ZXNdLCBvbmUgbGluZQogCXBlciBtYXRjaGluZyByZWNvcmQsIHdpdGggZW1iZWRkZWQgTEZzIGVzY2FwZWQuCiAKIC0tY3VycmVudC1wYXRjaC1zZXQ6OgpAQCAtNjUsMTMgKzcyLDE0IEBACiAKIC0tZmlsZXM6OgogCVN1cHBvcnQgZm9yIGxpc3RpbmcgZmlsZXMgd2l0aCBwYXRjaCBzZXRzIGFuZCB0aGVpcgotCWF0dHJpYnV0ZXMgKEFEREVELCBNT0RJRklFRCwgREVMRVRFRCwgUkVOQU1FRCwgQ09QSUVEKS4KKwlhdHRyaWJ1dGVzIChBRERFRCwgTU9ESUZJRUQsIERFTEVURUQsIFJFTkFNRUQsIENPUElFRCkKKwlhbmQgc2l6ZSBpbmZvcm1hdGlvbiAobnVtYmVyIG9mIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucykuCiAJTm90ZSB0aGF0IHRoaXMgb3B0aW9uIHJlcXVpcmVzIGVpdGhlciB0aGUgLS1jdXJyZW50LXBhdGNoLXNldAogCW9yIHRoZSAtLXBhdGNoLXNldHMgb3B0aW9uIGluIG9yZGVyIHRvIGdpdmUgYW55IGZpbGUgaW5mb3JtYXRpb24uCiAKIC0tY29tbWVudHM6OgogCUluY2x1ZGUgY29tbWVudHMgZm9yIGFsbCBjaGFuZ2VzLiBJZiBjb21iaW5lZCB3aXRoIHRoZQotCS0tcGF0Y2gtc2V0cyBmbGFnIHRoZW4gYWxsIGluLWxpbmUgY29tbWVudHMgYXJlIGluY2x1ZGVkIGZvcgorCS0tcGF0Y2gtc2V0cyBmbGFnIHRoZW4gYWxsIGlubGluZS9maWxlIGNvbW1lbnRzIGFyZSBpbmNsdWRlZCBmb3IKIAllYWNoIHBhdGNoIHNldC4KIAogLS1jb21taXQtbWVzc2FnZTo6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1yZWNlaXZlLXBhY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtcmVjZWl2ZS1wYWNrLnR4dAppbmRleCA2OGY2ODZkLi45MmJiNjVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1yZWNlaXZlLXBhY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLXJlY2VpdmUtcGFjay50eHQKQEAgLTMyLDI4ICszMiwxMiBAQAogCiAtLXJldmlld2VyIDxhZGRyZXNzPjo6CiAtLXJlIDxhZGRyZXNzPjo6Ci0JQXV0b21hdGljYWxseSBhZGQgPGFkZHJlc3M+IGFzIGEgcmV2aWV3ZXIgdG8gYW55IGNoYW5nZQotCWNyZWF0ZWQgb3IgdXBkYXRlZCBieSB0aGUgcHVzaGVkIGNvbW1pdCBvYmplY3RzLiAgVGhlc2UKLQljaGFuZ2VzIHdpbGwgYXBwZWFyIGluIHRoZSByZXZpZXdlcidzIGRhc2hib2FyZCwgYW5kIHdpbGwKLQlhbHNvIGJlIGVtYWlsZWQgdG8gdGhlIHJldmlld2VyLgotKwotTWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSB0byByZXF1ZXN0IG11bHRpcGxlIHJldmlld2Vycy4KLSsKLVRoaXMgaXMgYSBHZXJyaXQgQ29kZSBSZXZpZXcgc3BlY2lmaWMgZXh0ZW5zaW9uLgorCUF1dG9tYXRpY2FsbHkgYWRkIDxhZGRyZXNzPiBhcyBhIHJldmlld2VyIHRvIGFueSBjaGFuZ2UuCisJRGVwcmVjYXRlZCwgdXNlIGByZWZzL2Zvci9icmFuY2glcj1hZGRyZXNzYCBpbnN0ZWFkLgogCiAtLWNjIDxhZGRyZXNzPjo6Ci0JQ2FyYm9uLWNvcHkgPGFkZHJlc3M+IG9uIHRoZSBjcmVhdGVkIG9yIHVwZGF0ZWQgY2hhbmdlcywKLQlidXQgZG9uJ3QgcmVxdWVzdCB0aGVtIHRvIHBlcmZvcm0gYSByZXZpZXcuICBMaWtlIHdpdGgKLQktLXJldmlld2VyIHRoZSBjaGFuZ2VzIHdpbGwgYXBwZWFyIGluIHRoZSBDQydkIHVzZXIncwotCWRhc2hib2FyZCwgYW5kIHdpbGwgYmUgZW1haWxlZCB0byB0aGVtLgotKwotTWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSB0byBzcGVjaWZ5IG11bHRpcGxlIENDcy4KLSsKLVRoaXMgaXMgYSBHZXJyaXQgQ29kZSBSZXZpZXcgc3BlY2lmaWMgZXh0ZW5zaW9uLgotCi1BYm92ZSA8YWRkcmVzcz4gbWF5IGJlIHRoZSBjb21wbGV0ZSBlbWFpbCBhZGRyZXNzLCBvciwgaWYgR2Vycml0IGlzCi1jb25maWd1cmVkIHdpdGggSFRUUCBhdXRoZW50aWNhdGlvbiAoZS5nLiB3aXRoaW4gYSBzaW5nbGUgZG9tYWluKSwKLWp1c3QgdGhlIGxvY2FsIHBhcnQgKHR5cGljYWxseSB1c2VybmFtZSkuCisJQ2FyYm9uLWNvcHkgPGFkZHJlc3M+IG9uIHRoZSBjcmVhdGVkIG9yIHVwZGF0ZWQgY2hhbmdlcy4KKwlEZXByZWNhdGVkLCB1c2UgYHJlZnMvZm9yL2JyYW5jaCVjYz1hZGRyZXNzYCBpbnN0ZWFkLgogCiBBQ0NFU1MKIC0tLS0tLQpAQCAtNjQsMzIgKzQ4LDMwIEBACiAKIFNlbmQgYSByZXZpZXcgZm9yIGEgY2hhbmdlIG9uIHRoZSBtYXN0ZXIgYnJhbmNoIHRvIGNoYXJsaWVAZXhhbXBsZS5jb206CiA9PT09PQotCWdpdCBwdXNoIC0tcmVjZWl2ZS1wYWNrPSdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbScgc3NoOi8vcmV2aWV3LmV4YW1wbGUuY29tOjI5NDE4L3Byb2plY3QgSEVBRDpyZWZzL2Zvci9tYXN0ZXIKKwlnaXQgcHVzaCBzc2g6Ly9yZXZpZXcuZXhhbXBsZS5jb206Mjk0MTgvcHJvamVjdCBIRUFEOnJlZnMvZm9yL21hc3RlciVyPWNoYXJsaWVAZXhhbXBsZS5jb20KID09PT09CiAKIFNlbmQgcmV2aWV3cywgYnV0IHRhZ2dpbmcgdGhlbSB3aXRoIHRoZSB0b3BpYyBuYW1lICdidWc0Mic6CiA9PT09PQotCWdpdCBwdXNoIC0tcmVjZWl2ZS1wYWNrPSdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbScgc3NoOi8vcmV2aWV3LmV4YW1wbGUuY29tOjI5NDE4L3Byb2plY3QgSEVBRDpyZWZzL2Zvci9tYXN0ZXIvYnVnNDIKKwlnaXQgcHVzaCBzc2g6Ly9yZXZpZXcuZXhhbXBsZS5jb206Mjk0MTgvcHJvamVjdCBIRUFEOnJlZnMvZm9yL21hc3RlciVyPWNoYXJsaWVAZXhhbXBsZS5jb20sdG9waWM9YnVnNDIKID09PT09CiAKIEFsc28gQ0MgdHdvIG90aGVyIHBhcnRpZXM6CiA9PT09PQotCWdpdCBwdXNoIC0tcmVjZWl2ZS1wYWNrPSdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbSAtLWNjIGFsaWNlQGV4YW1wbGUuY29tIC0tY2MgYm9iQGV4YW1wbGUuY29tJyBzc2g6Ly9yZXZpZXcuZXhhbXBsZS5jb206Mjk0MTgvcHJvamVjdCBIRUFEOnJlZnMvZm9yL21hc3RlcgorCWdpdCBwdXNoIHNzaDovL3Jldmlldy5leGFtcGxlLmNvbToyOTQxOC9wcm9qZWN0IEhFQUQ6cmVmcy9mb3IvbWFzdGVyJXI9Y2hhcmxpZUBleGFtcGxlLmNvbSxjYz1hbGljZUBleGFtcGxlLmNvbSxjYz1ib2JAZXhhbXBsZS5jb20KID09PT09CiAKIENvbmZpZ3VyZSBhIHB1c2ggbWFjcm8gdG8gcGVyZm9ybSB0aGUgbGFzdCBhY3Rpb246CiA9PT09CiAJZ2l0IGNvbmZpZyByZW1vdGUuY2hhcmxpZS51cmwgc3NoOi8vcmV2aWV3LmV4YW1wbGUuY29tOjI5NDE4L3Byb2plY3QKLQlnaXQgY29uZmlnIHJlbW90ZS5jaGFybGllLnB1c2ggSEVBRDpyZWZzL2Zvci9tYXN0ZXIKLQlnaXQgY29uZmlnIHJlbW90ZS5jaGFybGllLnJlY2VpdmVwYWNrICdnaXQgcmVjZWl2ZS1wYWNrIC0tcmV2aWV3ZXIgY2hhcmxpZUBleGFtcGxlLmNvbSAtLWNjIGFsaWNlQGV4YW1wbGUuY29tIC0tY2MgYm9iQGV4YW1wbGUuY29tJworCWdpdCBjb25maWcgcmVtb3RlLmNoYXJsaWUucHVzaCBIRUFEOnJlZnMvZm9yL21hc3RlciVyPWNoYXJsaWVAZXhhbXBsZS5jb20sY2M9YWxpY2VAZXhhbXBsZS5jb20sY2M9Ym9iQGV4YW1wbGUuY29tCiA9PT09CiAKIGFmdGVyd2FyZHMgYC5naXQvY29uZmlnYCBjb250YWlucyB0aGUgZm9sbG93aW5nOgogLS0tLQogW3JlbW90ZSAiY2hhcmxpZSJdCiAgIHVybCA9IHNzaDovL3Jldmlldy5leGFtcGxlLmNvbToyOTQxOC9wcm9qZWN0Ci0gIHB1c2ggPSBIRUFEOnJlZnMvZm9yL21hc3RlcgotICByZWNlaXZlcGFjayA9IGdpdCByZWNlaXZlLXBhY2sgLS1yZXZpZXdlciBjaGFybGllQGV4YW1wbGUuY29tIC0tY2MgYWxpY2VAZXhhbXBsZS5jb20gLS1jYyBib2JAZXhhbXBsZS5jb20KKyAgcHVzaCA9IEhFQUQ6cmVmcy9mb3IvbWFzdGVyJXI9Y2hhcmxpZUBleGFtcGxlLmNvbSxjYz1hbGljZUBleGFtcGxlLmNvbSxjYz1ib2JAZXhhbXBsZS5jb20KIC0tLS0KIAogYW5kIG5vdyBzZW5kaW5nIGEgbmV3IGNoYW5nZSBmb3IgcmV2aWV3IHRvIGNoYXJsaWUsIENDJ2luZyBib3RoCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NtZC1yZXZpZXcudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtcmV2aWV3LnR4dAppbmRleCA1MTNiYzZlLi42NWMyMWRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1yZXZpZXcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY21kLXJldmlldy50eHQKQEAgLTE3LDYgKzE3LDcgQEAKICAgWy0tcHVibGlzaF0KICAgWy0tZGVsZXRlXQogICBbLS12ZXJpZmllZCA8Tj5dIFstLWNvZGUtcmV2aWV3IDxOPl0KKyAgWy0tbGFiZWwgTGFiZWwtTmFtZT08Tj5dCiAgIHtDT01NSVQgfCBDSEFOR0VJRCxQQVRDSFNFVH0uLi4KIAogREVTQ1JJUFRJT04KQEAgLTk0LDEwICs5NSwxNCBAQAogCiAtLWNvZGUtcmV2aWV3OjoKIC0tdmVyaWZpZWQ6OgotCVNldCB0aGUgYXBwcm92YWwgY2F0ZWdvcnkgdG8gdGhlIHZhbHVlICdOJy4gIFRoZSBleGFjdAotCW9wdGlvbiBuYW1lcyBzdXBwb3J0ZWQgYW5kIHRoZSByYW5nZSBvZiB2YWx1ZXMgcGVybWl0dGVkCi0JZGlmZmVycyBwZXIgc2l0ZSwgY2hlY2sgdGhlIG91dHB1dCBvZiAtLWhlbHAsIG9yIGNvbnRhY3QKLQl5b3VyIHNpdGUgYWRtaW5pc3RyYXRvciBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgICAgICBTZXQgdGhlIGxhYmVsIHRvIHRoZSB2YWx1ZSAnTicuICBUaGUgZXhhY3Qgb3B0aW9uIG5hbWVzCisgICAgICAgIHN1cHBvcnRlZCBhbmQgdGhlIHJhbmdlIG9mIHZhbHVlcyBwZXJtaXR0ZWQgZGlmZmVycyBwZXIgc2l0ZSwKKyAgICAgICAgY2hlY2sgdGhlIG91dHB1dCBvZiAtLWhlbHAsIG9yIGNvbnRhY3QgeW91ciBzaXRlIGFkbWluaXN0cmF0b3IKKyAgICAgICAgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFRoZXNlIG9wdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciB0aGVzZQorICAgICAgICBidWlsdC1pbiBsYWJlbHM7IGZvciBvdGhlciBsYWJlbHMsIHNlZSAtLWxhYmVsLgorCistLWxhYmVsOjoKKyAgICAgICAgU2V0IGEgbGFiZWwgYnkgbmFtZSB0byB0aGUgdmFsdWUgJ04nLgogCiBBQ0NFU1MKIC0tLS0tLQpAQCAtMTIyLDcgKzEyNyw3IEBACiAJJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCByZXZpZXcgLW0gJyJCdWlsZCBTdWNjZXNzZnVsIicgYzBmZjMzCiA9PT09PQogCi1NYXJrIHRoZSB1bm1lcmdlZCBjb21taXRzIGJvdGggIlZlcmlmaWVkICsxIiBhbmQgIkNvZGUgUmV2aWV3ICsyIiBhbmQKK01hcmsgdGhlIHVubWVyZ2VkIGNvbW1pdHMgYm90aCAiVmVyaWZpZWQgKzEiIGFuZCAiQ29kZS1SZXZpZXcgKzIiIGFuZAogc3VibWl0IHRoZW0gZm9yIG1lcmdpbmc6CiA9PT09CiAgICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgcmV2aWV3IFwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXNldC1wcm9qZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vY21kLXNldC1wcm9qZWN0LnR4dAppbmRleCAwNTlmMDYzLi5hMGFmOTEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NtZC1zZXQtcHJvamVjdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtc2V0LXByb2plY3QudHh0CkBAIC0xMSwxMSArMTEsMTEgQEAKICdzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCBzZXQtcHJvamVjdCcKICAgWy0tZGVzY3JpcHRpb24gPERFU0M+IHwgLWQgPERFU0M+XQogICBbLS1zdWJtaXQtdHlwZSA8VFlQRT4gfCAtdCA8VFlQRT5dCi0gIFstLXVzZXxuby1jb250cmlidXRvci1hZ3JlZW1lbnRzIHwgLS1jYXxuY2FdCi0gIFstLXVzZXxuby1zaWduZWQtb2ZmLWJ5IHwgLS1zb3xuc29dCi0gIFstLXVzZXxuby1jb250ZW50LW1lcmdlXQotICBbLS1yZXF1aXJlfG5vLWNoYW5nZS1pZCB8IC0taWR8bmlkXQotICBbLS1wcm9qZWN0LXN0YXRlIHwgLS1wc10KKyAgWy0tY29udHJpYnV0b3ItYWdyZWVtZW50cyA8dHJ1ZXxmYWxzZXxpbmhlcml0Pl0KKyAgWy0tc2lnbmVkLW9mZi1ieSA8dHJ1ZXxmYWxzZXxpbmhlcml0Pl0KKyAgWy0tY29udGVudC1tZXJnZSA8dHJ1ZXxmYWxzZXxpbmhlcml0Pl0KKyAgWy0tY2hhbmdlLWlkIDx0cnVlfGZhbHNlfGluaGVyaXQ+XQorICBbLS1wcm9qZWN0LXN0YXRlIDxTVEFURT4gfCAtLXBzIDxTVEFURT5dCiAgIDxOQU1FPgogCiBERVNDUklQVElPTgpAQCAtNjMsMjYgKzYzLDIzIEBACiBGb3IgbW9yZSBkZXRhaWxzIHNlZQogbGluazpwcm9qZWN0LXNldHVwLmh0bWwjc3VibWl0X3R5cGVbQ2hhbmdlIFN1Ym1pdCBBY3Rpb25zXS4KIAotLS11c2V8bm8tY29udGVudC1tZXJnZTo6CistLWNvbnRlbnQtbWVyZ2U6OgogICAgIElmIGVuYWJsZWQsIEdlcnJpdCB3aWxsIHRyeSB0byBwZXJmb3JtIGEgMy13YXkgbWVyZ2Ugb2YgdGV4dAogICAgIGZpbGUgY29udGVudCB3aGVuIGEgZmlsZSBoYXMgYmVlbiBtb2RpZmllZCBieSBib3RoIHRoZQogICAgIGRlc3RpbmF0aW9uIGJyYW5jaCBhbmQgdGhlIGNoYW5nZSBiZWluZyBzdWJtaXR0ZWQuICBUaGlzCiAgICAgb3B0aW9uIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHN1Ym1pdCB0eXBlIGlzIG5vdAogICAgIEZBU1RfRk9SV0FSRF9PTkxZLgogCi0tLXVzZXxuby1jb250cmlidXRvci1hZ3JlZW1lbnRzOjoKLS0tY2F8bmNhOjoKKy0tY29udHJpYnV0b3ItYWdyZWVtZW50czo6CiAgICAgSWYgZW5hYmxlZCwgYXV0aG9ycyBtdXN0IGNvbXBsZXRlIGEgY29udHJpYnV0b3IgYWdyZWVtZW50CiAgICAgb24gdGhlIHNpdGUgYmVmb3JlIHB1c2hpbmcgYW55IGNvbW1pdHMgb3IgY2hhbmdlcyB0byB0aGlzCiAgICAgcHJvamVjdC4KIAotLS11c2V8bm8tc2lnbmVkLW9mZi1ieTo6Ci0tLXNvfG5zbzoKKy0tc2lnbmVkLW9mZi1ieTo6CiAgICAgSWYgZW5hYmxlZCwgZWFjaCBjaGFuZ2UgbXVzdCBjb250YWluIGEgU2lnbmVkLW9mZi1ieSBsaW5lCiAgICAgZnJvbSBlaXRoZXIgdGhlIGF1dGhvciBvciB0aGUgdXBsb2FkZXIgaW4gdGhlIGNvbW1pdCBtZXNzYWdlLgogCi0tLXJlcXVpcmV8bm8tY2hhbmdlLWlkOjoKLS0taWR8bmlkOjoKKy0tY2hhbmdlLWlkOjoKICAgICBSZXF1aXJlIGEgdmFsaWQgbGluazp1c2VyLWNoYW5nZWlkLmh0bWxbQ2hhbmdlLUlkXSBmb290ZXIKICAgICBpbiBhbnkgY29tbWl0IHVwbG9hZGVkIGZvciByZXZpZXcuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8KICAgICBjb21taXRzIHB1c2hlZCBkaXJlY3RseSB0byBhIGJyYW5jaCBvciB0YWcuCkBAIC0xMDMsNyArMTAwLDcgQEAKIAogPT09PQogICAgICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgc2V0LXByb2plY3QgZXhhbXBsZSAtLXN1Ym1pdC10eXBlIE1FUkdFX0lGX05FQ0VTU0FSWVwKLSAgICAtLXJlcXVpcmUtY2hhbmdlLWlkIC0tbm8tY29udGVudC1tZXJnZSAtLXByb2plY3Qtc3RhdGUgSElEREVOCisgICAgLS1jaGFuZ2UtaWQgdHJ1ZSAtLWNvbnRlbnQtbWVyZ2UgZmFsc2UgLS1wcm9qZWN0LXN0YXRlIEhJRERFTgogPT09PQogCiBHRVJSSVQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXN0cmVhbS1ldmVudHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtc3RyZWFtLWV2ZW50cy50eHQKaW5kZXggYThjZjNiMC4uY2UyM2RhNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jbWQtc3RyZWFtLWV2ZW50cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtc3RyZWFtLWV2ZW50cy50eHQKQEAgLTQ0LDcgKzQ0LDggQEAKICpwYXRjaFNldCosICphY2NvdW50KiBpbnZvbHZlZCwgYW5kIG90aGVyIGF0dHJpYnV0ZXMgYXMgYXBwcm9wcmlhdGUuCiBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCBtZXNzYWdlIHR5cGVzIGFyZSAqcGF0Y2hzZXQtY3JlYXRlZCosCiAqZHJhZnQtcHVibGlzaGVkKiwgKmNoYW5nZS1hYmFuZG9uZWQqLCAqY2hhbmdlLXJlc3RvcmVkKiwKLSpjaGFuZ2UtbWVyZ2VkKiwgKmNvbW1lbnQtYWRkZWQqIGFuZCAqcmVmLXVwZGF0ZWQqLgorKmNoYW5nZS1tZXJnZWQqLCAqbWVyZ2UtZmFpbGVkKiwgKmNvbW1lbnQtYWRkZWQqLCAqcmVmLXVwZGF0ZWQqIGFuZAorKnJldmlld2VyLWFkZGVkKi4KIAogTm90ZSB0aGF0IGFueSBmaWVsZCBtYXkgYmUgbWlzc2luZyBpbiB0aGUgSlNPTiBtZXNzYWdlcywgc28gY29uc3VtZXJzIG9mCiB0aGlzIEpTT04gc3RyZWFtIHNob3VsZCBkZWFsIHdpdGggdGhhdCBhcHByb3ByaWF0ZWx5LgpAQCAtMTA1LDYgKzEwNiwxOCBAQAogCiBzdWJtaXR0ZXI6OiBsaW5rOmpzb24uaHRtbCNhY2NvdW50W2FjY291bnQgYXR0cmlidXRlXQogCitNZXJnZSBGYWlsZWQKK15eXl5eXl5eXl5eXgordHlwZTo6ICJtZXJnZS1mYWlsZWQiCisKK2NoYW5nZTo6IGxpbms6anNvbi5odG1sI2NoYW5nZVtjaGFuZ2UgYXR0cmlidXRlXQorCitwYXRjaFNldDo6IGxpbms6anNvbi5odG1sI3BhdGNoU2V0W3BhdGNoU2V0IGF0dHJpYnV0ZV0KKworc3VibWl0dGVyOjogbGluazpqc29uLmh0bWwjYWNjb3VudFthY2NvdW50IGF0dHJpYnV0ZV0KKworcmVhc29uOjogUmVhc29uIHRoYXQgdGhlIG1lcmdlIGZhaWxlZC4KKwogQ29tbWVudCBBZGRlZAogXl5eXl5eXl5eXl5eXgogdHlwZTo6ICJjb21tZW50LWFkZGVkIgpAQCAtMTI3LDYgKzE0MCwxNiBAQAogCiByZWZVcGRhdGU6OiBsaW5rOmpzb24uaHRtbCNyZWZVcGRhdGVbcmVmVXBkYXRlIGF0dHJpYnV0ZV0KIAorUmV2aWV3ZXIgQWRkZWQKK15eXl5eXl5eXl5eXl5eCit0eXBlOjogInJldmlld2VyLWFkZGVkIgorCitjaGFuZ2U6OiBsaW5rOmpzb24uaHRtbCNjaGFuZ2VbY2hhbmdlIGF0dHJpYnV0ZV0KKworcGF0Y2hzZXQ6OiBsaW5rOmpzb24uaHRtbCNwYXRjaFNldFtwYXRjaHNldCBhdHRyaWJ1dGVdCisKK3Jldmlld2VyOjogbGluazpqc29uLmh0bWwjYWNjb3VudFthY2NvdW50IGF0dHJpYnV0ZV0KKwogCiBTRUUgQUxTTwogLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXRlc3Qtc3VibWl0LXJ1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtcnVsZS50eHQKaW5kZXggNWI3MGJkMS4uYWU2OGI4MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtcnVsZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtcnVsZS50eHQKQEAgLTEsMTcgKzEsMTYgQEAKLWdlcnJpdCB0ZXN0LXN1Ym1pdC1ydWxlCitnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZQogPT09PT09PT09PT09PT09PT09PT09PT0KIAogTkFNRQogLS0tLQotZ2Vycml0IHRlc3Qtc3VibWl0LXJ1bGUgLSBUZXN0IHByb2xvZyBzdWJtaXQgcnVsZXMgd2l0aCBhIGNob3NlbiBjaGFuZ2VzZXQuCitnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZSAtIFRlc3QgcHJvbG9nIHN1Ym1pdCBydWxlcyB3aXRoIGEgY2hvc2VuIGNoYW5nZXNldC4KIAogU1lOT1BTSVMKIC0tLS0tLS0tCiBbdmVyc2VdCi0nc3NoJyAtcCA8cG9ydD4gPGhvc3Q+ICdnZXJyaXQgdGVzdC1zdWJtaXQtcnVsZScKKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCB0ZXN0LXN1Ym1pdCBydWxlJwogICBbLXNdCiAgIFstLW5vLWZpbHRlcnNdCi0gIFstLWZvcm1hdCB7VEVYVCB8IEpTT059XQogICBDSEFOR0UKIAogREVTQ1JJUFRJT04KQEAgLTI2LDE1ICsyNSw2IEBACiAtLW5vLWZpbHRlcnM6OgogCURvbid0IHJ1biB0aGUgc3VibWl0X2ZpbHRlci8yIGZyb20gdGhlIHBhcmVudCBwcm9qZWN0cyBvZiB0aGUgc3BlY2lmaWVkIGNoYW5nZS4KIAotLS1mb3JtYXQ6OgotICBXaGF0IG91dHB1dCBmb3JtYXQgdG8gZGlzcGxheSB0aGUgcmVzdWx0cyBpbi4KLSsKLS0tCi1gdGV4dGA6OiBTaW1wbGUgdGV4dCBiYXNlZCBmb3JtYXQuCi1ganNvbmA6OiBBIEpTT04gb2JqZWN0IGRlc2NyaWJlZCBpbiBsaW5rOmpzb24uaHRtbCNzdWJtaXRSZWNvcmRbc3VibWl0IHJlY29yZF0uCi1ganNvbl9jb21wYWN0YDo6IE1pbmltaXplZCBKU09OIG91dHB1dC4KLS0tCi0KIEFDQ0VTUwogLS0tLS0tCiBDYW4gYmUgdXNlZCBieSBhbnlvbmUgdGhhdCBoYXMgcGVybWlzc2lvbiB0byByZWFkIHRoZSBzcGVjaWZpZWQgY2hhbmdlc2V0LgpAQCAtNDIsNDYgKzMyLDMxIEBACiBFWEFNUExFUwogLS0tLS0tLS0KIAotCi1UZXN0IHN1Ym1pdF9ydWxlIGZyb20gc3RkaW4uCi09PT09Ci0gJCBjYXQgbm9uLWF1dGhvci1jb2RlcmV2aWV3LnBsIHwgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQtcnVsZSAtcyBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOQotIE5vbi1BdXRob3ItQ29kZS1SZXZpZXc6IE5PVF9SRUFEWQotIFZlcmlmaWVkOiBOT1RfUkVBRFkKLSBDb2RlLVJldmlldzogTk9UX1JFQURZIGJ5IEFub255bW91cyBDb3dhcmQgPHRlc3RAZW1haWwuY29tPgotCi0gTk9UX1JFQURZCi09PT09Ci0KIFRlc3Qgc3VibWl0X3J1bGUgZnJvbSBzdGRpbiBhbmQgcmV0dXJuIHRoZSByZXN1bHRzIGFzIEpTT04uCiA9PT09Ci0gY2F0IG5vbi1hdXRob3ItY29kZXJldmlldy5wbCB8IHNzaCAtcCAyOTQxOCByZXZpZXcuZXhhbXBsZS5jb20gZ2Vycml0IHRlc3Qtc3VibWl0LXJ1bGUgLS1mb3JtYXQ9SlNPTiAtcyBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOQotIHsKLSAgImFwcHJvdmFscyI6IFsKLSAgICB7Ci0gICAgICAidHlwZSI6ICJWZXJpZmllZCIsCi0gICAgICAidmFsdWUiOiAiTkVFRCIKLSAgICB9LAotICAgIHsKLSAgICAgICJ0eXBlIjogIkNvZGUtUmV2aWV3IiwKLSAgICAgICJ2YWx1ZSI6ICJPSyIsCi0gICAgICAiYnkiOiB7Ci0gICAgICAgICJlbWFpbCI6ICJ0ZXN0QGVtYWlsLmNvbSIsCi0gICAgICAgICJ1c2VybmFtZSI6ICJ0ZXN0IgotICAgICAgfQotICAgIH0KLSAgXSwKLSAgInZhbHVlIjogIk5PVF9SRUFEWSIKLSB9CisgY2F0IHJ1bGVzLnBsIHwgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZSAtcyBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOQorIFsKKyAgIHsKKyAgICAgInN0YXR1cyI6ICJOT1RfUkVBRFkiLAorICAgICAicmVqZWN0IjogeworICAgICAgICJBbnktTGFiZWwtTmFtZSI6IHt9CisgICAgIH0KKyAgIH0KKyBdCiA9PT09CiAKIFRlc3QgdGhlIGFjdGl2ZSBzdWJtaXRfcnVsZSBmcm9tIHRoZSByZWZzL21ldGEvY29uZmlnIGJyYW5jaCwgaWdub3JpbmcgZmlsdGVycyBpbiB0aGUgcHJvamVjdCBwYXJlbnRzLgogPT09PQotICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQtcnVsZSBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOSAtLW5vLWZpbHRlcnMKLSBWZXJpZmllZDogTk9UX1JFQURZCi0gQ29kZS1SZXZpZXc6IE5PVF9SRUFEWSBieSBBbm9ueW1vdXMgQ293YXJkIDx0ZXN0QGVtYWlsLmNvbT4KLQotIE5PVF9SRUFEWQorICQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdGVzdC1zdWJtaXQgcnVsZSBJNzhmMmM2NjczZGIyNGU0ZTkyZWQzMmY2MDRjOTYwZGM5NTI0MzdkOSAtLW5vLWZpbHRlcnMKKyBbCisgICB7CisgICAgICJzdGF0dXMiOiAiTk9UX1JFQURZIiwKKyAgICAgIm5lZWQiOiB7CisgICAgICAgIkNvZGUtUmV2aWV3Ijoge30KKyAgICAgICAiVmVyaWZpZWQiOiB7fQorICAgICB9CisgICB9CisgXQogPT09PQogCiBTQ1JJUFRJTkcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXRlc3Qtc3VibWl0LXR5cGUudHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtdGVzdC1zdWJtaXQtdHlwZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkNWZiYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY21kLXRlc3Qtc3VibWl0LXR5cGUudHh0CkBAIC0wLDAgKzEsNTMgQEAKK2dlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlCis9PT09PT09PT09PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitnZXJyaXQgdGVzdC1zdWJtaXQgdHlwZSAtIFRlc3QgcHJvbG9nIHN1Ym1pdCB0eXBlIHdpdGggYSBjaG9zZW4gY2hhbmdlLgorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydzc2gnIC1wIDxwb3J0PiA8aG9zdD4gJ2dlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlJworICBbLXNdCisgIFstLW5vLWZpbHRlcnNdCisgIENIQU5HRQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1Byb3ZpZGVzIGEgd2F5IHRvIHRlc3QgcHJvbG9nIHN1Ym1pdCB0eXBlLgorCitPUFRJT05TCistLS0tLS0tCistczo6CisJUmVhZHMgYSBydWxlcy5wbCBmaWxlIGZyb20gc3RkaW4gaW5zdGVhZCBvZiBydWxlcy5wbCBpbiByZWZzL21ldGEvY29uZmlnLgorCistLW5vLWZpbHRlcnM6OgorCURvbid0IHJ1biB0aGUgc3VibWl0X3R5cGVfZmlsdGVyLzIgZnJvbSB0aGUgcGFyZW50IHByb2plY3RzIG9mIHRoZSBzcGVjaWZpZWQgY2hhbmdlLgorCitBQ0NFU1MKKy0tLS0tLQorQ2FuIGJlIHVzZWQgYnkgYW55b25lIHRoYXQgaGFzIHBlcm1pc3Npb24gdG8gcmVhZCB0aGUgc3BlY2lmaWVkIGNoYW5nZS4KKworRVhBTVBMRVMKKy0tLS0tLS0tCisKK1Rlc3Qgc3VibWl0X3R5cGUgZnJvbSBzdGRpbiBhbmQgcmV0dXJuIHRoZSBzdWJtaXQgdHlwZS4KKz09PT0KKyBjYXQgcnVsZXMucGwgfCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlIC1zIEk3OGYyYzY2NzNkYjI0ZTRlOTJlZDMyZjYwNGM5NjBkYzk1MjQzN2Q5CisgIk1FUkdFX0lGX05FQ0VTU0FSWSIKKz09PT0KKworVGVzdCB0aGUgYWN0aXZlIHN1Ym1pdF90eXBlIGZyb20gdGhlIHJlZnMvbWV0YS9jb25maWcgYnJhbmNoLCBpZ25vcmluZyBmaWx0ZXJzIGluIHRoZSBwcm9qZWN0IHBhcmVudHMuCis9PT09CisgJCBzc2ggLXAgMjk0MTggcmV2aWV3LmV4YW1wbGUuY29tIGdlcnJpdCB0ZXN0LXN1Ym1pdCB0eXBlIEk3OGYyYzY2NzNkYjI0ZTRlOTJlZDMyZjYwNGM5NjBkYzk1MjQzN2Q5IC0tbm8tZmlsdGVycworICJNRVJHRV9JRl9ORUNFU1NBUlkiCis9PT09CisKK1NDUklQVElORworLS0tLS0tLS0tCitDYW4gYmUgdXNlZCBlaXRoZXIgaW50ZXJhY3RpdmVseSBmb3IgdGVzdGluZyBuZXcgcHJvbG9nIHN1Ym1pdCB0eXBlLCBvciBmcm9tIGEgc2NyaXB0IHRvIGNoZWNrIHRoZSBzdWJtaXQgdHlwZSBvZiBhIGNoYW5nZS4KKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY21kLXZlcnNpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9jbWQtdmVyc2lvbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmOTRlYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY21kLXZlcnNpb24udHh0CkBAIC0wLDAgKzEsNDggQEAKK2dlcnJpdCB2ZXJzaW9uCis9PT09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK2dlcnJpdCB2ZXJzaW9uIC0gU2hvdyB0aGUgdmVyc2lvbiBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBHZXJyaXQgc2VydmVyCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ3NzaCcgLXAgPHBvcnQ+IDxob3N0PiAnZ2Vycml0IHZlcnNpb24nCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGlzcGxheXMgYSBvbmUtbGluZSByZXNwb25zZSB3aXRoIHRoZSBzdHJpbmcgYGdlcnJpdCB2ZXJzaW9uYCBmb2xsb3dlZAorYnkgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdmVyc2lvbiBvZiBHZXJyaXQuCisKK1RoZSBgZ2l0IGRlc2NyaWJlYCBjb21tYW5kIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZlcnNpb24gc3RyaW5nIGJhc2VkCitvbiB0aGUgR2l0IGNvbW1pdCB1c2VkIHRvIGJ1aWxkIEdlcnJpdC4gRm9yIG9mZmljaWFsIHJlbGVhc2VzIG9mIEdlcnJpdCwKK3RoZSB2ZXJzaW9uIHN0cmluZyB3aWxsIGJlIGVxdWFsIHRvIHRoZSBHaXQgdGFnIHNldCBpbiB0aGUgR2Vycml0IHNvdXJjZQorY29kZSwgd2hpY2ggaW4gdHVybiBpcyBlcXVhbCB0byB0aGUgbmFtZSBvZiB0aGUgcmVsZWFzZSAoZm9yIGV4YW1wbGUKKzIuNC4yKS4gV2hlbiBidWlsZGluZyBHZXJyaXQgZnJvbSBhbm90aGVyIGNvbW1pdCAob25lIHRoYXQgZG9lc24ndCBoYXZlCithbiBvZmZpY2lhbC1sb29raW5nIHRhZyBwb2ludGluZyB0byBpdCksIHRoZSB2ZXJzaW9uIHN0cmluZyBoYXMgdGhlIGZvcm0KK2A8dGFnbmFtZT4tPG4+LWc8c2hhMT5gLCB3aGVyZSBgPG4+YCBpcyBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlcgorb2YgY29tbWl0cyBhaGVhZCBvZiB0aGUgYDx0YWduYW1lPmAgdGFnIHRoZSBjb21taXQgaXMsIGFuZCBgPHNoYTE+YCBpcwordGhlIHNldmVuLWNoYXJhY3RlciBhYmJyZXZpYXRlZCBTSEEtMSBvZiB0aGUgY29tbWl0LiBTZWUgdGhlIGBnaXQKK2Rlc2NyaWJlYCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdyBgPHRhZ25hbWU+YCBpcyBjaG9zZW4gYW5kIGhvdworYDxuPmAgaXMgY29tcHV0ZWQuCisKK0FDQ0VTUworLS0tLS0tCitBbnkgdXNlciB3aG8gaGFzIGNvbmZpZ3VyZWQgYW4gU1NIIGtleS4KKworU0NSSVBUSU5HCistLS0tLS0tLS0KK1RoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHNjcmlwdHMuCisKK0VYQU1QTEVTCistLS0tLS0tLQorCis9PT09PQorCSQgc3NoIC1wIDI5NDE4IHJldmlldy5leGFtcGxlLmNvbSBnZXJyaXQgdmVyc2lvbgorCWdlcnJpdCB2ZXJzaW9uIDIuNC4yCis9PT09PQorCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctY2xhLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLWNsYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwNGQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWNsYS50eHQKQEAgLTAsMCArMSw4MiBAQAorR2Vycml0IENvZGUgUmV2aWV3IC0gQ29udHJpYnV0b3IgQWdyZWVtZW50cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitVc2VycyBjYW4gYmUgcmVxdWlyZWQgdG8gc2lnbiBvbmUgb3IgbW9yZSBjb250cmlidXRvciBhZ3JlZW1lbnRzIGJlZm9yZQorYmVpbmcgYWJsZSB0byBzdWJtaXQgYSBjaGFuZ2UgaW4gYSBwcm9qZWN0LgorCitDb250cmlidXRvciBhZ3JlZW1lbnRzIGFyZSBnbG9iYWwgYW5kIGNhbiBiZSBjb25maWd1cmVkIGJ5IG1vZGlmeWluZwordGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZSBvbiB0aGUgYEFsbC1Qcm9qZWN0c2AgcHJvamVjdC4gUHVzaCBwZXJtaXNzaW9uCituZWVkcyB0byBiZSBncmFudGVkIGZvciB0aGUgYHJlZnMvbWV0YS9jb25maWdgIGJyYW5jaCB0byBiZSBhYmxlIHRvIHB1c2gKK2JhY2sgdGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZS4gQ29uc3VsdAorbGluazphY2Nlc3MtY29udHJvbC5odG1sW2FjY2VzcyBjb250cm9sc10gZm9yIGRldGFpbHMgb24gaG93IGFjY2VzcworcGVybWlzc2lvbnMgd29yay4KKworVG8gcmV0cmlldmUgdGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZSwgaW5pdGlhbGl6ZSBhIHRlbXBvcmFyeSBHaXQKK3JlcG9zaXRvcnkgdG8gZWRpdCB0aGUgY29uZmlndXJhdGlvbjoKKz09PT0KKyAgbWtkaXIgY2ZnX2RpcgorICBjZCBjZmdfZGlyCisgIGdpdCBpbml0Cis9PT09CisKK0Rvd25sb2FkIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uIGZyb20gR2Vycml0OgorPT09PQorICBnaXQgZmV0Y2ggc3NoOi8vbG9jYWxob3N0OjI5NDE4L0FsbC1Qcm9qZWN0cyByZWZzL21ldGEvY29uZmlnCisgIGdpdCBjaGVja291dCBGRVRDSF9IRUFECis9PT09CisKK0NvbnRyaWJ1dG9yIGFncmVlbWVudHMgYXJlIGRlZmluZWQgYXMgY29udHJpYnV0b3ItYWdyZWVtZW50IHNlY3Rpb25zIGluCitgcHJvamVjdC5jb25maWdgOgorPT09PQorICBbY29udHJpYnV0b3ItYWdyZWVtZW50ICJJbmRpdmlkdWFsIl0KKyAgICBkZXNjcmlwdGlvbiA9IElmIHlvdSBhcmUgZ29pbmcgdG8gYmUgY29udHJpYnV0aW5nIGNvZGUgb24geW91ciBvd24sIHRoaXMgaXMgdGhlIG9uZSB5b3Ugd2FudC4gWW91IGNhbiBzaWduIHRoaXMgb25lIG9ubGluZS4KKyAgICByZXF1aXJlQ29udGFjdEluZm9ybWF0aW9uID0gdHJ1ZQorICAgIGFncmVlbWVudFVybCA9IHN0YXRpYy9jbGFfaW5kaXZpZHVhbC5odG1sCisgICAgYXV0b1ZlcmlmeSA9IGdyb3VwIENMQSBBY2NlcHRlZCAtIEluZGl2aWR1YWwKKyAgICBhY2NlcHRlZCA9IGdyb3VwIENMQSBBY2NlcHRlZCAtIEluZGl2aWR1YWwKKz09PT0KKworRWFjaCBgY29udHJpYnV0b3ItYWdyZWVtZW50YCBzZWN0aW9uIHdpdGhpbiB0aGUgYHByb2plY3QuY29uZmlnYCBmaWxlIG11c3QKK2hhdmUgYSB1bmlxdWUgbmFtZS4gVGhlIHNlY3Rpb24gbmFtZSB3aWxsIGFwcGVhciBpbiB0aGUgd2ViIFVJLgorCitJZiBub3QgYWxyZWFkeSBwcmVzZW50LCBhZGQgdGhlIFVVSUQgb2YgdGhlIGdyb3VwcyB1c2VkIGluIHRoZQorYGF1dG9WZXJpZnlgIGFuZCBgYWNjZXB0ZWRgIHZhcmlhYmxlcyBpbiB0aGUgZ3JvdXBzIGZpbGUuCisKK0NvbW1pdCB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2UsIGFuZCBwdXNoIGl0IGJhY2s6Cis9PT09CisgIGdpdCBjb21taXQgLWEgLW0gIkFkZCBJbmRpdmlkdWFsIGNvbnRyaWJ1dG9yIGFncmVlbWVudCIKKyAgZ2l0IHB1c2ggc3NoOi8vbG9jYWxob3N0OjI5NDE4L0FsbC1Qcm9qZWN0cyBIRUFEOnJlZnMvbWV0YS9jb25maWcKKz09PT0KKworW1tjb250cmlidXRvci1hZ3JlZW1lbnQubmFtZS5kZXNjcmlwdGlvbl1dY29udHJpYnV0b3ItYWdyZWVtZW50LjxuYW1lPi5kZXNjcmlwdGlvbjo6CisrCitTaG9ydCB0ZXh0IGRlc2NyaWJpbmcgdGhlIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4gVGhpcyB0ZXh0IHdpbGwgYXBwZWFyCit3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gYWdyZWVtZW50LgorCitbW2NvbnRyaWJ1dG9yLWFncmVlbWVudC5uYW1lLnJlcXVpcmVDb250YWN0SW5mb3JtYXRpb25dXWNvbnRyaWJ1dG9yLWFncmVlbWVudC48bmFtZT4ucmVxdWlyZUNvbnRhY3RJbmZvcm1hdGlvbjo6CisrCitUcnVlIGlmIHRoZSB1c2VyIG11c3QgcHJvdmlkZSBjb250YWN0IGluZm9ybWF0aW9uIHdoZW4gc2lnbmluZyBhCitjb250cmlidXRvciBhZ3JlZW1lbnQuIERlZmF1bHQgaXMgZmFsc2UuCisKK1tbY29udHJpYnV0b3ItYWdyZWVtZW50Lm5hbWUuYWdyZWVtZW50VXJsXV1jb250cmlidXRvci1hZ3JlZW1lbnQuPG5hbWU+LmFncmVlbWVudFVybDo6CisrCitBbiBhYnNvbHV0ZSBVUkwgb3IgYSByZWxhdGl2ZSBwYXRoIHRvIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSB0ZXh0CitvZiB0aGUgY29udHJpYnV0b3IgYWdyZWVtZW50LiBUaGUgVVJMIG11c3QgdXNlIHRoZSBodHRwIG9yIGh0dHBzCitzY2hlbWUuIFRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBgZ2Vycml0LmJhc2VQYXRoYCB2YXJpYWJsZSBpbgorYGdlcnJpdC5jb25maWdgLgorCitbW2NvbnRyaWJ1dG9yLWFncmVlbWVudC5uYW1lLmF1dG9WZXJpZnldXWNvbnRyaWJ1dG9yLWFncmVlbWVudC48bmFtZT4uYXV0b1ZlcmlmeTo6CisrCitJZiBwcmVzZW50LCB0aGUgdXNlciBjYW4gc2lnbiB0aGUgY29udHJpYnV0b3IgYWdyZWVtZW50IG9ubGluZS4gVGhlCit2YWx1ZSBpcyB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhlIHVzZXIgd2lsbCBiZSBhZGRlZCBhZnRlciBzaWduaW5nIHRoZQorYWdyZWVtZW50LiBUaGUgZ3JvdXAncyBVVUlEIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlIGBncm91cHNgIGZpbGUuCisKK1tbY29udHJpYnV0b3ItYWdyZWVtZW50Lm5hbWUuYWNjZXB0ZWRdXWNvbnRyaWJ1dG9yLWFncmVlbWVudC48bmFtZT4uYWNjZXB0ZWQ6OgorKworTGlzdCBvZiBncm91cHMgdGhhdCB3aWxsIGJlIGNvbnNpZGVyZWQgd2hlbiB2ZXJpZnlpbmcgdGhhdCBhCitjb250cmlidXRvciBhZ3JlZW1lbnQgaGFzIGJlZW4gYWNjZXB0ZWQuIFRoZSBncm91cHMnIFVVSUQgbXVzdCBhbHNvCithcHBlYXIgaW4gdGhlIGBncm91cHNgIGZpbGUuCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1nZXJyaXQudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctZ2Vycml0LnR4dAppbmRleCBkZTJhYTAyLi42MjI4YTk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1nZXJyaXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWdlcnJpdC50eHQKQEAgLTE5LDkgKzE5LDYgQEAKIAogW2NhY2hlXQogICBkaXJlY3RvcnkgPSAvdmFyL2NhY2hlL2dlcnJpdDIKLQotW2NhY2hlICJkaWZmIl0KLSAgZGlza2J1ZmZlciA9IDEwIG0KIC0tLS0KIAogW1thY2NvdW50c11dU2VjdGlvbiBhY2NvdW50cwpAQCAtMTMzLDcgKzEzMCw4IEBACiBUaGUgYWN0dWFsIHVzZXJuYW1lIHVzZWQgaW4gdGhlIExEQVAgc2ltcGxlIGJpbmQgcmVxdWVzdCBpcyB0aGUKIGFjY291bnQncyBmdWxsIEROLCB3aGljaCBpcyBkaXNjb3ZlcmVkIGJ5IGZpcnN0IHF1ZXJ5aW5nIHRoZQogZGlyZWN0b3J5IHVzaW5nIGVpdGhlciBhbiBhbm9ueW1vdXMgcmVxdWVzdCwgb3IgdGhlIGNvbmZpZ3VyZWQKLTw8bGRhcC51c2VybmFtZT4+IGlkZW50aXR5LgorPDxsZGFwLnVzZXJuYW1lLGxkYXAudXNlcm5hbWU+PiBpZGVudGl0eS4gR2Vycml0IGNhbiBhbHNvIHVzZSBrZXJiZXJvcyBpZgorPDxsZGFwLmF1dGhlbnRpY2F0aW9uLGxkYXAuYXV0aGVudGljYXRpb24+PiBpcyBzZXQgdG8gYEdTU0FQSWAuCiAKICogYExEQVBfQklORGAKICsKQEAgLTE0NCw3ICsxNDIsNyBAQAogKwogVW5saWtlIExEQVAgYWJvdmUsIHRoZSB1c2VybmFtZSB1c2VkIHRvIHBlcmZvcm0gdGhlIExEQVAgc2ltcGxlIGJpbmQKIHJlcXVlc3QgaXMgdGhlIGV4YWN0IHN0cmluZyBzdXBwbGllZCBieSBpbiB0aGUgZGlhbG9nIGJ5IHRoZSB1c2VyLgotVGhlIGNvbmZpZ3VyZWQgPDxsZGFwLnVzZXJuYW1lPj4gaWRlbnRpdHkgaXMgbm90IHVzZWQgdG8gb2J0YWluCitUaGUgY29uZmlndXJlZCA8PGxkYXAudXNlcm5hbWUsbGRhcC51c2VybmFtZT4+IGlkZW50aXR5IGlzIG5vdCB1c2VkIHRvIG9idGFpbgogYWNjb3VudCBpbmZvcm1hdGlvbi4KICsKICogYERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVGAKQEAgLTE5NSw2ICsxOTMsMTYgQEAKIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGNvbnRhaW5zIHR3byB2YWx1ZXMsIGBodHRwOi8vYCBhbmQgYGh0dHBzOi8vYCwKIGFsbG93aW5nIEdlcnJpdCB0byB0cnVzdCBhbnkgT3BlbklEIGl0IHJlY2VpdmVzLgogCitbW2F1dGgub3BlbklkRG9tYWluXV1hdXRoLm9wZW5JZERvbWFpbjo6CisrCitMaXN0IG9mIGFsbG93ZWQgT3BlbklEIGVtYWlsIGFkZHJlc3MgZG9tYWlucy4gT25seSB1c2VkIGlmCitgYXV0aC50eXBlYCBpcyBzZXQgdG8gIk9QRU5JRCIgb3IgIk9QRU5JRF9TU08iLgorKworRG9tYWluIGlzIGNhc2UgaW5zZW5zaXRpdmUgYW5kIG11c3QgYmUgaW4gdGhlIHNhbWUgZm9ybSBhcyBpdAorYXBwZWFycyBpbiB0aGUgZW1haWwgYWRkcmVzcywgZm9yIGV4YW1wbGUsICJleGFtcGxlLmNvbSIuCisrCitCeSBkZWZhdWx0LCBhbnkgZG9tYWluIGlzIGFjY2VwdGVkLgorCiBbW2F1dGgubWF4T3BlbklkU2Vzc2lvbkFnZV1dYXV0aC5tYXhPcGVuSWRTZXNzaW9uQWdlOjoKICsKIFRpbWUgaW4gc2Vjb25kcyBiZWZvcmUgYW4gT3BlbklEIHByb3ZpZGVyIG11c3QgZm9yY2UgdGhlIHVzZXIKQEAgLTI2Myw2ICsyNzEsMjQgQEAKICsKIElmIG5vdCBzZXQsIG5vICJSZWdpc3RlciIgbGluayBpcyBkaXNwbGF5ZWQuCiAKK1tbYXV0aC5yZWdpc3RlclRleHRdXWF1dGgucmVnaXN0ZXJUZXh0OjoKKysKK1RleHQgZm9yIHRoZSAiUmVnaXN0ZXIiIGxpbmsgaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lci4gIFVzZWQgb25seQord2hlbiBhdXRoLnR5cGUgaXMgYExEQVBgLgorKworSWYgbm90IHNldCwgZGVmYXVsdHMgdG8gIlJlZ2lzdGVyIi4KKworW1thdXRoLmVkaXRGdWxsTmFtZVVybF1dYXV0aC5lZGl0RnVsbE5hbWVVcmw6OgorKworVGFyZ2V0IGZvciB0aGUgIkVkaXQiIGJ1dHRvbiB3aGVuIHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8gZWRpdCB0aGVpcgorZnVsbCBuYW1lLgorCitbW2F1dGguaHR0cFBhc3N3b3JkVXJsXV1hdXRoLmh0dHBQYXNzd29yZFVybDo6CisrCitUYXJnZXQgZm9yIHRoZSAiT2J0YWluIFBhc3N3b3JkIiBsaW5rLiAgVXNlZCBvbmx5IHdoZW4gYXV0aC50eXBlIGlzCitgTERBUGAsIGBMREFQX0JJTkRgIG9yIGBDVVNUT01fRVhURU5TSU9OYC4KKysKKwogW1thdXRoLmNvb2tpZVBhdGhdXWF1dGguY29va2llUGF0aDo6CiArCiBTZXRzICJwYXRoIiBhdHRyaWJ1dGUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIGNvb2tpZS4KQEAgLTI5Nyw4ICszMjMsOSBAQAogZW5hYmxlZCBmb3IgdGhlIEdlcnJpdCBzaXRlLiAgSWYgZW5hYmxlZCBhIHVzZXIgbXVzdCBjb21wbGV0ZSBhCiBjb250cmlidXRvciBhZ3JlZW1lbnQgYmVmb3JlIHRoZXkgY2FuIHVwbG9hZCBjaGFuZ2VzLgogKwotSWYgZW5hYmxlZCwgdGhlIGFkbWluIG11c3QgYWxzbyBpbnNlcnQgb25lIG9yIG1vcmUgcm93cyBpbnRvCi1gY29udHJpYnV0b3JfYWdyZWVtZW50c2AgYW5kIGNyZWF0ZSBhZ3JlZW1lbnQgZmlsZXMgdW5kZXIKK0lmIGVuYWJsZWQsIHRoZSBhZG1pbiBtdXN0IGFsc28gYWRkIG9uZSBvciBtb3JlCitsaW5rOmNvbmZpZy1jbGEuaHRtbFtjb250cmlidXRvci1hZ3JlZW1lbnQgc2VjdGlvbnNdCitpbiBwcm9qZWN0LmNvbmZpZyBhbmQgY3JlYXRlIGFncmVlbWVudCBmaWxlcyB1bmRlcgogYCckc2l0ZV9wYXRoJy9zdGF0aWNgLCBzbyB1c2VycyBjYW4gYWN0dWFsbHkgY29tcGxldGUgb25lIG9yCiBtb3JlIGFncmVlbWVudHMuCiArCkBAIC0zOTIsNyArNDE5LDcgQEAKICogeSwgeWVhciwgeWVhcnMgKGAxIHllYXJgIGlzIHRyZWF0ZWQgYXMgYDM2NSBkYXlzYCkKIAogKwotSWYgYSB1bml0IHN1ZmZpeCBpcyBub3Qgc3BlY2lmaWVkLCBgbWludXRlc2AgaXMgYXNzdW1lZC4gIElmIDAgaXMKK0lmIGEgdW5pdCBzdWZmaXggaXMgbm90IHNwZWNpZmllZCwgYHNlY29uZHNgIGlzIGFzc3VtZWQuICBJZiAwIGlzCiBzdXBwbGllZCwgdGhlIG1heGltdW0gYWdlIGlzIGluZmluaXRlIGFuZCBpdGVtcyBhcmUgbmV2ZXIgcHVyZ2VkCiBleGNlcHQgd2hlbiB0aGUgY2FjaGUgaXMgZnVsbC4KICsKQEAgLTQ3NSw2ICs1MDIsMTkgQEAKIHJlcXVpcmVzIHR3byBIVFRQIHJlcXVlc3RzLCBhbmQgdGhpcyBjYWNoZSB0cmllcyB0byBjYXJyeSBzdGF0ZSBmcm9tCiB0aGUgZmlyc3QgcmVxdWVzdCBpbnRvIHRoZSBzZWNvbmQgdG8gZW5zdXJlIGl0IGNhbiBjb21wbGV0ZS4KIAorY2FjaGUgYCJjaGFuZ2VzImA6OgorKworVGhlIHNpemUgb2YgYG1lbW9yeUxpbWl0YCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcHJvamVjdHMgZm9yIHdoaWNoCithbGwgY2hhbmdlcyB3aWxsIGJlIGNhY2hlZC4gSWYgdGhlIGNhY2hlIGlzIHNldCB0byAxMDI0LCB0aGlzIG1lYW5zIGFsbAorY2hhbmdlcyBmb3IgdXAgdG8gMTAyNCBwcm9qZWN0cyBjYW4gYmUgaGVsZCBpbiB0aGUgY2FjaGUuCisrCitEZWZhdWx0IHZhbHVlIGlzIDAgKGRpc2FibGVkKS4gSXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBkdWUgdG8gdGhlIGZhY3QKK3RoYXQgY2hhbmdlIHVwZGF0ZXMgYXJlIG5vdCBjb21tdW5pY2F0ZWQgYmV0d2VlbiBHZXJyaXQgc2VydmVycy4gSGVuY2UKK3RoaXMgY2FjaGUgc2hvdWxkIGJlIGRpc2FibGVkIGluIGFuIG11bHRpLW1hc3Rlci9tdWx0aS1zbGF2ZSBzZXR1cC4KKysKK1RoZSBjYWNoZSBzaG91bGQgYmUgZmx1c2hlZCB3aGVuZXZlciB0aGUgZGF0YWJhc2UgY2hhbmdlcyB0YWJsZSBpcyBtb2RpZmllZAorb3V0c2lkZSBvZiBnZXJyaXQuCisKIGNhY2hlIGAiZGlmZiJgOjoKICsKIEVhY2ggaXRlbSBjYWNoZXMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGNvbW1pdHMsIGF0IGJvdGggdGhlCkBAIC02MDgsOCArNjQ4LDExIEBACiBNYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgaW50cmFsaW5lIGRpZmZlcmVuY2UgZGF0YQogYmVmb3JlIGdpdmluZyB1cCBhbmQgZGlzYWJsaW5nIGl0IGZvciBhIHBhcnRpY3VsYXIgZmlsZSBwYWlyLiAgVGhpcyBpcwogYSB3b3JrIGFyb3VuZCBmb3IgYW4gaW5maW5pdGUgbG9vcCBidWcgaW4gdGhlIGludHJhbGluZSBkaWZmZXJlbmNlCi1pbXBsZW1lbnRhdGlvbi4gIElmIGNvbXB1dGF0aW9uIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lb3V0IHRoZQotd29ya2VyIHRocmVhZCBpcyB0ZXJtaW5hdGVkIGFuZCBubyBpbnRyYWxpbmUgZGlmZmVyZW5jZSBpcyBkaXNwbGF5ZWQuCitpbXBsZW1lbnRhdGlvbi4KKysKK0lmIGNvbXB1dGF0aW9uIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lb3V0LCB0aGUgd29ya2VyIHRocmVhZCBpcwordGVybWluYXRlZCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBzaG93biwgYW5kIG5vIGludHJhbGluZSBkaWZmZXJlbmNlIGlzCitkaXNwbGF5ZWQgZm9yIHRoZSBmaWxlIHBhaXIuCiArCiBWYWx1ZXMgc2hvdWxkIHVzZSBjb21tb24gdW5pdCBzdWZmaXhlcyB0byBleHByZXNzIHRoZWlyIHNldHRpbmc6CiArCkBAIC02NDQsNiArNjg3LDcgQEAKICgnbXMnLCAnc2VjJywgJ21pbicsIGV0Yy4pLgogKwogSWYgc2V0IHRvIDAsIGNoZWNrcyBvY2N1ciBldmVyeSB0aW1lLCB3aGljaCBtYXkgc2xvdyBkb3duIG9wZXJhdGlvbnMuCitJZiBzZXQgdG8gJ2Rpc2FibGVkJyBvciAnb2ZmJywgbm8gY2hlY2sgd2lsbCBldmVyIGJlIGRvbmUuCiBBZG1pbmlzdHJhdG9ycyBtYXkgZm9yY2UgdGhlIGNhY2hlIHRvIGZsdXNoIHdpdGgKIGxpbms6Y21kLWZsdXNoLWNhY2hlcy5odG1sW2dlcnJpdCBmbHVzaC1jYWNoZXNdLgogKwpAQCAtNjUyLDIzICs2OTYsMzEgQEAKIFtbY2hhbmdlTWVyZ2VdXVNlY3Rpb24gY2hhbmdlTWVyZ2UKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAorY2hhbmdlTWVyZ2UuY2hlY2tGcmVxdWVuY3k6OgorKworSG93IG9mdGVuIHRoZSBkYXRhYmFzZSBzaG91bGQgYmUgcmVzY2FubmVkIGZvciBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuCitzdWJtaXR0ZWQgYnV0IG5vdCBtZXJnZWQgZHVlIHRvIHRyYW5zaWVudCBlcnJvcnMuIFZhbHVlcyBjYW4gYmUKK3NwZWNpZmllZCB1c2luZyBzdGFuZGFyZCB0aW1lIHVuaXQgYWJicmV2aWF0aW9ucyAoJ21zJywgJ3NlYycsICdtaW4nLAorZXRjLikuIFNldCB0byAwIHRvIGRpc2FibGUgcGVyaW9kaWMgcmVzY2FubmluZywgb25seSBzY2FubmluZyBvbmNlIG9uCittYXN0ZXIgbm9kZSBzdGFydHVwLgorKworRGVmYXVsdCBpcyAzMDAgc2Vjb25kcyAoNSBtaW51dGVzKS4KKworY2hhbmdlTWVyZ2UudGVzdDo6CisrCiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgbWVyZ2VhYmlsaXR5IHRlc3Qgb2YgY2hhbmdlcyBpcwogZW5hYmxlZC4gIElmIGVuYWJsZWQsIHdoZW4gdGhlIGNoYW5nZSBwYWdlIGlzIGxvYWRlZCwgdGhlIHRlc3QgaXMKIHRyaWdnZXJlZC4gVGhlIHN1Ym1pdCBidXR0b24gd2lsbCBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGFjY29yZGluZyB0bwogdGhlIHJlc3VsdC4KLQotLS0tLQotW2NoYW5nZU1lcmdlXQotICB0ZXN0ID0gdHJ1ZQotLS0tLQotCisrCiBCeSBkZWZhdWx0IHRoaXMgaXMgZmFsc2UgKHRlc3QgaXMgbm90IGVuYWJsZWQpLgogCiBbW2NvbW1lbnRsaW5rXV1TZWN0aW9uIGNvbW1lbnRsaW5rCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBDb21tZW50IGxpbmtzIGFyZSBmaW5kL3JlcGxhY2Ugc3RyaW5ncyBhcHBsaWVkIHRvIGNoYW5nZSBkZXNjcmlwdGlvbnMsCi1wYXRjaCBjb21tZW50cywgYW5kIGluLWxpbmUgY29kZSBjb21tZW50cyB0byB0dXJuIHNldCBzdHJpbmdzIGludG8KLWh5cGVybGlua3MuICBPbmUgY29tbW9uIHVzZSBpcyBmb3IgbGlua2luZyB0byBidWctdHJhY2tpbmcgc3lzdGVtcy4KK3BhdGNoIGNvbW1lbnRzLCBpbi1saW5lIGNvZGUgY29tbWVudHMgYW5kIGFwcHJvdmFsIGNhdGVnb3J5IHZhbHVlIGRlc2NyaXB0aW9ucwordG8gdHVybiBzZXQgc3RyaW5ncyBpbnRvIGh5cGVybGlua3MuICBPbmUgY29tbW9uIHVzZSBpcyBmb3IgbGlua2luZyB0bworYnVnLXRyYWNraW5nIHN5c3RlbXMuCiAKIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb25maWd1cmF0aW9uIHRoZSAnY2hhbmdlaWQnIGNvbW1lbnQgbGluawogd2lsbCBtYXRjaCB0eXBpY2FsIEdlcnJpdCBDaGFuZ2UtSWQgdmFsdWVzIGFuZCBjcmVhdGUgYSBoeXBlcmxpbmsKQEAgLTg5Miw2ICs5NDQsMTQgQEAKICsKIERlZmF1bHQgaXMgNjQgZW50cmllcy4KIAorW1tjb3JlLnVzZVJlY3Vyc2l2ZU1lcmdlXV1jb3JlLnVzZVJlY3Vyc2l2ZU1lcmdlOjoKKysKK1VzZSBKR2l0J3MgbmV3LCBleHBlcmltZW50YWwgcmVjdXJzaXZlIG1lcmdlciBmb3IgdGhyZWUtd2F5IG1lcmdlcy4KK1RoaXMgb25seSBhZmZlY3RzIHByb2plY3RzIGNvbmZpZ3VyZWQgdG8gYXV0b21hdGljYWxseSByZXNvbHZlCitjb25mbGljdHMuCisrCitEZWZhdWx0IGlzIGZhbHNlLCBidXQgaW4gYSBmdXR1cmUgcmVsZWFzZSBtYXkgZGVmYXVsdCB0byB0cnVlLgorCiBbW2RhdGFiYXNlXV1TZWN0aW9uIGRhdGFiYXNlCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTk2OSw2ICsxMDI5LDEzIEBACiBpc24ndCBuZWNlc3NhcnkgYXMgaXQgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGFsbCBvZiB0aGUKIGFib3ZlIHByb3BlcnRpZXMuCiAKK1tbZGF0YWJhc2UuY29ubmVjdGlvblBvb2xdXWRhdGFiYXNlLmNvbm5lY3Rpb25Qb29sOjoKKysKK0lmIHRydWUsIHVzZSBjb25uZWN0aW9uIHBvb2xpbmcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zLiBPdGhlcndpc2UsIGEKK25ldyBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBmb3IgZWFjaCByZXF1ZXN0LgorKworRGVmYXVsdCBpcyBmYWxzZSBmb3IgTXlTUUwsIGFuZCB0cnVlIGZvciBvdGhlciBkYXRhYmFzZSBiYWNrZW5kcy4KKwogW1tkYXRhYmFzZS5wb29sTGltaXRdXWRhdGFiYXNlLnBvb2xMaW1pdDo6CiArCiBNYXhpbXVtIG51bWJlciBvZiBvcGVuIGRhdGFiYXNlIGNvbm5lY3Rpb25zLiAgSWYgdGhlIHNlcnZlciBuZWVkcwpAQCAtOTgwLDExICsxMDQ3LDE3IEBACiBuZWVkIG11bHRpcGxlIGNvbm5lY3Rpb25zLgogKwogRGVmYXVsdCBpcyA4LgorKworVGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyBpZgorPDxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbCxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbD4+IGlzIHRydWUuCiAKIFtbZGF0YWJhc2UucG9vbE1pbklkbGVdXWRhdGFiYXNlLnBvb2xNaW5JZGxlOjoKICsKIE1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIGtlZXAgaWRsZSBpbiB0aGUgcG9vbC4KIERlZmF1bHQgaXMgNC4KKysKK1RoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgaWYKKzw8ZGF0YWJhc2UuY29ubmVjdGlvblBvb2wsZGF0YWJhc2UuY29ubmVjdGlvblBvb2w+PiBpcyB0cnVlLgogCiBbW2RhdGFiYXNlLnBvb2xNYXhJZGxlXV1kYXRhYmFzZS5wb29sTWF4SWRsZTo6CiArCkBAIC05OTIsNiArMTA2NSw5IEBACiBhcmUgbW9yZSBpZGxlIGNvbm5lY3Rpb25zLCBjb25uZWN0aW9ucyB3aWxsIGJlIGNsb3NlZCBpbnN0ZWFkIG9mCiBiZWluZyByZXR1cm5lZCBiYWNrIHRvIHRoZSBwb29sLgogRGVmYXVsdCBpcyA0LgorKworVGhpcyBzZXR0aW5nIG9ubHkgYXBwbGllcyBpZgorPDxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbCxkYXRhYmFzZS5jb25uZWN0aW9uUG9vbD4+IGlzIHRydWUuCiAKIFtbZGF0YWJhc2UucG9vbE1heFdhaXRdXWRhdGFiYXNlLnBvb2xNYXhXYWl0OjoKICsKQEAgLTEwMTAsNiArMTA4Niw5IEBACiBJZiBhIHVuaXQgc3VmZml4IGlzIG5vdCBzcGVjaWZpZWQsIGBtaWxsaXNlY29uZHNgIGlzIGFzc3VtZWQuCiArCiBEZWZhdWx0IGlzIGAzMCBzZWNvbmRzYC4KKysKK1RoaXMgc2V0dGluZyBvbmx5IGFwcGxpZXMgaWYKKzw8ZGF0YWJhc2UuY29ubmVjdGlvblBvb2wsZGF0YWJhc2UuY29ubmVjdGlvblBvb2w+PiBpcyB0cnVlLgogCiBbW2Rvd25sb2FkXV1TZWN0aW9uIGRvd25sb2FkCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC0xMjQzLDYgKzEzMjIsMTYgQEAKICsKIFZhbGlkIHZhbHVlcyBhcmUgdGhlIGNoYXJhY3RlcnMgJyonLCAnKCcgYW5kICcpJy4KIAorW1tncm91cHNdXVNlY3Rpb24gZ3JvdXBzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworW1tncm91cHMubmV3R3JvdXBzVmlzaWJsZVRvQWxsXV1ncm91cHMubmV3R3JvdXBzVmlzaWJsZVRvQWxsOjoKKysKK0NvbnRyb2xzIHdoZXRoZXIgbmV3bHkgY3JlYXRlZCBncm91cHMgc2hvdWxkIGJlIGJ5IGRlZmF1bHQgdmlzaWJsZSB0bworYWxsIHJlZ2lzdGVyZWQgdXNlcnMuCisrCitCeSBkZWZhdWx0LCBmYWxzZS4KKwogW1tob29rc11dU2VjdGlvbiBob29rcwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0xMjcyLDYgKzEzNjEsMTEgQEAKIE9wdGlvbmFsIGZpbGVuYW1lIGZvciB0aGUgY2hhbmdlIG1lcmdlZCBob29rLCBpZiBub3Qgc3BlY2lmaWVkIHRoZW4KIGBjaGFuZ2UtbWVyZ2VkYCB3aWxsIGJlIHVzZWQuCiAKK1tbaG9va3MubWVyZ2VGYWlsZWRIb29rXV1ob29rcy5tZXJnZUZhaWxlZEhvb2s6OgorKworT3B0aW9uYWwgZmlsZW5hbWUgZm9yIHRoZSBtZXJnZSBmYWlsZWQgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCitgbWVyZ2UtZmFpbGVkYCB3aWxsIGJlIHVzZWQuCisKIFtbaG9va3MuY2hhbmdlQWJhbmRvbmVkSG9va11daG9va3MuY2hhbmdlQWJhbmRvbmVkSG9vazo6CiArCiBPcHRpb25hbCBmaWxlbmFtZSBmb3IgdGhlIGNoYW5nZSBhYmFuZG9uZWQgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCkBAIC0xMjg3LDExICsxMzgxLDI2IEBACiBPcHRpb25hbCBmaWxlbmFtZSBmb3IgdGhlIHJlZiB1cGRhdGVkIGhvb2ssIGlmIG5vdCBzcGVjaWZpZWQgdGhlbgogYHJlZi11cGRhdGVkYCB3aWxsIGJlIHVzZWQuCiAKK1tbaG9va3MucmV2aWV3ZXJBZGRlZEhvb2tdXWhvb2tzLnJldmlld2VyQWRkZWRIb29rOjoKKysKK09wdGlvbmFsIGZpbGVuYW1lIGZvciB0aGUgcmV2aWV3ZXIgYWRkZWQgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCitgcmV2aWV3ZXItYWRkZWRgIHdpbGwgYmUgdXNlZC4KKwogW1tob29rcy5jbGFTaWduZWRIb29rXV1ob29rcy5jbGFTaWduZWRIb29rOjoKICsKIE9wdGlvbmFsIGZpbGVuYW1lIGZvciB0aGUgQ0xBIHNpZ25lZCBob29rLCBpZiBub3Qgc3BlY2lmaWVkIHRoZW4KIGBjbGEtc2lnbmVkYCB3aWxsIGJlIHVzZWQuCiAKK1tbaG9va3MucmVmVXBkYXRlSG9va11daG9va3MucmVmVXBkYXRlSG9vazo6CisrCitPcHRpb25hbCBmaWxlbmFtZSBmb3IgdGhlIHJlZiB1cGRhdGUgaG9vaywgaWYgbm90IHNwZWNpZmllZCB0aGVuCitgcmVmLXVwZGF0ZWAgd2lsbCBiZSB1c2VkLgorCitbW2hvb2tzLnN5bmNIb29rVGltZW91dF1daG9va3Muc3luY0hvb2tUaW1lb3V0OjoKKysKK09wdGlvbmFsIHRpbWVvdXQgdmFsdWUgaW4gc2Vjb25kcyBmb3Igc3luY2hyb25vdXMgaG9va3MsIGlmIG5vdCBzcGVjaWZpZWQKK3RoZW4gMzAgc2Vjb25kcyB3aWxsIGJlIHVzZWQuCisKIFtbaHR0cF1dU2VjdGlvbiBodHRwCiB+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0xMzA0LDEzICsxNDEzLDEzIEBACiBbW2h0dHAucHJveHlVc2VybmFtZV1daHR0cC5wcm94eVVzZXJuYW1lOjoKICsKIE9wdGlvbmFsIHVzZXJuYW1lIHRvIGF1dGhlbnRpY2F0ZSB0byB0aGUgSFRUUCBwcm94eSB3aXRoLgotVGhpcyBwcm9wZXJ0eSBpcyBob25vcmVkIG9ubHkgaWYgdGhlIHVzZXJuYW1lIGRvZXMgbm90IAorVGhpcyBwcm9wZXJ0eSBpcyBob25vcmVkIG9ubHkgaWYgdGhlIHVzZXJuYW1lIGRvZXMgbm90CiBhcHBlYXIgaW4gdGhlIGh0dHAucHJveHkgcHJvcGVydHkgYWJvdmUuCiAKIFtbaHR0cC5wcm94eVBhc3N3b3JkXV1odHRwLnByb3h5UGFzc3dvcmQ6OgogKwogT3B0aW9uYWwgcGFzc3dvcmQgdG8gYXV0aGVudGljYXRlIHRvIHRoZSBIVFRQIHByb3h5IHdpdGguCi1UaGlzIHByb3BlcnR5IGlzIGhvbm9yZWQgb25seSBpZiB0aGUgcGFzc3dvcmQgZG9lcyBub3QgCitUaGlzIHByb3BlcnR5IGlzIGhvbm9yZWQgb25seSBpZiB0aGUgcGFzc3dvcmQgZG9lcyBub3QKIGFwcGVhciBpbiB0aGUgaHR0cC5wcm94eSBwcm9wZXJ0eSBhYm92ZS4KIAogCkBAIC0xNzA2LDYgKzE4MTUsMjEgQEAKIERlZmF1bHQgaXMgYChtZW1iZXJVaWQ9JHt1c2VybmFtZX0pYCBmb3IgUkZDIDIzMDcsCiBhbmQgdW5zZXQgKGRpc2FibGVkKSBmb3IgQWN0aXZlIERpcmVjdG9yeS4KIAorW1tsZGFwLmdyb3VwTmFtZV1dbGRhcC5ncm91cE5hbWU6OgorKworXyhPcHRpb25hbClfIE5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBvbiB0aGUgZ3JvdXAgb2JqZWN0IHdoaWNoIGNvbnRhaW5zCit0aGUgdmFsdWUgdG8gdXNlIGFzIHRoZSBncm91cCBuYW1lIGluIEdlcnJpdC4KKysKK1R5cGljYWxseSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgYGNuYCBmb3IgUkZDIDIzMDcgYW5kIEFjdGl2ZSBEaXJlY3RvcnkKK3NlcnZlcnMuICBGb3Igb3RoZXIgc2VydmVycyB0aGUgYXR0cmlidXRlIG5hbWUgbWF5IGRpZmZlciwgZm9yIGV4YW1wbGUKK2BhcHBsZS1ncm91cC1yZWFsbmFtZWAgb24gQXBwbGUgTWFjT1MgWCBTZXJ2ZXIuCisrCitJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBsaXRlcmFsIHN0cmluZyBjb250YWluaW5nIGEgcGF0dGVybiBvZgorYXR0cmlidXRlIHZhbHVlcy4gIEZvciBleGFtcGxlIHRvIGNyZWF0ZSBhIEdlcnJpdCBncm91cCBuYW1lIGNvbnNpc3Rpbmcgb2YKK0xEQVAgZ3JvdXAgbmFtZSBhbmQgZ3JvdXAgSUQsIHVzZSB0aGUgcGF0dGVybiBgJHtjbn0gKCR7Z2lkTnVtYmVyfSlgLgorKworRGVmYXVsdCBpcyBgY25gLgorCiBbW2xkYXAubG9jYWxVc2VybmFtZVRvTG93ZXJDYXNlXV1sZGFwLmxvY2FsVXNlcm5hbWVUb0xvd2VyQ2FzZTo6CiArCiBDb252ZXJ0cyB0aGUgbG9jYWwgdXNlcm5hbWUsIHRoYXQgaXMgdXNlZCB0byBsb2dpbiBpbnRvIHRoZSBHZXJyaXQKQEAgLTE3MjUsNiArMTg0OSwzOCBAQAogKwogQnkgZGVmYXVsdCwgdW5zZXQvZmFsc2UuCiAKK1tbbGRhcC5hdXRoZW50aWNhdGlvbl1dbGRhcC5hdXRoZW50aWNhdGlvbjo6CisrCitEZWZpbmVzIGhvdyBHZXJyaXQgYXV0aGVudGljYXRlcyB3aXRoIHRoZSBzZXJ2ZXIuIFdoZW4gc2V0IHRvIGBHU1NBUElgCitHZXJyaXQgd2lsbCB1c2UgS2VyYmVyb3MuIFRvIHVzZSBrZXJiZXJvcyB0aGUKK2BqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnYCBzeXN0ZW0gcHJvcGVydHkgbXVzdCBwb2ludCB0byBhCitsb2dpbiB0byBhIEpBQVMgY29uZmlndXJhdGlvbiBmaWxlIGFuZCwgaWYgSmF2YSA2IGlzIHVzZWQsIHRoZSBzeXN0ZW0KK3Byb3BlcnR5IGBqYXZhLnNlY3VyaXR5LmtyYjUuY29uZmAgbXVzdCBwb2ludCB0byB0aGUgYXBwcm9wcmlhdGUKK2tyYjUuaW5pIGZpbGUgd2l0aCByZWZlcmVuY2VzIHRvIHRoZSBLREMuCisKK1R5cGljYWwgamFhcy5jb25mLgorCistLS0tCitLZXJiZXJvc0xvZ2luIHsKKyAgICBjb20uc3VuLnNlY3VyaXR5LmF1dGgubW9kdWxlLktyYjVMb2dpbk1vZHVsZQorICAgICAgICAgICAgcmVxdWlyZWQKKyAgICAgICAgICAgIHVzZVRpY2tldENhY2hlPXRydWUKKyAgICAgICAgICAgIGRvTm90UHJvbXB0PXRydWUKKyAgICAgICAgICAgIHJlbmV3VEdUPXRydWU7Cit9OworLS0tLQorCitTZWUgSmF2YSBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBjcmVhdGUgdGhlIGtyYjUuaW5pIGZpbGUuCisKK05vdGUgdGhlIGByZW5ld1RHVGAgcHJvcGVydHkgdG8gbWFrZSBzdXJlIHRoZSBUR1QgZG9lcyBub3QgZXhwaXJlLAorYW5kIGB1c2VUaWNrZXRDYWNoZWAgdG8gdXNlIHRoZSBUR1Qgc3VwcGxpZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIEFzCit0aGUgd2hvbGUgcG9pbnQgb2YgdXNpbmcgR1NTQVBJIGlzIHRvIGhhdmUgcGFzc3dvcmRsZXNzIGF1dGhlbnRpY2F0aW9uCit0byB0aGUgTERBUCBzZXJ2aWNlLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhcXVpcmUgYSBuZXcgVEdUIG9uIGl0cyBvd24uCisKK09uIFdpbmRvd3Mgc2VydmVycyB0aGUgcmVnaXN0cnkga2V5IGBIS0VZX0xPQ0FMX01BQ0hJTkVcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XENvbnRyb2xcTHNhXEtlcmJlcm9zXFBhcmFtZXRlcnNgCittdXN0IGhhdmUgdGhlIERXT1JEIHZhbHVlIGBhbGxvd3RndHNlc3Npb25rZXlgIHNldCB0byAxIGFuZCB0aGUgYWNjb3VudCBtdXN0IG5vdAoraGF2ZSBsb2NhbCBhZG1pbmlzdHJhdG9yIHByaXZpbGVnZXMuCisKIFtbbWltZXR5cGVdXVNlY3Rpb24gbWltZXR5cGUKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIApAQCAtMTgxMCw2ICsxOTY2LDM0IEBACiAgIG1heE9iamVjdFNpemVMaW1pdCA9IDQwIG0KIC0tLS0KIAorW1tyZWNlaXZlLmNoZWNrTWFnaWNSZWZzXV1yZWNlaXZlLmNoZWNrTWFnaWNSZWZzOjoKKysKK0lmIHRydWUsIEdlcnJpdCB3aWxsIHZlcmlmeSB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeSBoYXMKK25vIHJlZmVyZW5jZXMgdW5kZXIgdGhlIG1hZ2ljICdyZWZzL2RyYWZ0cycsICdyZWZzL2ZvcicsIG9yCisncmVmcy9wdWJsaXNoJyBicmFuY2ggbmFtZXNwYWNlcy4gTmFtZXMgdW5kZXIgdGhlc2UgbG9jYXRpb25zCitjb25mdXNlIGNsaWVudHMgd2hlbiB0cnlpbmcgdG8gdXBsb2FkIGNvZGUgcmV2aWV3cyBzbyBHZXJyaXQKK3JlcXVpcmVzIHRoZW0gdG8gYmUgZW1wdHkuCisrCitJZiBmYWxzZSBHZXJyaXQgc2tpcHMgdGhlIHNhbml0eSBjaGVjayBhbmQgYXNzdW1lcyBhZG1pbmlzdHJhdG9ycworaGF2ZSBlbnN1cmVkIHRoZSByZXBvc2l0b3J5IGRvZXMgbm90IGNvbnRhaW4gYW55IG1hZ2ljIHJlZmVyZW5jZXMuCitTZXR0aW5nIHRvIGZhbHNlIHRvIHNraXAgdGhlIGNoZWNrIGNhbiBkZWNyZWFzZSBsYXRlbmN5IGR1cmluZyBwdXNoLgorKworRGVmYXVsdCBpcyB0cnVlLgorCitbW3JlY2VpdmUuY2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZV1dcmVjZWl2ZS5jaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlOjoKKysKK0lmIHNldCB0byB0cnVlLCBHZXJyaXQgd2lsbCB2YWxpZGF0ZSB0aGF0IGFsbCByZWZlcmVuY2VkIG9iamVjdHMgdGhhdAorYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVjZWl2ZWQgcGFjayBhcmUgcmVhY2hhYmxlIGJ5IHRoZSB1c2VyLgorKworQ2Fycnlpbmcgb3V0IHRoaXMgY2hlY2sgb24gZ2l0cyB3aXRoIG1hbnkgcmVmcyBhbmQgY29tbWl0cyBjYW4gYmUgYQordmVyeSBDUFUtaGVhdnkgb3BlcmF0aW9uLiBGb3Igbm9uIHB1YmxpYyBHZXJyaXQtc2VydmVycyB0aGlzIGNoZWNrIG1heQorYmUgb3ZlcmtpbGwuCisrCitPbmx5IGRpc2FibGUgdGhpcyBjaGVjayBpZiB5b3UgdHJ1c3QgdGhlIGNsaWVudHMgbm90IHRvIGZvcmdlIFNIQTEKK3JlZmVyZW5jZXMgdG8gYWNjZXNzIGNvbW1pdHMgaW50ZW5kZWQgdG8gYmUgaGlkZGVuIGZyb20gdGhlIHVzZXIuCisrCitEZWZhdWx0IGlzIHRydWUuCisKIFtbcmVjZWl2ZS5hbGxvd0dyb3VwXV1yZWNlaXZlLmFsbG93R3JvdXA6OgogKwogTmFtZSBvZiB0aGUgZ3JvdXBzIG9mIHVzZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gZXhlY3V0ZQpAQCAtMTgzOSw2ICsyMDIzLDE4IEBACiArCiBEZWZhdWx0cyB0byB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBDUFVzIGFjY29yZGluZyB0byB0aGUgSmF2YSBydW50aW1lLgogCitbW3JlY2VpdmUuY2hhbmdlVXBkYXRlVGhyZWFkc11dcmVjZWl2ZS5jaGFuZ2VVcGRhdGVUaHJlYWRzOjoKKysKK051bWJlciBvZiB0aHJlYWRzIHRvIHBlcmZvcm0gY2hhbmdlIGNyZWF0aW9uIG9yIHBhdGNoIHNldCB1cGRhdGVzCitjb25jdXJyZW50bHkuIEVhY2ggdGhyZWFkIHVzZXMgaXRzIG93biBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20KK3RoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wsIGFuZCBpZiBhbGwgdGhyZWFkcyBhcmUgYnVzeSB0aGVuCittYWluIHJlY2VpdmUgdGhyZWFkIHdpbGwgYWxzbyBwZXJmb3JtIGEgY2hhbmdlIGNyZWF0aW9uIG9yIHBhdGNoCitzZXQgdXBkYXRlLgorKworRGVmYXVsdHMgdG8gMSwgdXNpbmcgb25seSB0aGUgbWFpbiByZWNlaXZlIHRocmVhZC4gVGhpcyBmZWF0dXJlIGlzIGZvcgorZGF0YWJhc2VzIHdpdGggdmVyeSBoaWdoIGxhdGVuY3kgdGhhdCBjYW4gYmVuZml0IGZyb20gY29uY3VycmVudAorb3BlcmF0aW9ucyB3aGVuIG11bHRpcGxlIGNoYW5nZXMgYXJlIGltcGFjdGVkIGF0IG9uY2UuCisKIFtbcmVjZWl2ZS50aW1lb3V0XV1yZWNlaXZlLnRpbWVvdXQ6OgogKwogT3ZlcmFsbCB0aW1lb3V0IG9uIHRoZSB0aW1lIHRha2VuIHRvIHByb2Nlc3MgdGhlIGNoYW5nZSBkYXRhIGluCkBAIC0xOTc4LDkgKzIxNzQsMTAgQEAKIAogW1tzZW5kZW1haWwuaW5jbHVkZURpZmZdXXNlbmRlbWFpbC5pbmNsdWRlRGlmZjo6CiArCi1JZiB0cnVlLCBuZXcgY2hhbmdlIGVtYWlscyBmcm9tIEdlcnJpdCB3aWxsIGluY2x1ZGUgdGhlIGNvbXBsZXRlCi11bmlmaWVkIGRpZmYgb2YgdGhlIGNoYW5nZS4gVmFyaWFibGUgbWF4bWltdW1EaWZmU2l6ZSBwbGFjZXMgYW4gdXBwZXIKLWxpbWl0IG9uIGhvdyBsYXJnZSB0aGUgZW1haWwgY2FuIGdldCB3aGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQuCitJZiB0cnVlLCBuZXcgY2hhbmdlIGVtYWlscyBhbmQgbWVyZ2VkIGNoYW5nZSBlbWFpbHMgZnJvbSBHZXJyaXQKK3dpbGwgaW5jbHVkZSB0aGUgY29tcGxldGUgdW5pZmllZCBkaWZmIG9mIHRoZSBjaGFuZ2UuCitWYXJpYWJsZSBtYXhtaW11bURpZmZTaXplIHBsYWNlcyBhbiB1cHBlciBsaW1pdCBvbiBob3cgbGFyZ2UgdGhlCitlbWFpbCBjYW4gZ2V0IHdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZC4KICsKIEJ5IGRlZmF1bHQsIGZhbHNlLgogCkBAIC0yMTkzLDYgKzIzOTAsMjAgQEAKICsKIEJ5IGRlZmF1bHQsIDIgbWludXRlcy4KIAorW1tzc2hkLmlkbGVUaW1lb3V0XV1zc2hkLmlkbGVUaW1lb3V0OjoKKysKK1RpbWUgaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgc2VydmVyIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlcyBpZGxlCitjb25uZWN0aW9ucyAob3IgMCB0byBkaXNhYmxlIGNsb3Npbmcgb2YgaWRsZSBjb25uZWN0aW9ucykuICBWYWx1ZXMKK3Nob3VsZCB1c2UgY29tbW9uIHVuaXQgc3VmZml4ZXMgdG8gZXhwcmVzcyB0aGVpciBzZXR0aW5nOgorKworKiBzLCBzZWMsIHNlY29uZCwgc2Vjb25kcworKiBtLCBtaW4sIG1pbnV0ZSwgbWludXRlcworKiBoLCBociwgaG91ciwgaG91cnMKKyogZCwgZGF5LCBkYXlzCisKKysKK0J5IGRlZmF1bHQsIDAuCisKIFtbc3NoZC5tYXhDb25uZWN0aW9uc1BlclVzZXJdXXNzaGQubWF4Q29ubmVjdGlvbnNQZXJVc2VyOjoKICsKIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgU1NIIHNlc3Npb25zIHRoYXQgYSB1c2VyIGFjY291bnQKQEAgLTIyNDgsNiArMjQ1OSwxMyBAQAogTmV3IGNvbmZpZ3VyYXRpb25zIHNob3VsZCBwcmVmZXIgdGhlIGJvb2xlYW4gdmFsdWUgZm9yIHRoaXMgZmllbGQKIGFuZCBhbiBlbnVtIHZhbHVlIGZvciBgYWNjb3VudHMudmlzaWJpbGl0eWAuCiAKK1tbc3VnZ2VzdC5mcm9tXV1zdWdnZXN0LmZyb206OgorKworVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgYSB1c2VyIG11c3QgaGF2ZSB0eXBlZCBiZWZvcmUgc3VnZ2VzdGlvbnMKK2FyZSBwcm92aWRlZC4gSWYgc2V0IHRvIDAsIHN1Z2dlc3Rpb25zIGFyZSBhbHdheXMgcHJvdmlkZWQuCisrCitCeSBkZWZhdWx0IDAuCisKIFtbdGhlbWVdXSBTZWN0aW9uIHRoZW1lCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0yMjU3LDE0ICsyNDc1LDE1IEBACiBvcGVuIGNoYW5nZXMgdGFibGUgb3IgdGhlIGFjY291bnQgZGFzaGJvYXJkLiBUaGUgdmFsdWUgbXVzdCBiZSBhCiB2YWxpZCBIVE1MIGhleCBjb2xvciBjb2RlLCBvciBzdGFuZGFyZCBjb2xvciBuYW1lLgogKwotQnkgZGVmYXVsdCBgRkNGRUVGYCAoYSBjcmVtZSBjb2xvcikgZm9yIHNpZ25lZC1vdXQgdGhlbWUgYW5kIHdoaXRlCi0oYEZGRkZGRmApIGZvciBzaWduZWQtaW4gdGhlbWUuCitCeSBkZWZhdWx0IHdoaXRlLCBgRkZGRkZGYC4KIAogW1t0aGVtZS50b3BNZW51Q29sb3JdXXRoZW1lLnRvcE1lbnVDb2xvcjo6CiArCiBUaGlzIGlzIHRoZSBjb2xvciBvZiB0aGUgbWFpbiBtZW51IGJhciBhdCB0aGUgdG9wIG9mIHRoZSBwYWdlLgogVGhlIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVE1MIGhleCBjb2xvciBjb2RlLCBvciBzdGFuZGFyZCBjb2xvcgotbmFtZS4gIFRoZSB2YWx1ZSBkZWZhdWx0cyB0byA8PHRoZW1lLnRyaW1Db2xvcix0cmltQ29sb3I+Pi4KK25hbWUuCisrCitCeSBkZWZhdWx0IHdoaXRlLCBgRkZGRkZGYC4KIAogW1t0aGVtZS50ZXh0Q29sb3JdXXRoZW1lLnRleHRDb2xvcjo6CiArCkBAIC0yMjcyLDcgKzI0OTEsNyBAQAogb3BlbiBjaGFuZ2VzIHRhYmxlIG9yIHRoZSBhY2NvdW50IGRhc2hib2FyZC4gVGhlIHZhbHVlIG11c3QgYmUgYQogdmFsaWQgSFRNTCBoZXggY29sb3IgY29kZSwgb3Igc3RhbmRhcmQgY29sb3IgbmFtZS4KICsKLUJ5IGRlZmF1bHQgYmxhY2ssIGAwMDAwMDBgLgorQnkgZGVmYXVsdCBkYXJrIGdyZXksIGAzNTM1MzVgLgogCiBbW3RoZW1lLnRyaW1Db2xvcl1ddGhlbWUudHJpbUNvbG9yOjoKICsKQEAgLTIyODIsNyArMjUwMSw3IEBACiBvZiB0aGUgcGFnZS4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRNTCBoZXggY29sb3IgY29kZSwgb3IKIHN0YW5kYXJkIGNvbG9yIG5hbWUuCiArCi1CeSBkZWZhdWx0IGEgc2hhZGUgb2YgZ3JlZW4sIGBENEU5QTlgLgorQnkgZGVmYXVsdCBhIGxpZ2h0IGdyZXksIGBFRUVFRUVgLgogCiBbW3RoZW1lLnNlbGVjdGlvbkNvbG9yXV10aGVtZS5zZWxlY3Rpb25Db2xvcjo6CiArCkBAIC0yMjkxLDcgKzI1MTAsNyBAQAogY3VycmVudGx5IHNlbGVjdGVkIHJvdy4gIFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRNTCBoZXggY29sb3IKIGNvZGUsIG9yIHN0YW5kYXJkIGNvbG9yIG5hbWUuCiArCi1CeSBkZWZhdWx0IGEgc2hhZGUgb2YgeWVsbG93LCBgRkZGRkNDYC4KK0J5IGRlZmF1bHQgYSBwYWxlIGJsdWUsIGBEOEVERjlgLgogCiBbW3RoZW1lLmNoYW5nZVRhYmxlT3V0ZGF0ZWRDb2xvcl1ddGhlbWUuY2hhbmdlVGFibGVPdXRkYXRlZENvbG9yOjoKICsKQEAgLTIzNzAsNyArMjU4OSw3IEBACiBleHRlcm5hbCB0cmFja2luZyBpZCBwYXJ0IG9mIHRoZSBmb290ZXIgbGluZS4gVGhlIG1hdGNoIGNhbgogcmVzdWx0IGluIHNldmVyYWwgZW50cmllcyBpbiB0aGUgREIuICBJZiBncm91cGluZyBpcyB1c2VkIGluIHRoZQogcmVnZXggdGhlIGZpcnN0IGdyb3VwIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIHRyYWNraW5nIGlkLgotVHJhY2tpbmcgaWRzIGxvbmdlciB0aGFuIDIwIGNoYXJhY3RlcnMgd2lsbCBiZSBpZ25vcmVkLgorVHJhY2tpbmcgaWRzIGxvbmdlciB0aGFuIDMyIGNoYXJhY3RlcnMgd2lsbCBiZSBpZ25vcmVkLgogKwogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzZXIgZWF0cyBvbmUgbGV2ZWwgb2YgYmFja3NsYXNoZXMsIHNvIHRoZQogY2hhcmFjdGVyIGNsYXNzIGBcc2AgcmVxdWlyZXMgYFxcc2AgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctZ2l0d2ViLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLWdpdHdlYi50eHQKaW5kZXggMzVkNWMwZC4uZTVlZGRhOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jb25maWctZ2l0d2ViLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy1naXR3ZWIudHh0CkBAIC0xLDEzICsxLDEyIEBACi1HZXJyaXQgQ29kZSBSZXZpZXcgLSBHaXR3ZWIgSW50ZWdyYXRpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorR2l0d2ViIEludGVncmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0KIAogR2Vycml0IENvZGUgUmV2aWV3IGNhbiBtYW5hZ2UgYW5kIGdlbmVyYXRlIGh5cGVybGlua3MgdG8gZ2l0d2ViLAogYWxsb3dpbmcgdXNlcnMgdG8ganVtcCBmcm9tIEdlcnJpdCBjb250ZW50IHRvIHRoZSBzYW1lIGluZm9ybWF0aW9uLAogYnV0IHNob3duIGJ5IGdpdHdlYi4KIAotCiBJbnRlcm5hbC9NYW5hZ2VkIGdpdHdlYgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKIEluIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uLCBHZXJyaXQgaW5zcGVjdHMgdGhlIHJlcXVlc3QsIGVuZm9yY2VzCiBpdHMgcHJvamVjdCBsZXZlbCBhY2Nlc3MgY29udHJvbHMsIGFuZCBkaXJlY3RseSBleGVjdXRlcyBgZ2l0d2ViLmNnaWAKQEAgLTM5LDcgKzM4LDcgQEAKIGJlIHJlc3RhcnRlZCBhbmQgY2xpZW50cyBtdXN0IHJlbG9hZCB0aGUgaG9zdCBwYWdlIHRvIHNlZSB0aGUgY2hhbmdlLgogCiBDb25maWd1cmF0aW9uCi1+fn5+fn5+fn5+fn5+CiteXl5eXl5eXl5eXl5eCiAKIE1vc3Qgb2YgdGhlIGdpdHdlYiBjb25maWd1cmF0aW9uIGZpbGUgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5CiBieSBHZXJyaXQgQ29kZSBSZXZpZXcuICBTaXRlIHNwZWNpZmljIG92ZXJyaWRlcyBjYW4gYmUgcGxhY2VkIGluCkBAIC00Nyw3ICs0Niw3IEBACiBwYXJ0IG9mIHRoZSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbiBmaWxlLgogCiBMb2dvIGFuZCBDU1MKLX5+fn5+fn5+fn5+fgorXl5eXl5eXl5eXl5eCiAKIElmIHRoZSBwYWNrYWdlLW1hbmFnZXIgaW5zdGFsbGVkIENHSSAoYC91c3IvbGliL2NnaS1iaW4vZ2l0d2ViLmNnaWApCiBpcyBiZWluZyB1c2VkLCB0aGUgc3RvY2sgQ1NTIGFuZCBsb2dvIGZpbGVzIHdpbGwgYmUgc2VydmVkIGZyb20KQEAgLTU4LDE3ICs1NywxNjUgQEAKIHRoZSBkZWZhdWx0IHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbiwgYW5kIG1vc3QgY3VzdG9tIGluc3RhbGxhdGlvbnMuCiAKIEFjY2VzcyBDb250cm9sCi1+fn5+fn5+fn5+fn5+fgorXl5eXl5eXl5eXl5eXl4KIAogQWNjZXNzIGNvbnRyb2xzIGZvciBpbnRlcm5hbGx5IG1hbmFnZWQgZ2l0d2ViIHBhZ2Ugdmlld3MgYXJlIGVuZm9yY2VkCiB1c2luZyB0aGUgc3RhbmRhcmQgcHJvamVjdCBSRUFEICsxIHBlcm1pc3Npb24uCiAKLQogRXh0ZXJuYWwvVW5tYW5hZ2VkIGdpdHdlYgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCi1JbiB0aGUgZXh0ZXJuYWwgY29uZmlndXJhdGlvbiwgZ2l0d2ViIHJ1bnMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgYW4KLWV4dGVybmFsIHdlYiBzZXJ2ZXIsIGFuZCBHZXJyaXQgYWNjZXNzIGNvbnRyb2xzIGFyZSBub3QgZW5mb3JjZWQuCitGb3IgdGhlIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24sIGdpdHdlYiBydW5zIHVuZGVyIHRoZSBjb250cm9sIG9mIGFuCitleHRlcm5hbCB3ZWIgc2VydmVyLCBhbmQgR2Vycml0IGFjY2VzcyBjb250cm9scyBhcmUgbm90IGVuZm9yY2VkLiBHZXJyaXQKK3Byb3ZpZGVzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgaW50ZWdyYXRpb24gd2l0aCBHaXRXZWIuCisKK1tbbGludXhHaXRXZWJdXQorTGludXggSW5zdGFsbGF0aW9uCiteXl5eXl5eXl5eXl5eXl5eXl4KKworSW5zdGFsbCBHaXRXZWIKKysrKysrKysrKysrKysrCisKK09uIFVidW50dToKKworPT09PQorICBzdWRvIGFwdC1nZXQgaW5zdGFsbCBnaXR3ZWIKKz09PT0KKworV2l0aCBZdW06CisKKz09PT0KKyAgJCB5dW0gaW5zdGFsbCBnaXR3ZWIKKz09PT0KKworQ29uZmlndXJlIEdpdFdlYgorKysrKysrKysrKysrKysrKworCisKK1VwZGF0ZSBgL2V0Yy9naXR3ZWIuY29uZmAsIGFkZCB0aGUgcHVibGljIEdJVCByZXBvc2l0b3JpZXM6CisKKy0tLS0KKyRwcm9qZWN0cm9vdCA9ICIvdmFyL3d3dy9yZXBvLyI7CisKKyMgZGlyZWN0b3J5IHRvIHVzZSBmb3IgdGVtcCBmaWxlcworJGdpdF90ZW1wID0gIi90bXAiOworCisjIHRhcmdldCBvZiB0aGUgaG9tZSBsaW5rIG9uIHRvcCBvZiBhbGwgcGFnZXMKKyMkaG9tZV9saW5rID0gJG15X3VyaSB8fCAiLyI7CisKKyMgaHRtbCB0ZXh0IHRvIGluY2x1ZGUgYXQgaG9tZSBwYWdlCiskaG9tZV90ZXh0ID0gImluZGV4dGV4dC5odG1sIjsKKworIyBmaWxlIHdpdGggcHJvamVjdCBsaXN0OyBieSBkZWZhdWx0LCBzaW1wbHkgc2NhbiB0aGUgcHJvamVjdHJvb3QgZGlyLgorJHByb2plY3RzX2xpc3QgPSAkcHJvamVjdHJvb3Q7CisKKyMgc3R5bGVzaGVldCB0byB1c2UKKyMgSSB0b29rIG9mZiB0aGUgcHJlZml4IC8gb2YgdGhlIGZvbGxvd2luZyBwYXRoIHRvIHB1dCB0aGVzZSBmaWxlcyBpbnNpZGUgZ2l0d2ViIGRpcmVjdG9yeSBkaXJlY3RseQorJHN0eWxlc2hlZXQgPSAiZ2l0d2ViLmNzcyI7CisKKyMgbG9nbyB0byB1c2UKKyRsb2dvID0gImdpdC1sb2dvLnBuZyI7CisKKyMgdGhlIJFmYXZpY29ukgorJGZhdmljb24gPSAiZ2l0LWZhdmljb24ucG5nIjsKKy0tLS0KKworQ29uZmlndXJlICYgUmVzdGFydCBBcGFjaGUgV2ViIFNlcnZlcgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitDb25maWd1cmUgQXBhY2hlCisrKysrKysrKysrKysrKysrCisKKworTGluayBnaXR3ZWIgdG8gYC92YXIvd3d3L2dpdHdlYmAsIGNoZWNrIGAvZXRjL2dpdHdlYi5jb25mYCBpZiB1bnN1cmUgb2YgcGF0aHM6CisKKz09PT0KKyAgJCBzdWRvIGxuIC1zIC91c3Ivc2hhcmUvZ2l0d2ViIC92YXIvd3d3L2dpdHdlYgorPT09PQorCitBZGQgdGhlIGdpdHdlYiBkaXJlY3RvcnkgdG8gdGhlIEFwYWNoZSBjb25maWd1cmF0aW9uIGJ5IGNyZWF0aW5nIGEgImdpdHdlYiIKK2ZpbGUgaW5zaWRlIHRoZSBBcGFjaGUgY29uZi5kIGRpcmVjdG9yeToKKworPT09PQorICAkIHRvdWNoIC9ldGMvYXBhY2hlL2NvbmYuZC9naXR3ZWIKKz09PT0KKworQWRkIHRoZSBmb2xsb3dpbmcgdG8gL2V0Yy9hcGFjaGUvY29uZi5kL2dpdHdlYjoKKworLS0tLQorQWxpYXMgL2dpdHdlYiAvdmFyL3d3dy9naXR3ZWIKKworT3B0aW9ucyBJbmRleGVzIEZvbGxvd1N5bWxpbmtzIEV4ZWNDR0kKK0RpcmVjdG9yeUluZGV4IC9jZ2ktYmluL2dpdHdlYi5jZ2kKK0FsbG93T3ZlcnJpZGUgTm9uZQorLS0tLQorCisqTk9URSogVGhpcyBtYXkgaGF2ZSBhbHJlYWR5IGJlZW4gYWRkZWQgYnkgeXVtL2FwdC1nZXQuIElmIHRoYXQncyB0aGUgY2FzZSwgbGVhdmUgYXMKK2lzLgorCitSZXN0YXJ0IHRoZSBBcGFjaGUgV2ViIFNlcnZlcgorKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKworPT09PQorJCBzdWRvIC9ldGMvaW5pdC5kL2FwYWNoZTIgcmVzdGFydAorPT09PQorCitOb3cgeW91IHNob3VsZCBiZSBhYmxlIHRvIHZpZXcgeW91ciByZXBvc2l0b3J5IHByb2plY3RzIG9ubGluZToKKworbGluazpodHRwOi8vbG9jYWxob3N0L2dpdHdlYltodHRwOi8vbG9jYWxob3N0L2dpdHdlYl0KKworW1tXaW5kb3dzR2l0V2ViXV0KK1dpbmRvd3MgSW5zdGFsbGF0aW9uCiteXl5eXl5eXl5eXl5eXl5eXl5eXgorCitJbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgaW5zdGFsbGluZyB0aGUgR2l0V2ViIG1vZHVsZSBkaXN0cmlidXRlZCB3aXRoCitNc3lzR2l0OgorCitsaW5rOmh0dHBzOi8vZ2l0aHViLmNvbS9tc3lzZ2l0L21zeXNnaXQvd2lraS9HaXRXZWJbR2l0V2ViXQorCitJZiB5b3UgZG9uJ3QgaGF2ZSBBcGFjaGUgaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBhcHByb3ByaWF0ZSBidWlsZCBmb3IKK1dpbmRvd3MgZnJvbSBsaW5rOmh0dHA6Ly93d3cuYXBhY2hlbG91bmdlLmNvbS9kb3dubG9hZFthcGFjaGVsb3VuZ2Uub3JnXS4KKworQWZ0ZXIgeW91IGhhdmUgaW5zdGFsbGVkIEFwYWNoZSwgeW91IHdpbGwgd2FudCB0byBjcmVhdGUgYSBsaW5rOmh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvMi4wL3BsYXRmb3JtL3dpbmRvd3MuaHRtbCN3aW5zdmNbbmV3IHNlcnZpY2UgdXNlcgorYWNjb3VudF0gdG8gdXNlIHdpdGggQXBhY2hlLgorCitJZiB5b3UncmUgc3RpbGwgaGF2aW5nIGRpZmZpY3VsdHkgc2V0dGluZyB1cCBwZXJtaXNzaW9ucywgeW91IG1heSBmaW5kIHRoaXMKK3RlY2ggbm90ZSB1c2VmdWwgZm9yIGNvbmZpZ3VyaW5nIEFwYWNoZSBTZXJ2aWNlIHRvIHJ1biB1bmRlciBhbm90aGVyIGFjY291bnQuCitZb3UgbXVzdCBncmFudCB0aGUgbmV3IGFjY291bnQgbGluazpodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3OTQ5NDQoV1MuMTApLmFzcHhbInJ1biBhcyBzZXJ2aWNlIl0gcGVybWlzc2lvbjoKKworVGhlIEdpdFdlYiB2ZXJzaW9uIGluIG1zeXNnaXQgaXMgbWlzc2luZyBzZXZlcmFsIGltcG9ydGFudCBhbmQgcmVxdWlyZWQKK3BlcmwgbW9kdWxlcywgaW5jbHVkaW5nIENHSS5wbS4gVGhlIHBlcmwgaW5jbHVkZWQgd2l0aCB0aGUgbXN5c2dpdCBkaXN0cm8gMS43LjgKK2lzIGJyb2tlbi4uIFRoZSBsaW5rOmh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9tc3lzZ2l0L2Jyb3dzZV90aHJlYWQvdGhyZWFkL2JhMzUwMWYxZjBlZDk1YWZbdW5pY29yZSBmb2xkZXIgaXMgbWlzc2luZyBhbG9uZyB3aXRoIHV0ZjhfaGVhdnkucGwgYW5kIENHSS5wbV0uIFlvdSBjYW4KK3ZlcmlmeSBieSBjaGVja2luZyBmb3IgcGVybCBtb2R1bGVzLiBGcm9tIGFuIG1zeXMgY29uc29sZSwgZXhlY3V0ZSB0aGUKK2ZvbGxvd2luZyB0byBjaGVjazoKKworPT09PQorJCBwZXJsIC1tQ0dJIC1tRW5jb2RlIC1tRmNudGwgLW1GaWxlOjpGaW5kIC1tRmlsZTo6QmFzZW5hbWUgLWUgIiIKKz09PT0KKworWW91IG1heSBlbmNvdW50ZXIgdGhlIGZvbGxvd2luZyBleGNlcHRpb246CisKKy0tLS0KKyQgcGVybCAtbUNHSSAtbUVuY29kZSAtbUZjbnRsIC1tRmlsZTo6RmluZCAtbUZpbGU6OkJhc2VuYW1lIC1lICIiCitDYW4ndCBsb2NhdGUgQ0dJLnBtIGluIEBJTkMgKEBJTkMgY29udGFpbnM6IC91c3IvbGliL3Blcmw1LzUuOC44L21zeXMKKy91c3IvbGliL3AgZXJsNS81LjguOCAvdXNyL2xpYi9wZXJsNS9zaXRlX3BlcmwvNS44LjgvbXN5cworL3Vzci9saWIvcGVybDUvc2l0ZV9wZXJsLzUuOC44IC91IHNyL2xpYi9wZXJsNS9zaXRlX3BlcmwgLikuIEJFR0lOCitmYWlsZWQtLWNvbXBpbGF0aW9uIGFib3J0ZWQuCistLS0tCisKK0lmIHlvdSdyZSBtaXNzaW5nIENHSS5wbSwgeW91J2xsIGhhdmUgdG8gZGVwbG95IHRoZSBtb2R1bGUgdG8gdGhlIG1zeXMKK2Vudmlyb25tZW50OiBZb3Ugd2lsbCBoYXZlIHRvIHJldHJpZXZlIHRoZW0gZnJvbSB0aGUgNS44LjggZGlzdHJvIG9uIDoKKworaHR0cDovL3N0cmF3YmVycnlwZXJsLmNvbS9yZWxlYXNlcy5odG1sCisKK0ZpbGU6IHN0cmF3YmVycnktcGVybC01LjguOC4zLnppcAorCitjb250ZW50czogYGJpbi9gIGBsaWIvYCBgc2l0ZS9gCisKK2NvcHkgdGhlIGNvbnRlbnRzIG9mIGxpYiBpbnRvIGBtc3lzZ2l0L2xpYi9wZXJsNS81LjguOGAgYW5kIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcy4KKworRW5hYmxlIEdpdFdlYiBJbnRlZ3JhdGlvbgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCiBUbyBlbmFibGUgdGhlIGV4dGVybmFsIGdpdHdlYiBpbnRlZ3JhdGlvbiwgc2V0CiBsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNnaXR3ZWIudXJsW2dpdHdlYi51cmxdIHdpdGggdGhlIFVSTCBvZiB5b3VyCkBAIC03OSwxNiArMjI2LDI3IEBACiBiZWluZyB1c2VkLCBlbnN1cmUgaXQgdXNlcyBhIGZ1bGwgbWlycm9yLCBzbyB0aGUgYHJlZnMvY2hhbmdlcy8qYAogbmFtZXNwYWNlIGlzIGF2YWlsYWJsZS4KIAotPT09PQotICBnaXQgY29uZmlnIC0tZmlsZSAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi51cmwgaHR0cDovL2V4YW1wbGUuY29tL2dpdHdlYi5jZ2kKLSAgZ2l0IGNvbmZpZyAtLWZpbGUgJHNpdGVfcGF0aC9ldGMvZ2Vycml0LmNvbmZpZyAtLXVuc2V0IGdpdHdlYi5jZ2kKLT09PT0KKy0tLS0KKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi5jZ2kgJFBBVEhfVE9fR0lUV0VCL2dpdHdlYi5jZ2kKKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi51cmwgaHR0cHM6Ly9naXR3ZWIuY29ycG9yYXRpb24uY29tCistLS0tCisKK0lmIHlvdSdyZSBub3QgZm9sbG93aW5nIHRoZSB0cmFkaXRpb25hbCBce3Byb2plY3ROYW1lXH0uZ2l0IHByb2plY3QgbmFtaW5nIGNvbnZlbnRpb25zLAoreW91IHdpbGwgd2FudCB0byBjdXN0b21pemUgR2Vycml0IHRvIHJlYWQgdGhlbS4gQWRkIHRoZSBmb2xsb3dpbmc6CisKKy0tLS0KKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi50eXBlIGN1c3RvbQorJCBnaXQgY29uZmlnIC1mICRzaXRlX3BhdGgvZXRjL2dlcnJpdC5jb25maWcgZ2l0d2ViLnByb2plY3QgP3A9XCR7cHJvamVjdH1cO2E9c3VtbWFyeQorJCBnaXQgY29uZmlnIC1mICRzaXRlX3BhdGgvZXRjL2dlcnJpdC5jb25maWcgZ2l0d2ViLnJldmlzaW9uID9wPVwke3Byb2plY3R9XDthPWNvbW1pdFw7aD1cJHtjb21taXR9CiskIGdpdCBjb25maWcgLWYgJHNpdGVfcGF0aC9ldGMvZ2Vycml0LmNvbmZpZyBnaXR3ZWIuYnJhbmNoID9wPVwke3Byb2plY3R9XDthPXNob3J0bG9nXDtoPVwke2JyYW5jaH0KKyQgZ2l0IGNvbmZpZyAtZiAkc2l0ZV9wYXRoL2V0Yy9nZXJyaXQuY29uZmlnIGdpdHdlYi5maWxlaGlzdG9yeSA/cD1cJHtwcm9qZWN0fVw7YT1oaXN0b3J5XDtoYj1cJHticmFuY2h9XDtmPVwke2ZpbGV9CistLS0tCiAKIEFmdGVyIHVwZGF0aW5nIGAnJHNpdGVfcGF0aCcvZXRjL2dlcnJpdC5jb25maWdgLCB0aGUgR2Vycml0IHNlcnZlciBtdXN0CiBiZSByZXN0YXJ0ZWQgYW5kIGNsaWVudHMgbXVzdCByZWxvYWQgdGhlIGhvc3QgcGFnZSB0byBzZWUgdGhlIGNoYW5nZS4KIAogQWNjZXNzIENvbnRyb2wKLX5+fn5+fn5+fn5+fn5+CisrKysrKysrKysrKysrKwogCiBHaXR3ZWIgYWNjZXNzIGNvbnRyb2xzIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZyBzdGFuZGFyZCB3ZWIgc2VydmVyCiBhY2Nlc3MgY29udHJvbHMuICBUaGlzIGlzbid0IHR5cGljYWxseSBpbnRlZ3JhdGVkIHdpdGggR2Vycml0J3Mgb3duCkBAIC05Niw3ICsyNTQsNyBAQAogY29uc2lzdGVudCBpZiBhY2Nlc3MgbmVlZHMgdG8gYmUgcmVzdHJpY3RlZC4KIAogQ2FjaGluZyBHaXR3ZWIKLX5+fn5+fn5+fn5+fn5+CisrKysrKysrKysrKysrKwogCiBJZiB5b3VyIHJlcG9zaXRvcnkgc2V0IGlzIGxhcmdlIGFuZCB5b3UgYXJlIGV4cGVjdGluZyBhIGxvdAogb2YgdXNlcnMsIHlvdSBtYXkgd2FudCB0byBsb29rIGF0IHRoZSBjYWNoaW5nIGZvcmtzIHVzZWQgYnkKQEAgLTExMiw3ICsyNzAsNyBAQAogSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkZWZpbmUgY3VzdG9tIHBhdHRlcm5zLgogCiBTZWUgQWxzbwotLS0tLS0tLS0KK35+fn5+fn5+CiAKICogbGluazpjb25maWctZ2Vycml0Lmh0bWwjZ2l0d2ViW1NlY3Rpb24gZ2l0d2ViXQogKiBsaW5rOmh0dHA6Ly9oamVtbGkubmV0L2dpdC9jZ2l0L1tjZ2l0XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctaG9va3MudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctaG9va3MudHh0CmluZGV4IGRmZGJhNTIuLjEyMzYwNzcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29uZmlnLWhvb2tzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy1ob29rcy50eHQKQEAgLTExLDE1ICsxMSwzMyBAQAogCiBNYWtlIHN1cmUgeW91ciBob29rIHNjcmlwdHMgYXJlIGV4ZWN1dGFibGUgaWYgcnVubmluZyBvbiAqbml4LgogCi1Ib29rcyBhcmUgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIGFmdGVyIHRoZSByZWxldmFudCBjaGFuZ2UgaGFzCi10YWtlbiBwbGFjZSBzbyBhcmUgdW5hYmxlIHRvIGFmZmVjdCB0aGUgb3V0Y29tZSBvZiBhbnkgZ2l2ZW4KLWNoYW5nZS4gQmVjYXVzZSBvZiB0aGUgZmFjdCB0aGUgaG9va3MgYXJlIHJ1biBpbiB0aGUgYmFja2dyb3VuZAotYWZ0ZXIgdGhlIGFjdGl2aXR5LCBhIGhvb2sgbWlnaHQgbm90IGJlIG5vdGlmaWVkIGFib3V0IGFuIGV2ZW50IGlmCi10aGUgc2VydmVyIGlzIHNodXRkb3duIGJlZm9yZSB0aGUgaG9vayBjYW4gYmUgaW52b2tlZC4KK1dpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcmVmLXVwZGF0ZSBob29rLCBob29rcyBhcmUgcnVuIGluIHRoZSBiYWNrZ3JvdW5kCithZnRlciB0aGUgcmVsZXZhbnQgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZSBzbyBhcmUgdW5hYmxlIHRvIGFmZmVjdAordGhlIG91dGNvbWUgb2YgYW55IGdpdmVuIGNoYW5nZS4gQmVjYXVzZSBvZiB0aGUgZmFjdCB0aGUgaG9va3MgYXJlCitydW4gaW4gdGhlIGJhY2tncm91bmQgYWZ0ZXIgdGhlIGFjdGl2aXR5LCBhIGhvb2sgbWlnaHQgbm90IGJlIG5vdGlmaWVkCithYm91dCBhbiBldmVudCBpZiB0aGUgc2VydmVyIGlzIHNodXRkb3duIGJlZm9yZSB0aGUgaG9vayBjYW4gYmUgaW52b2tlZC4KIAogU3VwcG9ydGVkIEhvb2tzCiAtLS0tLS0tLS0tLS0tLS0KIAorcmVmLXVwZGF0ZQorfn5+fn5+fn5+fgorCitUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcHVzaCByZXF1ZXN0IGlzIHJlY2VpdmVkIGJ5IEdlcnJpdC4gSXQgYWxsb3dzCithIHB1c2ggdG8gYmUgcmVqZWN0ZWQgYmVmb3JlIGl0IGlzIGNvbW1pdHRlZCB0byB0aGUgR2Vycml0IHJlcG9zaXRvcnkuCitJZiB0aGUgc2NyaXB0IGV4aXRzIHdpdGggbm9uLXplcm8gcmV0dXJuIGNvZGUgdGhlIHB1c2ggd2lsbCBiZSByZWplY3RlZC4KK0FueSBvdXRwdXQgZnJvbSB0aGUgc2NyaXB0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIsIHJlZ2FyZGxlc3Mgb2YgdGhlCityZXR1cm4gY29kZS4KKworVGhpcyBob29rIGlzIGNhbGxlZCBzeW5jaHJvbm91c2x5IHNvIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQKK2l0IG5vdCBibG9jay4gIEEgZGVmYXVsdCB0aW1lb3V0IG9uIHRoZSBob29rIGlzIHNldCB0byAzMCBzZWNvbmRzIHRvIGF2b2lkCisicnVuYXdheSIgaG9va3MgdXNpbmcgdXAgc2VydmVyIHRocmVhZHMuICBTZWUgbGluazpjb25maWctZ2Vycml0Lmh0bWwjaG9va3Muc3luY0hvb2tUaW1lb3V0W2hvb2tzLnN5bmNIb29rVGltZW91dF0KK2ZvciBjb25maWd1cmF0aW9uIGRldGFpbHMuCisKKz09PT0KKyAgcmVmLXVwZGF0ZSAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1yZWZuYW1lIDxyZWZuYW1lPiAtLXVwbG9hZGVyIDx1cGxvYWRlcj4gLS1vbGRyZXYgPHNoYTE+IC0tbmV3cmV2IDxzaGExPgorPT09PQorCiBwYXRjaHNldC1jcmVhdGVkCiB+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTQ1LDcgKzYzLDcgQEAKIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIGEgY29tbWVudCBpcyBhZGRlZCB0byBhIGNoYW5nZS4KIAogPT09PQotICBjb21tZW50LWFkZGVkIC0tY2hhbmdlIDxjaGFuZ2UgaWQ+IC0tY2hhbmdlLXVybCA8Y2hhbmdlIHVybD4gLS1wcm9qZWN0IDxwcm9qZWN0IG5hbWU+IC0tYnJhbmNoIDxicmFuY2g+IC0tdG9waWMgPHRvcGljPiAtLWF1dGhvciA8Y29tbWVudCBhdXRob3I+IC0tY29tbWl0IDxjb21taXQ+IC0tY29tbWVudCA8Y29tbWVudD4gWy0tPGFwcHJvdmFsIGNhdGVnb3J5IGlkPiA8c2NvcmU+IC0tPGFwcHJvdmFsIGNhdGVnb3J5IGlkPiA8c2NvcmU+IC4uLl0KKyAgY29tbWVudC1hZGRlZCAtLWNoYW5nZSA8Y2hhbmdlIGlkPiAtLWlzLWRyYWZ0IDxib29sZWFuPiAtLWNoYW5nZS11cmwgPGNoYW5nZSB1cmw+IC0tcHJvamVjdCA8cHJvamVjdCBuYW1lPiAtLWJyYW5jaCA8YnJhbmNoPiAtLXRvcGljIDx0b3BpYz4gLS1hdXRob3IgPGNvbW1lbnQgYXV0aG9yPiAtLWNvbW1pdCA8Y29tbWl0PiAtLWNvbW1lbnQgPGNvbW1lbnQ+IFstLTxhcHByb3ZhbCBjYXRlZ29yeSBpZD4gPHNjb3JlPiAtLTxhcHByb3ZhbCBjYXRlZ29yeSBpZD4gPHNjb3JlPiAuLi5dCiA9PT09CiAKIGNoYW5nZS1tZXJnZWQKQEAgLTU3LDYgKzc1LDE1IEBACiAgIGNoYW5nZS1tZXJnZWQgLS1jaGFuZ2UgPGNoYW5nZSBpZD4gLS1jaGFuZ2UtdXJsIDxjaGFuZ2UgdXJsPiAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1icmFuY2ggPGJyYW5jaD4gLS10b3BpYyA8dG9waWM+IC0tc3VibWl0dGVyIDxzdWJtaXR0ZXI+IC0tY29tbWl0IDxzaGExPgogPT09PQogCittZXJnZS1mYWlsZWQKK35+fn5+fn5+fn5+fgorCitDYWxsZWQgd2hlbmV2ZXIgYSBjaGFuZ2UgaGFzIGZhaWxlZCB0byBtZXJnZS4KKworPT09PQorICBtZXJnZS1mYWlsZWQgLS1jaGFuZ2UgPGNoYW5nZSBpZD4gLS1jaGFuZ2UtdXJsIDxjaGFuZ2UgdXJsPiAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1icmFuY2ggPGJyYW5jaD4gLS10b3BpYyA8dG9waWM+IC0tc3VibWl0dGVyIDxzdWJtaXR0ZXI+IC0tY29tbWl0IDxzaGExPiAtLXJlYXNvbiA8cmVhc29uPgorPT09PQorCiBjaGFuZ2UtYWJhbmRvbmVkCiB+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTg0LDYgKzExMSwxNSBAQAogICByZWYtdXBkYXRlZCAtLW9sZHJldiA8b2xkIHJldj4gLS1uZXdyZXYgPG5ldyByZXY+IC0tcmVmbmFtZSA8cmVmIG5hbWU+IC0tcHJvamVjdCA8cHJvamVjdCBuYW1lPiAtLXN1Ym1pdHRlciA8c3VibWl0dGVyPgogPT09PQogCityZXZpZXdlci1hZGRlZAorfn5+fn5+fn5+fn5+fn4KKworQ2FsbGVkIHdoZW5ldmVyIGEgcmV2aWV3ZXIgaXMgYWRkZWQgdG8gYSBjaGFuZ2UuCisKKz09PT0KKyAgcmV2aWV3ZXItYWRkZWQgLS1jaGFuZ2UgPGNoYW5nZSBpZD4gLS1jaGFuZ2UtdXJsIDxjaGFuZ2UgdXJsPiAtLXByb2plY3QgPHByb2plY3QgbmFtZT4gLS1icmFuY2ggPGJyYW5jaD4gLS1yZXZpZXdlciA8cmV2aWV3ZXI+Cis9PT09CisKIGNsYS1zaWduZWQKIH5+fn5+fn5+fn4KIApAQCAtMTA0LDggKzE0MCw4IEBACiAKIEZvciB0aGUgaG9vayBmaWxlbmFtZXMsIEdlcnJpdCB3aWxsIHVzZSB0aGUgdmFsdWVzIG9mIGhvb2tzLnBhdGNoc2V0Q3JlYXRlZEhvb2ssCiBob29rcy5kcmFmdFB1Ymxpc2hlZEhvb2ssIGhvb2tzLmNvbW1lbnRBZGRlZEhvb2ssIGhvb2tzLmNoYW5nZU1lcmdlZEhvb2ssCi1ob29rcy5jaGFuZ2VBYmFuZG9uZWRIb29rLCBob29rcy5jaGFuZ2VSZXN0b3JlZEhvb2ssIGhvb2tzLnJlZlVwZGF0ZWRIb29rIGFuZAotaG9va3MuY2xhU2lnbmVkSG9vay4KK2hvb2tzLmNoYW5nZUFiYW5kb25lZEhvb2ssIGhvb2tzLmNoYW5nZVJlc3RvcmVkSG9vaywgaG9va3MucmVmVXBkYXRlZEhvb2ssCitob29rcy5yZWZVcGRhdGVIb29rLCBob29rcy5yZXZpZXdlckFkZGVkSG9vayBhbmQgaG9va3MuY2xhU2lnbmVkSG9vay4KIAogTWlzc2luZyBDaGFuZ2UgVVJMcwogLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctbGFiZWxzLnR4dCBiL0RvY3VtZW50YXRpb24vY29uZmlnLWxhYmVscy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkN2E5NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWxhYmVscy50eHQKQEAgLTAsMCArMSwyNTUgQEAKK0dlcnJpdCBDb2RlIFJldmlldyAtIFJldmlldyBMYWJlbHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQXMgcGFydCBvZiB0aGUgY29kZSByZXZpZXcgcHJvY2VzcywgcmV2aWV3ZXJzIHNjb3JlIGVhY2ggY2hhbmdlIHdpdGgKK3ZhbHVlcyBmb3IgZWFjaCBsYWJlbCBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC4gIFRoZSBsYWJlbCB2YWx1ZXMgdGhhdAorYSBnaXZlbiB1c2VyIGlzIGFsbG93ZWQgdG8gc2V0IGFyZSBkZWZpbmVkIGFjY29yZGluZyB0byB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXRlZ29yeV9yZXZpZXdfbGFiZWxzW2FjY2VzcyBjb250cm9sc10uICBHZXJyaXQKK2NvbWVzIHByZS1jb25maWd1cmVkIHdpdGggdGhlIENvZGUtUmV2aWV3IGxhYmVsIHRoYXQgY2FuIGJlIGdyYW50ZWQgdG8KK2dyb3VwcyB3aXRoaW4gcHJvamVjdHMsIGVuYWJsaW5nIGZ1bmN0aW9uYWxpdHkgZm9yIHRoYXQgZ3JvdXAncyBtZW1iZXJzLgorCisKK1tbbGFiZWxfQ29kZS1SZXZpZXddXQorTGFiZWw6IENvZGUtUmV2aWV3CistLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGNvZGUgcmV2aWV3IGxhYmVsIGlzIHRoZSBzZWNvbmQgb2YgdHdvIGRlZmF1bHQgbGFiZWxzIHRoYXQgaXMKK2NvbmZpZ3VyZWQgdXBvbiB0aGUgY3JlYXRpb24gb2YgYSBHZXJyaXQgaW5zdGFuY2UuICBJdCBtYXkgaGF2ZSBhbnkKK21lYW5pbmcgdGhlIHByb2plY3QgZGVzaXJlcy4gIEl0IHdhcyBvcmlnaW5hbGx5IGludmVudGVkIGJ5IHRoZSBBbmRyb2lkCitPcGVuIFNvdXJjZSBQcm9qZWN0IHRvIG1lYW4gJ0kgcmVhZCB0aGUgY29kZSBhbmQgaXQgc2VlbXMgcmVhc29uYWJseQorY29ycmVjdCcuCisKK1RoZSByYW5nZSBvZiB2YWx1ZXMgaXM6CisKKyogLTIgRG8gbm90IHN1Ym1pdAorKworVGhlIGNvZGUgaXMgc28gaG9ycmlibHkgaW5jb3JyZWN0L2J1Z2d5L2Jyb2tlbiB0aGF0IGl0IG11c3Qgbm90IGJlCitzdWJtaXR0ZWQgdG8gdGhpcyBwcm9qZWN0LCBvciB0byB0aGlzIGJyYW5jaC4gIFRoaXMgdmFsdWUgaXMgdmFsaWQKK2Fjcm9zcyBhbGwgcGF0Y2ggc2V0cyBpbiB0aGUgc2FtZSBjaGFuZ2UsIGkuZS4gdGhlIHJldmlld2VyIG11c3QKK2FjdGl2ZWx5IGNoYW5nZSBoaXMvaGVyIHJldmlldyB0byBzb21ldGhpbmcgZWxzZSBiZWZvcmUgdGhlIGNoYW5nZQoraXMgc3VibWl0dGFibGUuCisrCisqQW55IC0yIGJsb2NrcyBzdWJtaXQuKgorCisqIC0xIEkgd291bGQgcHJlZmVyIHRoYXQgeW91IGRpZG4ndCBzdWJtaXQgdGhpcworKworVGhlIGNvZGUgZG9lc24ndCBsb29rIHJpZ2h0LCBvciBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5LCBidXQKK3RoZSByZXZpZXdlciBpcyB3aWxsaW5nIHRvIGxpdmUgd2l0aCBpdCBhcy1pcyBpZiBhbm90aGVyIHJldmlld2VyCithY2NlcHRzIGl0LCBwZXJoYXBzIGJlY2F1c2UgaXQgaXMgYmV0dGVyIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgaW4KK3RoZSBwcm9qZWN0LiAgT2Z0ZW4gdGhpcyBpcyBhbHNvIHVzZWQgYnkgY29udHJpYnV0b3JzIHdobyBkb24ndCBsaWtlCit0aGUgY2hhbmdlLCBidXQgYWxzbyBhcmVuJ3QgcmVzcG9uc2libGUgZm9yIHRoZSBwcm9qZWN0IGxvbmctdGVybQorYW5kIHRodXMgZG9uJ3QgaGF2ZSBmaW5hbCBzYXkgb24gY2hhbmdlIHN1Ym1pc3Npb24uCisrCitEb2VzIG5vdCBibG9jayBzdWJtaXQuCisKKyogMCBObyBzY29yZQorKworRGlkbid0IHRyeSB0byBwZXJmb3JtIHRoZSBjb2RlIHJldmlldyB0YXNrLCBvciBnbGFuY2VkIG92ZXIgaXQgYnV0Citkb24ndCBoYXZlIGFuIGluZm9ybWVkIG9waW5pb24geWV0LgorCisqICsxIExvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlCisrCitUaGUgY29kZSBsb29rcyByaWdodCB0byB0aGlzIHJldmlld2VyLCBidXQgdGhlIHJldmlld2VyIGRvZXNuJ3QKK2hhdmUgYWNjZXNzIHRvIHRoZSBgKzJgIHZhbHVlIGZvciB0aGlzIGNhdGVnb3J5LiAgT2Z0ZW4gdGhpcyBpcwordXNlZCBieSBjb250cmlidXRvcnMgdG8gYSBwcm9qZWN0IHdobyB3ZXJlIGFibGUgdG8gcmV2aWV3IHRoZSBjaGFuZ2UKK2FuZCBsaWtlIHdoYXQgaXQgaXMgZG9pbmcsIGJ1dCBkb24ndCBoYXZlIGZpbmFsIGFwcHJvdmFsIG92ZXIgd2hhdAorZ2V0cyBzdWJtaXR0ZWQuCisKKyogKzIgTG9va3MgZ29vZCB0byBtZSwgYXBwcm92ZWQKKysKK0Jhc2ljYWxseSB0aGUgc2FtZSBhcyBgKzFgLCBidXQgZm9yIHRob3NlIHdobyBoYXZlIGZpbmFsIHNheSBvdmVyCitob3cgdGhlIHByb2plY3Qgd2lsbCBkZXZlbG9wLgorKworKkFueSArMiBlbmFibGVzIHN1Ym1pdC4qCisKK0ZvciBhIGNoYW5nZSB0byBiZSBzdWJtaXR0YWJsZSwgdGhlIGxhdGVzdCBwYXRjaCBzZXQgbXVzdCBoYXZlIGEKK2ArMiBMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZGAgaW4gdGhpcyBjYXRlZ29yeSwgYW5kIG5vCitgLTIgRG8gbm90IHN1Ym1pdGAuICBUaHVzIGAtMmAgb24gYW55IHBhdGNoIHNldCBjYW4gYmxvY2sgYSBzdWJtaXQsCit3aGlsZSBgKzJgIG9uIHRoZSBsYXRlc3QgcGF0Y2ggc2V0IGNhbiBlbmFibGUgaXQuCisKK0lmIGEgR2Vycml0IGluc3RhbGxhdGlvbiBkb2VzIG5vdCB3aXNoIHRvIHVzZSB0aGlzIGxhYmVsIGluIGFueSBwcm9qZWN0LAordGhlIGBbbGFiZWwgIkNvZGUtUmV2aWV3Il1gIHNlY3Rpb24gY2FuIGJlIGRlbGV0ZWQgZnJvbSBgcHJvamVjdC5jb25maWdgCitpbiBgQWxsLVByb2plY3RzYC4KKworSWYgYSBHZXJyaXQgaW5zdGFsbGF0aW9uIG9yIHByb2plY3Qgd2FudHMgdG8gbW9kaWZ5IHRoZSBkZXNjcmlwdGlvbiB0ZXh0Cithc3NvY2lhdGVkIHdpdGggdGhlc2UgbGFiZWwgdmFsdWVzLCB0aGUgdGV4dCBjYW4gYmUgdXBkYXRlZCBpbiB0aGUKK2BsYWJlbC5Db2RlLVJldmlldy52YWx1ZWAgZmllbGRzIGluIGBwcm9qZWN0LmNvbmZpZ2AuCisKK0FkZGl0aW9uYWwgZW50cmllcyBjb3VsZCBiZSBhZGRlZCB0byBgbGFiZWwuQ29kZS1SZXZpZXcudmFsdWVgIHRvCitmdXJ0aGVyIGV4dGVuZCB0aGUgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIHJhbmdlLCBidXQgdGhlcmUgaXMgbGlrZWx5CitsaXR0bGUgdmFsdWUgaW4gZG9pbmcgc28gYXMgdGhpcyBvbmx5IGV4cGFuZHMgdGhlIG1pZGRsZSByZWdpb24uICBUaGlzCitsYWJlbCBpcyBhIGBNYXhXaXRoQmxvY2tgIHR5cGUsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGxvd2VzdCBuZWdhdGl2ZQordmFsdWUgaWYgcHJlc2VudCBibG9ja3MgYSBzdWJtaXQsIHdoaWxlIHRoZSBoaWdoZXN0IHBvc2l0aXZlIHZhbHVlIGlzCityZXF1aXJlZCB0byBlbmFibGUgc3VibWl0LgorCitbW2xhYmVsX1ZlcmlmaWVkXV0KK0xhYmVsOiBWZXJpZmllZAorLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBWZXJpZmllZCBsYWJlbCB3YXMgb3JpZ2luYWxseSBpbnZlbnRlZCBieSB0aGUgQW5kcm9pZCBPcGVuIFNvdXJjZQorUHJvamVjdCB0byBtZWFuICdjb21waWxlcywgcGFzc2VzIGJhc2ljIHVuaXQgdGVzdHMnLiAgU29tZSBDSSB0b29scworZXhwZWN0IHRvIHVzZSB0aGUgVmVyaWZpZWQgbGFiZWwgdG8gdm90ZSBvbiBhIGNoYW5nZSBhZnRlciBydW5uaW5nLgorCitBZG1pbmlzdHJhdG9ycyBjYW4gaW5zdGFsbCB0aGUgVmVyaWZpZWQgbGFiZWwgYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcKK3RleHQgdG8gYHByb2plY3QuY29uZmlnYDoKKworPT09PQorICBbbGFiZWwgIlZlcmlmaWVkIl0KKyAgICAgIGZ1bmN0aW9uID0gTWF4V2l0aEJsb2NrCisgICAgICB2YWx1ZSA9IC0xIEZhaWxzCisgICAgICB2YWx1ZSA9ICAwIE5vIHNjb3JlCisgICAgICB2YWx1ZSA9ICsxIFZlcmlmaWVkCis9PT09CisKK1RoZSByYW5nZSBvZiB2YWx1ZXMgaXM6CisKKyogLTEgRmFpbHMKKysKK1RyaWVkIHRvIGNvbXBpbGUsIGJ1dCBnb3QgYSBjb21waWxlIGVycm9yLCBvciB0cmllZCB0byBydW4gdGVzdHMsCitidXQgb25lIG9yIG1vcmUgdGVzdHMgZGlkIG5vdCBwYXNzLgorKworKkFueSAtMSBibG9ja3Mgc3VibWl0LioKKworKiAwIE5vIHNjb3JlCisrCitEaWRuJ3QgdHJ5IHRvIHBlcmZvcm0gdGhlIHZlcmlmaWNhdGlvbiB0YXNrcy4KKworKiArMSBWZXJpZmllZAorKworQ29tcGlsZWQgKGFuZCByYW4gdGVzdHMpIHN1Y2Nlc3NmdWxseS4KKysKKypBbnkgKzEgZW5hYmxlcyBzdWJtaXQuKgorCitGb3IgYSBjaGFuZ2UgdG8gYmUgc3VibWl0dGFibGUsIHRoZSBjaGFuZ2UgbXVzdCBoYXZlIGEgYCsxIFZlcmlmaWVkYAoraW4gdGhpcyBsYWJlbCwgYW5kIG5vIGAtMSBGYWlsc2AuICBUaHVzLCBgLTEgRmFpbHNgIGNhbiBibG9jayBhIHN1Ym1pdCwKK3doaWxlIGArMSBWZXJpZmllZGAgZW5hYmxlcyBhIHN1Ym1pdC4KKworQWRkaXRpb25hbCB2YWx1ZXMgY291bGQgYWxzbyBiZSBhZGRlZCB0byB0aGlzIGxhYmVsLCB0byBhbGxvdyBpdCB0bworYmVoYXZlIG1vcmUgbGlrZSBgQ29kZS1SZXZpZXdgIChiZWxvdykuICBBZGQgLTIgYW5kICsyIGVudHJpZXMgdG8gdGhlCitgbGFiZWwuVmVyaWZpZWQudmFsdWVgIGZpZWxkcyBpbiBgcHJvamVjdC5jb25maWdgIHRvIGdldCB0aGUgc2FtZQorYmVoYXZpb3IuCisKKworW1tsYWJlbF9jdXN0b21dXQorWW91ciBMYWJlbCBIZXJlCistLS0tLS0tLS0tLS0tLS0KKworU2l0ZSBhZG1pbmlzdHJhdG9ycyBhbmQgcHJvamVjdCBvd25lcnMgY2FuIGFsc28gZGVmaW5lIHRoZWlyIG93biBsYWJlbHMuCisKK1NlZSBhYm92ZSBmb3IgZGVzY3JpcHRpb25zIG9mIGhvdyA8PGxhYmVsX1ZlcmlmaWVkLGBWZXJpZmllZGA+PgorYW5kIDw8bGFiZWxfQ29kZS1SZXZpZXcsYENvZGUtUmV2aWV3YD4+IHdvcmssIGFuZCBhZGQgeW91ciBvd24KK2xhYmVsIHRvIGBwcm9qZWN0LmNvbmZpZ2AgdG8gZ2V0IHRoZSBzYW1lIGJlaGF2aW9yIG92ZXIgeW91ciBvd24gcmFuZ2UKK29mIHZhbHVlcywgZm9yIGFueSBsYWJlbCB5b3UgZGVzaXJlLgorCitKdXN0IGxpa2UgdGhlIGJ1aWx0LWluIGxhYmVscywgdXNlcnMgbmVlZCB0byBiZSBnaXZlbiBwZXJtaXNzaW9ucyB0bwordm90ZSBvbiBjdXN0b20gbGFiZWxzLiBQZXJtaXNzaW9ucyBjYW4gZWl0aGVyIGJlIGFkZGVkIGJ5IG1hbnVhbGx5CitlZGl0aW5nIHByb2plY3QuY29uZmlnIHdoZW4gYWRkaW5nIHRoZSBsYWJlbHMsIG9yLCBvbmNlIHRoZSBsYWJlbHMgYXJlCithZGRlZCwgcGVybWlzc2lvbiBjYXRlZ29yaWVzIGZvciB0aG9zZSBsYWJlbHMgd2lsbCBzaG93IHVwIGluIHRoZQorcGVybWlzc2lvbiBlZGl0b3Igd2ViIFVJLgorCitMYWJlbHMgbWF5IGJlIGFkZGVkIHRvIGFueSBwcm9qZWN0J3MgYHByb2plY3QuY29uZmlnYDsgdGhlIGRlZmF1bHQKK2xhYmVscyBhcmUgZGVmaW5lZCBpbiBgQWxsLVByb2plY3RzYC4gTGFiZWxzIGFyZSBpbmhlcml0ZWQgZnJvbSBwYXJlbnQKK3Byb2plY3RzOyBhIGNoaWxkIHByb2plY3QgbWF5IGFkZCwgb3ZlcnJpZGUsIG9yIHJlbW92ZSBsYWJlbHMgZGVmaW5lZCBpbgoraXRzIHBhcmVudHMuICBPdmVycmlkaW5nIGEgbGFiZWwgaW4gYSBjaGlsZCBwcm9qZWN0IG92ZXJyaWRlcyBhbGwgaXRzCitwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMuICBUbyByZW1vdmUgYSBsYWJlbCBpbiBhIGNoaWxkIHByb2plY3QsIGFkZCBhbgorZW1wdHkgbGFiZWwgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGluIHRoZSBwYXJlbnQuCisKK0xhYmVscyBhcmUgbGFpZCBvdXQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHNwZWNpZmllZCBpbiBwcm9qZWN0LmNvbmZpZywKK3dpdGggaW5oZXJpdGVkIGxhYmVscyBhcHBlYXJpbmcgZmlyc3QsIHByb3ZpZGluZyBzb21lIGxheW91dCBjb250cm9sIHRvCit0aGUgYWRtaW5pc3RyYXRvci4KKworW1tsYWJlbF9uYW1lXV0KK2BsYWJlbC5MYWJlbC1OYW1lYAorfn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBuYW1lIGZvciBhIGxhYmVsLCBjb25zaXN0aW5nIG9ubHkgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kCitgLWAuCisKKworW1tsYWJlbF92YWx1ZV1dCitgbGFiZWwuTGFiZWwtTmFtZS52YWx1ZWAKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBIG11bHRpLXZhbHVlZCBrZXkgd2hvc2UgdmFsdWVzIGFyZSBvZiB0aGUgZm9ybSBgIjwjPiBWYWx1ZSBkZXNjcmlwdGlvbgordGV4dCJgLiBUaGUgYDwjPmAgbWF5IGJlIGFueSBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBudW1iZXIgd2l0aCBhbgorb3B0aW9uYWwgbGVhZGluZyBgK2AuCisKKworW1tsYWJlbF9hYmJyZXZpYXRpb25dXQorYGxhYmVsLkxhYmVsLU5hbWUuYWJicmV2aWF0aW9uYAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBbiBhYmJyZXZpYXRlZCBuYW1lIGZvciBhIGxhYmVsIHNob3duIGFzIGEgY29tcGFjdCBjb2x1bW4gaGVhZGVyLCBmb3IKK2V4YW1wbGUgb24gcHJvamVjdCBkYXNoYm9hcmRzLiBEZWZhdWx0cyB0byBhbGwgdGhlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzCitpbiB0aGUgbGFiZWwgbmFtZSwgZS5nLiBgTGFiZWwtTmFtZWAgaXMgYWJicmV2aWF0ZWQgYnkgZGVmYXVsdCBhcyBgTE5gLgorCisKK1tbbGFiZWxfZnVuY3Rpb25dXQorYGxhYmVsLkxhYmVsLU5hbWUuZnVuY3Rpb25gCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBmb3IgZXZhbHVhdGluZyBtdWx0aXBsZSB2b3RlcyBmb3IgYSBsYWJlbC4gIFRoaXMKK2Z1bmN0aW9uIGlzIG9ubHkgYXBwbGllZCBpZiB0aGUgZGVmYXVsdCBzdWJtaXQgcnVsZSBpcyB1c2VkIGZvciBhIGxhYmVsLgorSWYgeW91IHdyaXRlIGEgbGluazpwcm9sb2ctY29va2Jvb2suaHRtbCNIb3dUb1dyaXRlU3VibWl0UnVsZXNbY3VzdG9tCitzdWJtaXQgcnVsZV0gKGFuZCBkbyBub3QgY2FsbCB0aGUgZGVmYXVsdCBydWxlKSwgdGhlIGZ1bmN0aW9uIG5hbWUgaXMKK2lnbm9yZWQgYW5kIG1heSBiZSB0cmVhdGVkIGFzIG9wdGlvbmFsLgorCitWYWxpZCB2YWx1ZXMgYXJlOgorCisqIGBNYXhXaXRoQmxvY2tgIChkZWZhdWx0KQorKworVGhlIGxvd2VzdCBwb3NzaWJsZSBuZWdhdGl2ZSB2YWx1ZSwgaWYgcHJlc2VudCwgYmxvY2tzIGEgc3VibWl0LCB3aGlsZQordGhlIGhpZ2hlc3QgcG9zc2libGUgcG9zaXRpdmUgdmFsdWUgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIHN1Ym1pdC4gVGhlcmUKK211c3QgYmUgYXQgbGVhc3Qgb25lIHBvc2l0aXZlIHZhbHVlLCBvciBlbHNlIHN1Ym1pdCB3aWxsIG5ldmVyIGJlCitlbmFibGVkLiBUbyBwZXJtaXQgYmxvY2tpbmcgc3VibWl0cywgZW5zdXJlIGEgbmVnYXRpdmUgdmFsdWUgaXMgZGVmaW5lZC4KKworKiBgTWF4Tm9CbG9ja2AKKysKK1RoZSBoaWdoZXN0IHBvc3NpYmxlIHBvc2l0aXZlIHZhbHVlIGlzIHJlcXVpcmVkIHRvIGVuYWJsZSBzdWJtaXQsIGJ1dAordGhlIGxvd2VzdCBwb3NzaWJsZSBuZWdhdGl2ZSB2YWx1ZSB3aWxsIG5vdCBibG9jayB0aGUgY2hhbmdlLgorCisqIGBOb0Jsb2NrYC9gTm9PcGAKKysKK1RoZSBsYWJlbCBpcyBwdXJlbHkgaW5mb3JtYXRpb25hbCBhbmQgdmFsdWVzIGFyZSBub3QgY29uc2lkZXJlZCB3aGVuCitkZXRlcm1pbmluZyB3aGV0aGVyIGEgY2hhbmdlIGlzIHN1Ym1pdHRhYmxlLgorCisKK1tbbGFiZWxfY29weU1pblNjb3JlXV0KK2BsYWJlbC5MYWJlbC1OYW1lLmNvcHlNaW5TY29yZWAKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgdHJ1ZSwgdGhlIGxvd2VzdCBwb3NzaWJsZSBuZWdhdGl2ZSB2YWx1ZSBmb3IgdGhlIGxhYmVsIGlzIGNvcGllZAorZm9yd2FyZCB3aGVuIGEgbmV3IHBhdGNoIHNldCBpcyB1cGxvYWRlZC4KKworCitbW2xhYmVsX2Nhbk92ZXJyaWRlXV0KK2BsYWJlbC5MYWJlbC1OYW1lLmNhbk92ZXJyaWRlYAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIGZhbHNlLCB0aGUgbGFiZWwgY2Fubm90IGJlIG92ZXJyaWRkZW4gYnkgY2hpbGQgcHJvamVjdHMuIEFueQorY29uZmlndXJhdGlvbiBmb3IgdGhpcyBsYWJlbCBpbiBjaGlsZCBwcm9qZWN0cyB3aWxsIGJlIGlnbm9yZWQuIERlZmF1bHRzCit0byB0cnVlLgorCisKK1tbbGFiZWxfZXhhbXBsZV1dCitFeGFtcGxlCit+fn5+fn5+CisKK1RvIGRlZmluZSBhIG5ldyAzLXZhbHVlZCBjYXRlZ29yeSB0aGF0IGJlaGF2ZXMgZXhhY3RseSBsaWtlIGBWZXJpZmllZGAsCitidXQgaGFzIGRpZmZlcmVudCBuYW1lcy9sYWJlbHM6CisKKz09PT0KKyAgW2xhYmVsICJDb3B5cmlnaHQtQ2hlY2siXQorICAgICAgZnVuY3Rpb24gPSBNYXhXaXRoQmxvY2sKKyAgICAgIHZhbHVlID0gLTEgRG8gbm90IGhhdmUgY29weXJpZ2h0CisgICAgICB2YWx1ZSA9ICAwIE5vIHNjb3JlCisgICAgICB2YWx1ZSA9ICsxIENvcHlyaWdodCBjbGVhcgorPT09PQorCitUaGUgbmV3IGNvbHVtbiB3aWxsIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSwgYW5kIGAtMSBEbyBub3QgaGF2ZQorY29weXJpZ2h0YCB3aWxsIGJsb2NrIHN1Ym1pdCwgd2hpbGUgYCsxIENvcHlyaWdodCBjbGVhcmAgaXMgcmVxdWlyZWQgdG8KK2VuYWJsZSBzdWJtaXQuCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1sb2dpbi1yZWdpc3Rlci50eHQgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy1sb2dpbi1yZWdpc3Rlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlMGZjNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLWxvZ2luLXJlZ2lzdGVyLnR4dApAQCAtMCwwICsxLDEzOCBAQAorW1t1c2Vyc2V0dXBdXQorSW5pdGFsIExvZ2luCistLS0tLS0tLS0tLS0KK0l0J3MgdGltZSB0byBleGl0IHRoZSBnZXJyaXQyIGFjY291bnQgYXMgeW91IG5vdyBoYXZlIEdlcnJpdCBydW5uaW5nIG9uIHlvdXIKK2hvc3QgYW5kIHNldHVwIHlvdXIgZmlyc3Qgd29ya3NwYWNlLgorCitTdGFydCBhIHNoZWxsIHdpdGggdGhlIGNyZWRlbnRpYWxzIG9mIHRoZSBhY2NvdW50IHlvdSB3aWxsIHBlcmZvcm0KK2RldmVsb3BtZW50IHVuZGVyLgorCitDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc3NoIGtleXMgYWxyZWFkeS4gWW91J3JlIGxvb2tpbmcgZm9yIHR3byBmaWxlcywKK2lkX3JzYSBhbmQgaWRfcnNhLnB1Yi4KKworLS0tLQorICB1c2VyQGhvc3Q6fiQgbHMgLnNzaAorICBhdXRob3JpemVkX2tleXMgIGNvbmZpZyAgaWRfcnNhICBpZF9yc2EucHViICBrbm93bl9ob3N0cworICB1c2VyQGhvc3Q6fiQKKy0tLS0KKworSWYgeW91IGhhdmUgdGhlIGZpbGVzLCB5b3UgbWF5IHNraXAgdGhlIGtleSBnZW5lcmF0aW5nIHN0ZXAuCisKK0lmIHlvdSBkb24ndCBzZWUgdGhlIGZpbGVzIGluIHlvdXIgbGlzdGluZywgeW91ciB3aWxsIGhhdmUgdG8gZ2VuZXJhdGUgcnNhCitrZXlzIGZvciB5b3VyIHNzaCBzZXNzaW9uczoKKworU1NIIGtleSBnZW5lcmF0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn4KKworKlBsZWFzZSBkb24ndCBnZW5lcmF0ZSBuZXcga2V5cyBpZiB5b3UgYWxyZWFkeSBoYXZlIGEgdmFsaWQga2V5cGFpciEqCisqVGhleSB3aWxsIGJlIG92ZXJ3cml0dGVuISoKKworLS0tLQorICB1c2VyQGhvc3Q6fiQgc3NoLWtleWdlbiAtdCByc2EKKyAgR2VuZXJhdGluZyBwdWJsaWMvcHJpdmF0ZSByc2Ega2V5IHBhaXIuCisgIEVudGVyIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUga2V5ICgvaG9tZS91c2VyLy5zc2gvaWRfcnNhKToKKyAgQ3JlYXRlZCBkaXJlY3RvcnkgJy9ob21lL3VzZXIvLnNzaCcuCisgIEVudGVyIHBhc3NwaHJhc2UgKGVtcHR5IGZvciBubyBwYXNzcGhyYXNlKToKKyAgRW50ZXIgc2FtZSBwYXNzcGhyYXNlIGFnYWluOgorICBZb3VyIGlkZW50aWZpY2F0aW9uIGhhcyBiZWVuIHNhdmVkIGluIC9ob21lL3VzZXIvLnNzaC9pZF9yc2EuCisgIFlvdXIgcHVibGljIGtleSBoYXMgYmVlbiBzYXZlZCBpbiAvaG9tZS91c2VyLy5zc2gvaWRfcnNhLnB1Yi4KKyAgVGhlIGtleSBmaW5nZXJwcmludCBpczoKKyAgMDA6MTE6MjI6MDA6MTE6MjI6MDA6MTE6NDQ6MDA6MTE6MjI6MDA6MTE6MjI6OTkgdXNlckBob3N0CisgIFRoZSBrZXkncyByYW5kb21hcnQgaW1hZ2UgaXM6CisgICstLVsgUlNBIDIwNDhdLS0tLSsKKyAgfCAgICAgLi4rLio9K29vLipFfAorICB8ICAgICAgdS5Pb0IuLiAuICt8CisgIHwgICAgICAgLi4qLiAgICAgIHwKKyAgfCAgICAgICBvICAgICAgICAgfAorICB8ICAgICAgLiBTIC4uICAgICB8CisgIHwgICAgICAgICAgICAgICAgIHwKKyAgfCAgICAgICAgICAgICAgICAgfAorICB8ICAgICAgICAgIC4uICAgICB8CisgIHwgICAgICAgICAgICAgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tKworICB1c2VyQGhvc3Q6fiQKKy0tLS0KKworUmVnaXN0ZXJpbmcgeW91ciBrZXkgaW4gR2Vycml0Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworT3BlbiBhIGJyb3dzZXIgYW5kIGVudGVyIHRoZSBjYW5vbmljYWwgdXJsIG9mIHlvdXIgR2Vycml0IHNlcnZlci4gIFlvdSBjYW4KK2ZpbmQgdGhlIHVybCBpbiB0aGUgc2V0dGluZ3MgZmlsZS4KKworLS0tLQorICBnZXJyaXQyQGhvc3Q6fiQgZ2l0IGNvbmZpZyAtZiB+L2dlcnJpdF90ZXN0c2l0ZS9ldGMvZ2Vycml0LmNvbmZpZyBnZXJyaXQuY2Fub25pY2FsV2ViVXJsCisgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8KKyAgZ2Vycml0MkBob3N0On4kCistLS0tCisKK1JlZ2lzdGVyIGEgbmV3IGFjY291bnQgaW4gR2Vycml0IHRocm91Z2ggdGhlIHdlYiBpbnRlcmZhY2Ugd2l0aCB0aGUKK2VtYWlsIGFkZHJlc3Mgb2YgeW91ciBjaG9pY2UuCisKK1RoZSBkZWZhdWx0IGF1dGhlbnRpY2F0aW9uIHR5cGUgaXMgT3BlbklELiAgSWYgeW91ciBHZXJyaXQgc2VydmVyIGlzIGJlaGluZCBhCitwcm94eSwgYW5kIHlvdSBhcmUgdXNpbmcgYW4gZXh0ZXJuYWwgT3BlbklEIHByb3ZpZGVyLCB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB0aGUKK3Byb3h5IHNldHRpbmdzIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisKKy0tLS0KKyAgZ2Vycml0MkBob3N0On4kIGdpdCBjb25maWcgLWYgfi9nZXJyaXRfdGVzdHNpdGUvZXRjL2dlcnJpdC5jb25maWcgLS1hZGQgaHR0cC5wcm94eSBodHRwOi8vcHJveHk6ODA4MAorICBnZXJyaXQyQGhvc3Q6fiQgZ2l0IGNvbmZpZyAtZiB+L2dlcnJpdF90ZXN0c2l0ZS9ldGMvZ2Vycml0LmNvbmZpZyAtLWFkZCBodHRwLnByb3h5VXNlcm5hbWUgdXNlcm5hbWUKKyAgZ2Vycml0MkBob3N0On4kIGdpdCBjb25maWcgLWYgfi9nZXJyaXRfdGVzdHNpdGUvZXRjL2dlcnJpdC5jb25maWcgLS1hZGQgaHR0cC5wcm94eVBhc3N3b3JkIHBhc3N3b3JkCistLS0tCisKK1JlZmVyIHRvIHRoZSBHZXJyaXQgY29uZmlndXJhdGlvbiBndWlkZSBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dAorbGluazpjb25maWctZ2Vycml0Lmh0bWwjYXV0aFthdXRoZW50aWNhdGlvbl0gYW5kCitsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNodHRwLnByb3h5W3Byb3h5XSBzZXR0aW5ncy4KKworVGhlIGZpcnN0IHVzZXIgdG8gc2lnbi1pbiBhbmQgcmVnaXN0ZXIgYW4gYWNjb3VudCB3aWxsIGJlCithdXRvbWF0aWNhbGx5IHBsYWNlZCBpbnRvIHRoZSBmdWxseSBwcml2aWxlZ2VkIEFkbWluaXN0cmF0b3JzIGdyb3VwLAorcGVybWl0dGluZyBzZXJ2ZXIgbWFuYWdlbWVudCBvdmVyIHRoZSB3ZWIgYW5kIG92ZXIgU1NILiAgU3Vic2VxdWVudAordXNlcnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgYXMgdW5wcml2aWxlZ2VkIHVzZXJzLgorCitPbmNlIHNpZ25lZCBpbiBhcyB5b3VyIHVzZXIsIHlvdSBmaW5kIGEgbGl0dGxlIHdpemFyZCB0byBnZXQgeW91IHN0YXJ0ZWQuCitUaGUgd2l6YXJkIGhlbHBzIHlvdSBmaWxsIG91dDoKKworKiBSZWFsIG5hbWUgKHZpc2libGUgbmFtZSBpbiBHZXJyaXQpCisqIFJlZ2lzdGVyIHlvdXIgZW1haWwgKGl0IG11c3QgYmUgY29uZmlybWVkIGxhdGVyKQorKiBTZWxlY3QgYSB1c2VybmFtZSB3aXRoIHdoaWNoIHRvIGNvbW11bmljYXRlIHdpdGggR2Vycml0IG92ZXIgc3NoK2dpdAorCisqIFRoZSBzZXJ2ZXIgd2lsbCBhc2sgeW91IGZvciBhbiBSU0EgcHVibGljIGtleS4KK1RoYXQncyB0aGUga2V5IHdlIGdlbmVyYXRlZCBhYm92ZSwgYW5kIGl0J3MgdGltZSB0byBtYWtlIHN1cmUgdGhhdCBHZXJyaXQga25vd3MKK2Fib3V0IG91ciBuZXcga2V5IGFuZCBjYW4gaWRlbnRpZnkgdXMgYnkgaXQuCisKKy0tLS0KKyAgdXNlckBob3N0On4kIGNhdCAuc3NoL2lkX3JzYS5wdWIKKyAgc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkl3QUFBUUVBMWJpZE9kOExBcDdWcDk1TTFiOXorTEdPOTZPRVd6ZEFnQlBmWlBxMDVqVWgKKyAgancwbUlkVXV2ZzVsaHdzd25Oc3ZtbkZoR2JzVW9YWnVpNmpkWGo3eFBVV09EOGZlWDJOTkVqVEFFZVg3RFhPaG5vek5Ba2svWjk4V1VWMkIKKyAgeFVCcWhSaTh2aFZtYUNNOEUrSmtIekFjKzcvSFZZQlR1UFVTN2xZUGJ5NXc5NWdzM3pWeHJYOGQxKytJWGcvdS9GLzQ3elV4aGRhRUxNdzIKKyAgZGVEOFhMaHJOUHgyRlE4M0Z4cmpuVnZFS1FKeUQyT29xeGJDMktjVUdZSi8zZmhpdXBuL1lwblpzbDUrNm1mUXVaUkpFb1ovRkgybjRERUgKKyAgd3pnQkJCYWdCcjBaWkNFa2w3NHM0S0ZacDZKSncvWlNqTVJYc1hYWFd2d2NUcGFVRURpaTcwOEhHdz09IEpvaG4gRG9lQE1BQ0hJTkUKKyAgdXNlckBob3N0On4kCistLS0tCisKK0lNUE9SVEFOVDogUGxlYXNlIHRha2Ugbm90ZSBvZiB0aGUgZXh0cmEgbGluZS1icmVha3MgaW50cm9kdWNlZCBpbiB0aGUga2V5IGFib3ZlCitmb3IgZm9ybWF0dGluZyBwdXJwb3Nlcy4gUGxlYXNlIGJlIHN1cmUgdG8gY29weSBhbmQgcGFzdGUgeW91ciBrZXkgd2l0aG91dAorbGluZS1icmVha3MuCisKK0NvcHkgdGhlIHN0cmluZyBzdGFydGluZyB3aXRoIHNzaC1yc2EgdG8geW91ciBjbGlwYm9hcmQgYW5kIHRoZW4gcGFzdGUgaXQKK2ludG8gdGhlIGJveCBmb3IgUlNBIGtleXMuIE1ha2UgKmFic29sdXRlbHkgc3VyZSogbm8gZXh0cmEgc3BhY2VzIG9yIGxpbmUgZmVlZHMKK2FyZSBlbnRlcmVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIFJTQSBzdHJpbmcuCisKK1ZlcmlmeSB0aGF0IHRoZSBzc2ggY29ubmVjdGlvbiB3b3JrcyBmb3IgeW91LgorCistLS0tCisgIHVzZXJAaG9zdDp+JCBzc2ggdXNlckBsb2NhbGhvc3QgLXAgMjk0MTgKKyAgVGhlIGF1dGhlbnRpY2l0eSBvZiBob3N0ICdbbG9jYWxob3N0XToyOTQxOCAoWzEyNy4wLjAuMV06Mjk0MTgpJyBjYW4ndCBiZSBlc3RhYmxpc2hlZC4KKyAgUlNBIGtleSBmaW5nZXJwcmludCBpcyBkYjowNzozZDpjMjo5NDoyNTpiNTo4ZDphYzpiYzpiNTo5ZToyZjo5NTo1Zjo0YS4KKyAgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlIGNvbm5lY3RpbmcgKHllcy9ubyk/IHllcworICBXYXJuaW5nOiBQZXJtYW5lbnRseSBhZGRlZCAnW2xvY2FsaG9zdF06Mjk0MTgnIChSU0EpIHRvIHRoZSBsaXN0IG9mIGtub3duIGhvc3RzLgorCisgICoqKiogICAgV2VsY29tZSB0byBHZXJyaXQgQ29kZSBSZXZpZXcgICAgKioqKgorCisgIEhpIHVzZXIsIHlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgb3ZlciBTU0guCisKKyAgVW5mb3J0dW5hdGVseSwgaW50ZXJhY3RpdmUgc2hlbGxzIGFyZSBkaXNhYmxlZC4KKyAgVG8gY2xvbmUgYSBob3N0ZWQgR2l0IHJlcG9zaXRvcnksIHVzZToKKworICBnaXQgY2xvbmUgc3NoOi8vdXNlckBsb2NhbGhvc3Q6Mjk0MTgvUkVQT1NJVE9SWV9OQU1FLmdpdAorCisgIHVzZXJAaG9zdDp+JAorLS0tLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29uZmlnLW1haWwudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctbWFpbC50eHQKaW5kZXggYWQwNzA0Zi4uOGRlOGU1OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jb25maWctbWFpbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9jb25maWctbWFpbC50eHQKQEAgLTQ5LDcgKzQ5LDIxIEBACiAKIFRoZSBgQ29tbWVudC52bWAgdGVtcGxhdGUgd2lsbCBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWFpbCByZWxhdGVkIHRvCiBhIHVzZXIgc3VibWl0dGluZyBjb21tZW50cyBvbiBjaGFuZ2VzLiAgSXQgaXMgYSBgQ2hhbmdlRW1haWxgOiBzZWUKLWBDaGFuZ2VTdWJqZWN0LnZtYCBhbmQgYENoYW5nZUZvb3Rlci52bWAuCitgQ2hhbmdlU3ViamVjdC52bWAsIGBDaGFuZ2VGb290ZXIudm1gIGFuZCBgQ29tbWVudEZvb3Rlci52bWAuCisKK0NvbW1lbnRGb290ZXIudm0KK35+fn5+fn5+fn5+fn5+fn4KKworVGhlIGBDb21tZW50Rm9vdGVyLnZtYCB0ZW1wbGF0ZSB3aWxsIGRldGVybWluZSB0aGUgY29udGVudHMgb2YgdGhlIGZvb3RlcgordGV4dCB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgdG8gZW1haWxzIHJlbGF0ZWQgdG8gYSB1c2VyIHN1Ym1pdHRpbmcgY29tbWVudHMgb24KK2NoYW5nZXMuICBTZWUgYENoYW5nZVN1YmplY3Qudm1gLCBgQ29tbWVudC52bWAgYW5kIGBDaGFuZ2VGb290ZXIudm1gLgorCitDb21taXRNZXNzYWdlRWRpdGVkLnZtCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBgQ29tbWl0TWVzc2FnZUVkaXRlZC52bWAgdGVtcGxhdGUgd2lsbCBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWFpbAorcmVsYXRlZCB0byBhIHVzZXIgZWRpdGluZyB0aGUgY29tbWl0IG1lc3NhZ2UgdGhyb3VnaCB0aGUgR2Vycml0IFVJLiAgSXQgaXMgYQorYENoYW5nZUVtYWlsYDogc2VlIGBDaGFuZ2VTdWJqZWN0LnZtYCBhbmQgYENoYW5nZUZvb3Rlci52bWAuCiAKIE1lcmdlZC52bQogfn5+fn5+fn5+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1yZXZlcnNlcHJveHkudHh0IGIvRG9jdW1lbnRhdGlvbi9jb25maWctcmV2ZXJzZXByb3h5LnR4dAppbmRleCA3MTYxYzRhLi4wNjRmZTJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NvbmZpZy1yZXZlcnNlcHJveHkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY29uZmlnLXJldmVyc2Vwcm94eS50eHQKQEAgLTUwLDE0ICs1MCwxOCBAQAogCSAgUHJveHlQcmVzZXJ2ZUhvc3QgT24KIAogCSAgPFByb3h5ICo+Ci0JCU9yZGVyIGRlbnksYWxsb3cKLQkJQWxsb3cgZnJvbSBhbGwKKwkgICAgT3JkZXIgZGVueSxhbGxvdworCSAgICBBbGxvdyBmcm9tIGFsbAogCSAgPC9Qcm94eT4KIAotCSAgUHJveHlQYXNzIC9yLyBodHRwOi8vMTI3LjAuMC4xOjgwODEvci8KKwkgIEFsbG93RW5jb2RlZFNsYXNoZXMgT24KKwkgIFByb3h5UGFzcyAvci8gaHR0cDovLzEyNy4wLjAuMTo4MDgxL3IvIG5vY2Fub24KIAk8L1ZpcnR1YWxIb3N0PgogLS0tLQogCitUaGUgdHdvIG9wdGlvbnMgJ0FsbG93RW5jb2RlZFNsYXNoZXMgT24nIGFuZCAnUHJveHlQYXNzIC4uIG5vY2Fub24nIGFyZSByZXF1aXJlZAorc2luY2UgR2Vycml0IDIuNi4KKwogU1NMCiB+fn4KIApAQCAtNzksNiArODMsMTUgQEAKIGNvbmZpZ3VyZSBTU0wgd2l0aGluIHRoZSBzZXJ2ZXIsIGxpa2UgY29udHJvbGxpbmcgaG93IHN0cm9uZyBvZiBhbgogZW5jcnlwdGlvbiBhbGdvcml0aG0gaXMgcmVxdWlyZWQuCiAKK1Ryb3VibGVzaG9vdGluZworfn5+fn5+fn5+fn5+fn5+CisKK0lmIHlvdSBhcmUgZW5jb3VudGVyaW5nICdQYWdlIE5vdCBGb3VuZCcgZXJyb3JzIHdoZW4gb3BlbmluZyB0aGUgY2hhbmdlCitzY3JlZW4sIHlvdXIgQXBhY2hlIHByb3h5IGlzIHZlcnkgbGlrZWx5IGRlY29kaW5nIHRoZSBwYXNzZWQgVVJMLgorTWFrZSBzdXJlIHRvIGVpdGhlciB1c2UgJ0FsbG93RW5jb2RlZFNsYXNoZXMgT24nIHRvZ2V0aGVyIHdpdGgKKydQcm94eVBhc3MgLi4gbm9kZWNvZGUnIG9yIGFsdGVybmF0aXZlbHkgYSAnbW9kX3Jld3JpdGUnIGNvbmZpZ3VyYXRpb24gd2l0aAorJ0FsbG93RW5jb2RlZFNsYXNoZXMgTm9EZWNvZGUnIHNldC4KKwogCiBOZ2lueCBDb25maWd1cmF0aW9uCiAtLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjMsNiArMTM2LDE0IEBACiBob3cgdG8gY29uZmlndXJlIFNTTCB3aXRoaW4gdGhlIHNlcnZlciwgbGlrZSBjb250cm9sbGluZyBob3cgc3Ryb25nCiBvZiBhbiBlbmNyeXB0aW9uIGFsZ29yaXRobSBpcyByZXF1aXJlZC4KIAorVHJvdWJsZXNob290aW5nCit+fn5+fn5+fn5+fn5+fn4KKworSWYgeW91IGFyZSBlbmNvdW50ZXJpbmcgJ1BhZ2UgTm90IEZvdW5kJyBlcnJvcnMgd2hlbiBvcGVuaW5nIHRoZSBjaGFuZ2UKK3NjcmVlbiwgeW91ciBOZ2lueCBwcm94eSBpcyB2ZXJ5IGxpa2VseSBkZWNvZGluZyB0aGUgcGFzc2VkIFVSTC4KK01ha2Ugc3VyZSB0byB1c2UgYSAncHJveHlfcGFzcycgVVJMIHdpdGhvdXQgYW55IHBhdGggKGVzcC4gbm8gdHJhaWxpbmcKKycvJyBhZnRlciB0aGUgJ2hvc3Q6cG9ydCcpLgorCiBHRVJSSVQKIC0tLS0tLQogUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25maWctdmFsaWRhdGlvbi50eHQgYi9Eb2N1bWVudGF0aW9uL2NvbmZpZy12YWxpZGF0aW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjVkMDRhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jb25maWctdmFsaWRhdGlvbi50eHQKQEAgLTAsMCArMSwyMSBAQAorR2Vycml0IENvZGUgUmV2aWV3IC0gQ29tbWl0IFZhbGlkYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0dlcnJpdCBzdXBwb3J0cyBsaW5rOmRldi1wbHVnaW5zLmh0bWxbcGx1Z2luLWJhc2VkXSB2YWxpZGF0aW9uIG9mCit1cGxvYWRlZCBjb21taXRzLgorCitUaGlzIGFsbG93cyBwbHVnaW5zIHRvIHBlcmZvcm0gYWRkaXRpb25hbCB2YWxpZGF0aW9uIGNoZWNrcyBhZ2FpbnN0Cit1cGxvYWRlZCBjb21taXRzLCBhbmQgc2VuZCBiYWNrIGEgd2FybmluZyBvciBlcnJvciBtZXNzYWdlIHRvIHRoZSBnaXQKK2NsaWVudC4KKworVG8gbWFrZSB1c2Ugb2YgdGhpcyBmZWF0dXJlLCBhIHBsdWdpbiBtdXN0IGltcGxlbWVudCB0aGUgYENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcmAKK2ludGVyZmFjZS4KKworT3V0IG9mIHRoZSBib3gsIEdlcnJpdCBpbmNsdWRlcyBhIHBsdWdpbiB0aGF0IGNoZWNrcyB0aGUgbGVuZ3RoIG9mIHRoZQorc3ViamVjdCBhbmQgYm9keSBsaW5lcyBvZiBjb21taXQgbWVzc2FnZXMgb24gdXBsb2FkZWQgY29tbWl0cy4KKworCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RhdGFiYXNlLXNldHVwLnR4dCBiL0RvY3VtZW50YXRpb24vZGF0YWJhc2Utc2V0dXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NTliMGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RhdGFiYXNlLXNldHVwLnR4dApAQCAtMCwwICsxLDY1IEBACitbW2NyZWF0ZWRiXV0KK0RhdGFiYXNlIFNldHVwCistLS0tLS0tLS0tLS0tLQorCitEdXJpbmcgdGhlIGluaXQgcGhhc2Ugb2YgR2Vycml0IHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSB3aGljaCBkYXRhYmFzZSB0byB1c2UuCisKK1tbY3JlYXRlZGJfaDJdXQorSDIKK35+CisKK0lmIHlvdSBjaG9vc2UgSDIsIEdlcnJpdCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHVwIHRoZSBlbWJlZGRlZCBIMiBkYXRhYmFzZSBhcworYmFja2VuZCBzbyBubyBzZXQgdXAgb3IgY29uZmlndXJhdGlvbiBpcyBuZWNlc3NhcnkuCisKK1VzaW5nIHRoZSBlbWJlZGRlZCBIMiBkYXRhYmFzZSBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZ2V0IGEgR2Vycml0CitzaXRlIHVwIGFuZCBydW5uaW5nLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHByb29mIG9mIGNvbmNlcHRzIG9yIHNtYWxsIHRlYW0KK3NlcnZlcnMuICBPbiB0aGUgZmxpcCBzaWRlLCBIMiBpcyBub3QgdGhlIHJlY29tbWVuZGVkIG9wdGlvbiBmb3IgbGFyZ2UKK2NvcnBvcmF0ZSBpbnN0YWxsYXRpb25zLiBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gaW50ZXJhY3QKK3dpdGggdGhlIGRhdGFiYXNlIHdoaWxlIEdlcnJpdCBpcyBvZmZsaW5lLCBpdCdzIG5vdCBlYXN5IHRvIGJhY2t1cCB0aGUgZGF0YSwKK2FuZCBpdCdzIG5vdCBwb3NzaWJsZSB0byBzZXQgdXAgSDIgaW4gYSBsb2FkIGJhbGFuY2VkL2hvdHN3YXAgY29uZmlndXJhdGlvbi4KKworSWYgdGhpcyBvcHRpb24gaW50ZXJlc3RzIHlvdSwgeW91IG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgbGluazppbnN0YWxsLXF1aWNrLmh0bWxbdGhlIHF1aWNrIGd1aWRlXS4KKworW1tjcmVhdGVkYl9wb3N0Z3Jlc11dCitQb3N0Z3JlU1FMCit+fn5+fn5+fn5+CisKK1RoaXMgb3B0aW9uIGlzIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGUgSDIgb3B0aW9uIGJ1dCBpcyByZWNvbW1lbmRlZAorZm9yIGxhcmdlciBpbnN0YWxsYXRpb25zLiBJdCdzIHRoZSBkYXRhYmFzZSBiYWNrZW5kIHdpdGggdGhlIGxhcmdlc3QgdXNlcmJhc2UKK2luIHRoZSBHZXJyaXQgY29tbXVuaXR5LgorCitDcmVhdGUgYSB1c2VyIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIHdpdGhpbiBQb3N0Z3JlcywgYXNzaWduIGl0IGEKK3Bhc3N3b3JkLCBjcmVhdGUgYSBkYXRhYmFzZSB0byBzdG9yZSB0aGUgbWV0YWRhdGEsIGFuZCBncmFudCB0aGUgdXNlcgorZnVsbCByaWdodHMgb24gdGhlIG5ld2x5IGNyZWF0ZWQgZGF0YWJhc2U6CisKKy0tLS0KKyAgJCBjcmVhdGV1c2VyIC0tdXNlcm5hbWU9cG9zdGdyZXMgLVJESUVsUFMgZ2Vycml0MgorICAkIGNyZWF0ZWRiIC0tdXNlcm5hbWU9cG9zdGdyZXMgLUUgVVRGLTggLU8gZ2Vycml0MiByZXZpZXdkYgorLS0tLQorCitWaXNpdCBQb3N0Z3JlU1FMJ3MgbGluazpodHRwOi8vd3d3LnBvc3RncmVzcWwub3JnL2RvY3MvOS4xL2ludGVyYWN0aXZlL2luZGV4Lmh0bWxbZG9jdW1lbnRhdGlvbl0gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nCit1c2luZyBQb3N0Z3JlU1FMLgorCitbW2NyZWF0ZWRiX215c3FsXV0KK015U1FMCit+fn5+fgorCitUaGlzIG9wdGlvbiBpcyBhbHNvIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiB0aGUgSDIgb3B0aW9uLiBKdXN0IGFzIHdpdGgKK1Bvc3RncmVTUUwgaXQncyBhbHNvIHJlY29tbWVuZGVkIGZvciBsYXJnZXIgaW5zdGFsbGF0aW9ucy4KKworQ3JlYXRlIGEgdXNlciBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiB3aXRoaW4gdGhlIGRhdGFiYXNlLCBhc3NpZ24gaXQgYQorcGFzc3dvcmQsIGNyZWF0ZSBhIGRhdGFiYXNlLCBhbmQgZ2l2ZSB0aGUgbmV3bHkgY3JlYXRlZCB1c2VyIGZ1bGwKK3JpZ2h0cyBvbiBpdDoKKworLS0tLQorICBteXNxbAorCisgIENSRUFURSBVU0VSICdnZXJyaXQyJ0AnbG9jYWxob3N0JyBJREVOVElGSUVEIEJZICdzZWNyZXQnOworICBDUkVBVEUgREFUQUJBU0UgcmV2aWV3ZGI7CisgIEFMVEVSIERBVEFCQVNFIHJldmlld2RiIGNoYXJzZXQ9bGF0aW4xOworICBHUkFOVCBBTEwgT04gcmV2aWV3ZGIuKiBUTyAnZ2Vycml0MidAJ2xvY2FsaG9zdCc7CisgIEZMVVNIIFBSSVZJTEVHRVM7CistLS0tCisKK1Zpc2l0IE15U1FMJ3MgbGluazpodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvW2RvY3VtZW50YXRpb25dIGZvciBmdXJ0aGVyCitpbmZvcm1hdGlvbiByZWdhcmRpbmcgdXNpbmcgTXlTUUwuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi1jb250cmlidXRpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXYtY29udHJpYnV0aW5nLnR4dAppbmRleCAwNjVlOWQxLi44NGNiMWUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Rldi1jb250cmlidXRpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2LWNvbnRyaWJ1dGluZy50eHQKQEAgLTMxLDcgKzMxLDcgQEAKIHRoZSBhcHByb3ZlcnMuICBFdmVuIGlmIHlvdSBhcmUgbm90IGZhbWlsaWFyIHdpdGggR2Vycml0J3MKIGludGVybmFscywgaXQgd291bGQgYmUgb2YgZ3JlYXQgaGVscCBpZiB5b3UgY2FuIGRvd25sb2FkLCB0cnkKIG91dCwgYW5kIGNvbW1lbnQgb24gbmV3IGZlYXR1cmVzLiAgSWYgaXQgd29ya3MgYXMgYWR2ZXJ0aXNlZCwKLXNheSBzbywgYW5kIGlmIHlvdSBoYXZlIHRoZSBwcml2aWxpZ2VzIHRvIGRvIHNvLCBnbyBhaGVhZAorc2F5IHNvLCBhbmQgaWYgeW91IGhhdmUgdGhlIHByaXZpbGVnZXMgdG8gZG8gc28sIGdvIGFoZWFkCiBhbmQgZ2l2ZSBpdCBhICsxIFZlcmlmaWVkLiAgSWYgeW91IHdvdWxkIGZpbmQgdGhlIGZlYXR1cmUKIHVzZWZ1bCwgc2F5IHNvIGFuZCBnaXZlIGl0IGEgKzEgY29kZSByZXZpZXcuCiAKQEAgLTU3LDYgKzU3LDcgQEAKIHNwYW5zLCB3ZSByZWFsbHkgZG8gd2FudCB5b3VyIGNvZGUuCiAKIAorW1tjb21taXQtbWVzc2FnZV1dCiBDb21taXQgTWVzc2FnZQogLS0tLS0tLS0tLS0tLS0KIApAQCAtNjgsNiArNjksNyBAQAogICAqIEZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZQogICAqIEZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGV4cGxhbmF0b3J5IHBhcmFncmFwaHMKICAgKiBVc2UgdGhlIHByZXNlbnQgdGVuc2UgKGZpeCBpbnN0ZWFkIG9mIGZpeGVkKQorICAqIFVzZSB0aGUgcGFzdCB0ZW5zZSB3aGVuIGRlc2NyaWJpbmcgdGhlIHN0YXR1cyBiZWZvcmUgdGhpcyBjb21taXQKICAgKiBJbmNsdWRlIGEgQnVnOiBJc3N1ZSA8Iz4gbGluZSBpZiBmaXhpbmcgYSBHZXJyaXQgaXNzdWUKICAgKiBJbmNsdWRlIGEgQ2hhbmdlLUlkIGxpbmUKIApAQCAtOTEsNiArOTMsMjUgQEAKICAgQ2hhbmdlLUlkOiBJYzRhN2MwN2VlYjk4Y2RlYWY0NGU5ZDIzMWE2NWE1MWYzZmNlYWU1MgogPT09PQogCitUaGUgQ2hhbmdlLUlkIGlzLCBhcyB1c3VhbCwgY3JlYXRlZCBieSBhIGxvY2FsIGdpdCBob29rLiAgVG8gaW5zdGFsbCBpdCwgc2ltcGx5Citjb3B5IG9uZSBmcm9tIHRoZSBjaGVja291dCBhbmQgbWFrZSBpdCBleGVjdXRhYmxlOgorCis9PT09CisgIGNwIC4vZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Rvb2xzL3Jvb3QvaG9va3MvY29tbWl0LW1zZyAuZ2l0L2hvb2tzLworICBjaG1vZCAreCAuZ2l0L2hvb2tzL2NvbW1pdC1tc2cKKz09PT0KKworVG8gc2V0IHVwIGdpdCdzIHJlbW90ZSBmb3IgZWFzeSBwdXNoaW5nLCBydW4gdGhlIGZvbGxvd2luZzoKKworPT09PQorICBnaXQgcmVtb3RlIGFkZCBnZXJyaXQgaHR0cHM6Ly9nZXJyaXQuZ29vZ2xlc291cmNlLmNvbS9nZXJyaXQKKz09PT0KKworVGhlIEhUVFBTIGFjY2VzcyByZXF1aXJlcyBwcm9wZXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkOyB0aGlzIGNhbiBiZSBvYnRhaW5lZAorYnkgY2xpY2tpbmcgdGhlICJPYnRhaW4gUGFzc3dvcmQiIGxpbmsgb24gdGhlCitsaW5rOmh0dHBzOi8vZ2Vycml0LXJldmlldy5nb29nbGVzb3VyY2UuY29tLyMvc2V0dGluZ3MvaHR0cC1wYXNzd29yZFtIVFRQCitQYXNzd29yZCB0YWIgb2YgdGhlIHVzZXIgc2V0dGluZ3MgcGFnZV0uCisKIAogU3R5bGUKIC0tLS0tCkBAIC0xNDAsNyArMTYxLDcgQEAKICAgKiBEZWZpbmUgbm9uIHN0YXRpYyBpbnRlcmZhY2VzIGFmdGVyIHN0YXRpYyBpbnRlcmZhY2VzIGluIHlvdXIKICAgICBjbGFzcy4KICAgKiBOZXh0IHlvdSBzaG91bGQgZGVmaW5lIHN0YXRpYyB0eXBlcyBhbmQgbWVtYmVycy4KLSAgKiBGaW5hbGx5IGluc3RhbmNlIG1lbWJlcnMsIHRoZW4gY29uc3R1Y3RvcnMsIGFuZCB0aGVuIGluc3RhbmNlCisgICogRmluYWxseSBpbnN0YW5jZSBtZW1iZXJzLCB0aGVuIGNvbnN0cnVjdG9ycywgYW5kIHRoZW4gaW5zdGFuY2UKICAgICBtZXRob2RzLgogICAqIFNvbWUgY29tbW9uIGV4Y2VwdGlvbnMgYXJlIHByaXZhdGUgaGVscGVyIHN0YXRpYyBtZXRob2RzIHdoaWNoCiAgICAgbWlnaHQgYXBwZWFyIG5lYXIgdGhlIGluc3RhbmNlIG1ldGhvZHMgd2hpY2ggdGhleSBoZWxwLgpAQCAtMjM4LDYgKzI1OSwxOCBAQAogICAgIGFuZCBpdCBhbHNvIG1ha2VzICJnaXQgcmV2ZXJ0IiBtb3JlIHVzZWZ1bC4KICAgKiBVc2UgdG9waWMgYnJhbmNoZXMgdG8gbGluayB5b3VyIHNlcGFyYXRlIGNoYW5nZXMgdG9nZXRoZXIuCiAKK1tbcHJvY2Vzc11dCitQcm9jZXNzCistLS0tLS0tCisKK0JhY2twb3J0aW5nIHRvIHN0YWJsZSBicmFuY2hlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0Zyb20gdGltZSB0byB0aW1lIGJ1ZyBmaXggcmVsZWFzZXMgYXJlIG1hZGUgZm9yIGV4aXN0aW5nIHN0YWJsZSBicmFuY2hlcy4KKworRGV2ZWxvcGVycyBjb25jZXJuZWQgd2l0aCBzdGFibGUgYnJhbmNoZXMgYXJlIGVuY291cmFnZWQgdG8gYmFja3BvcnQgb3IgcHVzaAorcGF0Y2hzZXRzIHRvIHRoZXNlIGJyYW5jaGVzLCBldmVuIGlmIG5vIG5ldyByZWxlYXNlIGlzIHBsYW5uZWQuCisKIAogR0VSUklUCiAtLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LWRlc2lnbi50eHQgYi9Eb2N1bWVudGF0aW9uL2Rldi1kZXNpZ24udHh0CmluZGV4IGNlMjg2OGMuLjJlNDNiOTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2LWRlc2lnbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtZGVzaWduLnR4dApAQCAtOCw3ICs4LDcgQEAKIHJldmlld3MgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHaXQgdmVyc2lvbiBjb250cm9sIHN5c3RlbS4KIAogR2Vycml0IG1ha2VzIHJldmlld3MgZWFzaWVyIGJ5IHNob3dpbmcgY2hhbmdlcyBpbiBhIHNpZGUtYnktc2lkZQotZGlzcGxheSwgYW5kIGFsbG93aW5nIGlubGluZSBjb21tZW50cyB0byBiZSBhZGRlZCBieSBhbnkgcmV2aWV3ZXIuCitkaXNwbGF5LCBhbmQgYWxsb3dpbmcgaW5saW5lL2ZpbGUgY29tbWVudHMgdG8gYmUgYWRkZWQgYnkgYW55IHJldmlld2VyLgogCiBHZXJyaXQgc2ltcGxpZmllcyBHaXQgYmFzZWQgcHJvamVjdCBtYWludGFpbmVyc2hpcCBieSBwZXJtaXR0aW5nCiBhbnkgYXV0aG9yaXplZCB1c2VyIHRvIHN1Ym1pdCBjaGFuZ2VzIHRvIHRoZSBtYXN0ZXIgR2l0IHJlcG9zaXRvcnksCkBAIC05OSwxMSArOTksMTEgQEAKIHBlcm1pc3Npb25zIGluIHRoZSBwcm9qZWN0LgogCiBSZXZpZXdlcnMgdXNlIHRoZSB3ZWIgaW50ZXJmYWNlIHRvIHJlYWQgdGhlIHNpZGUtYnktc2lkZSBvciB1bmlmaWVkCi1kaWZmIG9mIGEgY2hhbmdlLCBhbmQgaW5zZXJ0IGRyYWZ0IGlubGluZSBjb21tZW50cyB3aGVyZSBhcHByb3ByaWF0ZS4KLUEgZHJhZnQgY29tbWVudCBpcyB2aXNpYmxlIG9ubHkgdG8gdGhlIHJldmlld2VyLCB1bnRpbCB0aGV5IHB1Ymxpc2gKLXRob3NlIGNvbW1lbnRzLiAgUHVibGlzaGVkIGNvbW1lbnRzIGFyZSBhdXRvbWF0aWNhbGx5IGVtYWlsZWQgdG8KLXRoZSBjaGFuZ2UgYXV0aG9yIGJ5IEdlcnJpdCwgYW5kIGFyZSBDQydkIHRvIGFsbCBvdGhlciByZXZpZXdlcnMKLXdobyBoYXZlIGFscmVhZHkgY29tbWVudGVkIG9uIHRoZSBjaGFuZ2UuCitkaWZmIG9mIGEgY2hhbmdlLCBhbmQgaW5zZXJ0IGRyYWZ0IGlubGluZS9maWxlIGNvbW1lbnRzIHdoZXJlCithcHByb3ByaWF0ZS4gQSBkcmFmdCBjb21tZW50IGlzIHZpc2libGUgb25seSB0byB0aGUgcmV2aWV3ZXIsIHVudGlsCit0aGV5IHB1Ymxpc2ggdGhvc2UgY29tbWVudHMuICBQdWJsaXNoZWQgY29tbWVudHMgYXJlIGF1dG9tYXRpY2FsbHkKK2VtYWlsZWQgdG8gdGhlIGNoYW5nZSBhdXRob3IgYnkgR2Vycml0LCBhbmQgYXJlIENDJ2QgdG8gYWxsIG90aGVyCityZXZpZXdlcnMgd2hvIGhhdmUgYWxyZWFkeSBjb21tZW50ZWQgb24gdGhlIGNoYW5nZS4KIAogV2hlbiBwdWJsaXNoaW5nIGNvbW1lbnRzIHJldmlld2VycyBhcmUgYWxzbyBnaXZlbiB0aGUgb3Bwb3J0dW5pdHkKIHRvIHNjb3JlIHRoZSBjaGFuZ2UsIGluZGljYXRpbmcgd2hldGhlciB0aGV5IGZlZWwgdGhlIGNoYW5nZSBpcwpAQCAtNTUzLDggKzU1Myw4IEBACiAKIEdlcnJpdCdzIHdlYiBVSSB3b3VsZCByZXF1aXJlIG9uIGF2ZXJhZ2UgYDQrRitGKkNgIEhUVFAgcmVxdWVzdHMgdG8KIHJldmlldyBhIGNoYW5nZSBhbmQgcG9zdCBjb21tZW50cy4gIEhlcmUgYEZgIGlzIHRoZSBudW1iZXIgb2YgZmlsZXMKLW1vZGlmaWVkIGJ5IHRoZSBjaGFuZ2UsIGFuZCBgQ2AgaXMgdGhlIG51bWJlciBvZiBpbmxpbmUgY29tbWVudHMgbGVmdAotYnkgdGhlIHJldmlld2VyIHBlciBmaWxlLiAgVGhlIGNvbnN0YW50IDQgYWNjb3VudHMgZm9yIHRoZSByZXF1ZXN0Cittb2RpZmllZCBieSB0aGUgY2hhbmdlLCBhbmQgYENgIGlzIHRoZSBudW1iZXIgb2YgaW5saW5lL2ZpbGUgY29tbWVudHMKK2xlZnQgYnkgdGhlIHJldmlld2VyIHBlciBmaWxlLiAgVGhlIGNvbnN0YW50IDQgYWNjb3VudHMgZm9yIHRoZSByZXF1ZXN0CiB0byBsb2FkIHRoZSByZXZpZXdlcidzIGRhc2hib2FyZCwgdG8gbG9hZCB0aGUgY2hhbmdlIGRldGFpbCBwYWdlLAogdG8gcHVibGlzaCB0aGUgcmV2aWV3IGNvbW1lbnRzLCBhbmQgdG8gcmVsb2FkIHRoZSBjaGFuZ2UgZGV0YWlsCiBwYWdlIGFmdGVyIGNvbW1lbnRzIGFyZSBwdWJsaXNoZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi1lY2xpcHNlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2LWVjbGlwc2UudHh0CmluZGV4IGIyYmYwMTEuLjY0ZTU5MzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2LWVjbGlwc2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2LWVjbGlwc2UudHh0CkBAIC04LDEyICs4LDE3IEBACiBydW50aW1lIGRlYnVnZ2luZyBlbnZpcm9ubWVudC4KIAogCitbW21hdmVuXV0KIE1hdmVuIFBsdWdpbgogLS0tLS0tLS0tLS0tCiAKLUluc3RhbGwgdGhlIE1hdmVuIEludGVncmF0aW9uIHBsdWdpbnM6CitJbnN0YWxsIHRoZSBNYXZlbiBJbnRlZ3JhdGlvbiBwbHVnaW5zLgogCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL20yZS9kb3dubG9hZC9bbTJlY2xpcHNlXQorSW4gRWNsaXBzZSB2ZXJzaW9uIDMuNyAoSW5kaWdvKSBhbmQgbGF0ZXIsIHRoZXNlIGFyZSBhdmFpbGFibGUgaW4gdGhlCitkZWZhdWx0IHVwZGF0ZSBzaXRlIGFuZCBjYW4gYmUgZm91bmQgdW5kZXIgdGhlICdDb2xsYWJvcmF0aW9uJyBjYXRlZ29yeS4KKworRm9yIG9sZGVyIHZlcnNpb25zIHRoZSB1cGRhdGUgc2l0ZSBtdXN0IGJlIG1hbnVhbGx5IGFkZGVkOyB0aGUgbGluayBjYW4KK2JlIGZvdW5kIG9uIHRoZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL20yZS9kb3dubG9hZC9bbTJlY2xpcHNlIGRvd25sb2FkIHBhZ2VdLgogCiAKIFtbRm9ybWF0dGluZ11dCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi1wbHVnaW5zLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2LXBsdWdpbnMudHh0CmluZGV4IGRkMGM0NGMuLjEyODM4ZmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2LXBsdWdpbnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXBsdWdpbnMudHh0CkBAIC0xNzYsNiArMTc2LDY5IEBACiBUbyByZWxvYWQvcmVzdGFydCBhIHBsdWdpbiB0aGUgbGluazpjbWQtcGx1Z2luLXJlbG9hZC5odG1sW3BsdWdpbiByZWxvYWRdCiBjb21tYW5kIGNhbiBiZSB1c2VkLgogCitbW2luaXRfc3RlcF1dCitJbml0IHN0ZXAKK35+fn5+fn5+fgorCitQbHVnaW5zIGNhbiBjb250cmlidXRlIHRoZWlyIG93biAiaW5pdCBzdGVwIiBkdXJpbmcgdGhlIEdlcnJpdCBpbml0Cit3aXphcmQuIFRoaXMgaXMgdXNlZnVsIGZvciBndWlkaW5nIHRoZSBHZXJyaXQgYWRtaW5pc3RyYXRvciB0aHJvdWdoCit0aGUgc2V0dGluZ3MgbmVlZGVkIGJ5IHRoZSBwbHVnaW4gdG8gd29yayBwcm9wZXJ0bHkuCisKK0ZvciBpbnN0YW5jZSBwbHVnaW5zIHRvIGludGVncmF0ZSBKaXJhIGlzc3VlcyB0byBHZXJyaXQgY2hhbmdlcyBtYXkKK2NvbnRyaWJ1dGUgdGhlaXIgb3duICJpbml0IHN0ZXAiIHRvIGFsbG93IGNvbmZpZ3VyaW5nIHRoZSBKaXJhIFVSTCwKK2NyZWRlbnRpYWxzIGFuZCBwb3NzaWJseSB2ZXJpZnkgY29ubmVjdGl2aXR5IHRvIHZhbGlkYXRlIHRoZW0uCisKKz09PT0KKyAgR2Vycml0LUluaXRTdGVwOiB0bGQuZXhhbXBsZS5wcm9qZWN0Lk15SW5pdFN0ZXAKKz09PT0KKworTXlJbml0U3RlcCBuZWVkcyB0byBmb2xsb3cgdGhlIHN0YW5kYXJkIEdlcnJpdCBJbml0U3RlcCBzeW50YXgKK2FuZCBiZWhhdmlvdXI6IHdyaXRpbmcgdG8gdGhlIGNvbnNvbGUgdXNpbmcgdGhlIGluamVjdGVkIENvbnNvbGVVSQorYW5kIGFjY2Vzc2luZyAvIGNoYW5naW5nIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdXNpbmcgU2VjdGlvbi5GYWN0b3J5LgorCitJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgR2Vycml0IGluaXQgaW5qZWN0aW9ucywgcGx1Z2lucyByZWNlaXZlCit0aGUgQFBsdWdpbk5hbWUgU3RyaW5nIGluamVjdGlvbiBjb250YWluaW5nIHRoZWlyIG93biBwbHVnaW4gbmFtZS4KKworQmVhciBpbiBtaW5kIHRoYXQgdGhlIFBsdWdpbidzIEluaXRTdGVwIGNsYXNzIHdpbGwgYmUgbG9hZGVkIGJ1dAordGhlIHN0YW5kYXJkIEdlcnJpdCBydW50aW1lIGVudmlyb25tZW50IGlzIG5vdCBhdmFpbGFibGUgYW5kIHRoZSBwbHVnaW4ncworb3duIEd1aWNlIG1vZHVsZXMgd2VyZSBub3QgaW5pdGlhbGl6ZWQuCitUaGlzIG1lYW5zIHRoZSBJbml0U3RlcCBmb3IgYSBwbHVnaW4gaXMgbm90IGV4ZWN1dGVkIGluIHRoZSBzYW1lIHdheSB0aGF0Cit0aGUgcGx1Z2luIGV4ZWN1dGVzIHdpdGhpbiB0aGUgc2VydmVyLCBhbmQgbWF5IG1lYW4gYSBwbHVnaW4gYXV0aG9yIGNhbm5vdAordHJpdmlhbGx5IHJldXNlIHJ1bnRpbWUgY29kZSBkdXJpbmcgaW5pdC4KKworRm9yIGluc3RhbmNlIGEgcGx1Z2luIHRoYXQgd2FudHMgdG8gdmVyaWZ5IGNvbm5lY3Rpdml0eSBtYXkgbmVlZCB0byBzdGF0aWNhbGx5CitjYWxsIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGVpciBjb25uZWN0aW9uIGNsYXNzLCBwYXNzaW5nIGluIHZhbHVlcyBvYnRhaW5lZAorZnJvbSB0aGUgU2VjdGlvbi5GYWN0b3J5IHJhdGhlciB0aGFuIGZyb20gYW4gaW5qZWN0ZWQgQ29uZmlnIG9iamVjdC4KKworUGx1Z2lucyBJbml0U3RlcCBhcmUgZXhlY3V0aW5nIGR1cmluZyB0aGUgIkdlcnJpdCBQbHVnaW4gaW5pdCIgcGhhc2UsIGFmdGVyCit0aGUgZXh0cmFjdGlvbiBvZiB0aGUgcGx1Z2lucyBlbWJlZGRlZCBpbiBHZXJyaXQud2FyIGludG8gJEdFUlJJVF9TSVRFL3BsdWdpbnMKK2FuZCBiZWZvcmUgdGhlIERCIFNjaGVtYSBpbml0aWFsaXphdGlvbiBvciB1cGdyYWRlLgorUGx1Z2lucyBJbml0U3RlcCBjYW5ub3QgcmVmZXIgdG8gR2Vycml0IERCIFNjaGVtYSBvciBhbnkgb3RoZXIgR2Vycml0IHJ1bnRpbWUKK29iamVjdHMgaW5qZWN0ZWQgYXQgc3RhcnR1cC4KKworPT09PQorcHVibGljIGNsYXNzIE15SW5pdFN0ZXAgaW1wbGVtZW50cyBJbml0U3RlcCB7CisgIHByaXZhdGUgZmluYWwgQ29uc29sZVVJIHVpOworICBwcml2YXRlIGZpbmFsIFNlY3Rpb24uRmFjdG9yeSBzZWN0aW9uczsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGx1Z2luTmFtZTsKKworICBASW5qZWN0CisgIHB1YmxpYyBHaXRCbGl0SW5pdFN0ZXAoZmluYWwgQ29uc29sZVVJIHVpLCBTZWN0aW9uLkZhY3Rvcnkgc2VjdGlvbnMsIEBQbHVnaW5OYW1lIFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgdGhpcy51aSA9IHVpOworICAgIHRoaXMuc2VjdGlvbnMgPSBzZWN0aW9uczsKKyAgICB0aGlzLnBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHVpLmhlYWRlcigiXG5NeSBwbHVnaW4iKTsKKworICAgIFNlY3Rpb24gbXlTZWN0aW9uID0gZ2V0U2VjdGlvbigibXlwbHVnaW4iLCBudWxsKTsKKyAgICBteVNlY3Rpb24uc3RyaW5nKCJMaW5rIG5hbWUiLCAibGlua25hbWUiLCAiTXlMaW5rIik7CisgIH0KK30KKz09PT0KKwogW1tjbGFzc3BhdGhdXQogQ2xhc3NwYXRoCiAtLS0tLS0tLS0KQEAgLTMyMiwxMCArMzg1LDEzIEBACiBhdXRvbWF0aWNhbGx5IGV4cG9ydCB0aGVzZSByZXNvdXJjZXMgb3ZlciBIVFRQIGZyb20gdGhlIHBsdWdpbiBKQVIuCiAKIFN0YXRpYyByZXNvdXJjZXMgdW5kZXIgYHN0YXRpYy9gIGRpcmVjdG9yeSBpbiB0aGUgSkFSIHdpbGwgYmUKLWF2YWlsYWJsZSBhcyBgL3BsdWdpbnMvaGVsbG93b3JsZC9zdGF0aWMvcmVzb3VyY2VgLgorYXZhaWxhYmxlIGFzIGAvcGx1Z2lucy9oZWxsb3dvcmxkL3N0YXRpYy9yZXNvdXJjZWAuIFRoaXMgcHJlZml4IGlzCitjb25maWd1cmFibGUgYnkgc2V0dGluZyB0aGUgYEdlcnJpdC1IdHRwU3RhdGljUHJlZml4YCBhdHRyaWJ1dGUuCiAKIERvY3VtZW50YXRpb24gZmlsZXMgdW5kZXIgYERvY3VtZW50YXRpb24vYCBkaXJlY3RvcnkgaW4gdGhlIEpBUgotd2lsbCBiZSBhdmFpbGFibGUgYXMgYC9wbHVnaW5zL2hlbGxvd29ybGQvRG9jdW1lbnRhdGlvbi9yZXNvdXJjZWAuCit3aWxsIGJlIGF2YWlsYWJsZSBhcyBgL3BsdWdpbnMvaGVsbG93b3JsZC9Eb2N1bWVudGF0aW9uL3Jlc291cmNlYC4gVGhpcworcHJlZml4IGlzIGNvbmZpZ3VyYWJsZSBieSBzZXR0aW5nIHRoZSBgR2Vycml0LUh0dHBEb2N1bWVudGF0aW9uUHJlZml4YAorYXR0cmlidXRlLgogCiBEb2N1bWVudGF0aW9uIG1heSBiZSB3cml0dGVuIGluCiBsaW5rOmh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vW01hcmtkb3duXSBzdHlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtcmVhZG1lLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2LXJlYWRtZS50eHQKaW5kZXggNTUyYjVhOC4uNjdiNGFhZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXYtcmVhZG1lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWFkbWUudHh0CkBAIC0xMSwxMCArMTEsMTMgQEAKIENyZWF0ZSBhIG5ldyBjbGllbnQgd29ya3NwYWNlOgogCiAtLS0tCi0gIGdpdCBjbG9uZSBodHRwczovL2dlcnJpdC5nb29nbGVzb3VyY2UuY29tL2dlcnJpdAorICBnaXQgY2xvbmUgLS1yZWN1cnNpdmUgaHR0cHM6Ly9nZXJyaXQuZ29vZ2xlc291cmNlLmNvbS9nZXJyaXQKICAgY2QgZ2Vycml0CiAtLS0tCiAKK1RoZSBgLS1yZWN1cnNpdmVgIG9wdGlvbiBpcyBuZWVkZWQgb24gYGdpdCBjbG9uZWAgdG8gZW5zdXJlIHRoYXQKK3RoZSBjb3JlIHBsdWdpbnMsIHdoaWNoIGFyZSBpbmNsdWRlZCBhcyBnaXQgc3VibW9kdWxlcywgYXJlIGFsc28KK2Nsb25lZC4KIAogQ29uZmlndXJpbmcgRWNsaXBzZQogLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzEsNyArMzQsMjEgQEAKIEZyb20gdGhlIGNvbW1hbmQgbGluZToKIAogLS0tLQotICBtdm4gcGFja2FnZQorICBtdm4gY2xlYW4gcGFja2FnZQorLS0tLQorCitCeSBkZWZhdWx0IHRoZSBidWlsZCB3aWxsIHJ1biB0ZXN0cyBhbmQgYnVpbGQgdGhlIGRvY3VtZW50YXRpb24uCisKK1RvIGJ1aWxkIHdpdGhvdXQgdGVzdHM6CisKKy0tLS0KKyAgbXZuIGNsZWFuIHBhY2thZ2UgLURza2lwVGVzdHMKKy0tLS0KKworVG8gYnVpbGQgd2l0aG91dCBkb2N1bWVudGF0aW9uOgorCistLS0tCisgIG12biBjbGVhbiBwYWNrYWdlIC1EZ2Vycml0LmRvY3VtZW50YXRpb24uc2tpcAogLS0tLQogCiBPdXRwdXQgZXhlY3V0YWJsZSBXQVIgd2lsbCBiZSBwbGFjZWQgaW46CkBAIC04MCw2ICs5NywyNyBAQAogVGVzdGluZwogLS0tLS0tLQogCitbW3J1bi1hY2NlcHRhbmNlLXRlc3RzXV0KK1J1bm5pbmcgdGhlIEFjY2VwdGFuY2UgVGVzdHMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworR2Vycml0IGhhcyBhIHNldCBvZiBpbnRlZ3JhdGlvbiB0ZXN0cyB0aGF0IHRlc3QgdGhlIEdlcnJpdCBkYWVtb24gdmlhCitSRVNULCBTU0ggYW5kIHRoZSBnaXQgcHJvdG9jb2wuCisKK0EgbmV3IHJldmlldyBzaXRlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggdGVzdCBhbmQgdGhlIEdlcnJpdCBkYWVtb24gaXMKK3N0YXJ0ZWQgb24gdGhhdCBzaXRlLiBXaGVuIHRoZSB0ZXN0IGhhcyBmaW5pc2hlZCB0aGUgR2Vycml0IGRhZW1vbiBpcworc2h1dGRvd24uCisKK1NpbmNlIHRoZSBhY2NlcHRhbmNlIHRlc3RzIGFyZSB0b28gZXhwZW5zaXZlIHRvIHJ1biBldmVyeSB0aW1lCitHZXJyaXQgaXMgYnVpbHQsIHRoZXkgYXJlIG9ubHkgZXhlY3V0ZWQgZHVyaW5nIHRoZSBNYXZlbiB2ZXJpZnkgcGhhc2UKK2lmIHRoZSBNYXZlbiBwcm9maWxlIGBhY2NlcHRhbmNlYCBpcyBlbmFibGVkLgorCitUbyBleGVjdXRlIHRoZSBhY2NlcHRhbmNlIHRlc3RzIHJ1bjoKKworLS0tLQorICBtdm4gY2xlYW4gdmVyaWZ5IC1QYWNjZXB0YW5jZQorLS0tLQorCiBSdW5uaW5nIHRoZSBEYWVtb24KIH5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC0xMDksMTMgKzE0NywyMSBAQAogLS0tLQogCiAKK1tbZGVidWctamF2YXNjcmlwdF1dCiBEZWJ1Z2dpbmcgSmF2YVNjcmlwdAogfn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotV2hlbiBkZWJ1Z2dpbmcgYnJvd3NlciBzcGVjaWZpYyBpc3N1ZXMgdXNlIGAtRGd3dC5zdHlsZT1ERVRBSUxFRGAKLXNvIHRoZSByZXN1bHRpbmcgSmF2YVNjcmlwdCBtb3JlIGNsb3NlbHkgbWF0Y2hlcyB0aGUgSmF2YSBzb3VyY2VzLgotVGhpcyBjYW4gYmUgdXNlZCB0byBoZWxwIG5hcnJvdyBkb3duIHdoYXQgY29kZSBsaW5lIDMwLDQwMCBpbiB0aGUKLUphdmFTY3JpcHQgaGFwcGVucyB0byBiZS4KK1doZW4gZGVidWdnaW5nIGJyb3dzZXIgc3BlY2lmaWMgaXNzdWVzIGFkZCBgP2RiZz0xYCB0byB0aGUgVVJMIHNvIHRoZQorcmVzdWx0aW5nIEphdmFTY3JpcHQgbW9yZSBjbG9zZWx5IG1hdGNoZXMgdGhlIEphdmEgc291cmNlcy4gIFRoZSBkZWJ1ZworcGFnZXMgdXNlIHRoZSBHV1QgcHJldHR5IGZvcm1hdCwgd2hlcmUgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIG5hbWVzCittYXRjaCB0aGUgSmF2YSBzb3VyY2VzLgorCistLS0tCisgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8/ZGJnPTEKKy0tLS0KKworVG8gdXNlIHRoZSBHV1QgREVUQUlMRUQgc3R5bGUgdGhlIHBhY2thZ2UgbXVzdCBiZSByZWNvbXBpbGVkIGFuZAorYD9kYmc9MWAgbXVzdCBiZSBvbWl0dGVkIGZyb20gdGhlIFVSTDoKIAogLS0tLQogICBtdm4gcGFja2FnZSAtRGd3dC5zdHlsZT1ERVRBSUxFRApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtcmVsZWFzZS1kZXBsb3ktY29uZmlnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2UtZGVwbG95LWNvbmZpZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1MmQ1MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2UtZGVwbG95LWNvbmZpZy50eHQKQEAgLTAsMCArMSwxMzUgQEAKK0RlcGxveSBHZXJyaXQgQXJ0aWZhY3RzCis9PT09PT09PT09PT09PT09PT09PT09PQorCitHZXJyaXQgQXJ0aWZhY3RzIGFyZSBzdG9yZWQgb24KK2xpbms6aHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3RvcmFnZS9bR29vZ2xlIENsb3VkIFN0b3JhZ2VdLgorVmlhIHRoZSBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL2FwaXMvY29uc29sZS9bQVBJIENvbnNvbGVdIHRoZQorR2Vycml0IG1haW50YWluZXJzIGhhdmUgYWNjZXNzIHRvIHRoZSBgR2Vycml0IENvZGUgUmV2aWV3YCBwcm9qZWN0LgorVGhpcyBwcm9qZWN0cyBob3N0IHNldmVyYWwgYnVja2V0cyBmb3Igc3RvcmluZyBHZXJyaXQgYXJ0aWZhY3RzOgorCisqIGBnZXJyaXQtYXBpYDoKKysKK0J1Y2tldCB0byBzdG9yZSB0aGUgR2Vycml0IEV4dGVuc2lvbiBBUEkgSmFyIGFuZCB0aGUgR2Vycml0IFBsdWdpbiBBUEkKK0phci4KKworKiBgZ2Vycml0LW1hdmVuYDoKKysKK0J1Y2tldCB0byBzdG9yZSBHZXJyaXQgU3VicHJvamVjdCBBcnRpZmFjdHMgKGUuZy4gYGd3dGV4cHVpYCwKK2Bnd3Rqc29ucnBjYCBldGMuKS4KKworKiBgZ2Vycml0LXBsdWdpbnNgOgorKworQnVja2V0IHRvIHN0b3JlIEdlcnJpdCBDb3JlIFBsdWdpbiBBcnRpZmFjdHMuCisKK1tbZGVwbG95LWNvbmZpZ3VyYXRpb24tc2V0dGluZ3MteG1sXV0KK0RlcGxveSBDb25maWd1cmF0aW9uIGluIE1hdmVuIGBzZXR0aW5ncy54bWxgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyB1cGxvYWQgYXJ0aWZhY3RzIHRvIGEgYnVja2V0IHRoZSB1c2VyIG11c3QgYXV0aGVudGljYXRlIHdpdGggYQordXNlcm5hbWUgYW5kIHBhc3N3b3JkLiBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWQgdG8gYmUgcmV0cmlldmVkCitmcm9tIHRoZSBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL2FwaXMvY29uc29sZS9bQVBJIENvbnNvbGVdOgorCisqIEdvIHRvIHRoZSBgR2Vycml0IENvZGUgUmV2aWV3YCBwcm9qZWN0CisqIEluIHRoZSBtZW51IG9uIHRoZSBsZWZ0IHNlbGVjdCBgR29vZ2xlIENsb3VkIFN0b3JhZ2VgID4KK2BJbnRlcm9wZXJhYmxlIEFjY2Vzc2AKKyogVXNlIHRoZSBgQWNjZXNzIEtleWAgYXMgdXNlcm5hbWUKKyogQ2xpY2sgdW5kZXIgYFNlY3JldGAgb24gdGhlIGBTaG93YCBidXR0b24gdG8gZmluZCB0aGUgcGFzc3dvcmQKKworVG8gbWFrZSB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGtub3duIHRvIE1hdmVuLCB0aGV5IG11c3QgYmUKK2NvbmZpZ3VyZWQgaW4gdGhlIGB+Ly5tMi9zZXR0aW5ncy54bWxgIGZpbGUuCisKKy0tLS0KKyAgPHNldHRpbmdzIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9TRVRUSU5HUy8xLjAuMCIKKyAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1NFVFRJTkdTLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9zZXR0aW5ncy0xLjAuMC54c2QiPgorICAgIDxzZXJ2ZXJzPgorICAgICAgPHNlcnZlcj4KKyAgICAgICAgPGlkPmdlcnJpdC1hcGktcmVwb3NpdG9yeTwvaWQ+CisgICAgICAgIDx1c2VybmFtZT5HT09HLi5FWEFNUExFLi4uLi5FWEFNUExFPC91c2VybmFtZT4KKyAgICAgICAgPHBhc3N3b3JkPkVYQU1QTEUuLkVYQU1QTEUuLkVYQU1QTEU8L3Bhc3N3b3JkPgorICAgICAgPC9zZXJ2ZXI+CisgICAgICA8c2VydmVyPgorICAgICAgICA8aWQ+Z2Vycml0LW1hdmVuLXJlcG9zaXRvcnk8L2lkPgorICAgICAgICA8dXNlcm5hbWU+R09PRy4uRVhBTVBMRS4uLi4uRVhBTVBMRTwvdXNlcm5hbWU+CisgICAgICAgIDxwYXNzd29yZD5FWEFNUExFLi5FWEFNUExFLi5FWEFNUExFPC9wYXNzd29yZD4KKyAgICAgIDwvc2VydmVyPgorICAgICAgPHNlcnZlcj4KKyAgICAgICAgPGlkPmdlcnJpdC1wbHVnaW5zLXJlcG9zaXRvcnk8L2lkPgorICAgICAgICA8dXNlcm5hbWU+R09PRy4uRVhBTVBMRS4uLi4uRVhBTVBMRTwvdXNlcm5hbWU+CisgICAgICAgIDxwYXNzd29yZD5FWEFNUExFLi5FWEFNUExFLi5FWEFNUExFPC9wYXNzd29yZD4KKyAgICAgIDwvc2VydmVyPgorICAgIDwvc2VydmVycz4KKyAgPC9zZXR0aW5ncz4KKy0tLS0KKworW1tkZXBsb3ktY29uZmlndXJhdGlvbi1zdWJwcm9qZWN0c11dCitHZXJyaXQgU3VicHJvamVjdHMKK35+fn5+fn5+fn5+fn5+fn5+fgorCisqIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBgcG9tLnhtbGAgdG8gbWFrZSBpdAorZGVwbG95YWJsZSB0byB0aGUgYGdlcnJpdC1tYXZlbmAgc3RvcmFnZSBidWNrZXQ6CisKKy0tLS0KKyAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8aWQ+Z2Vycml0LW1hdmVuLXJlcG9zaXRvcnk8L2lkPgorICAgICAgPG5hbWU+R2Vycml0IE1hdmVuIFJlcG9zaXRvcnk8L25hbWU+CisgICAgICA8dXJsPnMzOi8vZ2Vycml0LW1hdmVuQGNvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tPC91cmw+CisgICAgICA8dW5pcXVlVmVyc2lvbj50cnVlPC91bmlxdWVWZXJzaW9uPgorICAgIDwvcmVwb3NpdG9yeT4KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorLS0tLQorCisKKyogQWRkIHRoaXMgdG8gdGhlIGBwb20ueG1sYCB0byBlbmFibGUgdGhlIHdhZ29uIHByb3ZpZGVyOgorCistLS0tCisgIDxidWlsZD4KKyAgICA8ZXh0ZW5zaW9ucz4KKyAgICAgIDxleHRlbnNpb24+CisgICAgICAgIDxncm91cElkPm5ldC5hbnppeC5hd3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnMzLW1hdmVuLXdhZ29uPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+CisgICAgICA8L2V4dGVuc2lvbj4KKyAgICA8L2V4dGVuc2lvbnM+CisgIDwvYnVpbGQ+CistLS0tCisKKworW1tkZXBsb3ktY29uZmlndXJhdGlvbi1jb3JlLXBsdWdpbnNdXQorR2Vycml0IENvcmUgUGx1Z2lucworfn5+fn5+fn5+fn5+fn5+fn5+fgorCisqIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGluIHRoZSBgcG9tLnhtbGAgdG8gbWFrZSBpdAorZGVwbG95YWJsZSB0byB0aGUgYGdlcnJpdC1wbHVnaW5zYCBzdG9yYWdlIGJ1Y2tldDoKKworLS0tLQorICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxpZD5nZXJyaXQtcGx1Z2lucy1yZXBvc2l0b3J5PC9pZD4KKyAgICAgIDxuYW1lPkdlcnJpdCBQbHVnaW5zIFJlcG9zaXRvcnk8L25hbWU+CisgICAgICA8dXJsPnMzOi8vZ2Vycml0LXBsdWdpbnNAY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb208L3VybD4KKyAgICAgIDx1bmlxdWVWZXJzaW9uPnRydWU8L3VuaXF1ZVZlcnNpb24+CisgICAgPC9yZXBvc2l0b3J5PgorICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CistLS0tCisKKworKiBBZGQgdGhpcyB0byB0aGUgYHBvbS54bWxgIHRvIGVuYWJsZSB0aGUgd2Fnb24gcHJvdmlkZXI6CisKKy0tLS0KKyAgPGJ1aWxkPgorICAgIDxleHRlbnNpb25zPgorICAgICAgPGV4dGVuc2lvbj4KKyAgICAgICAgPGdyb3VwSWQ+bmV0LmFueml4LmF3czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+czMtbWF2ZW4td2Fnb248L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMjwvdmVyc2lvbj4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvZXh0ZW5zaW9ucz4KKyAgPC9idWlsZD4KKy0tLS0KKworCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtcmVsZWFzZS1zdWJwcm9qZWN0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2Utc3VicHJvamVjdC50eHQKaW5kZXggNzk5ZmYyZC4uNWUzNzcwZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXYtcmVsZWFzZS1zdWJwcm9qZWN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLXN1YnByb2plY3QudHh0CkBAIC0xLDk2ICsxLDEwNiBAQAogTWFraW5nIGEgUmVsZWFzZSBvZiBhIEdlcnJpdCBTdWJwcm9qZWN0IC8gQ29yZSBQbHVnaW4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVByZXBhcmluZyBhIE5ldyBTbmFwc2hvdCBmb3IgUHVibGlzaGluZwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbW21ha2Utc25hcHNob3RdXQorTWFrZSBhIFNuYXBzaG90CistLS0tLS0tLS0tLS0tLS0KIAotKiBZb3Ugd2lsbCBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBpbiB0aGUgYHBvbS54bWxgIHRvIG1ha2UgaXQKLSAgZGVwbG95YWJsZSB0byB0aGUgYGdlcnJpdC1tYXZlbmAgc3RvcmFnZSBidWNrZXQ6CisqIE9ubHkgZm9yIHBsdWdpbnM6CisqKiBJbiB0aGUgYHBvbS54bWxgIHVwZGF0ZSB0aGUgR2Vycml0IHZlcnNpb24gdW5kZXIgYHByb3BlcnRpZXNgID4KK2BHZXJyaXQtQXBpVmVyc2lvbmAgdG8gdGhlIHZlcnNpb24gb2YgdGhlIG5ldyBHZXJyaXQKK3JlbGVhc2UuCisqKiBNYWtlIHN1cmUgdGhhdCB0aGUgVVJMIGZvciB0aGUgTWF2ZW4gcmVwb3NpdG9yeSB3aXRoIHRoZSBpZAorYGdlcnJpdC1hcGktcmVwb3NpdG9yeWAgaW4gdGhlIGBwb20ueG1sYCBpcyBjb3JyZWN0LgorKworSWYgYEdlcnJpdC1BcGlWZXJzaW9uYCByZWZlcmVuY2VzIGEgcmVsZWFzZWQgR2Vycml0IHZlcnNpb24gaXQgbXVzdCBiZQorYGh0dHBzOi8vZ2Vycml0LWFwaS5jb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9yZWxlYXNlL2AsIGlmCitgR2Vycml0LUFwaVZlcnNpb25gIHJlZmVyZW5jZXMgYSBzbmFwc2hvdCBHZXJyaXQgdmVyc2lvbiBpdCBtdXN0IGJlCitgaHR0cHM6Ly9nZXJyaXQtYXBpLmNvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tL3NuYXBzaG90L2AuCiAKLS0tLS0KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHJlcG9zaXRvcnk+Ci0gICAgICA8aWQ+Z2Vycml0LW1hdmVuPC9pZD4KLSAgICAgIDxuYW1lPmdlcnJpdCBNYXZlbiBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgPHVybD5zMzovL2dlcnJpdC1tYXZlbkBjb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbTwvdXJsPgotICAgICAgPHVuaXF1ZVZlcnNpb24+dHJ1ZTwvdW5pcXVlVmVyc2lvbj4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLS0tLS0KKyogQnVpbGQgdGhlIGxhdGVzdCBzbmFwc2hvdCBhbmQgaW5zdGFsbCBpdCBpbnRvIHRoZSBsb2NhbCBNYXZlbgorcmVwb3NpdG9yeToKKysKKz09PT0KKyAgbXZuIGNsZWFuIGluc3RhbGwKKz09PT0KKworKiBUZXN0IEdlcnJpdCB3aXRoIHRoaXMgc25hcHNob3QgbG9jYWxseQogCiAKLSogQWRkIHRoaXMgdG8gdGhlIGBwb20ueG1sYCB0byBlbmFibGUgdGhlIHdhZ29uIHByb3ZpZGVyOgorUHVibGlzaCBTbmFwc2hvdAorLS0tLS0tLS0tLS0tLS0tLQogCi0tLS0tCi0gIDxidWlsZD4KLSAgICA8ZXh0ZW5zaW9ucz4KLSAgICAgIDxleHRlbnNpb24+Ci0gICAgICAgIDxncm91cElkPm5ldC5hbnppeC5hd3M8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnMzLW1hdmVuLXdhZ29uPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICA8L2V4dGVuc2lvbnM+Ci0gIDwvYnVpbGQ+Ci0tLS0tCitJZiBhIFNuYXBzaG90IGZvciBhIFN1YnByb2plY3Qgd2FzIGNyZWF0ZWQgdGhhdCBzaG91bGQgYmUgcmVmZXJlbmNlZCBieQorR2Vycml0IHdoaWxlIGN1cnJlbnQgR2Vycml0IGRldmVsb3BtZW50IGlzIG9uZ29pbmcsIHRoaXMgU25hcHNob3QgbmVlZHMKK3RvIGJlIHB1Ymxpc2hlZC4KIAorKiBNYWtlIHN1cmUgeW91IGhhdmUgZG9uZSB0aGUgY29uZmlndXJhdGlvbiBuZWVkZWQgZm9yIGRlcGxveW1lbnQ6CisqKiBsaW5rOmRldi1yZWxlYXNlLWRlcGxveS1jb25maWcuaHRtbCNkZXBsb3ktY29uZmlndXJhdGlvbi1zZXR0aW5ncy14bWxbCitDb25maWd1cmF0aW9uIGluIE1hdmVuIGBzZXR0aW5ncy54bWxgXQorKiogbGluazpkZXYtcmVsZWFzZS1kZXBsb3ktY29uZmlnLmh0bWwjZGVwbG95LWNvbmZpZ3VyYXRpb24tc3VicHJvamVjdHNbCitDb25maWd1cmF0aW9uIGZvciBTdWJwcm9qZWN0cyBpbiBgcG9tLnhtbGBdCiAKLSogQWRkIHlvdXIgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIHlvdXIgYH4vLm0yL3NldHRpbmdzLnhtbGAgZmlsZS4KLSAgVGhlc2UgbmVlZCB0byBjb21lIGZyb20gdGhlIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vYXBpcy9jb25zb2xlL1tBUEkgQ29uc29sZV0uCi0KLS0tLS0KLSAgPHNldHRpbmdzIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9TRVRUSU5HUy8xLjAuMCIKLSAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1NFVFRJTkdTLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9zZXR0aW5ncy0xLjAuMC54c2QiPgotICAgIDxzZXJ2ZXJzPgotICAgICAgPHNlcnZlcj4KLSAgICAgICAgPGlkPmdlcnJpdC1tYXZlbjwvaWQ+Ci0gICAgICAgIDx1c2VybmFtZT5HT09HLi5FWEFNUExFLi4uLi5FWEFNUExFPC91c2VybmFtZT4KLSAgICAgICAgPHBhc3N3b3JkPkVYQU1QTEUuLkVYQU1QTEUuLkVYQU1QTEU8L3Bhc3N3b3JkPgotICAgICAgPC9zZXJ2ZXI+Ci0gICAgPC9zZXJ2ZXJzPgotICA8L3NldHRpbmdzPgotLS0tLQotCi0KLU1ha2luZyBhIFNuYXBzaG90Ci0tLS0tLS0tLS0tLS0tLS0tLQotCi0qIE9ubHkgZm9yIHBsdWdpbnM6IGluIHRoZSBgcG9tLnhtbGAgdXBkYXRlIHRoZSBHZXJyaXQgdmVyc2lvbiB1bmRlcgotYHByb3BlcnRpZXNgID4gYEdlcnJpdC1BcGlWZXJzaW9uYCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgbmV3IEdlcnJpdAotcmVsZWFzZQotKiBGaXJzdCBidWlsZCBhbmQgZGVwbG95IHRoZSBsYXRlc3Qgc25hcHNob3QgYW5kIGVuc3VyZSB0aGF0IEdlcnJpdAotYnVpbGRzL3J1bnMgd2l0aCB0aGlzIHNuYXBzaG90Ci0KLSogRGVwbG95IHRoZSBzbmFwc2hvdDoKLQorKiBEZXBsb3kgdGhlIG5ldyBzbmFwc2hvdDoKKysKID09PT0KICAgbXZuIGRlcGxveQogPT09PQogCisqIENoYW5nZSB0aGUgdmVyc2lvbiBpbiB0aGUgR2Vycml0IHBhcmVudCBgcG9tLnhtbGAgZm9yIHRoZSBTdWJwcm9qZWN0Cit0byB0aGUgYFNOQVBTSE9UYCB2ZXJzaW9uCisrCitXaGVuIEdlcnJpdCBnZXRzIHJlbGVhc2VkLCBhIHJlbGVhc2Ugb2YgdGhlIFN1YnByb2plY3QgaGFzIHRvIGJlIGRvbmUKK2FuZCBHZXJyaXQgaGFzIHRvIHJlZmVyZW5jZSB0aGUgcmVsZWFzZWQgU3VicHJvamVjdCB2ZXJzaW9uLgogCi1NYWtpbmcgYSBSZWxlYXNlCi0tLS0tLS0tLS0tLS0tLS0tCiAKLSogRmlyc3QgZGVwbG95IChhbmQgdGVzdCkgdGhlIGxhdGVzdCBzbmFwc2hvdCBmb3IgdGhlIHN1YnByb2plY3QvcGx1Z2luCitbW3ByZXBhcmUtcmVsZWFzZV1dCitQcmVwYXJlIHRoZSBSZWxlYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogbGluazojbWFrZS1zbmFwc2hvdFtGaXJzdCBjcmVhdGUgKGFuZCB0ZXN0KSB0aGUgbGF0ZXN0IHNuYXBzaG90IGZvcgordGhlIHN1YnByb2plY3QvcGx1Z2luXQogCiAqIFVwZGF0ZSB0aGUgdG9wIGxldmVsIGBwb20ueG1sYCBpbiB0aGUgc3VicHJvamVjdC9wbHVnaW4gdG8gcmVmbGVjdAogdGhlIG5ldyBwcm9qZWN0IHZlcnNpb24gKHRoZSBleGFjdCB2YWx1ZSBvZiB0aGUgdGFnIHlvdSB3aWxsIGNyZWF0ZQogYmVsb3cpCiAKLSogQ29tbWl0IHRoZSBwb20gY2hhbmdlIGFuZCBwdXNoIHRvIHRoZSBwcm9qZWN0J3MgcmVwbwotYHJlZnMvZm9yLzxtYXN0ZXIvc3RhYmxlPmAKLQotKiBUYWcgdGhlIHZlcnNpb24geW91IGp1c3QgcHVzaGVkIChhbmQgcHVzaCB0aGUgdGFnKQotCisqIENyZWF0ZSB0aGUgUmVsZWFzZSBUYWcKKysKID09PT0KICBnaXQgdGFnIC1hIC1tICJwcm9sb2ctY2FmZSAxLjMiIHYxLjMKLSBnaXQgcHVzaCBnZXJyaXQtcmV2aWV3IHJlZnMvdGFncy92MS4zOnJlZnMvdGFncy92MS4zCiA9PT09CiAKKyogQnVpbGQgYW5kIGluc3RhbGwgaW50byBsb2NhbCBNYXZlbiByZXBvc2l0b3J5OgorKworPT09PQorICBtdm4gY2xlYW4gaW5zdGFsbAorPT09PQorCisKK1tbcHVibGlzaC1yZWxlYXNlXV0KK1B1Ymxpc2ggdGhlIFJlbGVhc2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBNYWtlIHN1cmUgeW91IGhhdmUgZG9uZSB0aGUgY29uZmlndXJhdGlvbiBuZWVkZWQgZm9yIGRlcGxveW1lbnQ6CisqKiBsaW5rOmRldi1yZWxlYXNlLWRlcGxveS1jb25maWcuaHRtbCNkZXBsb3ktY29uZmlndXJhdGlvbi1zZXR0aW5ncy14bWxbCitDb25maWd1cmF0aW9uIGluIE1hdmVuIGBzZXR0aW5ncy54bWxgXQorKiogQ29uZmlndXJhdGlvbiBpbiBgcG9tLnhtbGAgZm9yCitsaW5rOmRldi1yZWxlYXNlLWRlcGxveS1jb25maWcuaHRtbCNkZXBsb3ktY29uZmlndXJhdGlvbi1zdWJwcm9qZWN0c1tTdWJwcm9qZWN0c10gb3IKK2xpbms6ZGV2LXJlbGVhc2UtZGVwbG95LWNvbmZpZy5odG1sI2RlcGxveS1jb25maWd1cmF0aW9uLWNvcmUtcGx1Z2luc1tDb3JlIFBsdWdpbnNdCisKICogRGVwbG95IHRoZSBuZXcgcmVsZWFzZToKLQorKwogPT09PQotIG12biBkZXBsb3kKKyAgbXZuIGRlcGxveQorPT09PQorCisqIFB1c2ggdGhlIHBvbSBjaGFuZ2UocykgdG8gdGhlIHByb2plY3QncyByZXBvc2l0b3J5CitgcmVmcy9mb3IvPG1hc3RlcnxzdGFibGU+YAorCisqIFB1c2ggdGhlIFJlbGVhc2UgVGFnCisrCis9PT09CisgIGdpdCBwdXNoIGdlcnJpdC1yZXZpZXcgcmVmcy90YWdzL3YxLjM6cmVmcy90YWdzL3YxLjMKID09PT0KIAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi1yZWxlYXNlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2UudHh0CmluZGV4IDVlYTMwNDIuLmFlMmFlZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXJlbGVhc2UudHh0CkBAIC0xMSw3ICsxMSw3IEBACiAKIFRvIG1ha2UgYSBHZXJyaXQgcmVsZWFzZSBpbnZvbHZlcyBhIGdyZWF0IGRlYWwgb2YgY29tcGxleAogdGFza3MgYW5kIGl0IGlzIGVhc3kgdG8gbWlzcyBhIHN0ZXAgc28gdGhpcyBkb2N1bWVudCBzaG91bGQKLWhvcGVmdWx5IHNlcnZlIGFzIGJvdGggYSBob3cgdG8gZm9yIHRob3NlIG5ldyB0byB0aGUgcHJvY2VzcworaG9wZWZ1bGx5IHNlcnZlIGFzIGJvdGggYSBob3cgdG8gZm9yIHRob3NlIG5ldyB0byB0aGUgcHJvY2VzcwogYW5kIGFzIGEgY2hlY2tsaXN0IGZvciB0aG9zZSBhbHJlYWR5IGZhbWlsaWFyIHdpdGggdGhlc2UKIHRhc2tzLgogCkBAIC0yMCwxNDIgKzIwLDIxNSBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBIZXJlIGFyZSBzb21lIGd1aWRlbGluZXMgb24gcmVsZWFzZSBhcHByb2FjaGVzIGRlcGVuZGluZyBvbiB0aGUKLXR5cGUgb2YgcmVsZWFzZSB5b3Ugd2FudCB0byBtYWtlIChzdGFibGUtZml4LCBzdGFibGUsIFJDMCwgUkMxLi4uKS4KK3R5cGUgb2YgcmVsZWFzZSB5b3Ugd2FudCB0byBtYWtlIChgc3RhYmxlLWZpeGAsIGBzdGFibGVgLCBgUkMwYCwKK2BSQzFgLi4uKS4KIAorW1tzdGFibGVdXQogU3RhYmxlCiB+fn5+fn4KIAotQSBzdGFibGUgcmVsZWFzZSBpcyBnZW5lcmFsbHkgYnVpbHQgZnJvbSB0aGUgbWFzdGVyIGJyYW5jaCBhbmQgbWF5IG5lZWQgdG8KLXVuZGVyZ28gc29tZSBzdGFiaWxpemF0aW9uIGJlZm9yZSByZWxlYXNpbmcgdGhlIGZpbmFsIHJlbGVhc2UuCitBIGBzdGFibGVgIHJlbGVhc2UgaXMgZ2VuZXJhbGx5IGJ1aWx0IGZyb20gdGhlIGBtYXN0ZXJgIGJyYW5jaCBhbmQgbWF5CituZWVkIHRvIHVuZGVyZ28gc29tZSBzdGFiaWxpemF0aW9uIGJlZm9yZSByZWxlYXNpbmcgdGhlIGZpbmFsIHJlbGVhc2UuCiAKICogUHJvcG9zZSB0aGUgcmVsZWFzZSB3aXRoIGFueSBwbGFucy9vYmplY3RpdmVzIHRvIHRoZSBtYWlsaW5nIGxpc3QKIAotKiBDcmVhdGUgYSBHZXJyaXQgUkMwCisqIENyZWF0ZSBhIEdlcnJpdCBgUkMwYAogCi0qIElmIG5lZWRlZCBjcmVhdGUgYSBHZXJyaXQgUkMxCisqIElmIG5lZWRlZCBjcmVhdGUgYSBHZXJyaXQgYFJDMWAKIAogW05PVEVdCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFlvdSBtYXkgbGV0IGluIGEgZmV3IGZlYXR1cmVzIHRvIHRoaXMgcmVsZWFzZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSogSWYgbmVlZGVkIGNyZWF0ZSBhIEdlcnJpdCBSQzIKKyogSWYgbmVlZGVkIGNyZWF0ZSBhIEdlcnJpdCBgUkMyYAogCiBbTk9URV0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogVGhlcmUgc2hvdWxkIGJlIG5vIG5ldyBmZWF0dXJlcyBpbiB0aGlzIHJlbGVhc2UsIG9ubHkgYnVnIGZpeGVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotKiBGaW5hbGx5IGNyZWF0ZSB0aGUgc3RhYmxlIHJlbGVhc2UgKG5vIFJDKQorKiBGaW5hbGx5IGNyZWF0ZSB0aGUgYHN0YWJsZWAgcmVsZWFzZSAobm8gYFJDYCkKIAogCiBTdGFibGUtRml4CiB+fn5+fn5+fn5+CiAKLVN0YWJsZS1maXggcmVsZWFzZXMgc2hvdWxkIGxpa2VseSBvbmx5IGNvbnRhaW4gYnVnIGZpeGVzIGFuZCBkb2MgdXBkYXRlcy4KK2BzdGFibGUtZml4YCByZWxlYXNlcyBzaG91bGQgbGlrZWx5IG9ubHkgY29udGFpbiBidWcgZml4ZXMgYW5kIGRvYwordXBkYXRlcy4KIAogKiBQcm9wb3NlIHRoZSByZWxlYXNlIHdpdGggYW55IHBsYW5zL29iamVjdGl2ZXMgdG8gdGhlIG1haWxpbmcgbGlzdAogCi0qIFRoaXMgdHlwZSBvZiByZWxlYXNlIGRvZXMgbm90IG5lZWQgYW55IFJDcywgcmVsZWFzZSB3aGVuIHRoZSBvYmplY3RpdmVzCi0gIGFyZSBtZXQKKyogVGhpcyB0eXBlIG9mIHJlbGVhc2UgZG9lcyBub3QgbmVlZCBhbnkgUkNzLCByZWxlYXNlIHdoZW4gdGhlCitvYmplY3RpdmVzIGFyZSBtZXQKIAogCitbW3NlY3VyaXR5XV0KK1NlY3VyaXR5LUZpeAorfn5+fn5+fn5+fn5+CisKK2BzZWN1cml0eS1maXhgIHJlbGVhc2VzIHNob3VsZCBvbmx5IGNvbnRhaW4gYnVnIGZpeGVzIGZvciBzZWN1cml0eQoraXNzdWVzLgorCitGb3Igc2VjdXJpdHkgaXNzdWVzIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZXkgYXJlIG9ubHkgYW5ub3VuY2VkCisqYWZ0ZXIqIGZpeGVkIHZlcnNpb25zIGZvciBhbGwgcmVsZXZhbnQgcmVsZWFzZXMgaGF2ZSBiZWVuIHB1Ymxpc2hlZC4KK0JlY2F1c2Ugb2YgdGhpcywgYHNlY3VyaXR5LWZpeGAgcmVsZWFzZXMgY2FuJ3QgYmUgcHJlcGFyZWQgaW4gdGhlIHB1YmxpYworYGdlcnJpdGAgcHJvamVjdC4KKworYHNlY3VyaXR5LWZpeGAgcmVsZWFzZXMgYXJlIHByZXBhcmVkIGluIHRoZSBgZ2Vycml0LXNlY3VyaXR5LWZpeGVzYAorcHJvamVjdCB3aGljaCBpcyBvbmx5IHJlYWRhYmxlIGJ5IHRoZSBHZXJyaXQgTWFpbnRhaW5lcnMuIE9ubHkgYWZ0ZXIKK2EgYHNlY3VyaXR5LWZpeGAgcmVsZWFzZSBoYXMgYmVlbiBwdWJsaXNoZWQgd2lsbCB0aGUgY29tbWl0cy90YWdzIG1hZGUgaW4KK3RoZSBgZ2Vycml0LXNlY3VyaXR5LWZpeGVzYCBwcm9qZWN0IGJlIHRha2VuIG92ZXIgaW50byB0aGUgcHVibGljCitgZ2Vycml0YCBwcm9qZWN0LgorCiAKIENyZWF0ZSB0aGUgQWN0dWFsIFJlbGVhc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1JbiB0aGUgZXhhbXBsZSBjb21tYW5kcyBiZWxvdyB3ZSBhc3N1bWUgdGhhdCB0aGUgbGFzdCByZWxlYXNlIHdhcyAnMi40JyBhbmQgdGhhdAotd2UgYXJlIHByZXBhcmluZyAnMi41JyByZWxlYXNlLgorVG8gY3JlYXRlIGEgR2Vycml0IHJlbGVhc2UgdGhlIGZvbGxvd2luZyBzdGVwcyBoYXZlIHRvIGJlIGRvbmU6CiAKLVByZXBhcmUgdGhlIFN1YnByb2plY3RzCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0qIFB1Ymxpc2ggdGhlIGxhdGVzdCBzbmFwc2hvdCBmb3IgYWxsIHN1YnByb2plY3RzCi0qIEZyZWV6ZSBhbGwgc3VicHJvamVjdHMgYW5kIGxpbms6ZGV2LXJlbGVhc2Utc3VicHJvamVjdC5odG1sW3B1Ymxpc2hdCi0gIHRoZW0hCisuIGxpbms6I3N1YnByb2plY3RbUmVsZWFzZSBTdWJwcm9qZWN0c10KKy4gbGluazojcHJlcGFyZS1nZXJyaXRbUHJlcGFyZSB0aGUgR2Vycml0IFJlbGVhc2VdCisuLiBsaW5rOiNwcmVwYXJlLXdhci1hbmQtcGx1Z2luLWFwaVtQcmVwYXJlIHRoZSBHZXJyaXQgV0FSIGFuZCB0aGUgUGx1Z2luIEFQSSBKYXJdCisuLiBsaW5rOiNwcmVwYXJlLWNvcmUtcGx1Z2luc1tQcmVwYXJlIHRoZSBDb3JlIFBsdWdpbnNdCisuLiBsaW5rOiNwcmVwYXJlLXdhci13aXRoLXBsdWdpbnNbUHJlcGFyZSBHZXJyaXQgV0FSIHdpdGggQ29yZSBQbHVnaW5zXQorLiBsaW5rOiNwdWJsaXNoLWdlcnJpdFtQdWJsaXNoIHRoZSBHZXJyaXQgUmVsZWFzZV0KKy4uIGxpbms6I2V4dGVuc2lvbi1hbmQtcGx1Z2luLWFwaVtQdWJsaXNoIHRoZSBFeHRlbnNpb24gYW5kIFBsdWdpbiBBUEkgSmFyc10KKy4uIGxpbms6I3B1Ymxpc2gtY29yZS1wbHVnaW5zW1B1Ymxpc2ggdGhlIENvcmUgUGx1Z2luc10KKy4uIGxpbms6I3B1Ymxpc2gtZ2Vycml0LXdhcltQdWJsaXNoIHRoZSBHZXJyaXQgV0FSICh3aXRoIENvcmUgUGx1Z2lucyldCisuLiBsaW5rOiNwdXNoLXN0YWJsZVtQdXNoIHRoZSBTdGFibGUgQnJhbmNoXQorLi4gbGluazojcHVzaC10YWdbUHVzaCB0aGUgUmVsZWFzZSBUYWddCisuLiBsaW5rOiN1cGxvYWQtZG9jdW1lbnRhdGlvbltVcGxvYWQgdGhlIERvY3VtZW50YXRpb25dCisuLiBsaW5rOiN1cGRhdGUtaXNzdWVzW1VwZGF0ZSB0aGUgSXNzdWVzXQorLi4gbGluazojYW5ub3VuY2VbQW5ub3VuY2Ugb24gTWFpbGluZyBMaXN0XQorLiBsaW5rOiNpbmNyZWFzZS12ZXJzaW9uW0luY3JlYXNlIEdlcnJpdCBWZXJzaW9uIGZvciBDdXJyZW50IERldmVsb3BtZW50XQorLiBsaW5rOiNtZXJnZS1zdGFibGVbTWVyZ2UgYHN0YWJsZWAgaW50byBgbWFzdGVyYF0KIAogCi1QcmVwYXJlIEdlcnJpdAotfn5+fn5+fn5+fn5+fn4KK1tbc3VicHJvamVjdF1dCitSZWxlYXNlIFN1YnByb2plY3RzCit+fn5+fn5+fn5+fn5+fn5+fn5+CiAKLSogQ3JlYXRlIGEgYHN0YWJsZS0yLjVgIGJyYW5jaCBmb3IgbWFraW5nIHRoZSBuZXcgcmVsZWFzZQorVGhlIHN1YnByb2plY3RzIHRvIGJlIHJlbGVhc2VkIGFyZToKIAotKiBJbiB0aGUgYG1hc3RlcmAgYnJhbmNoOiBVcGRhdGUgdGhlIHBvbXMgZm9yIHRoZSBHZXJyaXQgdmVyc2lvbiwgcHVzaCBmb3IKLXJldmlldywgZ2V0IG1lcmdlZAorKiBgZ3d0ZXhwdWlgCisqIGBnd3Rqc29ucnBjYAorKiBgZ3d0b3JtYAorKiBgcHJvbG9nLWNhZmVgCiAKK0ZvciBlYWNoIHN1YnByb2plY3QgZG86CisKKyogQ2hlY2sgdGhlIGRlcGVuZGVuY3kgdG8gdGhlIFN1YnByb2plY3QgaW4gdGhlIEdlcnJpdCBwYXJlbnQgYHBvbS54bWxgOgorKworSWYgYSBgU05BUFNIT1RgIHZlcnNpb24gb2YgdGhlIHN1YnByb2plY3QgaXMgcmVmZXJlbmNlZCB0aGUgc3VicHJvamVjdAorbmVlZHMgdG8gYmUgcmVsZWFzZWQgc28gdGhhdCBHZXJyaXQgY2FuIHJlZmVyZW5jZSBhIHJlbGVhc2VkIHZlcnNpb24gb2YKK3RoZSBzdWJwcm9qZWN0LgorCisqIGxpbms6ZGV2LXJlbGVhc2Utc3VicHJvamVjdC5odG1sI21ha2Utc25hcHNob3RbTWFrZSBhIHNuYXBzaG90IGFuZCB0ZXN0IGl0XQorKiBsaW5rOmRldi1yZWxlYXNlLXN1YnByb2plY3QuaHRtbCNwcmVwYXJlLXJlbGVhc2VbUHJlcGFyZSB0aGUgUmVsZWFzZV0KKyogbGluazpkZXYtcmVsZWFzZS1zdWJwcm9qZWN0Lmh0bWwjcHVibGlzaC1yZWxlYXNlW1B1Ymxpc2ggdGhlIFJlbGVhc2VdCisKKyogVXBkYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBTdWJwcm9qZWN0IGluIHRoZSBHZXJyaXQgcGFyZW50IGBwb20ueG1sYAordG8gdGhlIHJlbGVhc2VkIHZlcnNpb24KKworCitbW2J1aWxkLWdlcnJpdF1dCitCdWlsZCBHZXJyaXQKK35+fn5+fn5+fn5+fgorCisqIEJ1aWxkIHRoZSBHZXJyaXQgV0FSCisrCiA9PT09Ci0gdG9vbHMvdmVyc2lvbi5zaCAtLXNuYXBzaG90PTIuNQotPT09PQotCi0qIENoZWNrb3V0IHRoZSBgc3RhYmxlLTIuNWAgYnJhbmNoCi0qIFVwZGF0ZSB0aGUgdG9wIGxldmVsIGBwb20ueG1sYCBpbiBHZXJyaXQgdG8gZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUKLVN1YnByb2plY3RzIHBvaW50IHRvIHNuYXBzaG90IHJlbGVhc2VzCi0KLSogVGFnCi0KLT09PT0KLSBnaXQgdGFnIC1hIC1tICJnZXJyaXQgMi41LXJjMCIgdjIuNS1yYzAKLSBnaXQgdGFnIC1hIC1tICJnZXJyaXQgMi41IiB2Mi41Ci09PT09Ci0KLSogQnVpbGQgKHdpdGhvdXQgcGx1Z2lucykKLQotPT09PQorIHJtIC1mIH4vLm0yL3NldHRpbmdzLnhtbAogIC4vdG9vbHMvcmVsZWFzZS5zaAogPT09PQorKworW1dBUk5JTkddCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK01ha2Ugc3VyZSB5b3UgYXJlIGNvbXBpbGluZyB0aGUgcmVsZWFzZSBmb3IgYWxsIGJyb3dzZXJzLiBDaGVjayBpbiB5b3VyCitNYXZlbiBgfi8ubTIvc2V0dGluZ3MueG1sYCBmaWxlIHRoYXQgbm8gTWF2ZW4gcHJvZmlsZSBpcyBhY3RpdmUgdGhhdAorbGltaXRzIHRoZSBjb21waWxhdGlvbiB0byBhIGNlcnRhaW4gYnJvd3Nlci4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1bW3BsdWdpbi1hcGldXQotUHVibGlzaCB0aGUgUGx1Z2luIEFQSSBKQVIgRmlsZQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0qIFB1c2ggSkFSIHRvIGBjb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbWAKLSoqIFJ1biBgdG9vbHMvZGVwbG95X2FwaS5zaGAKLQotUHJlcGFyZSB0aGUgQ29yZSBQbHVnaW5zCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSogbGluazpkZXYtcmVsZWFzZS1zdWJwcm9qZWN0Lmh0bWxbUmVsZWFzZSBhbmQgcHVibGlzaF0gdGhlIGNvcmUgcGx1Z2lucwotCi1QYWNrYWdlIEdlcnJpdCB3aXRoIFBsdWdpbnMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotKiBFbnN1cmUgdGhhdCB0aGUgY29yZSBwbHVnaW5zIGxpc3RlZCBpbiBgZ2Vycml0LXBhY2thZ2UtcGx1Z2lucy9wb20ueG1sYAotcG9pbnQgdG8gdGhlIGxhdGVzdCByZWxlYXNlIHZlcnNpb24gKG5vIGRlcGVuZGVuY3kgdG8gc25hcHNob3QgdmVyc2lvbnMpCi0qIEluY2x1ZGUgY29yZSBwbHVnaW5zIGludG8gV0FSCi09PT09Ci0gJCAuL3Rvb2xzL3ZlcnNpb24uc2ggLS1yZWxlYXNlICYmIG12biBjbGVhbiBwYWNrYWdlIC1mIGdlcnJpdC1wYWNrYWdlLXBsdWdpbnMvcG9tLnhtbAotICQgLi90b29scy92ZXJzaW9uLnNoIC0tcmVzZXQKLT09PT0KLQotKiBGaW5kIFdBUiB0aGF0IGluY2x1ZGVzIHRoZSBjb3JlIHBsdWdpbnMgYXQKLWBnZXJyaXQtcGFja2FnZS1wbHVnaW5zXHRhcmdldFxnZXJyaXQtZnVsbC12Mi41LndhcmAKICogU2FuaXR5IGNoZWNrIFdBUgorKiBUZXN0IHRoZSBuZXcgR2Vycml0IHZlcnNpb24KIAotUHVibGlzaCB0byB0aGUgUHJvamVjdCBMb2NhdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbW3B1Ymxpc2gtZ2Vycml0XV0KK1B1Ymxpc2ggdGhlIEdlcnJpdCBSZWxlYXNlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCi1XQVIgRmlsZQotfn5+fn5+fn4KIAotKiBVcGxvYWQgV0FSIHRvIGNvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdCAobWFudWFsIHdlYiBicm93c2VyKQorW1tleHRlbnNpb24tYW5kLXBsdWdpbi1hcGldXQorUHVibGlzaCB0aGUgRXh0ZW5zaW9uIGFuZCBQbHVnaW4gQVBJIEphcnMKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKKyogTWFrZSBzdXJlIHlvdSBoYXZlIGRvbmUgdGhlCitsaW5rOmRldi1yZWxlYXNlLWRlcGxveS1jb25maWcuaHRtbCNkZXBsb3ktY29uZmlndXJhdGlvbi1zZXR0aW5ncy14bWxbCitjb25maWd1cmF0aW9uIG5lZWRlZCBmb3IgZGVwbG95bWVudF0KKworKiBQdXNoIHRoZSBKYXJzIHRvIGBjb21tb25kYXRhc3RvcmFnZS5nb29nbGVhcGlzLmNvbWA6CisrCistLS0tCisgIC4vdG9vbHMvZGVwbG95X2FwaS5zaAorLS0tLQorCisKK1tbcHVibGlzaC1jb3JlLXBsdWdpbnNdXQorUHVibGlzaCB0aGUgQ29yZSBQbHVnaW5zCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworKiBsaW5rOmRldi1yZWxlYXNlLXN1YnByb2plY3QuaHRtbCNwdWJsaXNoLXJlbGVhc2VbUHVibGlzaCB0aGUgUmVsZWFzZV0KKworCitbW3B1Ymxpc2gtZ2Vycml0LXdhcl1dCitQdWJsaXNoIHRoZSBHZXJyaXQgV0FSICh3aXRoIENvcmUgUGx1Z2lucykKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCisqIFRoZSBXQVIgZmlsZSB0byB1cGxvYWQgaXMgYGdlcnJpdC1wYWNrYWdlLXBsdWdpbnNcdGFyZ2V0XGdlcnJpdC1mdWxsLXYyLjUud2FyYAorKiBVcGxvYWQgV0FSIHRvIGBjb2RlLmdvb2dsZS5jb20vcC9nZXJyaXRgIChtYW51YWwgdmlhIHdlYiBicm93c2VyKQogKiogR28gdG8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9kb3dubG9hZHMvbGlzdAotKiogVXNlIHRoZSAiTmV3IERvd25sb2FkIiBidXR0b24KKyoqIFVzZSB0aGUgYE5ldyBEb3dubG9hZGAgYnV0dG9uCiAKICogVXBkYXRlIGxhYmVsczoKLSoqIG5ldyB3YXI6IFtyZWxlYXNlLWNhbmRpZGF0ZV0sIGZlYXR1cmVkLi4uCi0qKiBvbGQgd2FyOiBkZXByZWNhdGVkCisqKiBuZXcgd2FyOiBbYHJlbGVhc2UtY2FuZGlkYXRlYF0sIGBmZWF0dXJlZGAuLi4KKyoqIG9sZCB3YXI6IGBkZXByZWNhdGVkYAogCi1UYWcKLX5+fgogCi0qIFB1c2ggdGhlIE5ldyBUYWcKK1tbcHVzaC1zdGFibGVdXQorUHVzaCB0aGUgU3RhYmxlIEJyYW5jaAorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCisqIGNyZWF0ZSB0aGUgc3RhYmxlIGJyYW5jaCBgc3RhYmxlLTIuNWAgaW4gdGhlIGBnZXJyaXRgIHByb2plY3QKKysKK1ZpYSB0aGUgbGluazpodHRwczovL2dlcnJpdC1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS8jL2FkbWluL3Byb2plY3RzL2dlcnJpdCxicmFuY2hlc1sKK0dlcnJpdCBXZWJVSV0gb3IgYnkgcHVzaC4KKworKiBQdXNoIHRoZSBjb21taXRzIGRvbmUgb24gYHN0YWJsZS0yLjVgIHRvIGByZWZzL2Zvci9zdGFibGUtMi41YCBhbmQKK2dldCB0aGVtIG1lcmdlZAorCisKK1tbcHVzaC10YWddXQorUHVzaCB0aGUgUmVsZWFzZSBUYWcKK15eXl5eXl5eXl5eXl5eXl5eXl5eCisKKyogUHVzaCB0aGUgbmV3IFJlbGVhc2UgVGFnCisrCitGb3IgYW4gYFJDYDoKKysKID09PT0KICBnaXQgcHVzaCBnZXJyaXQtcmV2aWV3IHJlZnMvdGFncy92Mi41LXJjMDpyZWZzL3RhZ3MvdjIuNS1yYzAKKz09PT0KKysKK0ZvciBhIGZpbmFsIGBzdGFibGVgIHJlbGVhc2U6CisrCis9PT09CiAgZ2l0IHB1c2ggZ2Vycml0LXJldmlldyByZWZzL3RhZ3MvdjIuNTpyZWZzL3RhZ3MvdjIuNQogPT09PQogCiAKLURvY3MKLX5+fn4KK1tbdXBsb2FkLWRvY3VtZW50YXRpb25dXQorVXBsb2FkIHRoZSBEb2N1bWVudGF0aW9uCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAogPT09PQogIG1ha2UgLUMgRG9jdW1lbnRhdGlvbiBQUklPUj0yLjQgdXBkYXRlCkBAIC0xNjcsMTQgKzI0MCwxNCBAQAogKiBVcGRhdGUgR29vZ2xlIENvZGUgcHJvamVjdCBsaW5rcwogKiogR28gdG8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9hZG1pbgogKiogUG9pbnQgdGhlIG1haW4gcGFnZSB0byB0aGUgbmV3IGRvY3MuIFRoZSBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uIGhhcyB0byBiZQotdXBkYXRlZCBhdCB0d28gcGxhY2VzOiBpbiB0aGUgcHJvamVjdCBkZXNjcmlwdGlvbiBhbmQgYWxzbyBpbiB0aGUgTGlua3MKK3VwZGF0ZWQgYXQgdHdvIHBsYWNlczogaW4gdGhlIHByb2plY3QgZGVzY3JpcHRpb24gYW5kIGFsc28gaW4gdGhlIGBMaW5rc2AKIHNlY3Rpb24uCiAqKiBQb2ludCB0aGUgbWFpbiBwYWdlIHRvIHRoZSBuZXcgcmVsZWFzZSBub3RlcwogCiBbTk9URV0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotVGhlIGRvY3MgbWFrZWZpbGUgZG9lcyBhbiBzdm4gY3Agb2YgdGhlIHByaW9yIHJldmlzaW9uIG9mIHRoZSBkb2NzIHRvIGJyYW5jaAotdGhlIGRvY3Mgc28geW91IGhhdmUgbGVzcyB0byB1cGxvYWQgb24gdGhlIG5ldyBkb2NzLgorVGhlIGRvY3MgbWFrZWZpbGUgZG9lcyBhbiBgc3ZuIGNwYCBvZiB0aGUgcHJpb3IgcmV2aXNpb24gb2YgdGhlIGRvY3MgdG8KK2JyYW5jaCB0aGUgZG9jcyBzbyB5b3UgaGF2ZSBsZXNzIHRvIHVwbG9hZCBvbiB0aGUgbmV3IGRvY3MuCiAKIFVzZXIgYW5kIHBhc3N3b3JkIGZyb20gaGVyZToKIApAQCAtMTg4LDMwICsyNjEsMzMgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAKLUlzc3Vlcwotfn5+fn5+CitbW3VwZGF0ZS1pc3N1ZXNdXQorVXBkYXRlIHRoZSBJc3N1ZXMKK15eXl5eXl5eXl5eXl5eXl5eCiAKID09PT0KICBIb3cgZG8gdGhlIGlzc3VlcyBnZXQgdXBkYXRlZD8gIERvIHlvdSBydW4gYSBzY3JpcHQgdG8gZG8KLSB0aGlzPyAgV2hlbiBkbyB5b3UgZG8gaXQsIGFmdGVyIHRoZSBmaW5hbCAyLjIuMiBpcyByZWxlYXNlZD8KKyB0aGlzPyAgV2hlbiBkbyB5b3UgZG8gaXQsIGFmdGVyIHRoZSBmaW5hbCAyLjUgaXMgcmVsZWFzZWQ/CiA9PT09CiAKIEJ5IGhhbmQuCiAKLU91ciBjdXJyZW50IHByb2Nlc3MgaXMgYW4gaXNzdWUgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gc2F5IFN0YXR1cyA9Ci1TdWJtaXR0ZWQsIEZpeGVkSW4tMi4yLjIgb25jZSB0aGUgY2hhbmdlIGlzIHN1Ym1pdHRlZCwgYnV0IGJlZm9yZSB0aGUKK091ciBjdXJyZW50IHByb2Nlc3MgaXMgYW4gaXNzdWUgc2hvdWxkIGJlIHVwZGF0ZWQgdG8gc2F5IGBTdGF0dXMgPQorU3VibWl0dGVkLCBGaXhlZEluLTIuNWAgb25jZSB0aGUgY2hhbmdlIGlzIHN1Ym1pdHRlZCwgYnV0IGJlZm9yZSB0aGUKIHJlbGVhc2UuCiAKIEFmdGVyIHRoZSByZWxlYXNlIGlzIGFjdHVhbGx5IG1hZGUsIHlvdSBjYW4gc2VhcmNoIGluIEdvb2dsZSBDb2RlIGZvcgotYGBTdGF0dXM9U3VibWl0dGVkIEZpeGVkSW49Mi4yLjInJyBhbmQgdGhlbiBiYXRjaCB1cGRhdGUgdGhlc2UgY2hhbmdlcwotdG8gc2F5IFN0YXR1cz1SZWxlYXNlZC4gTWFrZSBzdXJlIHRoZSBwdWxsZG93biBzYXlzIGBgQWxsIElzc3VlcycnCi1iZWNhdXNlIFN0YXR1cz1TdWJtaXR0ZWQgaXMgY29uc2lkZXJlZCBhIGNsb3NlZCBpc3N1ZS4KK2BgU3RhdHVzPVN1Ym1pdHRlZCBGaXhlZEluPTIuNScnIGFuZCB0aGVuIGJhdGNoIHVwZGF0ZSB0aGVzZSBjaGFuZ2VzCit0byBzYXkgYFN0YXR1cz1SZWxlYXNlZGAuIE1ha2Ugc3VyZSB0aGUgcHVsbGRvd24gc2F5cyBgYEFsbCBJc3N1ZXMnJworYmVjYXVzZSBgU3RhdHVzPVN1Ym1pdHRlZGAgaXMgY29uc2lkZXJlZCBhIGNsb3NlZCBpc3N1ZS4KIAogCi1NYWlsaW5nIExpc3QKLX5+fn5+fn5+fn5+fgorW1thbm5vdW5jZV1dCitBbm5vdW5jZSBvbiBNYWlsaW5nIExpc3QKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCi0qIFNlbmQgYW4gZW1haWwgdG8gdGhlIG1haWxpbmcgbGlzdCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSwgY29uc2lkZXIgaW5jbHVkaW5nIHNvbWUgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgaW4gdGhlIGVtYWlsOgorKiBTZW5kIGFuIGVtYWlsIHRvIHRoZSBtYWlsaW5nIGxpc3QgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2UsIGNvbnNpZGVyCitpbmNsdWRpbmcgc29tZSBvciBhbGwgb2YgdGhlIGZvbGxvd2luZyBpbiB0aGUgZW1haWw6CiAqKiBBIGxpbmsgdG8gdGhlIHJlbGVhc2UgYW5kIHRoZSByZWxlYXNlIG5vdGVzIChpZiBhIGZpbmFsIHJlbGVhc2UpCiAqKiBBIGxpbmsgdG8gdGhlIGRvY3MKICoqIERlc2NyaWJlIHRoZSB0eXBlIG9mIHJlbGVhc2UgKHN0YWJsZSwgYnVnIGZpeCwgUkMpCkBAIC0yNDEsNyArMzE3LDcgQEAKIC1NYXJ0aW4KIC0tLS0KIAotKiBBZGQgYW4gZW50cnkgdG8gdGhlIE5FV1Mgc2VjdGlvbiBvZiB0aGUgbWFpbiBHZXJyaXQgcHJvamVjdCB3ZWIgcGFnZQorKiBBZGQgYW4gZW50cnkgdG8gdGhlIGBORVdTYCBzZWN0aW9uIG9mIHRoZSBtYWluIEdlcnJpdCBwcm9qZWN0IHdlYiBwYWdlCiAqKiBHbyB0bzogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9hZG1pbgogKiogQWRkIGVudHJ5IGxpa2U6CiAtLS0tCkBAIC0yNTIsMTggKzMyOCwzMyBAQAogKiogR28gdG86IGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9yZXBvLWRpc2N1c3MvdG9waWNzCiAqKiBDbGljayBvbiB0aGUgYW5ub3VuY2VtZW50IHRocmVhZAogKiogTmVhciB0aGUgdG9wIHJpZ2h0LCBjbGljayBvbiBvcHRpb25zCi0qKiBVbmRlciBvcHRpb25zLCBjaWNrIHRoZSAiRGlzcGxheSB0aGlzIHRvcCBmaXJzdCIgY2hlY2tib3gKKyoqIFVuZGVyIG9wdGlvbnMsIGNsaWNrIHRoZSAiRGlzcGxheSB0aGlzIHRvcCBmaXJzdCIgY2hlY2tib3gKICoqIGFuZCBTYXZlCiAKICogVXBkYXRlIHRoZSBwcmV2aW91cyBkaXNjdXNzaW9uIGdyb3VwIGFubm91bmNlbWVudCB0byBubyBsb25nZXIgYmUgc3RpY2t5CiAqKiBTZWUgYWJvdmUgKHVuY2xpY2sgY2hlY2tib3gpCiAKIAotTWVyZ2luZyBTdGFibGUgRml4ZXMgdG8gbWFzdGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tbaW5jcmVhc2UtdmVyc2lvbl1dCitJbmNyZWFzZSBHZXJyaXQgVmVyc2lvbiBmb3IgQ3VycmVudCBEZXZlbG9wbWVudAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotQWZ0ZXIgZXZlcnkgc3RhYmxlLWZpeCByZWxlYXNlLCBzdGFibGUgc2hvdWxkIGJlIG1lcmdlZCB0byBtYXN0ZXIgdG8KLWVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIGZpeGVzIGV2ZXIgZ2V0IGxvc3QuCitBbGwgbmV3IGRldmVsb3BtZW50IHRoYXQgaXMgZG9uZSBpbiB0aGUgYG1hc3RlcmAgYnJhbmNoIHdpbGwgYmUKK2luY2x1ZGVkIGluIHRoZSBuZXh0IEdlcnJpdCByZWxlYXNlLiBVcGRhdGUgdGhlIEdlcnJpdCB2ZXJzaW9uIGluIGVhY2gKK2Bwb20ueG1sYCBmaWxlIHRvIHRoZSBuZXh0IGBTTkFQU0hPVGB2ZXJzaW9uLiBQdXNoIHRoZSBjaGFuZ2UgZm9yCityZXZpZXcgYW5kIGdldCBpdCBtZXJnZWQuCisKKz09PT0KKyB0b29scy92ZXJzaW9uLnNoIC0tc25hcHNob3Q9Mi42Cis9PT09CisKKworW1ttZXJnZS1zdGFibGVdXQorTWVyZ2UgYHN0YWJsZWAgaW50byBgbWFzdGVyYAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBZnRlciBldmVyeSByZWxlYXNlLCBzdGFibGUgc2hvdWxkIGJlIG1lcmdlZCB0byBtYXN0ZXIgdG8gZW5zdXJlIHRoYXQKK25vbmUgb2YgdGhlIGNoYW5nZXMvZml4ZXMgZXZlciBnZXQgbG9zdC4KIAogPT09PQogIGdpdCBjb25maWcgbWVyZ2Uuc3VtbWFyeSB0cnVlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLWJyYW5jaC1ub3QtZm91bmQudHh0IGIvRG9jdW1lbnRhdGlvbi9lcnJvci1icmFuY2gtbm90LWZvdW5kLnR4dAppbmRleCAyYWFkMGUxLi5iZDhkMDkwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Vycm9yLWJyYW5jaC1ub3QtZm91bmQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZXJyb3ItYnJhbmNoLW5vdC1mb3VuZC50eHQKQEAgLTE1LDE0ICsxNSwxNCBAQAogKiB0aGF0IHRoZSBicmFuY2ggbmFtZSBpbiB0aGUgcHVzaCBzcGVjaWZpY2F0aW9uIGlzIHR5cGVkIGNvcnJlY3RseQogICAoY2FzZSBzZW5zaXRpdmUpIGFuZAogKiB0aGF0IHRoZSBicmFuY2ggcmVhbGx5IGV4aXN0cyBmb3IgdGhpcyBwcm9qZWN0IChpbiB0aGUgR2Vycml0IFdlYlVJCi0gIGdvIHRvICdBZG1pbicgLT4gJ1Byb2plY3RzJyBhbmQgYnJvd3NlIHlvdXIgcHJvamVjdCwgdGhlbiBjbGljayBvbgorICBnbyB0byAnUHJvamVjdHMnID4gJ0xpc3QnIGFuZCBicm93c2UgeW91ciBwcm9qZWN0LCB0aGVuIGNsaWNrIG9uCiAgICdCcmFuY2hlcycgdG8gc2VlIGFsbCBleGlzdGluZyBicmFuY2hlcykuCiAKIElmIGl0IHdhcyB5b3VyIGludGVudGlvbiB0byBjcmVhdGUgYSBuZXcgYnJhbmNoIHlvdSBjYW4gZWl0aGVyCiAKICogYnlwYXNzIGNvZGUgcmV2aWV3IG9uIHB1c2ggYXMgZXhwbGFpbmVkIGxpbms6dXNlci11cGxvYWQuaHRtbCNieXBhc3NfcmV2aWV3W2hlcmVdIG9yCiAqIGNyZWF0ZSB0aGUgbmV3IGJyYW5jaCBpbiB0aGUgR2Vycml0IFdlYlVJIGJlZm9yZSBwdXNoaW5nIChnbyB0bwotICAnQWRtaW4nIC0+ICdQcm9qZWN0cycgYW5kIGJyb3dzZSB5b3VyIHByb2plY3QsIGluIHRoZSAnQnJhbmNoZXMnCisgICdQcm9qZWN0cycgPiAnTGlzdCcgYW5kIGJyb3dzZSB5b3VyIHByb2plY3QsIGluIHRoZSAnQnJhbmNoZXMnCiAgIHRhYiB5b3UgY2FuIHRoZW4gY3JlYXRlIGEgbmV3IGJyYW5jaCkuCiAKIFBsZWFzZSBub3RlIHRoYXQgeW91IG5lZWQgdG8gYmUgZ3JhbnRlZCB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXJyb3ItY29tbWl0LWFscmVhZHktZXhpc3RzLnR4dCBiL0RvY3VtZW50YXRpb24vZXJyb3ItY29tbWl0LWFscmVhZHktZXhpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzMyYzRjMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZXJyb3ItY29tbWl0LWFscmVhZHktZXhpc3RzLnR4dApAQCAtMCwwICsxLDE0IEBACitjb21taXQgYWxyZWFkeSBleGlzdHMKKz09PT09PT09PT09PT09PT09PT09PQorCitXaXRoIHRoaXMgZXJyb3IgbWVzc2FnZSBHZXJyaXQgcmVqZWN0cyB0byBwdXNoIGEgY29tbWl0IHRvIGFuCitleGlzdGluZyBjaGFuZ2UgdmlhIGByZWZzL2NoYW5nZXMvbmAgaWYgdGhlIGNvbW1pdCB3YXMgYWxyZWFkeQorc3VjY2Vzc2Z1bGx5IHB1c2hlZCB0byB0aGUgY2hhbmdlLiAgSW4gdGhpcyBjYXNlIHRoZXJlIGlzIG5vCituZXcgY29tbWl0IGFuZCBjb25zZXF1ZW50bHkgdGhlcmUgaXMgbm90aGluZyBmb3IgR2Vycml0IHRvIGRvLgorCitGb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gcmVzb2x2ZSB0aGlzIGVycm9yLCBwbGVhc2UKK3JlZmVyIHRvIGxpbms6ZXJyb3Itbm8tbmV3LWNoYW5nZXMuaHRtbFtubyBuZXcgY2hhbmdlc10uCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6ZXJyb3ItbWVzc2FnZXMuaHRtbFtHZXJyaXQgRXJyb3IgTWVzc2FnZXNdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLWludmFsaWQtY2hhbmdlaWQtbGluZS50eHQgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLWludmFsaWQtY2hhbmdlaWQtbGluZS50eHQKaW5kZXggMmY1NzU0Mi4uOTIzNTI2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lcnJvci1pbnZhbGlkLWNoYW5nZWlkLWxpbmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZXJyb3ItaW52YWxpZC1jaGFuZ2VpZC1saW5lLnR4dApAQCAtMSw4ICsxLDggQEAKLWludmFsaWQgQ2hhbmdlLUlkIGxpbmUgZm9ybWF0IGluIGNvbW1pdCBtZXNzYWdlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoraW52YWxpZCBDaGFuZ2UtSWQgbGluZSBmb3JtYXQgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogV2l0aCB0aGlzIGVycm9yIG1lc3NhZ2UgR2Vycml0IHJlamVjdHMgdG8gcHVzaCBhIGNvbW1pdCBpZiBpdHMgY29tbWl0Ci1tZXNzYWdlIGNvbnRhaW5zIGFuIGludmFsaWQgQ2hhbmdlLUlkIGxpbmUuCittZXNzYWdlIGZvb3RlciBjb250YWlucyBhbiBpbnZhbGlkIENoYW5nZS1JZCBsaW5lLgogCiBZb3UgY2FuIHNlZSB0aGUgY29tbWl0IG1lc3NhZ2VzIGZvciBleGlzdGluZyBjb21taXRzIGluIHRoZSBoaXN0b3J5CiBieSBkb2luZyBhIGxpbms6aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvZ2l0LWxvZy5odG1sW2dpdCBsb2ddLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lcnJvci1tZXNzYWdlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLW1lc3NhZ2VzLnR4dAppbmRleCBjOWRmODgzLi41OGU5ZTAyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2Vycm9yLW1lc3NhZ2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLW1lc3NhZ2VzLnR4dApAQCAtMTMsMjUgKzEzLDI2IEBACiAqIGxpbms6ZXJyb3ItY2hhbmdlLWNsb3NlZC5odG1sW2NoYW5nZSAuLi4gY2xvc2VkXQogKiBsaW5rOmVycm9yLWNoYW5nZS1kb2VzLW5vdC1iZWxvbmctdG8tcHJvamVjdC5odG1sW2NoYW5nZSAuLi4gZG9lcyBub3QgYmVsb25nIHRvIHByb2plY3QgLi4uXQogKiBsaW5rOmVycm9yLWNoYW5nZS1ub3QtZm91bmQuaHRtbFtjaGFuZ2UgLi4uIG5vdCBmb3VuZF0KKyogbGluazplcnJvci1jb21taXQtYWxyZWFkeS1leGlzdHMuaHRtbFtjb21taXQgYWxyZWFkeSBleGlzdHNdCiAqIGxpbms6ZXJyb3ItY29udGFpbnMtYmFubmVkLWNvbW1pdC5odG1sW2NvbnRhaW5zIGJhbm5lZCBjb21taXQgLi4uXQogKiBsaW5rOmVycm9yLWhhcy1kdXBsaWNhdGVzLmh0bWxbLi4uIGhhcyBkdXBsaWNhdGVzXQogKiBsaW5rOmVycm9yLWludmFsaWQtYXV0aG9yLmh0bWxbaW52YWxpZCBhdXRob3JdCi0qIGxpbms6ZXJyb3ItaW52YWxpZC1jaGFuZ2VpZC1saW5lLmh0bWxbaW52YWxpZCBDaGFuZ2UtSWQgbGluZSBmb3JtYXQgaW4gY29tbWl0IG1lc3NhZ2VdCisqIGxpbms6ZXJyb3ItaW52YWxpZC1jaGFuZ2VpZC1saW5lLmh0bWxbaW52YWxpZCBDaGFuZ2UtSWQgbGluZSBmb3JtYXQgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyXQogKiBsaW5rOmVycm9yLWludmFsaWQtY29tbWl0dGVyLmh0bWxbaW52YWxpZCBjb21taXR0ZXJdCi0qIGxpbms6ZXJyb3ItbWlzc2luZy1jaGFuZ2VpZC5odG1sW21pc3NpbmcgQ2hhbmdlLUlkIGluIGNvbW1pdCBtZXNzYWdlXQotKiBsaW5rOmVycm9yLW11bHRpcGxlLWNoYW5nZWlkLWxpbmVzLmh0bWxbbXVsdGlwbGUgQ2hhbmdlLUlkIGxpbmVzIGluIGNvbW1pdCBtZXNzYWdlXQorKiBsaW5rOmVycm9yLW1pc3NpbmctY2hhbmdlaWQuaHRtbFttaXNzaW5nIENoYW5nZS1JZCBpbiBjb21taXQgbWVzc2FnZSBmb290ZXJdCisqIGxpbms6ZXJyb3ItbXVsdGlwbGUtY2hhbmdlaWQtbGluZXMuaHRtbFttdWx0aXBsZSBDaGFuZ2UtSWQgbGluZXMgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyXQogKiBsaW5rOmVycm9yLW5vLWNoYW5nZXMtbWFkZS5odG1sW25vIGNoYW5nZXMgbWFkZV0KICogbGluazplcnJvci1uby1jb21tb24tYW5jZXN0cnkuaHRtbFtubyBjb21tb24gYW5jZXN0cnldCiAqIGxpbms6ZXJyb3Itbm8tbmV3LWNoYW5nZXMuaHRtbFtubyBuZXcgY2hhbmdlc10KICogbGluazplcnJvci1ub24tZmFzdC1mb3J3YXJkLmh0bWxbbm9uLWZhc3QgZm9yd2FyZF0KICogbGluazplcnJvci1ub3QtYS1nZXJyaXQtYWRtaW5pc3RyYXRvci5odG1sW05vdCBhIEdlcnJpdCBhZG1pbmlzdHJhdG9yXQotKiBsaW5rOmVycm9yLW5vdC1hLWdlcnJpdC1wcm9qZWN0Lmh0bWxbbm90IGEgR2Vycml0IHByb2plY3RdCiAqIGxpbms6ZXJyb3Itbm90LXBlcm1pdHRlZC10by1jcmVhdGUuaHRtbFtOb3QgcGVybWl0dGVkIHRvIGNyZWF0ZSAuLi5dCi0qIGxpbms6ZXJyb3Itbm90LXNpZ25lZC1vZmYtYnkuaHRtbFtub3QgU2lnbmVkLW9mZi1ieSBhdXRob3IvY29tbWl0dGVyL3VwbG9hZGVyXQorKiBsaW5rOmVycm9yLW5vdC1zaWduZWQtb2ZmLWJ5Lmh0bWxbbm90IFNpZ25lZC1vZmYtYnkgYXV0aG9yL2NvbW1pdHRlci91cGxvYWRlciBpbiBjb21taXQgbWVzc2FnZSBmb290ZXJdCiAqIGxpbms6ZXJyb3Itbm90LXZhbGlkLXJlZi5odG1sW25vdCB2YWxpZCByZWZdCiAqIGxpbms6ZXJyb3ItY2hhbmdlLXVwbG9hZC1ibG9ja2VkLmh0bWxbT25lIG9yIG1vcmUgcmVmcy9mb3IvIG5hbWVzIGJsb2NrcyBjaGFuZ2UgdXBsb2FkXQogKiBsaW5rOmVycm9yLXBlcm1pc3Npb24tZGVuaWVkLmh0bWxbUGVybWlzc2lvbiBkZW5pZWQgKHB1YmxpY2tleSldCiAqIGxpbms6ZXJyb3ItcHJvaGliaXRlZC1ieS1nZXJyaXQuaHRtbFtwcm9oaWJpdGVkIGJ5IEdlcnJpdF0KKyogbGluazplcnJvci1wcm9qZWN0LW5vdC1mb3VuZC5odG1sW1Byb2plY3Qgbm90IGZvdW5kOiAuLi5dCiAqIGxpbms6ZXJyb3Itc3F1YXNoLWNvbW1pdHMtZmlyc3QuaHRtbFtzcXVhc2ggY29tbWl0cyBmaXJzdF0KICogbGluazplcnJvci11cGxvYWQtZGVuaWVkLmh0bWxbVXBsb2FkIGRlbmllZCBmb3IgcHJvamVjdCBcJy4uLiddCiAqIGxpbms6ZXJyb3Itbm90LWFsbG93ZWQtdG8tdXBsb2FkLW1lcmdlcy5odG1sW3lvdSBhcmUgbm90IGFsbG93ZWQgdG8gdXBsb2FkIG1lcmdlc10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXJyb3ItbWlzc2luZy1jaGFuZ2VpZC50eHQgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLW1pc3NpbmctY2hhbmdlaWQudHh0CmluZGV4IGRhYTFkNDYuLmIxM2YzYjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZXJyb3ItbWlzc2luZy1jaGFuZ2VpZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9lcnJvci1taXNzaW5nLWNoYW5nZWlkLnR4dApAQCAtMSwxMCArMSwxMCBAQAotbWlzc2luZyBDaGFuZ2UtSWQgaW4gY29tbWl0IG1lc3NhZ2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CittaXNzaW5nIENoYW5nZS1JZCBpbiBjb21taXQgbWVzc2FnZSBmb290ZXIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBXaXRoIHRoaXMgZXJyb3IgbWVzc2FnZSBHZXJyaXQgcmVqZWN0cyB0byBwdXNoIGEgY29tbWl0IHRvIGEgcHJvamVjdAogd2hpY2ggaXMgY29uZmlndXJlZCB0byBhbHdheXMgcmVxdWlyZSBhIENoYW5nZS1JZCBpbiB0aGUgY29tbWl0CiBtZXNzYWdlIGlmIHRoZSBjb21taXQgbWVzc2FnZSBvZiB0aGUgcHVzaGVkIGNvbW1pdCBkb2VzIG5vdCBjb250YWluCi1hIENoYW5nZS1JZC4KK2EgQ2hhbmdlLUlkIGluIHRoZSBmb290ZXIgKHRoZSBsYXN0IHBhcmFncmFwaCkuCiAKIFRoaXMgZXJyb3IgbWF5IGhhcHBlbiBmb3IgdHdvIHJlYXNvbnM6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXJyb3ItbXVsdGlwbGUtY2hhbmdlaWQtbGluZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9lcnJvci1tdWx0aXBsZS1jaGFuZ2VpZC1saW5lcy50eHQKaW5kZXggZTYwNDk3NC4uOWZhMmI5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lcnJvci1tdWx0aXBsZS1jaGFuZ2VpZC1saW5lcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9lcnJvci1tdWx0aXBsZS1jaGFuZ2VpZC1saW5lcy50eHQKQEAgLTEsOCArMSw4IEBACi1tdWx0aXBsZSBDaGFuZ2UtSWQgbGluZXMgaW4gY29tbWl0IG1lc3NhZ2UKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorbXVsdGlwbGUgQ2hhbmdlLUlkIGxpbmVzIGluIGNvbW1pdCBtZXNzYWdlIGZvb3RlcgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBXaXRoIHRoaXMgZXJyb3IgbWVzc2FnZSBHZXJyaXQgcmVqZWN0cyB0byBwdXNoIGEgY29tbWl0IGlmIHRoZSBjb21taXQKLW1lc3NhZ2Ugb2YgdGhlIHB1c2hlZCBjb21taXQgY29udGFpbnMgc2V2ZXJhbCBDaGFuZ2UtSWQgbGluZXMuCittZXNzYWdlIGZvb3RlciBvZiB0aGUgcHVzaGVkIGNvbW1pdCBjb250YWlucyBzZXZlcmFsIENoYW5nZS1JZCBsaW5lcy4KIAogWW91IGNhbiBzZWUgdGhlIGNvbW1pdCBtZXNzYWdlcyBmb3IgZXhpc3RpbmcgY29tbWl0cyBpbiB0aGUgaGlzdG9yeQogYnkgZG9pbmcgYSBsaW5rOmh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL2dpdC1sb2cuaHRtbFtnaXQgbG9nXS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXJyb3Itbm90LWEtZ2Vycml0LXByb2plY3QudHh0IGIvRG9jdW1lbnRhdGlvbi9lcnJvci1ub3QtYS1nZXJyaXQtcHJvamVjdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYzk4YWUuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9lcnJvci1ub3QtYS1nZXJyaXQtcHJvamVjdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1ub3QgYSBHZXJyaXQgcHJvamVjdAotPT09PT09PT09PT09PT09PT09PT0KLQotV2l0aCB0aGlzIGVycm9yIG1lc3NhZ2UgR2Vycml0IHJlamVjdHMgdG8gcHVzaCBhIGNvbW1pdCBpZiB0aGUgZ2l0Ci1yZXBvc2l0b3J5IHRvIHdoaWNoIHRoZSBwdXNoIGlzIGRvbmUgZG9lcyBub3QgZXhpc3QgYXMgYSBwcm9qZWN0IGluCi10aGUgR2Vycml0IHNlcnZlciBvciBpZiB0aGUgcHVzaGluZyB1c2VyIGhhcyBubyByZWFkIGFjY2VzcyBmb3IgdGhpcwotcHJvamVjdC4KLQotVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgaW4gR2Vycml0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwYXRoIG9mCi1pdHMgZ2l0IHJlcG9zaXRvcnkgKGV4Y2x1ZGluZyB0aGUgJy5naXQnIGV4dGVuc2lvbikuCi0KLUlmIHlvdSBhcmUgZmFjaW5nIHRoaXMgcHJvYmxlbSwgZG8gdGhlIGZvbGxvd2luZzoKLQotLiBWZXJpZnkgdGhhdCB0aGUgcHJvamVjdCBuYW1lIHNwZWNpZmllZCBhcyBnaXQgcmVwb3NpdG9yeSBpbiB0aGUKLSAgcHVzaCBjb21tYW5kIGlzIHR5cGVkIGNvcnJlY3RseSAoY2FzZSBzZW5zaXRpdmUpLgotLiBWZXJpZnkgdGhhdCB5b3UgYXJlIHB1c2hpbmcgdG8gdGhlIGNvcnJlY3QgR2Vycml0IHNlcnZlci4KLS4gR28gaW4gdGhlIEdlcnJpdCBXZWJVSSB0byAnQWRtaW4nIC0+ICdQcm9qZWN0cycgYW5kIGNoZWNrIHRoYXQgdGhlCi0gIHByb2plY3QgaXMgbGlzdGVkLiBJZiB0aGUgcHJvamVjdCBpcyBub3QgbGlzdGVkIHRoZSBwcm9qZWN0IGVpdGhlcgotICBkb2VzIG5vdCBleGlzdCBvciB5b3UgZG9uJ3QgaGF2ZQotICBsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2F0ZWdvcnlfcmVhZFsnUmVhZCddIGFjY2VzcyBmb3IgaXQuIFRoaXMKLSAgbWVhbnMgaWYgeW91IGFyZSBjZXJ0YWluIHRoYXQgdGhlIHByb2plY3QgbmFtZSBpcyByaWdodCB5b3Ugc2hvdWxkCi0gIGNvbnRhY3QgdGhlIEdlcnJpdCBBZG1pbmlzdHJhdG9yIG9yIHByb2plY3Qgb3duZXIgdG8gcmVxdWVzdCBhY2Nlc3MKLSAgdG8gdGhlIHByb2plY3QuCi0KLVRoaXMgZXJyb3IgbWVzc2FnZSBtaWdodCBiZSBtaXNsZWFkaW5nIGlmIHRoZSBwcm9qZWN0IGFjdHVhbGx5IGV4aXN0cwotYnV0IHRoZSBwdXNoIGlzIGZhaWxpbmcgYmVjYXVzZSB0aGUgcHVzaGluZyB1c2VyIGhhcyBubyByZWFkIGFjY2VzcwotZm9yIHRoZSBwcm9qZWN0LiBUaGUgcmVhc29uIHRoYXQgR2Vycml0IGluIHRoaXMgY2FzZSBkZW5pZXMgdGhlCi1leGlzdGVuY2Ugb2YgdGhlIHByb2plY3QgaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIHByb2JpbmcgdGhlIEdlcnJpdAotc2VydmVyIHRvIHNlZSBpZiBhIHBhcnRpY3VsYXIgcHJvamVjdCBleGlzdHMuCi0KLQotR0VSUklUCi0tLS0tLS0KLVBhcnQgb2YgbGluazplcnJvci1tZXNzYWdlcy5odG1sW0dlcnJpdCBFcnJvciBNZXNzYWdlc10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZXJyb3Itbm90LXNpZ25lZC1vZmYtYnkudHh0IGIvRG9jdW1lbnRhdGlvbi9lcnJvci1ub3Qtc2lnbmVkLW9mZi1ieS50eHQKaW5kZXggMDBmMTc5Yi4uYmQxZjQwZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lcnJvci1ub3Qtc2lnbmVkLW9mZi1ieS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9lcnJvci1ub3Qtc2lnbmVkLW9mZi1ieS50eHQKQEAgLTEsMTAgKzEsMTAgQEAKLW5vdCBTaWduZWQtb2ZmLWJ5IGF1dGhvci9jb21taXR0ZXIvdXBsb2FkZXIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK25vdCBTaWduZWQtb2ZmLWJ5IGF1dGhvci9jb21taXR0ZXIvdXBsb2FkZXIgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBQcm9qZWN0cyBpbiBHZXJyaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcmVxdWlyZSBhIGxpbms6dXNlci1zaWduZWRvZmZieS5odG1sI1NpZ25lZC1vZmYtYnlbU2lnbmVkLW9mZi1ieV0gaW4KLXRoZSBjb21taXQgbWVzc2FnZSB0byBlbmZvcmNlIHRoYXQgZXZlcnkgY2hhbmdlIGlzIHNpZ25lZCBieSB0aGUKK3RoZSBmb290ZXIgb2YgdGhlIGNvbW1pdCBtZXNzYWdlIHRvIGVuZm9yY2UgdGhhdCBldmVyeSBjaGFuZ2UgaXMgc2lnbmVkIGJ5IHRoZQogYXV0aG9yLCBjb21taXR0ZXIgb3IgdXBsb2FkZXIuIElmIGZvciBhIHByb2plY3QgYSBTaWduZWQtb2ZmLWJ5IGlzCi1yZXF1aXJlZCBhbmQgdGhlIGNvbW1pdCBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gaXQsIEdlcnJpdCByZWplY3RzCityZXF1aXJlZCBhbmQgdGhlIGNvbW1pdCBtZXNzYWdlIGZvb3RlciBkb2VzIG5vdCBjb250YWluIGl0LCBHZXJyaXQgcmVqZWN0cwogdG8gcHVzaCB0aGUgY29tbWl0IHdpdGggdGhpcyBlcnJvciBtZXNzYWdlLgogCiBUaGlzIHBvbGljeSBjYW4gYmUgYnlwYXNzZWQgYnkgaGF2aW5nIHRoZSBhY2Nlc3MgcmlnaHQKQEAgLTEzLDExICsxMywxMSBAQAogVGhpcyBlcnJvciBtYXkgaGFwcGVuIGZvciBkaWZmZXJlbnQgcmVhc29ucyBpZiB5b3UgZG8gbm90IGhhdmUgdGhlCiBhY2Nlc3MgcmlnaHQgdG8gZm9yZ2UgdGhlIGNvbW1pdHRlciBpZGVudGl0eToKIAotLiBtaXNzaW5nIFNpZ25lZC1vZmYtYnkgaW4gdGhlIGNvbW1pdCBtZXNzYWdlCi0uIFNpZ25lZC1vZmYtYnkgaXMgY29udGFpbmVkIGluIHRoZSBjb21taXQgbWVzc2FnZSBidXQgaXQncyBuZWl0aGVyCisuIG1pc3NpbmcgU2lnbmVkLW9mZi1ieSBpbiB0aGUgY29tbWl0IG1lc3NhZ2UgZm9vdGVyCisuIFNpZ25lZC1vZmYtYnkgaXMgY29udGFpbmVkIGluIHRoZSBjb21taXQgbWVzc2FnZSBmb290ZXIgYnV0IGl0J3MgbmVpdGhlcgogICBmcm9tIHRoZSBhdXRob3IsIGNvbW1pdHRlciBub3IgdXBsb2FkZXIKIC4gU2lnbmVkLW9mZi1ieSBmcm9tIHRoZSBhdXRob3IsIGNvbW1pdHRlciBvciB1cGxvYWRlciBpcyBjb250YWluZWQKLSAgaW4gdGhlIGNvbW1pdCBtZXNzYWdlIGJ1dCBub3QgaW4gdGhlIGxhc3QgcGFyYWdyYXBoCisgIGluIHRoZSBjb21taXQgbWVzc2FnZSBidXQgbm90IGluIHRoZSBmb290ZXIgKGxhc3QgcGFyYWdyYXBoKQogCiBUbyBiZSBhYmxlIHRvIHB1c2ggeW91ciBjb21taXRzIHlvdSBoYXZlIHRvIHVwZGF0ZSB0aGUgY29tbWl0CiBtZXNzYWdlcyBhcyBleHBsYWluZWQgbGluazplcnJvci1wdXNoLWZhaWxzLWR1ZS10by1jb21taXQtbWVzc2FnZS5odG1sW2hlcmVdIHNvIHRoYXQgdGhleSBjb250YWluIGEgU2lnbmVkLW9mZi1ieSBmcm9tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Vycm9yLXByb2plY3Qtbm90LWZvdW5kLnR4dCBiL0RvY3VtZW50YXRpb24vZXJyb3ItcHJvamVjdC1ub3QtZm91bmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYzAxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Vycm9yLXByb2plY3Qtbm90LWZvdW5kLnR4dApAQCAtMCwwICsxLDM0IEBACitQcm9qZWN0IG5vdCBmb3VuZDogLi4uCis9PT09PT09PT09PT09PT09PT09PT09CisKK1dpdGggdGhpcyBlcnJvciBtZXNzYWdlIEdlcnJpdCByZWplY3RzIHRvIHB1c2ggYSBjb21taXQgaWYgdGhlIGdpdAorcmVwb3NpdG9yeSB0byB3aGljaCB0aGUgcHVzaCBpcyBkb25lIGRvZXMgbm90IGV4aXN0IGFzIGEgcHJvamVjdCBpbgordGhlIEdlcnJpdCBzZXJ2ZXIgb3IgaWYgdGhlIHB1c2hpbmcgdXNlciBoYXMgbm8gcmVhZCBhY2Nlc3MgZm9yIHRoaXMKK3Byb2plY3QuCisKK1RoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGluIEdlcnJpdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcGF0aCBvZgoraXRzIGdpdCByZXBvc2l0b3J5IChleGNsdWRpbmcgdGhlICcuZ2l0JyBleHRlbnNpb24pLgorCitJZiB5b3UgYXJlIGZhY2luZyB0aGlzIHByb2JsZW0sIGRvIHRoZSBmb2xsb3dpbmc6CisKKy4gVmVyaWZ5IHRoYXQgdGhlIHByb2plY3QgbmFtZSBzcGVjaWZpZWQgYXMgZ2l0IHJlcG9zaXRvcnkgaW4gdGhlCisgIHB1c2ggY29tbWFuZCBpcyB0eXBlZCBjb3JyZWN0bHkgKGNhc2Ugc2Vuc2l0aXZlKS4KKy4gVmVyaWZ5IHRoYXQgeW91IGFyZSBwdXNoaW5nIHRvIHRoZSBjb3JyZWN0IEdlcnJpdCBzZXJ2ZXIuCisuIEdvIGluIHRoZSBHZXJyaXQgV2ViVUkgdG8gJ1Byb2plY3RzJyA+ICdMaXN0JyBhbmQgY2hlY2sgdGhhdCB0aGUKKyAgcHJvamVjdCBpcyBsaXN0ZWQuIElmIHRoZSBwcm9qZWN0IGlzIG5vdCBsaXN0ZWQgdGhlIHByb2plY3QgZWl0aGVyCisgIGRvZXMgbm90IGV4aXN0IG9yIHlvdSBkb24ndCBoYXZlCisgIGxpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXRlZ29yeV9yZWFkWydSZWFkJ10gYWNjZXNzIGZvciBpdC4gVGhpcworICBtZWFucyBpZiB5b3UgYXJlIGNlcnRhaW4gdGhhdCB0aGUgcHJvamVjdCBuYW1lIGlzIHJpZ2h0IHlvdSBzaG91bGQKKyAgY29udGFjdCB0aGUgR2Vycml0IEFkbWluaXN0cmF0b3Igb3IgcHJvamVjdCBvd25lciB0byByZXF1ZXN0IGFjY2VzcworICB0byB0aGUgcHJvamVjdC4KKworVGhpcyBlcnJvciBtZXNzYWdlIG1pZ2h0IGJlIG1pc2xlYWRpbmcgaWYgdGhlIHByb2plY3QgYWN0dWFsbHkgZXhpc3RzCitidXQgdGhlIHB1c2ggaXMgZmFpbGluZyBiZWNhdXNlIHRoZSBwdXNoaW5nIHVzZXIgaGFzIG5vIHJlYWQgYWNjZXNzCitmb3IgdGhlIHByb2plY3QuIFRoZSByZWFzb24gdGhhdCBHZXJyaXQgaW4gdGhpcyBjYXNlIGRlbmllcyB0aGUKK2V4aXN0ZW5jZSBvZiB0aGUgcHJvamVjdCBpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gcHJvYmluZyB0aGUgR2Vycml0CitzZXJ2ZXIgdG8gc2VlIGlmIGEgcGFydGljdWxhciBwcm9qZWN0IGV4aXN0cy4KKworCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmVycm9yLW1lc3NhZ2VzLmh0bWxbR2Vycml0IEVycm9yIE1lc3NhZ2VzXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMThuLXJlYWRtZS50eHQgYi9Eb2N1bWVudGF0aW9uL2kxOG4tcmVhZG1lLnR4dAppbmRleCBhODRjM2RjLi4yMTM1NTk4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kxOG4tcmVhZG1lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2kxOG4tcmVhZG1lLnR4dApAQCAtNSwyMiArNSwxMiBAQAogdGhlIHdheSB0aGUgY29kZSBwcm9kdWNlcyBvdXRwdXQuICBNb3N0IG9mIHRoZSBVSSBzaG91bGQgc3VwcG9ydAogcmlnaHQtdG8tbGVmdCAoUlRMKSBsYW5ndWFnZXMuCiAKK0xhYmVscworLS0tLS0tCiAKLUFwcHJvdmFsQ2F0ZWdvcnkKLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGdldE5hbWUoKSBmdW5jdGlvbiBwcm9kdWNlcyBvbmx5IGEgc2luZ2xlIHRyYW5zbGF0aW9uIG9mIHRoZQotZGVzY3JpcHRpb24gc3RyaW5nLiAgVGhpcyBuYW1lIGlzIHNldCBieSB0aGUgR2Vycml0IGFkbWluaXN0cmF0b3IsCi13aGljaCBtYXkgY2F1c2UgcHJvYmxlbXMgaWYgdGhlIHNpdGUgaXMgdHJhbnNsYXRlZCBpbnRvIG11bHRpcGxlCi1sYW5ndWFnZXMgYW5kIGRpZmZlcmVudCB1c2VycyB3YW50IGRpZmZlcmVudCB0cmFuc2xhdGlvbnMuCi0KLUFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBnZXROYW1lKCkgZnVuY3Rpb24gcHJvZHVjZXMgb25seSBhIHNpbmdsZSB0cmFuc2xhdGlvbiBvZiB0aGUKLWRlc2NyaXB0aW9uIHN0cmluZy4gIFRoaXMgbmFtZSBpcyBzZXQgYnkgdGhlIEdlcnJpdCBhZG1pbmlzdHJhdG9yLAotd2hpY2ggbWF5IGNhdXNlIHByb2JsZW1zIGlmIHRoZSBzaXRlIGlzIHRyYW5zbGF0ZWQgaW50byBtdWx0aXBsZQotbGFuZ3VhZ2VzIGFuZCBkaWZmZXJlbnQgdXNlcnMgd2FudCBkaWZmZXJlbnQgdHJhbnNsYXRpb25zLgorTGFiZWxzIGFuZCB0aGVpciB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gcHJvamVjdC5jb25maWcgYnkgdGhlIEdlcnJpdAorYWRtaW5pc3RyYXRvciBvciBwcm9qZWN0IG93bmVycy4gIE9ubHkgYSBzaW5nbGUgdHJhbnNsYXRpb24gb2YgdGhlc2UKK3N0cmluZ3MgaXMgc3VwcG9ydGVkLgogCiAvR2Vycml0IEdlcnJpdC5odG1sCiAtLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2luZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vaW5kZXgudHh0CmluZGV4IDRjMjMzNWYuLjliMmQ4ZWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5kZXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5kZXgudHh0CkBAIC02LDI4ICs2LDM2IEBACiAKICogbGluazppbnRyby1xdWljay5odG1sW0EgUXVpY2sgSW50cm9kdWN0aW9uIFRvIEdlcnJpdF0KIAotVXNlciBHdWlkZQotLS0tLS0tLS0tLQorRW5kIFVzZXIgR3VpZGUKKy0tLS0tLS0tLS0tLS0tCiAKLSogbGluazpodHRwOi8vc291cmNlLmFuZHJvaWQuY29tL3N1Ym1pdC1wYXRjaGVzL3dvcmtmbG93W0RlZmF1bHQgV29ya2Zsb3ddCisqIEV4dGVybmFsIGxpbms6IGxpbms6aHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9zdWJtaXQtcGF0Y2hlcy93b3JrZmxvd1tEZWZhdWx0IEFuZHJvaWQgV29ya2Zsb3ddCiAqIGxpbms6dXNlci1zZWFyY2guaHRtbFtTZWFyY2hpbmcgQ2hhbmdlc10KICogbGluazpjbWQtaW5kZXguaHRtbFtDb21tYW5kIExpbmUgVG9vbHNdCi0qIGxpbms6cGdtLWluZGV4Lmh0bWxbU2VydmVyIFByb2dyYW1zXQogKiBsaW5rOnVzZXItdXBsb2FkLmh0bWxbVXBsb2FkaW5nIENoYW5nZXNdCiAqIGxpbms6dXNlci1jaGFuZ2VpZC5odG1sW0NoYW5nZS1JZCBMaW5lc10KICogbGluazp1c2VyLXNpZ25lZG9mZmJ5Lmh0bWxbU2lnbmVkLW9mZi1ieSBMaW5lc10KLSogbGluazphY2Nlc3MtY29udHJvbC5odG1sW0FjY2VzcyBDb250cm9sc10KICogbGluazplcnJvci1tZXNzYWdlcy5odG1sW0Vycm9yIE1lc3NhZ2VzXQotKiBsaW5rOnJlc3QtYXBpLmh0bWxbUkVTVCBBUEldCi0qIGxpbms6dXNlci1jdXN0b20tZGFzaGJvYXJkcy5odG1sW0N1c3RvbSBEYXNoYm9hcmRzXQogKiBsaW5rOnVzZXItbm90aWZ5Lmh0bWxbU3Vic2NyaWJpbmcgdG8gRW1haWwgTm90aWZpY2F0aW9uc10KKworUHJvamVjdCBPd25lciBhbmQgUG93ZXIgVXNlciBHdWlkZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIGxpbms6YWNjZXNzLWNvbnRyb2wuaHRtbFtBY2Nlc3MgQ29udHJvbHNdCisqIGxpbms6cmVzdC1hcGkuaHRtbFtSRVNUIEFQSV0KKyogbGluazp1c2VyLWRhc2hib2FyZHMuaHRtbFtEYXNoYm9hcmRzXQogKiBsaW5rOnVzZXItc3VibW9kdWxlcy5odG1sW1N1YnNjcmliaW5nIHRvIEdpdCBTdWJtb2R1bGVzXQotKiBsaW5rOnJlZnMtbm90ZXMtcmV2aWV3Lmh0bWxbVGhlIGByZWZzL25vdGVzL3Jldmlld2AgbmFtZXNwYWNlXQogKiBsaW5rOnByb2xvZy1jb29rYm9vay5odG1sW1Byb2xvZyBDb29rYm9va10KICogbGluazpwcm9sb2ctY2hhbmdlLWZhY3RzLmh0bWxbUHJvbG9nIEZhY3RzIGZvciBHZXJyaXQgQ2hhbmdlc10KKyogbGluazpjb25maWctbGFiZWxzLmh0bWxbUmV2aWV3IExhYmVsc10KKworQWRtaW4gVXNlciBHdWlkZQorLS0tLS0tLS0tLS0tLS0tLQorCisqIGxpbms6cGdtLWluZGV4Lmh0bWxbU2VydmVyIFNpZGUgQWRtaW5pc3RyYXRpdmUgVG9vbHNdCiAKIEluc3RhbGxhdGlvbgotLS0tLS0tLS0tLS0tCit+fn5+fn5+fn5+fn4KIAogKiBsaW5rOmxpY2Vuc2VzLmh0bWxbTGljZW5zZXMgYW5kIE5vdGljZXNdCiAqIGxpbms6aW5zdGFsbC5odG1sW0luc3RhbGxhdGlvbiBHdWlkZV0KQEAgLTM1LDcgKzQzLDcgQEAKICogbGluazpwcm9qZWN0LXNldHVwLmh0bWxbUHJvamVjdCBTZXR1cF0KIAogQ29uZmlndXJhdGlvbgotLS0tLS0tLS0tLS0tLQorfn5+fn5+fn5+fn5+fgogCiAqIGxpbms6Y29uZmlnLWdlcnJpdC5odG1sW1N5c3RlbSBTZXR0aW5nc10KICogbGluazpjb25maWctY29udGFjdC5odG1sW1VzZXIgQ29udGFjdCBJbmZvcm1hdGlvbl0KQEAgLTQ1LDE0ICs1MywxNiBAQAogKiBsaW5rOmNvbmZpZy1yZXZlcnNlcHJveHkuaHRtbFtSZXZlcnNlIFByb3h5XQogKiBsaW5rOmNvbmZpZy1ob29rcy5odG1sW0hvb2tzXQogKiBsaW5rOmNvbmZpZy1tYWlsLmh0bWxbTWFpbCBUZW1wbGF0ZXNdCisqIGxpbms6Y29uZmlnLWNsYS5odG1sW0NvbnRyaWJ1dG9yIEFncmVlbWVudHNdCiAKLURldmVsb3BlciBEb2N1bWVudGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorR2Vycml0IERldmVsb3BlciBEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogKiBsaW5rOmRldi1yZWFkbWUuaHRtbFtEZXZlbG9wZXIgU2V0dXBdCiAqIGxpbms6ZGV2LWVjbGlwc2UuaHRtbFtFY2xpcHNlIFNldHVwXQogKiBsaW5rOmRldi1jb250cmlidXRpbmcuaHRtbFtDb250cmlidXRpbmcgdG8gR2Vycml0XQogKiBsaW5rOmRldi1wbHVnaW5zLmh0bWxbRGV2ZWxvcGluZyBQbHVnaW5zXQorKiBsaW5rOmNvbmZpZy12YWxpZGF0aW9uLmh0bWxbQ29tbWl0IFZhbGlkYXRpb25dCiAqIGxpbms6ZGV2LWRlc2lnbi5odG1sW1N5c3RlbSBEZXNpZ25dCiAqIGxpbms6aTE4bi1yZWFkbWUuaHRtbFtpMThuIFN1cHBvcnRdCiAqIGxpbms6ZGV2LXJlbGVhc2UuaHRtbFtEZXZlbG9wZXIgUmVsZWFzZV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5zdGFsbC1qMmVlLnR4dCBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC1qMmVlLnR4dAppbmRleCA5NjgxNGEwLi40OTI3MDQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2luc3RhbGwtajJlZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLWoyZWUudHh0CkBAIC0yNywxMiArMjcsNiBAQAogICByZXZpZXdfc2l0ZS9iaW4vZ2Vycml0LnNoIHN0b3AKIC0tLS0KIAotKiBEZXBsb3kgdGhlICdnZXJyaXQud2FyJyBmaWxlIHRvIHlvdXIgYXBwbGljYXRpb24gc2VydmVyLgotKwotVGhlIGRlcGxveW1lbnQgcHJvY2VzcyBkaWZmZXJzIGJldHdlZW4gc2VydmVycywgYnV0IHR5cGljYWxseSB0aGlzCi1jYW4gYmUgYWNjb21wbGlzaGVkIGJ5IGNvcHlpbmcgJ2dlcnJpdC53YXInIGludG8gdGhlICd3ZWJhcHBzLycKLXN1YmRpcmVjdG9yeSBvZiB0aGUgY29udGFpbmVyJ3MgaW5zdGFsbGF0aW9uLgotCiAqIENvbmZpZ3VyZSBKTkRJIERhdGFTb3VyY2UgJ2pkYmMvUmV2aWV3RGInLgogKwogVGhpcyBEYXRhU291cmNlIG11c3QgcG9pbnQgdG8gdGhlIGRhdGFiYXNlIHlvdSBjcmVhdGVkIGFib3ZlLgpAQCAtNDAsNiArMzQsMTIgQEAKIG5lY2Vzc2FyeSBKREJDIGRyaXZlcnMuICBZb3UgbWF5IHdpc2ggdG8gZW5zdXJlIGNvbm5lY3Rpb24gcG9vbGluZwogaXMgY29uZmlndXJlZCBhbmQgZW5hYmxlZCB3aXRoaW4gdGhlIERhdGFTb3VyY2UuCiAKKyogRGVwbG95IHRoZSAnZ2Vycml0LndhcicgZmlsZSB0byB5b3VyIGFwcGxpY2F0aW9uIHNlcnZlci4KKysKK1RoZSBkZXBsb3ltZW50IHByb2Nlc3MgZGlmZmVycyBiZXR3ZWVuIHNlcnZlcnMsIGJ1dCB0eXBpY2FsbHkgdGhpcworY2FuIGJlIGFjY29tcGxpc2hlZCBieSBjb3B5aW5nICdnZXJyaXQud2FyJyBpbnRvIHRoZSAnd2ViYXBwcy8nCitzdWJkaXJlY3Rvcnkgb2YgdGhlIGNvbnRhaW5lcidzIGluc3RhbGxhdGlvbi4KKwogKiAoJ09wdGlvbmFsJykgSW5zdGFsbCBCb3VuY3kgQ2FzdGxlIENyeXB0byBBUEkKICsKIElmIHlvdSBlbmFibGVkIEJvdW5jeSBDYXN0bGUgQ3J5cHRvIGR1cmluZyAnaW5pdCcsIGNvcHkgdGhlIEpBUgpAQCAtMTAxLDggKzEwMSw4IEBACiBzY3JpcHQgYW5kIG1vZGlmeSBpdCBmb3IgeW91ciBjb25maWd1cmF0aW9uOgogCiAtLS0tCi0gIGphdmEgLWphciB3ZWJhcHBzL2dlcnJpdC53YXIgLS1jYXQgZXh0cmEvamV0dHk3L2dlcnJpdC1qZXR0eS5zaCA+L2V0Yy9pbml0LmQvZ2Vycml0LWpldHR5LnNoCi0gIHZpIC9ldGMvaW5pdC5kL2dlcnJpdC1qZXR0eS5zaAorICBqYXZhIC1qYXIgd2ViYXBwcy9nZXJyaXQud2FyIC0tY2F0IGV4dHJhL2pldHR5Ny9nZXJyaXQtamV0dHkuc2ggPi9ldGMvaW5pdC5kL2dlcnJpdC1qZXR0eQorICB2aSAvZXRjL2luaXQuZC9nZXJyaXQtamV0dHkKIC0tLS0KIAogW1RJUF0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5zdGFsbC1xdWljay50eHQgYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwtcXVpY2sudHh0CmluZGV4IGMwOWMxOTcuLmYxYmQyNWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5zdGFsbC1xdWljay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLXF1aWNrLnR4dApAQCAtMTA5LDEzNyArMTA5LDcgQEAKICAgZ2Vycml0MkBob3N0On4kCiAtLS0tCiAKLVtbdXNlcnNldHVwXV0KLVRoZSBmaXJzdCB1c2VyCi0tLS0tLS0tLS0tLS0tLQotCi1JdCdzIHRpbWUgdG8gZXhpdCB0aGUgZ2Vycml0MiBhY2NvdW50IGFzIHlvdSBub3cgaGF2ZSBHZXJyaXQgcnVubmluZyBvbiB5b3VyCi1ob3N0IGFuZCBzZXR1cCB5b3VyIGZpcnN0IHdvcmtzcGFjZS4KLQotU3RhcnQgYSBzaGVsbCB3aXRoIHRoZSBjcmVkZW50aWFscyBvZiB0aGUgYWNjb3VudCB5b3Ugd2lsbCBwZXJmb3JtCi1kZXZlbG9wbWVudCB1bmRlci4KLQotQ2hlY2sgd2hldGhlciB0aGVyZSBhcmUgYW55IHNzaCBrZXlzIGFscmVhZHkuIFlvdSdyZSBsb29raW5nIGZvciB0d28gZmlsZXMsCi1pZF9yc2EgYW5kIGlkX3JzYS5wdWIuCi0KLS0tLS0KLSAgdXNlckBob3N0On4kIGxzIC5zc2gKLSAgYXV0aG9yaXplZF9rZXlzICBjb25maWcgIGlkX3JzYSAgaWRfcnNhLnB1YiAga25vd25faG9zdHMKLSAgdXNlckBob3N0On4kCi0tLS0tCi0KLUlmIHlvdSBoYXZlIHRoZSBmaWxlcywgeW91IG1heSBza2lwIHRoZSBrZXkgZ2VuZXJhdGluZyBzdGVwLgotCi1JZiB5b3UgZG9uJ3Qgc2VlIHRoZSBmaWxlcyBpbiB5b3VyIGxpc3RpbmcsIHlvdXIgd2lsbCBoYXZlIHRvIGdlbmVyYXRlIHJzYQota2V5cyBmb3IgeW91ciBzc2ggc2Vzc2lvbnM6Ci0KLVNTSCBrZXkgZ2VuZXJhdGlvbgotfn5+fn5+fn5+fn5+fn5+fn5+Ci0KLSpQbGVhc2UgZG9uJ3QgZ2VuZXJhdGUgbmV3IGtleXMgaWYgeW91IGFscmVhZHkgaGF2ZSBhIHZhbGlkIGtleXBhaXIhKgotKlRoZXkgd2lsbCBiZSBvdmVyd3JpdHRlbiEqCi0KLS0tLS0KLSAgdXNlckBob3N0On4kIHNzaC1rZXlnZW4gLXQgcnNhCi0gIEdlbmVyYXRpbmcgcHVibGljL3ByaXZhdGUgcnNhIGtleSBwYWlyLgotICBFbnRlciBmaWxlIGluIHdoaWNoIHRvIHNhdmUgdGhlIGtleSAoL2hvbWUvdXNlci8uc3NoL2lkX3JzYSk6Ci0gIENyZWF0ZWQgZGlyZWN0b3J5ICcvaG9tZS91c2VyLy5zc2gnLgotICBFbnRlciBwYXNzcGhyYXNlIChlbXB0eSBmb3Igbm8gcGFzc3BocmFzZSk6Ci0gIEVudGVyIHNhbWUgcGFzc3BocmFzZSBhZ2FpbjoKLSAgWW91ciBpZGVudGlmaWNhdGlvbiBoYXMgYmVlbiBzYXZlZCBpbiAvaG9tZS91c2VyLy5zc2gvaWRfcnNhLgotICBZb3VyIHB1YmxpYyBrZXkgaGFzIGJlZW4gc2F2ZWQgaW4gL2hvbWUvdXNlci8uc3NoL2lkX3JzYS5wdWIuCi0gIFRoZSBrZXkgZmluZ2VycHJpbnQgaXM6Ci0gIDAwOjExOjIyOjAwOjExOjIyOjAwOjExOjQ0OjAwOjExOjIyOjAwOjExOjIyOjk5IHVzZXJAaG9zdAotICBUaGUga2V5J3MgcmFuZG9tYXJ0IGltYWdlIGlzOgotICArLS1bIFJTQSAyMDQ4XS0tLS0rCi0gIHwgICAgIC4uKy4qPStvby4qRXwKLSAgfCAgICAgIHUuT29CLi4gLiArfAotICB8ICAgICAgIC4uKi4gICAgICB8Ci0gIHwgICAgICAgbyAgICAgICAgIHwKLSAgfCAgICAgIC4gUyAuLiAgICAgfAotICB8ICAgICAgICAgICAgICAgICB8Ci0gIHwgICAgICAgICAgICAgICAgIHwKLSAgfCAgICAgICAgICAuLiAgICAgfAotICB8ICAgICAgICAgICAgICAgICB8Ci0gICstLS0tLS0tLS0tLS0tLS0tLSsKLSAgdXNlckBob3N0On4kCi0tLS0tCi0KLVJlZ2lzdGVyaW5nIHlvdXIga2V5IGluIEdlcnJpdAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLU9wZW4gYSBicm93c2VyIGFuZCBlbnRlciB0aGUgY2Fub25pY2FsIHVybCBvZiB5b3VyIEdlcnJpdCBzZXJ2ZXIuICBZb3UgY2FuCi1maW5kIHRoZSB1cmwgaW4gdGhlIHNldHRpbmdzIGZpbGUuCi0KLS0tLS0KLSAgZ2Vycml0MkBob3N0On4kIGdpdCBjb25maWcgLWYgfi9nZXJyaXRfdGVzdHNpdGUvZXRjL2dlcnJpdC5jb25maWcgZ2Vycml0LmNhbm9uaWNhbFdlYlVybAotICBodHRwOi8vbG9jYWxob3N0OjgwODAvCi0gIGdlcnJpdDJAaG9zdDp+JAotLS0tLQotCi1SZWdpc3RlciBhIG5ldyBhY2NvdW50IGluIEdlcnJpdCB0aHJvdWdoIHRoZSB3ZWIgaW50ZXJmYWNlIHdpdGggdGhlCi1lbWFpbCBhZGRyZXNzIG9mIHlvdXIgY2hvaWNlLgotCi1UaGUgZGVmYXVsdCBhdXRoZW50aWNhdGlvbiB0eXBlIGlzIE9wZW5JRC4gIElmIHlvdXIgR2Vycml0IHNlcnZlciBpcyBiZWhpbmQgYQotcHJveHksIGFuZCB5b3UgYXJlIHVzaW5nIGFuIGV4dGVybmFsIE9wZW5JRCBwcm92aWRlciwgeW91IHdpbGwgbmVlZCB0byBhZGQgdGhlCi1wcm94eSBzZXR0aW5ncyBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCi0tLS0tCi0gIGdlcnJpdDJAaG9zdDp+JCBnaXQgY29uZmlnIC1mIH4vZ2Vycml0X3Rlc3RzaXRlL2V0Yy9nZXJyaXQuY29uZmlnIC0tYWRkIGh0dHAucHJveHkgaHR0cDovL3Byb3h5OjgwODAKLSAgZ2Vycml0MkBob3N0On4kIGdpdCBjb25maWcgLWYgfi9nZXJyaXRfdGVzdHNpdGUvZXRjL2dlcnJpdC5jb25maWcgLS1hZGQgaHR0cC5wcm94eVVzZXJuYW1lIHVzZXJuYW1lCi0gIGdlcnJpdDJAaG9zdDp+JCBnaXQgY29uZmlnIC1mIH4vZ2Vycml0X3Rlc3RzaXRlL2V0Yy9nZXJyaXQuY29uZmlnIC0tYWRkIGh0dHAucHJveHlQYXNzd29yZCBwYXNzd29yZAotLS0tLQotCi1SZWZlciB0byB0aGUgR2Vycml0IGNvbmZpZ3VyYXRpb24gZ3VpZGUgZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQKLWxpbms6Y29uZmlnLWdlcnJpdC5odG1sI2F1dGhbYXV0aGVudGljYXRpb25dIGFuZAotbGluazpjb25maWctZ2Vycml0Lmh0bWwjaHR0cC5wcm94eVtwcm94eV0gc2V0dGluZ3MuCi0KLVRoZSBmaXJzdCB1c2VyIHRvIHNpZ24taW4gYW5kIHJlZ2lzdGVyIGFuIGFjY291bnQgd2lsbCBiZQotYXV0b21hdGljYWxseSBwbGFjZWQgaW50byB0aGUgZnVsbHkgcHJpdmlsZWdlZCBBZG1pbmlzdHJhdG9ycyBncm91cCwKLXBlcm1pdHRpbmcgc2VydmVyIG1hbmFnZW1lbnQgb3ZlciB0aGUgd2ViIGFuZCBvdmVyIFNTSC4gIFN1YnNlcXVlbnQKLXVzZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZWdpc3RlcmVkIGFzIHVucHJpdmlsZWdlZCB1c2Vycy4KLQotT25jZSBzaWduZWQgaW4gYXMgeW91ciB1c2VyLCB5b3UgZmluZCBhIGxpdHRsZSB3aXphcmQgdG8gZ2V0IHlvdSBzdGFydGVkLgotVGhlIHdpemFyZCBoZWxwcyB5b3UgZmlsbCBvdXQ6Ci0KLSogUmVhbCBuYW1lICh2aXNpYmxlIG5hbWUgaW4gR2Vycml0KQotKiBSZWdpc3RlciB5b3VyIGVtYWlsIChpdCBtdXN0IGJlIGNvbmZpcm1lZCBsYXRlcikKLSogU2VsZWN0IGEgdXNlcm5hbWUgd2l0aCB3aGljaCB0byBjb21tdW5pY2F0ZSB3aXRoIEdlcnJpdCBvdmVyIHNzaCtnaXQKLQotKiBUaGUgc2VydmVyIHdpbGwgYXNrIHlvdSBmb3IgYW4gUlNBIHB1YmxpYyBrZXkuCi1UaGF0J3MgdGhlIGtleSB3ZSBnZW5lcmF0ZWQgYWJvdmUsIGFuZCBpdCdzIHRpbWUgdG8gbWFrZSBzdXJlIHRoYXQgR2Vycml0IGtub3dzCi1hYm91dCBvdXIgbmV3IGtleSBhbmQgY2FuIGlkZW50aWZ5IHVzIGJ5IGl0LgotCi0tLS0tCi0gIHVzZXJAaG9zdDp+JCBjYXQgLnNzaC9pZF9yc2EucHViCi0gIHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQUJJd0FBQVFFQTVFNzg1bVd0TWNrb3JQNXY0MFB5RmV1aTlUNTBkS3BhR1l3NjdNbHYySjNhR0JHM3RTMHFCUXhLRXBpVjBKNCtXMFJnUUhiV2ZOcWRVWWVuOWJDNVZWSC9HYXRZV2twTDlUampVY0h6RjFyWDNFeXY3UEh1SExBeWQvOFpkdjZSM3NhRitoTnBwMUpXMEJTYTdIWHpLN2lOQ1ZBM2tCdUJ0aHhlR2gzT29GYmFYSG4xend3VlF3OEk1K0xwOU9PSVk3c0pFc00va1c2OTlYRFY2ejJ6bGtCeU5WRXA0NWorZzI2eDVyQ25HUzhHSk03QTB1SHNhV0pkZE82VGl5UjYvMlNPQkYxVnRLdzQ5WExUUWNtREluRkFaelVzQVpTREtsZllsb1BrcEE2WWRxZUcwZUpxYXUranR6dWlneWRvVmo0ajl4aWRjSjlIdHhaY0pOdXJhdz09IHVzZXJAaG9zdAotICB1c2VyQGhvc3Q6fiQKLS0tLS0KLQotQ29weSB0aGUgc3RyaW5nIHN0YXJ0aW5nIHdpdGggc3NoLXJzYSB0byB5b3VyIGNsaXBib2FyZCBhbmQgdGhlbiBwYXN0ZSBpdAotaW50byB0aGUgYm94IGZvciBSU0Ega2V5cy4gTWFrZSAqYWJzb2x1dGVseSBzdXJlKiBubyBleHRyYSBzcGFjZXMgb3IgbGluZSBmZWVkcwotYXJlIGVudGVyZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgUlNBIHN0cmluZy4KLQotVmVyaWZ5IHRoYXQgdGhlIHNzaCBjb25uZWN0aW9uIHdvcmtzIGZvciB5b3UuCi0KLS0tLS0KLSAgdXNlckBob3N0On4kIHNzaCB1c2VyQGxvY2FsaG9zdCAtcCAyOTQxOAotICBUaGUgYXV0aGVudGljaXR5IG9mIGhvc3QgJ1tsb2NhbGhvc3RdOjI5NDE4IChbMTI3LjAuMC4xXToyOTQxOCknIGNhbid0IGJlIGVzdGFibGlzaGVkLgotICBSU0Ega2V5IGZpbmdlcnByaW50IGlzIGRiOjA3OjNkOmMyOjk0OjI1OmI1OjhkOmFjOmJjOmI1OjllOjJmOjk1OjVmOjRhLgotICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWUgY29ubmVjdGluZyAoeWVzL25vKT8geWVzCi0gIFdhcm5pbmc6IFBlcm1hbmVudGx5IGFkZGVkICdbbG9jYWxob3N0XToyOTQxOCcgKFJTQSkgdG8gdGhlIGxpc3Qgb2Yga25vd24gaG9zdHMuCi0KLSAgKioqKiAgICBXZWxjb21lIHRvIEdlcnJpdCBDb2RlIFJldmlldyAgICAqKioqCi0KLSAgSGkgdXNlciwgeW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCBvdmVyIFNTSC4KLQotICBVbmZvcnR1bmF0ZWx5LCBpbnRlcmFjdGl2ZSBzaGVsbHMgYXJlIGRpc2FibGVkLgotICBUbyBjbG9uZSBhIGhvc3RlZCBHaXQgcmVwb3NpdG9yeSwgdXNlOgotCi0gIGdpdCBjbG9uZSBzc2g6Ly91c2VyQGxvY2FsaG9zdDoyOTQxOC9SRVBPU0lUT1JZX05BTUUuZ2l0Ci0KLSAgdXNlckBob3N0On4kCi0tLS0tCitpbmNsdWRlOjpjb25maWctbG9naW4tcmVnaXN0ZXIudHh0W10KIAogUHJvamVjdCBjcmVhdGlvbgogLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLnR4dCBiL0RvY3VtZW50YXRpb24vaW5zdGFsbC50eHQKaW5kZXggOTkyNmI4Zi4uNGIxNGZmMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbnN0YWxsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2luc3RhbGwudHh0CkBAIC0xLDUgKzEsNSBAQAotR2Vycml0IENvZGUgUmV2aWV3IC0gSW5zdGFsbGF0aW9uIEd1aWRlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0dlcnJpdCBDb2RlIFJldmlldyAtIFN0YW5kYWxvbmUgRGFlbW9uIEluc3RhbGxhdGlvbiBHdWlkZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFtbcmVxdWlyZW1lbnRzXV0KIFJlcXVpcmVtZW50cwpAQCAtMjksNjcgKzI5LDcgQEAKIElmIHlvdSB3b3VsZCBwcmVmZXIgdG8gYnVpbGQgR2Vycml0IGRpcmVjdGx5IGZyb20gc291cmNlLCByZXZpZXcKIHRoZSBub3RlcyB1bmRlciBsaW5rOmRldi1yZWFkbWUuaHRtbFtkZXZlbG9wZXIgc2V0dXBdLgogCi0KLVtbY3JlYXRlZGJdXQotRGF0YWJhc2UgU2V0dXAKLS0tLS0tLS0tLS0tLS0tCi0KLVtbY3JlYXRlZGJfaDJdXQotSDIKLX5+Ci0KLUR1cmluZyB0aGUgaW5pdCBwaGFzZSBvZiBHZXJyaXQgeW91IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHdoaWNoIGRhdGFiYXNlIHRvIHVzZS4KLUlmIHlvdSBjaG9vc2UgSDIsIEdlcnJpdCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHVwIHRoZSBlbWJlZGRlZCBIMiBkYXRhYmFzZSBhcwotYmFja2VuZCBzbyBubyBzZXQgdXAgaW4gYWR2YW5jZSBpcyBuZWNlc3NhcnkuICBBbHNvLCBubyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gaXMKLW5lY2Vzc2FyeS4gIFVzaW5nIHRoZSBlbWJlZGRlZCBIMiBkYXRhYmFzZSBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZ2V0IGEgR2Vycml0Ci1zaXRlIHVwIGFuZCBydW5uaW5nLCBtYWtpbmcgaXQgaWRlYWwgZm9yIHByb29mIG9mIGNvbmNlcHRzIG9yIHNtYWxsIHRlYW0KLXNlcnZlcnMuICBPbiB0aGUgZmxpcCBzaWRlLCBIMiBpcyBub3QgdGhlIHJlY29tbWVuZGVkIG9wdGlvbiBmb3IgbGFyZ2UKLWNvcnBvcmF0ZSBpbnN0YWxsYXRpb25zLiBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm8gZWFzeSB3YXkgdG8gaW50ZXJhY3QKLXdpdGggdGhlIGRhdGFiYXNlIHdoaWxlIEdlcnJpdCBpcyBvZmZsaW5lLCBpdCdzIG5vdCBlYXN5IHRvIGJhY2t1cCB0aGUgZGF0YSwKLWFuZCBpdCdzIG5vdCBwb3NzaWJsZSB0byBzZXQgdXAgSDIgaW4gYSBsb2FkIGJhbGFuY2VkL2hvdHN3YXAgY29uZmlndXJhdGlvbi4KLQotCi1JZiB0aGlzIG9wdGlvbiBpbnRlcmVzdHMgeW91LCB5b3UgbWlnaHQgd2FudCB0byBjb25zaWRlciBsaW5rOmluc3RhbGwtcXVpY2suaHRtbFt0aGUgcXVpY2sgZ3VpZGVdLgotCi1bW2NyZWF0ZWRiX3Bvc3RncmVzXV0KLVBvc3RncmVTUUwKLX5+fn5+fn5+fn4KLQotVGhpcyBvcHRpb24gaXMgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBIMiBvcHRpb24gYnV0IGlzIHJlY29tbWVuZGVkCi1mb3IgbGFyZ2VyIGluc3RhbGxhdGlvbnMuIEl0J3MgdGhlIGRhdGFiYXNlIGJhY2tlbmQgd2l0aCB0aGUgbGFyZ2VzdCB1c2VyYmFzZQotaW4gdGhlIEdlcnJpdCBjb21tdW5pdHkuCi0KLUNyZWF0ZSBhIHVzZXIgZm9yIHRoZSB3ZWIgYXBwbGljYXRpb24gd2l0aGluIFBvc3RncmVzLCBhc3NpZ24gaXQgYQotcGFzc3dvcmQsIGNyZWF0ZSBhIGRhdGFiYXNlIHRvIHN0b3JlIHRoZSBtZXRhZGF0YSwgYW5kIGdyYW50IHRoZSB1c2VyCi1mdWxsIHJpZ2h0cyBvbiB0aGUgbmV3bHkgY3JlYXRlZCBkYXRhYmFzZToKLQotLS0tLQotICBjcmVhdGV1c2VyIC1BIC1EIC1QIC1FIGdlcnJpdDIKLSAgY3JlYXRlZGIgLUUgVVRGLTggLU8gZ2Vycml0MiByZXZpZXdkYgotLS0tLQotCi0KLVtbY3JlYXRlZGJfbXlzcWxdXQotTXlTUUwKLX5+fn5+Ci0KLVRoaXMgb3B0aW9uIGlzIGFsc28gbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBIMiBvcHRpb24uIEp1c3QgYXMgd2l0aAotUG9zdGdyZVNRTCBpdCdzIGFsc28gcmVjb21tZW5kZWQgZm9yIGxhcmdlciBpbnN0YWxsYXRpb25zLgotCi1DcmVhdGUgYSB1c2VyIGZvciB0aGUgd2ViIGFwcGxpY2F0aW9uIHdpdGhpbiB0aGUgZGF0YWJhc2UsIGFzc2lnbiBpdCBhCi1wYXNzd29yZCwgY3JlYXRlIGEgZGF0YWJhc2UsIGFuZCBnaXZlIHRoZSBuZXdseSBjcmVhdGVkIHVzZXIgZnVsbAotcmlnaHRzIG9uIGl0OgotCi0tLS0tCi0gIG15c3FsCi0KLSAgQ1JFQVRFIFVTRVIgJ2dlcnJpdDInQCdsb2NhbGhvc3QnIElERU5USUZJRUQgQlkgJ3NlY3JldCc7Ci0gIENSRUFURSBEQVRBQkFTRSByZXZpZXdkYjsKLSAgQUxURVIgREFUQUJBU0UgcmV2aWV3ZGIgY2hhcnNldD1sYXRpbjE7Ci0gIEdSQU5UIEFMTCBPTiByZXZpZXdkYi4qIFRPICdnZXJyaXQyJ0AnbG9jYWxob3N0JzsKLSAgRkxVU0ggUFJJVklMRUdFUzsKLS0tLS0KLQoraW5jbHVkZTo6ZGF0YWJhc2Utc2V0dXAudHh0W10KIAogW1tpbml0XV0KIEluaXRpYWxpemUgdGhlIFNpdGUKQEAgLTE4NSw4ICsxMjUsOCBAQAogYXV0b21hdGljYWxseSBzdGFydHMgYW5kIHN0b3BzIHdpdGggdGhlIG9wZXJhdGluZyBzeXN0ZW06CiAKID09PT0KLSAgc3VkbyBsbiAtc25mIGBwd2RgL3Jldmlld19zaXRlL2Jpbi9nZXJyaXQuc2ggL2V0Yy9pbml0LmQvZ2Vycml0LnNoCi0gIHN1ZG8gbG4gLXNuZiAuLi9pbml0LmQvZ2Vycml0LnNoIC9ldGMvcmMzLmQvUzkwZ2Vycml0CisgIHN1ZG8gbG4gLXNuZiBgcHdkYC9yZXZpZXdfc2l0ZS9iaW4vZ2Vycml0LnNoIC9ldGMvaW5pdC5kL2dlcnJpdAorICBzdWRvIGxuIC1zbmYgL2V0Yy9pbml0LmQvZ2Vycml0IC9ldGMvcmMzLmQvUzkwZ2Vycml0CiA9PT09CiAKIFRvIGluc3RhbGwgR2Vycml0IGludG8gYW4gZXhpc3Rpbmcgc2VydmxldCBjb250YWluZXIgaW5zdGVhZCBvZiB1c2luZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbnRyby1xdWljay50eHQgYi9Eb2N1bWVudGF0aW9uL2ludHJvLXF1aWNrLnR4dAppbmRleCAyNWY1ZDVlLi5hZTJlN2U3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ludHJvLXF1aWNrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ludHJvLXF1aWNrLnR4dApAQCAtMTM4LDEwICsxMzgsMTAgQEAKIENvbXByZXNzaW5nIG9iamVjdHM6IDEwMCUgKDIvMiksIGRvbmUuCiBXcml0aW5nIG9iamVjdHM6IDEwMCUgKDMvMyksIDU0MiBieXRlcywgZG9uZS4KIFRvdGFsIDMgKGRlbHRhIDApLCByZXVzZWQgMCAoZGVsdGEgMCkKLXJlbW90ZTogCityZW1vdGU6CiByZW1vdGU6IE5ldyBDaGFuZ2VzOgogcmVtb3RlOiAgIGh0dHA6Ly9nZXJyaXRob3N0OjgwODAvNjgKLXJlbW90ZTogCityZW1vdGU6CiBUbyBzc2g6Ly9nZXJyaXRob3N0OjI5NDE4L1JlY2lwZUJvb2suZ2l0CiAgKiBbbmV3IGJyYW5jaF0gICAgICBIRUFEIC0+IHJlZnMvZm9yL21hc3RlcgogLS0tLQpAQCAtMjA5LDEwICsyMDksMTIgQEAKIHRoaXMgd2UgY2FuIHZpZXcgaXQgd2l0aGluIHRoZSBHZXJyaXQgd2ViIGludGVyZmFjZSBhcyBlaXRoZXIgYQogdW5pZmllZCBvciBzaWRlLWJ5LXNpZGUgZGlmZiBieSBzZWxlY3RpbmcgdGhlIGFwcHJvcHJpYXRlIG9wdGlvbi4gSW4KIHRoZSBleGFtcGxlIGJlbG93IHdlJ3ZlIHNlbGVjdGVkIHRoZSBzaWRlLWJ5LXNpZGUgdmlldy4gSW4gZWl0aGVyIG9mCi10aGVzZSB2aWV3cyB5b3UgY2FuIGFkZCBjb21tZW50cyBieSBkb3VibGUgY2xpY2tpbmcgb24gdGhlIGxpbmUgKG9yCi1zaW5nbGUgY2xpY2sgdGhlIGxpbmUgbnVtYmVyKSB0aGF0IHlvdSB3YW50IHRvIGNvbW1lbnQgb24uIE9uY2UKLXB1Ymxpc2hlZCB0aGVzZSBjb21tZW50cyBhcmUgdmlld2FibGUgdG8gYWxsLCBhbGxvd2luZyBkaXNjdXNzaW9uCi1vZiB0aGUgY2hhbmdlIHRvIHRha2UgcGxhY2UuCit0aGVzZSB2aWV3cyB5b3UgY2FuIGFkZCBpbmxpbmUgY29tbWVudHMgYnkgZG91YmxlIGNsaWNraW5nIG9uIHRoZSBsaW5lCisob3Igc2luZ2xlIGNsaWNrIHRoZSBsaW5lIG51bWJlcikgdGhhdCB5b3Ugd2FudCB0byBjb21tZW50IG9uLiBBbHNvIHlvdQorY2FuIGFkZCBmaWxlIGNvbW1lbnQgYnkgZG91YmxlIGNsaWNraW5nIGFueXdoZXJlIChub3QganVzdCBvbiB0aGUKKyJQYXRjaCBTZXQiIHdvcmRzKSBpbiB0aGUgdGFibGUgaGVhZGVyIG9yIHNpbmdsZSBjbGlja2luZyBvbiB0aGUgaWNvbgoraW4gdGhlIGxpbmUtbnVtYmVyIGNvbHVtbiBoZWFkZXIuIE9uY2UgcHVibGlzaGVkIHRoZXNlIGNvbW1lbnRzIGFyZQordmlld2FibGUgdG8gYWxsLCBhbGxvd2luZyBkaXNjdXNzaW9uIG9mIHRoZSBjaGFuZ2UgdG8gdGFrZSBwbGFjZS4KIAogLlNpZGUgQnkgU2lkZSBQYXRjaCBWaWV3CiBpbWFnZTo6aW1hZ2VzL2ludHJvLXF1aWNrLXJldmlldy1saW5lLWNvbW1lbnQuanBnW0FkZGluZyBhIENvbW1lbnRdCkBAIC0zNzUsNyArMzc3LDcgQEAKIGEgc2luZ2xlIGJ1dHRvbi4gSWYgeW91IGNob29zZSBqdXN0IHRvIHB1Ymxpc2ggY29tbWVudHMgYXQgdGhpcyBwb2ludCB0aGVuCiB0aGUgc2NvcmUgd2lsbCBiZSBzdG9yZWQgYnV0IHRoZSBjaGFuZ2Ugd29uJ3QgeWV0IGJlIGFjY2VwdGVkIGludG8gdGhlIGNvZGUKIGJhc2UuIEluIHRoaXMgY2FzZSB0aGVyZSB3aWxsIGJlIGEgX1N1Ym1pdCBQYXRjaCBTZXQgWF8gYnV0dG9uIG9uIHRoZQotbWFpbiBzY3JlZW4uIEp1c3QgYXMgQ29kZSBSZXZpZXcgYW5kIFZlcmlmeSBhcmUgZGlmZmVyZW50IG9wZXJhdGlvbnMKK21haW4gc2NyZWVuLiBKdXN0IGFzIENvZGUtUmV2aWV3IGFuZCBWZXJpZnkgYXJlIGRpZmZlcmVudCBvcGVyYXRpb25zCiB0aGF0IGNhbiBiZSBkb25lIGJ5IGRpZmZlcmVudCB1c2VycywgU3VibWlzc2lvbiBpcyBhIHRoaXJkIG9wZXJhdGlvbgogdGhhdCBjYW4gYmUgbGltaXRlZCBkb3duIHRvIGFub3RoZXIgZ3JvdXAgb2YgdXNlcnMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vanNvbi50eHQgYi9Eb2N1bWVudGF0aW9uL2pzb24udHh0CmluZGV4IGYwNTg4Y2UuLjM4OTNlM2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vanNvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9qc29uLnR4dApAQCAtMjgsNyArMjgsMTEgQEAKIAogdXJsOjogQ2Fub25pY2FsIFVSTCB0byByZWFjaCB0aGlzIGNoYW5nZS4KIAotY29tbWl0TWVzc2FnZTo6IFRoZSBmdWxsIGNvbW1pdCBtZXNzYWdlIGZvciB0aGUgY2hhbmdlLgorY29tbWl0TWVzc2FnZTo6IFRoZSBmdWxsIGNvbW1pdCBtZXNzYWdlIGZvciB0aGUgY2hhbmdlJ3MgY3VycmVudCBwYXRjaAorc2V0LgorCitjcmVhdGVkT246OiBUaW1lIGluIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2ggd2hlbiB0aGlzIGNoYW5nZQord2FzIGNyZWF0ZWQuCiAKIGxhc3RVcGRhdGVkOjogVGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIHdoZW4gdGhpcyBjaGFuZ2UKIHdhcyBsYXN0IHVwZGF0ZWQuCkBAIC00MSw2ICs0NSw4IEBACiAKICAgTkVXOzsgQ2hhbmdlIGlzIHN0aWxsIGJlaW5nIHJldmlld2VkLgogCisgIERSQUZUOzsgQ2hhbmdlIGlzIGEgZHJhZnQgY2hhbmdlIHRoYXQgb25seSBjb25zaXN0cyBvZiBkcmFmdCBwYXRjaHNldHMuCisKICAgU1VCTUlUVEVEOzsgQ2hhbmdlIGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgaW4gdGhlIG1lcmdlIHF1ZXVlLgogICBJdCBtYXkgYmUgd2FpdGluZyBmb3Igb25lIG9yIG1vcmUgZGVwZW5kZW5jaWVzLgogCkBAIC00OCwxNCArNTQsMjAgQEAKIAogICBBQkFORE9ORUQ7OyBDaGFuZ2Ugd2FzIGFiYW5kb25lZCBieSBpdHMgb3duZXIgb3IgYWRtaW5pc3RyYXRvci4KIAorY29tbWVudHM6OiBBbGwgaW5saW5lL2ZpbGUgY29tbWVudHMgZm9yIHRoaXMgY2hhbmdlIGluIDw8bWVzc2FnZSxtZXNzYWdlIGF0dHJpYnV0ZXM+Pi4KKwogdHJhY2tpbmdJZHM6OiBJc3N1ZSB0cmFja2luZyBzeXN0ZW0gbGlua3MgaW4KLTw8dHJhY2tpbmdpZCx0cmFja2luZ2lkIGF0dHJpYnV0ZT4+LCBzY3JhcGVkIG91dCBvZiB0aGUgY29tbWl0Cis8PHRyYWNraW5naWQsdHJhY2tpbmdpZCBhdHRyaWJ1dGVzPj4sIHNjcmFwZWQgb3V0IG9mIHRoZSBjb21taXQKIG1lc3NhZ2UgYmFzZWQgb24gdGhlIHNlcnZlcidzCiBsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCN0cmFja2luZ2lkW3RyYWNraW5naWRdIHNlY3Rpb25zLgogCiBjdXJyZW50UGF0Y2hTZXQ6OiBDdXJyZW50IDw8cGF0Y2hTZXQscGF0Y2hTZXQgYXR0cmlidXRlPj4uCiAKLXBhdGNoU2V0czo6IEFsbCA8PHBhdGNoU2V0LHBhdGNoU2V0IGF0dHJpYnV0ZT4+IGZvciB0aGlzIGNoYW5nZS4KK3BhdGNoU2V0czo6IEFsbCA8PHBhdGNoU2V0LHBhdGNoU2V0IGF0dHJpYnV0ZXM+PiBmb3IgdGhpcyBjaGFuZ2UuCisKK2RlcGVuZHNPbjo6IExpc3Qgb2YgY2hhbmdlcyB0aGF0IHRoaXMgY2hhbmdlIGRlcGVuZHMgb24gaW4gPDxkZXBlbmRlbmN5LGRlcGVuZGVuY3kgYXR0cmlidXRlcz4+LgorCituZWVkZWRCeTo6IExpc3Qgb2YgY2hhbmdlcyB0aGF0IGRlcGVuZCBvbiB0aGlzIGNoYW5nZSBpbiA8PGRlcGVuZGVuY3ksZGVwZW5kZW5jeSBhdHRyaWJ1dGVzPj4uCiAKIHN1Ym1pdFJlY29yZHM6OiBUaGUgPDxzdWJtaXRSZWNvcmQsc3VibWl0UmVjb3JkIGF0dHJpYnV0ZT4+IGNvbnRhaW5zCiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIHRoaXMgY2hhbmdlIGhhcyBiZWVuIG9yIGNhbiBiZSBzdWJtaXR0ZWQuCkBAIC05MCwxNCArMTAyLDI5IEBACiAKIHJldmlzaW9uOjogR2l0IGNvbW1pdCBmb3IgdGhpcyBwYXRjaHNldC4KIAorcGFyZW50czo6IExpc3Qgb2YgcGFyZW50IHJldmlzaW9ucy4KKwogcmVmOjogR2l0IHJlZmVyZW5jZSBwb2ludGluZyBhdCB0aGUgcmV2aXNpb24uICBUaGlzIHJlZmVyZW5jZSBpcwogYXZhaWxhYmxlIHRocm91Z2ggdGhlIEdlcnJpdCBDb2RlIFJldmlldyBzZXJ2ZXIncyBHaXQgaW50ZXJmYWNlCiBmb3IgdGhlIGNvbnRhaW5pbmcgY2hhbmdlLgogCiB1cGxvYWRlcjo6IFVwbG9hZGVyIG9mIHRoZSBwYXRjaCBzZXQgaW4gPDxhY2NvdW50LGFjY291bnQgYXR0cmlidXRlPj4uCiAKK2F1dGhvcjo6IEF1dGhvciBvZiB0aGlzIHBhdGNoc2V0IGluIDw8YWNjb3VudCxhY2NvdW50IGF0dHJpYnV0ZT4+LgorCitjcmVhdGVkT246OiBUaW1lIGluIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2ggd2hlbiB0aGlzIHBhdGNoc2V0Cit3YXMgY3JlYXRlZC4KKwogYXBwcm92YWxzOjogVGhlIDw8YXBwcm92YWwsYXBwcm92YWwgYXR0cmlidXRlPj4gZ3JhbnRlZC4KIAorY29tbWVudHM6OiBBbGwgY29tbWVudHMgZm9yIHRoaXMgcGF0Y2hzZXQgaW4gPDxwYXRjaHNldGNvbW1lbnQscGF0Y2hzZXRDb21tZW50IGF0dHJpYnV0ZXM+Pi4KKworZmlsZXM6OiBBbGwgY2hhbmdlZCBmaWxlcyBpbiB0aGlzIHBhdGNoc2V0IGluIDw8cGF0Y2gscGF0Y2ggYXR0cmlidXRlcz4+LgorCitzaXplSW5zZXJ0aW9uczo6IFNpemUgaW5mb3JtYXRpb24gb2YgaW5zZXJ0aW9ucyBvZiB0aGlzIHBhdGNoc2V0LgorCitzaXplRGVsZXRpb25zOjogU2l6ZSBpbmZvcm1hdGlvbiBvZiBkZWxldGlvbnMgb2YgdGhpcyBwYXRjaHNldC4KKwogW1thcHByb3ZhbF1dCiBhcHByb3ZhbAogLS0tLS0tLS0KQEAgLTEyMywxOSArMTUwLDkgQEAKIAogbmV3UmV2OjogVGhlIG5ldyB2YWx1ZSB0aGUgcmVmIHdhcyB1cGRhdGVkIHRvLgogCi1wcm9qZWN0OjogUHJvamVjdCBwYXRoIGluIEdlcnJpdC4KLQogcmVmTmFtZTo6IFJlZiBuYW1lIHdpdGhpbiBwcm9qZWN0LgogCi1bW3F1ZXJ5TGltaXRdXQotcXVlcnlMaW1pdAotLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X3F1ZXJ5TGltaXRbcXVlcnlMaW1pdF0KLW9mIGEgdXNlci4KLQotbWluOjogbG93ZXIgbGltaXQKLQotbWF4OjogdXBwZXIgbGltaXQKK3Byb2plY3Q6OiBQcm9qZWN0IHBhdGggaW4gR2Vycml0LgogCiBbW3N1Ym1pdFJlY29yZF1dCiBzdWJtaXRSZWNvcmQKQEAgLTE3OCw2ICsxOTUsNzMgQEAKIAogYnk6OiBUaGUgPDxhY2NvdW50LGFjY291bnQ+PiB0aGF0IGFwcGxpZWQgdGhlIGxhYmVsLgogCitbW2RlcGVuZGVuY3ldXQorZGVwZW5kZW5jeQorLS0tLS0tLS0tLQorSW5mb3JtYXRpb24gYWJvdXQgYSBjaGFuZ2Ugb3IgcGF0Y2hzZXQgZGVwZW5kZW5jeS4KKworaWQ6OiBDaGFuZ2UgaWRlbnRpZmllci4KKworbnVtYmVyOjogQ2hhbmdlIG51bWJlci4KKworcmV2aXNpb246OiBQYXRjaHNldCByZXZpc2lvbi4KKworcmVmOjogUmVmIG5hbWUuCisKK2lzQ3VycmVudFBhdGNoU2V0OjogSWYgdGhlIHJldmlzaW9uIGlzIHRoZSBjdXJyZW50IHBhdGNoc2V0IG9mIHRoZSBjaGFuZ2UuCisKK1tbbWVzc2FnZV1dCittZXNzYWdlCistLS0tLS0tCitDb21tZW50IGFkZGVkIG9uIGEgY2hhbmdlIGJ5IGEgcmV2aWV3ZXIuCisKK3RpbWVzdGFtcDo6IFRpbWUgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCB3aGVuIHRoaXMgY29tbWVudAord2FzIGFkZGVkLgorCityZXZpZXdlcjo6IFRoZSA8PGFjY291bnQsYWNjb3VudD4+IHRoYXQgYWRkZWQgdGhlIGNvbW1lbnQuCisKK21lc3NhZ2U6OiBUaGUgY29tbWVudCB0ZXh0LgorCitbW3BhdGNoc2V0Y29tbWVudF1dCitwYXRjaHNldENvbW1lbnQKKy0tLS0tLS0tLS0tLS0tLQorQ29tbWVudCBhZGRlZCBvbiBhIHBhdGNoc2V0IGJ5IGEgcmV2aWV3ZXIuCisKK2ZpbGU6OiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBvbiB3aGljaCB0aGUgY29tbWVudCB3YXMgYWRkZWQuCisKK2xpbmU6OiBUaGUgbGluZSBudW1iZXIgYXQgd2hpY2ggdGhlIGNvbW1lbnQgd2FzIGFkZGVkLgorCityZXZpZXdlcjo6IFRoZSA8PGFjY291bnQsYWNjb3VudD4+IHRoYXQgYWRkZWQgdGhlIGNvbW1lbnQuCisKK21lc3NhZ2U6OiBUaGUgY29tbWVudCB0ZXh0LgorCitbW3BhdGNoXV0KK3BhdGNoCistLS0tLQorSW5mb3JtYXRpb24gYWJvdXQgYSBwYXRjaCBvbiBhIGZpbGUuCisKK2ZpbGU6OiBUaGUgbmFtZSBvZiB0aGUgZmlsZS4gIElmIHRoZSBmaWxlIGlzIHJlbmFtZWQsIHRoZSBuZXcgbmFtZS4KKworZmlsZU9sZDo6IFRoZSBvbGQgbmFtZSBvZiB0aGUgZmlsZSwgaWYgdGhlIGZpbGUgaXMgcmVuYW1lZC4KKwordHlwZTo6IFRoZSB0eXBlIG9mIGNoYW5nZS4KKworICBBRERFRDs7IFRoZSBmaWxlIGlzIGJlaW5nIGNyZWF0ZWQvaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoLgorCisgIE1PRElGSUVEOzsgVGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGFuZCBoYXMgdXBkYXRlZCBjb250ZW50LgorCisgIERFTEVURUQ7OyBUaGUgZmlsZSBleGlzdGVkLCBidXQgaXMgYmVpbmcgcmVtb3ZlZCBieSB0aGlzIHBhdGNoLgorCisgIFJFTkFNRUQ7OyBUaGUgZmlsZSBpcyByZW5hbWVkLgorCisgIENPUElFRDs7IFRoZSBmaWxlIGlzIGNvcGllZCBmcm9tIGFub3RoZXIgZmlsZS4KKworICBSRVdSSVRFOzsgU3VmZmljaWVudCBhbW91bnQgb2YgY29udGVudCBjaGFuZ2VkIHRvIGNsYWltIHRoZSBmaWxlIHdhcyByZXdyaXR0ZW4uCisKK2luc2VydGlvbnM6OiBudW1iZXIgb2YgaW5zZXJ0aW9ucyBvZiB0aGlzIHBhdGNoLgorCitkZWxldGlvbnM6OiAgbnVtYmVyIG9mIGRlbGV0aW9ucyBvZiB0aGlzIHBhdGNoLgorCiBTRUUgQUxTTwogLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9saWNlbnNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2xpY2Vuc2VzLnR4dAppbmRleCA3Nzg3ZmU4Li42OWExMmMzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2xpY2Vuc2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xpY2Vuc2VzLnR4dApAQCAtMzgsNiArMzgsNyBAQAogfEpldHR5ICAgICAgICAgICAgICAgICAgICAgIHwgPDxhcGFjaGUyLEFwYWNoZSBMaWNlbnNlIDIuMD4+LCBvciBsaW5rOmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sW0VQTF0KIHxQcm9sb2cgQ2FmZSAgICAgICAgICAgICAgICB8IDw8cHJvbG9nX2NhZmUsRVBMIG9yIEdQTD4+CiB8R29vZ2xlIENvZGUgUHJldHRpZnkgICAgICAgfCA8PGFwYWNoZTIsQXBhY2hlIExpY2Vuc2UgMi4wPj4KK3xKYXZhRVdBSCAgICAgICAgICAgICAgICAgICB8IDw8YXBhY2hlMixBcGFjaGUgTGljZW5zZSAyLjA+PgogfEpHaXQgICAgICAgICAgICAgICAgICAgICAgIHwgPDxqZ2l0LE5ldy1TdHlsZSBCU0Q+PgogfEpTY2ggICAgICAgICAgICAgICAgICAgICAgIHwgPDxzc2hkLE5ldy1TdHlsZSBCU0Q+PgogfFBvc3RncmVTUUwgSkRCQyBEcml2ZXIgICAgIHwgPDxwb3N0Z3Jlc3FsLE5ldy1TdHlsZSBCU0Q+PgpAQCAtNDA3LDcgKzQwOCw4IEBACiAKIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IE11dHN1bm9yaSBCQU5CQVJBIGFuZCBOYW95dWtpIFRBTVVSQSBhdCB0aGUKIEtvYmUgVW5pdmVyc2l0eSwgSkFQQU4uIEdlcnJpdCBDb2RlIFJldmlldyB1c2VzIGEgZm9yayBkZXJpdmVkIGZyb20KLXRoZSAxLjIuNSByZWxlYXNlLgordGhlIDEuMi41IHJlbGVhc2UsIGFuZCBvZmZlcnMgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUgYXQKK2xpbms6aHR0cHM6Ly9nZXJyaXQuZ29vZ2xlc291cmNlLmNvbS9wcm9sb2ctY2FmZVtdLgogCiBQcm9sb2cgQ2FmZSBpcyBkdWFsIGxpY2Vuc2VkIGFuZCBhdmFpbGFibGUgdW5kZXIgZWl0aGVyIHRoZQogbGluazpodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZWNsaXBzZS0xLjAucGhwW0VjbGlwc2UgUHVibGljIExpY2Vuc2VdLApAQCAtNDE1LDggKzQxNyw3IEBACiBsaW5rOmh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLmh0bWxbR1BMIHZlcnNpb24gMi4wIChvciBsYXRlcildLgogCiBJbiB0aGUgY29udGV4dCBvZiBHZXJyaXQgQ29kZSBSZXZpZXcsIFByb2xvZyBDYWZlIGlzIGNvbnN1bWVkCi11bmRlciBlaXRoZXIgdGhlIEVQTCBvciBHUEwgdmVyc2lvbiAzLjAgYXMgR1BMIHZlcnNpb24gMi4wIGlzCi1ub3QgY29tcGF0aWJsZSB3aXRoIEFwYWNoZSBMaWNlbnNlIDIuMC4KK3VuZGVyIHRoZSBFUEwuCiAKIFtbaDJdXQogSDIgRGF0YWJhc2UgLSBFUEwgb3IgbW9kaWZpZWQgTVBMCkBAIC02NDMsMTAgKzY0NCwxMCBAQAogIGRpc3RyaWJ1dGUsICBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCAgY29waWVzIG9mICB0aGUgU29mdHdhcmUsICBhbmQgdG8KICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSAgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotIAorCiAgVGhlICBhYm92ZSAgY29weXJpZ2h0ICBub3RpY2UgIGFuZCAgdGhpcyBwZXJtaXNzaW9uICBub3RpY2UgIHNoYWxsICBiZQogIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotIAorCiAgVEhFICBTT0ZUV0FSRSBJUyAgUFJPVklERUQgICJBUyAgSVMiLCBXSVRIT1VUICBXQVJSQU5UWSAgT0YgQU5ZICBLSU5ELAogIEVYUFJFU1MgT1IgIElNUExJRUQsIElOQ0xVRElORyAgQlVUIE5PVCBMSU1JVEVEICBUTyBUSEUgIFdBUlJBTlRJRVMgT0YKICBNRVJDSEFOVEFCSUxJVFksICAgIEZJVE5FU1MgICAgRk9SICAgIEEgICBQQVJUSUNVTEFSICAgIFBVUlBPU0UgICAgQU5ECkBAIC02NjQsOSArNjY1LDkgQEAKIAogLS0tLQogKFRoZSBNSVQgTGljZW5zZSkKLSAKKwogQ29weXJpZ2h0IChjKSAyMDA4IFRvbSBQcmVzdG9uLVdlcm5lcgotIAorCiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogJ1NvZnR3YXJlJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tYW4vLmdpdGlnbm9yZSBiL0RvY3VtZW50YXRpb24vbWFuLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5M2E1NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWFuLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAorZ2Vycml0KgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tYW4vTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL21hbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWU2NTMzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9tYW4vTWFrZWZpbGUKQEAgLTAsMCArMSw2MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0EyWCA/PSBhMngKKworYWxsOiBtYW4KKworY2xlYW46CisJQHJtIC1mIGdlcnJpdC0qCisKK0NNRF9DT1JFX1NTSF9DTUQgOj0gXAorY21kLWJhbi1jb21taXQudHh0ICAgICBcCitjbWQtY3JlYXRlLWFjY291bnQudHh0IFwKK2NtZC1jcmVhdGUtZ3JvdXAudHh0ICAgXAorY21kLWNyZWF0ZS1wcm9qZWN0LnR4dCBcCitjbWQtZmx1c2gtY2FjaGVzLnR4dCAgIFwKK2NtZC1nYy50eHQgICAgICAgICAgICAgXAorY21kLWdzcWwudHh0ICAgICAgICAgICBcCitjbWQtbHMtZ3JvdXBzLnR4dCAgICAgIFwKK2NtZC1scy1wcm9qZWN0cy50eHQgICAgXAorY21kLWxzLXVzZXItcmVmcy50eHQgICBcCitjbWQtcXVlcnkudHh0ICAgICAgICAgIFwKK2NtZC1yZW5hbWUtZ3JvdXAudHh0ICAgXAorY21kLXJldmlldy50eHQgICAgICAgICBcCitjbWQtc2V0LWFjY291bnQudHh0ICAgIFwKK2NtZC1zZXQtcHJvamVjdC1wYXJlbnQudHh0IFwKK2NtZC1zZXQtcHJvamVjdC50eHQgICAgXAorY21kLXNldC1yZXZpZXdlcnMudHh0ICBcCitjbWQtc2hvdy1jYWNoZXMudHh0ICAgIFwKK2NtZC1zaG93LWNvbm5lY3Rpb25zLnR4dCAgIFwKK2NtZC1zaG93LXF1ZXVlLnR4dCAgICAgXAorY21kLXN0cmVhbS1ldmVudHMudHh0ICBcCitjbWQtdGVzdC1zdWJtaXQtcnVsZS50eHQgICBcCitjbWQtdmVyc2lvbi50eHQKKworR0VSUklUX0NPUkVfU1NIX0NNRCA6PSAkKHBhdHN1YnN0IGNtZC0lLGdlcnJpdC0lLCQoQ01EX0NPUkVfU1NIX0NNRCkpCitET0NfTUFOIDo9ICQocGF0c3Vic3QgJS50eHQsJS4xLCQoR0VSUklUX0NPUkVfU1NIX0NNRCkpCisKK21hbjogJChHRVJSSVRfQ09SRV9TU0hfQ01EKSAkKERPQ19NQU4pCisKKyQoR0VSUklUX0NPUkVfU1NIX0NNRCkgOiBnZXJyaXQtJS50eHQgOiAuLi9jbWQtJS50eHQKKwlAY3AgJDwgJEAKKworJChET0NfTUFOKSA6ICUuMSA6ICUudHh0CisJQGVjaG8gImNyZWF0aW5nIG1hbiBwYWdlIGZvciAkQCAuLi4iCisJQHJtIC1mICRACisJQCQoZXZhbCBUSVRMRSA6PSAkKGpvaW4gJChiYXNlbmFtZSAkPCksXCgxXCkpKQorCUAkKGV2YWwgU0VQRVJBVE9SIDo9ICQoc2hlbGwgZWNobyAkKFRJVExFKSB8IHNlZCAncy8uLz0vZycpKQorCUBzZWQgLWkgLXJlICcxcy9eLiokLy8kKFRJVExFKS8nICQ8CisJQHNlZCAtaSAtcmUgJzJzL149LiovJChTRVBFUkFUT1IpLycgJDwKKwlAc2VkIC1pIC1yZSAnNnMvXmdlcnJpdFxzKyhcdykvZ2Vycml0LVwxLycgJDwKKwlAJChBMlgpIC0tZG9jdHlwZSBtYW5wYWdlIC0tZm9ybWF0IG1hbnBhZ2UgJDwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGdtLUV4cG9ydFJldmlld05vdGVzLnR4dCBiL0RvY3VtZW50YXRpb24vcGdtLUV4cG9ydFJldmlld05vdGVzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwMDIxMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3BnbS1FeHBvcnRSZXZpZXdOb3Rlcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi1FeHBvcnRSZXZpZXdOb3RlcwotPT09PT09PT09PT09PT09PT0KLQotTkFNRQotLS0tLQotRXhwb3J0UmV2aWV3Tm90ZXMgLSBFeHBvcnQgc3VjY2Vzc2Z1bCByZXZpZXdzIHRvIGxpbms6cmVmcy1ub3Rlcy1yZXZpZXcuaHRtbFtyZWZzL25vdGVzL3Jldmlld10KLQotU1lOT1BTSVMKLS0tLS0tLS0tCi1bdmVyc2VdCi0namF2YScgLWphciBnZXJyaXQud2FyICdFeHBvcnRSZXZpZXdOb3RlcycgLWQgPFNJVEVfUEFUSD4KLQotREVTQ1JJUFRJT04KLS0tLS0tLS0tLS0tCi1TY2FucyBldmVyeSBzdWJtaXR0ZWQgY2hhbmdlIGFuZCBjcmVhdGVzIGFuIGluaXRpYWwgbm90ZXMKLWJyYW5jaCBkZXRhaWxpbmcgdGhlIHByZXZpb3VzIHN1Ym1pc3Npb24gaW5mb3JtYXRpb24gZm9yCi1lYWNoIG1lcmdlZCBjaGFuZ2UuCi0KLVRoaXMgdGFzayBjYW4gdGFrZSBxdWl0ZSBzb21lIHRpbWUsIGJ1dCBjYW4gcnVuIGluIHRoZSBiYWNrZ3JvdW5kCi1jb25jdXJyZW50bHkgdG8gdGhlIHNlcnZlciBpZiB0aGUgZGF0YWJhc2UgaXMgTXlTUUwgb3IgUG9zdGdyZVNRTC4KLUlmIHRoZSBkYXRhYmFzZSBpcyBIMiwgdGhpcyB0YXNrIG11c3QgYmUgcnVuIGJ5IGl0c2VsZi4KLQotT1BUSU9OUwotLS0tLS0tLQotCi0tZDo6Ci1cLS1zaXRlLXBhdGg6OgotCUxvY2F0aW9uIG9mIHRoZSBnZXJyaXQuY29uZmlnIGZpbGUsIGFuZCBhbGwgb3RoZXIgcGVyLXNpdGUKLQljb25maWd1cmF0aW9uIGRhdGEsIHN1cHBvcnRpbmcgbGlicmFyaWVzIGFuZCBsb2cgZmlsZXMuCi0KLVwtLXRocmVhZHM6OgotCU51bWJlciBvZiB0aHJlYWRzIHRvIHBlcmZvcm0gdGhlIHNjYW4gd29yayB3aXRoLiAgRGVmYXVsdDogMi4KLQotQ09OVEVYVAotLS0tLS0tLQotVGhpcyBjb21tYW5kIGNhbiBvbmx5IGJlIHJ1biBvbiBhIHNlcnZlciB3aGljaCBoYXMgZGlyZWN0Ci1jb25uZWN0aXZpdHkgdG8gdGhlIG1ldGFkYXRhIGRhdGFiYXNlLCBhbmQgbG9jYWwgYWNjZXNzIHRvIHRoZQotbWFuYWdlZCBHaXQgcmVwb3NpdG9yaWVzLgotCi1FWEFNUExFUwotLS0tLS0tLS0KLVRvIGdlbmVyYXRlIGFsbCByZXZpZXcgaW5mb3JtYXRpb246Ci0KLT09PT0KLQkkIGphdmEgLWphciBnZXJyaXQud2FyIEV4cG9ydFJldmlld05vdGVzIC1kIHNpdGVfcGF0aCAtLXRocmVhZHMgMTYKLT09PT0KLQotR0VSUklUCi0tLS0tLS0KLVBhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGdtLWRhZW1vbi50eHQgYi9Eb2N1bWVudGF0aW9uL3BnbS1kYWVtb24udHh0CmluZGV4IDFjMWQzNDMuLjNmZmNiNDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcGdtLWRhZW1vbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wZ20tZGFlbW9uLnR4dApAQCAtMTQsNiArMTQsNyBAQAogCVtcLS1lbmFibGUtc3NoZCB8IFwtLWRpc2FibGUtc3NoZF0KIAlbXC0tY29uc29sZS1sb2ddCiAJW1wtLXNsYXZlXQorCVtcLS1oZWFkbGVzc10KIAogREVTQ1JJUFRJT04KIC0tLS0tLS0tLS0tCkBAIC01OCw2ICs1OSwxMCBAQAogCVNlbmQgbG9nIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLCBpbnN0ZWFkIG9mIHRvIHRoZSBzdGFuZGFyZAogCWxvZyBmaWxlICckc2l0ZV9wYXRoL2xvZ3MvZXJyb3JfbG9nJy4KIAorXC0taGVhZGxlc3M6OgorCURvbid0IHN0YXJ0IHRoZSBkZWZhdWx0IEdlcnJpdCBVSS4gTWF5IGJlIHVzZWZ1bCB3aGVuIEdlcnJpdCBpcworCXJ1biB3aXRoIGFuIGFsdGVybmF0aXZlIFVJLgorCiBDT05URVhUCiAtLS0tLS0tCiBUaGlzIGNvbW1hbmQgY2FuIG9ubHkgYmUgcnVuIG9uIGEgc2VydmVyIHdoaWNoIGhhcyBkaXJlY3QKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGdtLWdzcWwudHh0IGIvRG9jdW1lbnRhdGlvbi9wZ20tZ3NxbC50eHQKaW5kZXggYzNhNDkyYS4uMzdmYmI3NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wZ20tZ3NxbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wZ20tZ3NxbC50eHQKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogCVR5cGUgJ1xoJyBmb3IgaGVscC4gIFR5cGUgJ1xyJyB0byBjbGVhciB0aGUgYnVmZmVyLgogCi0JZ2Vycml0PiB1cGRhdGUgYWNjb3VudHMgc2V0IHNzaF91c2VyX25hbWUgPSAnYWxpY2UnIHdoZXJlIGFjY291bnRfaWQ9MTsgICAgICAgCisJZ2Vycml0PiB1cGRhdGUgYWNjb3VudHMgc2V0IHNzaF91c2VyX25hbWUgPSAnYWxpY2UnIHdoZXJlIGFjY291bnRfaWQ9MTsKIAlVUERBVEUgMTsgMSBtcwogCWdlcnJpdD4gXHEKIAlCeWUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGdtLWluZGV4LnR4dCBiL0RvY3VtZW50YXRpb24vcGdtLWluZGV4LnR4dAppbmRleCA1Y2JlNmJhMC4uN2ExZWRjZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wZ20taW5kZXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcGdtLWluZGV4LnR4dApAQCAtMSwxMyArMSwxNSBAQAotR2Vycml0IENvZGUgUmV2aWV3IC0gU2VydmVyIFByb2dyYW1zCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0dlcnJpdCBDb2RlIFJldmlldyAtIFNlcnZlciBTaWRlIEFkbWluaXN0cmF0aXZlIFRvb2xzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1TZXJ2ZXIgc2lkZSBwcm9ncmFtcyBjYW4gYmUgc3RhcnRlZCBieSBleGVjdXRpbmcgdGhlIFdBUiBmaWxlCitTZXJ2ZXIgc2lkZSB0b29scyBjYW4gYmUgc3RhcnRlZCBieSBleGVjdXRpbmcgdGhlIFdBUiBmaWxlCiB0aHJvdWdoIHRoZSBKYXZhIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgogCi0gICQgamF2YSAtamFyIGdlcnJpdC53YXIgcHJvZ3JhbSBbb3B0aW9uc10KKyAgJCBqYXZhIC1qYXIgZ2Vycml0LndhciA8dG9vbD4gWzxvcHRpb25zPl0KIAotW1twcm9ncmFtc11dUHJvZ3JhbXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUb29sIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBuYW1lczoKKworVG9vbHMKKy0tLS0tCiAKIGxpbms6cGdtLWluaXQuaHRtbFtpbml0XTo6CiAJSW5pdGlhbGl6ZSBhIG5ldyBHZXJyaXQgc2VydmVyIGluc3RhbGxhdGlvbi4KQEAgLTI4LDEwICszMCw3IEBACiAJRGlzcGxheSB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIEdlcnJpdCBDb2RlIFJldmlldy4KIAogVHJhbnNpdGlvbiBVdGlsaXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWxpbms6cGdtLUV4cG9ydFJldmlld05vdGVzLmh0bWxbRXhwb3J0UmV2aWV3Tm90ZXNdOjoKLQlFeHBvcnQgc3VibWl0dGVkIHJldmlldyBpbmZvcm1hdGlvbiB0byByZWZzL25vdGVzL3Jldmlldy4KK35+fn5+fn5+fn5+fn5+fn5+fn5+CiAKIGxpbms6cGdtLVNjYW5UcmFja2luZ0lkcy5odG1sW1NjYW5UcmFja2luZ0lkc106OgogCVJlc2NhbiBhbGwgY2hhbmdlcyBhZnRlciBjb25maWd1cmluZyB0cmFja2luZ2lkcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcHJvamVjdC1zZXR1cC50eHQgYi9Eb2N1bWVudGF0aW9uL3Byb2plY3Qtc2V0dXAudHh0CmluZGV4IDNkOTc5ZDMuLjM2ZDNjNjAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcHJvamVjdC1zZXR1cC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wcm9qZWN0LXNldHVwLnR4dApAQCAtNTQsOCArNTQsOCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIG1ldGhvZCBHZXJyaXQgdXNlcyB0byBzdWJtaXQgYSBjaGFuZ2UgdG8gYSBwcm9qZWN0IGNhbiBiZQotbW9kaWZpZWQgYnkgYW55IHByb2plY3Qgb3duZXIgdGhyb3VnaCB0aGUgcHJvamVjdCBjb25zb2xlLCBgQWRtaW5gID4KLWBQcm9qZWN0c2AuICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHN1cHBvcnRlZDoKK21vZGlmaWVkIGJ5IGFueSBwcm9qZWN0IG93bmVyIHRocm91Z2ggdGhlIHByb2plY3QgY29uc29sZSwgYFByb2plY3RzYCA+CitgTGlzdGAgPiBteS9wcm9qZWN0LiAgVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdXBwb3J0ZWQ6CiAKICogRmFzdCBGb3J3YXJkIE9ubHkKICsKQEAgLTk5LDEwICs5OSwyMCBAQAogdGhlIHJpZ2h0IG9yZGVyIHNpbmNlIGludGVyLWNoYW5nZSBkZXBlbmRlbmNpZXMgd2lsbCBub3QgYmUKIGVuZm9yY2VkIGZvciB0aGVtLgogCitbW3JlYmFzZV9pZl9uZWNlc3NhcnldXQorKiBSZWJhc2UgSWYgTmVjZXNzYXJ5CisrCitJZiB0aGUgY2hhbmdlIGJlaW5nIHN1Ym1pdHRlZCBpcyBhIHN0cmljdCBzdXBlcnNldCBvZiB0aGUgZGVzdGluYXRpb24KK2JyYW5jaCwgdGhlbiB0aGUgYnJhbmNoIGlzIGZhc3QtZm9yd2FyZGVkIHRvIHRoZSBjaGFuZ2UuICBJZiBub3QsCit0aGVuIHRoZSBjaGFuZ2UgaXMgYXV0b21hdGljYWxseSByZWJhc2VkIGFuZCB0aGVuIHRoZSBicmFuY2ggaXMKK2Zhc3QtZm9yd2FyZGVkIHRvIHRoZSBjaGFuZ2UuCisKIFdoZW4gR2Vycml0IHRyaWVzIHRvIGRvIGEgbWVyZ2UsIGJ5IGRlZmF1bHQgdGhlIG1lcmdlIHdpbGwgb25seQotc3VjY2VlZCBpZiB0aGVyZSBpcyBubyBwYXRoIGNvbmZsaWN0LiBCeSBzZWxlY3RpbmcgdGhlIGNoZWNrYm94Ci1gQXV0b21hdGljYWxseSByZXNvbHZlIGNvbmZsaWN0c2AgR2Vycml0IHdpbGwgdHJ5IGRvIGEgY29udGVudCBtZXJnZQotaWYgYSBwYXRoIGNvbmZsaWN0IG9jY3Vycy4KK3N1Y2NlZWQgaWYgdGhlcmUgaXMgbm8gcGF0aCBjb25mbGljdC4gIEEgcGF0aCBjb25mbGljdCBvY2N1cnMgd2hlbgordGhlIHNhbWUgZmlsZSBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIG1lcmdlLgorCitJZiBgQXV0b21hdGljYWxseSByZXNvbHZlIGNvbmZsaWN0c2AgaXMgZW5hYmxlZCwgR2Vycml0IHdpbGwgdHJ5Cit0byBkbyBhIGNvbnRlbnQgbWVyZ2Ugd2hlbiBhIHBhdGggY29uZmxpY3Qgb2NjdXJzLgogCiAKIFJlZ2lzdGVyaW5nIEFkZGl0aW9uYWwgQnJhbmNoZXMKQEAgLTExMyw4ICsxMjMsOCBAQAogCiBBZGRpdGlvbmFsIGJyYW5jaGVzIGNhbiBhbHNvIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgd2ViIFVJLCBhc3N1bWluZwogYXQgbGVhc3Qgb25lIGNvbW1pdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgcHJvamVjdCByZXBvc2l0b3J5LgotQSBwcm9qZWN0IG93bmVyIGNhbiBjcmVhdGUgYWRkaXRpb25hbCBicmFuY2hlcyB1bmRlciBgQWRtaW5gID4KLWBQcm9qZWN0c2AgPiBgQnJhbmNoZXNgLiAgRW50ZXIgdGhlIG5ldyBicmFuY2ggbmFtZSwgYW5kIHRoZQorQSBwcm9qZWN0IG93bmVyIGNhbiBjcmVhdGUgYWRkaXRpb25hbCBicmFuY2hlcyB1bmRlciBgUHJvamVjdHNgID4KK2BMaXN0YCA+IG15L3Byb2plY3QgPiBgQnJhbmNoZXNgLiAgRW50ZXIgdGhlIG5ldyBicmFuY2ggbmFtZSwgYW5kIHRoZQogc3RhcnRpbmcgR2l0IHJldmlzaW9uLiAgQnJhbmNoIG5hbWVzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBgcmVmcy9gCiB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZSBgcmVmcy9oZWFkcy9gIHByZWZpeGVkIHRvIGVuc3VyZSB0aGV5IGFyZQogYSBzdGFuZGFyZCBHaXQgYnJhbmNoIG5hbWUuICBBbG1vc3QgYW55IHZhbGlkIFNIQS0xIGV4cHJlc3Npb24gY2FuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Byb2xvZy1jaGFuZ2UtZmFjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9wcm9sb2ctY2hhbmdlLWZhY3RzLnR4dAppbmRleCBkNWY2MTc0Li5lMjFkYTAyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Byb2xvZy1jaGFuZ2UtZmFjdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcHJvbG9nLWNoYW5nZS1mYWN0cy50eHQKQEAgLTQ4LDYgKzQ4LDkgQEAKIHxgY29tbWl0X21lc3NhZ2UvMWAgICB8YGNvbW1pdF9tZXNzYWdlKCdGaXggYnVnIFgnKS5gCiAgICAgfENvbW1pdCBtZXNzYWdlIGFzIHN0cmluZyBhdG9tCiAKK3xgY29tbWl0X3N0YXRzLzNgICAgfGBjb21taXRfc3RhdHMoNSwyMCw1MCkuYAorICAgIHxOdW1iZXIgb2YgZmlsZXMgbW9kaWZpZWQsIG51bWJlciBvZiBpbnNlcnRpb25zIGFuZCB0aGUgbnVtYmVyIG9mIGRlbGV0aW9ucy4KKwogLjQrfGBjdXJyZW50X3VzZXIvMWAgIHxgY3VycmVudF91c2VyKHVzZXIoMTAwMDAwMCkpLmAKICAgICAuNCt8Q3VycmVudCB1c2VyIGFzIG9uZSBvZiB0aGUgZm91ciBnaXZlbiBwb3NzaWJpbGl0aWVzCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcHJvbG9nLWNvb2tib29rLnR4dCBiL0RvY3VtZW50YXRpb24vcHJvbG9nLWNvb2tib29rLnR4dAppbmRleCBlNjYwMDY3Li43OTEyY2YyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Byb2xvZy1jb29rYm9vay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wcm9sb2ctY29va2Jvb2sudHh0CkBAIC0yOCw2ICsyOCwyNyBAQAogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi4yLjIuaHRtbFtHZXJyaXQKIDIuMi4yIFJlbGVhc2VOb3Rlc10gaW50cm9kdWNlcyBQcm9sb2cgc3VwcG9ydCBpbiBHZXJyaXQuCiAKK1N1Ym1pdCBUeXBlCistLS0tLS0tLS0tLQorQSAnU3VibWl0IFR5cGUnIGlzIGEgc3RyYXRlZ3kgdGhhdCBpcyB1c2VkIG9uIHN1Ym1pdCB0byBpbnRlZ3JhdGUgdGhlCitjaGFuZ2UgaW50byB0aGUgZGVzdGluYXRpb24gYnJhbmNoLiBTdXBwb3J0ZWQgc3VibWl0IHR5cGVzIGFyZToKKworKiBgRmFzdCBGb3J3YXJkIE9ubHlgCisqIGBNZXJnZSBJZiBOZWNlc3NhcnlgCisqIGBNZXJnZSBBbHdheXNgCisqIGBDaGVycnkgUGlja2AKKyogYFJlYmFzZSBJZiBOZWNlc3NhcnlgCisKKydTdWJtaXQgVHlwZScgaXMgYSBwcm9qZWN0IGdsb2JhbCBzZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNhbWUgc3VibWl0IHR5cGUKK2lzIHVzZWQgZm9yIGFsbCBjaGFuZ2VzIG9mIG9uZSBwcm9qZWN0LgorCitQcm9qZWN0cyB3aGljaCBuZWVkIG1vcmUgZmxleGliaWxpdHkgaW4gY2hvb3NpbmcsIG9yIGVuZm9yY2luZywgYSBzdWJtaXQgdHlwZQorY2FuIHVzZSBQcm9sb2cgYmFzZWQgc3VibWl0IHR5cGUgd2hpY2ggcmVwbGFjZXMgdGhlIHByb2plY3QncyBkZWZhdWx0IHN1Ym1pdAordHlwZS4KKworUHJvbG9nIGJhc2VkIHN1Ym1pdCB0eXBlIGNvbXB1dGVzIGEgc3VibWl0IHR5cGUgZm9yIGVhY2ggY2hhbmdlLiBUaGUgY29tcHV0ZWQKK3N1Ym1pdCB0eXBlIGlzIHNob3duIG9uIHRoZSBjaGFuZ2Ugc2NyZWVuIGZvciBlYWNoIGNoYW5nZS4KKwogUHJvbG9nIExhbmd1YWdlCiAtLS0tLS0tLS0tLS0tLS0KIFRoaXMgZG9jdW1lbnQgaXMgbm90IGEgY29tcGxldGUgUHJvbG9nIHR1dG9yaWFsLgpAQCAtNzYsNiArOTcsNyBAQAogICAkIGdpdCBwdXNoIG9yaWdpbiBIRUFEOnJlZnMvbWV0YS9jb25maWcKID09PT0KIAorW1tIb3dUb1dyaXRlU3VibWl0UnVsZXNdXQogSG93IHRvIHdyaXRlIHN1Ym1pdCBydWxlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogV2hlbmV2ZXIgR2Vycml0IG5lZWRzIHRvIGV2YWx1YXRlIHN1Ym1pdCBydWxlcyBmb3IgYSBjaGFuZ2UgYENgIGZyb20gcHJvamVjdCBgUGAgaXQKQEAgLTE3MSwxMyArMTkzLDE0IEBACiBBbm90aGVyIGFzcGVjdCBvZiB0aGUgcmV0dXJuIHJlc3VsdCBmcm9tIHRoZSBgc3VibWl0X3J1bGVgIHByZWRpY2F0ZSBpcyB0aGF0CiBHZXJyaXQgdXNlcyBpdCB0byBkZWNpZGUgd2hpY2ggc2V0IG9mIGxhYmVscyB0byBkaXNwbGF5IG9uIHRoZSBjaGFuZ2UgcmV2aWV3CiBzY3JlZW4gZm9yIHZvdGluZy4gSWYgdGhlIHJldHVybiByZXN1bHQgY29udGFpbnMgbGFiZWwgYCdBQkMnYCBhbmQgaWYgdGhlIGxhYmVsCi1gJ0FCQydgIGlzIG9uZSBvZiB0aGUgKGdsb2JhbCkgdm90aW5nIGNhdGVnb3JpZXMgdGhlbiB2b3RpbmcgZm9yIHRoZSBsYWJlbAotYCdBQkMnYCB3aWxsIGJlIGRpc3BsYXllZC4gT3RoZXJ3aXNlLCBpdCBpcyBub3QgZGlzcGxheWVkLiBOb3RlIHRoYXQgd2UgZG9uJ3QKLW5lZWQgYSAoZ2xvYmFsKSB2b3RpbmcgY2F0ZWdvcnkgZm9yIGVhY2ggbGFiZWwgY29udGFpbmVkIGluIHRoZSByZXN1bHQgb2YKK2AnQUJDJ2AgaXMgbGluazpjb25maWctbGFiZWxzLmh0bWxbZGVmaW5lZCBmb3IgdGhlIHByb2plY3RdIHRoZW4gdm90aW5nIGZvciB0aGUKK2xhYmVsIGAnQUJDJ2Agd2lsbCBiZSBkaXNwbGF5ZWQuIE90aGVyd2lzZSwgaXQgaXMgbm90IGRpc3BsYXllZC4gTm90ZSB0aGF0IHRoZQorcHJvamVjdCBkb2Vzbid0IG5lZWQgYSBkZWZpbmVkIGxhYmVsIGZvciBlYWNoIGxhYmVsIGNvbnRhaW5lZCBpbiB0aGUgcmVzdWx0IG9mCiBgc3VibWl0X3J1bGVgIHByZWRpY2F0ZS4gIEZvciBleGFtcGxlLCB0aGUgZGVjaXNpb24gd2hldGhlciBgJ0F1dGhvci1pcy1Kb2huLURvZSdgCiBsYWJlbCBpcyBtZXQgd2lsbCBwcm9iYWJseSBub3QgYmUgbWFkZSBieSBleHBsaWNpdCB2b3RpbmcgYnV0LCBpbnN0ZWFkLCBieQogaW5zcGVjdGluZyB0aGUgZmFjdHMgYWJvdXQgdGhlIGNoYW5nZS4KIAorW1tTdWJtaXRGaWx0ZXJdXQogU3VibWl0IEZpbHRlcgogLS0tLS0tLS0tLS0tLQogQW5vdGhlciBtZWNoYW5pc20gb2YgY2hhbmdpbmcgdGhlIGRlZmF1bHQgc3VibWl0IHJ1bGVzIGlzIHRvIGltcGxlbWVudCB0aGUKQEAgLTIxNSw3ICsyMzgsNiBAQAogCiBUaGUgZm9sbG93aW5nICJkcmF3aW5nIiBpbGx1c3RyYXRlcyB0aGUgb3JkZXIgb2YgdGhlIGludm9jYXRpb24gYW5kIHRoZSBjaGFpbmluZwogb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGBzdWJtaXRfcnVsZWAgYW5kIGBzdWJtaXRfZmlsdGVyYCBwcmVkaWNhdGVzLgotCiA9PT09CiAgIEFsbC1Qcm9qZWN0cwogICBeICAgc3VibWl0X2ZpbHRlcihCLCBTKSA6LSAuLi4gIDw0PgpAQCAtMjQ3LDYgKzI2OSwzNCBAQAogZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBzdWJtaXQgcnVsZSB0aGF0IGlzIG5hbWVkIGBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgIGFuZAogaXRzIHJlc3VsdCB3aWxsIGJlIGZpbHRlcmVkIGFzIGRlc2NyaWJlZCBhYm92ZS4KIAorW1tIb3dUb1dyaXRlU3VibWl0VHlwZV1dCitIb3cgdG8gd3JpdGUgc3VibWl0IHR5cGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorV3JpdGluZyBjdXN0b20gc3VibWl0IHR5cGUgbG9naWMgaW4gUHJvbG9nIGlzIHRoZSBzaW1pbGFyIHRvcAoreHJlZjpIb3dUb1dyaXRlU3VibWl0UnVsZXNbd3JpdGluZyBzdWJtaXQgcnVsZXNdLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQKK29uZSBoYXMgdG8gaW1wbGVtZW50IGEgYHN1Ym1pdF90eXBlYCBwcmVkaWNhdGUgKGluc3RlYWQgb2YgdGhlIGBzdWJtaXRfcnVsZWApCithbmQgdGhhdCB0aGUgcmV0dXJuIHJlc3VsdCBvZiB0aGUgYHN1Ym1pdF90eXBlYCBoYXMgdG8gYmUgYW4gYXRvbSB0aGF0CityZXByZXNlbnRzIG9uZSBvZiB0aGUgc3VwcG9ydGVkIHN1Ym1pdCB0eXBlczoKKworKiBgZmFzdF9mb3J3YXJkX29ubHlgCisqIGBtZXJnZV9pZl9uZWNlc3NhcnlgCisqIGBtZXJnZV9hbHdheXNgCisqIGBjaGVycnlfcGlja2AKKyogYHJlYmFzZV9pZl9uZWNlc3NhcnlgCisKK1N1Ym1pdCBUeXBlIEZpbHRlcgorLS0tLS0tLS0tLS0tLS0tLS0tCitTdWJtaXQgdHlwZSBmaWx0ZXIgd29ya3MgdGhlIHNhbWUgd2F5IGFzIHRoZSB4cmVmOlN1Ym1pdEZpbHRlcltTdWJtaXQgRmlsdGVyXQord2hlcmUgdGhlIG5hbWUgb2YgdGhlIGZpbHRlciBwcmVkaWNhdGUgaXMgYHN1Ym1pdF90eXBlX2ZpbHRlcmAuCisKKz09PT0KKyAgc3VibWl0X3R5cGVfZmlsdGVyKEluLCBPdXQpLgorPT09PQorCitHZXJyaXQgd2lsbCBpbnZva2UgYHN1Ym1pdF90eXBlX2ZpbHRlcmAgd2l0aCB0aGUgYEluYCBwYXJhbWV0ZXIgY29udGFpbmluZyBhCityZXN1bHQgb2YgdGhlIGBzdWJtaXRfdHlwZWAgYW5kIHdpbGwgdGFrZSB0aGUgdmFsdWUgb2YgdGhlIGBPdXRgIHBhcmFtZXRlciBhcwordGhlIHJlc3VsdC4KKwogW1tUZXN0aW5nU3VibWl0UnVsZXNdXQogVGVzdGluZyBzdWJtaXQgcnVsZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNzUsOCArMzI1LDExIEBACiB0aGUgY2hhbmdlIGV4cG9zZWQgdG8gdGhlbS4gR2Vycml0IHBsdWdpbnMgZ2V0IGZ1bGwgYWNjZXNzIHRvIEdlcnJpdCBpbnRlcm5hbHMKIGFuZCBjYW4gcG90ZW50aWFsbHkgY2hlY2sgbW9yZSB0aGluZ3MgdGhhbiBQcm9sb2cgYmFzZWQgcnVsZXMuCiAKLUV4YW1wbGVzCi0tLS0tLS0tLQorRnJvbSB2ZXJzaW9uIDIuNiBHZXJyaXQgcGx1Z2lucyBjYW4gY29udHJpYnV0ZSBQcm9sb2cgcHJlZGljYXRlcy4gVGhpcyB3YXksIHdlCitjYW4gbWFrZSB1c2Ugb2YgdGhlIHBsdWdpbiBwcm92aWRlZCBwcmVkaWNhdGVzIHdoZW4gd3JpdGluZyBQcm9sb2cgYmFzZWQgcnVsZXMuCisKK0V4YW1wbGVzIC0gU3VibWl0IFJ1bGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdWxkIHNlcnZlIGFzIGEgY29va2Jvb2sgZm9yIGRldmVsb3Bpbmcgb3duIHN1Ym1pdCBydWxlcy4KIFNvbWUgb2YgdGhlbSBhcmUgdG9vIHRyaXZpYWwgdG8gYmUgdXNlZCBpbiBwcm9kdWN0aW9uIGFuZCB0aGVpciBvbmx5IHB1cnBvc2UgaXMKIHRvIHByb3ZpZGUgc3RlcCBieSBzdGVwIGludHJvZHVjdGlvbiBhbmQgdW5kZXJzdGFuZGluZy4KQEAgLTI5NSw3ICszNDgsOCBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdBbnktTGFiZWwtTmFtZScsIG9rKF8pKSkpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoVykpIDotCisgICAgVyA9IGxhYmVsKCdBbnktTGFiZWwtTmFtZScsIG9rKF8pKS4KID09PT0KIAogSW4gdGhpcyBjYXNlIHdlIG1ha2Ugbm8gdXNlIG9mIGZhY3RzIGFib3V0IHRoZSBjaGFuZ2UuIFdlIGRvbid0IG5lZWQgaXQgYXMgd2UgYXJlIHNpbXBseQpAQCAtMzEzLDcgKzM2Nyw5IEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0NvZGUtUmV2aWV3Jywgb2soXykpLCBsYWJlbCgnVmVyaWZpZWQnLCBvayhfKSkpKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KENSLCBWKSkgOi0KKyAgICBDUiA9IGxhYmVsKCdDb2RlLVJldmlldycsIG9rKF8pKSwKKyAgICBWID0gbGFiZWwoJ1ZlcmlmaWVkJywgb2soXykpLgogPT09PQogCiBTaW5jZSBmb3IgZXZlcnkgY2hhbmdlIGFsbCBsYWJlbCBzdGF0dXNlcyBhcmUgYCdvaydgIGV2ZXJ5IGNoYW5nZSB3aWxsIGJlIHN1Ym1pdHRhYmxlLgpAQCAtMzI4LDcgKzM4NCw4IEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0FueS1MYWJlbC1OYW1lJywgcmVqZWN0KF8pKSkpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoUikpIDotCisgICAgUiA9IGxhYmVsKCdBbnktTGFiZWwtTmFtZScsIHJlamVjdChfKSkuCiA9PT09CiAKIFNpbmNlIGZvciBhbnkgY2hhbmdlIHdlIHJldHVybiBvbmx5IG9uZSBsYWJlbCB3aXRoIHN0YXR1cyBgcmVqZWN0YCwgbm8gY2hhbmdlCkBAIC0zNDQsMTMgKzQwMSwxNyBAQAogW2NhcHRpb249IiJdCiA9PT09CiAgICUgSW4gdGhlIFVJIHRoaXMgd2lsbCBzaG93OiBOZWVkIEFueS1MYWJlbC1OYW1lCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQW55LUxhYmVsLU5hbWUnLCBuZWVkKF8pKSkpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoTikpIDotCisgICAgTiA9IGxhYmVsKCdBbnktTGFiZWwtTmFtZScsIG5lZWQoXykpLgogCiAgICUgV2UgY291bGQgZGVmaW5lIG1vcmUgIm5lZWQiIGxhYmVscyBieSBhZGRpbmcgbW9yZSBydWxlcwotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0Fub3RoZXItTGFiZWwtTmFtZScsIG5lZWQoXykpKSkuCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChOKSkgOi0KKyAgICBOID0gbGFiZWwoJ0Fub3RoZXItTGFiZWwtTmFtZScsIG5lZWQoXykpLgogCiAgICUgb3IgYnkgcHJvdmlkaW5nIG1vcmUgdGhhbiBvbmUgbmVlZCBsYWJlbCBpbiB0aGUgc2FtZSBydWxlCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnWC1MYWJlbC1OYW1lJywgbmVlZChfKSksIGxhYmVsKCdZLUxhYmVsLU5hbWUnLCBuZWVkKF8pKSkpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoTlgsIE5ZKSkgOi0KKyAgICBOWCA9IGxhYmVsKCdYLUxhYmVsLU5hbWUnLCBuZWVkKF8pKSwKKyAgICBOWSA9IGxhYmVsKCdZLUxhYmVsLU5hbWUnLCBuZWVkKF8pKS4KID09PT0KIAogSW4gdGhlIFVJIHRoaXMgd2lsbCBzaG93OgpAQCAtMzc3LDggKzQzOCwxMSBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUobGFiZWwoJ1NvbWUtQ29uZGl0aW9uJywgbmVlZChfKSkpLgotICBzdWJtaXRfcnVsZShsYWJlbCgnQW5vdGhlci1Db25kaXRpb24nLCBvayhfKSkpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoTikpIDotCisgICAgTiA9IGxhYmVsKCdTb21lLUNvbmRpdGlvbicsIG5lZWQoXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChPSykpIDotCisgICAgT0sgPSBsYWJlbCgnQW5vdGhlci1Db25kaXRpb24nLCBvayhfKSkuCiA9PT09CiAKIFRoZSAnTmVlZCBTb21lLUNvbmRpdGlvbicgd2lsbCBub3QgYmUgc2hvdyBpbiB0aGUgVUkgYmVjYXVzZSBvZiB0aGUgcmVzdWx0IG9mCkBAIC0zODksOCArNDUzLDExIEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShsYWJlbCgnQW5vdGhlci1Db25kaXRpb24nLCBvayhfKSkpLgotICBzdWJtaXRfcnVsZShsYWJlbCgnU29tZS1Db25kaXRpb24nLCBuZWVkKF8pKSkuCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChPSykpIDotCisgICAgT0sgPSBsYWJlbCgnQW5vdGhlci1Db25kaXRpb24nLCBvayhfKSkuCisKKyAgc3VibWl0X3J1bGUoc3VibWl0KE4pKSA6LQorICAgIE4gPSBsYWJlbCgnU29tZS1Db25kaXRpb24nLCBuZWVkKF8pKS4KID09PT0KIAogVGhlIHJlc3VsdCBvZiB0aGUgZmlyc3QgcnVsZSB3aWxsIHN0b3Agc2VhcmNoIGZvciBhbnkgZnVydGhlciBzb2x1dGlvbnMuCkBAIC00MDcsNyArNDc0LDggQEAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09Ci0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgbmVlZChfKSkpKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpLgogPT09PQogCiBUaGlzIHdpbGwgc2hvdzoKQEAgLTQyMCw5ICs0ODgsMTIgQEAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09Ci0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgbmVlZChfKSkpKS4KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBvayhfKSkpKQotICAgIDotIGdlcnJpdDpjb21taXRfYXV0aG9yKF8sICdKb2huIERvZScsIF8pLgorICBzdWJtaXRfcnVsZShzdWJtaXQoQXV0aG9yKSkgOi0KKyAgICBBdXRob3IgPSBsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgbmVlZChfKSkuCisKKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgZ2Vycml0OmNvbW1pdF9hdXRob3IoXywgJ0pvaG4gRG9lJywgXyksCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG9rKF8pKS4KID09PT0KIAogSW4gdGhlIHNlY29uZCBydWxlIHdlIHJldHVybiBgb2tgIHN0YXR1cyBmb3IgdGhlIGAnQXV0aG9yLWlzLUpvaG4tRG9lJ2AgbGFiZWwKQEAgLTQzOCw5ICs1MDksMTIgQEAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09Ci0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgbmVlZChfKSkpKS4KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBvayhfKSkpKQotICAgIDotIGdlcnJpdDpjb21taXRfYXV0aG9yKF8sIF8sICdqb2huLmRvZUBleGFtcGxlLmNvbScpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoQXV0aG9yKSkgOi0KKyAgICBBdXRob3IgPSBsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgbmVlZChfKSkuCisKKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgZ2Vycml0OmNvbW1pdF9hdXRob3IoXywgXywgJ2pvaG4uZG9lQGV4YW1wbGUuY29tJyksCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG9rKF8pKS4KID09PT0KIAogb3IgYnkgdXNlciBpZCAoYXNzdW1pbmcgaXQgaXMgMTAwMDAwMCk6CkBAIC00NDgsOSArNTIyLDEyIEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpKSkuCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgb2soXykpKSkKLSAgICA6LSBnZXJyaXQ6Y29tbWl0X2F1dGhvcih1c2VyKDEwMDAwMDApLCBfLCBfKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG5lZWQoXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChBdXRob3IpKSA6LQorICAgIGdlcnJpdDpjb21taXRfYXV0aG9yKHVzZXIoMTAwMDAwMCksIF8sIF8pLAorICAgIEF1dGhvciA9IGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBvayhfKSkuCiA9PT09CiAKIG9yIGJ5IGEgY29tYmluYXRpb24gb2YgdGhlc2UgMyBhdHRyaWJ1dGVzOgpAQCAtNDU4LDEzICs1MzUsMTYgQEAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09Ci0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgbmVlZChfKSkpKS4KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdBdXRob3ItaXMtSm9obi1Eb2UnLCBvayhfKSkpKQotICAgIDotIGdlcnJpdDpjb21taXRfYXV0aG9yKF8sICdKb2huIERvZScsICdqb2huLmRvZUBleGFtcGxlLmNvbScpLgorICBzdWJtaXRfcnVsZShzdWJtaXQoQXV0aG9yKSkgOi0KKyAgICBBdXRob3IgPSBsYWJlbCgnQXV0aG9yLWlzLUpvaG4tRG9lJywgbmVlZChfKSkuCisKKyAgc3VibWl0X3J1bGUoc3VibWl0KEF1dGhvcikpIDotCisgICAgZ2Vycml0OmNvbW1pdF9hdXRob3IoXywgJ0pvaG4gRG9lJywgJ2pvaG4uZG9lQGV4YW1wbGUuY29tJyksCisgICAgQXV0aG9yID0gbGFiZWwoJ0F1dGhvci1pcy1Kb2huLURvZScsIG9rKF8pKS4KID09PT0KIAotRXhhbXBsZSA3OiBNYWtlIGNoYW5nZSBzdWJtaXR0YWJsZSBpZiBjb21taXQgbWVzc2FnZSBzdGFydHMgd2l0aCAiVHJpdmlhbCBmaXgiCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0V4YW1wbGUgNzogTWFrZSBjaGFuZ2Ugc3VibWl0dGFibGUgaWYgY29tbWl0IG1lc3NhZ2Ugc3RhcnRzIHdpdGggIkZpeCAiCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogQmVzaWRlcyBzaG93aW5nIGhvdyB0byBtYWtlIHVzZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2UgdGV4dCB0aGUgcHVycG9zZSBvZiB0aGlzCiBleGFtcGxlIGlzIGFsc28gdG8gc2hvdyBob3cgdG8gbWF0Y2ggb25seSBhIHBhcnQgb2YgYSBzdHJpbmcgc3ltYm9sLiBTaW1pbGFybHkKIGxpa2UgY29tbWl0IGF1dGhvciB0aGUgY29tbWl0IG1lc3NhZ2UgaXMgcHJvdmlkZWQgYXMgYSBzdHJpbmcgc3ltYm9sIHdoaWNoIGlzCkBAIC00ODIsOSArNTYyLDEyIEBACiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQotICBzdWJtaXRfcnVsZShzdWJtaXQobGFiZWwoJ0NvbW1pdC1NZXNzYWdlLXN0YXJ0cy13aXRoLVRyaXZpYWwtRml4JywgbmVlZChfKSkpKS4KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdDb21taXQtTWVzc2FnZS1zdGFydHMtd2l0aC1Ucml2aWFsLUZpeCcsIG9rKF8pKSkpCi0gICAgOi0gZ2Vycml0OmNvbW1pdF9tZXNzYWdlKE0pLCBuYW1lKE0sIEwpLCBzdGFydHNfd2l0aChMLCAiVHJpdmlhbCBGaXgiKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KEZpeCkpIDotCisgICAgRml4ID0gbGFiZWwoJ0NvbW1pdC1NZXNzYWdlLXN0YXJ0cy13aXRoLUZpeCcsIG5lZWQoXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChGaXgpKSA6LQorICAgIGdlcnJpdDpjb21taXRfbWVzc2FnZShNKSwgbmFtZShNLCBMKSwgc3RhcnRzX3dpdGgoTCwgIkZpeCAiKSwKKyAgICBGaXggPSBsYWJlbCgnQ29tbWl0LU1lc3NhZ2Utc3RhcnRzLXdpdGgtRml4Jywgb2soXykpLgogCiAgIHN0YXJ0c193aXRoKEwsIFtdKS4KICAgc3RhcnRzX3dpdGgoW0h8VDFdLCBbSHxUMl0pIDotIHN0YXJ0c193aXRoKFQxLCBUMikuCkBAIC01MDMsMzAgKzU4Niw3NCBAQAogLnJ1bGVzLnBsCiBbY2FwdGlvbj0iIl0KID09PT0KLSAgc3VibWl0X3J1bGUoc3VibWl0KGxhYmVsKCdDb21taXQtTWVzc2FnZS1zdGFydHMtd2l0aC1Ucml2aWFsLUZpeCcsIG5lZWQoXykpKSkuCi0gIHN1Ym1pdF9ydWxlKHN1Ym1pdChsYWJlbCgnQ29tbWl0LU1lc3NhZ2Utc3RhcnRzLXdpdGgtVHJpdmlhbC1GaXgnLCBvayhfKSkpKQotICAgIDotIGdlcnJpdDpjb21taXRfbWVzc2FnZV9tYXRjaGVzKCdeVHJpdmlhbCBGaXgnKS4KKyAgc3VibWl0X3J1bGUoc3VibWl0KEZpeCkpIDotCisgICAgRml4ID0gbGFiZWwoJ0NvbW1pdC1NZXNzYWdlLXN0YXJ0cy13aXRoLUZpeCcsIG5lZWQoXykpLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChGaXgpKSA6LQorICAgIGdlcnJpdDpjb21taXRfbWVzc2FnZV9tYXRjaGVzKCdeRml4ICcpLAorICAgIEZpeCA9IGxhYmVsKCdDb21taXQtTWVzc2FnZS1zdGFydHMtd2l0aC1GaXgnLCBvayhfKSkuCiA9PT09CiAKLVJldXNpbmcgdGhlIGRlZmF1bHQgc3VibWl0IHBvbGljeQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgcHJldmlvdXMgZXhhbXBsZSBjb3VsZCBhbHNvIGJlIHdyaXR0ZW4gc28gdGhhdCBpdCBmaXJzdCBjaGVja3MgaWYgdGhlIGNvbW1pdAorbWVzc2FnZSBzdGFydHMgd2l0aCAnRml4ICcuIElmIHRydWUgdGhlbiBpdCBzZXRzIE9LIGZvciB0aGF0IGNhdGVnb3J5IGFuZCBzdG9wcworZnVydGhlciBiYWNrdHJhY2tpbmcgYnkgdXNpbmcgdGhlIGN1dCBgIWAgb3BlcmF0b3I6CisucnVsZXMucGwKK1tjYXB0aW9uPSIiXQorPT09PQorICBzdWJtaXRfcnVsZShzdWJtaXQoRml4KSkgOi0KKyAgICBnZXJyaXQ6Y29tbWl0X21lc3NhZ2VfbWF0Y2hlcygnXkZpeCAnKSwKKyAgICBGaXggPSBsYWJlbCgnQ29tbWl0LU1lc3NhZ2Utc3RhcnRzLXdpdGgtRml4Jywgb2soXykpLAorICAgICEuCisKKyAgJSBNZXNzYWdlIGRvZXMgbm90IHN0YXJ0IHdpdGggJ0ZpeCAnIHNvIEZpeCBpcyBuZWVkZWQgdG8gc3VibWl0CisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChGaXgpKSA6LQorICAgIEZpeCA9IGxhYmVsKCdDb21taXQtTWVzc2FnZS1zdGFydHMtd2l0aC1GaXgnLCBuZWVkKF8pKS4KKz09PT0KKworVGhlIGRlZmF1bHQgc3VibWl0IHBvbGljeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogQWxsIGV4YW1wbGVzIHVudGlsIG5vdyBjb25jZW50cmF0ZSBvbiBvbmUgcGFydGljdWxhciBhc3BlY3Qgb2YgY2hhbmdlIGRhdGEuCiBIb3dldmVyLCBpbiByZWFsLWxpZmUgc2NlbmFyaW9zIHdlIHdvdWxkIHJhdGhlciB3YW50IHRvIHJldXNlIEdlcnJpdCdzIGRlZmF1bHQKLXN1Ym1pdCBwb2xpY3kgYW5kIGV4dGVuZC9jaGFuZ2UgaXQgZm9yIG91ciBzcGVjaWZpYyBwdXJwb3NlLiBJbiBvdGhlciB3b3Jkcywgd2UKLXdvdWxkIGxpa2UgdG8ga2VlcCBhbGwgdGhlIGRlZmF1bHQgcG9saWNpZXMgKGxpa2UgdGhlIGBWZXJpZmllZGAgY2F0ZWdvcnksCi12ZXRvaW5nIGNoYW5nZSwgZXRjLi4uKSBhbmQgb25seSBleHRlbmQvY2hhbmdlIGFuIGFzcGVjdCBvZiBpdC4gRm9yIGV4YW1wbGUsIHdlCi1tYXkgd2FudCB0byBkaXNhYmxlIHRoZSBhYmlsaXR5IGZvciBjaGFuZ2UgYXV0aG9ycyB0byBhcHByb3ZlIHRoZWlyIG93biBjaGFuZ2VzCi1idXQga2VlcCBhbGwgb3RoZXIgcG9saWNpZXMgdGhlIHNhbWUuCitzdWJtaXQgcG9saWN5IGFuZCBleHRlbmQvY2hhbmdlIGl0IGZvciBvdXIgc3BlY2lmaWMgcHVycG9zZS4gIFRoaXMgY291bGQgYmUKK2RvbmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgd2F5czoKIAorKiB1bmRlcnN0YW5kIGhvdyB0aGUgZGVmYXVsdCBzdWJtaXQgcG9saWN5IGlzIGltcGxlbWVudGVkIGFuZCB1c2UgdGhhdCBhcyBhCisgIHRlbXBsYXRlIGZvciBpbXBsZW1lbnRpbmcgY3VzdG9tIHN1Ym1pdCBydWxlcywKKyogaW52b2tlIHRoZSBkZWZhdWx0IHN1Ym1pdCBydWxlIGltcGxlbWVudGF0aW9uIGFuZCB0aGVuIHBlcmZvcm0gZnVydGhlcgorICBhY3Rpb25zIG9uIGl0cyByZXR1cm4gcmVzdWx0LgorCitEZWZhdWx0IHN1Ym1pdCBydWxlIGltcGxlbWVudGF0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitUaGUgZGVmYXVsdCBzdWJtaXQgcnVsZSB3aXRoIHRoZSB0d28gZGVmYXVsdCBjYXRlZ29yaWVzLCBgQ29kZS1SZXZpZXdgIGFuZAorYFZlcmlmaWVkYCwgY2FuIGJlIGltcGxlbWVudGVkIGFzOgorCisucnVsZXMucGwKK1tjYXB0aW9uPSIiXQorPT09PQorICBzdWJtaXRfcnVsZShzdWJtaXQoViwgQ1IpKSA6LQorICAgIGdlcnJpdDptYXhfd2l0aF9ibG9jaygtMiwgMiwgJ0NvZGUtUmV2aWV3JywgQ1IpLAorICAgIGdlcnJpdDptYXhfd2l0aF9ibG9jaygtMSwgMSwgJ1ZlcmlmaWVkJywgVikuCis9PT09CisKK09uY2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB1bmRlcnN0b29kIGl0IGNhbiBiZSBjdXN0b21pemVkIHRvIGltcGxlbWVudAorcHJvamVjdCBzcGVjaWZpYyBzdWJtaXQgcnVsZXMuIE5vdGUsIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBoYXJkY29kZXMKK3RoZSB0d28gZGVmYXVsdCBjYXRlZ29yaWVzLiBJbnRyb2R1Y2luZyBhIG5ldyBjYXRlZ29yeSBpbiB0aGUgZGF0YWJhc2Ugd291bGQKK3JlcXVpcmUgaW50cm9kdWNpbmcgdGhlIHNhbWUgY2F0ZWdvcnkgaGVyZSBvciBhIGBzdWJtaXRfZmlsdGVyYCBpbiBhIHBhcmVudAorcHJvamVjdCB3b3VsZCBoYXZlIHRvIGNhcmUgYWJvdXQgaW5jbHVkaW5nIHRoZSBuZXcgY2F0ZWdvcnkgaW4gdGhlIHJlc3VsdCBvZgordGhpcyBgc3VibWl0X3J1bGVgLiAgT24gdGhlIG90aGVyIHNpZGUsIHRoaXMgZXhhbXBsZSBpcyBlYXN5IHRvIHJlYWQgYW5kCit1bmRlcnN0YW5kLgorCitSZXVzaW5nIHRoZSBkZWZhdWx0IHN1Ym1pdCBwb2xpY3kKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogVG8gZ2V0IHJlc3VsdHMgb2YgR2Vycml0cyBkZWZhdWx0IHN1Ym1pdCBwb2xpY3kgd2UgdXNlIHRoZQotYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGAgcHJlZGljYXRlLiBUaGlzIG1lYW5zIHRoYXQgaWYgd2Ugd3JpdGUgYSBzdWJtaXQgcnVsZSBsaWtlOgorYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGAgcHJlZGljYXRlLiAgVGhlIGBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXQoWClgIGluY2x1ZGVzIGFsbAorY2F0ZWdvcmllcyBmcm9tIHRoZSBkYXRhYmFzZS4gIFRoaXMgbWVhbnMgdGhhdCBpZiB3ZSB3cml0ZSBhIHN1Ym1pdCBydWxlIGxpa2U6CiAKIC5ydWxlcy5wbAogW2NhcHRpb249IiJdCiA9PT09CiAgIHN1Ym1pdF9ydWxlKFgpIDotIGdlcnJpdDpkZWZhdWx0X3N1Ym1pdChYKS4KID09PT0KLQogdGhlbiB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gbm90IHVzaW5nIGBydWxlcy5wbGAgYXQgYWxsLiBXZSBqdXN0IGRlbGVnYXRlIHRvCiBkZWZhdWx0IGxvZ2ljLiBIb3dldmVyLCBvbmNlIHdlIGludm9rZSB0aGUgYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdChYKWAgd2UgY2FuCiBwZXJmb3JtIGZ1cnRoZXIgYWN0aW9ucyBvbiB0aGUgcmV0dXJuIHJlc3VsdCBgWGAgYW5kIGFwcGx5IG91ciBzcGVjaWZpYwpAQCAtNTQwLDcgKzY2Nyw3IEBACiAgIHByb2plY3Rfc3BlY2lmaWNfcG9saWN5KFIsIFMpIDotIC4uLgogPT09PQogCi1UaGUgZm9sbG93aW5nIGV4YW1wbGVzIGJ1aWxkIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBzdWJtaXQgcG9saWN5LgorSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcyBib3RoIHN0eWxlcyB3aWxsIGJlIHNob3duLgogCiBFeGFtcGxlIDg6IE1ha2UgY2hhbmdlIHN1Ym1pdHRhYmxlIG9ubHkgaWYgYENvZGUtUmV2aWV3KzJgIGlzIGdpdmVuIGJ5IGEgbm9uIGF1dGhvcgogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KQEAgLTU0OCw2ICs2NzUsOCBAQAogc2F0aXNmaWVkIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBgQ29kZS1SZXZpZXcrMmAgZnJvbSBhIG5vbiBhdXRob3IuIEFsbCBvdGhlcgogZGVmYXVsdCBwb2xpY2llcyBsaWtlIHRoZSBgVmVyaWZpZWRgIGNhdGVnb3J5IGFuZCB2ZXRvaW5nIGNoYW5nZXMgc3RpbGwgYXBwbHkuCiAKK1JldXNpbmcgdGhlIGBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogRmlyc3QsIHdlIGludm9rZSBgZ2Vycml0OmRlZmF1bHRfc3VibWl0YCB0byBjb21wdXRlIHRoZSByZXN1bHQgZm9yIHRoZSBkZWZhdWx0CiBzdWJtaXQgcG9saWN5IGFuZCB0aGVuIGFkZCB0aGUgYE5vbi1BdXRob3ItQ29kZS1SZXZpZXdgIGxhYmVsIHRvIGl0LiAgVGhlCiBgTm9uLUF1dGhvci1Db2RlLVJldmlld2AgbGFiZWwgaXMgYWRkZWQgd2l0aCBzdGF0dXMgYG9rYCBpZiBzdWNoIGFuIGFwcHJvdmFsCkBAIC01NjMsNyArNjkyLDggQEAKICAgICBTID0uLiBbc3VibWl0IHwgUl0uCiAKICAgYWRkX25vbl9hdXRob3JfYXBwcm92YWwoUzEsIFMyKSA6LQotICAgIGdlcnJpdDpjb21taXRfYXV0aG9yKEEpLCBnZXJyaXQ6Y29tbWl0X2xhYmVsKGxhYmVsKCdDb2RlLVJldmlldycsIDIpLCBSKSwKKyAgICBnZXJyaXQ6Y29tbWl0X2F1dGhvcihBKSwKKyAgICBnZXJyaXQ6Y29tbWl0X2xhYmVsKGxhYmVsKCdDb2RlLVJldmlldycsIDIpLCBSKSwKICAgICBSIFw9IEEsICEsCiAgICAgUzIgPSBbbGFiZWwoJ05vbi1BdXRob3ItQ29kZS1SZXZpZXcnLCBvayhSKSkgfCBTMV0uCiAgIGFkZF9ub25fYXV0aG9yX2FwcHJvdmFsKFMxLCBbbGFiZWwoJ05vbi1BdXRob3ItQ29kZS1SZXZpZXcnLCBuZWVkKF8pKSB8IFMxXSkuCkBAIC01ODYsNiArNzE2LDQ0IEBACiBpZiB0aGUgYGN1dGAgaW4gdGhlIGZpcnN0IHJ1bGUgaXMgbm90IHJlYWNoZWQgYW5kIGl0IG9ubHkgaGFwcGVucyBpZiBhCiBwcmVkaWNhdGUgYmVmb3JlIHRoZSBgY3V0YCBmYWlscy4KIAorRG9uJ3QgdXNlIGBnZXJyaXQ6ZGVmYXVsdF9zdWJtaXRgCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KK0xldCdzIGltcGxlbWVudCB0aGUgc2FtZSBzdWJtaXQgcnVsZSB0aGUgb3RoZXIgd2F5LCB3aXRob3V0IHJldXNpbmcgdGhlCitgZ2Vycml0OmRlZmF1bHRfc3VibWl0YDoKKworLnJ1bGVzLnBsCitbY2FwdGlvbj0iIl0KKz09PT0KKyAgc3VibWl0X3J1bGUoc3VibWl0KENSLCBWKSkgOi0KKyAgICBiYXNlKENSLCBWKSwKKyAgICBDUiA9IGxhYmVsKF8sIG9rKFJldmlld2VyKSksCisgICAgZ2Vycml0OmNvbW1pdF9hdXRob3IoQXV0aG9yKSwKKyAgICBBdXRob3IgXD0gUmV2aWV3ZXIsCisgICAgIS4KKworICBzdWJtaXRfcnVsZShzdWJtaXQoQ1IsIFYsIE4pKSA6LQorICAgIGJhc2UoQ1IsIFYpLAorICAgIE4gPSBsYWJlbCgnTm9uLUF1dGhvci1Db2RlLVJldmlldycsIG5lZWQoXykpLgorCisgIGJhc2UoQ1IsIFYpIDotCisgICAgZ2Vycml0Om1heF93aXRoX2Jsb2NrKC0yLCAyLCAnQ29kZS1SZXZpZXcnLCBDUiksCisgICAgZ2Vycml0Om1heF93aXRoX2Jsb2NrKC0xLCAxLCAnVmVyaWZpZWQnLCBWKS4KKz09PT0KKworVGhlIGxhdHRlciBpbXBsZW1lbnRhdGlvbiBpcyBwcm9iYWJseSBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQgdGhlIGNvZGUgbG9va3MKK2NsZWFuZXIuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIGxhdHRlciBpbXBsZW1lbnRhdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gdGhlCit0d28gc3RhbmRhcmQgY2F0ZWdvcmllcyBvbmx5IChgQ29kZS1SZXZpZXdgIGFuZCBgVmVyaWZpZWRgKSBldmVuIGlmIGEgbmV3CitjYXRlZ29yeSBoYXMgYmVlZW4gaW5zZXJ0ZWQgaW50byB0aGUgZGF0YWJhc2UuIFRvIGluY2x1ZGUgdGhlIG5ldyBjYXRlZ29yeQordGhlIGBydWxlcy5wbGAgd291bGQgbmVlZCB0byBiZSBtb2RpZmllZCBvciBhIGBzdWJtaXRfZmlsdGVyYCBpbiBhIHBhcmVudAorcHJvamVjdCB3b3VsZCBoYXZlIHRvIGNhcmUgYWJvdXQgaW5jbHVkaW5nIHRoZSBuZXcgY2F0ZWdvcnkgaW4gdGhlIHJlc3VsdAorb2YgdGhpcyBgc3VibWl0X3J1bGVgLgorCitUaGUgZm9ybWVyIGV4YW1wbGUsIGhvd2V2ZXIsIHdvdWxkIGluY2x1ZGUgYW55IG5ld2x5IGFkZGVkIGNhdGVnb3J5IGFzIGl0CitpbnZva2VzIHRoZSBgZ2Vycml0OmRlZmF1bHRfc3VibWl0YCBhbmQgdGhlbiBtb2RpZmllcyBpdHMgcmVzdWx0LgorCitXaGljaCBvZiB0aGVzZSB0d28gYmVoYXZpb3JzIGlzIGRlc2lyZWQgd2lsbCBhbHdheXMgZGVwZW5kIG9uIGhvdyBhIHBhcnRpY3VsYXIKK0dlcnJpdCBzZXJ2ZXIgaXMgbWFuYWdlZC4KKwogRXhhbXBsZSA5OiBSZW1vdmUgdGhlIGBWZXJpZmllZGAgY2F0ZWdvcnkKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogQSBwcm9qZWN0IGhhcyBubyBidWlsZCBhbmQgdGVzdC4gSXQgY29uc2lzdHMgb2Ygb25seSB0ZXh0IGZpbGVzIGFuZCBuZWVkcyBvbmx5CkBAIC01OTQsNiArNzYyLDE3IEBACiBXZSBhbHNvIHdhbnQgdGhlIFVJIHRvIG5vdCBzaG93IHRoZSBgVmVyaWZpZWRgIGNhdGVnb3J5IGluIHRoZSB0YWJsZSB3aXRoCiB2b3RlcyBhbmQgb24gdGhlIHZvdGluZyBzY3JlZW4uCiAKK1RoaXMgaXMgcXVpdGUgc2ltcGxlIHdpdGhvdXQgcmV1c2luZyB0aGUgJ2dlcnJpdDpkZWZhdWx0X3N1Ym1pdGA6CisKKy5ydWxlcy5wbAorW2NhcHRpb249IiJdCis9PT09CisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChDUikpIDotCisgICAgZ2Vycml0Om1heF93aXRoX2Jsb2NrKC0yLCAyLCAnQ29kZS1SZXZpZXcnLCBDUikuCis9PT09CisKK0ltcGxlbWVudGluZyB0aGUgc2FtZSBydWxlIGJ5IHJldXNpbmcgYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGAgaXMgYSBiaXQgbW9yZSBjb21wbGV4OgorCiAucnVsZXMucGwKIFtjYXB0aW9uPSIiXQogPT09PQpAQCAtNjI3LDYgKzgwNiwyNyBAQAogVGhlIGByZW1vdmVfdmVyaWZpZWRfY2F0ZWdvcnlgIGFuZCBgYWRkX25vbl9hdXRob3JfYXBwcm92YWxgIHByZWRpY2F0ZXMgYXJlIHRoZQogc2FtZSBhcyBkZWZpbmVkIGluIHRoZSBwcmV2aW91cyB0d28gZXhhbXBsZXMuCiAKK1dpdGhvdXQgcmV1c2luZyB0aGUgYGdlcnJpdDpkZWZhdWx0X3N1Ym1pdGAgdGhlIHNhbWUgZXhhbXBsZSBtYXkgYmUgaW1wbGVtZW50ZWQKK2FzOgorCisucnVsZXMucGwKK1tjYXB0aW9uPSIiXQorPT09PQorICBzdWJtaXRfcnVsZShzdWJtaXQoQ1IpKSA6LQorICAgIGJhc2UoQ1IpLAorICAgIENSID0gbGFiZWwoXywgb2soUmV2aWV3ZXIpKSwKKyAgICBnZXJyaXQ6Y29tbWl0X2F1dGhvcihBdXRob3IpLAorICAgIEF1dGhvciBcPSBSZXZpZXdlciwKKyAgICAhLgorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChDUiwgTikpIDotCisgICAgYmFzZShDUiksCisgICAgTiA9IGxhYmVsKCdOb24tQXV0aG9yLUNvZGUtUmV2aWV3JywgbmVlZChfKSkuCisKKyAgYmFzZShDUikgOi0KKyAgICBnZXJyaXQ6bWF4X3dpdGhfYmxvY2soLTIsIDIsICdDb2RlLVJldmlldycsIENSKSwKKz09PT0KKwogRXhhbXBsZSAxMTogUmVtb3ZlIHRoZSBgVmVyaWZpZWRgIGNhdGVnb3J5IGZyb20gYWxsIHByb2plY3RzCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEV4YW1wbGUgOSwgaW1wbGVtZW50cyBgc3VibWl0X3J1bGVgIHRoYXQgcmVtb3ZlcyB0aGUgYFZlcmlmaWVkYCBjYXRlZ29yeSBmcm9tCkBAIC02NDgsNyArODQ4LDMyIEBACiAgIHJlbW92ZV92ZXJpZmllZF9jYXRlZ29yeShbSHxUXSwgW0h8Ul0pIDotIHJlbW92ZV92ZXJpZmllZF9jYXRlZ29yeShULCBSKS4KID09PT0KIAotRXhhbXBsZSAxMjogMSsxPTIgQ29kZS1SZXZpZXcKK0V4YW1wbGUgMTI6IE9uIHJlbGVhc2UgYnJhbmNoZXMgcmVxdWlyZSBEck5vIGluIGFkZGl0aW9uIHRvIHByb2plY3QgcnVsZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0EgbmV3IGNhdGVnb3J5ICdEck5vJyBpcyBhZGRlZCB0byB0aGUgZGF0YWJhc2UgYW5kIGlzIHJlcXVpcmVkIGZvciByZWxlYXNlCiticmFuY2hlcy4gVG8gbWFyayBhIGJyYW5jaCBhcyBhIHJlbGVhc2UgYnJhbmNoIHdlIHVzZSBgZHJubygncmVmcy9oZWFkcy9icmFuY2gnKWAuCisKKy5ydWxlcy5wbAorW2NhcHRpb249IiJdCis9PT09CisgIGRybm8oJ3JlZnMvaGVhZHMvbWFzdGVyJykuCisgIGRybm8oJ3JlZnMvaGVhZHMvc3RhYmxlLTIuMycpLgorICBkcm5vKCdyZWZzL2hlYWRzL3N0YWJsZS0yLjQnKS4KKyAgZHJubygncmVmcy9oZWFkcy9zdGFibGUtMi41JykuCisgIGRybm8oJ3JlZnMvaGVhZHMvc3RhYmxlLTIuNScpLgorCisgIHN1Ym1pdF9maWx0ZXIoSW4sIE91dCkgOi0KKyAgICBnZXJyaXQ6Y2hhbmdlX2JyYW5jaChCcmFuY2gpLAorICAgIGRybm8oQnJhbmNoKSwKKyAgICAhLAorICAgIEluID0uLiBbc3VibWl0IHwgSV0sCisgICAgZ2Vycml0Om1heF93aXRoX2Jsb2NrKC0xLCAxLCAnRHJObycsIERyTm8pLAorICAgIE91dCA9Li4gW3N1Ym1pdCwgRHJObyB8IEldLgorCisgIHN1Ym1pdF9maWx0ZXIoSW4sIE91dCkgOi0gSW4gPSBPdXQuCis9PT09CisKK0V4YW1wbGUgMTM6IDErMT0yIENvZGUtUmV2aWV3CiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogSW4gdGhpcyBleGFtcGxlIHdlIGludHJvZHVjZSBhY2N1bXVsYXRpdmUgdm90aW5nIHRvIGRldGVybWluZSBpZiBhIGNoYW5nZSBpcwogc3VibWl0dGFibGUgb3Igbm90LiBXZSBtb2RpZnkgdGhlIHN0YW5kYXJkIENvZGUtUmV2aWV3IHRvIGJlIGFjY3VtdWxhdGl2ZSwgYW5kIG1ha2UgdGhlCkBAIC02ODQsNyArOTA5LDM0IEBACiAgICAgUyA9Li4gW3N1Ym1pdCB8IExhYmVsc10uCiA9PT09CiAKLUV4YW1wbGUgMTM6IE1hc3RlciBhbmQgYXBwcmVudGljZQorSW1wbGVtZW50aW5nIHRoZSBzYW1lIGV4YW1wbGUgd2l0aG91dCB1c2luZyBgZ2Vycml0OmRlZmF1bHRfc3VibWl0YDoKKworLnJ1bGVzLnBsCitbY2FwdGlvbj0iIl0KKz09PT0KKyAgc3VibWl0X3J1bGUoc3VibWl0KENSLCBWKSkgOi0KKyAgICBzdW0oMiwgJ0NvZGUtUmV2aWV3JywgQ1IpLAorICAgIGdlcnJpdDptYXhfd2l0aF9ibG9jaygtMSwgMSwgJ1ZlcmlmaWVkJywgVikuCisKKyAgJSBTdW0gdGhlIHZvdGVzIGluIGEgY2F0ZWdvcnkuIFVzZXMgYSBoZWxwZXIgZnVuY3Rpb24gc2NvcmUvMgorICAlIHRvIHNlbGVjdCBvdXQgb25seSB0aGUgc2NvcmUgdmFsdWVzIHRoZSBnaXZlbiBjYXRlZ29yeS4KKyAgc3VtKFZvdGVzTmVlZGVkLCBDYXRlZ29yeSwgbGFiZWwoQ2F0ZWdvcnksIG9rKF8pKSkgOi0KKyAgICBmaW5kYWxsKFNjb3JlLCBzY29yZShDYXRlZ29yeSwgU2NvcmUpLCBBbGwpLAorICAgIHN1bV9saXN0KEFsbCwgU3VtKSwKKyAgICBTdW0gPj0gVm90ZXNOZWVkZWQsCisgICAgIS4KKyAgc3VtKFZvdGVzTmVlZGVkLCBDYXRlZ29yeSwgbGFiZWwoQ2F0ZWdvcnksIG5lZWQoVm90ZXNOZWVkZWQpKSkuCisKKyAgc2NvcmUoQ2F0ZWdvcnksIFNjb3JlKSA6LQorICAgIGdlcnJpdDpjb21taXRfbGFiZWwobGFiZWwoQ2F0ZWdvcnksIFNjb3JlKSwgVXNlcikuCisKKyAgJSBTaW1wbGUgUHJvbG9nIHJvdXRpbmUgdG8gc3VtIGEgbGlzdCBvZiBpbnRlZ2Vycy4KKyAgc3VtX2xpc3QoTGlzdCwgU3VtKSAgIDotIHN1bV9saXN0KExpc3QsIDAsIFN1bSkuCisgIHN1bV9saXN0KFtYfFRdLCBZLCBTKSA6LSBaIGlzIFggKyBZLCBzdW1fbGlzdChULCBaLCBTKS4KKyAgc3VtX2xpc3QoW10sIFMsIFMpLgorPT09PQorCitFeGFtcGxlIDE0OiBNYXN0ZXIgYW5kIGFwcHJlbnRpY2UKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogVGhlIG1hc3RlciBhbmQgYXBwcmVudGljZSBleGFtcGxlIGFsbG93IHlvdSB0byBzcGVjaWZ5IGEgdXNlciAodGhlIGBtYXN0ZXJgKQogdGhhdCBtdXN0IGFwcHJvdmUgYWxsIGNoYW5nZXMgZG9uZSBieSBhbm90aGVyIHVzZXIgKHRoZSBgYXBwcmVudGljZWApLgpAQCAtNzIxLDcgKzk3Myw3IEBACiAgIGFkZF9hcHByZW50aWNlX21hc3RlcihTLCBTKS4KID09PT0KIAotRXhhbXBsZSAxNDogT25seSBhbGxvdyBBdXRob3IgdG8gc3VibWl0IGNoYW5nZQorRXhhbXBsZSAxNTogT25seSBhbGxvdyBBdXRob3IgdG8gc3VibWl0IGNoYW5nZQogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogVGhpcyBleGFtcGxlIGFkZHMgYSBuZXcgbmVlZGVkIGNhdGVnb3J5IGBQYXRjaHNldC1BdXRob3JgIGZvciBhbnkgdXNlciB0aGF0IGlzCiBub3QgdGhlIGF1dGhvciBvZiB0aGUgcGF0Y2guIFRoaXMgZWZmZWN0aXZlbHkgYmxvY2tzIGFsbCB1c2VycyBleGNlcHQgdGhlIGF1dGhvcgpAQCAtNzQ1LDYgKzk5Nyw2OCBAQAogICBvbmx5X2FsbG93X2F1dGhvcl90b19zdWJtaXQoUzEsIFtsYWJlbCgnUGF0Y2hzZXQtQXV0aG9yJywgbmVlZChfKSkgfCBTMV0pLgogPT09PQogCitFeGFtcGxlcyAtIFN1Ym1pdCBUeXBlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgaG93IHRvIGltcGxlbWVudCBvd24gc3VibWl0IHR5cGUgcnVsZXMuCisKK0V4YW1wbGUgMTogU2V0IGEgYENoZXJyeSBQaWNrYCBzdWJtaXQgdHlwZSBmb3IgYWxsIGNoYW5nZXMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1RoaXMgZXhhbXBsZSBzZXRzIHRoZSBgQ2hlcnJ5IFBpY2tgIHN1Ym1pdCB0eXBlIGZvciBhbGwgY2hhbmdlcy4gSXQgb3ZlcnJpZGVzCit3aGF0ZXZlciBpcyBzZXQgYXMgcHJvamVjdCBkZWZhdWx0IHN1Ym1pdCB0eXBlLgorCitydWxlcy5wbAorW2NhcHRpb249IiJdCis9PT09CisgIHN1Ym1pdF90eXBlKGNoZXJyeV9waWNrKS4KKz09PT0KKworCitFeGFtcGxlIDI6IGBGYXN0IEZvcndhcmQgT25seWAgZm9yIGFsbCBgcmVmcy9oZWFkcy9zdGFibGUqYCBicmFuY2hlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0ZvciBhbGwgYHJlZnMvaGVhZHMvc3RhYmxlLipgIGJyYW5jaGVzIHdlIHdvdWxkIGxpa2UgdG8gZW5mb3JjZSB0aGUgYEZhc3QKK0ZvcndhcmQgT25seWAgc3VibWl0IHR5cGUuIEEgcmVhc29uIGZvciB0aGlzIGRlY2lzaW9uIG1heSBiZSBhIG5lZWQgdG8gbmV2ZXIKK2JyZWFrIHRoZSBidWlsZCBpbiB0aGUgc3RhYmxlIGJyYW5jaGVzLiAgRm9yIGFsbCBvdGhlciBicmFuY2hlcywgdGhvc2Ugbm90CittYXRjaGluZyB0aGUgYHJlZnMvaGVhZHMvc3RhYmxlLipgIHBhdHRlcm4sIHdlIHdvdWxkIGxpa2UgdG8gdXNlIHRoZSBwcm9qZWN0J3MKK2RlZmF1bHQgc3VibWl0IHR5cGUgYXMgZGVmaW5lZCBvbiB0aGUgcHJvamVjdCBzZXR0aW5ncyBwYWdlLgorCisucnVsZXMucGwKK1tjYXB0aW9uPSIiXQorPT09PQorICBzdWJtaXRfdHlwZShmYXN0X2ZvcndhcmRfb25seSkgOi0KKyAgICBnZXJyaXQ6Y2hhbmdlX2JyYW5jaChCKSwgcmVnZXhfbWF0Y2hlcygncmVmcy9oZWFkcy9zdGFibGUuKicsIEIpLAorICAgICEuCisgIHN1Ym1pdF90eXBlKFQpIDotIGdlcnJpdDpwcm9qZWN0X2RlZmF1bHRfc3VibWl0X3R5cGUoVCkKKz09PT0KKworVGhlIGZpcnN0IGBzdWJtaXRfdHlwZWAgcHJlZGljYXRlIGRlZmluZXMgdGhlIGBGYXN0IEZvcndhcmQgT25seWAgc3VibWl0IHR5cGUKK2ZvciBgcmVmcy9oZWFkcy9zdGFibGUuKmAgYnJhbmNoZXMuIFRoZSBzZWNvbmQgYHN1Ym1pdF90eXBlYCBwcmVkaWNhdGUgcmV0dXJucwordGhlIHByb2plY3QncyBkZWZhdWx0IHN1Ym1pdCB0eXBlLgorCitFeGFtcGxlIDM6IERvbid0IHJlcXVpcmUgYEZhc3QgRm9yd2FyZCBPbmx5YCBpZiBvbmx5IGRvY3VtZW50YXRpb24gd2FzIGNoYW5nZWQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorTGlrZSBpbiB0aGUgcHJldmlvdXMgZXhhbXBsZSB3ZSB3YW50IHRoZSBgRmFzdCBGb3J3YXJkIE9ubHlgIHN1Ym1pdCB0eXBlIGZvcgordGhlIGByZWZzL2hlYWRzL3N0YWJsZSpgIGJyYW5jaGVzLiAgSG93ZXZlciwgaWYgb25seSBkb2N1bWVudGF0aW9uIHdhcyBjaGFuZ2VkCisob25seSBgKi50eHRgIGZpbGVzKSwgdGhlbiB3ZSBhbGxvdyBwcm9qZWN0J3MgZGVmYXVsdCBzdWJtaXQgdHlwZSBmb3Igc3VjaAorY2hhbmdlcy4KKworLnJ1bGVzLnBsCitbY2FwdGlvbj0iIl0KKz09PT0KKyAgc3VibWl0X3R5cGUoZmFzdF9mb3J3YXJkX29ubHkpIDotCisgICAgZ2Vycml0OmNvbW1pdF9kZWx0YSgnKD88IVwudHh0KSQnKSwKKyAgICBnZXJyaXQ6Y2hhbmdlX2JyYW5jaChCKSwgcmVnZXhfbWF0Y2hlcygncmVmcy9oZWFkcy9zdGFibGUuKicsIEIpLAorICAgICEuCisgIHN1Ym1pdF90eXBlKFQpIDotIGdlcnJpdDpwcm9qZWN0X2RlZmF1bHRfc3VibWl0X3R5cGUoVCkKKz09PT0KKworVGhlIGBnZXJyaXQ6Y29tbWl0X2RlbHRhKCcoPzwhXC50eHQpJCcpYCBzdWNjZWVkcyBpZiB0aGUgY2hhbmdlIGNvbnRhaW5zIGEgZmlsZQord2hvc2UgbmFtZSBkb2Vzbid0IGVuZCB3aXRoIGAudHh0YCBUaGUgcmVzdCBvZiB0aGlzIHJ1bGUgaXMgc2FtZSBsaWtlIGluIHRoZQorcHJldmlvdXMgZXhhbXBsZS4KKworSWYgYWxsIGZpbGUgbmFtZXMgaW4gdGhlIGNoYW5nZSBlbmQgd2l0aCBgLnR4dGAsIHRoZW4gdGhlCitgZ2Vycml0OmNvbW1pdF9kZWx0YSgnKD88IVwudHh0KSQnKWAgd2lsbCBmYWlsIGFzIG5vIGZpbGUgbmFtZSB3aWxsIG1hdGNoIHRoaXMKK3JlZ3VsYXIgZXhwcmVzc2lvbi4KKwogR0VSUklUCiAtLS0tLS0KIFBhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmVmcy1ub3Rlcy1yZXZpZXcudHh0IGIvRG9jdW1lbnRhdGlvbi9yZWZzLW5vdGVzLXJldmlldy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmY1NjcuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9yZWZzLW5vdGVzLXJldmlldy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotVGhlIHJlZnMvbm90ZXMvcmV2aWV3IG5hbWVzcGFjZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TdW1tYXJ5Ci0tLS0tLS0tCi0KLWByZWZzL25vdGVzL3Jldmlld2AgaXMgYSBzcGVjaWFsIHJlZmVyZW5jZSB0aGF0IEdlcnJpdCBjcmVhdGVzIG9uIHJlcG9zaXRvcmllcwotdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgY29kZSByZXZpZXdzLgotCi1XaGVuIGEgcmVwb3NpdG9yeSBpcyBjbG9uZWQgZnJvbSBHZXJyaXQsIHRoZSBgcmVmcy9ub3Rlcy9yZXZpZXdgIHJlZmVyZW5jZSBpcwotbm90IGluY2x1ZGVkIGJ5IGRlZmF1bHQuICBJdCBoYXMgdG8gYmUgbWFudWFsbHkgZmV0Y2hlZDoKLQotPT09PQotICAkIGdpdCBmZXRjaCBvcmlnaW4gcmVmcy9ub3Rlcy9yZXZpZXc6cmVmcy9ub3Rlcy9yZXZpZXcKLT09PT0KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0bwotbGluazpodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy9naXQtY29uZmlnLmh0bWxbY29uZmlndXJlIGdpdF0KLXRvIGFsd2F5cyBmZXRjaCBgcmVmcy9ub3Rlcy9yZXZpZXdgOgotCi09PT09Ci0gICQgZ2l0IGNvbmZpZyAtLWFkZCByZW1vdGUub3JpZ2luLmZldGNoIHJlZnMvbm90ZXMvcmV2aWV3OnJlZnMvbm90ZXMvcmV2aWV3Ci0gICQgZ2l0IGZldGNoCi09PT09Ci0KLVdoZW4gYHJlZnMvbm90ZXMvcmV2aWV3YCBpcyBmZXRjaGVkIG9uIGEgcmVwb3NpdG9yeSwgdGhlIEdlcnJpdCByZXZpZXcKLWluZm9ybWF0aW9uIGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgZ2l0IGxvZyBvdXRwdXQ6Ci0KLT09PT0KLSAgICQgZ2l0IGxvZyAtLXNob3ctbm90ZXM9cmV2aWV3Ci09PT09Ci0KLUNvbnRlbnQgb2YgcmVmcy9ub3Rlcy9yZXZpZXcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRm9yIGVhY2ggY29tbWl0LCBHZXJyaXQgc3RvcmVzIHRoZSBmb2xsb3dpbmcgcmV2aWV3IGluZm9ybWF0aW9uIGluCi1gcmVmcy9ub3Rlcy9yZXZpZXdgOgotCi1bW3N1Ym1pdHRlZF9ieV1dCi1TdWJtaXR0ZWQtYnkKLX5+fn5+fn5+fn5+fgotCi1UaGUgbmFtZSBhbmQgZW1haWwgYWRkcmVzcyBvZiB0aGUgR2Vycml0IHVzZXIgdGhhdCBzdWJtaXR0ZWQgdGhlIGNoYW5nZSBpbgotbGluazpodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyODIyLnR4dFtSRkMgMjgyMl0gZm9ybWF0LgotCi09PT09Ci0gIFN1Ym1pdHRlZC1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgotPT09PQotCi1bW3N1Ym1pdHRlZF9hdF1dCi1TdWJtaXR0ZWQtYXQKLX5+fn5+fn5+fn5+fgotCi1UaGUgdGltZSB0aGUgY29tbWl0IHdhcyBzdWJtaXR0ZWQgaW4gUkZDIDI4MjIgdGltZSBzdGFtcCBmb3JtYXQuCi0KLT09PT0KLSAgU3VibWl0dGVkLWF0OiBNb24sIDI1IEp1biAyMDEyIDE2OjE1OjU3ICswMjAwCi09PT09Ci0KLVtbcmV2aWV3ZWRfb25dXQotUmV2aWV3ZWQtb24KLX5+fn5+fn5+fn5+Ci0KLVRoZSBVUkwgdG8gdGhlIGNoYW5nZSBvbiB0aGUgR2Vycml0IHNlcnZlci4KLQotPT09PQotICBSZXZpZXdlZC1vbjogaHR0cDovL3BhdGgudG8uZ2Vycml0LzEyMzQ1Ci09PT09Ci0KLVtbcmV2aWV3X3Njb3Jlc11dCi1SZXZpZXcgTGFiZWxzIGFuZCBTY29yZXMKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi1SZXZpZXcgbGFiZWwgYW5kIHNjb3JlLCBhbmQgdGhlIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3Mgb2YgdGhlIEdlcnJpdCB1c2VyIHRoYXQKLWdhdmUgaXQgaW4gUkZDIDI4MjIgZm9ybWF0OgotCi09PT09Ci0gIENvZGUtUmV2aWV3KzI6IEEuIE4uIE90aGVyIDxhbm90aGVyQGRldmVsb3Blci5leGFtcGxlLm9yZz4KLSAgVmVyaWZpZWQrMTogQS4gTi4gT3RoZXIgPGFub3RoZXJAZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgotPT09PQotCi1Db21tb25seSB1c2VkIHJldmlldyBsYWJlbHMgYXJlICJDb2RlLVJldmlldyIgYW5kICJWZXJpZmllZCIsIGJ1dCBhbnkgbGFiZWwKLWNvbmZpZ3VyZWQgaW4gR2Vycml0IGNhbiBiZSBpbmNsdWRlZC4KLQotQWxsIHJldmlldyBsYWJlbHMgYW5kIHNjb3JlcyBwcmVzZW50IG9uIHRoZSBjaGFuZ2UgYXQgdGhlIHRpbWUgb2Ygc3VibWl0IGFyZQotaW5jbHVkZWQuCi0KLVtbcHJvamVjdF1dCi1Qcm9qZWN0Ci1+fn5+fn5+Ci0KLVRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IGluIHdoaWNoIHRoZSBjb21taXQgd2FzIG1hZGUuCi0KLT09PT0KLSAgUHJvamVjdDoga2VybmVsL2NvbW1vbgotPT09PQotCi1bW2JyYW5jaF1dCi1CcmFuY2gKLX5+fn5+fgotCi1UaGUgbmFtZSBvZiB0aGUgYnJhbmNoIG9uIHdoaWNoIHRoZSBjb21taXQgd2FzIG1hZGUuCi0KLT09PT0KLSAgQnJhbmNoOiByZWZzL2hlYWRzL21hc3RlcgotPT09PQotCi0KLUdFUlJJVAotLS0tLS0tCi1QYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLWFjY291bnRzLnR4dCBiL0RvY3VtZW50YXRpb24vcmVzdC1hcGktYWNjb3VudHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2QzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLWFjY291bnRzLnR4dApAQCAtMCwwICsxLDM2OCBAQAorR2Vycml0IENvZGUgUmV2aWV3IC0gL2FjY291bnRzLyBSRVNUIEFQSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHBhZ2UgZGVzY3JpYmVzIHRoZSBhY2NvdW50IHJlbGF0ZWQgUkVTVCBlbmRwb2ludHMuCitQbGVhc2UgYWxzbyB0YWtlIG5vdGUgb2YgdGhlIGdlbmVyYWwgaW5mb3JtYXRpb24gb24gdGhlCitsaW5rOnJlc3QtYXBpLmh0bWxbUkVTVCBBUEldLgorCitFbmRwb2ludHMKKy0tLS0tLS0tLQorCitbW2dldC1hY2NvdW50XV0KK0dldCBBY2NvdW50Cit+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvYWNjb3VudHMvbGluazojYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0nCisKK1JldHVybnMgYW4gYWNjb3VudCBhcyBhbiBsaW5rOiNhY2NvdW50LWluZm9bQWNjb3VudEluZm9dIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9hY2NvdW50cy9zZWxmIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgfQorLS0tLQorCitbW2xpc3QtYWNjb3VudC1jYXBhYmlsaXRpZXNdXQorTGlzdCBBY2NvdW50IENhcGFiaWxpdGllcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvYWNjb3VudHMvbGluazojYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0vY2FwYWJpbGl0aWVzJworCitSZXR1cm5zIHRoZSBnbG9iYWwgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGVuYWJsZWQgZm9yIHRoZSBzcGVjaWZpZWQKK3VzZXIuCisKK0lmIHRoZSBnbG9iYWwgY2FwYWJpbGl0aWVzIGZvciB0aGUgY2FsbGluZyB1c2VyIHNob3VsZCBiZSBsaXN0ZWQsCitgc2VsZmAgY2FuIGJlIHVzZWQgYXMgYWNjb3VudC1pZC4gVGhpcyBjYW4gYmUgdXNlZCBieSBVSSB0b29scyB0bworZGlzY292ZXIgaWYgYWRtaW5pc3RyYXRpdmUgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyLCBzbwordGhleSBjYW4gaGlkZSAob3Igc2hvdykgcmVsZXZhbnQgVUkgYWN0aW9ucy4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcyBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSB0aGUgZ2xvYmFsIGNhcGFiaWxpdGllcyBvZiB0aGUgdXNlciBhcmUgcmV0dXJuZWQgYXMgYQorbGluazojY2FwYWJpbGl0eS1pbmZvW0NhcGFiaWxpdHlJbmZvXSBlbnRpdHkuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJxdWVyeUxpbWl0IjogeworICAgICAgIm1pbiI6IDAsCisgICAgICAibWF4IjogNTAwCisgICAgfSwKKyAgICAiZW1haWxSZXZpZXdlcnMiOiB0cnVlCisgIH0KKy0tLS0KKworQWRtaW5pc3RyYXRvciB0aGF0IGhhcyBhdXRoZW50aWNhdGVkIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uOgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2EvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXMgSFRUUC8xLjAKKyAgQXV0aG9yaXphdGlvbjogRGlnZXN0IHVzZXJuYW1lPSJhZG1pbiIsIHJlYWxtPSJHZXJyaXQgQ29kZSBSZXZpZXciLCBub25jZT0iLi4uCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJhZG1pbmlzdHJhdGVTZXJ2ZXIiOiB0cnVlLAorICAgICJxdWVyeUxpbWl0IjogeworICAgICAgIm1pbiI6IDAsCisgICAgICAibWF4IjogNTAwCisgICAgfSwKKyAgICAiY3JlYXRlQWNjb3VudCI6IHRydWUsCisgICAgImNyZWF0ZUdyb3VwIjogdHJ1ZSwKKyAgICAiY3JlYXRlUHJvamVjdCI6IHRydWUsCisgICAgImVtYWlsUmV2aWV3ZXJzIjogdHJ1ZSwKKyAgICAia2lsbFRhc2siOiB0cnVlLAorICAgICJ2aWV3Q2FjaGVzIjogdHJ1ZSwKKyAgICAiZmx1c2hDYWNoZXMiOiB0cnVlLAorICAgICJ2aWV3Q29ubmVjdGlvbnMiOiB0cnVlLAorICAgICJ2aWV3UXVldWUiOiB0cnVlLAorICAgICJydW5HQyI6IHRydWUsCisgICAgInN0YXJ0UmVwbGljYXRpb24iOiB0cnVlCisgIH0KKy0tLS0KKworLkdldCB5b3VyIG93biBjYXBhYmlsaXRpZXMKKyoqKioKK2dldDo6L2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzCisqKioqCisKK1RvIGZpbHRlciB0aGUgc2V0IG9mIGdsb2JhbCBjYXBhYmlsaXRpZXMgdGhlIGBxYCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQuCitGaWx0ZXJpbmcgbWF5IGRlY3JlYXNlIHRoZSByZXNwb25zZSB0aW1lIGJ5IGF2b2lkaW5nIGxvb2tpbmcgYXQgZXZlcnkKK3Bvc3NpYmxlIGFsdGVybmF0aXZlIGZvciB0aGUgY2FsbGVyLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2EvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXM/cT1jcmVhdGVBY2NvdW50JnE9Y3JlYXRlR3JvdXAgSFRUUC8xLjAKKyAgQXV0aG9yaXphdGlvbjogRGlnZXN0IHVzZXJuYW1lPSJhZG1pbiIsIHJlYWxtPSJHZXJyaXQgQ29kZSBSZXZpZXciLCBub25jZT0iLi4uCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJjcmVhdGVBY2NvdW50IjogdHJ1ZSwKKyAgICAiY3JlYXRlR3JvdXAiOiB0cnVlCisgIH0KKy0tLS0KKworLkNoZWNrIGlmIHlvdSBjYW4gY3JlYXRlIGdyb3VwcworKioqKgorZ2V0OjovYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXM/cT1jcmVhdGVHcm91cAorKioqKgorCitbW2NoZWNrLWFjY291bnQtY2FwYWJpbGl0eV1dCitDaGVjayBBY2NvdW50IENhcGFiaWxpdHkKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvYWNjb3VudHMvbGluazojYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0vY2FwYWJpbGl0aWVzL2xpbms6I2NhcGFiaWxpdHktaWRbXHtjYXBhYmlsaXR5LWlkXH1dJworCitDaGVja3MgaWYgYSB1c2VyIGhhcyBhIGNlcnRhaW4gZ2xvYmFsIGNhcGFiaWxpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvYS9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcy9jcmVhdGVHcm91cCBIVFRQLzEuMAorLS0tLQorCitJZiB0aGUgdXNlciBoYXMgdGhlIGdsb2JhbCBjYXBhYmlsaXR5IHRoZSBzdHJpbmcgYG9rYCBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworCisgIG9rCistLS0tCisKK0lmIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSB0aGUgZ2xvYmFsIGNhcGFiaWxpdHkgdGhlIHJlc3BvbnNlIGlzCitgNDA0IE5vdCBGb3VuZGAuCisKKy5DaGVjayBpZiB5b3UgY2FuIGNyZWF0ZSBncm91cHMKKyoqKioKK2dldDo6L2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzL2NyZWF0ZUdyb3VwCisqKioqCisKK1tbbGlzdC1ncm91cHNdXQorTGlzdCBHcm91cHMKK35+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9hY2NvdW50cy9saW5rOiNhY2NvdW50LWlkW1x7YWNjb3VudC1pZFx9XS9ncm91cHMvJworCitMaXN0cyBhbGwgZ3JvdXBzIHRoYXQgY29udGFpbiB0aGUgc3BlY2lmaWVkIHVzZXIgYXMgYSBtZW1iZXIuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvYS9hY2NvdW50cy9zZWxmL2dyb3Vwcy8gSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzdWx0IGEgbGlzdCBvZiBsaW5rOnJlc3QtYXBpLWdyb3Vwcy5odG1sI2dyb3VwLWluZm9bR3JvdXBJbmZvXQorZW50cmllcyBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgICAiaWQiOiAiZ2xvYmFsJTNBQW5vbnltb3VzLVVzZXJzIiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC1nbG9iYWwlM0FBbm9ueW1vdXMtVXNlcnMiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjogIkFueSB1c2VyLCBzaWduZWQtaW4gb3Igbm90IiwKKyAgICAgICJncm91cF9pZCI6IDIsCisgICAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgICB9LAorICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogIjgzNGVjMzZkZDVlMGVkMjFhMmZmNWQ3ZTIyNTVkYTA4MmQ2M2JiZDciLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTgzNGVjMzZkZDVlMGVkMjFhMmZmNWQ3ZTIyNTVkYTA4MmQ2M2JiZDciLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICAgICJ2aXNpYmxlX3RvX2FsbCI6IHRydWUsCisgICAgICB9LAorICAgICAgImdyb3VwX2lkIjogNiwKKyAgICAgICJvd25lcl9pZCI6ICI4MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3IgorICAgIH0sCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgICAiaWQiOiAiZ2xvYmFsJTNBUmVnaXN0ZXJlZC1Vc2VycyIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtZ2xvYmFsJTNBUmVnaXN0ZXJlZC1Vc2VycyIsCisgICAgICAib3B0aW9ucyI6IHsKKyAgICAgIH0sCisgICAgICAiZGVzY3JpcHRpb24iOiAiQW55IHNpZ25lZC1pbiB1c2VyIiwKKyAgICAgICJncm91cF9pZCI6IDMsCisgICAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgICB9CisgIF0KKy0tLS0KKworLkxpc3QgYWxsIGdyb3VwcyB0aGF0IGNvbnRhaW4geW91IGFzIGEgbWVtYmVyCisqKioqCitnZXQ6Oi9hY2NvdW50cy9zZWxmL2dyb3Vwcy8KKyoqKioKKworW1tnZXQtYXZhdGFyXV0KK0dldCBBdmF0YXIKK35+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2FjY291bnRzL2xpbms6I2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dL2F2YXRhcicKKworUmV0cmlldmVzIHRoZSBhdmF0YXIgaW1hZ2Ugb2YgdGhlIHVzZXIuCisKK1dpdGggdGhlIGBzaXplYCBvcHRpb24gKGFsaWFzIGBzYCkgeW91IGNhbiBzcGVjaWZ5IHRoZSBwcmVmZXJyZWQgc2l6ZQoraW4gcGl4ZWxzIChoZWlnaHQgYW5kIHdpZHRoKS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9hL2FjY291bnRzL2pvaG4uZG9lQGV4YW1wbGUuY29tL2F2YXRhcj9zPTIwIEhUVFAvMS4wCistLS0tCisKK1RoZSByZXNwb25zZSByZWRpcmVjdHMgdG8gdGhlIFVSTCBvZiB0aGUgYXZhdGFyIGltYWdlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMzAyIEZvdW5kCisgIExvY2F0aW9uOiBodHRwczovL3Byb2ZpbGVzL2F2YXRhci9qb2huX2RvZS5qcGVnP3M9MjB4MjAKKy0tLS0KKworCitbW2lkc11dCitJRHMKKy0tLQorCitbW2FjY291bnQtaWRdXQorXHthY2NvdW50LWlkXH0KK35+fn5+fn5+fn5+fn5+CitJZGVudGlmaWVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBvbmUgYWNjb3VudC4KKworVGhpcyBjYW4gYmU6CisKKyogYSBzdHJpbmcgb2YgdGhlIGZvcm1hdCAiRnVsbCBOYW1lIDxlbWFpbEBleGFtcGxlLmNvbT4iCisqIGp1c3QgdGhlIGVtYWlsIGFkZHJlc3MgKCJlbWFpbEBleGFtcGxlIikKKyogYSBmdWxsIG5hbWUgaWYgaXQgaXMgdW5pcXVlICgiRnVsbCBOYW1lIikKKyogYW4gYWNjb3VudCBJRCAoIjE4NDE5IikKKyogYSB1c2VyIG5hbWUgKCJ1c2VybmFtZSIpCisqIGBzZWxmYCBmb3IgdGhlIGNhbGxpbmcgdXNlcgorCitbW2NhcGFiaWxpdHktaWRdXQorXHtjYXBhYmlsaXR5LWlkXH0KK35+fn5+fn5+fn5+fn5+fn5+CitJZGVudGlmaWVyIG9mIGEgZ2xvYmFsIGNhcGFiaWxpdHkuIFZhbGlkIHZhbHVlcyBhcmUgYWxsIGZpZWxkIG5hbWVzIG9mCit0aGUgbGluazojY2FwYWJpbGl0eS1pbmZvW0NhcGFiaWxpdHlJbmZvXSBlbnRpdHkuCisKKworW1tqc29uLWVudGl0aWVzXV0KK0pTT04gRW50aXRpZXMKKy0tLS0tLS0tLS0tLS0KKworW1thY2NvdW50LWluZm9dXQorQWNjb3VudEluZm8KK35+fn5+fn5+fn5+CitUaGUgYEFjY291bnRJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xgX2FjY291bnRfaWRgIHx8VGhlIG51bWVyaWMgSUQgb2YgdGhlIGFjY291bnQuCit8YG5hbWVgICAgICAgICB8b3B0aW9uYWx8VGhlIGZ1bGwgbmFtZSBvZiB0aGUgdXNlci4gKworT25seSBzZXQgaWYgZGV0YWlsZWQgYWNjb3VudCBpbmZvcm1hdGlvbiBpcyByZXF1ZXN0ZWQuCit8YGVtYWlsYCAgICAgICB8b3B0aW9uYWx8CitUaGUgZW1haWwgYWRkcmVzcyB0aGUgdXNlciBwcmVmZXJzIHRvIGJlIGNvbnRhY3RlZCB0aHJvdWdoLiArCitPbmx5IHNldCBpZiBkZXRhaWxlZCBhY2NvdW50IGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tjYXBhYmlsaXR5LWluZm9dXQorQ2FwYWJpbGl0eUluZm8KK35+fn5+fn5+fn5+fn5+CitUaGUgYENhcGFiaWxpdHlJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdsb2JhbAorY2FwYWJpbGl0aWVzIG9mIGEgdXNlci4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgICAgIHx8RGVzY3JpcHRpb24KK3xgYWRtaW5pc3RyYXRlU2VydmVyYHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9hZG1pbmlzdHJhdGVTZXJ2ZXJbQWRtaW5pc3RyYXRlCitTZXJ2ZXJdIGNhcGFiaWxpdHkuCit8YHF1ZXJ5TGltaXRgfHxUaGUgbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfcXVlcnlMaW1pdFtRdWVyeQorTGltaXRdIG9mIHRoZSB1c2VyIGFzIGxpbms6I3F1ZXJ5LWxpbWl0LWluZm9bUXVlcnlMaW1pdEluZm9dLgorfGBjcmVhdGVBY2NvdW50YCAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X2NyZWF0ZUFjY291bnRbQ3JlYXRlIEFjY291bnRdCitjYXBhYmlsaXR5LgorfGBjcmVhdGVHcm91cGAgICAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X2NyZWF0ZUdyb3VwW0NyZWF0ZSBHcm91cF0KK2NhcGFiaWxpdHkuCit8YGNyZWF0ZVByb2plY3RgICAgICB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfY3JlYXRlUHJvamVjdFtDcmVhdGUgUHJvamVjdF0KK2NhcGFiaWxpdHkuCit8YGVtYWlsUmV2aWV3ZXJzYCAgICB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfZW1haWxSZXZpZXdlcnNbRW1haWwgUmV2aWV3ZXJzXQorY2FwYWJpbGl0eS4KK3xga2lsbFRhc2tgICAgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9raWxsW0tpbGwgVGFza10gY2FwYWJpbGl0eS4KK3xgdmlld0NhY2hlc2AgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV92aWV3Q2FjaGVzW1ZpZXcgQ2FjaGVzXSBjYXBhYmlsaXR5LgorfGBmbHVzaENhY2hlc2AgICAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X2ZsdXNoQ2FjaGVzW0ZsdXNoIENhY2hlc10KK2NhcGFiaWxpdHkuCit8YHZpZXdDb25uZWN0aW9uc2AgICB8bm90IHNldCBpZiBgZmFsc2VgfFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfdmlld0Nvbm5lY3Rpb25zW1ZpZXcgQ29ubmVjdGlvbnNdCitjYXBhYmlsaXR5LgorfGB2aWV3UXVldWVgICAgICAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSB1c2VyIGhhcyB0aGUKK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X3ZpZXdRdWV1ZVtWaWV3IFF1ZXVlXSBjYXBhYmlsaXR5LgorfGBydW5HQ2AgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9ydW5HQ1tSdW4gR2FyYmFnZSBDb2xsZWN0aW9uXQorY2FwYWJpbGl0eS4KK3xgc3RhcnRSZXBsaWNhdGlvbmAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8V2hldGhlciB0aGUgdXNlciBoYXMgdGhlCitsaW5rOmFjY2Vzcy1jb250cm9sLmh0bWwjY2FwYWJpbGl0eV9zdGFydFJlcGxpY2F0aW9uW1N0YXJ0IFJlcGxpY2F0aW9uXQorY2FwYWJpbGl0eS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1txdWVyeS1saW1pdC1pbmZvXV0KK1F1ZXJ5TGltaXRJbmZvCit+fn5+fn5+fn5+fn5+fgorVGhlIGBRdWVyeUxpbWl0SW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQorbGluazphY2Nlc3MtY29udHJvbC5odG1sI2NhcGFiaWxpdHlfcXVlcnlMaW1pdFtRdWVyeSBMaW1pdF0gb2YgYSB1c2VyLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgICAgICB8RGVzY3JpcHRpb24KK3xgbWluYCAgICAgICAgICAgICAgIHxMb3dlciBsaW1pdC4KK3xgbWF4YCAgICAgICAgICAgICAgIHxVcHBlciBsaW1pdC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLWNoYW5nZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1jaGFuZ2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTZhMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1jaGFuZ2VzLnR4dApAQCAtMCwwICsxLDIxNTMgQEAKK0dlcnJpdCBDb2RlIFJldmlldyAtIC9jaGFuZ2VzLyBSRVNUIEFQSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgcGFnZSBkZXNjcmliZXMgdGhlIGNoYW5nZSByZWxhdGVkIFJFU1QgZW5kcG9pbnRzLgorUGxlYXNlIGFsc28gdGFrZSBub3RlIG9mIHRoZSBnZW5lcmFsIGluZm9ybWF0aW9uIG9uIHRoZQorbGluazpyZXN0LWFwaS5odG1sW1JFU1QgQVBJXS4KKworW1tjaGFuZ2UtZW5kcG9pbnRzXV0KK0NoYW5nZSBFbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0KKworW1tsaXN0LWNoYW5nZXNdXQorUXVlcnkgQ2hhbmdlcworfn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvY2hhbmdlcy8nCisKK1F1ZXJpZXMgY2hhbmdlcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIuIFRoZSBxdWVyeSBzdHJpbmcgbXVzdCBiZQorcHJvdmlkZWQgYnkgdGhlIGBxYCBwYXJhbWV0ZXIuIFRoZSBgbmAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGxpbWl0Cit0aGUgcmV0dXJuZWQgcmVzdWx0cy4KKworQXMgcmVzdWx0IGEgbGlzdCBvZiBsaW5rOiNjaGFuZ2UtaW5mb1tDaGFuZ2VJbmZvXSBlbnRyaWVzIGlzIHJldHVybmVkLgorVGhlIGNoYW5nZSBvdXRwdXQgaXMgc29ydGVkIGJ5IHRoZSBsYXN0IHVwZGF0ZSB0aW1lLCBtb3N0IHJlY2VudGx5Cit1cGRhdGVkIHRvIG9sZGVzdCB1cGRhdGVkLgorCitRdWVyeSBmb3Igb3BlbiBjaGFuZ2VzIG9mIHdhdGNoZWQgcHJvamVjdHM6CisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvY2hhbmdlcy8/cT1zdGF0dXM6b3Blbitpczp3YXRjaGVkJm49MiBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgICAiaWQiOiAiZGVtb35tYXN0ZXJ+SWRhZjVlMDk4ZDcwODk4YjcxMTlmNmY0YWY1YTZjMTMzNDNkNjRiNTciLAorICAgICAgInByb2plY3QiOiAiZGVtbyIsCisgICAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgICAiY2hhbmdlX2lkIjogIklkYWY1ZTA5OGQ3MDg5OGI3MTE5ZjZmNGFmNWE2YzEzMzQzZDY0YjU3IiwKKyAgICAgICJzdWJqZWN0IjogIk9uZSBjaGFuZ2UiLAorICAgICAgInN0YXR1cyI6ICJORVciLAorICAgICAgImNyZWF0ZWQiOiAiMjAxMi0wNy0xNyAwNzoxODozMC44NTQwMDAwMDAiLAorICAgICAgInVwZGF0ZWQiOiAiMjAxMi0wNy0xNyAwNzoxOToyNy43NjYwMDAwMDAiLAorICAgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAgICJtZXJnZWFibGUiOiB0cnVlLAorICAgICAgIl9zb3J0a2V5IjogIjAwMWU3MDU3MDAwMDA2ZGMiLAorICAgICAgIl9udW1iZXIiOiAxNzU2LAorICAgICAgIm93bmVyIjogeworICAgICAgICAibmFtZSI6ICJKb2huIERvZSIKKyAgICAgIH0sCisgICAgfSwKKyAgICB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgICAiaWQiOiAiZGVtb35tYXN0ZXJ+STA5YzgwNDFiNTg2N2Q1YjMzMTcwMzE2ZTJhYmMzNGI3OWJiYjg1MDEiLAorICAgICAgInByb2plY3QiOiAiZGVtbyIsCisgICAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgICAiY2hhbmdlX2lkIjogIkkwOWM4MDQxYjU4NjdkNWIzMzE3MDMxNmUyYWJjMzRiNzliYmI4NTAxIiwKKyAgICAgICJzdWJqZWN0IjogIkFub3RoZXIgY2hhbmdlIiwKKyAgICAgICJzdGF0dXMiOiAiTkVXIiwKKyAgICAgICJjcmVhdGVkIjogIjIwMTItMDctMTcgMDc6MTg6MzAuODg0MDAwMDAwIiwKKyAgICAgICJ1cGRhdGVkIjogIjIwMTItMDctMTcgMDc6MTg6MzAuODg1MDAwMDAwIiwKKyAgICAgICJtZXJnZWFibGUiOiB0cnVlLAorICAgICAgIl9zb3J0a2V5IjogIjAwMWU3MDU2MDAwMDA2ZGQiLAorICAgICAgIl9udW1iZXIiOiAxNzU3LAorICAgICAgIm93bmVyIjogeworICAgICAgICAibmFtZSI6ICJKb2huIERvZSIKKyAgICAgIH0sCisgICAgICAiX21vcmVfY2hhbmdlcyI6IHRydWUKKyAgICB9CisgIF0KKy0tLS0KKworSWYgdGhlIGBuYCBxdWVyeSBwYXJhbWV0ZXIgaXMgc3VwcGxpZWQgYW5kIGFkZGl0aW9uYWwgY2hhbmdlcyBleGlzdAordGhhdCBtYXRjaCB0aGUgcXVlcnkgYmV5b25kIHRoZSBlbmQsIHRoZSBsYXN0IGNoYW5nZSBvYmplY3QgaGFzIGEKK2BfbW9yZV9jaGFuZ2VzOiB0cnVlYCBKU09OIGZpZWxkIHNldC4gQ2FsbGVycyBjYW4gcmVzdW1lIGEgcXVlcnkgd2l0aAordGhlIGBOYCBxdWVyeSBwYXJhbWV0ZXIsIHN1cHBseWluZyB0aGUgbGFzdCBjaGFuZ2UncyBgX3NvcnRrZXlgIGZpZWxkCithcyB0aGUgdmFsdWUuIFdoZW4gZ29pbmcgaW4gdGhlIHJldmVyc2UgZGlyZWN0aW9uIHdpdGggdGhlIGBQYCBxdWVyeQorcGFyYW1ldGVyIGEgYF9tb3JlX2NoYW5nZXM6IHRydWVgIGlzIHB1dCBpbiB0aGUgZmlyc3QgY2hhbmdlIG9iamVjdCBpZgordGhlcmUgYXJlIHJlc3VsdHMgKmJlZm9yZSogdGhlIGZpcnN0IGNoYW5nZSByZXR1cm5lZC4KKworQ2xpZW50cyBhcmUgYWxsb3dlZCB0byBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgcXVlcnkgYnkgc2V0dGluZyB0aGUgYHFgCitwYXJhbWV0ZXIgbXVsdGlwbGUgdGltZXMuIEluIHRoaXMgY2FzZSB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IG9mCithcnJheXMsIG9uZSBwZXIgcXVlcnkgaW4gdGhlIHNhbWUgb3JkZXIgdGhlIHF1ZXJpZXMgd2VyZSBnaXZlbiBpbi4KKworLlF1ZXJ5IGZvciB0aGUgMjUgbW9zdCByZWNlbnQgb3BlbiBjaGFuZ2VzIG9mIHRoZSBwcm9qZWN0cyB0aGF0IHlvdSB3YXRjaAorKioqKgorZ2V0OjovY2hhbmdlcy8/cT1zdGF0dXM6b3Blbitpczp3YXRjaGVkJm49MjUKKyoqKioKKworUXVlcnkgdGhhdCByZXRyaWV2ZXMgY2hhbmdlcyBmb3IgYSB1c2VyJ3MgZGFzaGJvYXJkOgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvP3E9aXM6b3Blbitvd25lcjpzZWxmJnE9aXM6b3BlbityZXZpZXdlcjpzZWxmKy1vd25lcjpzZWxmJnE9aXM6Y2xvc2VkK293bmVyOnNlbGYrbGltaXQ6NSZvPUxBQkVMUyBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICBbCisgICAgICB7CisgICAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAgICAgImlkIjogImRlbW9+bWFzdGVyfklkYWY1ZTA5OGQ3MDg5OGI3MTE5ZjZmNGFmNWE2YzEzMzQzZDY0YjU3IiwKKyAgICAgICAgInByb2plY3QiOiAiZGVtbyIsCisgICAgICAgICJicmFuY2giOiAibWFzdGVyIiwKKyAgICAgICAgImNoYW5nZV9pZCI6ICJJZGFmNWUwOThkNzA4OThiNzExOWY2ZjRhZjVhNmMxMzM0M2Q2NGI1NyIsCisgICAgICAgICJzdWJqZWN0IjogIk9uZSBjaGFuZ2UiLAorICAgICAgICAic3RhdHVzIjogIk5FVyIsCisgICAgICAgICJjcmVhdGVkIjogIjIwMTItMDctMTcgMDc6MTg6MzAuODU0MDAwMDAwIiwKKyAgICAgICAgInVwZGF0ZWQiOiAiMjAxMi0wNy0xNyAwNzoxOToyNy43NjYwMDAwMDAiLAorICAgICAgICAicmV2aWV3ZWQiOiB0cnVlLAorICAgICAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAgICAgIl9zb3J0a2V5IjogIjAwMWU3MDU3MDAwMDA2ZGMiLAorICAgICAgICAiX251bWJlciI6IDE3NTYsCisgICAgICAgICJvd25lciI6IHsKKyAgICAgICAgICAibmFtZSI6ICJKb2huIERvZSIKKyAgICAgICAgfSwKKyAgICAgICAgImxhYmVscyI6IHsKKyAgICAgICAgICAiVmVyaWZpZWQiOiB7fSwKKyAgICAgICAgICAiQ29kZS1SZXZpZXciOiB7fQorICAgICAgICB9CisgICAgICB9CisgICAgXSwKKyAgICBbXSwKKyAgICBbXQorICBdCistLS0tCisKKy5RdWVyeSB0aGUgY2hhbmdlcyBmb3IgeW91ciB1c2VyIGRhc2hib2FyZAorKioqKgorZ2V0OjovY2hhbmdlcy8/cT1pczpvcGVuK293bmVyOnNlbGYmcT1pczpvcGVuK3Jldmlld2VyOnNlbGYrLW93bmVyOnNlbGYmcT1pczpjbG9zZWQrb3duZXI6c2VsZitsaW1pdDo1Jm89TEFCRUxTCisqKioqCisKK0FkZGl0aW9uYWwgZmllbGRzIGNhbiBiZSBvYnRhaW5lZCBieSBhZGRpbmcgYG9gIHBhcmFtZXRlcnMsIGVhY2gKK29wdGlvbiByZXF1aXJlcyBtb3JlIGRhdGFiYXNlIGxvb2t1cHMgYW5kIHNsb3dzIGRvd24gdGhlIHF1ZXJ5CityZXNwb25zZSB0aW1lIHRvIHRoZSBjbGllbnQgc28gdGhleSBhcmUgZ2VuZXJhbGx5IGRpc2FibGVkIGJ5CitkZWZhdWx0LiBPcHRpb25hbCBmaWVsZHMgYXJlOgorCitbW2xhYmVsc11dCistLQorKiBgTEFCRUxTYDogYSBzdW1tYXJ5IG9mIGVhY2ggbGFiZWwgcmVxdWlyZWQgZm9yIHN1Ym1pdCwgYW5kCisgIGFwcHJvdmVycyB0aGF0IGhhdmUgZ3JhbnRlZCAob3IgcmVqZWN0ZWQpIHdpdGggdGhhdCBsYWJlbC4KKy0tCisKK1tbZGV0YWlsZWQtbGFiZWxzXV0KKy0tCisqIGBERVRBSUxFRF9MQUJFTFNgOiBkZXRhaWxlZCBsYWJlbCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIG51bWVyaWMKKyAgdmFsdWVzIG9mIGFsbCBleGlzdGluZyBhcHByb3ZhbHMsIHJlY29nbml6ZWQgbGFiZWwgdmFsdWVzLCB2YWx1ZXMKKyAgcGVybWl0dGVkIHRvIGJlIHNldCBieSB0aGUgY3VycmVudCB1c2VyLCBhbmQgcmV2aWV3ZXJzIHRoYXQgbWF5IGJlCisgIHJlbW92ZWQgYnkgdGhlIGN1cnJlbnQgdXNlci4KKy0tCisKK1tbY3VycmVudC1yZXZpc2lvbl1dCistLQorKiBgQ1VSUkVOVF9SRVZJU0lPTmA6IGRlc2NyaWJlIHRoZSBjdXJyZW50IHJldmlzaW9uIChwYXRjaCBzZXQpCisgIG9mIHRoZSBjaGFuZ2UsIGluY2x1ZGluZyB0aGUgY29tbWl0IFNIQS0xIGFuZCBVUkxzIHRvIGZldGNoIGZyb20uCistLQorCitbW2FsbC1yZXZpc2lvbnNdXQorLS0KKyogYEFMTF9SRVZJU0lPTlNgOiBkZXNjcmliZSBhbGwgcmV2aXNpb25zLCBub3QganVzdCBjdXJyZW50LgorLS0KKworW1tjdXJyZW50LWNvbW1pdF1dCistLQorKiBgQ1VSUkVOVF9DT01NSVRgOiBwYXJzZSBhbmQgb3V0cHV0IGFsbCBoZWFkZXIgZmllbGRzIGZyb20gdGhlCisgIGNvbW1pdCBvYmplY3QsIGluY2x1ZGluZyBtZXNzYWdlLiBPbmx5IHZhbGlkIHdoZW4gdGhlIGN1cnJlbnQKKyAgcmV2aXNpb24gb3IgYWxsIHJldmlzaW9ucyBhcmUgc2VsZWN0ZWQuCistLQorCitbW2FsbC1jb21taXRzXV0KKy0tCisqIGBBTExfQ09NTUlUU2A6IHBhcnNlIGFuZCBvdXRwdXQgYWxsIGhlYWRlciBmaWVsZHMgZnJvbSB0aGUKKyAgb3V0cHV0IHJldmlzaW9ucy4gSWYgb25seSBgQ1VSUkVOVF9SRVZJU0lPTmAgd2FzIHJlcXVlc3RlZAorICB0aGVuIG9ubHkgdGhlIGN1cnJlbnQgcmV2aXNpb24ncyBjb21taXQgZGF0YSB3aWxsIGJlIG91dHB1dC4KKy0tCisKK1tbY3VycmVudC1maWxlc11dCistLQorKiBgQ1VSUkVOVF9GSUxFU2A6IGxpc3QgZmlsZXMgbW9kaWZpZWQgYnkgdGhlIGNvbW1pdCwgaW5jbHVkaW5nCisgIGJhc2ljIGxpbmUgY291bnRzIGluc2VydGVkL2RlbGV0ZWQgcGVyIGZpbGUuIE9ubHkgdmFsaWQgd2hlbgorICB0aGUgY3VycmVudCByZXZpc2lvbiBvciBhbGwgcmV2aXNpb25zIGFyZSBzZWxlY3RlZC4KKy0tCisKK1tbYWxsLWZpbGVzXV0KKy0tCisqIGBBTExfRklMRVNgOiBsaXN0IGZpbGVzIG1vZGlmaWVkIGJ5IHRoZSBjb21taXQsIGluY2x1ZGluZworICBiYXNpYyBsaW5lIGNvdW50cyBpbnNlcnRlZC9kZWxldGVkIHBlciBmaWxlLiBJZiBvbmx5IHRoZQorICBgQ1VSUkVOVF9SRVZJU0lPTmAgd2FzIHJlcXVlc3RlZCB0aGUgb25seSB0aGF0IGNvbW1pdCdzCisgIG1vZGlmaWVkIGZpbGVzIHdpbGwgYmUgb3V0cHV0LgorLS0KKworW1tkZXRhaWxlZC1hY2NvdW50c11dCistLQorKiBgREVUQUlMRURfQUNDT1VOVFNgOiBpbmNsdWRlIGBfYWNjb3VudF9pZGAgYW5kIGBlbWFpbGAgZmllbGRzIHdoZW4KKyAgcmVmZXJlbmNpbmcgYWNjb3VudHMuCistLQorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvP3E9OTcmbz1DVVJSRU5UX1JFVklTSU9OJm89Q1VSUkVOVF9DT01NSVQmbz1DVVJSRU5UX0ZJTEVTIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgWworICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAgICJpZCI6ICJkZW1vfm1hc3Rlcn5JN2VhNDZkMmUyZWU1YzY0YzBkODA3Njc3ODU5Y2ZiN2Q5MGI4OTY2YSIsCisgICAgICAicHJvamVjdCI6ICJnZXJyaXQiLAorICAgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICAgImNoYW5nZV9pZCI6ICJJN2VhNDZkMmUyZWU1YzY0YzBkODA3Njc3ODU5Y2ZiN2Q5MGI4OTY2YSIsCisgICAgICAic3ViamVjdCI6ICJVc2UgYW4gRXZlbnRCdXMgdG8gbWFuYWdlIHN0YXIgaWNvbnMiLAorICAgICAgInN0YXR1cyI6ICJORVciLAorICAgICAgImNyZWF0ZWQiOiAiMjAxMi0wNC0yNSAwMDo1MjoyNS41ODAwMDAwMDAiLAorICAgICAgInVwZGF0ZWQiOiAiMjAxMi0wNC0yNSAwMDo1MjoyNS41ODYwMDAwMDAiLAorICAgICAgIm1lcmdlYWJsZSI6IHRydWUsCisgICAgICAiX3NvcnRrZXkiOiAiMDAxYzliZjQwMDAwMDA2MSIsCisgICAgICAiX251bWJlciI6IDk3LAorICAgICAgIm93bmVyIjogeworICAgICAgICAibmFtZSI6ICJTaGF3biBQZWFyY2UiCisgICAgICB9LAorICAgICAgImN1cnJlbnRfcmV2aXNpb24iOiAiMTg0ZWJlNTM4MDVlMTAyNjA1ZDExZjZiMTQzNDg2ZDE1YzIzYTA5YyIsCisgICAgICAicmV2aXNpb25zIjogeworICAgICAgICAiMTg0ZWJlNTM4MDVlMTAyNjA1ZDExZjZiMTQzNDg2ZDE1YzIzYTA5YyI6IHsKKyAgICAgICAgICAiX251bWJlciI6IDEsCisgICAgICAgICAgImZldGNoIjogeworICAgICAgICAgICAgImdpdCI6IHsKKyAgICAgICAgICAgICAgInVybCI6ICJnaXQ6Ly9sb2NhbGhvc3QvZ2Vycml0IiwKKyAgICAgICAgICAgICAgInJlZiI6ICJyZWZzL2NoYW5nZXMvOTcvOTcvMSIKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiaHR0cCI6IHsKKyAgICAgICAgICAgICAgInVybCI6ICJodHRwOi8vMTI3LjAuMC4xOjgwODAvZ2Vycml0IiwKKyAgICAgICAgICAgICAgInJlZiI6ICJyZWZzL2NoYW5nZXMvOTcvOTcvMSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9LAorICAgICAgICAgICJjb21taXQiOiB7CisgICAgICAgICAgICAicGFyZW50cyI6IFsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJjb21taXQiOiAiMWVlZTJjOWQ4ZjM1MjQ4Mzc4MWU3NzJmMzVkYzU4NmE2OWZmNTY0NiIsCisgICAgICAgICAgICAgICAgInN1YmplY3QiOiAiTWlncmF0ZSBjb250cmlidXRvciBhZ3JlZW1lbnRzIHRvIEFsbC1Qcm9qZWN0cy4iCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICAiYXV0aG9yIjogeworICAgICAgICAgICAgICAibmFtZSI6ICJTaGF3biBPLiBQZWFyY2UiLAorICAgICAgICAgICAgICAiZW1haWwiOiAic29wQGdvb2dsZS5jb20iLAorICAgICAgICAgICAgICAiZGF0ZSI6ICIyMDEyLTA0LTI0IDE4OjA4OjA4LjAwMDAwMDAwMCIsCisgICAgICAgICAgICAgICJ0eiI6IC00MjAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiY29tbWl0dGVyIjogeworICAgICAgICAgICAgICAibmFtZSI6ICJTaGF3biBPLiBQZWFyY2UiLAorICAgICAgICAgICAgICAiZW1haWwiOiAic29wQGdvb2dsZS5jb20iLAorICAgICAgICAgICAgICAiZGF0ZSI6ICIyMDEyLTA0LTI0IDE4OjA4OjA4LjAwMDAwMDAwMCIsCisgICAgICAgICAgICAgICJ0eiI6IC00MjAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAic3ViamVjdCI6ICJVc2UgYW4gRXZlbnRCdXMgdG8gbWFuYWdlIHN0YXIgaWNvbnMiLAorICAgICAgICAgICAgIm1lc3NhZ2UiOiAiVXNlIGFuIEV2ZW50QnVzIHRvIG1hbmFnZSBzdGFyIGljb25zXG5cbkltYWdlIHdpZGdldHMgdGhhdCBuZWVkIHRvIC4uLiIKKyAgICAgICAgICB9LAorICAgICAgICAgICJmaWxlcyI6IHsKKyAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VDYWNoZS5qYXZhIjogeworICAgICAgICAgICAgICAibGluZXNfZGVsZXRlZCI6IDgKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlRGV0YWlsQ2FjaGUuamF2YSI6IHsKKyAgICAgICAgICAgICAgImxpbmVzX2luc2VydGVkIjogMQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YSI6IHsKKyAgICAgICAgICAgICAgImxpbmVzX2luc2VydGVkIjogMTEsCisgICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogMTkKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlVGFibGUuamF2YSI6IHsKKyAgICAgICAgICAgICAgImxpbmVzX2luc2VydGVkIjogMjMsCisgICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogMjAKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3RhckNhY2hlLmphdmEiOiB7CisgICAgICAgICAgICAgICJzdGF0dXMiOiAiRCIsCisgICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogMTM5CisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N0YXJyZWRDaGFuZ2VzLmphdmEiOiB7CisgICAgICAgICAgICAgICJzdGF0dXMiOiAiQSIsCisgICAgICAgICAgICAgICJsaW5lc19pbnNlcnRlZCI6IDIwNAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuLmphdmEiOiB7CisgICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogOQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgXQorLS0tLQorCitbW2dldC1jaGFuZ2VdXQorR2V0IENoYW5nZQorfn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0nCisKK1JldHJpZXZlcyBhIGNoYW5nZS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNjaGFuZ2UtaW5mb1tDaGFuZ2VJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBjaGFuZ2UuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAiaWQiOiAibXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInByb2plY3QiOiAibXlQcm9qZWN0IiwKKyAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgImNoYW5nZV9pZCI6ICJJODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInN1YmplY3QiOiAiSW1wbGVtZW50aW5nIEZlYXR1cmUgWCIsCisgICAgInN0YXR1cyI6ICJORVciLAorICAgICJjcmVhdGVkIjogIjIwMTMtMDItMDEgMDk6NTk6MzIuMTI2MDAwMDAwIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTIxIDExOjE2OjM2Ljc3NTAwMDAwMCIsCisgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAiX3NvcnRrZXkiOiAiMDAyMzQxMjQwMDAwMGY3ZCIsCisgICAgIl9udW1iZXIiOiAzOTY1LAorICAgICJvd25lciI6IHsKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIgorICAgIH0KKyAgfQorLS0tLQorCitbW2dldC1jaGFuZ2UtZGV0YWlsXV0KK0dldCBDaGFuZ2UgRGV0YWlsCit+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vZGV0YWlsJworCitSZXRyaWV2ZXMgYSBjaGFuZ2Ugd2l0aCBsaW5rOiNsYWJlbHNbbGFiZWxzXSwgbGluazojZGV0YWlsZWQtbGFiZWxzWworZGV0YWlsZWQgbGFiZWxzXSBhbmQgbGluazojZGV0YWlsZWQtYWNjb3VudHNbZGV0YWlsZWQgYWNjb3VudHNdLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9kZXRhaWwgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNjaGFuZ2UtaW5mb1tDaGFuZ2VJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBjaGFuZ2UuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAiaWQiOiAibXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInByb2plY3QiOiAibXlQcm9qZWN0IiwKKyAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgImNoYW5nZV9pZCI6ICJJODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInN1YmplY3QiOiAiSW1wbGVtZW50aW5nIEZlYXR1cmUgWCIsCisgICAgInN0YXR1cyI6ICJORVciLAorICAgICJjcmVhdGVkIjogIjIwMTMtMDItMDEgMDk6NTk6MzIuMTI2MDAwMDAwIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTIxIDExOjE2OjM2Ljc3NTAwMDAwMCIsCisgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAiX3NvcnRrZXkiOiAiMDAyMzQxMjQwMDAwMGY3ZCIsCisgICAgIl9udW1iZXIiOiAzOTY1LAorICAgICJvd25lciI6IHsKKyAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgfSwKKyAgICAibGFiZWxzIjogeworICAgICAgIlZlcmlmaWVkIjogeworICAgICAgICAiYWxsIjogWworICAgICAgICAgIHsKKyAgICAgICAgICAgICJ2YWx1ZSI6IDAsCisgICAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgInZhbHVlIjogMCwKKyAgICAgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgICAgICAgfQorICAgICAgICBdLAorICAgICAgICAidmFsdWVzIjogeworICAgICAgICAgICItMSI6ICJGYWlscyIsCisgICAgICAgICAgIiAwIjogIk5vIHNjb3JlIiwKKyAgICAgICAgICAiKzEiOiAiVmVyaWZpZWQiCisgICAgICAgIH0KKyAgICAgIH0sCisgICAgICAiQ29kZS1SZXZpZXciOiB7CisgICAgICAgICJyZWNvbW1lbmRlZCI6IHsKKyAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk3LAorICAgICAgICAgICJuYW1lIjogIkphbmUgUm9lIiwKKyAgICAgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgICAgIH0sCisgICAgICAgICJkaXNsaWtlZCI6IHsKKyAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgICAgIH0sCisgICAgICAgICJhbGwiOiBbCisgICAgICAgICAgeworICAgICAgICAgICAgInZhbHVlIjogLTEsCisgICAgICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgICAgICAgIH0sCisgICAgICAgICAgeworICAgICAgICAgICAgInZhbHVlIjogMSwKKyAgICAgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgICAgICAgfQorICAgICAgICBdCisgICAgICAgICJ2YWx1ZXMiOiB7CisgICAgICAgICAgIi0yIjogIkRvIG5vdCBzdWJtaXQiLAorICAgICAgICAgICItMSI6ICJJIHdvdWxkIHByZWZlciB0aGF0IHlvdSBkaWRuXHUwMDI3dCBzdWJtaXQgdGhpcyIsCisgICAgICAgICAgIiAwIjogIk5vIHNjb3JlIiwKKyAgICAgICAgICAiKzEiOiAiTG9va3MgZ29vZCB0byBtZSwgYnV0IHNvbWVvbmUgZWxzZSBtdXN0IGFwcHJvdmUiLAorICAgICAgICAgICIrMiI6ICJMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZCIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0sCisgICAgInBlcm1pdHRlZF9sYWJlbHMiOiB7CisgICAgICAiVmVyaWZpZWQiOiBbCisgICAgICAgICItMSIsCisgICAgICAgICIgMCIsCisgICAgICAgICIrMSIKKyAgICAgIF0sCisgICAgICAiQ29kZS1SZXZpZXciOiBbCisgICAgICAgICItMiIsCisgICAgICAgICItMSIsCisgICAgICAgICIgMCIsCisgICAgICAgICIrMSIsCisgICAgICAgICIrMiIKKyAgICAgIF0KKyAgICB9LAorICAgICJyZW1vdmFibGVfcmV2aWV3ZXJzIjogWworICAgICAgeworICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAgICJuYW1lIjogIkphbmUgUm9lIiwKKyAgICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgICAgfQorICAgIF0KKyAgfQorLS0tLQorCitbW2dldC10b3BpY11dCitHZXQgVG9waWMKK35+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vdG9waWMnCisKK1JldHJpZXZlcyB0aGUgdG9waWMgb2YgYSBjaGFuZ2UuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3RvcGljIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgIkRvY3VtZW50YXRpb24iCistLS0tCisKK0lmIHRoZSBjaGFuZ2UgZG9lcyBub3QgaGF2ZSBhIHRvcGljIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworW1tzZXQtdG9waWNdXQorU2V0IFRvcGljCit+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3RvcGljJworCitTZXRzIHRoZSB0b3BpYyBvZiBhIGNoYW5nZS4KKworVGhlIG5ldyB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkgaW5zaWRlIGEKK2xpbms6I3RvcGljLWlucHV0W1RvcGljSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvdG9waWMgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgInRvcGljIjogIkRvY3VtZW50YXRpb24iCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgdGhlIG5ldyB0b3BpYyBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiRG9jdW1lbnRhdGlvbiIKKy0tLS0KKworSWYgdGhlIHRvcGljIHdhcyBkZWxldGVkIHRoZSByZXNwb25zZSBpcyAiYDIwNCBObyBDb250ZW50YCIuCisKK1tbZGVsZXRlLXRvcGljXV0KK0RlbGV0ZSBUb3BpYworfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnREVMRVRFIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS90b3BpYycKKworRGVsZXRlcyB0aGUgdG9waWMgb2YgYSBjaGFuZ2UuCisKK1RoZSByZXF1ZXN0IGJvZHkgZG9lcyBub3QgbmVlZCB0byBpbmNsdWRlIGEgbGluazojdG9waWMtaW5wdXRbCitUb3BpY0lucHV0XSBlbnRpdHkgaWYgbm8gcmV2aWV3IGNvbW1lbnQgaXMgYWRkZWQuCisKK1BsZWFzZSBub3RlIHRoYXQgc29tZSBwcm94aWVzIHByb2hpYml0IHJlcXVlc3QgYm9kaWVzIGZvciBERUxFVEUKK3JlcXVlc3RzLiBJbiB0aGlzIGNhc2UsIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBjb21taXQgbWVzc2FnZSwgdXNlCitsaW5rOiNzZXQtdG9waWNbUFVUXSB0byBkZWxldGUgdGhlIHRvcGljLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC90b3BpYyBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjA0IE5vIENvbnRlbnQKKy0tLS0KKworW1thYmFuZG9uLWNoYW5nZV1dCitBYmFuZG9uIENoYW5nZQorfn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQT1NUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9hYmFuZG9uJworCitBYmFuZG9ucyBhIGNoYW5nZS4KKworVGhlIHJlcXVlc3QgYm9keSBkb2VzIG5vdCBuZWVkIHRvIGluY2x1ZGUgYSBsaW5rOiNhYmFuZG9uLWlucHV0WworQWJhbmRvbklucHV0XSBlbnRpdHkgaWYgbm8gcmV2aWV3IGNvbW1lbnQgaXMgYWRkZWQuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9hYmFuZG9uIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgYWJhbmRvbmVkIGNoYW5nZS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNjaGFuZ2UiLAorICAgICJpZCI6ICJteVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwIiwKKyAgICAicHJvamVjdCI6ICJteVByb2plY3QiLAorICAgICJicmFuY2giOiAibWFzdGVyIiwKKyAgICAiY2hhbmdlX2lkIjogIkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwIiwKKyAgICAic3ViamVjdCI6ICJJbXBsZW1lbnRpbmcgRmVhdHVyZSBYIiwKKyAgICAic3RhdHVzIjogIkFCQU5ET05FRCIsCisgICAgImNyZWF0ZWQiOiAiMjAxMy0wMi0wMSAwOTo1OTozMi4xMjYwMDAwMDAiLAorICAgICJ1cGRhdGVkIjogIjIwMTMtMDItMjEgMTE6MTY6MzYuNzc1MDAwMDAwIiwKKyAgICAicmV2aWV3ZWQiOiB0cnVlLAorICAgICJtZXJnZWFibGUiOiB0cnVlLAorICAgICJfc29ydGtleSI6ICIwMDIzNDEyNDAwMDAwZjdkIiwKKyAgICAiX251bWJlciI6IDM5NjUsCisgICAgIm93bmVyIjogeworICAgICAgIm5hbWUiOiAiSm9obiBEb2UiCisgICAgfQorICB9CistLS0tCisKK0lmIHRoZSBjaGFuZ2UgY2Fubm90IGJlIGFiYW5kb25lZCBiZWNhdXNlIHRoZSBjaGFuZ2Ugc3RhdGUgZG9lc24ndAorYWxsb3cgYWJhbmRvbmluZyBvZiB0aGUgY2hhbmdlLCB0aGUgcmVzcG9uc2UgaXMgImA0MDkgQ29uZmxpY3RgIiBhbmQKK3RoZSBlcnJvciBtZXNzYWdlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDQwOSBDb25mbGljdAorICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04CisKKyAgY2hhbmdlIGlzIG1lcmdlZAorLS0tLQorCitbW3Jlc3RvcmUtY2hhbmdlXV0KK1Jlc3RvcmUgQ2hhbmdlCit+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3Jlc3RvcmUnCisKK1Jlc3RvcmVzIGEgY2hhbmdlLgorCitUaGUgcmVxdWVzdCBib2R5IGRvZXMgbm90IG5lZWQgdG8gaW5jbHVkZSBhIGxpbms6I3Jlc3RvcmUtaW5wdXRbCitSZXN0b3JlSW5wdXRdIGVudGl0eSBpZiBubyByZXZpZXcgY29tbWVudCBpcyBhZGRlZC4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3Jlc3RvcmUgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNjaGFuZ2UtaW5mb1tDaGFuZ2VJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSByZXN0b3JlZCBjaGFuZ2UuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAiaWQiOiAibXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInByb2plY3QiOiAibXlQcm9qZWN0IiwKKyAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgImNoYW5nZV9pZCI6ICJJODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInN1YmplY3QiOiAiSW1wbGVtZW50aW5nIEZlYXR1cmUgWCIsCisgICAgInN0YXR1cyI6ICJORVciLAorICAgICJjcmVhdGVkIjogIjIwMTMtMDItMDEgMDk6NTk6MzIuMTI2MDAwMDAwIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTIxIDExOjE2OjM2Ljc3NTAwMDAwMCIsCisgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAiX3NvcnRrZXkiOiAiMDAyMzQxMjQwMDAwMGY3ZCIsCisgICAgIl9udW1iZXIiOiAzOTY1LAorICAgICJvd25lciI6IHsKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIgorICAgIH0KKyAgfQorLS0tLQorCitJZiB0aGUgY2hhbmdlIGNhbm5vdCBiZSByZXN0b3JlZCBiZWNhdXNlIHRoZSBjaGFuZ2Ugc3RhdGUgZG9lc24ndAorYWxsb3cgcmVzdG9yaW5nIHRoZSBjaGFuZ2UsIHRoZSByZXNwb25zZSBpcyAiYDQwOSBDb25mbGljdGAiIGFuZAordGhlIGVycm9yIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluIHRoZSByZXNwb25zZSBib2R5LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgNDA5IENvbmZsaWN0CisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgKKworICBjaGFuZ2UgaXMgbmV3CistLS0tCisKK1tbcmV2ZXJ0LWNoYW5nZV1dCitSZXZlcnQgQ2hhbmdlCit+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUE9TVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2ZXJ0JworCitSZXZlcnRzIGEgY2hhbmdlLgorCitUaGUgcmVxdWVzdCBib2R5IGRvZXMgbm90IG5lZWQgdG8gaW5jbHVkZSBhIGxpbms6I3JldmVydC1pbnB1dFsKK1JldmVydElucHV0XSBlbnRpdHkgaWYgbm8gcmV2aWV3IGNvbW1lbnQgaXMgYWRkZWQuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZlcnQgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNjaGFuZ2UtaW5mb1tDaGFuZ2VJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSByZXZlcnRpbmcgY2hhbmdlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSIsCisgICAgImlkIjogIm15UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJwcm9qZWN0IjogIm15UHJvamVjdCIsCisgICAgImJyYW5jaCI6ICJtYXN0ZXIiLAorICAgICJjaGFuZ2VfaWQiOiAiSTg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAiLAorICAgICJzdWJqZWN0IjogIlJldmVydCBcIkltcGxlbWVudGluZyBGZWF0dXJlIFhcIiIsCisgICAgInN0YXR1cyI6ICJORVciLAorICAgICJjcmVhdGVkIjogIjIwMTMtMDItMDEgMDk6NTk6MzIuMTI2MDAwMDAwIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTIxIDExOjE2OjM2Ljc3NTAwMDAwMCIsCisgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAibWVyZ2VhYmxlIjogdHJ1ZSwKKyAgICAiX3NvcnRrZXkiOiAiMDAyMzQxMjQwMDAwMGY3ZCIsCisgICAgIl9udW1iZXIiOiAzOTY1LAorICAgICJvd25lciI6IHsKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIgorICAgIH0KKyAgfQorLS0tLQorCitJZiB0aGUgY2hhbmdlIGNhbm5vdCBiZSByZXZlcnRlZCBiZWNhdXNlIHRoZSBjaGFuZ2Ugc3RhdGUgZG9lc24ndAorYWxsb3cgcmV2ZXJ0aW5nIHRoZSBjaGFuZ2UsIHRoZSByZXNwb25zZSBpcyAiYDQwOSBDb25mbGljdGAiIGFuZAordGhlIGVycm9yIG1lc3NhZ2UgaXMgY29udGFpbmVkIGluIHRoZSByZXNwb25zZSBib2R5LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgNDA5IENvbmZsaWN0CisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgKKworICBjaGFuZ2UgaXMgbmV3CistLS0tCisKK1tbc3VibWl0LWNoYW5nZV1dCitTdWJtaXQgQ2hhbmdlCit+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUE9TVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vc3VibWl0JworCitTdWJtaXRzIGEgY2hhbmdlLgorCitUaGUgcmVxdWVzdCBib2R5IG9ubHkgbmVlZHMgdG8gaW5jbHVkZSBhIGxpbms6I3N1Ym1pdC1pbnB1dFsKK1N1Ym1pdElucHV0XSBlbnRpdHkgaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIHdhaXQgZm9yIHRoZSBtZXJnZSB0bworY29tcGxldGUuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9zdWJtaXQgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgIndhaXRfZm9yX21lcmdlIjogdHJ1ZQorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgc3VibWl0dGVkL21lcmdlZCBjaGFuZ2UuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlIiwKKyAgICAiaWQiOiAibXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInByb2plY3QiOiAibXlQcm9qZWN0IiwKKyAgICAiYnJhbmNoIjogIm1hc3RlciIsCisgICAgImNoYW5nZV9pZCI6ICJJODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIsCisgICAgInN1YmplY3QiOiAiSW1wbGVtZW50aW5nIEZlYXR1cmUgWCIsCisgICAgInN0YXR1cyI6ICJNRVJHRUQiLAorICAgICJjcmVhdGVkIjogIjIwMTMtMDItMDEgMDk6NTk6MzIuMTI2MDAwMDAwIiwKKyAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTIxIDExOjE2OjM2Ljc3NTAwMDAwMCIsCisgICAgInJldmlld2VkIjogdHJ1ZSwKKyAgICAiX3NvcnRrZXkiOiAiMDAyMzQxMjQwMDAwMGY3ZCIsCisgICAgIl9udW1iZXIiOiAzOTY1LAorICAgICJvd25lciI6IHsKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIgorICAgIH0KKyAgfQorLS0tLQorCitJZiB0aGUgY2hhbmdlIGNhbm5vdCBiZSBzdWJtaXR0ZWQgYmVjYXVzZSB0aGUgc3VibWl0IHJ1bGUgZG9lc24ndCBhbGxvdworc3VibWl0dGluZyB0aGUgY2hhbmdlLCB0aGUgcmVzcG9uc2UgaXMgImA0MDkgQ29uZmxpY3RgIiBhbmQgdGhlIGVycm9yCittZXNzYWdlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDQwOSBDb25mbGljdAorICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtjaGFyc2V0PVVURi04CisKKyAgYmxvY2tlZCBieSBWZXJpZmllZAorLS0tLQorCitbW3Jldmlld2VyLWVuZHBvaW50c11dCitSZXZpZXdlciBFbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2xpc3QtcmV2aWV3ZXJzXV0KK0xpc3QgUmV2aWV3ZXJzCit+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aWV3ZXJzLycKKworTGlzdHMgdGhlIHJldmlld2VycyBvZiBhIGNoYW5nZS4KKworQXMgcmVzdWx0IGEgbGlzdCBvZiBsaW5rOiNyZXZpZXdlci1pbmZvW1Jldmlld2VySW5mb10gZW50cmllcyBpcyByZXR1cm5lZC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aWV3ZXJzLyBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Jldmlld2VyIiwKKyAgICAgICJhcHByb3ZhbHMiOiB7CisgICAgICAgICJWZXJpZmllZCI6ICIrMSIsCisgICAgICAgICJDb2RlLVJldmlldyI6ICIrMiIKKyAgICAgIH0sCisgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgIH0sCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNyZXZpZXdlciIsCisgICAgICAiYXBwcm92YWxzIjogeworICAgICAgICAiVmVyaWZpZWQiOiAiIDAiLAorICAgICAgICAiQ29kZS1SZXZpZXciOiAiLTEiCisgICAgICB9LAorICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NywKKyAgICAgICJuYW1lIjogIkphbmUgUm9lIiwKKyAgICAgICJlbWFpbCI6ICJqYW5lLnJvZUBleGFtcGxlLmNvbSIKKyAgICB9CisgIF0KKy0tLS0KKworW1tnZXQtcmV2aWV3ZXJdXQorR2V0IFJldmlld2VyCit+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3Jldmlld2Vycy9saW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0nCisKK1JldHJpZXZlcyBhIHJldmlld2VyIG9mIGEgY2hhbmdlLgorCitBcyByZXNwb25zZSBhIGxpbms6I3Jldmlld2VyLWluZm9bUmV2aWV3ZXJJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSByZXZpZXdlci4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aWV3ZXJzL2pvaG4uZG9lQGV4YW1wbGUuY29tIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcmV2aWV3ZXIiLAorICAgICJhcHByb3ZhbHMiOiB7CisgICAgICAiVmVyaWZpZWQiOiAiKzEiLAorICAgICAgIkNvZGUtUmV2aWV3IjogIisyIgorICAgIH0sCisgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICB9CistLS0tCisKK1tbYWRkLXJldmlld2VyXV0KK0FkZCBSZXZpZXdlcgorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUE9TVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aWV3ZXJzJworCitBZGRzIG9uZSB1c2VyIG9yIGFsbCBtZW1iZXJzIG9mIG9uZSBncm91cCBhcyByZXZpZXdlciB0byB0aGUgY2hhbmdlLgorCitUaGUgcmV2aWV3ZXIgdG8gYmUgYWRkZWQgdG8gdGhlIGNoYW5nZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0Citib2R5IGFzIGEgbGluazojcmV2aWV3ZXItaW5wdXRbUmV2aWV3ZXJJbnB1dF0gZW50aXR5LgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aWV3ZXJzIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJyZXZpZXdlciI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhbiBsaW5rOiNhZGQtcmV2aWV3ZXItcmVzdWx0W0FkZFJldmlld2VyUmVzdWx0XSBlbnRpdHkgaXMKK3JldHVybmVkIHRoYXQgZGVzY3JpYmVzIHRoZSBuZXdseSBhZGRlZCByZXZpZXdlcnMuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJyZXZpZXdlcnMiOiBbCisgICAgICB7CisgICAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcmV2aWV3ZXIiLAorICAgICAgICAiYXBwcm92YWxzIjogeworICAgICAgICAgICJWZXJpZmllZCI6ICIgMCIsCisgICAgICAgICAgIkNvZGUtUmV2aWV3IjogIiAwIgorICAgICAgICB9LAorICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICAgIH0KKyAgICBdCisgIH0KKy0tLS0KKworSWYgYSBncm91cCBpcyBzcGVjaWZpZWQsIGFkZGluZyB0aGUgZ3JvdXAgbWVtYmVycyBhcyByZXZpZXdlcnMgaXMgYW4KK2F0b21pYyBvcGVyYXRpb24uIFRoaXMgbWVhbnMgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIG5vbmUgb2YgdGhlCittZW1iZXJzIGFyZSBhZGRlZCBhcyByZXZpZXdlci4KKworSWYgYSBncm91cCB3aXRoIG1hbnkgbWVtYmVycyBpcyBhZGRlZCBhcyByZXZpZXdlciBhIGNvbmZpcm1hdGlvbiBtYXkgYmUKK3JlcXVpcmVkLgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aWV3ZXJzIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJyZXZpZXdlciI6ICJNeVByb2plY3RWZXJpZmllcnMiCisgIH0KKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImVycm9yIjogIlRoZSBncm91cCBNeSBHcm91cCBoYXMgMTUgbWVtYmVycy4gRG8geW91IHdhbnQgdG8gYWRkIHRoZW0gYWxsIGFzIHJldmlld2Vycz8iLAorICAgICJjb25maXJtIjogdHJ1ZQorICB9CistLS0tCisKK1RvIGNvbmZpcm0gdGhlIGFkZGl0aW9uIG9mIHRoZSByZXZpZXdlcnMsIHJlc2VuZCB0aGUgcmVxdWVzdCB3aXRoIHRoZQorYGNvbmZpcm1lZGAgZmxhZyBiZWluZyBzZXQuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpZXdlcnMgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgInJldmlld2VyIjogIk15UHJvamVjdFZlcmlmaWVycyIsCisgICAgImNvbmZpcm1lZCI6IHRydWUKKyAgfQorLS0tLQorCitbW2RlbGV0ZS1yZXZpZXdlcl1dCitEZWxldGUgUmV2aWV3ZXIKK35+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0RFTEVURSAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aWV3ZXJzL2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWlkW1x7YWNjb3VudC1pZFx9XScKKworRGVsZXRlcyBhIHJldmlld2VyIGZyb20gYSBjaGFuZ2UuCisKKy5SZXF1ZXN0CistLS0tCisgIERFTEVURSAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3Jldmlld2Vycy9Kb2huJTIwRG9lIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDQgTm8gQ29udGVudAorLS0tLQorCitbW3JldmlzaW9uLWVuZHBvaW50c11dCitSZXZpc2lvbiBFbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitbW2dldC1yZXZpZXddXQorR2V0IFJldmlldworfn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aXNpb25zL2xpbms6I3JldmlzaW9uLWlkW1x7cmV2aXNpb24taWRcfV0vcmV2aWV3JworCitSZXRyaWV2ZXMgYSByZXZpZXcgb2YgYSByZXZpc2lvbi4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zLzY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEvcmV2aWV3IEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojY2hhbmdlLWluZm9bQ2hhbmdlSW5mb10gZW50aXR5IHdpdGgKK2xpbms6I2RldGFpbGVkLWxhYmVsc1tkZXRhaWxlZCBsYWJlbHNdIGFuZCBsaW5rOiNkZXRhaWxlZC1hY2NvdW50c1sKK2RldGFpbGVkIGFjY291bnRzXSBpcyByZXR1cm5lZCB0aGF0IGRlc2NyaWJlcyB0aGUgcmV2aWV3IG9mIHRoZQorcmV2aXNpb24uIFRoZSByZXZpc2lvbiBmb3Igd2hpY2ggdGhlIHJldmlldyBpcyByZXRyaWV2ZWQgaXMgY29udGFpbmVkCitpbiB0aGUgYHJldmlzaW9uc2AgZmllbGQuIEluIGFkZGl0aW9uIHRoZSBgY3VycmVudF9yZXZpc2lvbmAgZmllbGQgaXMKK3NldCBpZiB0aGUgcmV2aXNpb24gZm9yIHdoaWNoIHRoZSByZXZpZXcgaXMgcmV0cmlldmVkIGlzIHRoZSBjdXJyZW50CityZXZpc2lvbiBvZiB0aGUgY2hhbmdlLiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSByZXR1cm5lZCBsYWJlbHMgYXJlIGFsd2F5cworZm9yIHRoZSBjdXJyZW50IHBhdGNoIHNldC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNjaGFuZ2UiLAorICAgICJpZCI6ICJteVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwIiwKKyAgICAicHJvamVjdCI6ICJteVByb2plY3QiLAorICAgICJicmFuY2giOiAibWFzdGVyIiwKKyAgICAiY2hhbmdlX2lkIjogIkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwIiwKKyAgICAic3ViamVjdCI6ICJJbXBsZW1lbnRpbmcgRmVhdHVyZSBYIiwKKyAgICAic3RhdHVzIjogIk5FVyIsCisgICAgImNyZWF0ZWQiOiAiMjAxMy0wMi0wMSAwOTo1OTozMi4xMjYwMDAwMDAiLAorICAgICJ1cGRhdGVkIjogIjIwMTMtMDItMjEgMTE6MTY6MzYuNzc1MDAwMDAwIiwKKyAgICAicmV2aWV3ZWQiOiB0cnVlLAorICAgICJtZXJnZWFibGUiOiB0cnVlLAorICAgICJfc29ydGtleSI6ICIwMDIzNDEyNDAwMDAwZjdkIiwKKyAgICAiX251bWJlciI6IDM5NjUsCisgICAgIm93bmVyIjogeworICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICB9LAorICAgICJsYWJlbHMiOiB7CisgICAgICAiVmVyaWZpZWQiOiB7CisgICAgICAgICJhbGwiOiBbCisgICAgICAgICAgeworICAgICAgICAgICAgInZhbHVlIjogMCwKKyAgICAgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgICAgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgICAgICAgfSwKKyAgICAgICAgICB7CisgICAgICAgICAgICAidmFsdWUiOiAwLAorICAgICAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NywKKyAgICAgICAgICAgICJuYW1lIjogIkphbmUgUm9lIiwKKyAgICAgICAgICAgICJlbWFpbCI6ICJqYW5lLnJvZUBleGFtcGxlLmNvbSIKKyAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgICAgICJ2YWx1ZXMiOiB7CisgICAgICAgICAgIi0xIjogIkZhaWxzIiwKKyAgICAgICAgICAiIDAiOiAiTm8gc2NvcmUiLAorICAgICAgICAgICIrMSI6ICJWZXJpZmllZCIKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgICJDb2RlLVJldmlldyI6IHsKKyAgICAgICAgImFsbCI6IFsKKyAgICAgICAgICB7CisgICAgICAgICAgICAidmFsdWUiOiAtMSwKKyAgICAgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgICAgICAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgICAgICAgICAiZW1haWwiOiAiam9obi5kb2VAZXhhbXBsZS5jb20iCisgICAgICAgICAgfSwKKyAgICAgICAgICB7CisgICAgICAgICAgICAidmFsdWUiOiAxLAorICAgICAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NywKKyAgICAgICAgICAgICJuYW1lIjogIkphbmUgUm9lIiwKKyAgICAgICAgICAgICJlbWFpbCI6ICJqYW5lLnJvZUBleGFtcGxlLmNvbSIKKyAgICAgICAgICB9CisgICAgICAgIF0KKyAgICAgICAgInZhbHVlcyI6IHsKKyAgICAgICAgICAiLTIiOiAiRG8gbm90IHN1Ym1pdCIsCisgICAgICAgICAgIi0xIjogIkkgd291bGQgcHJlZmVyIHRoYXQgeW91IGRpZG5cdTAwMjd0IHN1Ym1pdCB0aGlzIiwKKyAgICAgICAgICAiIDAiOiAiTm8gc2NvcmUiLAorICAgICAgICAgICIrMSI6ICJMb29rcyBnb29kIHRvIG1lLCBidXQgc29tZW9uZSBlbHNlIG11c3QgYXBwcm92ZSIsCisgICAgICAgICAgIisyIjogIkxvb2tzIGdvb2QgdG8gbWUsIGFwcHJvdmVkIgorICAgICAgICB9CisgICAgICB9CisgICAgfSwKKyAgICAicGVybWl0dGVkX2xhYmVscyI6IHsKKyAgICAgICJWZXJpZmllZCI6IFsKKyAgICAgICAgIi0xIiwKKyAgICAgICAgIiAwIiwKKyAgICAgICAgIisxIgorICAgICAgXSwKKyAgICAgICJDb2RlLVJldmlldyI6IFsKKyAgICAgICAgIi0yIiwKKyAgICAgICAgIi0xIiwKKyAgICAgICAgIiAwIiwKKyAgICAgICAgIisxIiwKKyAgICAgICAgIisyIgorICAgICAgXQorICAgIH0sCisgICAgInJlbW92YWJsZV9yZXZpZXdlcnMiOiBbCisgICAgICB7CisgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NywKKyAgICAgICAgIm5hbWUiOiAiSmFuZSBSb2UiLAorICAgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgICB9CisgICAgXSwKKyAgICAiY3VycmVudF9yZXZpc2lvbiI6ICI2NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxIiwKKyAgICAicmV2aXNpb25zIjogeworICAgICAgIjY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEiOiB7CisgICAgICAiX251bWJlciI6IDIsCisgICAgICAiZmV0Y2giOiB7CisgICAgICAgICJodHRwIjogeworICAgICAgICAgICJ1cmwiOiAiaHR0cDovL2dlcnJpdC9teVByb2plY3QiLAorICAgICAgICAgICJyZWYiOiAicmVmcy9jaGFuZ2VzLzY1LzM5NjUvMiIKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorLS0tLQorCitbW3NldC1yZXZpZXddXQorU2V0IFJldmlldworfn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL3JldmlldycKKworU2V0cyBhIHJldmlldyBvbiBhIHJldmlzaW9uLgorCitUaGUgcmV2aWV3IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYm9keSBhcyBhCitsaW5rOiNyZXZpZXctaW5wdXRbUmV2aWV3SW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3JldmlzaW9ucy82NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxL3JldmlldyBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAibWVzc2FnZSI6ICJTb21lIG5pdHMgbmVlZCB0byBiZSBmaXhlZC4iLAorICAgICJsYWJlbHMiOiB7CisgICAgICAiQ29kZS1SZXZpZXciOiAtMQorICAgIH0sCisgICAgImNvbW1lbnRzIjogeworICAgICAgImdlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEiOiBbCisgICAgICAgIHsKKyAgICAgICAgICAibGluZSI6IDIzLAorICAgICAgICAgICJtZXNzYWdlIjogIltuaXRdIHRyYWlsaW5nIHdoaXRlc3BhY2UiCisgICAgICAgIH0sCisgICAgICAgIHsKKyAgICAgICAgICAibGluZSI6IDQ5LAorICAgICAgICAgICJtZXNzYWdlIjogIltuaXRdIHMvY29ucnRvbC9jb250cm9sIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojcmV2aWV3LWluZm9bUmV2aWV3SW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgYXBwbGllZCBsYWJlbHMuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJsYWJlbHMiOiB7CisgICAgICAiQ29kZS1SZXZpZXciOiAtMQorICAgIH0KKyAgfQorLS0tLQorCitbW3N1Ym1pdC1yZXZpc2lvbl1dCitTdWJtaXQgUmV2aXNpb24KK35+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL3N1Ym1pdCcKKworU3VibWl0cyBhIHJldmlzaW9uLgorCitUaGUgcmVxdWVzdCBib2R5IG9ubHkgbmVlZHMgdG8gaW5jbHVkZSBhIGxpbms6I3N1Ym1pdC1pbnB1dFsKK1N1Ym1pdElucHV0XSBlbnRpdHkgaWYgdGhlIHJlcXVlc3Qgc2hvdWxkIHdhaXQgZm9yIHRoZSBtZXJnZSB0bworY29tcGxldGUuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMS9zdWJtaXQgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgIndhaXRfZm9yX21lcmdlIjogdHJ1ZQorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojc3VibWl0LWluZm9bU3VibWl0SW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgc3RhdHVzIG9mIHRoZSBzdWJtaXR0ZWQgY2hhbmdlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAic3RhdHVzIjogIk1FUkdFRCIKKyAgfQorLS0tLQorCitJZiB0aGUgcmV2aXNpb24gY2Fubm90IGJlIHN1Ym1pdHRlZCwgZS5nLiBiZWNhdXNlIHRoZSBzdWJtaXQgcnVsZQorZG9lc24ndCBhbGxvdyBzdWJtaXR0aW5nIHRoZSByZXZpc2lvbiBvciB0aGUgcmV2aXNpb24gaXMgbm90IHRoZQorY3VycmVudCByZXZpc2lvbiwgdGhlIHJlc3BvbnNlIGlzICJgNDA5IENvbmZsaWN0YCIgYW5kIHRoZSBlcnJvcgorbWVzc2FnZSBpcyBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSA0MDkgQ29uZmxpY3QKKyAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgKKworICAicmV2aXNpb24gNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMSBpcyBub3QgY3VycmVudCByZXZpc2lvbiIKKy0tLS0KKworW1tnZXQtc3VibWl0LXR5cGVdXQorR2V0IFN1Ym1pdCBUeXBlCit+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL3N1Ym1pdF90eXBlJworCitHZXRzIHRoZSBtZXRob2QgdGhlIHNlcnZlciB3aWxsIHVzZSB0byBzdWJtaXQgKG1lcmdlKSB0aGUgY2hhbmdlLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvY3VycmVudC9zdWJtaXRfdHlwZSBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJNRVJHRV9JRl9ORUNFU1NBUlkiCistLS0tCisKK1tbdGVzdC1zdWJtaXQtdHlwZV1dCitUZXN0IFN1Ym1pdCBUeXBlCit+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUE9TVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aXNpb25zL2xpbms6I3JldmlzaW9uLWlkW1x7cmV2aXNpb24taWRcfV0vdGVzdC5zdWJtaXRfdHlwZScKKworVGVzdHMgdGhlIHN1Ym1pdF90eXBlIFByb2xvZyBydWxlIGluIHRoZSBwcm9qZWN0LCBvciB0aGUgb25lIGdpdmVuLgorCitSZXF1ZXN0IGJvZHkgbWF5IGJlIGVpdGhlciB0aGUgUHJvbG9nIGNvZGUgYXMgYHRleHQvcGxhaW5gIG9yIGEKK2xpbms6I3J1bGUtaW5wdXRbUnVsZUlucHV0XSBvYmplY3QuIFRoZSBxdWVyeSBwYXJhbWV0ZXIgYGZpbHRlcnNgCittYXkgYmUgc2V0IHRvIGBTS0lQYCB0byBieXBhc3MgcGFyZW50IHByb2plY3QgZmlsdGVycyB3aGlsZSB0ZXN0aW5nCithIHByb2plY3Qtc3BlY2lmaWMgcnVsZS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3JldmlzaW9ucy9jdXJyZW50L3Rlc3Quc3VibWl0X3R5cGUgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluO2NoYXJzZXQtVVRGLTgKKworICBzdWJtaXRfdHlwZShjaGVycnlfcGljaykuCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgImNoZXJyeV9waWNrIgorLS0tLQorCitbW3Rlc3Qtc3VibWl0LXJ1bGVdXQorVGVzdCBTdWJtaXQgUnVsZQorfn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL3Rlc3Quc3VibWl0X3J1bGUnCisKK1Rlc3RzIHRoZSBzdWJtaXRfcnVsZSBQcm9sb2cgcnVsZSBpbiB0aGUgcHJvamVjdCwgb3IgdGhlIG9uZSBnaXZlbi4KKworUmVxdWVzdCBib2R5IG1heSBiZSBlaXRoZXIgdGhlIFByb2xvZyBjb2RlIGFzIGB0ZXh0L3BsYWluYCBvciBhCitsaW5rOiNydWxlLWlucHV0W1J1bGVJbnB1dF0gb2JqZWN0LiBUaGUgcXVlcnkgcGFyYW1ldGVyIGBmaWx0ZXJzYAorbWF5IGJlIHNldCB0byBgU0tJUGAgdG8gYnlwYXNzIHBhcmVudCBwcm9qZWN0IGZpbHRlcnMgd2hpbGUgdGVzdGluZworYSBwcm9qZWN0LXNwZWNpZmljIHJ1bGUuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvY3VycmVudC90ZXN0LnN1Ym1pdF90eXBlP2ZpbHRlcnM9U0tJUCBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IHRleHQvcGxhaW47Y2hhcnNldC1VVEYtOAorCisgIHN1Ym1pdF9ydWxlKHN1Ym1pdChSKSkgOi0KKyAgICBSID0gbGFiZWwoJ0FueS1MYWJlbC1OYW1lJywgcmVqZWN0KF8pKS4KKy0tLS0KKworVGhlIHJlc3BvbnNlIGlzIGEgbGlzdCBvZiBsaW5rOiNzdWJtaXQtcmVjb3JkW1N1Ym1pdFJlY29yZF0gZW50cmllcworZGVzY3JpYmluZyB0aGUgcGVybXV0YXRpb25zIHRoYXQgc2F0aXNmeSB0aGUgdGVzdGVkIHN1Ym1pdCBydWxlLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAic3RhdHVzIjogIk5PVF9SRUFEWSIsCisgICAgICAicmVqZWN0IjogeworICAgICAgICAiQW55LUxhYmVsLU5hbWUiOiB7fQorICAgICAgfQorICAgIH0KKyAgXQorLS0tLQorCitbW2xpc3QtZHJhZnRzXV0KK0xpc3QgRHJhZnRzCit+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aXNpb25zL2xpbms6I3JldmlzaW9uLWlkW1x7cmV2aXNpb24taWRcfV0vZHJhZnRzLycKKworTGlzdHMgdGhlIGRyYWZ0IGNvbW1lbnRzIG9mIGEgcmV2aXNpb24gdGhhdCBiZWxvbmcgdG8gdGhlIGNhbGxpbmcKK3VzZXIuCisKK0FzIHJlc3VsdCBhIG1hcCBpcyByZXR1cm5lZCB0aGF0IG1hcHMgdGhlIGZpbGUgcGF0aCB0byBhIGxpc3Qgb2YKK2xpbms6I2NvbW1lbnQtaW5mb1tDb21tZW50SW5mb10gZW50cmllcy4gVGhlIGVudHJpZXMgaW4gdGhlIG1hcCBhcmUKK3NvcnRlZCBieSBmaWxlIHBhdGguCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3JldmlzaW9ucy82NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxL2RyYWZ0cy8gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImdlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEiOiBbCisgICAgICB7CisgICAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCIsCisgICAgICAgICJpZCI6ICJUdmNYcm1qTSIsCisgICAgICAgICJsaW5lIjogMjMsCisgICAgICAgICJtZXNzYWdlIjogIltuaXRdIHRyYWlsaW5nIHdoaXRlc3BhY2UiLAorICAgICAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTI2IDE1OjQwOjQzLjk4NjAwMDAwMCIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCIsCisgICAgICAgICJpZCI6ICJUdmVYd0ZpQSIsCisgICAgICAgICJsaW5lIjogNDksCisgICAgICAgICJpbl9yZXBseV90byI6ICJUZllYLUl1byIsCisgICAgICAgICJtZXNzYWdlIjogIkRvbmUiLAorICAgICAgICAidXBkYXRlZCI6ICIyMDEzLTAyLTI2IDE1OjQwOjQ1LjMyODAwMDAwMCIKKyAgICAgIH0KKyAgICBdCisgIH0KKy0tLS0KKworW1tjcmVhdGUtZHJhZnRdXQorQ3JlYXRlIERyYWZ0Cit+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL2RyYWZ0cycKKworQ3JlYXRlcyBhIGRyYWZ0IGNvbW1lbnQgb24gYSByZXZpc2lvbi4KKworVGhlIG5ldyBkcmFmdCBjb21tZW50IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYm9keSBpbnNpZGUgYQorbGluazojY29tbWVudC1pbnB1dFtDb21tZW50SW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zLzY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEvZHJhZnRzIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJwYXRoIjogImdlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEiLAorICAgICJsaW5lIjogMjMsCisgICAgIm1lc3NhZ2UiOiAiW25pdF0gdHJhaWxpbmcgd2hpdGVzcGFjZSIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2NvbW1lbnQtaW5mb1tDb21tZW50SW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgZHJhZnQgY29tbWVudC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNjb21tZW50IiwKKyAgICAiaWQiOiAiVHZjWHJtak0iLAorICAgICJwYXRoIjogImdlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEiLAorICAgICJsaW5lIjogMjMsCisgICAgIm1lc3NhZ2UiOiAiW25pdF0gdHJhaWxpbmcgd2hpdGVzcGFjZSIsCisgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yNiAxNTo0MDo0My45ODYwMDAwMDAiCisgIH0KKy0tLS0KKworW1tnZXQtZHJhZnRdXQorR2V0IERyYWZ0Cit+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL2RyYWZ0cy9saW5rOiNkcmFmdC1pZFtce2RyYWZ0LWlkXH1dJworCitSZXRyaWV2ZXMgYSBkcmFmdCBjb21tZW50IG9mIGEgcmV2aXNpb24gdGhhdCBiZWxvbmdzIHRvIHRoZSBjYWxsaW5nCit1c2VyLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMS9kcmFmdHMvVHZjWHJtak0gSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNjb21tZW50LWluZm9bQ29tbWVudEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGRyYWZ0IGNvbW1lbnQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCIsCisgICAgImlkIjogIlR2Y1hybWpNIiwKKyAgICAicGF0aCI6ICJnZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIiwKKyAgICAibGluZSI6IDIzLAorICAgICJtZXNzYWdlIjogIltuaXRdIHRyYWlsaW5nIHdoaXRlc3BhY2UiLAorICAgICJ1cGRhdGVkIjogIjIwMTMtMDItMjYgMTU6NDA6NDMuOTg2MDAwMDAwIgorICB9CistLS0tCisKK1tbdXBkYXRlLWRyYWZ0XV0KK1VwZGF0ZSBEcmFmdAorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9jaGFuZ2VzL2xpbms6I2NoYW5nZS1pZFtce2NoYW5nZS1pZFx9XS9yZXZpc2lvbnMvbGluazojcmV2aXNpb24taWRbXHtyZXZpc2lvbi1pZFx9XS9kcmFmdHMvbGluazojZHJhZnQtaWRbXHtkcmFmdC1pZFx9XScKKworVXBkYXRlcyBhIGRyYWZ0IGNvbW1lbnQgb24gYSByZXZpc2lvbi4KKworVGhlIG5ldyBkcmFmdCBjb21tZW50IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYm9keSBpbnNpZGUgYQorbGluazojY29tbWVudC1pbnB1dFtDb21tZW50SW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9jaGFuZ2VzL215UHJvamVjdH5tYXN0ZXJ+STg0NzNiOTU5MzRiNTczMmFjNTVkMjYzMTFhNzA2YzljMmJkZTk5NDAvcmV2aXNpb25zLzY3NGFjNzU0ZjkxZTY0YTBlZmI4MDg3ZTU5YTE3NjQ4NGJkNTM0ZDEvZHJhZnRzL1R2Y1hybWpNIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJwYXRoIjogImdlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEiLAorICAgICJsaW5lIjogMjMsCisgICAgIm1lc3NhZ2UiOiAiW25pdF0gdHJhaWxpbmcgd2hpdGVzcGFjZSIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2NvbW1lbnQtaW5mb1tDb21tZW50SW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgZHJhZnQgY29tbWVudC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNjb21tZW50IiwKKyAgICAiaWQiOiAiVHZjWHJtak0iLAorICAgICJwYXRoIjogImdlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEiLAorICAgICJsaW5lIjogMjMsCisgICAgIm1lc3NhZ2UiOiAiW25pdF0gdHJhaWxpbmcgd2hpdGVzcGFjZSIsCisgICAgInVwZGF0ZWQiOiAiMjAxMy0wMi0yNiAxNTo0MDo0My45ODYwMDAwMDAiCisgIH0KKy0tLS0KKworW1tkZWxldGUtZHJhZnRdXQorRGVsZXRlIERyYWZ0Cit+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydERUxFVEUgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL2RyYWZ0cy9saW5rOiNkcmFmdC1pZFtce2RyYWZ0LWlkXH1dJworCitEZWxldGVzIGEgZHJhZnQgY29tbWVudCBmcm9tIGEgcmV2aXNpb24uCisKKy5SZXF1ZXN0CistLS0tCisgIERFTEVURSAvY2hhbmdlcy9teVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwL3JldmlzaW9ucy82NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxL2RyYWZ0cy9UdmNYcm1qTSBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjA0IE5vIENvbnRlbnQKKy0tLS0KKworW1tzZXQtcmV2aWV3ZWRdXQorU2V0IFJldmlld2VkCit+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2NoYW5nZXMvbGluazojY2hhbmdlLWlkW1x7Y2hhbmdlLWlkXH1dL3JldmlzaW9ucy9saW5rOiNyZXZpc2lvbi1pZFtce3JldmlzaW9uLWlkXH1dL2ZpbGVzL2xpbms6I3BhdGNoLWlkW1x7cGF0Y2gtaWRcfV0vcmV2aWV3ZWQnCisKK01hcmtzIGEgcGF0Y2ggb2YgYSByZXZpc2lvbiBhcyByZXZpZXdlZCBieSB0aGUgY2FsbGluZyB1c2VyLgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMS9maWxlcy9nZXJyaXQtc2VydmVyJTJGc3JjJTJGbWFpbiUyRmphdmElMkZjb20lMkZnb29nbGUlMkZnZXJyaXQlMkZzZXJ2ZXIlMkZwcm9qZWN0JTJGUmVmQ29udHJvbC5qYXZhL3Jldmlld2VkIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDEgQ3JlYXRlZAorLS0tLQorCitJZiB0aGUgcGF0Y2ggd2FzIGFscmVhZHkgbWFya2VkIGFzIHJldmlld2VkIGJ5IHRoZSBjYWxsaW5nIHVzZXIgdGhlCityZXNwb25zZSBpcyAiYDIwMCBPS2AiLgorCitbW2RlbGV0ZS1yZXZpZXdlZF1dCitEZWxldGUgUmV2aWV3ZWQKK35+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0RFTEVURSAvY2hhbmdlcy9saW5rOiNjaGFuZ2UtaWRbXHtjaGFuZ2UtaWRcfV0vcmV2aXNpb25zL2xpbms6I3JldmlzaW9uLWlkW1x7cmV2aXNpb24taWRcfV0vZmlsZXMvbGluazojcGF0Y2gtaWRbXHtwYXRjaC1pZFx9XS9yZXZpZXdlZCcKKworRGVsZXRlcyB0aGUgcmV2aWV3ZWQgZmxhZyBvZiB0aGUgY2FsbGluZyB1c2VyIGZyb20gYSBwYXRjaCBvZiBhIHJldmlzaW9uLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL2NoYW5nZXMvbXlQcm9qZWN0fm1hc3Rlcn5JODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MC9yZXZpc2lvbnMvNjc0YWM3NTRmOTFlNjRhMGVmYjgwODdlNTlhMTc2NDg0YmQ1MzRkMS9maWxlcy9nZXJyaXQtc2VydmVyJTJGc3JjJTJGbWFpbiUyRmphdmElMkZjb20lMkZnb29nbGUlMkZnZXJyaXQlMkZzZXJ2ZXIlMkZwcm9qZWN0JTJGUmVmQ29udHJvbC5qYXZhL3Jldmlld2VkIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDQgTm8gQ29udGVudAorLS0tLQorCisKK1tbaWRzXV0KK0lEcworLS0tCisKK1tbYWNjb3VudC1pZF1dCitsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLS0KKy0tCisKK1tbY2hhbmdlLWlkXV0KK1x7Y2hhbmdlLWlkXH0KK35+fn5+fn5+fn5+fn4KK0lkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIG9uZSBjaGFuZ2UuCisKK1RoaXMgY2FuIGJlOgorCisqIGFuIElEIG9mIHRoZSBjaGFuZ2UgaW4gdGhlIGZvcm1hdCAiJyQkPHByb2plY3Q+fjxicmFuY2g+fjxDaGFuZ2UtSWQ+JCQnIiwKKyAgd2hlcmUgZm9yIHRoZSBicmFuY2ggdGhlIGByZWZzL2hlYWRzL2AgcHJlZml4IGNhbiBiZSBvbWl0dGVkCisgICgiJCRteVByb2plY3R+bWFzdGVyfkk4NDczYjk1OTM0YjU3MzJhYzU1ZDI2MzExYTcwNmM5YzJiZGU5OTQwJCQiKQorKiBhIENoYW5nZS1JZCBpZiBpdCB1bmlxdWVseSBpZGVudGlmaWVzIG9uZSBjaGFuZ2UKKyAgKCJJODQ3M2I5NTkzNGI1NzMyYWM1NWQyNjMxMWE3MDZjOWMyYmRlOTk0MCIpCisqIGEgbGVnYWN5IG51bWVyaWMgY2hhbmdlIElEICgiNDI0NyIpCisKK1tbZHJhZnQtaWRdXQorXHtkcmFmdC1pZFx9Cit+fn5+fn5+fn5+fn4KK1VVSUQgb2YgYSBkcmFmdCBjb21tZW50LgorCitbW3BhdGNoLWlkXV0KK1x7cGF0Y2gtaWRcfQorfn5+fn5+fn5+fn5+CitUaGUgZmlsZSBwYXRoIG9mIHRoZSBwYXRjaC4KKworW1tyZXZpc2lvbi1pZF1dCitce3JldmlzaW9uLWlkXH0KK35+fn5+fn5+fn5+fn5+fgorSWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgb25lIHJldmlzaW9uIG9mIGEgY2hhbmdlLgorCitUaGlzIGNhbiBiZToKKworKiB0aGUgbGl0ZXJhbCBgY3VycmVudGAgdG8gbmFtZSB0aGUgY3VycmVudCBwYXRjaCBzZXQvcmV2aXNpb24KKyogYSBjb21taXQgSUQgKCI2NzRhYzc1NGY5MWU2NGEwZWZiODA4N2U1OWExNzY0ODRiZDUzNGQxIikKKyogYW4gYWJicmV2aWF0ZWQgY29tbWl0IElEIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBvbmUgcmV2aXNpb24gb2YgdGhlCisgIGNoYW5nZSAoIjY3NGFjNzU0IiksIGF0IGxlYXN0IDQgZGlnaXRzIGFyZSByZXF1aXJlZAorKiBhIGxlZ2FjeSBudW1lcmljIHBhdGNoIG51bWJlciAoIjEiIGZvciBmaXJzdCBwYXRjaCBzZXQgb2YgdGhlIGNoYW5nZSkKKworCitbW2pzb24tZW50aXRpZXNdXQorSlNPTiBFbnRpdGllcworLS0tLS0tLS0tLS0tLQorCitbW2FiYW5kb24taW5wdXRdXQorQWJhbmRvbklucHV0Cit+fn5+fn5+fn5+fn4KK1RoZSBgQWJhbmRvbklucHV0YCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGFiYW5kb25pbmcgYSBjaGFuZ2UuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YG1lc3NhZ2VgICAgICB8b3B0aW9uYWx8CitNZXNzYWdlIHRvIGJlIGFkZGVkIGFzIHJldmlldyBjb21tZW50IHRvIHRoZSBjaGFuZ2Ugd2hlbiBhYmFuZG9uaW5nIHRoZQorY2hhbmdlLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2FkZC1yZXZpZXdlci1yZXN1bHRdXQorQWRkUmV2aWV3ZXJSZXN1bHQKK35+fn5+fn5+fn5+fn5+fn5+CitUaGUgYEFkZFJldmlld2VyUmVzdWx0YCBlbnRpdHkgZGVzY3JpYmVzIHRoZSByZXN1bHQgb2YgYWRkaW5nIGEKK3Jldmlld2VyIHRvIGEgY2hhbmdlLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGByZXZpZXdlcnNgICAgfG9wdGlvbmFsfAorVGhlIG5ld2x5IGFkZGVkIHJldmlld2VycyBhcyBhIGxpc3Qgb2YgbGluazojcmV2aWV3ZXItaW5mb1sKK1Jldmlld2VySW5mb10gZW50aXRpZXMuCit8YGVycm9yYCAgICAgICB8b3B0aW9uYWx8CitFcnJvciBtZXNzYWdlIGV4cGxhaW5pbmcgd2h5IHRoZSByZXZpZXdlciBjb3VsZCBub3QgYmUgYWRkZWQuICsKK0lmIGEgZ3JvdXAgd2FzIHNwZWNpZmllZCBpbiB0aGUgaW5wdXQgYW5kIGFuIGVycm9yIGlzIHJldHVybmVkLCBpdAorbWVhbnMgdGhhdCBub25lIG9mIHRoZSBtZW1iZXJzIHdlcmUgYWRkZWQgYXMgcmV2aWV3ZXIuCit8YGNvbmZpcm1gICAgICB8YGZhbHNlYCBpZiBub3Qgc2V0fAorV2hldGhlciBhZGRpbmcgdGhlIHJldmlld2VyIHJlcXVpcmVzIGNvbmZpcm1hdGlvbi4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1thcHByb3ZhbC1pbmZvXV0KK0FwcHJvdmFsSW5mbworfn5+fn5+fn5+fn5+CitUaGUgYEFwcHJvdmFsSW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGFwcHJvdmFsIGZyb20gYQordXNlciBmb3IgYSBsYWJlbCBvbiBhIGNoYW5nZS4KKworYEFwcHJvdmFsSW5mb2AgaGFzIHRoZSBzYW1lIGZpZWxkcyBhcworbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10uCitJbiBhZGRpdGlvbiBgQXBwcm92YWxJbmZvYCBoYXMgdGhlIGZvbGxvd2luZyBmaWVsZHM6CisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YHZhbHVlYCAgICAgICB8b3B0aW9uYWx8CitUaGUgdm90ZSB0aGF0IHRoZSB1c2VyIGhhcyBnaXZlbiBmb3IgdGhlIGxhYmVsLiBJZiBwcmVzZW50IGFuZCB6ZXJvLCB0aGUKK3VzZXIgaXMgcGVybWl0dGVkIHRvIHZvdGUgb24gdGhlIGxhYmVsLiBJZiBhYnNlbnQsIHRoZSB1c2VyIGlzIG5vdAorcGVybWl0dGVkIHRvIHZvdGUgb24gdGhhdCBsYWJlbC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tjaGFuZ2UtaW5mb11dCitDaGFuZ2VJbmZvCit+fn5+fn5+fn5+CitUaGUgYENoYW5nZUluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGNoYW5nZS4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgICAgICAgfHxEZXNjcmlwdGlvbgorfGBraW5kYCAgICAgICAgICAgICAgIHx8YGdlcnJpdGNvZGVyZXZpZXcjY2hhbmdlYAorfGBpZGAgICAgICAgICAgICAgICAgIHx8CitUaGUgSUQgb2YgdGhlIGNoYW5nZSBpbiB0aGUgZm9ybWF0ICInPHByb2plY3Q+XH48YnJhbmNoPn48Q2hhbmdlLUlkPiciLAord2hlcmUgJ3Byb2plY3QnLCAnYnJhbmNoJyBhbmQgJ0NoYW5nZS1JZCcgYXJlIFVSTCBlbmNvZGVkLiBGb3IgJ2JyYW5jaCcgdGhlCitgcmVmcy9oZWFkcy9gIHByZWZpeCBpcyBvbWl0dGVkLgorfGBwcm9qZWN0YCAgICAgICAgICAgIHx8VGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCit8YGJyYW5jaGAgICAgICAgICAgICAgfHwKK1RoZSBuYW1lIG9mIHRoZSB0YXJnZXQgYnJhbmNoLiArCitUaGUgYHJlZnMvaGVhZHMvYCBwcmVmaXggaXMgb21pdHRlZC4KK3xgdG9waWNgICAgICAgICAgICAgICB8b3B0aW9uYWx8VGhlIHRvcGljIHRvIHdoaWNoIHRoaXMgY2hhbmdlIGJlbG9uZ3MuCit8YGNoYW5nZV9pZGAgICAgICAgICAgfHxUaGUgQ2hhbmdlLUlkIG9mIHRoZSBjaGFuZ2UuCit8YHN1YmplY3RgICAgICAgICAgICAgfHwKK1RoZSBzdWJqZWN0IG9mIHRoZSBjaGFuZ2UgKGhlYWRlciBsaW5lIG9mIHRoZSBjb21taXQgbWVzc2FnZSkuCit8YHN0YXR1c2AgICAgICAgICAgICAgfHwKK1RoZSBzdGF0dXMgb2YgdGhlIGNoYW5nZSAoYE5FV2AsIGBTVUJNSVRURURgLCBgTUVSR0VEYCwgYEFCQU5ET05FRGAsCitgRFJBRlRgKS4KK3xgY3JlYXRlZGAgICAgICAgICAgICB8fAorVGhlIGxpbms6cmVzdC1hcGkuaHRtbCN0aW1lc3RhbXBbdGltZXN0YW1wXSBvZiB3aGVuIHRoZSBjaGFuZ2Ugd2FzCitjcmVhdGVkLgorfGB1cGRhdGVkYCAgICAgICAgICAgIHx8CitUaGUgbGluazpyZXN0LWFwaS5odG1sI3RpbWVzdGFtcFt0aW1lc3RhbXBdIG9mIHdoZW4gdGhlIGNoYW5nZSB3YXMgbGFzdAordXBkYXRlZC4KK3xgc3RhcnJlZGAgICAgICAgICAgICB8bm90IHNldCBpZiBgZmFsc2VgfAorV2hldGhlciB0aGUgY2FsbGluZyB1c2VyIGhhcyBzdGFycmVkIHRoaXMgY2hhbmdlLgorfGByZXZpZXdlZGAgICAgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8CitXaGV0aGVyIHRoZSBjaGFuZ2Ugd2FzIHJldmlld2VkIGJ5IHRoZSBjYWxsaW5nIHVzZXIuCit8YG1lcmdlYWJsZWAgICAgICAgICAgfG9wdGlvbmFsfAorV2hldGhlciB0aGUgY2hhbmdlIGlzIG1lcmdlYWJsZS4gKworTm90IHNldCBmb3IgbWVyZ2VkIGNoYW5nZXMuCit8YF9zb3J0a2V5YCAgICAgICAgICAgfHxUaGUgc29ydGtleSBvZiB0aGUgY2hhbmdlLgorfGBfbnVtYmVyYCAgICAgICAgICAgIHx8VGhlIGxlZ2FjeSBudW1lcmljIElEIG9mIHRoZSBjaGFuZ2UuCit8YG93bmVyYCAgICAgICAgICAgICAgfHwKK1RoZSBvd25lciBvZiB0aGUgY2hhbmdlIGFzIGFuIGxpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bCitBY2NvdW50SW5mb10gZW50aXR5LgorfGBsYWJlbHNgICAgICAgICAgICAgIHxvcHRpb25hbHwKK1RoZSBsYWJlbHMgb2YgdGhlIGNoYW5nZSBhcyBhIG1hcCB0aGF0IG1hcHMgdGhlIGxhYmVsIG5hbWVzIHRvCitsaW5rOiNsYWJlbC1pbmZvW0xhYmVsSW5mb10gZW50cmllcy4gKworT25seSBzZXQgaWYgbGluazojbGFiZWxzW2xhYmVsc10gb3IgbGluazojZGV0YWlsZWQtbGFiZWxzW2RldGFpbGVkCitsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YHBlcm1pdHRlZF9sYWJlbHNgICAgfG9wdGlvbmFsfAorQSBtYXAgb2YgdGhlIHBlcm1pdHRlZCBsYWJlbHMgdGhhdCBtYXBzIGEgbGFiZWwgbmFtZSB0byB0aGUgbGlzdCBvZgordmFsdWVzIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHRoYXQgbGFiZWwuICsKK09ubHkgc2V0IGlmIGxpbms6I2RldGFpbGVkLWxhYmVsc1tkZXRhaWxlZCBsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YHJlbW92YWJsZV9yZXZpZXdlcnNgfG9wdGlvbmFsfAorVGhlIHJldmlld2VycyB0aGF0IGNhbiBiZSByZW1vdmVkIGJ5IHRoZSBjYWxsaW5nIHVzZXIgYXMgYSBsaXN0IG9mCitsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBlbnRpdGllcy4gKworT25seSBzZXQgaWYgbGluazojZGV0YWlsZWQtbGFiZWxzW2RldGFpbGVkIGxhYmVsc10gYXJlIHJlcXVlc3RlZC4KK3xgY3VycmVudF9yZXZpc2lvbmAgICB8b3B0aW9uYWx8CitUaGUgY29tbWl0IElEIG9mIHRoZSBjdXJyZW50IHBhdGNoIHNldCBvZiB0aGlzIGNoYW5nZS4gKworT25seSBzZXQgaWYgbGluazojY3VycmVudC1yZXZpc2lvblt0aGUgY3VycmVudCByZXZpc2lvbl0gaXMgcmVxdWVzdGVkCitvciBpZiBsaW5rOiNhbGwtcmV2aXNpb25zW2FsbCByZXZpc2lvbnNdIGFyZSByZXF1ZXN0ZWQuCit8YHJldmlzaW9uc2AgICAgICAgICAgfG9wdGlvbmFsfAorQWxsIHBhdGNoIHNldHMgb2YgdGhpcyBjaGFuZ2UgYXMgYSBtYXAgdGhhdCBtYXBzIHRoZSBjb21taXQgSUQgb2YgdGhlCitwYXRjaCBzZXQgdG8gYSBsaW5rOiNyZXZpc2lvbi1pbmZvW1JldmlzaW9uSW5mb10gZW50aXR5LiArCitPbmx5IHNldCBpZiBsaW5rOiNhbGwtcmV2aXNpb25zW2FsbCByZXZpc2lvbnNdIGFyZSByZXF1ZXN0ZWQuCit8YF9tb3JlX2NoYW5nZXNgICAgICAgfG9wdGlvbmFsLCBub3Qgc2V0IGlmIGBmYWxzZWB8CitXaGV0aGVyIHRoZSBxdWVyeSB3b3VsZCBkZWxpdmVyIG1vcmUgcmVzdWx0cyBpZiBub3QgbGltaXRlZC4gKworT25seSBzZXQgb24gZWl0aGVyIHRoZSBsYXN0IG9yIHRoZSBmaXJzdCBjaGFuZ2UgdGhhdCBpcyByZXR1cm5lZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbY29tbWVudC1pbmZvXV0KK0NvbW1lbnRJbmZvCit+fn5+fn5+fn5+fgorVGhlIGBDb21tZW50SW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFuIGlubGluZSBjb21tZW50LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGBraW5kYCAgICAgICAgfHxgZ2Vycml0Y29kZXJldmlldyNjb21tZW50YAorfGBpZGAgICAgICAgICAgfHxUaGUgVVJMIGVuY29kZWQgVVVJRCBvZiB0aGUgZHJhZnQgY29tbWVudC4KK3xgcGF0aGAgICAgICAgIHxvcHRpb25hbHwKK1RoZSBwYXRoIG9mIHRoZSBmaWxlIGZvciB3aGljaCB0aGUgaW5saW5lIGNvbW1lbnQgd2FzIGRvbmUuICsKK05vdCBzZXQgaWYgcmV0dXJuZWQgaW4gYSBtYXAgd2hlcmUgdGhlIGtleSBpcyB0aGUgZmlsZSBwYXRoLgorfGBzaWRlYCAgICAgICAgfG9wdGlvbmFsfAorVGhlIHNpZGUgb24gd2hpY2ggdGhlIGNvbW1lbnQgd2FzIGFkZGVkLiArCitBbGxvd2VkIHZhbHVlcyBhcmUgYFJFVklTSU9OYCBhbmQgYFBBUkVOVGAuICsKK0lmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGlzIGBSRVZJU0lPTmAuCit8YGxpbmVgICAgICAgICB8b3B0aW9uYWx8CitUaGUgbnVtYmVyIG9mIHRoZSBsaW5lIGZvciB3aGljaCB0aGUgY29tbWVudCB3YXMgZG9uZS4gKworSWYgbm90IHNldCwgaXQncyBhIGZpbGUgY29tbWVudC4KK3xgaW5fcmVwbHlfdG9gIHxvcHRpb25hbHwKK1RoZSBVUkwgZW5jb2RlZCBVVUlEIG9mIHRoZSBjb21tZW50IHRvIHdoaWNoIHRoaXMgY29tbWVudCBpcyBhIHJlcGx5LgorfGBtZXNzYWdlYCAgICAgfG9wdGlvbmFsfFRoZSBjb21tZW50IG1lc3NhZ2UuCit8YHVwZGF0ZWRgICAgICB8fAorVGhlIGxpbms6cmVzdC1hcGkuaHRtbCN0aW1lc3RhbXBbdGltZXN0YW1wXSBvZiB3aGVuIHRoaXMgY29tbWVudCB3YXMKK3dyaXR0ZW4uCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbY29tbWVudC1pbnB1dF1dCitDb21tZW50SW5wdXQKK35+fn5+fn5+fn5+fgorVGhlIGBDb21taXRJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBjcmVhdGluZyBhbiBpbmxpbmUKK2NvbW1lbnQuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YGtpbmRgICAgICAgICB8b3B0aW9uYWx8CitNdXN0IGJlIGBnZXJyaXRjb2RlcmV2aWV3I2NvbW1lbnRgIGlmIHByb3ZpZGVkLgorfGBpZGAgICAgICAgICAgfG9wdGlvbmFsfAorVGhlIFVSTCBlbmNvZGVkIFVVSUQgb2YgdGhlIGNvbW1lbnQgaWYgYW4gZXhpc3RpbmcgZHJhZnQgY29tbWVudCBzaG91bGQKK2JlIHVwZGF0ZWQuCit8YHBhdGhgICAgICAgICB8b3B0aW9uYWx8CitUaGUgcGF0aCBvZiB0aGUgZmlsZSBmb3Igd2hpY2ggdGhlIGlubGluZSBjb21tZW50IHNob3VsZCBiZSBhZGRlZC4gKworRG9lc24ndCBuZWVkIHRvIGJlIHNldCBpZiBjb250YWluZWQgaW4gYSBtYXAgd2hlcmUgdGhlIGtleSBpcyB0aGUgZmlsZQorcGF0aC4KK3xgc2lkZWAgICAgICAgIHxvcHRpb25hbHwKK1RoZSBzaWRlIG9uIHdoaWNoIHRoZSBjb21tZW50IHNob3VsZCBiZSBhZGRlZC4gKworQWxsb3dlZCB2YWx1ZXMgYXJlIGBSRVZJU0lPTmAgYW5kIGBQQVJFTlRgLiArCitJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBpcyBgUkVWSVNJT05gLgorfGBsaW5lYCAgICAgICAgfG9wdGlvbmFsfAorVGhlIG51bWJlciBvZiB0aGUgbGluZSBmb3Igd2hpY2ggdGhlIGNvbW1lbnQgc2hvdWxkIGJlIGFkZGVkLiArCitgMGAgaWYgaXQgaXMgYSBmaWxlIGNvbW1lbnQuICsKK0lmIG5vdCBzZXQsIGEgZmlsZSBjb21tZW50IGlzIGFkZGVkLgorfGBpbl9yZXBseV90b2AgfG9wdGlvbmFsfAorVGhlIFVSTCBlbmNvZGVkIFVVSUQgb2YgdGhlIGNvbW1lbnQgdG8gd2hpY2ggdGhpcyBjb21tZW50IGlzIGEgcmVwbHkuCit8YHVwZGF0ZWRgICAgICB8b3B0aW9uYWx8CitUaGUgbGluazpyZXN0LWFwaS5odG1sI3RpbWVzdGFtcFt0aW1lc3RhbXBdIG9mIHRoaXMgY29tbWVudC4gKworQWNjZXB0ZWQgYnV0IGlnbm9yZWQuCit8YG1lc3NhZ2VgICAgICB8b3B0aW9uYWx8CitUaGUgY29tbWVudCBtZXNzYWdlLiArCitJZiBub3Qgc2V0IGFuZCBhbiBleGlzdGluZyBkcmFmdCBjb21tZW50IGlzIHVwZGF0ZWQsIHRoZSBleGlzdGluZyBkcmFmdAorY29tbWVudCBpcyBkZWxldGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2NvbW1pdC1pbmZvXV0KK0NvbW1pdEluZm8KK35+fn5+fn5+fn4KK1RoZSBgQ29tbWl0SW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgY29tbWl0LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8RGVzY3JpcHRpb24KK3xgY29tbWl0YCAgICAgIHxUaGUgY29tbWl0IElELgorfGBwYXJlbnRgICAgICAgfAorVGhlIHBhcmVudCBjb21taXRzIG9mIHRoaXMgY29tbWl0IGFzIGEgbGlzdCBvZgorbGluazojY29tbWl0LWluZm9bQ29tbWl0SW5mb10gZW50aXRpZXMuCit8YGF1dGhvcmAgICAgICB8VGhlIGF1dGhvciBvZiB0aGUgY29tbWl0IGFzIGEKK2xpbms6I2dpdC1wZXJzb24taW5mb1tHaXRQZXJzb25JbmZvXSBlbnRpdHkuCit8YGNvbW1pdHRlcmAgICB8VGhlIGNvbW1pdHRlciBvZiB0aGUgY29tbWl0IGFzIGEKK2xpbms6I2dpdC1wZXJzb24taW5mb1tHaXRQZXJzb25JbmZvXSBlbnRpdHkuCit8YHN1YmplY3RgICAgICB8CitUaGUgc3ViamVjdCBvZiB0aGUgY29tbWl0IChoZWFkZXIgbGluZSBvZiB0aGUgY29tbWl0IG1lc3NhZ2UpLgorfGBtZXNzYWdlYCAgICAgfFRoZSBjb21taXQgbWVzc2FnZS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2ZldGNoLWluZm9dXQorRmV0Y2hJbmZvCit+fn5+fn5+fn4KK1RoZSBgRmV0Y2hJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGZldGNoIGEgcGF0Y2gKK3NldCB2aWEgYSBjZXJ0YWluIHByb3RvY29sLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8RGVzY3JpcHRpb24KK3xgdXJsYCAgICAgICAgIHxUaGUgVVJMIG9mIHRoZSBwcm9qZWN0LgorfGByZWZgICAgICAgICAgfFRoZSByZWYgb2YgdGhlIHBhdGNoIHNldC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2ZpbGUtaW5mb11dCitGaWxlSW5mbworfn5+fn5+fn4KK1RoZSBgRmlsZUluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZpbGUgaW4gYSBwYXRjaCBzZXQuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGBzdGF0dXNgICAgICAgICB8b3B0aW9uYWx8CitUaGUgc3RhdHVzIG9mIHRoZSBmaWxlICgiYEFgIj1BZGRlZCwgImBEYCI9RGVsZXRlZCwgImBSYCI9UmVuYW1lZCwKKyJgQ2AiPUNvcGllZCwgImBXYCI9UmV3cml0dGVuKS4gKworTm90IHNldCBpZiB0aGUgZmlsZSB3YXMgTW9kaWZpZWQgKCJgTWAiKS4KK3xgYmluYXJ5YCAgICAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSBmaWxlIGlzIGJpbmFyeS4KK3xgb2xkX3BhdGhgICAgICAgfG9wdGlvbmFsfAorVGhlIG9sZCBmaWxlIHBhdGguICsKK09ubHkgc2V0IGlmIHRoZSBmaWxlIHdhcyByZW5hbWVkIG9yIGNvcGllZC4KK3xgbGluZXNfaW5zZXJ0ZWRgfG9wdGlvbmFsfAorTnVtYmVyIG9mIGluc2VydGVkIGxpbmVzLiArCitOb3Qgc2V0IGZvciBiaW5hcnkgZmlsZXMgb3IgaWYgbm8gbGluZXMgd2VyZSBpbnNlcnRlZC4KK3xgbGluZXNfZGVsZXRlZGAgfG9wdGlvbmFsfAorTnVtYmVyIG9mIGRlbGV0ZWQgbGluZXMuICsKK05vdCBzZXQgZm9yIGJpbmFyeSBmaWxlcyBvciBpZiBubyBsaW5lcyB3ZXJlIGRlbGV0ZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tnaXQtcGVyc29uLWluZm9dXQorR2l0UGVyc29uSW5mbworfn5+fn5+fn5+fn5+fgorVGhlIGBHaXRQZXJzb25JbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCithdXRob3IvY29tbWl0dGVyIG9mIGEgY29tbWl0LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8RGVzY3JpcHRpb24KK3xgbmFtZWAgICAgICAgIHxUaGUgbmFtZSBvZiB0aGUgYXV0aG9yL2NvbW1pdHRlci4KK3xgZW1haWxgICAgICAgIHxUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgYXV0aG9yL2NvbW1pdHRlci4KK3xgZGF0ZWAgICAgICAgIHxUaGUgbGluazpyZXN0LWFwaS5odG1sI3RpbWVzdGFtcFt0aW1lc3RhbXBdIG9mIHdoZW4KK3RoaXMgaWRlbnRpdHkgd2FzIGNvbnN0cnVjdGVkLgorfGB0emAgICAgICAgICAgfFRoZSB0aW1lem9uZSBvZmZzZXQgZnJvbSBVVEMgb2Ygd2hlbiB0aGlzIGlkZW50aXR5IHdhcworY29uc3RydWN0ZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tsYWJlbC1pbmZvXV0KK0xhYmVsSW5mbworfn5+fn5+fn5+CitUaGUgYExhYmVsSW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgbGFiZWwgb24gYSBjaGFuZ2UuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YGFwcHJvdmVkYCAgICB8b3B0aW9uYWx8VGhlIHVzZXIgd2hvIGFwcHJvdmVkIHRoaXMgbGFiZWwgb24gdGhlIGNoYW5nZQorYXMgYSBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBlbnRpdHkuICsKK09ubHkgc2V0IGlmIGxpbms6I2xhYmVsc1tsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YHJlamVjdGVkYCAgICB8b3B0aW9uYWx8VGhlIHVzZXIgd2hvIHJlamVjdGVkIHRoaXMgbGFiZWwgb24gdGhlIGNoYW5nZQorYXMgYSBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBlbnRpdHkuICsKK09ubHkgc2V0IGlmIGxpbms6I2xhYmVsc1tsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YHJlY29tbWVuZGVkYCB8b3B0aW9uYWx8VGhlIHVzZXIgd2hvIHJlY29tbWVuZGVkIHRoaXMgbGFiZWwgb24gdGhlCitjaGFuZ2UgYXMgYSBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBlbnRpdHkuICsKK09ubHkgc2V0IGlmIGxpbms6I2xhYmVsc1tsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YGRpc2xpa2VkYCAgICB8b3B0aW9uYWx8VGhlIHVzZXIgd2hvIGRpc2xpa2VkIHRoaXMgbGFiZWwgb24gdGhlIGNoYW5nZQorYXMgYSBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBlbnRpdHkuICsKK09ubHkgc2V0IGlmIGxpbms6I2xhYmVsc1tsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YHZhbHVlYCAgICAgICB8b3B0aW9uYWx8VGhlIHZvdGluZyB2YWx1ZSBvZiB0aGUgdXNlciB3aG8KK3JlY29tbWVuZGVkL2Rpc2xpa2VkIHRoaXMgbGFiZWwgb24gdGhlIGNoYW5nZSBpZiBpdCBpcyBub3QKKyJgKzFgIi8iYC0xYCIuICsKK09ubHkgc2V0IGlmIGxpbms6I2xhYmVsc1tsYWJlbHNdIGFyZSByZXF1ZXN0ZWQuCit8YG9wdGlvbmFsYCAgICB8bm90IHNldCBpZiBgZmFsc2VgfAorV2hldGhlciB0aGUgbGFiZWwgaXMgb3B0aW9uYWwuIE9wdGlvbmFsIG1lYW5zIHRoZSBsYWJlbCBtYXkgYmUgc2V0LCBidXQKK2l0J3MgbmVpdGhlciBuZWNlc3NhcnkgZm9yIHN1Ym1pc3Npb24gbm9yIGRvZXMgaXQgYmxvY2sgc3VibWlzc2lvbiBpZgorc2V0LgorfGBhbGxgICAgICAgICAgfG9wdGlvbmFsfExpc3Qgb2YgYWxsIGFwcHJvdmFscyBmb3IgdGhpcyBsYWJlbCBhcyBhIGxpc3QKK29mIGxpbms6I2FwcHJvdmFsLWluZm9bQXBwcm92YWxJbmZvXSBlbnRpdGllcy4gKworT25seSBzZXQgaWYgbGluazojZGV0YWlsZWQtbGFiZWxzW2RldGFpbGVkIGxhYmVsc10gYXJlIHJlcXVlc3RlZC4KK3xgdmFsdWVzYCAgICAgIHxvcHRpb25hbHxBIG1hcCBvZiBhbGwgdmFsdWVzIHRoYXQgYXJlIGFsbG93ZWQgZm9yIHRoaXMKK2xhYmVsLiBUaGUgbWFwIG1hcHMgdGhlIHZhbHVlcyAoImAtMmAiLCAiYC0xYCIsICIgYDBgIiwgImArMWAiLCAiYCsyYCIpCit0byB0aGUgdmFsdWUgZGVzY3JpcHRpb25zLiArCitPbmx5IHNldCBpZiBsaW5rOiNkZXRhaWxlZC1sYWJlbHNbZGV0YWlsZWQgbGFiZWxzXSBhcmUgcmVxdWVzdGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3Jlc3RvcmUtaW5wdXRdXQorUmVzdG9yZUlucHV0Cit+fn5+fn5+fn5+fn4KK1RoZSBgUmVzdG9yZUlucHV0YCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHJlc3RvcmluZyBhIGNoYW5nZS4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xgbWVzc2FnZWAgICAgIHxvcHRpb25hbHwKK01lc3NhZ2UgdG8gYmUgYWRkZWQgYXMgcmV2aWV3IGNvbW1lbnQgdG8gdGhlIGNoYW5nZSB3aGVuIHJlc3RvcmluZyB0aGUKK2NoYW5nZS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tyZXZlcnQtaW5wdXRdXQorUmV2ZXJ0SW5wdXQKK35+fn5+fn5+fn5+CitUaGUgYFJldmVydElucHV0YCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHJldmVydGluZyBhIGNoYW5nZS4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHx8RGVzY3JpcHRpb24KK3xgbWVzc2FnZWAgICAgIHxvcHRpb25hbHwKK01lc3NhZ2UgdG8gYmUgYWRkZWQgYXMgcmV2aWV3IGNvbW1lbnQgdG8gdGhlIGNoYW5nZSB3aGVuIHJldmVydGluZyB0aGUKK2NoYW5nZS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tyZXZpZXctaW5mb11dCitSZXZpZXdJbmZvCit+fn5+fn5+fn5+CitUaGUgYFJldmlld0luZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHJldmlldy4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSw2Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICB8RGVzY3JpcHRpb24KK3xgbGFiZWxzYCAgICAgICB8CitUaGUgbGFiZWxzIG9mIHRoZSByZXZpZXcgYXMgYSBtYXAgdGhhdCBtYXBzIHRoZSBsYWJlbCBuYW1lcyB0byB0aGUKK3ZvdGluZyB2YWx1ZXMuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcmV2aWV3LWlucHV0XV0KK1Jldmlld0lucHV0Cit+fn5+fn5+fn5+fgorVGhlIGBSZXZpZXdJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBhZGRpbmcgYSByZXZpZXcgdG8gYQorcmV2aXNpb24uCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgIHx8RGVzY3JpcHRpb24KK3xgbWVzc2FnZWAgICAgICB8b3B0aW9uYWx8CitUaGUgbWVzc2FnZSB0byBiZSBhZGRlZCBhcyByZXZpZXcgY29tbWVudC4KK3xgbGFiZWxzYCAgICAgICB8b3B0aW9uYWx8CitUaGUgdm90ZXMgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJldmlzaW9uIGFzIGEgbWFwIHRoYXQgbWFwcyB0aGUKK2xhYmVsIG5hbWVzIHRvIHRoZSB2b3RpbmcgdmFsdWVzLgorfGBjb21tZW50c2AgICAgIHxvcHRpb25hbHwKK1RoZSBjb21tZW50cyB0aGF0IHNob3VsZCBiZSBhZGRlZCBhcyBhIG1hcCB0aGF0IG1hcHMgYSBmaWxlIHBhdGggdG8gYQorbGlzdCBvZiBsaW5rOiNjb21tZW50LWlucHV0W0NvbW1lbnRJbnB1dF0gZW50aXRpZXMuCit8YHN0cmljdF9sYWJlbHNgfGB0cnVlYCBpZiBub3Qgc2V0fAorV2hldGhlciBhbGwgbGFiZWxzIGFyZSByZXF1aXJlZCB0byBiZSB3aXRoaW4gdGhlIHVzZXIncyBwZXJtaXR0ZWQgcmFuZ2VzCitiYXNlZCBvbiBhY2Nlc3MgY29udHJvbHMuICsKK0lmIGB0cnVlYCwgYXR0ZW1wdGluZyB0byB1c2UgYSBsYWJlbCBub3QgZ3JhbnRlZCB0byB0aGUgdXNlciB3aWxsIGZhaWwKK3RoZSBlbnRpcmUgbW9kaWZ5IG9wZXJhdGlvbiBlYXJseS4gKworSWYgYGZhbHNlYCwgdGhlIG9wZXJhdGlvbiB3aWxsIGV4ZWN1dGUgYW55d2F5LCBidXQgdGhlIHByb3Bvc2VkIGxhYmVscword2lsbCBiZSBtb2RpZmllZCB0byBiZSB0aGUgImJlc3QiIHZhbHVlIGFsbG93ZWQgYnkgdGhlIGFjY2VzcyBjb250cm9scy4KK3xgZHJhZnRzYCAgICAgIHxvcHRpb25hbHwKK0RyYWZ0IGhhbmRsaW5nIHRoYXQgZGVmaW5lcyBob3cgZHJhZnQgY29tbWVudHMgYXJlIGhhbmRsZWQgdGhhdCBhcmUKK2FscmVhZHkgaW4gdGhlIGRhdGFiYXNlIGJ1dCB0aGF0IHdlcmUgbm90IGFsc28gZGVzY3JpYmVkIGluIHRoaXMKK2lucHV0LiArCitBbGxvd2VkIHZhbHVlcyBhcmUgYERFTEVURWAsIGBQVUJMSVNIYCBhbmQgYEtFRVBgLiArCitJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBpcyBgREVMRVRFYC4KK3xgbm90aWZ5YCAgICAgIHxvcHRpb25hbHwKK05vdGlmeSBoYW5kbGluZyB0aGF0IGRlZmluZXMgdG8gd2hvbSBlbWFpbCBub3RpZmljYXRpb25zIHNob3VsZCBiZSBzZW50CithZnRlciB0aGUgcmV2aWV3IGlzIHN0b3JlZC4gKworQWxsb3dlZCB2YWx1ZXMgYXJlIGBOT05FYCwgYE9XTkVSYCwgYE9XTkVSX1JFVklFV0VSU2AgYW5kIGBBTExgLiArCitJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBpcyBgQUxMYC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcmV2aWV3ZXItaW5mb11dCitSZXZpZXdlckluZm8KK35+fn5+fn5+fn5+fgorVGhlIGBSZXZpZXdlckluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHJldmlld2VyIGFuZCBpdHMKK3ZvdGVzIG9uIGEgY2hhbmdlLgorCitgUmV2aWV3ZXJJbmZvYCBoYXMgdGhlIHNhbWUgZmllbGRzIGFzCitsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBhbmQgaW5jbHVkZXMKK2xpbms6I2RldGFpbGVkLWFjY291bnRzW2RldGFpbGVkIGFjY291bnQgaW5mb3JtYXRpb25dLgorSW4gYWRkaXRpb24gYFJldmlld2VySW5mb2AgaGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzOgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLDYiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8RGVzY3JpcHRpb24KK3xga2luZGAgICAgICAgIHxgZ2Vycml0Y29kZXJldmlldyNyZXZpZXdlcmAKK3xgYXBwcm92YWxzYCAgIHwKK1RoZSBhcHByb3ZhbHMgb2YgdGhlIHJldmlld2VyIGFzIGEgbWFwIHRoYXQgbWFwcyB0aGUgbGFiZWwgbmFtZXMgdG8gdGhlCithcHByb3ZhbCB2YWx1ZXMgKCJgLTJgIiwgImAtMWAiLCAiIGAwYCIsICJgKzFgIiwgImArMmAiKS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3Jldmlld2VyLWlucHV0XV0KK1Jldmlld2VySW5wdXQKK35+fn5+fn5+fn5+fn4KK1RoZSBgUmV2aWV3ZXJJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBhZGRpbmcgYSByZXZpZXdlcgordG8gYSBjaGFuZ2UuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8fERlc2NyaXB0aW9uCit8YHJldmlld2VyYCAgICB8fAorVGhlIGxpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWlkW0lEXSBvZiBvbmUgYWNjb3VudCB0aGF0CitzaG91bGQgYmUgYWRkZWQgYXMgcmV2aWV3ZXIgb3IgdGhlIGxpbms6cmVzdC1hcGktZ3JvdXBzLmh0bWwjZ3JvdXAtaWRbCitJRF0gb2Ygb25lIGdyb3VwIGZvciB3aGljaCBhbGwgbWVtYmVycyBzaG91bGQgYmUgYWRkZWQgYXMgcmV2aWV3ZXJzLiArCitJZiBhbiBJRCBpZGVudGlmaWVzIGJvdGggYW4gYWNjb3VudCBhbmQgYSBncm91cCwgb25seSB0aGUgYWNjb3VudCBpcworYWRkZWQgYXMgcmV2aWV3ZXIgdG8gdGhlIGNoYW5nZS4KK3xgY29uZmlybWVkYCAgIHxvcHRpb25hbHwKK1doZXRoZXIgYWRkaW5nIHRoZSByZXZpZXdlciBpcyBjb25maXJtZWQuICsKK1RoZSBHZXJyaXQgc2VydmVyIG1heSBiZSBjb25maWd1cmVkIHRvCitsaW5rOmNvbmZpZy1nZXJyaXQuaHRtbCNhZGRyZXZpZXdlci5tYXhXaXRob3V0Q29uZmlybWF0aW9uW3JlcXVpcmUgYQorY29uZmlybWF0aW9uXSB3aGVuIGFkZGluZyBhIGdyb3VwIGFzIHJldmlld2VyIHRoYXQgaGFzIG1hbnkgbWVtYmVycy4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tyZXZpc2lvbi1pbmZvXV0KK1JldmlzaW9uSW5mbworfn5+fn5+fn5+fn5+CitUaGUgYFJldmlzaW9uSW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcGF0Y2ggc2V0LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGBkcmFmdGAgICAgICAgfG5vdCBzZXQgaWYgYGZhbHNlYHxXaGV0aGVyIHRoZSBwYXRjaCBzZXQgaXMgYSBkcmFmdC4KK3xgX251bWJlcmAgICAgIHx8VGhlIHBhdGNoIHNldCBudW1iZXIuCit8YGZldGNoYCAgICAgICB8fAorSW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGZldGNoIHRoaXMgcGF0Y2ggc2V0LiBUaGUgZmV0Y2ggaW5mb3JtYXRpb24gaXMKK3Byb3ZpZGVkIGFzIGEgbWFwIHRoYXQgbWFwcyB0aGUgcHJvdG9jb2wgbmFtZSAoImBnaXRgIiwgImBodHRwYCIsCisiYHNzaGAiKSB0byBsaW5rOiNmZXRjaC1pbmZvW0ZldGNoSW5mb10gZW50aXRpZXMuCit8YGNvbW1pdGAgICAgICB8fFRoZSBjb21taXQgb2YgdGhlIHBhdGNoIHNldCBhcworbGluazojY29tbWl0LWluZm9bQ29tbWl0SW5mb10gZW50aXR5LgorfGBmaWxlc2AgICAgICAgfHwKK1RoZSBmaWxlcyBvZiB0aGUgcGF0Y2ggc2V0IGFzIGEgbWFwIHRoYXQgbWFwcyB0aGUgZmlsZSBuYW1lcyB0bworbGluazojZmlsZS1pbmZvW0ZpbGVJbmZvXSBlbnRpdGllcy4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tydWxlLWlucHV0XV0KK1J1bGVJbnB1dAorfn5+fn5+fn5+CitUaGUgYFJ1bGVJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIHRvIHRlc3QgYSBQcm9sb2cgcnVsZS4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGBydWxlYHx8CitQcm9sb2cgY29kZSB0byBleGVjdXRlIGluc3RlYWQgb2YgdGhlIGNvZGUgaW4gYHJlZnMvbWV0YS9jb25maWdgLgorfGBmaWx0ZXJzYHxgUlVOYCBpZiBub3Qgc2V0fAorV2hlbiBgUlVOYCBmaWx0ZXIgcnVsZXMgaW4gdGhlIHBhcmVudCBwcm9qZWN0cyBhcmUgY2FsbGVkIHRvCitwb3N0LXByb2Nlc3MgdGhlIHJlc3VsdHMgb2YgdGhlIHByb2plY3Qgc3BlY2lmaWMgcnVsZS4gVGhpcworYmVoYXZpb3IgbWF0Y2hlcyBob3cgdGhlIHJ1bGUgd2lsbCBleGVjdXRlIGlmIGluc3RhbGxlZC4gKworSWYgYFNLSVBgIHRoZSBwYXJlbnQgZmlsdGVycyBhcmUgbm90IGNhbGxlZCwgYWxsb3dpbmcgdGhlIHRlc3QKK3RvIHJldHVybiByZXN1bHRzIGZyb20gdGhlIGlucHV0IHJ1bGUuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbc3VibWl0LWluZm9dXQorU3VibWl0SW5mbworfn5+fn5+fn5+fgorVGhlIGBTdWJtaXRJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZSBzdGF0dXMKK2FmdGVyIHN1Ym1pdHRpbmcuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsNiJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgIHxEZXNjcmlwdGlvbgorfGBzdGF0dXNgICAgICAgfAorVGhlIHN0YXR1cyBvZiB0aGUgY2hhbmdlIGFmdGVyIHN1Ym1pdHRpbmcsIGNhbiBiZSBgTUVSR0VEYCBvcgorYFNVQk1JVFRFRGAuICsKK0lmIGB3YWl0X2Zvcl9tZXJnZWAgaW4gdGhlIGxpbms6I3N1Ym1pdC1pbnB1dFtTdWJtaXRJbnB1dF0gd2FzIHNldCB0bworYGZhbHNlYCB0aGUgcmV0dXJuZWQgc3RhdHVzIGlzIGBTVUJNSVRURURgIGFuZCB0aGUgY2FsbGVyIGNhbid0IGtub3cKK3doZXRoZXIgdGhlIGNoYW5nZSBjb3VsZCBiZSBtZXJnZWQgc3VjY2Vzc2Z1bGx5LgorfD09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbc3VibWl0LWlucHV0XV0KK1N1Ym1pdElucHV0Cit+fn5+fn5+fn5+fgorVGhlIGBTdWJtaXRJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBzdWJtaXR0aW5nIGEgY2hhbmdlLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICB8fERlc2NyaXB0aW9uCit8YHdhaXRfZm9yX21lcmdlYHxgZmFsc2VgIGlmIG5vdCBzZXR8CitXaGV0aGVyIHRoZSByZXF1ZXN0IHNob3VsZCB3YWl0IGZvciB0aGUgbWVyZ2UgdG8gY29tcGxldGUuICsKK0lmIGBmYWxzZWAgdGhlIHJlcXVlc3QgcmV0dXJucyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2hhbmdlIGhhcyBiZWVuCithZGRlZCB0byB0aGUgbWVyZ2UgcXVldWUgYW5kIHRoZSBjYWxsZXIgY2FuJ3Qga25vdyB3aGV0aGVyIHRoZSBjaGFuZ2UKK2NvdWxkIGJlIG1lcmdlZCBzdWNjZXNzZnVsbHkuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbc3VibWl0LXJlY29yZF1dCitTdWJtaXRSZWNvcmQKK35+fn5+fn5+fn5+fgorVGhlIGBTdWJtaXRSZWNvcmRgIGVudGl0eSBkZXNjcmliZXMgcmVzdWx0cyBmcm9tIGEgc3VibWl0X3J1bGUuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHx8RGVzY3JpcHRpb24KK3xgc3RhdHVzYHx8CitgT0tgLCB0aGUgY2hhbmdlIGNhbiBiZSBzdWJtaXR0ZWQuICsKK2BOT1RfUkVBRFlgLCBhZGRpdGlvbmFsIGxhYmVscyBhcmUgcmVxdWlyZWQgYmVmb3JlIHN1Ym1pdC4gKworYENMT1NFRGAsIGNsb3NlZCBjaGFuZ2VzIGNhbm5vdCBiZSBzdWJtaXR0ZWQuICsKK2BSVUxFX0VSUk9SYCwgcnVsZSBjb2RlIGZhaWxlZCB3aXRoIGFuIGVycm9yLgorfGBva2B8b3B0aW9uYWx8CitNYXAgb2YgbGFiZWxzIHRoYXQgYXJlIGFwcHJvdmVkOyBhbgorbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10gaWRlbnRpZmllcyB0aGUKK3ZvdGVyIGNob3NlbiBieSB0aGUgcnVsZS4KK3xgcmVqZWN0YHxvcHRpb25hbHwKK01hcCBvZiBsYWJlbHMgdGhhdCBhcmUgcHJldmVudGluZyBzdWJtaXQ7CitsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBpZGVudGlmaWVzIHZvdGVyLgorfGBuZWVkYHxvcHRpb25hbHwKK01hcCBvZiBsYWJlbHMgdGhhdCBuZWVkIHRvIGJlIGdpdmVuIHRvIHN1Ym1pdC4gVGhlIHZhbHVlIGlzCitjdXJyZW50bHkgYW4gZW1wdHkgb2JqZWN0LgorfGBtYXlgfG9wdGlvbmFsfAorTWFwIG9mIGxhYmVscyB0aGF0IGNhbiBiZSB1c2VkLCBidXQgZG8gbm90IGFmZmVjdCBzdWJtaXQuCitsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvW0FjY291bnRJbmZvXSBpZGVudGlmaWVzIHZvdGVyLAoraWYgdGhlIGxhYmVsIGhhcyBiZWVuIGFwcGxpZWQuCit8YGltcG9zc2libGVgfG9wdGlvbmFsfAorTWFwIG9mIGxhYmVscyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gaW4gYG5lZWRgIGJ1dCBjYW5ub3QgYmUKK3VzZWQgYnkgYW55IHVzZXIgYmVjYXVzZSBvZiBhY2Nlc3MgcmVzdHJpY3Rpb25zLiBUaGUgdmFsdWUKK2lzIGN1cnJlbnRseSBhbiBlbXB0eSBvYmplY3QuCit8YGVycm9yX21lc3NhZ2VgfG9wdGlvbmFsfAorV2hlbiBzdGF0dXMgaXMgUlVMRV9FUlJPUiB0aGlzIG1lc3NhZ2UgcHJvdmlkZXMgc29tZSB0ZXh0IGRlc2NyaWJpbmcKK3RoZSBmYWlsdXJlIG9mIHRoZSBydWxlIHByZWRpY2F0ZS4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1t0b3BpYy1pbnB1dF1dCitUb3BpY0lucHV0Cit+fn5+fn5+fn5+CitUaGUgYFRvcGljSW5wdXRgIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3Igc2V0dGluZyBhIHRvcGljLgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGB0b3BpY2AgICAgICAgfG9wdGlvbmFsfFRoZSB0b3BpYy4gKworVGhlIHRvcGljIHdpbGwgYmUgZGVsZXRlZCBpZiBub3Qgc2V0LgorfGBtZXNzYWdlYCAgICAgfG9wdGlvbmFsfAorTWVzc2FnZSB0byBiZSBhZGRlZCBhcyByZXZpZXcgY29tbWVudCB0byB0aGUgY2hhbmdlIHdoZW4gc2V0dGluZyB0aGUKK3RvcGljLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK0dFUlJJVAorLS0tLS0tCitQYXJ0IG9mIGxpbms6aW5kZXguaHRtbFtHZXJyaXQgQ29kZSBSZXZpZXddCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLWdyb3Vwcy50eHQgYi9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLWdyb3Vwcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgwMGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcmVzdC1hcGktZ3JvdXBzLnR4dApAQCAtMCwwICsxLDEyMjkgQEAKK0dlcnJpdCBDb2RlIFJldmlldyAtIC9ncm91cHMvIFJFU1QgQVBJCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHBhZ2UgZGVzY3JpYmVzIHRoZSBncm91cCByZWxhdGVkIFJFU1QgZW5kcG9pbnRzLgorUGxlYXNlIGFsc28gdGFrZSBub3RlIG9mIHRoZSBnZW5lcmFsIGluZm9ybWF0aW9uIG9uIHRoZQorbGluazpyZXN0LWFwaS5odG1sW1JFU1QgQVBJXS4KKworW1tncm91cC1lbmRwb2ludHNdXQorR3JvdXAgRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0KKworW1tsaXN0LWdyb3Vwc11dCitMaXN0IEdyb3Vwcworfn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2dyb3Vwcy8nCisKK0xpc3RzIHRoZSBncm91cHMgYWNjZXNzaWJsZSBieSB0aGUgY2FsbGVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzCit1c2luZyB0aGUgbGluazpjbWQtbHMtZ3JvdXBzLmh0bWxbbHMtZ3JvdXBzXSBjb21tYW5kIG92ZXIgU1NILAorYW5kIGFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyBxdWVyeSBwYXJhbWV0ZXJzLgorCitBcyByZXN1bHQgYSBtYXAgaXMgcmV0dXJuZWQgdGhhdCBtYXBzIHRoZSBncm91cCBuYW1lcyB0bworbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudHJpZXMuIFRoZSBlbnRyaWVzIGluIHRoZSBtYXAgYXJlIHNvcnRlZAorYnkgZ3JvdXAgbmFtZS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJBZG1pbmlzdHJhdG9ycyI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjogIkdlcnJpdCBTaXRlIEFkbWluaXN0cmF0b3JzIiwKKyAgICAgICJncm91cF9pZCI6IDEsCisgICAgICAib3duZXIiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgICAgfSwKKyAgICAiQW5vbnltb3VzIFVzZXJzIjogeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgICAiaWQiOiAiZ2xvYmFsJTNBQW5vbnltb3VzLVVzZXJzIiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC1nbG9iYWwlM0FBbm9ueW1vdXMtVXNlcnMiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjogIkFueSB1c2VyLCBzaWduZWQtaW4gb3Igbm90IiwKKyAgICAgICJncm91cF9pZCI6IDIsCisgICAgICAib3duZXIiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgICAgfSwKKyAgICAiTXlQcm9qZWN0X0NvbW1pdHRlcnMiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAgICJpZCI6ICI4MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3IiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC04MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3IiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgICAidmlzaWJsZV90b19hbGwiOiB0cnVlLAorICAgICAgfSwKKyAgICAgICJncm91cF9pZCI6IDYsCisgICAgICAib3duZXIiOiAiTXlQcm9qZWN0X0NvbW1pdHRlcnMiLAorICAgICAgIm93bmVyX2lkIjogIjgzNGVjMzZkZDVlMGVkMjFhMmZmNWQ3ZTIyNTVkYTA4MmQ2M2JiZDciCisgICAgfSwKKyAgICAiTm9uLUludGVyYWN0aXZlIFVzZXJzIjogeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgICAiaWQiOiAiNTA1N2YzY2JkMzUxOWQ2YWI2OTM2NDQyOWE4OWZmZGZmYmE1MGY3MyIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtNTA1N2YzY2JkMzUxOWQ2YWI2OTM2NDQyOWE4OWZmZGZmYmE1MGY3MyIsCisgICAgICAib3B0aW9ucyI6IHsKKyAgICAgIH0sCisgICAgICAiZGVzY3JpcHRpb24iOiAiVXNlcnMgd2hvIHBlcmZvcm0gYmF0Y2ggYWN0aW9ucyBvbiBHZXJyaXQiLAorICAgICAgImdyb3VwX2lkIjogNCwKKyAgICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgICB9LAorICAgICJQcm9qZWN0IE93bmVycyI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogImdsb2JhbCUzQVByb2plY3QtT3duZXJzIiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC1nbG9iYWwlM0FQcm9qZWN0LU93bmVycyIsCisgICAgICAib3B0aW9ucyI6IHsKKyAgICAgIH0sCisgICAgICAiZGVzY3JpcHRpb24iOiAiQW55IG93bmVyIG9mIHRoZSBwcm9qZWN0IiwKKyAgICAgICJncm91cF9pZCI6IDUsCisgICAgICAib3duZXIiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgICAgfSwKKyAgICAiUmVnaXN0ZXJlZCBVc2VycyI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogImdsb2JhbCUzQVJlZ2lzdGVyZWQtVXNlcnMiLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLWdsb2JhbCUzQVJlZ2lzdGVyZWQtVXNlcnMiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImRlc2NyaXB0aW9uIjogIkFueSBzaWduZWQtaW4gdXNlciIsCisgICAgICAiZ3JvdXBfaWQiOiAzLAorICAgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IgorICAgIH0KKyAgfQorLS0tLQorCisuR2V0IGFsbCBncm91cHMKKyoqKioKK2dldDo6L2dyb3Vwcy8KKyoqKioKKworW1tncm91cC1vcHRpb25zXV0KK0dyb3VwIE9wdGlvbnMKK15eXl5eXl5eXl5eXl4KK0FkZGl0aW9uYWwgZmllbGRzIGNhbiBiZSBvYnRhaW5lZCBieSBhZGRpbmcgYG9gIHBhcmFtZXRlcnMsIGVhY2ggb3B0aW9uCityZXF1aXJlcyBtb3JlIGxvb2t1cHMgYW5kIHNsb3dzIGRvd24gdGhlIHF1ZXJ5IHJlc3BvbnNlIHRpbWUgdG8gdGhlCitjbGllbnQgc28gdGhleSBhcmUgZ2VuZXJhbGx5IGRpc2FibGVkIGJ5IGRlZmF1bHQuIE9wdGlvbmFsIGZpZWxkcyBhcmU6CisKK1tbaW5jbHVkZXNdXQorLS0KKyogYElOQ0xVREVTYDogaW5jbHVkZSBsaXN0IG9mIGRpcmVjdGx5IGluY2x1ZGVkIGdyb3Vwcy4KKy0tCisKK1tbbWVtYmVyc11dCistLQorKiBgTUVNQkVSU2A6IGluY2x1ZGUgbGlzdCBvZiBkaXJlY3QgZ3JvdXAgbWVtYmVycy4KKy0tCisKK0NoZWNrIGlmIGEgZ3JvdXAgaXMgb3duZWQgYnkgdGhlIGNhbGxpbmcgdXNlcgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCitCeSBzZXR0aW5nIHRoZSBvcHRpb24gYG93bmVkYCBhbmQgc3BlY2lmeWluZyBhIGdyb3VwIHRvIGluc3BlY3Qgd2l0aAordGhlIG9wdGlvbiBgcWAsIGl0IGlzIHBvc3NpYmxlIHRvIGZpbmQgb3V0LCBpZiB0aGlzIGdyb3VwIGlzIG93bmVkIGJ5Cit0aGUgY2FsbGluZyB1c2VyLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy8/b3duZWQmcT1NeVByb2plY3QtQ29tbWl0dGVycyBIVFRQLzEuMAorLS0tLQorCitJZiB0aGUgZ3JvdXAgaXMgb3duZWQgYnkgdGhlIGNhbGxpbmcgdXNlciwgdGhlIHJldHVybmVkIG1hcCBjb250YWlucwordGhpcyBncm91cC4gSWYgdGhlIGNhbGxpbmcgdXNlciBkb2Vzbid0IG93biB0aGlzIGdyb3VwIGFuIGVtcHR5IG1hcCBpcworcmV0dXJuZWQuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJNeVByb2plY3QtQ29tbWl0dGVycyI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogIjk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAiLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICAgICJ2aXNpYmxlX3RvX2FsbCI6IHRydWUKKyAgICAgIH0sCisgICAgICAiZGVzY3JpcHRpb24iOiJjb250YWlucyBhbGwgY29tbWl0dGVycyBmb3IgTXlQcm9qZWN0IiwKKyAgICAgICJncm91cF9pZCI6IDU1MSwKKyAgICAgICJvd25lciI6ICJNeVByb2plY3QtT3duZXJzIiwKKyAgICAgICJvd25lcl9pZCI6ICI3Y2EwNDJmNGQ1ODQ3OTM2ZmNiOTBjYTkxMDU3NjczMTU3ZmQwNmZjIgorICAgIH0KKyAgfQorLS0tLQorCitbW2dldC1ncm91cF1dCitHZXQgR3JvdXAKK35+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0nCisKK1JldHJpZXZlcyBhIGdyb3VwLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy82YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAiaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIsCisgICAgIm5hbWUiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC02YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAib3B0aW9ucyI6IHsKKyAgICB9LAorICAgICJkZXNjcmlwdGlvbiI6ICJHZXJyaXQgU2l0ZSBBZG1pbmlzdHJhdG9ycyIsCisgICAgImdyb3VwX2lkIjogMSwKKyAgICAib3duZXIiOiAiQWRtaW5pc3RyYXRvcnMiLAorICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IgorICB9CistLS0tCisKK1tbY3JlYXRlLWdyb3VwXV0KK0NyZWF0ZSBHcm91cAorfn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9ncm91cHMvbGluazojZ3JvdXAtbmFtZVtce2dyb3VwLW5hbWVcfV0nCisKK0NyZWF0ZXMgYSBuZXcgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitJbiB0aGUgcmVxdWVzdCBib2R5IGFkZGl0aW9uYWwgZGF0YSBmb3IgdGhlIGdyb3VwIGNhbiBiZSBwcm92aWRlZCBhcworbGluazojZ3JvdXAtaW5wdXRbR3JvdXBJbnB1dF0uCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJkZXNjcmlwdGlvbiI6ICJjb250YWlucyBhbGwgY29tbWl0dGVycyBmb3IgTXlQcm9qZWN0IiwKKyAgICAidmlzaWJsZV90b19hbGwiOiB0cnVlLAorICAgICJvd25lciI6ICJNeVByb2plY3QtT3duZXJzIiwKKyAgICAib3duZXJfaWQiOiAiN2NhMDQyZjRkNTg0NzkzNmZjYjkwY2E5MTA1NzY3MzE1N2ZkMDZmYyIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSB0aGUgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGNyZWF0ZWQgZ3JvdXAuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDEgQ3JlYXRlZAorICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgImlkIjogIjk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAiLAorICAgICJuYW1lIjogIk15UHJvamVjdC1Db21taXR0ZXJzIiwKKyAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtOTk5OWM5NzFiYjRhYjg3MmFhYjc1OWQ4YzQ5ODMzZWU2YjlmZjMyMCIsCisgICAgIm9wdGlvbnMiOiB7CisgICAgICAidmlzaWJsZV90b19hbGwiOiB0cnVlCisgICAgfSwKKyAgICAiZGVzY3JpcHRpb24iOiJjb250YWlucyBhbGwgY29tbWl0dGVycyBmb3IgTXlQcm9qZWN0IiwKKyAgICAiZ3JvdXBfaWQiOiA1NTEsCisgICAgIm93bmVyIjogIk15UHJvamVjdC1Pd25lcnMiLAorICAgICJvd25lcl9pZCI6ICI3Y2EwNDJmNGQ1ODQ3OTM2ZmNiOTBjYTkxMDU3NjczMTU3ZmQwNmZjIgorICB9CistLS0tCisKK0lmIHRoZSBncm91cCBjcmVhdGlvbiBmYWlscyBiZWNhdXNlIHRoZSBuYW1lIGlzIGFscmVhZHkgaW4gdXNlIHRoZQorcmVzcG9uc2UgaXMgImA0MDkgQ29uZmxpY3RgIi4KKworW1tnZXQtZ3JvdXAtZGV0YWlsXV0KK0dldCBHcm91cCBEZXRhaWwKK35+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2RldGFpbCcKKworUmV0cmlldmVzIGEgZ3JvdXAgd2l0aCB0aGUgZGlyZWN0IGxpbms6I21lbWJlcnNbbWVtYmVyc10gYW5kIHRoZQorZGlyZWN0bHkgbGluazojaW5jbHVkZXNbaW5jbHVkZWQgZ3JvdXBzXS4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OS9kZXRhaWwgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNncm91cC1pbmZvW0dyb3VwSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgZ3JvdXAuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICJpZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAibmFtZSI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICJvcHRpb25zIjogeworICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIkdlcnJpdCBTaXRlIEFkbWluaXN0cmF0b3JzIiwKKyAgICAiZ3JvdXBfaWQiOiAxLAorICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICJtZW1iZXJzIjogWworICAgICAgeworICAgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk3LAorICAgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAgICJlbWFpbCI6ICJqYW5lLnJvZUBleGFtcGxlLmNvbSIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTYsCisgICAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgICAgfQorICAgIF0sCisgICAgImluY2x1ZGVzIjogW10KKyAgfQorLS0tLQorCitbW2dldC1ncm91cC1uYW1lXV0KK0dldCBHcm91cCBOYW1lCit+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vbmFtZScKKworUmV0cmlldmVzIHRoZSBuYW1lIG9mIGEgZ3JvdXAuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLzk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAvbmFtZSBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJNeVByb2plY3QtQ29tbWl0dGVycyIKKy0tLS0KKworW1tyZW5hbWUtZ3JvdXBdXQorUmVuYW1lIEdyb3VwCit+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL25hbWUnCisKK1JlbmFtZXMgYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKK1RoZSBuZXcgZ3JvdXAgbmFtZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzL25hbWUgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgIm5hbWUiOiAiTXktUHJvamVjdC1Db21taXR0ZXJzIgorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcgZ3JvdXAgbmFtZSBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiTXktUHJvamVjdC1Db21taXR0ZXJzIgorLS0tLQorCitJZiByZW5hbWluZyB0aGUgZ3JvdXAgZmFpbHMgYmVjYXVzZSB0aGUgbmV3IG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgdGhlCityZXNwb25zZSBpcyAiYDQwOSBDb25mbGljdGAiLgorCitbW2dldC1ncm91cC1kZXNjcmlwdGlvbl1dCitHZXQgR3JvdXAgRGVzY3JpcHRpb24KK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vZGVzY3JpcHRpb24nCisKK1JldHJpZXZlcyB0aGUgZGVzY3JpcHRpb24gb2YgYSBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvOTk5OWM5NzFiYjRhYjg3MmFhYjc1OWQ4YzQ5ODMzZWU2YjlmZjMyMC9kZXNjcmlwdGlvbiBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJjb250YWlucyBhbGwgY29tbWl0dGVycyBmb3IgTXlQcm9qZWN0IgorLS0tLQorCitJZiB0aGUgZ3JvdXAgZG9lcyBub3QgaGF2ZSBhIGRlc2NyaXB0aW9uIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworW1tzZXQtZ3JvdXAtZGVzY3JpcHRpb25dXQorU2V0IEdyb3VwIERlc2NyaXB0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2Rlc2NyaXB0aW9uJworCitTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworVGhlIG5ldyBncm91cCBkZXNjcmlwdGlvbiBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvZ3JvdXBzLzk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAvZGVzY3JpcHRpb24gSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRoZSBjb21taXR0ZXJzIG9mIE15UHJvamVjdC4iCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgdGhlIG5ldyBncm91cCBkZXNjcmlwdGlvbiBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiVGhlIGNvbW1pdHRlcnMgb2YgTXlQcm9qZWN0LiIKKy0tLS0KKworSWYgdGhlIGRlc2NyaXB0aW9uIHdhcyBkZWxldGVkIHRoZSByZXNwb25zZSBpcyAiYDIwNCBObyBDb250ZW50YCIuCisKK1tbZGVsZXRlLWdyb3VwLWRlc2NyaXB0aW9uXV0KK0RlbGV0ZSBHcm91cCBEZXNjcmlwdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnREVMRVRFIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9kZXNjcmlwdGlvbicKKworRGVsZXRlcyB0aGUgZGVzY3JpcHRpb24gb2YgYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKKy5SZXF1ZXN0CistLS0tCisgIERFTEVURSAvZ3JvdXBzLzk5OTljOTcxYmI0YWI4NzJhYWI3NTlkOGM0OTgzM2VlNmI5ZmYzMjAvZGVzY3JpcHRpb24gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKK1tbZ2V0LWdyb3VwLW9wdGlvbnNdXQorR2V0IEdyb3VwIE9wdGlvbnMKK35+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9vcHRpb25zJworCitSZXRyaWV2ZXMgdGhlIG9wdGlvbnMgb2YgYSBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvOTk5OWM5NzFiYjRhYjg3MmFhYjc1OWQ4YzQ5ODMzZWU2YjlmZjMyMC9vcHRpb25zIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojZ3JvdXAtb3B0aW9ucy1pbmZvW0dyb3VwT3B0aW9uc0luZm9dIGVudGl0eSBpcworcmV0dXJuZWQgdGhhdCBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb2YgdGhlIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAidmlzaWJsZV90b19hbGwiOiB0cnVlCisgIH0KKy0tLS0KKworW1tzZXQtZ3JvdXAtb3B0aW9uc11dCitTZXQgR3JvdXAgT3B0aW9ucworfn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL29wdGlvbnMnCisKK1NldHMgdGhlIG9wdGlvbnMgb2YgYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAuCisKK1RoZSBuZXcgZ3JvdXAgb3B0aW9ucyBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkgYXMgYQorbGluazojZ3JvdXAtb3B0aW9ucy1pbnB1dFtHcm91cE9wdGlvbnNJbnB1dF0gZW50aXR5LgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL2dyb3Vwcy85OTk5Yzk3MWJiNGFiODcyYWFiNzU5ZDhjNDk4MzNlZTZiOWZmMzIwL29wdGlvbnMgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgInZpc2libGVfdG9fYWxsIjogdHJ1ZQorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcgZ3JvdXAgb3B0aW9ucyBhcmUgcmV0dXJuZWQgYXMgYQorbGluazojZ3JvdXAtb3B0aW9ucy1pbmZvW0dyb3VwT3B0aW9uc0luZm9dIGVudGl0eS4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgInZpc2libGVfdG9fYWxsIjogdHJ1ZQorICB9CistLS0tCisKK1tbZ2V0LWdyb3VwLW93bmVyXV0KK0dldCBHcm91cCBPd25lcgorfn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9vd25lcicKKworUmV0cmlldmVzIHRoZSBvd25lciBncm91cCBvZiBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9ncm91cHMvOTk5OWM5NzFiYjRhYjg3MmFhYjc1OWQ4YzQ5ODMzZWU2YjlmZjMyMC9vd25lciBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBvd25lciBncm91cC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgImlkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICJuYW1lIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIsCisgICAgIm9wdGlvbnMiOiB7CisgICAgfSwKKyAgICAiZGVzY3JpcHRpb24iOiAiR2Vycml0IFNpdGUgQWRtaW5pc3RyYXRvcnMiLAorICAgICJncm91cF9pZCI6IDEsCisgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgfQorLS0tLQorCitbW3NldC1ncm91cC1vd25lcl1dCitTZXQgR3JvdXAgT3duZXIKK35+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vb3duZXInCisKK1NldHMgdGhlIG93bmVyIGdyb3VwIG9mIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitUaGUgbmV3IG93bmVyIGdyb3VwIG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QgYm9keS4KKworVGhlIG5ldyBvd25lciBjYW4gYmUgc3BlY2lmaWVkIGJ5IG5hbWUsIGJ5IGdyb3VwIFVVSUQgb3IgYnkgdGhlIGxlZ2FjeQorbnVtZXJpYyBncm91cCBJRC4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9ncm91cHMvOTk5OWM5NzFiYjRhYjg3MmFhYjc1OWQ4YzQ5ODMzZWU2YjlmZjMyMC9kZXNjcmlwdGlvbiBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAib3duZXIiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgfQorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdAorZGVzY3JpYmVzIHRoZSBuZXcgb3duZXIgZ3JvdXAuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICJpZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAibmFtZSI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICJvcHRpb25zIjogeworICAgIH0sCisgICAgImRlc2NyaXB0aW9uIjogIkdlcnJpdCBTaXRlIEFkbWluaXN0cmF0b3JzIiwKKyAgICAiZ3JvdXBfaWQiOiAxLAorICAgICJvd25lciI6ICJBZG1pbmlzdHJhdG9ycyIsCisgICAgIm93bmVyX2lkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiCisgIH0KKy0tLS0KKworW1tncm91cC1tZW1iZXItZW5kcG9pbnRzXV0KK0dyb3VwIE1lbWJlciBFbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworW1tncm91cC1tZW1iZXJzXV0KK0xpc3QgR3JvdXAgTWVtYmVycworfn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9tZW1iZXJzLycKKworTGlzdHMgdGhlIGRpcmVjdCBtZW1iZXJzIG9mIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitBcyByZXN1bHQgYSBsaXN0IG9mIGRldGFpbGVkIGxpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bCitBY2NvdW50SW5mb10gZW50cmllcyBpcyByZXR1cm5lZC4gVGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYXJlIHNvcnRlZCBieQorZnVsbCBuYW1lLCBwcmVmZXJyZWQgZW1haWwgYW5kIGlkLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy84MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3L21lbWJlcnMvIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgWworICAgIHsKKyAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgfSwKKyAgICB7CisgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgIH0KKyAgXQorLS0tLQorCisuR2V0IGFsbCBtZW1iZXJzIG9mIHRoZSAnQWRtaW5pc3RyYXRvcnMnIGdyb3VwIChub3JtYWxseSBncm91cCBpZCA9IDEpCisqKioqCitnZXQ6Oi9ncm91cHMvMS9tZW1iZXJzLworKioqKgorCitUbyByZXNvbHZlIHRoZSBpbmNsdWRlZCBncm91cHMgb2YgYSBncm91cCByZWN1cnNpdmVseSBhbmQgdG8gbGlzdCBhbGwKK21lbWJlcnMgdGhlIHBhcmFtZXRlciBgcmVjdXJzaXZlYCBjYW4gYmUgc2V0LgorCitNZW1iZXJzIGZyb20gaW5jbHVkZWQgZXh0ZXJuYWwgZ3JvdXBzIGFuZCBmcm9tIGluY2x1ZGVkIGdyb3VwcyB3aGljaAorYXJlIG5vdCB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHVzZXIgYXJlIGlnbm9yZWQuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLzgzNGVjMzZkZDVlMGVkMjFhMmZmNWQ3ZTIyNTVkYTA4MmQ2M2JiZDcvbWVtYmVycy8/cmVjdXJzaXZlIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgWworICAgIHsKKyAgICAgICJfYWNjb3VudF9pZCI6IDEwMDAwOTcsCisgICAgICAibmFtZSI6ICJKYW5lIFJvZSIsCisgICAgICAiZW1haWwiOiAiamFuZS5yb2VAZXhhbXBsZS5jb20iCisgICAgfSwKKyAgICB7CisgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDk2LAorICAgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICAgIH0sCisgICAgeworICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5OCwKKyAgICAgICJuYW1lIjogIlJpY2hhcmQgUm9lIiwKKyAgICAgICJlbWFpbCI6ICJyaWNoYXJkLnJvZUBleGFtcGxlLmNvbSIKKyAgICB9CisgIF0KKy0tLS0KKworW1tnZXQtZ3JvdXAtbWVtYmVyXV0KK0dldCBHcm91cCBNZW1iZXIKK35+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL21lbWJlcnMvbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dJworCitSZXRyaWV2ZXMgYSBncm91cCBtZW1iZXIuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvZ3JvdXBzLzgzNGVjMzZkZDVlMGVkMjFhMmZmNWQ3ZTIyNTVkYTA4MmQ2M2JiZDcvbWVtYmVycy8xMDAwMDk2IEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgZGV0YWlsZWQgbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1sKK0FjY291bnRJbmZvXSBlbnRpdHkgaXMgcmV0dXJuZWQgdGhhdCBkZXNjcmliZXMgdGhlIGdyb3VwIG1lbWJlci4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgIl9hY2NvdW50X2lkIjogMTAwMDA5NiwKKyAgICAibmFtZSI6ICJKb2huIERvZSIsCisgICAgImVtYWlsIjogImpvaG4uZG9lQGV4YW1wbGUuY29tIgorICB9CistLS0tCisKK1tbYWRkLWdyb3VwLW1lbWJlcl1dCitBZGQgR3JvdXAgTWVtYmVyCit+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUFVUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9tZW1iZXJzL2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWlkW1x7YWNjb3VudC1pZFx9XScKKworQWRkcyBhIHVzZXIgYXMgbWVtYmVyIHRvIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL2dyb3Vwcy9NeVByb2plY3QtQ29tbWl0dGVycy9tZW1iZXJzL0pvaG4lMjBEb2UgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBkZXRhaWxlZCBsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pbmZvWworQWNjb3VudEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0IGRlc2NyaWJlcyB0aGUgZ3JvdXAgbWVtYmVyLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAxIENyZWF0ZWQKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJfYWNjb3VudF9pZCI6IDEwMDAwMzcsCisgICAgIm5hbWUiOiAiSm9obiBEb2UiLAorICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgfQorLS0tLQorCitUaGUgcmVxdWVzdCBhbHNvIHN1Y2NlZWRzIGlmIHRoZSB1c2VyIGlzIGFscmVhZHkgYSBtZW1iZXIgb2YgdGhpcworZ3JvdXAsIGJ1dCB0aGVuIHRoZSBIVFRQIHJlc3BvbnNlIGNvZGUgaXMgYDIwMCBPS2AuCisKK0FkZCBHcm91cCBNZW1iZXJzCit+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL21lbWJlcnMnCisKK09SCisKK1t2ZXJzZV0KKydQT1NUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9tZW1iZXJzLmFkZCcKKworQWRkcyBvbmUgb3Igc2V2ZXJhbCB1c2VycyB0byBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworVGhlIHVzZXJzIHRvIGJlIGFkZGVkIHRvIHRoZSBncm91cCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkKK2FzIGEgbGluazojbWVtYmVycy1pbnB1dFtNZW1iZXJzSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzL21lbWJlcnMuYWRkIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJtZW1iZXJzIjogeworICAgICAgImphbmUucm9lQGV4YW1wbGUuY29tIiwKKyAgICAgICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICB9CisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaXN0IG9mIGRldGFpbGVkIGxpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bCitBY2NvdW50SW5mb10gZW50aXRpZXMgaXMgcmV0dXJuZWQgdGhhdCBkZXNjcmliZXMgdGhlIGdyb3VwIG1lbWJlcnMgdGhhdAord2VyZSBzcGVjaWZpZWQgaW4gdGhlIGxpbms6I21lbWJlcnMtaW5wdXRbTWVtYmVyc0lucHV0XS4gQW4KK2xpbms6cmVzdC1hcGktYWNjb3VudHMuaHRtbCNhY2NvdW50LWluZm9bQWNjb3VudEluZm9dIGVudGl0eQoraXMgcmV0dXJuZWQgZm9yIGVhY2ggdXNlciBzcGVjaWZpZWQgaW4gdGhlIGlucHV0LCBpbmRlcGVuZGVudGx5IG9mCit3aGV0aGVyIHRoZSB1c2VyIHdhcyBuZXdseSBhZGRlZCB0byB0aGUgZ3JvdXAgb3Igd2hldGhlciB0aGUgdXNlciB3YXMKK2FscmVhZHkgYSBtZW1iZXIgb2YgdGhlIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIFsKKyAgICB7CisgICAgICAiX2FjY291bnRfaWQiOiAxMDAwMDU3LAorICAgICAgIm5hbWUiOiAiSmFuZSBSb2UiLAorICAgICAgImVtYWlsIjogImphbmUucm9lQGV4YW1wbGUuY29tIgorICAgIH0sCisgICAgeworICAgICAgIl9hY2NvdW50X2lkIjogMTAwMDAzNywKKyAgICAgICJuYW1lIjogIkpvaG4gRG9lIiwKKyAgICAgICJlbWFpbCI6ICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICB9CisgIF0KKy0tLS0KKworW1tkZWxldGUtZ3JvdXAtbWVtYmVyXV0KK0RlbGV0ZSBHcm91cCBNZW1iZXIKK35+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydERUxFVEUgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL21lbWJlcnMvbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaWRbXHthY2NvdW50LWlkXH1dJworCitEZWxldGVzIGEgdXNlciBmcm9tIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL2dyb3Vwcy9NeVByb2plY3QtQ29tbWl0dGVycy9tZW1iZXJzL0pvaG4lMjBEb2UgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKK1tbZGVsZXRlLWdyb3VwLW1lbWJlcnNdXQorRGVsZXRlIEdyb3VwIE1lbWJlcnMKK35+fn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUE9TVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vbWVtYmVycy5kZWxldGUnCisKK0RlbGV0ZSBvbmUgb3Igc2V2ZXJhbCB1c2VycyBmcm9tIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitUaGUgdXNlcnMgdG8gYmUgZGVsZXRlZCBmcm9tIHRoZSBncm91cCBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0Citib2R5IGFzIGEgbGluazojbWVtYmVycy1pbnB1dFtNZW1iZXJzSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzL21lbWJlcnMuZGVsZXRlIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJtZW1iZXJzIjogeworICAgICAgImphbmUucm9lQGV4YW1wbGUuY29tIiwKKyAgICAgICJqb2huLmRvZUBleGFtcGxlLmNvbSIKKyAgICB9CisgIH0KKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKK1tbZ3JvdXAtaW5jbHVkZS1lbmRwb2ludHNdXQorR3JvdXAgSW5jbHVkZSBFbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbaW5jbHVkZWQtZ3JvdXBzXV0KK0xpc3QgSW5jbHVkZWQgR3JvdXBzCit+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vZ3JvdXBzLycKKworTGlzdHMgdGhlIGRpcmVjdGx5IGluY2x1ZGVkIGdyb3VwcyBvZiBhIGdyb3VwLgorCitBcyByZXN1bHQgYSBsaXN0IG9mIGxpbms6I2dyb3VwLWluZm9bR3JvdXBJbmZvXSBlbnRyaWVzIGlzIHJldHVybmVkLgorVGhlIGVudHJpZXMgaW4gdGhlIGxpc3QgYXJlIHNvcnRlZCBieSBncm91cCBuYW1lIGFuZCBVVUlELgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy84MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3L2dyb3Vwcy8gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgICAiaWQiOiAiN2NhMDQyZjRkNTg0NzkzNmZjYjkwY2E5MTA1NzY3MzE1N2ZkMDZmYyIsCisgICAgICAibmFtZSI6ICJNeVByb2plY3QtVmVyaWZpZXJzIiwKKyAgICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC03Y2EwNDJmNGQ1ODQ3OTM2ZmNiOTBjYTkxMDU3NjczMTU3ZmQwNmZjIiwKKyAgICAgICJvcHRpb25zIjogeworICAgICAgfSwKKyAgICAgICJncm91cF9pZCI6IDM4LAorICAgICAgIm93bmVyIjogIk15UHJvamVjdC1WZXJpZmllcnMiLAorICAgICAgIm93bmVyX2lkIjogIjdjYTA0MmY0ZDU4NDc5MzZmY2I5MGNhOTEwNTc2NzMxNTdmZDA2ZmMiCisgICAgfQorICBdCistLS0tCisKK1tbZ2V0LWluY2x1ZGVkLWdyb3VwXV0KK0dldCBJbmNsdWRlZCBHcm91cAorfn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XS9ncm91cHMvbGluazojZ3JvdXAtaWRbXHtncm91cC1pZFx9XScKKworUmV0cmlldmVzIGFuIGluY2x1ZGVkIGdyb3VwLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL2dyb3Vwcy84MzRlYzM2ZGQ1ZTBlZDIxYTJmZjVkN2UyMjU1ZGEwODJkNjNiYmQ3L2dyb3Vwcy83Y2EwNDJmNGQ1ODQ3OTM2ZmNiOTBjYTkxMDU3NjczMTU3ZmQwNmZjIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0eSBpcyByZXR1cm5lZCB0aGF0CitkZXNjcmliZXMgdGhlIGluY2x1ZGVkIGdyb3VwLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIiwKKyAgICAiaWQiOiAiN2NhMDQyZjRkNTg0NzkzNmZjYjkwY2E5MTA1NzY3MzE1N2ZkMDZmYyIsCisgICAgIm5hbWUiOiAiTXlQcm9qZWN0LVZlcmlmaWVycyIsCisgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTdjYTA0MmY0ZDU4NDc5MzZmY2I5MGNhOTEwNTc2NzMxNTdmZDA2ZmMiLAorICAgICJvcHRpb25zIjogeworICAgIH0sCisgICAgImdyb3VwX2lkIjogMzgsCisgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgfQorLS0tLQorCitbW2luY2x1ZGUtZ3JvdXBdXQorSW5jbHVkZSBHcm91cAorfn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0nCisKK0luY2x1ZGVzIGEgZ3JvdXAgaW50byBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9ncm91cHMvTXlQcm9qZWN0LUNvbW1pdHRlcnMvZ3JvdXBzL015R3JvdXAgSFRUUC8xLjAKKy0tLS0KKworQXMgcmVzcG9uc2UgYSBsaW5rOiNncm91cC1pbmZvW0dyb3VwSW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgaW5jbHVkZWQgZ3JvdXAuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDEgQ3JlYXRlZAorICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgImlkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICJuYW1lIjogIk15R3JvdXAiLAorICAgICJ1cmwiOiAiIy9hZG1pbi9ncm91cHMvdXVpZC02YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IiwKKyAgICAib3B0aW9ucyI6IHsKKyAgICB9LAorICAgICJncm91cF9pZCI6IDgsCisgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAib3duZXJfaWQiOiAiNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIKKyAgfQorLS0tLQorCitUaGUgcmVxdWVzdCBhbHNvIHN1Y2NlZWRzIGlmIHRoZSBncm91cCBpcyBhbHJlYWR5IGluY2x1ZGVkIGluIHRoaXMKK2dyb3VwLCBidXQgdGhlbiB0aGUgSFRUUCByZXNwb25zZSBjb2RlIGlzIGAyMDAgT0tgLgorCitbW2luY2x1ZGUtZ3JvdXBzXV0KK0luY2x1ZGUgR3JvdXBzCit+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2dyb3VwcycKKworT1IKKworW3ZlcnNlXQorJ1BPU1QgL2dyb3Vwcy9saW5rOiNncm91cC1pZFtce2dyb3VwLWlkXH1dL2dyb3Vwcy5hZGQnCisKK0luY2x1ZGVzIG9uZSBvciBzZXZlcmFsIGdyb3VwcyBpbnRvIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitUaGUgZ3JvdXBzIHRvIGJlIGluY2x1ZGVkIGludG8gdGhlIGdyb3VwIG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlCityZXF1ZXN0IGJvZHkgYXMgYSBsaW5rOiNncm91cHMtaW5wdXRbR3JvdXBzSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUE9TVCAvZ3JvdXBzL015UHJvamVjdC1Db21taXR0ZXJzL2dyb3Vwcy5hZGQgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgImdyb3VwcyI6IHsKKyAgICAgICJNeUdyb3VwIiwKKyAgICAgICJNeU90aGVyR3JvdXAiCisgICAgfQorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGlzdCBvZiBsaW5rOiNncm91cC1pbmZvW0dyb3VwSW5mb10gZW50aXRpZXMgaXMKK3JldHVybmVkIHRoYXQgZGVzY3JpYmVzIHRoZSBncm91cHMgdGhhdCB3ZXJlIHNwZWNpZmllZCBpbiB0aGUKK2xpbms6I2dyb3Vwcy1pbnB1dFtHcm91cHNJbnB1dF0uIEEgbGluazojZ3JvdXAtaW5mb1tHcm91cEluZm9dIGVudGl0eQoraXMgcmV0dXJuZWQgZm9yIGVhY2ggZ3JvdXAgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCwgaW5kZXBlbmRlbnRseSBvZgord2hldGhlciB0aGUgZ3JvdXAgd2FzIG5ld2x5IGluY2x1ZGVkIGludG8gdGhlIGdyb3VwIG9yIHdoZXRoZXIgdGhlCitncm91cCB3YXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgZ3JvdXAuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgWworICAgIHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZ3JvdXAiLAorICAgICAgImlkIjogIjZhMWU3MGUxYTg4NzgyNzcxYTkxODA4YzhhZjliYmI3YTk4NzEzODkiLAorICAgICAgIm5hbWUiOiAiTXlHcm91cCIsCisgICAgICAidXJsIjogIiMvYWRtaW4vZ3JvdXBzL3V1aWQtNmExZTcwZTFhODg3ODI3NzFhOTE4MDhjOGFmOWJiYjdhOTg3MTM4OSIsCisgICAgICAib3B0aW9ucyI6IHsKKyAgICAgIH0sCisgICAgICAiZ3JvdXBfaWQiOiA4LAorICAgICAgIm93bmVyIjogIkFkbWluaXN0cmF0b3JzIiwKKyAgICAgICJvd25lcl9pZCI6ICI2YTFlNzBlMWE4ODc4Mjc3MWE5MTgwOGM4YWY5YmJiN2E5ODcxMzg5IgorICAgIH0sCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNncm91cCIsCisgICAgICAiaWQiOiAiNTA1N2YzY2JkMzUxOWQ2YWI2OTM2NDQyOWE4OWZmZGZmYmE1MGY3MyIsCisgICAgICAibmFtZSI6ICJNeU90aGVyR3JvdXAiLAorICAgICAgInVybCI6ICIjL2FkbWluL2dyb3Vwcy91dWlkLTUwNTdmM2NiZDM1MTlkNmFiNjkzNjQ0MjlhODlmZmRmZmJhNTBmNzMiLAorICAgICAgIm9wdGlvbnMiOiB7CisgICAgICB9LAorICAgICAgImdyb3VwX2lkIjogMTAsCisgICAgICAib3duZXIiOiAiTXlPdGhlckdyb3VwIiwKKyAgICAgICJvd25lcl9pZCI6ICI1MDU3ZjNjYmQzNTE5ZDZhYjY5MzY0NDI5YTg5ZmZkZmZiYTUwZjczIgorICAgIH0KKyAgXQorLS0tLQorCitbW2RlbGV0ZS1pbmNsdWRlZC1ncm91cF1dCitEZWxldGUgSW5jbHVkZWQgR3JvdXAKK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0RFTEVURSAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0nCisKK0RlbGV0ZXMgYW4gaW5jbHVkZWQgZ3JvdXAgZnJvbSBhIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKworLlJlcXVlc3QKKy0tLS0KKyAgREVMRVRFIC9ncm91cHMvTXlQcm9qZWN0LUNvbW1pdHRlcnMvZ3JvdXBzL015R3JvdXAgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwNCBObyBDb250ZW50CistLS0tCisKK1tbZGVsZXRlLWluY2x1ZGVkLWdyb3Vwc11dCitEZWxldGUgSW5jbHVkZWQgR3JvdXBzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnUE9TVCAvZ3JvdXBzL2xpbms6I2dyb3VwLWlkW1x7Z3JvdXAtaWRcfV0vZ3JvdXBzLmRlbGV0ZScKKworRGVsZXRlIG9uZSBvciBzZXZlcmFsIGluY2x1ZGVkIGdyb3VwcyBmcm9tIGEgR2Vycml0IGludGVybmFsIGdyb3VwLgorCitUaGUgZ3JvdXBzIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZ3JvdXAgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdAorYm9keSBhcyBhIGxpbms6I2dyb3Vwcy1pbnB1dFtHcm91cHNJbnB1dF0gZW50aXR5LgorCisuUmVxdWVzdAorLS0tLQorICBQT1NUIC9ncm91cHMvTXlQcm9qZWN0LUNvbW1pdHRlcnMvZ3JvdXBzLmRlbGV0ZSBIVFRQLzEuMAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgIHsKKyAgICAibWVtYmVycyI6IHsKKyAgICAgICJNeUdyb3VwIiwKKyAgICAgICJNeU90aGVyR3JvdXAiCisgICAgfQorICB9CistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDQgTm8gQ29udGVudAorLS0tLQorCisKK1tbaWRzXV0KK0lEcworLS0tCisKK1tbYWNjb3VudC1pZF1dCitsaW5rOnJlc3QtYXBpLWFjY291bnRzLmh0bWwjYWNjb3VudC1pZFtce2FjY291bnQtaWRcfV0KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLS0KKy0tCisKK1tbZ3JvdXAtaWRdXQorXHtncm91cC1pZFx9Cit+fn5+fn5+fn5+fn4KK0lkZW50aWZpZXIgZm9yIGEgZ3JvdXAuCisKK1RoaXMgY2FuIGJlOgorCisqIHRoZSBVVUlEIG9mIHRoZSBncm91cAorKiB0aGUgbGVnYWN5IG51bWVyaWMgSUQgb2YgdGhlIGdyb3VwCisqIHRoZSBuYW1lIG9mIHRoZSBncm91cCBpZiBpdCBpcyB1bmlxdWUKKworW1tncm91cC1uYW1lXV0KK1x7Z3JvdXAtbmFtZVx9Cit+fn5+fn5+fn5+fn5+fgorR3JvdXAgbmFtZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgb25lIGdyb3VwLgorCisKK1tbanNvbi1lbnRpdGllc11dCitKU09OIEVudGl0aWVzCistLS0tLS0tLS0tLS0tCisKK1tbZ3JvdXAtaW5mb11dCitHcm91cEluZm8KK35+fn5+fn5+fgorVGhlIGBHcm91cEluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGdyb3VwLiBUaGlzIGNhbiBiZQorYSBHZXJyaXQgaW50ZXJuYWwgZ3JvdXAsIG9yIGFuIGV4dGVybmFsIGdyb3VwIHRoYXQgaXMga25vd24gdG8gR2Vycml0LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4xLDUiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGBraW5kYCAgICAgICAgfHxgZ2Vycml0Y29kZXJldmlldyNncm91cGAKK3xgaWRgICAgICAgICAgIHx8VGhlIFVSTCBlbmNvZGVkIFVVSUQgb2YgdGhlIGdyb3VwLgorfGBuYW1lYCAgICAgICAgfAorbm90IHNldCBpZiByZXR1cm5lZCBpbiBhIG1hcCB3aGVyZSB0aGUgZ3JvdXAgbmFtZSBpcyB1c2VkIGFzIG1hcCBrZXl8CitUaGUgbmFtZSBvZiB0aGUgZ3JvdXAuCit8YHVybGAgICAgICAgICB8b3B0aW9uYWx8CitVUkwgdG8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdyb3VwLiBUeXBpY2FsbHkgYSBVUkwgdG8gYSB3ZWIgcGFnZSB0aGF0CitwZXJtaXRzIHVzZXJzIHRvIGFwcGx5IHRvIGpvaW4gdGhlIGdyb3VwLCBvciBtYW5hZ2UgdGhlaXIgbWVtYmVyc2hpcC4KK3xgb3B0aW9uc2AgICAgIHx8bGluazojZ3JvdXAtb3B0aW9ucy1pbmZvW09wdGlvbnMgb2YgdGhlIGdyb3VwXQorfGBkZXNjcmlwdGlvbmAgfG9ubHkgZm9yIGludGVybmFsIGdyb3Vwc3xUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGdyb3VwLgorfGBncm91cF9pZGAgICAgfG9ubHkgZm9yIGludGVybmFsIGdyb3Vwc3xUaGUgbnVtZXJpYyBJRCBvZiB0aGUgZ3JvdXAuCit8YG93bmVyYCAgICAgICB8b25seSBmb3IgaW50ZXJuYWwgZ3JvdXBzfFRoZSBuYW1lIG9mIHRoZSBvd25lciBncm91cC4KK3xgb3duZXJfaWRgICAgIHxvbmx5IGZvciBpbnRlcm5hbCBncm91cHN8VGhlIFVSTCBlbmNvZGVkIFVVSUQgb2YgdGhlIG93bmVyIGdyb3VwLgorfGBtZW1iZXJzYCAgICAgfG9wdGlvbmFsLCBvbmx5IGZvciBpbnRlcm5hbCBncm91cHN8CitBIGxpc3Qgb2YgbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sI2FjY291bnQtaW5mb1tBY2NvdW50SW5mb10KK2VudGl0aWVzIGRlc2NyaWJpbmcgdGhlIGRpcmVjdCBtZW1iZXJzLiArCitPbmx5IHNldCBpZiBsaW5rOiNtZW1iZXJzW21lbWJlcnNdIGFyZSByZXF1ZXN0ZWQuCit8YGluY2x1ZGVzYCAgICB8b3B0aW9uYWwsIG9ubHkgZm9yIGludGVybmFsIGdyb3Vwc3wKK0EgbGlzdCBvZiBsaW5rOiNncm91cC1pbmZvW0dyb3VwSW5mb10gZW50aXRpZXMgZGVzY3JpYmluZyB0aGUgZGlyZWN0bHkKK2luY2x1ZGVkIGdyb3Vwcy4gKworT25seSBzZXQgaWYgbGluazojaW5jbHVkZXNbaW5jbHVkZWQgZ3JvdXBzXSBhcmUgcmVxdWVzdGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgdHlwZSBvZiBhIGdyb3VwIGNhbiBiZSBkZWR1Y2VkIGZyb20gdGhlIGdyb3VwJ3MgVVVJRDoKK1t3aWR0aD0iNTAlIl0KK3w9PT09PT09PT09PT0KK3xVVUlEIG1hdGNoZXMgIl5bMC05YS1mXVx7NDBcfSQifEdlcnJpdCBpbnRlcm5hbCBncm91cAorfFVVSUQgc3RhcnRzIHdpdGggImdsb2JhbDoifEdlcnJpdCBzeXN0ZW0gZ3JvdXAKK3xVVUlEIHN0YXJ0cyB3aXRoICJsZGFwOiJ8TERBUCBncm91cAorfFVVSUQgc3RhcnRzIHdpdGggIjxwcmVmaXg+OiJ8b3RoZXIgZXh0ZXJuYWwgZ3JvdXAKK3w9PT09PT09PT09PT0KKworW1tncm91cC1pbnB1dF1dCitHcm91cElucHV0Cit+fn5+fn5+fn5+CitUaGUgJ0dyb3VwSW5wdXQnIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNyZWF0aW9uIG9mCithIG5ldyBpbnRlcm5hbCBncm91cC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGBuYW1lYCAgICAgICAgICB8b3B0aW9uYWx8VGhlIG5hbWUgb2YgdGhlIGdyb3VwIChub3QgZW5jb2RlZCkuICsKK0lmIHNldCwgbXVzdCBtYXRjaCB0aGUgZ3JvdXAgbmFtZSBpbiB0aGUgVVJMLgorfGBkZXNjcmlwdGlvbmAgICB8b3B0aW9uYWx8VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBncm91cC4KK3xgdmlzaWJsZV90b19hbGxgfG9wdGlvbmFsfAorV2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwgcmVnaXN0ZXJlZCB1c2Vycy4gKworYGZhbHNlYCBpZiBub3Qgc2V0LgorfGBvd25lcl9pZGB8b3B0aW9uYWx8VGhlIFVSTCBlbmNvZGVkIElEIG9mIHRoZSBvd25lciBncm91cC4gKworVGhpcyBjYW4gYmUgYSBncm91cCBVVUlELCBhIGxlZ2FjeSBudW1lcmljIGdyb3VwIElEIG9yIGEgdW5pcXVlIGdyb3VwCituYW1lLiArCitJZiBub3Qgc2V0LCB0aGUgbmV3IGdyb3VwIHdpbGwgYmUgc2VsZi1vd25lZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tncm91cHMtaW5wdXRdXQorR3JvdXBzSW5wdXQKK35+fn5+fn5+fn5+CitUaGUgYEdyb3Vwc0lucHV0YCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZ3JvdXBzIHRoYXQgc2hvdWxkCitiZSBpbmNsdWRlZCBpbnRvIGEgZ3JvdXAgb3IgdGhhdCBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIGEgZ3JvdXAuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgfHxEZXNjcmlwdGlvbgorfGBfb25lX2dyb3VwYCB8b3B0aW9uYWx8CitUaGUgbGluazojZ3JvdXAtaWRbaWRdIG9mIG9uZSBncm91cCB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBvciBkZWxldGVkLgorfGBncm91cHNgICAgICB8b3B0aW9uYWx8CitBIGxpc3Qgb2YgbGluazojZ3JvdXAtaWRbZ3JvdXAgaWRzXSB0aGF0IGlkZW50aWZ5IHRoZSBncm91cHMgdGhhdAorc2hvdWxkIGJlIGluY2x1ZGVkIG9yIGRlbGV0ZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tncm91cC1vcHRpb25zLWluZm9dXQorR3JvdXBPcHRpb25zSW5mbworfn5+fn5+fn5+fn5+fn5+fgorT3B0aW9ucyBvZiB0aGUgZ3JvdXAuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjEsNSJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGB2aXNpYmxlX3RvX2FsbGB8bm90IHNldCBpZiBgZmFsc2VgfAorV2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwgcmVnaXN0ZXJlZCB1c2Vycy4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW2dyb3VwLW9wdGlvbnMtaW5wdXRdXQorR3JvdXBPcHRpb25zSW5wdXQKK35+fn5+fn5+fn5+fn5+fn5+CitOZXcgb3B0aW9ucyBmb3IgYSBncm91cC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICB8fERlc2NyaXB0aW9uCit8YHZpc2libGVfdG9fYWxsYHxub3Qgc2V0IGlmIGBmYWxzZWB8CitXaGV0aGVyIHRoZSBncm91cCBpcyB2aXNpYmxlIHRvIGFsbCByZWdpc3RlcmVkIHVzZXJzLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbbWVtYmVycy1pbnB1dF1dCitNZW1iZXJzSW5wdXQKK35+fn5+fn5+fn5+CitUaGUgYE1lbWJlcnNJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFjY291bnRzIHRoYXQgc2hvdWxkCitiZSBhZGRlZCBhcyBtZW1iZXJzIHRvIGEgZ3JvdXAgb3IgdGhhdCBzaG91bGQgYmUgZGVsZXRlZCBmcm9tIHRoZSBncm91cC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMSw1Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICB8fERlc2NyaXB0aW9uCit8YF9vbmVfbWVtYmVyYHxvcHRpb25hbHwKK1RoZSBsaW5rOiNhY2NvdW50LWlkW2lkXSBvZiBvbmUgYWNjb3VudCB0aGF0IHNob3VsZCBiZSBhZGRlZCBvcgorZGVsZXRlZC4KK3xgbWVtYmVyc2AgICAgfG9wdGlvbmFsfAorQSBsaXN0IG9mIGxpbms6I2FjY291bnQtaWRbYWNjb3VudCBpZHNdIHRoYXQgaWRlbnRpZnkgdGhlIGFjY291bnRzIHRoYXQKK3Nob3VsZCBiZSBhZGRlZCBvciBkZWxldGVkLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworR0VSUklUCistLS0tLS0KK1BhcnQgb2YgbGluazppbmRleC5odG1sW0dlcnJpdCBDb2RlIFJldmlld10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcmVzdC1hcGktcHJvamVjdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS1wcm9qZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiYTBlOQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vcmVzdC1hcGktcHJvamVjdHMudHh0CkBAIC0wLDAgKzEsOTAyIEBACitHZXJyaXQgQ29kZSBSZXZpZXcgLSAvcHJvamVjdHMvIFJFU1QgQVBJCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgcGFnZSBkZXNjcmliZXMgdGhlIHByb2plY3QgcmVsYXRlZCBSRVNUIGVuZHBvaW50cy4KK1BsZWFzZSBhbHNvIHRha2Ugbm90ZSBvZiB0aGUgZ2VuZXJhbCBpbmZvcm1hdGlvbiBvbiB0aGUKK2xpbms6cmVzdC1hcGkuaHRtbFtSRVNUIEFQSV0uCisKK0VuZHBvaW50cworLS0tLS0tLS0tCisKK1tbcHJvamVjdC1lbmRwb2ludHNdXQorUHJvamVjdCBFbmRwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1tbbGlzdC1wcm9qZWN0c11dCitMaXN0IFByb2plY3RzCit+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9wcm9qZWN0cy8nCisKK0xpc3RzIHRoZSBwcm9qZWN0cyBhY2Nlc3NpYmxlIGJ5IHRoZSBjYWxsZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMKK3VzaW5nIHRoZSBsaW5rOmNtZC1scy1wcm9qZWN0cy5odG1sW2xzLXByb2plY3RzXSBjb21tYW5kIG92ZXIgU1NILAorYW5kIGFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyBxdWVyeSBwYXJhbWV0ZXJzLgorCitBcyByZXN1bHQgYSBtYXAgaXMgcmV0dXJuZWQgdGhhdCBtYXBzIHRoZSBwcm9qZWN0IG5hbWVzIHRvCitsaW5rOiNwcm9qZWN0LWluZm9bUHJvamVjdEluZm9dIGVudHJpZXMuIFRoZSBlbnRyaWVzIGluIHRoZSBtYXAgYXJlIHNvcnRlZAorYnkgcHJvamVjdCBuYW1lLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzLz9kIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJleHRlcm5hbC9iaXNvbiI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcHJvamVjdCIsCisgICAgICAiaWQiOiAiZXh0ZXJuYWwlMkZiaXNvbiIsCisgICAgICAiZGVzY3JpcHRpb24iOiAiR05VIHBhcnNlciBnZW5lcmF0b3IiCisgICAgfSwKKyAgICAiZXh0ZXJuYWwvZ2NjIjogeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNwcm9qZWN0IiwKKyAgICAgICJpZCI6ICJleHRlcm5hbCUyRmdjYyIsCisgICAgfSwKKyAgICAiZXh0ZXJuYWwvb3BlbnNzbCI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcHJvamVjdCIsCisgICAgICAiaWQiOiAiZXh0ZXJuYWwlMkZvcGVuc3NsIiwKKyAgICAgICJkZXNjcmlwdGlvbiI6ICJlbmNyeXB0aW9uXG5jcnlwdG8gcm91dGluZXMiCisgICAgfSwKKyAgICAidGVzdCI6IHsKKyAgICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcHJvamVjdCIsCisgICAgICAiaWQiOiAidGVzdCIsCisgICAgICAiZGVzY3JpcHRpb24iOiAiXHUwMDNjaHRtbFx1MDAzZSBpcyBlc2NhcGVkIgorICAgIH0KKyAgfQorLS0tLQorCisuR2V0IGFsbCBwcm9qZWN0cyB3aXRoIHRoZWlyIGRlc2NyaXB0aW9uCisqKioqCitnZXQ6Oi9wcm9qZWN0cy8/ZAorKioqKgorCitbW3N1Z2dlc3QtcHJvamVjdHNdXQorVGhlIGAvcHJvamVjdHMvYCBVUkwgYWxzbyBhY2NlcHRzIGEgcHJlZml4IHN0cmluZyBpbiB0aGUgYHBgIHBhcmFtZXRlci4KK1RoaXMgbGltaXRzIHRoZSByZXN1bHRzIHRvIHRob3NlIHByb2plY3RzIHRoYXQgc3RhcnQgd2l0aCB0aGUgc3BlY2lmaWVkCitwcmVmaXguCitMaXN0IGFsbCBwcm9qZWN0cyB0aGF0IHN0YXJ0IHdpdGggYHBsYXRmb3JtL2A6CisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvcHJvamVjdHMvP3A9cGxhdGZvcm0lMkYgSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgInBsYXRmb3JtL2RyaXZlcnMiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Byb2plY3QiLAorICAgICAgImlkIjogInBsYXRmb3JtJTJGZHJpdmVycyIsCisgICAgfSwKKyAgICAicGxhdGZvcm0vdG9vbHMiOiB7CisgICAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I3Byb2plY3QiLAorICAgICAgImlkIjogInBsYXRmb3JtJTJGdG9vbHMiLAorICAgIH0KKyAgfQorLS0tLQorRS5nLiB0aGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgYnkgc3VnZ2VzdGlvbiBjbGllbnQgVUkncyB0byBsaW1pdCByZXN1bHRzLgorCitbW2dldC1wcm9qZWN0XV0KK0dldCBQcm9qZWN0Cit+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0dFVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dJworCitSZXRyaWV2ZXMgYSBwcm9qZWN0LgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzL3BsdWdpbnMlMkZyZXBsaWNhdGlvbiBIVFRQLzEuMAorLS0tLQorCitBcyByZXNwb25zZSBhIGxpbms6I3Byb2plY3QtaW5mb1tQcm9qZWN0SW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgcHJvamVjdC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICB7CisgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNwcm9qZWN0IiwKKyAgICAiaWQiOiAicGx1Z2lucyUyRnJlcGxpY2F0aW9uIiwKKyAgICAibmFtZSI6ICJwbHVnaW5zL3JlcGxpY2F0aW9uIiwKKyAgICAicGFyZW50IjogIlB1YmxpYy1QbHVnaW5zIiwKKyAgICAiZGVzY3JpcHRpb24iOiAiQ29waWVzIHRvIG90aGVyIHNlcnZlcnMgdXNpbmcgdGhlIEdpdCBwcm90b2NvbCIKKyAgfQorLS0tLQorCitbW2NyZWF0ZS1wcm9qZWN0XV0KK0NyZWF0ZSBQcm9qZWN0Cit+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dJworCitDcmVhdGVzIGEgbmV3IHByb2plY3QuCisKK0luIHRoZSByZXF1ZXN0IGJvZHkgYWRkaXRpb25hbCBkYXRhIGZvciB0aGUgcHJvamVjdCBjYW4gYmUgcHJvdmlkZWQgYXMKK2xpbms6I3Byb2plY3QtaW5wdXRbUHJvamVjdElucHV0XS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9wcm9qZWN0cy9NeVByb2plY3QgSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYSBkZW1vIHByb2plY3QuIiwKKyAgICAic3VibWl0X3R5cGUiOiAiQ0hFUlJZX1BJQ0siLAorICAgICJvd25lcnMiOiBbCisgICAgICAiTXlQcm9qZWN0LU93bmVycyIKKyAgICBdCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgdGhlIGxpbms6I3Byb2plY3QtaW5mb1tQcm9qZWN0SW5mb10gZW50aXR5IGlzIHJldHVybmVkIHRoYXQKK2Rlc2NyaWJlcyB0aGUgY3JlYXRlZCBwcm9qZWN0LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAxIENyZWF0ZWQKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjcHJvamVjdCIsCisgICAgImlkIjogIk15UHJvamVjdCIsCisgICAgIm5hbWUiOiAiTXlQcm9qZWN0IiwKKyAgICAicGFyZW50IjogIkFsbC1Qcm9qZWN0cyIsCisgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYSBkZW1vIHByb2plY3QuIgorICB9CistLS0tCisKK1tbZ2V0LXByb2plY3QtZGVzY3JpcHRpb25dXQorR2V0IFByb2plY3QgRGVzY3JpcHRpb24KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vZGVzY3JpcHRpb24nCisKK1JldHJpZXZlcyB0aGUgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0LgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzL3BsdWdpbnMlMkZyZXBsaWNhdGlvbi9kZXNjcmlwdGlvbiBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgICJDb3BpZXMgdG8gb3RoZXIgc2VydmVycyB1c2luZyB0aGUgR2l0IHByb3RvY29sIgorLS0tLQorCitJZiB0aGUgcHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgZGVzY3JpcHRpb24gYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorCitbW3NldC1wcm9qZWN0LWRlc2NyaXB0aW9uXV0KK1NldCBQcm9qZWN0IERlc2NyaXB0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL2Rlc2NyaXB0aW9uJworCitTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QuCisKK1RoZSBuZXcgcHJvamVjdCBkZXNjcmlwdGlvbiBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGJvZHkgaW5zaWRlCithIGxpbms6I3Byb2plY3QtZGVzY3JpcHRpb24taW5wdXRbUHJvamVjdERlc2NyaXB0aW9uSW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vZGVzY3JpcHRpb24gSFRUUC8xLjAKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICB7CisgICAgImRlc2NyaXB0aW9uIjogIlBsdWdpbiBmb3IgR2Vycml0IHRoYXQgaGFuZGxlcyB0aGUgcmVwbGljYXRpb24uIiwKKyAgICAiY29tbWl0X21lc3NhZ2UiOiAiVXBkYXRlIHRoZSBwcm9qZWN0IGRlc2NyaXB0aW9uIgorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcgcHJvamVjdCBkZXNjcmlwdGlvbiBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiUGx1Z2luIGZvciBHZXJyaXQgdGhhdCBoYW5kbGVzIHRoZSByZXBsaWNhdGlvbi4iCistLS0tCisKK0lmIHRoZSBkZXNjcmlwdGlvbiB3YXMgZGVsZXRlZCB0aGUgcmVzcG9uc2UgaXMgImAyMDQgTm8gQ29udGVudGAiLgorCitbW2RlbGV0ZS1wcm9qZWN0LWRlc2NyaXB0aW9uXV0KK0RlbGV0ZSBQcm9qZWN0IERlc2NyaXB0aW9uCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0RFTEVURSAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL2Rlc2NyaXB0aW9uJworCitEZWxldGVzIHRoZSBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QuCisKK1RoZSByZXF1ZXN0IGJvZHkgZG9lcyBub3QgbmVlZCB0byBpbmNsdWRlIGEKK2xpbms6I3Byb2plY3QtZGVzY3JpcHRpb24taW5wdXRbUHJvamVjdERlc2NyaXB0aW9uSW5wdXRdIGVudGl0eSBpZiBubworY29tbWl0IG1lc3NhZ2UgaXMgc3BlY2lmaWVkLgorCitQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgcHJveGllcyBwcm9oaWJpdCByZXF1ZXN0IGJvZGllcyBmb3IgREVMRVRFCityZXF1ZXN0cy4gSW4gdGhpcyBjYXNlLCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgY29tbWl0IG1lc3NhZ2UsIHVzZQorbGluazojc2V0LXByb2plY3QtZGVzY3JpcHRpb25bUFVUXSB0byBkZWxldGUgdGhlIGRlc2NyaXB0aW9uLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL3Byb2plY3RzL3BsdWdpbnMlMkZyZXBsaWNhdGlvbi9kZXNjcmlwdGlvbiBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjA0IE5vIENvbnRlbnQKKy0tLS0KKworW1tnZXQtcHJvamVjdC1wYXJlbnRdXQorR2V0IFByb2plY3QgUGFyZW50Cit+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydHRVQgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9wYXJlbnQnCisKK1JldHJpZXZlcyB0aGUgbmFtZSBvZiBhIHByb2plY3QncyBwYXJlbnQgcHJvamVjdC4gRm9yIHRoZQorYEFsbC1Qcm9qZWN0c2Agcm9vdCBwcm9qZWN0IGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vcGFyZW50IEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgIkFsbC1Qcm9qZWN0cyIKKy0tLS0KKworW1tzZXQtcHJvamVjdC1wYXJlbnRdXQorU2V0IFByb2plY3QgUGFyZW50Cit+fn5+fn5+fn5+fn5+fn5+fn4KK1t2ZXJzZV0KKydQVVQgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9wYXJlbnQnCisKK1NldHMgdGhlIHBhcmVudCBwcm9qZWN0IGZvciBhIHByb2plY3QuCisKK1RoZSBuZXcgbmFtZSBvZiB0aGUgcGFyZW50IHByb2plY3QgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdCBib2R5CitpbnNpZGUgYSBsaW5rOiNwcm9qZWN0LXBhcmVudC1pbnB1dFtQcm9qZWN0UGFyZW50SW5wdXRdIGVudGl0eS4KKworLlJlcXVlc3QKKy0tLS0KKyAgUFVUIC9wcm9qZWN0cy9wbHVnaW5zJTJGcmVwbGljYXRpb24vcGFyZW50IEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJwYXJlbnQiOiAiUHVibGljLVBsdWdpbnMiLAorICAgICJjb21taXRfbWVzc2FnZSI6ICJVcGRhdGUgdGhlIHByb2plY3QgcGFyZW50IgorICB9CistLS0tCisKK0FzIHJlc3BvbnNlIHRoZSBuZXcgcGFyZW50IHByb2plY3QgbmFtZSBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAiUHVibGljLVBsdWdpbnMiCistLS0tCisKK1tbZ2V0LWhlYWRdXQorR2V0IEhFQUQKK35+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vSEVBRCcKKworUmV0cmlldmVzIGZvciBhIHByb2plY3QgdGhlIG5hbWUgb2YgdGhlIGJyYW5jaCB0byB3aGljaCBgSEVBRGAgcG9pbnRzLgorCisuUmVxdWVzdAorLS0tLQorICBHRVQgL3Byb2plY3RzL3BsdWdpbnMlMkZyZXBsaWNhdGlvbi9IRUFEIEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgInJlZnMvaGVhZHMvbWFzdGVyIgorLS0tLQorCitbW3NldC1oZWFkXV0KK1NldCBIRUFECit+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL0hFQUQnCisKK1NldHMgYEhFQURgIGZvciBhIHByb2plY3QuCisKK1RoZSBuZXcgcmVmIHRvIHdoaWNoIGBIRUFEYCBzaG91bGQgcG9pbnQgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUKK3JlcXVlc3QgYm9keSBpbnNpZGUgYSBsaW5rOiNoZWFkLWlucHV0W0hlYWRJbnB1dF0gZW50aXR5LgorCisuUmVxdWVzdAorLS0tLQorICBQVVQgL3Byb2plY3RzL3BsdWdpbnMlMkZyZXBsaWNhdGlvbi9IRUFEIEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJyZWYiOiAicmVmcy9oZWFkcy9zdGFibGUiCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgdGhlIG5ldyByZWYgdG8gd2hpY2ggYEhFQURgIHBvaW50cyBpcyByZXR1cm5lZC4KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICAicmVmcy9oZWFkcy9zdGFibGUiCistLS0tCisKK1tbZ2V0LXJlcG9zaXRvcnktc3RhdGlzdGljc11dCitHZXQgUmVwb3NpdG9yeSBTdGF0aXN0aWNzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vc3RhdGlzdGljcy5naXQnCisKK1JldHVybiBzdGF0aXN0aWNzIGZvciB0aGUgcmVwb3NpdG9yeSBvZiBhIHByb2plY3QuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvcHJvamVjdHMvcGx1Z2lucyUyRnJlcGxpY2F0aW9uL3N0YXRpc3RpY3MuZ2l0IEhUVFAvMS4wCistLS0tCisKK1RoZSByZXBvc2l0b3J5IHN0YXRpc3RpY3MgYXJlIHJldHVybmVkIGFzIGEKK2xpbms6I3JlcG9zaXRvcnktc3RhdGlzdGljcy1pbmZvW1JlcG9zaXRvcnlTdGF0aXN0aWNzSW5mb10gZW50aXR5LgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAibnVtYmVyX29mX2xvb3NlX29iamVjdHMiOiAxMjcsCisgICAgIm51bWJlcl9vZl9sb29zZV9yZWZzIjogMTUsCisgICAgIm51bWJlcl9vZl9wYWNrX2ZpbGVzIjogMTUsCisgICAgIm51bWJlcl9vZl9wYWNrZWRfb2JqZWN0cyI6IDY3LAorICAgICJudW1iZXJfb2ZfcGFja2VkX3JlZnMiOiAwLAorICAgICJzaXplX29mX2xvb3NlX29iamVjdHMiOiAyOTQ2NiwKKyAgICAic2l6ZV9vZl9wYWNrZWRfb2JqZWN0cyI6IDk2NDYKKyAgfQorLS0tLQorCitbW3J1bi1nY11dCitSdW4gR0MKK35+fn5+fgorW3ZlcnNlXQorJ1BPU1QgL3Byb2plY3RzL2xpbms6I3Byb2plY3QtbmFtZVtce3Byb2plY3QtbmFtZVx9XS9nYycKKworUnVuIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciB0aGUgcmVwb3NpdG9yeSBvZiBhIHByb2plY3QuCisKKy5SZXF1ZXN0CistLS0tCisgIFBPU1QgL3Byb2plY3RzL3BsdWdpbnMlMkZyZXBsaWNhdGlvbi9nYyBIVFRQLzEuMAorLS0tLQorCitUaGUgcmVzcG9uc2UgaXMgdGhlIHN0cmVhbWVkIG91dHB1dCBvZiB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgKKworICBjb2xsZWN0aW5nIGdhcmJhZ2UgZm9yICJwbHVnaW5zL3JlcGxpY2F0aW9uIjoKKyAgUGFjayByZWZzOiAgICAgICAgICAgICAgMTAwJSAoMjEvMjEpCisgIENvdW50aW5nIG9iamVjdHM6ICAgICAgIDIwCisgIEZpbmRpbmcgc291cmNlczogICAgICAgIDEwMCUgKDIwLzIwKQorICBHZXR0aW5nIHNpemVzOiAgICAgICAgICAxMDAlICgxMy8xMykKKyAgQ29tcHJlc3Npbmcgb2JqZWN0czogICAgIDgzJSAoNS82KQorICBXcml0aW5nIG9iamVjdHM6ICAgICAgICAxMDAlICgyMC8yMCkKKyAgU2VsZWN0aW5nIGNvbW1pdHM6ICAgICAgMTAwJSAoNy83KQorICBCdWlsZGluZyBiaXRtYXBzOiAgICAgICAxMDAlICg3LzcpCisgIEZpbmRpbmcgc291cmNlczogICAgICAgIDEwMCUgKDQxLzQxKQorICBHZXR0aW5nIHNpemVzOiAgICAgICAgICAxMDAlICgyNS8yNSkKKyAgQ29tcHJlc3Npbmcgb2JqZWN0czogICAgIDUyJSAoMTIvMjMpCisgIFdyaXRpbmcgb2JqZWN0czogICAgICAgIDEwMCUgKDQxLzQxKQorICBQcnVuZSBsb29zZSBvYmplY3RzIGFsc28gZm91bmQgaW4gcGFjayBmaWxlczogMTAwJSAoMzYvMzYpCisgIFBydW5lIGxvb3NlLCB1bnJlZmVyZW5jZWQgb2JqZWN0czogMTAwJSAoMzYvMzYpCisgIGRvbmUuCistLS0tCisKK1tbZGFzaGJvYXJkLWVuZHBvaW50c11dCitEYXNoYm9hcmQgRW5kcG9pbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1tbbGlzdC1kYXNoYm9hcmRzXV0KK0xpc3QgRGFzaGJvYXJkcworfn5+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vZGFzaGJvYXJkcy8nCisKK0xpc3QgY3VzdG9tIGRhc2hib2FyZHMgZm9yIGEgcHJvamVjdC4KKworQXMgcmVzdWx0IGEgbGlzdCBvZiBsaW5rOiNkYXNoYm9hcmQtaW5mb1tEYXNoYm9hcmRJbmZvXSBlbnRyaWVzIGlzCityZXR1cm5lZC4KKworTGlzdCBhbGwgZGFzaGJvYXJkcyBmb3IgdGhlIGB3b3JrL215LXByb2plY3RgIHByb2plY3Q6CisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvcHJvamVjdHMvd29yayUyRm15LXByb2plY3QvZGFzaGJvYXJkcy8gSFRUUC8xLjAKKy0tLS0KKworLlJlc3BvbnNlCistLS0tCisgIEhUVFAvMS4xIDIwMCBPSworICBDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50CisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgKV19JworICBbCisgICAgeworICAgICAgImtpbmQiOiAiZ2Vycml0Y29kZXJldmlldyNkYXNoYm9hcmQiLAorICAgICAgImlkIjogIm1haW46Y2xvc2VkIiwKKyAgICAgICJyZWYiOiAibWFpbiIsCisgICAgICAicGF0aCI6ICJjbG9zZWQiLAorICAgICAgImRlc2NyaXB0aW9uIjogIk1lcmdlZCBhbmQgYWJhbmRvbmVkIGNoYW5nZXMgaW4gbGFzdCA3IHdlZWtzIiwKKyAgICAgICJ1cmwiOiAiL2Rhc2hib2FyZC8/dGl0bGVcdTAwM2RDbG9zZWQrY2hhbmdlc1x1MDAyNk1lcmdlZFx1MDAzZHN0YXR1czptZXJnZWQrYWdlOjd3XHUwMDI2QWJhbmRvbmVkXHUwMDNkc3RhdHVzOmFiYW5kb25lZCthZ2U6N3ciLAorICAgICAgImRlZmF1bHQiOiB0cnVlLAorICAgICAgInRpdGxlIjogIkNsb3NlZCBjaGFuZ2VzIiwKKyAgICAgICJzZWN0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJuYW1lIjogIk1lcmdlZCIsCisgICAgICAgICAgInF1ZXJ5IjogInN0YXR1czptZXJnZWQgYWdlOjd3IgorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgIm5hbWUiOiAiQWJhbmRvbmVkIiwKKyAgICAgICAgICAicXVlcnkiOiAic3RhdHVzOmFiYW5kb25lZCBhZ2U6N3ciCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9CisgIF0KKy0tLS0KKworLkdldCBhbGwgZGFzaGJvYXJkcyBvZiB0aGUgJ0FsbC1Qcm9qZWN0cycgcHJvamVjdAorKioqKgorZ2V0OjovcHJvamVjdHMvQWxsLVByb2plY3RzL2Rhc2hib2FyZHMvCisqKioqCisKK1tbZ2V0LWRhc2hib2FyZF1dCitHZXQgRGFzaGJvYXJkCit+fn5+fn5+fn5+fn5+CitbdmVyc2VdCisnR0VUIC9wcm9qZWN0cy9saW5rOiNwcm9qZWN0LW5hbWVbXHtwcm9qZWN0LW5hbWVcfV0vZGFzaGJvYXJkcy9saW5rOiNkYXNoYm9hcmQtaWRbXHtkYXNoYm9hcmQtaWRcfV0nCisKK1JldHJpZXZlcyBhIHByb2plY3QgZGFzaGJvYXJkLiBUaGUgZGFzaGJvYXJkIGNhbiBiZSBkZWZpbmVkIG9uIHRoYXQKK3Byb2plY3Qgb3IgYmUgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgcHJvamVjdC4KKworLlJlcXVlc3QKKy0tLS0KKyAgR0VUIC9wcm9qZWN0cy93b3JrJTJGbXktcHJvamVjdC9kYXNoYm9hcmRzL21haW46Y2xvc2VkIEhUVFAvMS4wCistLS0tCisKK0FzIHJlc3BvbnNlIGEgbGluazojZGFzaGJvYXJkLWluZm9bRGFzaGJvYXJkSW5mb10gZW50aXR5IGlzIHJldHVybmVkCit0aGF0IGRlc2NyaWJlcyB0aGUgZGFzaGJvYXJkLgorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjAwIE9LCisgIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKKyAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKKworICApXX0nCisgIHsKKyAgICAia2luZCI6ICJnZXJyaXRjb2RlcmV2aWV3I2Rhc2hib2FyZCIsCisgICAgImlkIjogIm1haW46Y2xvc2VkIiwKKyAgICAicmVmIjogIm1haW4iLAorICAgICJwYXRoIjogImNsb3NlZCIsCisgICAgImRlc2NyaXB0aW9uIjogIk1lcmdlZCBhbmQgYWJhbmRvbmVkIGNoYW5nZXMgaW4gbGFzdCA3IHdlZWtzIiwKKyAgICAidXJsIjogIi9kYXNoYm9hcmQvP3RpdGxlXHUwMDNkQ2xvc2VkK2NoYW5nZXNcdTAwMjZNZXJnZWRcdTAwM2RzdGF0dXM6bWVyZ2VkK2FnZTo3d1x1MDAyNkFiYW5kb25lZFx1MDAzZHN0YXR1czphYmFuZG9uZWQrYWdlOjd3IiwKKyAgICAiZGVmYXVsdCI6IHRydWUsCisgICAgInRpdGxlIjogIkNsb3NlZCBjaGFuZ2VzIiwKKyAgICAic2VjdGlvbnMiOiBbCisgICAgICB7CisgICAgICAgICJuYW1lIjogIk1lcmdlZCIsCisgICAgICAgICJxdWVyeSI6ICJzdGF0dXM6bWVyZ2VkIGFnZTo3dyIKKyAgICAgIH0sCisgICAgICB7CisgICAgICAgICJuYW1lIjogIkFiYW5kb25lZCIsCisgICAgICAgICJxdWVyeSI6ICJzdGF0dXM6YWJhbmRvbmVkIGFnZTo3dyIKKyAgICAgIH0KKyAgICBdCisgIH0KKy0tLS0KKworVG8gcmV0cmlldmUgdGhlIGRlZmF1bHQgZGFzaGJvYXJkIG9mIGEgcHJvamVjdCB1c2UgYGRlZmF1bHRgIGFzCitkYXNoYm9hcmQtaWQuCisKKy5SZXF1ZXN0CistLS0tCisgIEdFVCAvcHJvamVjdHMvd29yayUyRm15LXByb2plY3QvZGFzaGJvYXJkcy9kZWZhdWx0IEhUVFAvMS4wCistLS0tCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZGFzaGJvYXJkIiwKKyAgICAiaWQiOiAibWFpbjpjbG9zZWQiLAorICAgICJyZWYiOiAibWFpbiIsCisgICAgInBhdGgiOiAiY2xvc2VkIiwKKyAgICAiZGVzY3JpcHRpb24iOiAiTWVyZ2VkIGFuZCBhYmFuZG9uZWQgY2hhbmdlcyBpbiBsYXN0IDcgd2Vla3MiLAorICAgICJ1cmwiOiAiL2Rhc2hib2FyZC8/dGl0bGVcdTAwM2RDbG9zZWQrY2hhbmdlc1x1MDAyNk1lcmdlZFx1MDAzZHN0YXR1czptZXJnZWQrYWdlOjd3XHUwMDI2QWJhbmRvbmVkXHUwMDNkc3RhdHVzOmFiYW5kb25lZCthZ2U6N3ciLAorICAgICJkZWZhdWx0IjogdHJ1ZSwKKyAgICAidGl0bGUiOiAiQ2xvc2VkIGNoYW5nZXMiLAorICAgICJzZWN0aW9ucyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiTWVyZ2VkIiwKKyAgICAgICAgInF1ZXJ5IjogInN0YXR1czptZXJnZWQgYWdlOjd3IgorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiQWJhbmRvbmVkIiwKKyAgICAgICAgInF1ZXJ5IjogInN0YXR1czphYmFuZG9uZWQgYWdlOjd3IgorICAgICAgfQorICAgIF0KKyAgfQorLS0tLQorCitbW3NldC1kYXNoYm9hcmRdXQorU2V0IERhc2hib2FyZAorfn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ1BVVCAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL2Rhc2hib2FyZHMvbGluazojZGFzaGJvYXJkLWlkW1x7ZGFzaGJvYXJkLWlkXH1dJworCitVcGRhdGVzL0NyZWF0ZXMgYSBwcm9qZWN0IGRhc2hib2FyZC4KKworQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgYGRlZmF1bHRgIGRhc2hib2FyZC4KKworVGhlIGNyZWF0aW9uL3VwZGF0ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGRhc2hib2FyZCBtdXN0IGJlIHByb3ZpZGVkIGluCit0aGUgcmVxdWVzdCBib2R5IGFzIGEgbGluazojZGFzaGJvYXJkLWlucHV0W0Rhc2hib2FyZElucHV0XSBlbnRpdHkuCisKKy5SZXF1ZXN0CistLS0tCisgIFBVVCAvcHJvamVjdHMvd29yayUyRm15LXByb2plY3QvZGFzaGJvYXJkcy9kZWZhdWx0IEhUVFAvMS4wCisgIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04CisKKyAgeworICAgICJpZCI6ICJtYWluOmNsb3NlZCIsCisgICAgImNvbW1pdF9tZXNzYWdlIjogIkRlZmluZSB0aGUgZGVmYXVsdCBkYXNoYm9hcmQiCisgIH0KKy0tLS0KKworQXMgcmVzcG9uc2UgdGhlIG5ldy91cGRhdGVkIGRhc2hib2FyZCBpcyByZXR1cm5lZCBhcyBhCitsaW5rOiNkYXNoYm9hcmQtaW5mb1tEYXNoYm9hcmRJbmZvXSBlbnRpdHkuCisKKy5SZXNwb25zZQorLS0tLQorICBIVFRQLzEuMSAyMDAgT0sKKyAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAorICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorCisgICldfScKKyAgeworICAgICJraW5kIjogImdlcnJpdGNvZGVyZXZpZXcjZGFzaGJvYXJkIiwKKyAgICAiaWQiOiAibWFpbjpjbG9zZWQiLAorICAgICJyZWYiOiAibWFpbiIsCisgICAgInBhdGgiOiAiY2xvc2VkIiwKKyAgICAiZGVzY3JpcHRpb24iOiAiTWVyZ2VkIGFuZCBhYmFuZG9uZWQgY2hhbmdlcyBpbiBsYXN0IDcgd2Vla3MiLAorICAgICJ1cmwiOiAiL2Rhc2hib2FyZC8/dGl0bGVcdTAwM2RDbG9zZWQrY2hhbmdlc1x1MDAyNk1lcmdlZFx1MDAzZHN0YXR1czptZXJnZWQrYWdlOjd3XHUwMDI2QWJhbmRvbmVkXHUwMDNkc3RhdHVzOmFiYW5kb25lZCthZ2U6N3ciLAorICAgICJkZWZhdWx0IjogdHJ1ZSwKKyAgICAidGl0bGUiOiAiQ2xvc2VkIGNoYW5nZXMiLAorICAgICJzZWN0aW9ucyI6IFsKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiTWVyZ2VkIiwKKyAgICAgICAgInF1ZXJ5IjogInN0YXR1czptZXJnZWQgYWdlOjd3IgorICAgICAgfSwKKyAgICAgIHsKKyAgICAgICAgIm5hbWUiOiAiQWJhbmRvbmVkIiwKKyAgICAgICAgInF1ZXJ5IjogInN0YXR1czphYmFuZG9uZWQgYWdlOjd3IgorICAgICAgfQorICAgIF0KKyAgfQorLS0tLQorCitbW2RlbGV0ZS1kYXNoYm9hcmRdXQorRGVsZXRlIERhc2hib2FyZAorfn5+fn5+fn5+fn5+fn5+fgorW3ZlcnNlXQorJ0RFTEVURSAvcHJvamVjdHMvbGluazojcHJvamVjdC1uYW1lW1x7cHJvamVjdC1uYW1lXH1dL2Rhc2hib2FyZHMvbGluazojZGFzaGJvYXJkLWlkW1x7ZGFzaGJvYXJkLWlkXH1dJworCitEZWxldGVzIGEgcHJvamVjdCBkYXNoYm9hcmQuCisKK0N1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBmb3IgdGhlIGBkZWZhdWx0YCBkYXNoYm9hcmQuCisKK1RoZSByZXF1ZXN0IGJvZHkgZG9lcyBub3QgbmVlZCB0byBpbmNsdWRlIGEgbGluazojZGFzaGJvYXJkLWlucHV0WworRGFzaGJvYXJkSW5wdXRdIGVudGl0eSBpZiBubyBjb21taXQgbWVzc2FnZSBpcyBzcGVjaWZpZWQuCisKK1BsZWFzZSBub3RlIHRoYXQgc29tZSBwcm94aWVzIHByb2hpYml0IHJlcXVlc3QgYm9kaWVzIGZvciBERUxFVEUKK3JlcXVlc3RzLgorCisuUmVxdWVzdAorLS0tLQorICBERUxFVEUgL3Byb2plY3RzL3dvcmslMkZteS1wcm9qZWN0L2Rhc2hib2FyZHMvZGVmYXVsdCBIVFRQLzEuMAorLS0tLQorCisuUmVzcG9uc2UKKy0tLS0KKyAgSFRUUC8xLjEgMjA0IE5vIENvbnRlbnQKKy0tLS0KKworCitbW2lkc11dCitJRHMKKy0tLQorCitbW2Rhc2hib2FyZC1pZF1dCitce2Rhc2hib2FyZC1pZFx9Cit+fn5+fn5+fn5+fn5+fn5+CitUaGUgSUQgb2YgYSBkYXNoYm9hcmQgaW4gdGhlIGZvcm1hdCAnPHJlZj46PHBhdGg+Jy4KKworQSBzcGVjaWFsIGRhc2hib2FyZCBJRCBpcyBgZGVmYXVsdGAgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGVmYXVsdAorZGFzaGJvYXJkIG9mIGEgcHJvamVjdC4KKworW1twcm9qZWN0LW5hbWVdXQorXHtwcm9qZWN0LW5hbWVcfQorfn5+fn5+fn5+fn5+fn5+fgorVGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCisKKworW1tqc29uLWVudGl0aWVzXV0KK0pTT04gRW50aXRpZXMKKy0tLS0tLS0tLS0tLS0KKworW1tkYXNoYm9hcmQtaW5mb11dCitEYXNoYm9hcmRJbmZvCit+fn5+fn5+fn5+fn5+CitUaGUgYERhc2hib2FyZEluZm9gIGVudGl0eSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2plY3QKK2Rhc2hib2FyZC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMiw0Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgICAgfHxEZXNjcmlwdGlvbgorfGBraW5kYCAgICAgICAgICAgIHx8YGdlcnJpdGNvZGVyZXZpZXcjZGFzaGJvYXJkYAorfGBpZGAgICAgICAgICAgICAgIHx8CitUaGUgSUQgb2YgdGhlIGRhc2hib2FyZC4gVGhlIElEIGhhcyB0aGUgZm9ybWF0ICc8cmVmPjo8cGF0aD4nLAord2hlcmUgcmVmIGFuZCBwYXRoIGFyZSBVUkwgZW5jb2RlZC4KK3xgcHJvamVjdGAgICAgICAgICB8fAorVGhlIG5hbWUgb2YgdGhlIHByb2plY3QgZm9yIHdoaWNoIHRoaXMgZGFzaGJvYXJkIGlzIHJldHVybmVkLgorfGBkZWZpbmluZ19wcm9qZWN0YHx8CitUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB3aGljaCB0aGlzIGRhc2hib2FyZCBpcyBkZWZpbmVkLgorVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBgcHJvamVjdGAgaWYgdGhlIGRhc2hib2FyZCBpcyBpbmhlcml0ZWQgZnJvbSBhCitwYXJlbnQgcHJvamVjdC4KK3xgcmVmYCAgICAgICAgICAgICB8fAorVGhlIG5hbWUgb2YgdGhlIHJlZiBpbiB3aGljaCB0aGUgZGFzaGJvYXJkIGlzIGRlZmluZWQsIHdpdGhvdXQgdGhlCitgcmVmcy9tZXRhL2Rhc2hib2FyZHMvYCBwcmVmaXgsIHdoaWNoIGlzIGNvbW1vbiBmb3IgYWxsIGRhc2hib2FyZCByZWZzLgorfGBwYXRoYCAgICAgICAgICAgIHx8CitUaGUgcGF0aCBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgZGFzaGJvYXJkIGlzIGRlZmluZWQuCit8YGRlc2NyaXB0aW9uYCAgICAgfG9wdGlvbmFsfFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGFzaGJvYXJkLgorfGBmb3JlYWNoYCAgICAgICAgIHxvcHRpb25hbHwKK1N1YnF1ZXJ5IHRoYXQgYXBwbGllcyB0byBhbGwgc2VjdGlvbnMgaW4gdGhlIGRhc2hib2FyZC4gKworVG9rZW5zIHN1Y2ggYXMgYCR7cHJvamVjdH1gIGFyZSBub3QgcmVzb2x2ZWQuCit8YHVybGAgICAgICAgICAgICAgfHwKK1RoZSBVUkwgdW5kZXIgd2hpY2ggdGhlIGRhc2hib2FyZCBjYW4gYmUgb3BlbmVkIGluIHRoZSBHZXJyaXQgV2ViVUkuICsKK1RoZSBVUkwgaXMgcmVsYXRpdmUgdG8gdGhlIGNhbm9uaWNhbCB3ZWIgVVJMLiArCitUb2tlbnMgaW4gdGhlIHF1ZXJpZXMgc3VjaCBhcyBgJHtwcm9qZWN0fWAgYXJlIHJlc29sdmVkLgorfGBkZWZhdWx0YCAgICAgICAgIHxub3Qgc2V0IGlmIGBmYWxzZWB8CitXaGV0aGVyIHRoaXMgaXMgdGhlIGRlZmF1bHQgZGFzaGJvYXJkIG9mIHRoZSBwcm9qZWN0LgorfGB0aXRsZWAgICAgICAgICAgIHxvcHRpb25hbHxUaGUgdGl0bGUgb2YgdGhlIGRhc2hib2FyZC4KK3xgc2VjdGlvbnNgICAgICAgICB8fAorVGhlIGxpc3Qgb2YgbGluazojZGFzaGJvYXJkLXNlY3Rpb24taW5mb1tzZWN0aW9uc10gaW4gdGhlIGRhc2hib2FyZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbZGFzaGJvYXJkLWlucHV0XV0KK0Rhc2hib2FyZElucHV0Cit+fn5+fn5+fn5+fn5+fgorVGhlIGBEYXNoYm9hcmRJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIHRvIGNyZWF0ZS91cGRhdGUgYQorcHJvamVjdCBkYXNoYm9hcmQuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjIsNCJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGBpZGAgICAgICAgICAgICB8b3B0aW9uYWx8CitVUkwgZW5jb2RlZCBJRCBvZiBhIGRhc2hib2FyZCB0byB3aGljaCB0aGlzIGRhc2hib2FyZCBzaG91bGQgbGluayB0by4KK3xgY29tbWl0X21lc3NhZ2VgfG9wdGlvbmFsfAorTWVzc2FnZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNvbW1pdCB0aGUgY2hhbmdlIG9mIHRoZSBkYXNoYm9hcmQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1tkYXNoYm9hcmQtc2VjdGlvbi1pbmZvXV0KK0Rhc2hib2FyZFNlY3Rpb25JbmZvCit+fn5+fn5+fn5+fn5+fn5+fn5+fgorVGhlIGBEYXNoYm9hcmRTZWN0aW9uSW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgc2VjdGlvbgoraW4gYSBkYXNoYm9hcmQuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsNiJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICB8RGVzY3JpcHRpb24KK3xgbmFtZWAgICAgICAgIHxUaGUgdGl0bGUgb2YgdGhlIHNlY3Rpb24uCit8YHF1ZXJ5YCAgICAgICB8VGhlIHF1ZXJ5IG9mIHRoZSBzZWN0aW9uLiArCitUb2tlbnMgc3VjaCBhcyBgJHtwcm9qZWN0fWAgYXJlIG5vdCByZXNvbHZlZC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1toZWFkLWlucHV0XV0KK0hlYWRJbnB1dAorfn5+fn5+fn5+CitUaGUgYEhlYWRJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBzZXR0aW5nIGBIRUFEYCBmb3IgYQorcHJvamVjdC4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSw2Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8RmllbGQgTmFtZSAgICAgIHxEZXNjcmlwdGlvbgorfGByZWZgICAgICAgICAgICB8CitUaGUgcmVmIHRvIHdoaWNoIGBIRUFEYCBzaG91bGQgYmUgc2V0LCB0aGUgYHJlZnMvaGVhZHNgIHByZWZpeCBjYW4gYmUKK29taXR0ZWQuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3Byb2plY3QtZGVzY3JpcHRpb24taW5wdXRdXQorUHJvamVjdERlc2NyaXB0aW9uSW5wdXQKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitUaGUgYFByb2plY3REZXNjcmlwdGlvbklucHV0YCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHNldHRpbmcgYQorcHJvamVjdCBkZXNjcmlwdGlvbi4KKworW29wdGlvbnM9ImhlYWRlciIsd2lkdGg9IjUwJSIsY29scz0iMSxeMiw0Il0KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgICB8fERlc2NyaXB0aW9uCit8YGRlc2NyaXB0aW9uYCAgIHxvcHRpb25hbHxUaGUgcHJvamVjdCBkZXNjcmlwdGlvbi4gKworVGhlIHByb2plY3QgZGVzY3JpcHRpb24gd2lsbCBiZSBkZWxldGVkIGlmIG5vdCBzZXQuCit8YGNvbW1pdF9tZXNzYWdlYHxvcHRpb25hbHwKK01lc3NhZ2UgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjb21taXQgdGhlIGNoYW5nZSBvZiB0aGUgcHJvamVjdAorZGVzY3JpcHRpb24gaW4gdGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZSB0byB0aGUgYHJlZnMvbWV0YS9jb25maWdgCiticmFuY2guCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1twcm9qZWN0LWluZm9dXQorUHJvamVjdEluZm8KK35+fn5+fn5+fn5+CitUaGUgYFByb2plY3RJbmZvYCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0LgorCitbb3B0aW9ucz0iaGVhZGVyIix3aWR0aD0iNTAlIixjb2xzPSIxLF4yLDQiXQorfD09PT09PT09PT09PT09PT09PT09PT09PT09PQorfEZpZWxkIE5hbWUgICAgfHxEZXNjcmlwdGlvbgorfGBraW5kYCAgICAgICAgfHxgZ2Vycml0Y29kZXJldmlldyNwcm9qZWN0YAorfGBpZGAgICAgICAgICAgfHxUaGUgVVJMIGVuY29kZWQgcHJvamVjdCBuYW1lLgorfGBuYW1lYCAgICAgICAgfAorbm90IHNldCBpZiByZXR1cm5lZCBpbiBhIG1hcCB3aGVyZSB0aGUgcHJvamVjdCBuYW1lIGlzIHVzZWQgYXMgbWFwIGtleXwKK1RoZSBuYW1lIG9mIHRoZSBwcm9qZWN0LgorfGBwYXJlbnRgICAgICAgfG9wdGlvbmFsfAorVGhlIG5hbWUgb2YgdGhlIHBhcmVudCBwcm9qZWN0LiArCitgPy08bj5gIGlmIHRoZSBwYXJlbnQgcHJvamVjdCBpcyBub3QgdmlzaWJsZSAoYDxuPmAgaXMgYSBudW1iZXIgd2hpY2gKK2lzIGluY3JlYXNlZCBmb3IgZWFjaCBub24tdmlzaWJsZSBwcm9qZWN0KS4KK3xgZGVzY3JpcHRpb25gIHxvcHRpb25hbHxUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHByb2plY3QuCit8YGJyYW5jaGVzYCAgICB8b3B0aW9uYWx8TWFwIG9mIGJyYW5jaCBuYW1lcyB0byBIRUFEIHJldmlzaW9ucy4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworW1twcm9qZWN0LWlucHV0XV0KK1Byb2plY3RJbnB1dAorfn5+fn5+fn5+fn5+CitUaGUgYFByb2plY3RJbnB1dGAgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciB0aGUgY3JlYXRpb24gb2YKK2EgbmV3IHByb2plY3QuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjIsNCJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgICAgICAgICAgICAgfHxEZXNjcmlwdGlvbgorfGBuYW1lYCAgICAgICAgICAgICAgICAgICAgICB8b3B0aW9uYWx8CitUaGUgbmFtZSBvZiB0aGUgcHJvamVjdCAobm90IGVuY29kZWQpLiArCitJZiBzZXQsIG11c3QgbWF0Y2ggdGhlIHByb2plY3QgbmFtZSBpbiB0aGUgVVJMLgorfGBwYXJlbnRgICAgICAgICAgICAgICAgICAgICB8b3B0aW9uYWx8CitUaGUgbmFtZSBvZiB0aGUgcGFyZW50IHByb2plY3QuICsKK0lmIG5vdCBzZXQsIHRoZSBgQWxsLVByb2plY3RzYCBwcm9qZWN0IHdpbGwgYmUgdGhlIHBhcmVudCBwcm9qZWN0LgorfGBkZXNjcmlwdGlvbmAgICAgICAgICAgICAgICB8b3B0aW9uYWx8VGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0LgorfGBwZXJtaXNzaW9uc19vbmx5YCAgICAgICAgICB8YGZhbHNlYCBpZiBub3Qgc2V0fAorV2hldGhlciBhIHBlcm1pc3Npb24tb25seSBwcm9qZWN0IHNob3VsZCBiZSBjcmVhdGVkLgorfGBjcmVhdGVfZW1wdHlfY29tbWl0YCAgICAgICB8YGZhbHNlYCBpZiBub3Qgc2V0fAorV2hldGhlciBhbiBlbXB0eSBpbml0aWFsIGNvbW1pdCBzaG91bGQgYmUgY3JlYXRlZC4KK3xgc3VibWl0X3R5cGVgICAgICAgICAgICAgICAgfG9wdGlvbmFsfAorVGhlIHN1Ym1pdCB0eXBlIHRoYXQgc2hvdWxkIGJlIHNldCBmb3IgdGhlIHByb2plY3QKKyhgTUVSR0VfSUZfTkVDRVNTQVJZYCwgYFJFQkFTRV9JRl9ORUNFU1NBUllgLCBgRkFTVF9GT1JXQVJEX09OTFlgLAorYE1FUkdFX0FMV0FZU2AsIGBDSEVSUllfUElDS2ApLiArCitJZiBub3Qgc2V0LCBgTUVSR0VfSUZfTkVDRVNTQVJZYCBpcyBzZXQgYXMgc3VibWl0IHR5cGUuCit8YGJyYW5jaGVzYCAgICAgICAgICAgICAgICAgIHxvcHRpb25hbHwKK0EgbGlzdCBvZiBicmFuY2hlcyB0aGF0IHNob3VsZCBiZSBpbml0aWFsbHkgY3JlYXRlZC4gKworRm9yIHRoZSBicmFuY2ggbmFtZXMgdGhlIGByZWZzL2hlYWRzL2AgcHJlZml4IGNhbiBiZSBvbWl0dGVkLgorfGBvd25lcnNgICAgICAgICAgICAgICAgICAgICB8b3B0aW9uYWx8CitBIGxpc3Qgb2YgZ3JvdXBzIHRoYXQgc2hvdWxkIGJlIGFzc2lnbmVkIGFzIHByb2plY3Qgb3duZXIuICsKK0VhY2ggZ3JvdXAgaW4gdGhlIGxpc3QgbXVzdCBiZSBzcGVjaWZpZWQgYXMKK2xpbms6cmVzdC1hcGktZ3JvdXBzLmh0bWwjZ3JvdXAtaWRbZ3JvdXAtaWRdLiArCitJZiBub3Qgc2V0LCB0aGUgbGluazpjb25maWctZ2Vycml0Lmh0bWwjcmVwb3NpdG9yeS5uYW1lLm93bmVyR3JvdXBbCitncm91cHMgdGhhdCBhcmUgY29uZmlndXJlZCBhcyBkZWZhdWx0IG93bmVyc10gYXJlIHNldCBhcyBwcm9qZWN0Citvd25lcnMuCit8YHVzZV9jb250cmlidXRvcl9hZ3JlZW1lbnRzYHxgSU5IRVJJVGAgaWYgbm90IHNldHwKK1doZXRoZXIgY29udHJpYnV0b3IgYWdyZWVtZW50cyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHByb2plY3QgIChgVFJVRWAsCitgRkFMU0VgLCBgSU5IRVJJVGApLgorfGB1c2Vfc2lnbmVkX29mZl9ieWAgICAgICAgICB8YElOSEVSSVRgIGlmIG5vdCBzZXR8CitXaGV0aGVyIHRoZSB1c2FnZSBvZiAnU2lnbmVkLU9mZi1CeScgZm9vdGVycyBpcyByZXF1aXJlZCBmb3IgdGhlCitwcm9qZWN0IChgVFJVRWAsIGBGQUxTRWAsIGBJTkhFUklUYCkuCit8YHVzZV9jb250ZW50X21lcmdlYCAgICAgICAgIHxgSU5IRVJJVGAgaWYgbm90IHNldHwKK1doZXRoZXIgY29udGVudCBtZXJnZSBzaG91bGQgYmUgZW5hYmxlZCBmb3IgdGhlIHByb2plY3QgKGBUUlVFYCwKK2BGQUxTRWAsIGBJTkhFUklUYCkuICsKK2BGQUxTRWAsIGlmIHRoZSBgc3VibWl0X3R5cGVgIGlzIGBGQVNUX0ZPUldBUkRfT05MWWAuCit8YHJlcXVpcmVfY2hhbmdlX2lkYCAgICAgICAgIHxgSU5IRVJJVGAgaWYgbm90IHNldHwKK1doZXRoZXIgdGhlIHVzYWdlIG9mIENoYW5nZS1JZHMgaXMgcmVxdWlyZWQgZm9yIHRoZSBwcm9qZWN0IChgVFJVRWAsCitgRkFMU0VgLCBgSU5IRVJJVGApLgorfD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1tbcHJvamVjdC1wYXJlbnQtaW5wdXRdXQorUHJvamVjdFBhcmVudElucHV0Cit+fn5+fn5+fn5+fn5+fn5+fn4KK1RoZSBgUHJvamVjdFBhcmVudElucHV0YCBlbnRpdHkgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHNldHRpbmcgYQorcHJvamVjdCBwYXJlbnQuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsXjIsNCJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgfHxEZXNjcmlwdGlvbgorfGBwYXJlbnRgICAgICAgICB8fFRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgcHJvamVjdC4KK3xgY29tbWl0X21lc3NhZ2VgfG9wdGlvbmFsfAorTWVzc2FnZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGNvbW1pdCB0aGUgY2hhbmdlIG9mIHRoZSBwcm9qZWN0IHBhcmVudAoraW4gdGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZSB0byB0aGUgYHJlZnMvbWV0YS9jb25maWdgIGJyYW5jaC4KK3w9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitbW3JlcG9zaXRvcnktc3RhdGlzdGljcy1pbmZvXV0KK1JlcG9zaXRvcnlTdGF0aXN0aWNzSW5mbworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitUaGUgYFJlcG9zaXRvcnlTdGF0aXN0aWNzSW5mb2AgZW50aXR5IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CitzdGF0aXN0aWNzIG9mIGEgR2l0IHJlcG9zaXRvcnkuCisKK1tvcHRpb25zPSJoZWFkZXIiLHdpZHRoPSI1MCUiLGNvbHM9IjEsNiJdCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3xGaWVsZCBOYW1lICAgICAgICAgICAgICAgIHxEZXNjcmlwdGlvbgorfGBudW1iZXJfb2ZfbG9vc2Vfb2JqZWN0c2AgfE51bWJlciBvZiBsb29zZSBvYmplY3RzLgorfGBudW1iZXJfb2ZfbG9vc2VfcmVmc2AgICAgfE51bWJlciBvZiBsb29zZSByZWZzLgorfGBudW1iZXJfb2ZfcGFja19maWxlc2AgICAgfE51bWJlciBvZiBwYWNrIGZpbGVzLgorfGBudW1iZXJfb2ZfcGFja2VkX29iamVjdHNgfE51bWJlciBvZiBwYWNrZWQgb2JqZWN0cy4KK3xgbnVtYmVyX29mX3BhY2tlZF9yZWZzYCAgIHxOdW1iZXIgb2YgcGFja2VkIHJlZnMuCit8YHNpemVfb2ZfbG9vc2Vfb2JqZWN0c2AgICB8U2l6ZSBvZiBsb29zZSBvYmplY3RzIGluIGJ5dGVzLgorfGBzaXplX29mX3BhY2tlZF9vYmplY3RzYCAgfFNpemUgb2YgcGFja2VkIG9iamVjdHMgaW4gYnl0ZXMuCit8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9yZXN0LWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLnR4dAppbmRleCAyZjlkMDNmLi4zMDNmYzRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Jlc3QtYXBpLnR4dApAQCAtNSw2ICs1LDE3IEBACiBUaGUgQVBJIGlzIHN1aXRhYmxlIGZvciBhdXRvbWF0ZWQgdG9vbHMgdG8gYnVpbGQgdXBvbiwgYXMgd2VsbCBhcwogc3VwcG9ydGluZyBzb21lIGFkLWhvYyBzY3JpcHRpbmcgdXNlIGNhc2VzLgogCitFbmRwb2ludHMKKy0tLS0tLS0tLQorbGluazpyZXN0LWFwaS1hY2NvdW50cy5odG1sWy9hY2NvdW50cy9dOjoKKyAgQWNjb3VudCByZWxhdGVkIFJFU1QgZW5kcG9pbnRzCitsaW5rOnJlc3QtYXBpLWNoYW5nZXMuaHRtbFsvY2hhbmdlcy9dOjoKKyAgQ2hhbmdlIHJlbGF0ZWQgUkVTVCBlbmRwb2ludHMKK2xpbms6cmVzdC1hcGktZ3JvdXBzLmh0bWxbL2dyb3Vwcy9dOjoKKyAgR3JvdXAgcmVsYXRlZCBSRVNUIGVuZHBvaW50cworbGluazpyZXN0LWFwaS1wcm9qZWN0cy5odG1sWy9wcm9qZWN0cy9dOjoKKyAgUHJvamVjdCByZWxhdGVkIFJFU1QgZW5kcG9pbnRzCisKIFByb3RvY29sIERldGFpbHMKIC0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjEsMTEgKzMyLDE5IEBACiBwcmVmaXggdGhlIGVuZHBvaW50IFVSTCB3aXRoIGAvYS9gLiBGb3IgZXhhbXBsZSB0byBhdXRoZW50aWNhdGUgdG8KIGAvcHJvamVjdHMvYCByZXF1ZXN0IFVSTCBgL2EvcHJvamVjdHMvYC4KIAorW1twcmVjb25kaXRpb25zXV0KK1ByZWNvbmRpdGlvbnMKK35+fn5+fn5+fn5+fn4KK0NsaWVudHMgY2FuIHJlcXVlc3QgUFVUIHRvIGNyZWF0ZSBhIG5ldyByZXNvdXJjZSBhbmQgbm90IG92ZXJ3cml0ZQorYW4gZXhpc3Rpbmcgb25lIGJ5IGFkZGluZyBgSWYtTm9uZS1NYXRjaDogKmAgdG8gdGhlIHJlcXVlc3QgSFRUUAoraGVhZGVycy4gSWYgdGhlIG5hbWVkIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIHRoZSBzZXJ2ZXIgd2lsbCByZXNwb25kCit3aXRoIEhUVFAgNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQuCisKIFtbb3V0cHV0XV0KIE91dHB1dCBGb3JtYXQKIH5+fn5+fn5+fn5+fn4KLU1vc3QgQVBJcyByZXR1cm4gdGV4dCBmb3JtYXQgYnkgZGVmYXVsdC4gSlNPTiBjYW4gYmUgcmVxdWVzdGVkCi1ieSBzZXR0aW5nIHRoZSBgQWNjZXB0YCBIVFRQIHJlcXVlc3QgaGVhZGVyIHRvIGluY2x1ZGUKK01vc3QgQVBJcyByZXR1cm4gcHJldHR5IHByaW50ZWQgSlNPTiBieSBkZWZhdWx0LiBDb21wYWN0IEpTT04gY2FuIGJlCityZXF1ZXN0ZWQgYnkgc2V0dGluZyB0aGUgYEFjY2VwdGAgSFRUUCByZXF1ZXN0IGhlYWRlciB0byBpbmNsdWRlCiBgYXBwbGljYXRpb24vanNvbmAsIGZvciBleGFtcGxlOgogCiAtLS0tCkBAIC00MywzNTAgKzYyLDk5IEBACiAgIFsgLi4uIHZhbGlkIEpTT04gLi4uIF0KIC0tLS0KIAotVGhlIGRlZmF1bHQgSlNPTiBmb3JtYXQgaXMgYEpTT05fQ09NUEFDVGAsIHdoaWNoIHNraXBzIHVubmVjZXNzYXJ5Ci13aGl0ZXNwYWNlLiBUaGlzIGlzIG5vdCB0aGUgZWFzaWVzdCBmb3JtYXQgZm9yIGEgaHVtYW4gdG8gcmVhZC4gTWFueQotZXhhbXBsZXMgaW4gdGhpcyBkb2N1bWVudGF0aW9uIHVzZSBgZm9ybWF0PUpTT05gIGFzIGEgcXVlcnkgcGFyYW1ldGVyCi10byBvYnRhaW4gcHJldHR5IGZvcm1hdHRpbmcgaW4gdGhlIHJlc3BvbnNlLiBQcm9kdWNpbmcgKGFuZCBwYXJzaW5nKQotdGhlIGNvbXBhY3QgZm9ybWF0IGlzIG1vcmUgZWZmaWNpZW50LCBzbyBtb3N0IHRvb2xzIHNob3VsZCBwcmVmZXIgdGhlCi1kZWZhdWx0IGNvbXBhY3QgZm9ybWF0LgorVGhlIGRlZmF1bHQgSlNPTiBmb3JtYXQgaXMgcHJldHR5LCB3aGljaCB1c2VzIGV4dHJhIHdoaXRlc3BhY2UgdG8gbWFrZQordGhlIG91dHB1dCBtb3JlIHJlYWRhYmxlIGZvciBhIGh1bWFuLiBQcm9kdWNpbmcgKGFuZCBwYXJzaW5nKSB0aGUKK25vbi1wcmV0dHkgY29tcGFjdCBmb3JtYXQgaXMgbW9yZSBlZmZpY2llbnQgc28gdG9vbHMgc2hvdWxkIHJlcXVlc3QgaXQKK2J5IHVzaW5nIHRoZSBgQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uYCBoZWFkZXIgb3IgYHBwPTBgIHF1ZXJ5CitwYXJhbWV0ZXIgd2hlbmV2ZXIgcG9zc2libGUuCiAKIFJlc3BvbnNlcyB3aWxsIGJlIGd6aXAgY29tcHJlc3NlZCBieSB0aGUgc2VydmVyIGlmIHRoZSBIVFRQCiBgQWNjZXB0LUVuY29kaW5nYCByZXF1ZXN0IGhlYWRlciBpcyBzZXQgdG8gYGd6aXBgLiBUaGlzIG1heQogc2F2ZSBvbiBuZXR3b3JrIHRyYW5zZmVyIHRpbWUgZm9yIGxhcmdlciByZXNwb25zZXMuCiAKLUVuZHBvaW50cwotLS0tLS0tLS0tCitbW3RpbWVzdGFtcF1dCitUaW1lc3RhbXAKK35+fn5+fn5+fgorVGltZXN0YW1wcyBhcmUgZ2l2ZW4gaW4gVVRDIGFuZCBoYXZlIHRoZSBmb3JtYXQKKyIneXl5eS1tbS1kZCBoaDptbTpzcy5mZmZmZmZmZmYnIiB3aGVyZSAiJ2ZmZmZmZmZmZmYnIiBpbmRpY2F0ZXMgdGhlCituYW5vc2Vjb25kcy4KIAotW1thY2NvdW50c19zZWxmX2NhcGFiaWxpdGllc11dCi0vYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXMgKEFjY291bnQgQ2FwYWJpbGl0aWVzKQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLVJldHVybnMgdGhlIGdsb2JhbCBjYXBhYmlsaXRpZXMgKHN1Y2ggYXMgYGNyZWF0ZVByb2plY3RgIG9yCi1gY3JlYXRlR3JvdXBgKSB0aGF0IGFyZSBlbmFibGVkIGZvciB0aGUgY2FsbGluZyB1c2VyLiBUaGlzIGNhbiBiZSB1c2VkCi1ieSBVSSB0b29scyB0byBkaXNjb3ZlciBpZiBhZG1pbmlzdHJhdGl2ZSBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlCi10byB0aGUgY2FsbGVyLCBzbyB0aGV5IGNhbiBoaWRlIChvciBzaG93KSByZWxldmFudCBVSSBhY3Rpb25zLgorW1tlbmNvZGluZ11dCitFbmNvZGluZworfn5+fn5+fn4KK0FsbCBJRHMgdGhhdCBhcHBlYXIgaW4gdGhlIFVSTCBvZiBhIFJFU1QgY2FsbCAoZS5nLiBwcm9qZWN0IG5hbWUsIGdyb3VwIG5hbWUpCittdXN0IGJlIFVSTCBlbmNvZGVkLgogCi0tLS0tCi0gIEdFVCAvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXM/Zm9ybWF0PUpTT04gSFRUUC8xLjAKK1tbcmVzcG9uc2UtY29kZXNdXQorUmVzcG9uc2UgQ29kZXMKK35+fn5+fn5+fn5+fn5+CitIVFRQIHN0YXR1cyBjb2RlcyBhcmUgd2VsbCBkZWZpbmVkIGFuZCB0aGUgR2Vycml0IFJFU1QgZW5kcG9pbnRzIHVzZQordGhlbSBhcyBkZXNjcmliZWQgaW4gdGhlIEhUVFAgc3BlYy4KIAotICApXX0nCi0gIHsKLSAgICAicXVlcnlMaW1pdCI6IHsKLSAgICAgICJtaW4iOiAwLAotICAgICAgIm1heCI6IDUwMAotICAgIH0KLSAgfQotLS0tLQorSGVyZSBhcmUgZXhhbXBsZXMgZm9yIHNvbWUgSFRUUCBzdGF0dXMgY29kZXMgdGhhdCBzaG93IGhvdyB0aGV5IGFyZQordXNlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgR2Vycml0IFJFU1QgQVBJLgogCi1BZG1pbmlzdHJhdG9yIHRoYXQgaGFzIGF1dGhlbnRpY2F0ZWQgd2l0aCBkaWdlc3QgYXV0aGVudGljYXRpb246Ci0tLS0tCi0gIEdFVCAvYS9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcz9mb3JtYXQ9SlNPTiBIVFRQLzEuMAotICBBdXRob3JpemF0aW9uOiBEaWdlc3QgdXNlcm5hbWU9ImFkbWluIiwgcmVhbG09IkdlcnJpdCBDb2RlIFJldmlldyIsIG5vbmNlPSIuLi4KKzQwMCBCYWQgUmVxdWVzdAorXl5eXl5eXl5eXl5eXl5eCitgNDAwIEJhZCBSZXF1ZXN0YCBpcyB1c2VkIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCB1bmRlcnN0b29kIGJ5IHRoZQorc2VydmVyIGR1ZSB0byBtYWxmb3JtZWQgc3ludGF4LgogCi0gICldfScKLSAgewotICAgICJhZG1pbmlzdHJhdGVTZXJ2ZXIiOiB0cnVlLAotICAgICJxdWVyeUxpbWl0IjogewotICAgICAgIm1pbiI6IDAsCi0gICAgICAibWF4IjogNTAwCi0gICAgfSwKLSAgICAiY3JlYXRlQWNjb3VudCI6IHRydWUsCi0gICAgImNyZWF0ZUdyb3VwIjogdHJ1ZSwKLSAgICAiY3JlYXRlUHJvamVjdCI6IHRydWUsCi0gICAgImtpbGxUYXNrIjogdHJ1ZSwKLSAgICAidmlld0NhY2hlcyI6IHRydWUsCi0gICAgImZsdXNoQ2FjaGVzIjogdHJ1ZSwKLSAgICAidmlld0Nvbm5lY3Rpb25zIjogdHJ1ZSwKLSAgICAidmlld1F1ZXVlIjogdHJ1ZSwKLSAgICAic3RhcnRSZXBsaWNhdGlvbiI6IHRydWUKLSAgfQotLS0tLQorRS5nLiBgNDAwIEJhZCBSZXF1ZXN0YCBpcyByZXR1cm5lZCBpZiBKU09OIGlucHV0IGlzIGV4cGVjdGVkIGJ1dCB0aGUKKydDb250ZW50LVR5cGUnIG9mIHRoZSByZXF1ZXN0IGlzIG5vdCAnYXBwbGljYXRpb24vanNvbicgb3IgdGhlIHJlcXVlc3QKK2JvZHkgZG9lc24ndCBjb250YWluIHZhbGlkIEpTT04uCiAKLVRvIGZpbHRlciB0aGUgc2V0IG9mIGdsb2JhbCBjYXBhYmlsaXRpZXMgdGhlIGBxYCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQuCi1GaWx0ZXJpbmcgbWF5IGRlY3JlYXNlIHRoZSByZXNwb25zZSB0aW1lIGJ5IGF2b2lkaW5nIGxvb2tpbmcgYXQgZXZlcnkKLXBvc3NpYmxlIGFsdGVybmF0aXZlIGZvciB0aGUgY2FsbGVyLgorYDQwMCBCYWQgUmVxdWVzdGAgaXMgYWxzbyB1c2VkIGlmIHJlcXVpcmVkIGlucHV0IGZpZWxkcyBhcmUgbm90IHNldCBvcgoraWYgb3B0aW9ucyBhcmUgc2V0IHdoaWNoIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgogCi0tLS0tCi0gIEdFVCAvYS9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcz9mb3JtYXQ9SlNPTiZxPWNyZWF0ZUFjY291bnQmcT1jcmVhdGVHcm91cCBIVFRQLzEuMAotICBBdXRob3JpemF0aW9uOiBEaWdlc3QgdXNlcm5hbWU9ImFkbWluIiwgcmVhbG09IkdlcnJpdCBDb2RlIFJldmlldyIsIG5vbmNlPSIuLi4KKzQwMyBGb3JiaWRkZW4KK15eXl5eXl5eXl5eXl4KK2A0MDMgRm9yYmlkZGVuYCBpcyB1c2VkIGlmIHRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgYmVjYXVzZSB0aGUKK2NhbGxpbmcgdXNlciBoYXMgbm8gc3VmZmljaWVudCBwZXJtaXNzaW9ucy4KIAotICApXX0nCi0gIHsKLSAgICAiY3JlYXRlQWNjb3VudCI6IHRydWUsCi0gICAgImNyZWF0ZUdyb3VwIjogdHJ1ZQotICB9Ci0tLS0tCitFLmcuIHNvbWUgUkVTVCBlbmRwb2ludHMgcmVxdWlyZSB0aGF0IHRoZSBjYWxsaW5nIHVzZXIgaGFzIGNlcnRhaW4KK2xpbms6YWNjZXNzLWNvbnRyb2wuaHRtbCNnbG9iYWxfY2FwYWJpbGl0aWVzW2dsb2JhbCBjYXBhYmlsaXRpZXNdCithc3NpZ25lZC4KIAotTW9zdCByZXN1bHRzIGFyZSBib29sZWFuLCBhbmQgYSBmaWVsZCBpcyBvbmx5IHByZXNlbnQgd2hlbiBpdHMgdmFsdWUKLWlzIGB0cnVlYC4gbGluazpqc29uLmh0bWwjcXVlcnlMaW1pdFtgcXVlcnlMaW1pdGBdIGlzIGEgcmFuZ2UgYW5kIGlzCi1wcmVzZW50ZWQgYXMgYSBuZXN0ZWQgSlNPTiBvYmplY3Qgd2l0aCBgbWluYCBhbmQgYG1heGAgbWVtYmVycy4KK2A0MDMgRm9yYmlkZGVuYCBpcyBhbHNvIHVzZWQgaWYgYHNlbGZgIGlzIHVzZWQgYXMgYWNjb3VudCBJRCBhbmQgdGhlCitSRVNUIGNhbGwgd2FzIGRvbmUgd2l0aG91dCBhdXRoZW50aWNhdGlvbi4KIAotW1twcm9qZWN0c11dCi0vcHJvamVjdHMvIChMaXN0IFByb2plY3RzKQotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLUxpc3RzIHRoZSBwcm9qZWN0cyBhY2Nlc3NpYmxlIGJ5IHRoZSBjYWxsZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMKLXVzaW5nIHRoZSBsaW5rOmNtZC1scy1wcm9qZWN0cy5odG1sW2xzLXByb2plY3RzXSBjb21tYW5kIG92ZXIgU1NILAotYW5kIGFjY2VwdHMgdGhlIHNhbWUgb3B0aW9ucyBhcyBxdWVyeSBwYXJhbWV0ZXJzLgorNDA0IE5vdCBGb3VuZAorXl5eXl5eXl5eXl5eXgorYDQwNCBOb3QgRm91bmRgIGlzIHJldHVybmVkIGlmIHRoZSByZXNvdXJjZSB0aGF0IGlzIHNwZWNpZmllZCBieSB0aGUKK1VSTCBpcyBub3QgZm91bmQgb3IgaXMgbm90IHZpc2libGUgdG8gdGhlIGNhbGxpbmcgdXNlci4gQSByZXNvdXJjZQorY2Fubm90IGJlIGZvdW5kIGlmIHRoZSBVUkwgY29udGFpbnMgYSBub24tZXhpc3RpbmcgSUQgb3Igdmlldy4KIAotLS0tLQotICBHRVQgL3Byb2plY3RzLz9mb3JtYXQ9SlNPTiZkIEhUVFAvMS4wCis0MDUgTWV0aG9kIE5vdCBBbGxvd2VkCiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eCitgNDA1IE1ldGhvZCBOb3QgQWxsb3dlZGAgaXMgdXNlZCBpZiB0aGUgcmVzb3VyY2UgZXhpc3RzIGJ1dCBkb2Vzbid0CitzdXBwb3J0IHRoZSBvcGVyYXRpb24uCiAKLSAgSFRUUC8xLjEgMjAwIE9LCi0gIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKLSAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKLSAgIAotICApXX0nCi0gIHsKLSAgICAiZXh0ZXJuYWwvYmlzb24iOiB7Ci0gICAgICAiZGVzY3JpcHRpb24iOiAiR05VIHBhcnNlciBnZW5lcmF0b3IiCi0gICAgfSwKLSAgICAiZXh0ZXJuYWwvZ2NjIjoge30sCi0gICAgImV4dGVybmFsL29wZW5zc2wiOiB7Ci0gICAgICAiZGVzY3JpcHRpb24iOiAiZW5jcnlwdGlvblxuY3J5cHRvIHJvdXRpbmVzIgotICAgIH0sCi0gICAgInRlc3QiOiB7Ci0gICAgICAiZGVzY3JpcHRpb24iOiAiXHUwMDNjaHRtbFx1MDAzZSBpcyBlc2NhcGVkIgotICAgIH0KLSAgfQotLS0tLQorRS5nLiBzb21lIG9mIHRoZSBgL2dyb3Vwcy9gIGVuZHBvaW50cyBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIEdlcnJpdAoraW50ZXJuYWwgZ3JvdXBzLCBpZiB0aGV5IGFyZSBpbnZva2VkIGZvciBhbiBleHRlcm5hbCBncm91cCB0aGUgcmVzcG9uc2UKK2lzIGA0MDUgTWV0aG9kIE5vdCBBbGxvd2VkYC4KIAotW1tzdWdnZXN0LXByb2plY3RzXV0KLVRoZSBgL3Byb2plY3RzL2AgVVJMIGFsc28gYWNjZXB0cyBhIHByZWZpeCBzdHJpbmcgYXMgcGFydCBvZiB0aGUgVVJMLgotVGhpcyBsaW1pdHMgdGhlIHJlc3VsdHMgdG8gdGhvc2UgcHJvamVjdHMgdGhhdCBzdGFydCB3aXRoIHRoZSBzcGVjaWZpZWQKLXByZWZpeC4KLUxpc3QgYWxsIHByb2plY3RzIHRoYXQgc3RhcnQgd2l0aCBgcGxhdGZvcm0vYDoKLS0tLS0KLUdFVCAvcHJvamVjdHMvcGxhdGZvcm0vP2Zvcm1hdD1KU09OIEhUVFAvMS4wCi1IVFRQLzEuMSAyMDAgT0sKLUNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKLUNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04Ci0pXX0nCi17Ci0icGxhdGZvcm0vZHJpdmVycyI6IHt9LAotInBsYXRmb3JtL3Rvb2xzIjoge30KLX0KLS0tLS0KLUUuZy4gdGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIGJ5IHN1Z2dlc3Rpb24gY2xpZW50IFVJJ3MgdG8gbGltaXQgcmVzdWx0cy4KKzQwOSBDb25mbGljdAorXl5eXl5eXl5eXl5eCitgNDA5IENvbmZsaWN0YCBpcyB1c2VkIGlmIHRoZSByZXF1ZXN0IGNhbm5vdCBiZSBjb21wbGV0ZWQgYmVjYXVzZSB0aGUKK2N1cnJlbnQgc3RhdGUgb2YgdGhlIHJlc291cmNlIGRvZXNuJ3QgYWxsb3cgdGhlIG9wZXJhdGlvbi4KIAotW1tjaGFuZ2VzXV0KLS9jaGFuZ2VzLyAoUXVlcnkgQ2hhbmdlcykKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLVF1ZXJpZXMgY2hhbmdlcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIuIFRoZSBxdWVyeSBzdHJpbmcgbXVzdCBiZQotcHJvdmlkZWQgYnkgdGhlIGBxYCBwYXJhbWV0ZXIuIFRoZSBgbmAgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGxpbWl0Ci10aGUgcmV0dXJuZWQgcmVzdWx0cy4KK0UuZy4gaWYgeW91IHRyeSB0byBzdWJtaXQgYSBjaGFuZ2UgdGhhdCBpcyBhYmFuZG9uZWQsIHRoaXMgZmFpbHMgd2l0aAorYDQwOSBDb25mbGljdGAgYmVjYXVzZSB0aGUgc3RhdGUgb2YgdGhlIGNoYW5nZSBkb2Vzbid0IGFsbG93IHRoZSBzdWJtaXQKK29wZXJhdGlvbi4KIAotUXVlcnkgZm9yIG9wZW4gY2hhbmdlcyBvZiB3YXRjaGVkIHByb2plY3RzOgotLS0tLQotICBHRVQgL2NoYW5nZXMvP2Zvcm1hdD1KU09OJnE9c3RhdHVzOm9wZW4raXM6d2F0Y2hlZCZuPTIgSFRUUC8xLjAKK2A0MDkgQ29uZmxpY3RgIGlzIGFsc28gdXNlZCBpZiB5b3UgdHJ5IHRvIGNyZWF0ZSBhIHJlc291cmNlIGJ1dCB0aGUKK25hbWUgaXMgYWxyZWFkeSBvY2N1cGllZCBieSBhbiBleGlzdGluZyByZXNvdXJjZS4KIAotICBIVFRQLzEuMSAyMDAgT0sKLSAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAotICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAorNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCitgNDEyIFByZWNvbmRpdGlvbiBGYWlsZWRgIGlzIHVzZWQgaWYgYSBwcmVjb25kaXRpb24gZnJvbSB0aGUgcmVxdWVzdAoraGVhZGVyIGZpZWxkcyBpcyBub3QgZnVsZmlsbGVkIGFzIGRlc2NyaWJlZCBpbiB0aGUgbGluazojcHJlY29uZGl0aW9uc1sKK1ByZWNvbmRpdGlvbnNdIHNlY3Rpb24uCiAKLSAgKV19JwotICB7Ci0gICAgInByb2plY3QiOiAiZGVtbyIsCi0gICAgImJyYW5jaCI6ICJtYXN0ZXIiLAotICAgICJpZCI6ICJJZGFmNWUwOThkNzA4OThiNzExOWY2ZjRhZjVhNmMxMzM0M2Q2NGI1NyIsCi0gICAgInN1YmplY3QiOiAiT25lIGNoYW5nZSIsCi0gICAgInN0YXR1cyI6ICJORVciLAotICAgICJjcmVhdGVkIjogIjIwMTItMDctMTcgMDc6MTg6MzAuODU0MDAwMDAwIiwKLSAgICAidXBkYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE5OjI3Ljc2NjAwMDAwMCIsCi0gICAgInJldmlld2VkIjogdHJ1ZSwKLSAgICAiX3NvcnRrZXkiOiAiMDAxZTcwNTcwMDAwMDZkYyIsCi0gICAgIl9udW1iZXIiOiAxNzU2LAotICAgICJvd25lciI6IHsKLSAgICAgICJuYW1lIjogIkpvaG4gRG9lIgotICAgIH0sCi0gIH0sCi0gIHsKLSAgICAicHJvamVjdCI6ICJkZW1vIiwKLSAgICAiYnJhbmNoIjogIm1hc3RlciIsCi0gICAgImlkIjogIkkwOWM4MDQxYjU4NjdkNWIzMzE3MDMxNmUyYWJjMzRiNzliYmI4NTAxIiwKLSAgICAic3ViamVjdCI6ICJBbm90aGVyIGNoYW5nZSIsCi0gICAgInN0YXR1cyI6ICJORVciLAotICAgICJjcmVhdGVkIjogIjIwMTItMDctMTcgMDc6MTg6MzAuODg0MDAwMDAwIiwKLSAgICAidXBkYXRlZCI6ICIyMDEyLTA3LTE3IDA3OjE4OjMwLjg4NTAwMDAwMCIsCi0gICAgIl9zb3J0a2V5IjogIjAwMWU3MDU2MDAwMDA2ZGQiLAotICAgICJfbnVtYmVyIjogMTc1NywKLSAgICAib3duZXIiOiB7Ci0gICAgICAibmFtZSI6ICJKb2huIERvZSIKLSAgICB9LAotICAgICJfbW9yZV9jaGFuZ2VzIjogdHJ1ZQotICB9Ci0tLS0tCi0KLVRoZSBjaGFuZ2Ugb3V0cHV0IGlzIHNvcnRlZCBieSB0aGUgbGFzdCB1cGRhdGUgdGltZSwgbW9zdCByZWNlbnRseQotdXBkYXRlZCB0byBvbGRlc3QgdXBkYXRlLgotCi1JZiB0aGUgYG5gIHF1ZXJ5IHBhcmFtZXRlciBpcyBzdXBwbGllZCBhbmQgYWRkaXRpb25hbCBjaGFuZ2VzIGV4aXN0Ci10aGF0IG1hdGNoIHRoZSBxdWVyeSBiZXlvbmQgdGhlIGVuZCwgdGhlIGxhc3QgY2hhbmdlIG9iamVjdCBoYXMgYQotYF9tb3JlX2NoYW5nZXM6IHRydWVgIEpTT04gZmllbGQgc2V0LiBDYWxsZXJzIGNhbiByZXN1bWUgYSBxdWVyeSB3aXRoCi10aGUgYG5gIHF1ZXJ5IHBhcmFtZXRlciwgc3VwcGx5aW5nIHRoZSBsYXN0IGNoYW5nZSdzIGBfc29ydGtleWAgZmllbGQKLWFzIHRoZSB2YWx1ZS4gV2hlbiBnb2luZyBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24gd2l0aCB0aGUgYHBgIHF1ZXJ5Ci1wYXJhbWV0ZXIgYSBgX21vcmVfY2hhbmdlczogdHJ1ZWAgaXMgcHV0IGluIHRoZSBmaXJzdCBjaGFuZ2Ugb2JqZWN0IGlmCi10aGVyZSBhcmUgcmVzdWx0cyAqYmVmb3JlKiB0aGUgZmlyc3QgY2hhbmdlIHJldHVybmVkLgotCi1DbGllbnRzIGFyZSBhbGxvd2VkIHRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBxdWVyeSBieSBzZXR0aW5nIHRoZSBgcWAKLXBhcmFtZXRlciBtdWx0aXBsZSB0aW1lcy4gSW4gdGhpcyBjYXNlIHRoZSByZXN1bHQgaXMgYW4gYXJyYXkgb2YKLWFycmF5cywgb25lIHBlciBxdWVyeSBpbiB0aGUgc2FtZSBvcmRlciB0aGUgcXVlcmllcyB3ZXJlIGdpdmVuIGluLgotCi1RdWVyeSB0aGF0IHJldHJpZXZlcyBjaGFuZ2VzIGZvciBhIHVzZXIncyBkYXNoYm9hcmQ6Ci0tLS0tCi0gIEdFVCAvY2hhbmdlcy8/Zm9ybWF0PUpTT04mcT1pczpvcGVuK293bmVyOnNlbGYmcT1pczpvcGVuK3Jldmlld2VyOnNlbGYrLW93bmVyOnNlbGYmcT1pczpjbG9zZWQrb3duZXI6c2VsZitsaW1pdDo1Jm89TEFCRUxTIEhUVFAvMS4wCi0KLSAgSFRUUC8xLjEgMjAwIE9LCi0gIENvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQKLSAgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgKLQotICApXX0nCi0gIFsKLSAgICBbCi0gICAgICB7Ci0gICAgICAgICJwcm9qZWN0IjogImRlbW8iLAotICAgICAgICAiYnJhbmNoIjogIm1hc3RlciIsCi0gICAgICAgICJpZCI6ICJJZGFmNWUwOThkNzA4OThiNzExOWY2ZjRhZjVhNmMxMzM0M2Q2NGI1NyIsCi0gICAgICAgICJzdWJqZWN0IjogIk9uZSBjaGFuZ2UiLAotICAgICAgICAic3RhdHVzIjogIk5FVyIsCi0gICAgICAgICJjcmVhdGVkIjogIjIwMTItMDctMTcgMDc6MTg6MzAuODU0MDAwMDAwIiwKLSAgICAgICAgInVwZGF0ZWQiOiAiMjAxMi0wNy0xNyAwNzoxOToyNy43NjYwMDAwMDAiLAotICAgICAgICAicmV2aWV3ZWQiOiB0cnVlLAotICAgICAgICAiX3NvcnRrZXkiOiAiMDAxZTcwNTcwMDAwMDZkYyIsCi0gICAgICAgICJfbnVtYmVyIjogMTc1NiwKLSAgICAgICAgIm93bmVyIjogewotICAgICAgICAgICJuYW1lIjogIkpvaG4gRG9lIgotICAgICAgICB9LAotICAgICAgICAibGFiZWxzIjogewotICAgICAgICAgICJWZXJpZmllZCI6IHt9LAotICAgICAgICAgICJDb2RlLVJldmlldyI6IHt9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICBdLAotICAgIFtdLAotICAgIFtdCi0gIF0KLS0tLS0KLQotQWRkaXRpb25hbCBmaWVsZHMgY2FuIGJlIG9idGFpbmVkIGJ5IGFkZGluZyBgb2AgcGFyYW1ldGVycywgZWFjaAotb3B0aW9uIHJlcXVpcmVzIG1vcmUgZGF0YWJhc2UgbG9va3VwcyBhbmQgc2xvd3MgZG93biB0aGUgcXVlcnkKLXJlc3BvbnNlIHRpbWUgdG8gdGhlIGNsaWVudCBzbyB0aGV5IGFyZSBnZW5lcmFsbHkgZGlzYWJsZWQgYnkKLWRlZmF1bHQuIE9wdGlvbmFsIGZpZWxkcyBhcmU6Ci0KLSogYExBQkVMU2A6IGEgc3VtbWFyeSBvZiBlYWNoIGxhYmVsIHJlcXVpcmVkIGZvciBzdWJtaXQsIGFuZAotICBhcHByb3ZlcnMgdGhhdCBoYXZlIGdyYW50ZWQgKG9yIHJlamVjdGVkKSB3aXRoIHRoYXQgbGFiZWwuCi0KLSogYENVUlJFTlRfUkVWSVNJT05gOiBkZXNjcmliZSB0aGUgY3VycmVudCByZXZpc2lvbiAocGF0Y2ggc2V0KQotICBvZiB0aGUgY2hhbmdlLCBpbmNsdWRpbmcgdGhlIGNvbW1pdCBTSEEtMSBhbmQgVVJMcyB0byBmZXRjaCBmcm9tLgotCi0qIGBBTExfUkVWSVNJT05TYDogZGVzY3JpYmUgYWxsIHJldmlzaW9ucywgbm90IGp1c3QgY3VycmVudC4KLQotKiBgQ1VSUkVOVF9DT01NSVRgOiBwYXJzZSBhbmQgb3V0cHV0IGFsbCBoZWFkZXIgZmllbGRzIGZyb20gdGhlCi0gIGNvbW1pdCBvYmplY3QsIGluY2x1ZGluZyBtZXNzYWdlLiBPbmx5IHZhbGlkIHdoZW4gdGhlIGN1cnJlbnQKLSAgcmV2aXNpb24gb3IgYWxsIHJldmlzaW9ucyBhcmUgc2VsZWN0ZWQuCi0KLSogYEFMTF9DT01NSVRTYDogcGFyc2UgYW5kIG91dHB1dCBhbGwgaGVhZGVyIGZpZWxkcyBmcm9tIHRoZQotICBvdXRwdXQgcmV2aXNpb25zLiBJZiBvbmx5IGBDVVJSRU5UX1JFVklTSU9OYCB3YXMgcmVxdWVzdGVkCi0gIHRoZW4gb25seSB0aGUgY3VycmVudCByZXZpc2lvbidzIGNvbW1pdCBkYXRhIHdpbGwgYmUgb3V0cHV0LgotCi0qIGBDVVJSRU5UX0ZJTEVTYDogbGlzdCBmaWxlcyBtb2RpZmllZCBieSB0aGUgY29tbWl0LCBpbmNsdWRpbmcKLSAgYmFzaWMgbGluZSBjb3VudHMgaW5zZXJ0ZWQvZGVsZXRlZCBwZXIgZmlsZS4gT25seSB2YWxpZCB3aGVuCi0gIHRoZSBjdXJyZW50IHJldmlzaW9uIG9yIGFsbCByZXZpc2lvbnMgYXJlIHNlbGVjdGVkLgotCi0qIGBBTExfRklMRVNgOiBsaXN0IGZpbGVzIG1vZGlmaWVkIGJ5IHRoZSBjb21taXQsIGluY2x1ZGluZwotICBiYXNpYyBsaW5lIGNvdW50cyBpbnNlcnRlZC9kZWxldGVkIHBlciBmaWxlLiBJZiBvbmx5IHRoZQotICBgQ1VSUkVOVF9SRVZJU0lPTmAgd2FzIHJlcXVlc3RlZCB0aGUgb25seSB0aGF0IGNvbW1pdCdzCi0gIG1vZGlmaWVkIGZpbGVzIHdpbGwgYmUgb3V0cHV0LgotCi0tLS0tCi0gIEdFVCAvY2hhbmdlcy8/cT05NyZmb3JtYXQ9SlNPTiZvPUNVUlJFTlRfUkVWSVNJT04mbz1DVVJSRU5UX0NPTU1JVCZvPUNVUlJFTlRfRklMRVMgSFRUUC8xLjAKLQotICBIVFRQLzEuMSAyMDAgT0sKLSAgQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudAotICBDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOAotCi0gICldfScKLSAgWwotICAgIHsKLSAgICAgICJwcm9qZWN0IjogImdlcnJpdCIsCi0gICAgICAiYnJhbmNoIjogIm1hc3RlciIsCi0gICAgICAiaWQiOiAiSTdlYTQ2ZDJlMmVlNWM2NGMwZDgwNzY3Nzg1OWNmYjdkOTBiODk2NmEiLAotICAgICAgInN1YmplY3QiOiAiVXNlIGFuIEV2ZW50QnVzIHRvIG1hbmFnZSBzdGFyIGljb25zIiwKLSAgICAgICJzdGF0dXMiOiAiTkVXIiwKLSAgICAgICJjcmVhdGVkIjogIjIwMTItMDQtMjUgMDA6NTI6MjUuNTgwMDAwMDAwIiwKLSAgICAgICJ1cGRhdGVkIjogIjIwMTItMDQtMjUgMDA6NTI6MjUuNTg2MDAwMDAwIiwKLSAgICAgICJfc29ydGtleSI6ICIwMDFjOWJmNDAwMDAwMDYxIiwKLSAgICAgICJfbnVtYmVyIjogOTcsCi0gICAgICAib3duZXIiOiB7Ci0gICAgICAgICJuYW1lIjogIlNoYXduIFBlYXJjZSIKLSAgICAgIH0sCi0gICAgICAiY3VycmVudF9yZXZpc2lvbiI6ICIxODRlYmU1MzgwNWUxMDI2MDVkMTFmNmIxNDM0ODZkMTVjMjNhMDljIiwKLSAgICAgICJyZXZpc2lvbnMiOiB7Ci0gICAgICAgICIxODRlYmU1MzgwNWUxMDI2MDVkMTFmNmIxNDM0ODZkMTVjMjNhMDljIjogewotICAgICAgICAgICJfbnVtYmVyIjogMSwKLSAgICAgICAgICAiZmV0Y2giOiB7Ci0gICAgICAgICAgICAiZ2l0IjogewotICAgICAgICAgICAgICAidXJsIjogImdpdDovL2xvY2FsaG9zdC9nZXJyaXQiLAotICAgICAgICAgICAgICAicmVmIjogInJlZnMvY2hhbmdlcy85Ny85Ny8xIgotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJodHRwIjogewotICAgICAgICAgICAgICAidXJsIjogImh0dHA6Ly8xMjcuMC4wLjE6ODA4MC9nZXJyaXQiLAotICAgICAgICAgICAgICAicmVmIjogInJlZnMvY2hhbmdlcy85Ny85Ny8xIgotICAgICAgICAgICAgfQotICAgICAgICAgIH0sCi0gICAgICAgICAgImNvbW1pdCI6IHsKLSAgICAgICAgICAgICJwYXJlbnRzIjogWwotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgImNvbW1pdCI6ICIxZWVlMmM5ZDhmMzUyNDgzNzgxZTc3MmYzNWRjNTg2YTY5ZmY1NjQ2IiwKLSAgICAgICAgICAgICAgICAic3ViamVjdCI6ICJNaWdyYXRlIGNvbnRyaWJ1dG9yIGFncmVlbWVudHMgdG8gQWxsLVByb2plY3RzLiIKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICJhdXRob3IiOiB7Ci0gICAgICAgICAgICAgICJuYW1lIjogIlNoYXduIE8uIFBlYXJjZSIsCi0gICAgICAgICAgICAgICJlbWFpbCI6ICJzb3BAZ29vZ2xlLmNvbSIsCi0gICAgICAgICAgICAgICJkYXRlIjogIjIwMTItMDQtMjQgMTg6MDg6MDguMDAwMDAwMDAwIiwKLSAgICAgICAgICAgICAgInR6IjogLTQyMAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJjb21taXR0ZXIiOiB7Ci0gICAgICAgICAgICAgICJuYW1lIjogIlNoYXduIE8uIFBlYXJjZSIsCi0gICAgICAgICAgICAgICJlbWFpbCI6ICJzb3BAZ29vZ2xlLmNvbSIsCi0gICAgICAgICAgICAgICJkYXRlIjogIjIwMTItMDQtMjQgMTg6MDg6MDguMDAwMDAwMDAwIiwKLSAgICAgICAgICAgICAgInR6IjogLTQyMAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJzdWJqZWN0IjogIlVzZSBhbiBFdmVudEJ1cyB0byBtYW5hZ2Ugc3RhciBpY29ucyIsCi0gICAgICAgICAgICAibWVzc2FnZSI6ICJVc2UgYW4gRXZlbnRCdXMgdG8gbWFuYWdlIHN0YXIgaWNvbnNcblxuSW1hZ2Ugd2lkZ2V0cyB0aGF0IG5lZWQgdG8gLi4uIgotICAgICAgICAgIH0sCi0gICAgICAgICAgImZpbGVzIjogewotICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNhY2hlLmphdmEiOiB7Ci0gICAgICAgICAgICAgICJsaW5lc19kZWxldGVkIjogOAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VEZXRhaWxDYWNoZS5qYXZhIjogewotICAgICAgICAgICAgICAibGluZXNfaW5zZXJ0ZWQiOiAxCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVNjcmVlbi5qYXZhIjogewotICAgICAgICAgICAgICAibGluZXNfaW5zZXJ0ZWQiOiAxMSwKLSAgICAgICAgICAgICAgImxpbmVzX2RlbGV0ZWQiOiAxOQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VUYWJsZS5qYXZhIjogewotICAgICAgICAgICAgICAibGluZXNfaW5zZXJ0ZWQiOiAyMywKLSAgICAgICAgICAgICAgImxpbmVzX2RlbGV0ZWQiOiAyMAotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICJnZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdGFyQ2FjaGUuamF2YSI6IHsKLSAgICAgICAgICAgICAgInN0YXR1cyI6ICJEIiwKLSAgICAgICAgICAgICAgImxpbmVzX2RlbGV0ZWQiOiAxMzkKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAiZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3RhcnJlZENoYW5nZXMuamF2YSI6IHsKLSAgICAgICAgICAgICAgInN0YXR1cyI6ICJBIiwKLSAgICAgICAgICAgICAgImxpbmVzX2luc2VydGVkIjogMjA0Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgImdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TY3JlZW4uamF2YSI6IHsKLSAgICAgICAgICAgICAgImxpbmVzX2RlbGV0ZWQiOiA5Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICBdCi0tLS0tCi0KKzQyMiBVbnByb2Nlc3NhYmxlIEVudGl0eQorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCitgNDIyIFVucHJvY2Vzc2FibGUgRW50aXR5YCBpcyByZXR1cm5lZCBpZiB0aGUgSUQgb2YgYSByZXNvdXJjZSB0aGF0IGlzCitzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgYm9keSBjYW5ub3QgYmUgcmVzb2x2ZWQuCiAKIEdFUlJJVAogLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzZXItY2hhbmdlaWQudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLWNoYW5nZWlkLnR4dAppbmRleCBhMzAxNWUxLi5hNDIyNGJkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXItY2hhbmdlaWQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNlci1jaGFuZ2VpZC50eHQKQEAgLTEwLDEwICsxMCwxMCBAQAogR2Vycml0IGNhbiBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZSBhIG5ldyB2ZXJzaW9uIG9mIGEgY2hhbmdlIGJhY2sKIHRvIGl0cyBvcmlnaW5hbCByZXZpZXcsIGV2ZW4gYWNyb3NzIGNoZXJyeS1waWNrcyBhbmQgcmViYXNlcy4KIAotVG8gYmUgcGlja2VkIHVwIGJ5IEdlcnJpdCwgYSBDaGFuZ2UtSWQgbGluZSBtdXN0IGJlIGluIHRoZSBib3R0b20KLXBvcnRpb24gKGxhc3QgcGFyYWdyYXBoKSBvZiBhIGNvbW1pdCBtZXNzYWdlLCBhbmQgbWF5IGJlIG1peGVkCi10b2dldGhlciB3aXRoIHRoZSBTaWduZWQtb2ZmLWJ5LCBBY2tlZC1ieSwgb3Igb3RoZXIgc3VjaCBmb290ZXJzLgotRm9yIGV4YW1wbGU6CitUbyBiZSBwaWNrZWQgdXAgYnkgR2Vycml0LCBhIENoYW5nZS1JZCBsaW5lIG11c3QgYmUgaW4gdGhlIGZvb3RlcgorKGxhc3QgcGFyYWdyYXBoKSBvZiBhIGNvbW1pdCBtZXNzYWdlLCBhbmQgbWF5IGJlIG1peGVkCit0b2dldGhlciB3aXRoIGxpbms6dXNlci1zaWduZWRvZmZieS5odG1sW1NpZ25lZC1vZmYtYnldLCBBY2tlZC1ieSwKK29yIG90aGVyIHN1Y2ggbGluZXMuIEZvciBleGFtcGxlOgogCiAtLS0tCiAgICQgZ2l0IGxvZyAtMQpAQCAtNDAsNiArNDAsNyBAQAogVG8gYXZvaWQgY29uZnVzaW9uIHdpdGggY29tbWl0IG5hbWVzLCBDaGFuZ2UtSWRzIGFyZSB0eXBpY2FsbHkgcHJlZml4ZWQgd2l0aAogYW4gdXBwZXJjYXNlIGBJYC4KIAorW1tjcmVhdGlvbl1dCiBDcmVhdGlvbgogLS0tLS0tLS0KIApAQCAtNTQsNiArNTUsMTAgQEAKIAogICAkIGN1cmwgLW8gLmdpdC9ob29rcy9jb21taXQtbXNnIGh0dHA6Ly9yZXZpZXcuZXhhbXBsZS5jb20vdG9vbHMvaG9va3MvY29tbWl0LW1zZwogCitUaGVuIGVuc3VyZSB0aGF0IHRoZSBleGVjdXRlIGJpdCBpcyBzZXQgb24gdGhlIGhvb2sgc2NyaXB0OgorCisgICQgY2htb2QgdSt4IC5naXQvaG9va3MvY29tbWl0LW1zZworCiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgbGluazpjbWQtaG9vay1jb21taXQtbXNnLmh0bWxbY29tbWl0LW1zZ10uCiAKIENoYW5nZSBVcGxvYWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNlci1jdXN0b20tZGFzaGJvYXJkcy50eHQgYi9Eb2N1bWVudGF0aW9uL3VzZXItY3VzdG9tLWRhc2hib2FyZHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE1ZTRjLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vdXNlci1jdXN0b20tZGFzaGJvYXJkcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1HZXJyaXQgQ29kZSBSZXZpZXcgLSBDdXN0b20gRGFzaGJvYXJkcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0tCi0KLUEgY3VzdG9tIGRhc2hib2FyZCBpcyBzaG93biBpbiBhIGxheW91dCBzaW1pbGFyIHRvIHRoZSBwZXItdXNlcgotZGFzaGJvYXJkLCBidXQgdGhlIHNlY3Rpb25zIGFyZSBlbnRpcmVseSBjb25maWd1cmVkIGZyb20gdGhlIFVSTC4KLUJlY2F1c2Ugb2YgdGhpcyBjdXN0b20gZGFzaGJvYXJkcyBhcmUgc3RhdGVsZXNzIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KLVVzZXJzIG9yIHByb2plY3RzIGNhbiBzaW1wbHkgdHJhZGUgVVJMcyB1c2luZyBhbiBleHRlcm5hbCBzeXN0ZW0gbGlrZQotYSBwcm9qZWN0IHdpa2ksIG9yIHNpdGUgYWRtaW5pc3RyYXRvcnMgY2FuIHB1dCB0aGUgbGlua3MgaW50byB0aGUKLXNpdGUncyBgR2Vycml0SGVhZGVyLmh0bWxgIG9yIGBHZXJyaXRGb290ZXIuaHRtbGAuCi0KLURhc2hib2FyZHMgYXJlIGF2YWlsYWJsZSB2aWEgVVJMcyBsaWtlOgotLS0tLQotICAvIy9kYXNoYm9hcmQvP3RpdGxlPUN1c3RvbStWaWV3JlRvK1Jldmlldz1yZXZpZXdlcjpqb2huLmRvZUBleGFtcGxlLmNvbSZQZW5kaW5nK0luK215cHJvamVjdD1wcm9qZWN0Om15cHJvamVjdCtpczpvcGVuCi0tLS0tCi1UaGlzIG9wZW5zIGEgdmlldyBzaG93aW5nIHRoZSB0aXRsZSAiQ3VzdG9tIFZpZXciIHdpdGggdHdvIHNlY3Rpb25zLAotIlRvIFJldmlldyIgYW5kICJQZW5kaW5nIGluIG15cHJvamVjdCI6Ci0tLS0tCi0gIEN1c3RvbSBWaWV3Ci0KLSAgVG8gUmV2aWV3Ci0KLSAgICBSZXN1bHRzIG9mIGByZXZpZXdlcjpqb2huLmRvZUBleGFtcGxlLmNvbWAKLQotICBQZW5kaW5nIEluIG15cHJvamVjdAotCi0gICAgUmVzdWx0cyBvZiBgcHJvamVjdDpteXByb2plY3QgaXM6b3BlbmAKLS0tLS0KLQotVGhlIGRhc2hib2FyZCBVUkxzIGFyZSBlYXN5IHRvIGNvbmZpZ3VyZS4gQWxsIGtleXMgYW5kIHZhbHVlcyBpbiB0aGUKLVVSTCBhcmUgZW5jb2RlZCBhcyBxdWVyeSBwYXJhbWV0ZXJzLiBTZXQgdGhlIHBhZ2UgYW5kIHdpbmRvdyB0aXRsZQotdXNpbmcgYW4gb3B0aW9uYWwgYHRpdGxlPVRleHRgIHBhcmFtZXRlci4KLQotRWFjaCBzZWN0aW9uJ3MgdGl0bGUgaXMgZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUsIHRoZSBzZWN0aW9uCi1kaXNwbGF5IG9yZGVyIGlzIGRlZmluZWQgYnkgdGhlIG9yZGVyIHRoZSBwYXJhbWV0ZXJzIGFwcGVhciBpbiB0aGUKLVVSTCwgYW5kIHRoZSBxdWVyeSByZXN1bHRzIGFyZSBkZWZpbmVkIGJ5IHRoZSBwYXJhbWV0ZXIgdmFsdWUuIFRvCi1saW1pdCB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gYSBxdWVyeSB1c2UgYGxpbWl0Ok5gLCBvdGhlcndpc2UgdGhlCi1lbnRpcmUgcmVzdWx0IHNldCB3aWxsIGJlIHNob3duICh1cCB0byB0aGUgdXNlcidzIHF1ZXJ5IGxpbWl0KS4KLQotUGFyYW1ldGVycyBtYXkgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciB1c2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZwotY2hhcmFjdGVycywgYXMgc29tZSB1c2VycyBtYXkgZmluZCBvbmUgbW9yZSByZWFkYWJsZSB0aGFuIGFub3RoZXI6Ci1gJmAgb3IgYDtgIG9yIGAsYAotCi1HRVJSSVQKLS0tLS0tLQotUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2VyLWRhc2hib2FyZHMudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLWRhc2hib2FyZHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTJiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3VzZXItZGFzaGJvYXJkcy50eHQKQEAgLTAsMCArMSwxNjkgQEAKK0dlcnJpdCBDb2RlIFJldmlldyAtIERhc2hib2FyZHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ3VzdG9tIERhc2hib2FyZHMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0EgY3VzdG9tIGRhc2hib2FyZCBpcyBzaG93biBpbiBhIGxheW91dCBzaW1pbGFyIHRvIHRoZSBwZXItdXNlcgorZGFzaGJvYXJkLCBidXQgdGhlIHNlY3Rpb25zIGFyZSBlbnRpcmVseSBjb25maWd1cmVkIGZyb20gdGhlIFVSTC4KK0JlY2F1c2Ugb2YgdGhpcyBjdXN0b20gZGFzaGJvYXJkcyBhcmUgc3RhdGVsZXNzIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KK1VzZXJzIG9yIHByb2plY3RzIGNhbiBzaW1wbHkgdHJhZGUgVVJMcyB1c2luZyBhbiBleHRlcm5hbCBzeXN0ZW0gbGlrZQorYSBwcm9qZWN0IHdpa2ksIG9yIHNpdGUgYWRtaW5pc3RyYXRvcnMgY2FuIHB1dCB0aGUgbGlua3MgaW50byB0aGUKK3NpdGUncyBgR2Vycml0SGVhZGVyLmh0bWxgIG9yIGBHZXJyaXRGb290ZXIuaHRtbGAuCisKK0Rhc2hib2FyZHMgYXJlIGF2YWlsYWJsZSB2aWEgVVJMcyBsaWtlOgorLS0tLQorICAvIy9kYXNoYm9hcmQvP3RpdGxlPUN1c3RvbStWaWV3JlRvK1Jldmlldz1yZXZpZXdlcjpqb2huLmRvZUBleGFtcGxlLmNvbSZQZW5kaW5nK0luK215cHJvamVjdD1wcm9qZWN0Om15cHJvamVjdCtpczpvcGVuCistLS0tCitUaGlzIG9wZW5zIGEgdmlldyBzaG93aW5nIHRoZSB0aXRsZSAiQ3VzdG9tIFZpZXciIHdpdGggdHdvIHNlY3Rpb25zLAorIlRvIFJldmlldyIgYW5kICJQZW5kaW5nIGluIG15cHJvamVjdCI6CistLS0tCisgIEN1c3RvbSBWaWV3CisKKyAgVG8gUmV2aWV3CisKKyAgICBSZXN1bHRzIG9mIGByZXZpZXdlcjpqb2huLmRvZUBleGFtcGxlLmNvbWAKKworICBQZW5kaW5nIEluIG15cHJvamVjdAorCisgICAgUmVzdWx0cyBvZiBgcHJvamVjdDpteXByb2plY3QgaXM6b3BlbmAKKy0tLS0KKworVGhlIGRhc2hib2FyZCBVUkxzIGFyZSBlYXN5IHRvIGNvbmZpZ3VyZS4gQWxsIGtleXMgYW5kIHZhbHVlcyBpbiB0aGUKK1VSTCBhcmUgZW5jb2RlZCBhcyBxdWVyeSBwYXJhbWV0ZXJzLiBTZXQgdGhlIHBhZ2UgYW5kIHdpbmRvdyB0aXRsZQordXNpbmcgYW4gb3B0aW9uYWwgYHRpdGxlPVRleHRgIHBhcmFtZXRlci4KKworRWFjaCBzZWN0aW9uJ3MgdGl0bGUgaXMgZGVmaW5lZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUsIHRoZSBzZWN0aW9uCitkaXNwbGF5IG9yZGVyIGlzIGRlZmluZWQgYnkgdGhlIG9yZGVyIHRoZSBwYXJhbWV0ZXJzIGFwcGVhciBpbiB0aGUKK1VSTCwgYW5kIHRoZSBxdWVyeSByZXN1bHRzIGFyZSBkZWZpbmVkIGJ5IHRoZSBwYXJhbWV0ZXIgdmFsdWUuIFRvCitsaW1pdCB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gYSBxdWVyeSB1c2UgYGxpbWl0Ok5gLCBvdGhlcndpc2UgdGhlCitlbnRpcmUgcmVzdWx0IHNldCB3aWxsIGJlIHNob3duICh1cCB0byB0aGUgdXNlcidzIHF1ZXJ5IGxpbWl0KS4KKworUGFyYW1ldGVycyBtYXkgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciB1c2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZworY2hhcmFjdGVycywgYXMgc29tZSB1c2VycyBtYXkgZmluZCBvbmUgbW9yZSByZWFkYWJsZSB0aGFuIGFub3RoZXI6CitgJmAgb3IgYDtgIG9yIGAsYAorCitUaGUgc3BlY2lhbCBgZm9yZWFjaD0uLi5gIHBhcmFtZXRlciBpcyBkZXNpZ25lZCB0byBmYWNpbGl0YXRlCittb3JlIGVhc2lseSB3cml0dGluZyBzaW1pbGFyIHF1ZXJpZXMgaW4gYSBkYXNoYm9hcmQuICBUaGUgdmFsdWUgb2YgdGhlCitmb3JlYWNoIHBhcmFtZXRlciB3aWxsIGJlIHVzZWQgaW4gZXZlcnkgcXVlcnkgaW4gdGhlIGRhc2hib2FyZCBieQorYXBwZW5kaW5nIGl0IHRvIHRoZWlyIGVuZHMgd2l0aCBhIHNwYWNlIChBTkRpbmcgaXQgd2l0aCB0aGUgcXVlcmllcykuCisKK0V4YW1wbGUgY3VzdG9tIGRhc2hib2FyZCB1c2luZyBmb3JlYWNoIHRvIGNvbnN0cmFpbiBhIGRhc2hib2FyZAordG8gY2hhbmdlcyBmb3IgdGhlIGN1cnJlbnQgdXNlcjoKKworLS0tLQorICAvIy9kYXNoYm9hcmQvP3RpdGxlPU1pbmUmZm9yZWFjaD1vd25lcjpzZWxmJk15K1BlbmRpbmc9aXM6b3BlbiZNeStNZXJnZWQ9aXM6bWVyZ2VkCistLS0tCisKKworW1twcm9qZWN0LWRhc2hib2FyZHNdXQorUHJvamVjdCBEYXNoYm9hcmRzCistLS0tLS0tLS0tLS0tLS0tLS0KKworSXQgaXMgcG9zc2libGUgdG8gc2hhcmUgY3VzdG9tIGRhc2hib2FyZHMgYXQgYSBwcm9qZWN0IGxldmVsLiBUbyBkbwordGhpcyBkZWZpbmUgdGhlIGRhc2hib2FyZHMgaW4gYSBgcmVmcy9tZXRhL2Rhc2hib2FyZHMvKmAgYnJhbmNoIG9mIHRoZQorcHJvamVjdC4gRm9yIGVhY2ggZGFzaGJvYXJkIGNyZWF0ZSBhIGNvbmZpZyBmaWxlLiBUaGUgZmlsZSBwYXRoL25hbWUKK3dpbGwgYmUgdXNlZCBhcyBuYW1lIChlcXVpdmFsZW50IHRvIGEgdGl0bGUgaW4gYSBjdXN0b20gZGFzaGJvYXJkKSBmb3IKK3RoZSBkYXNoYm9hcmQuCisKK0V4YW1wbGUgZGFzaGJvYXJkIGNvbmZpZyBmaWxlIGBNeVByb2plY3QgRGFzaGJvYXJkYDoKKworLS0tLQorW2Rhc2hib2FyZF0KKyAgZGVzY3JpcHRpb24gPSBNb3N0IHJlY2VudCBvcGVuIGFuZCBtZXJnZWQgY2hhbmdlcy4KK1tzZWN0aW9uICJPcGVuIENoYW5nZXMiXQorICBxdWVyeSA9IHN0YXR1czpvcGVuIHByb2plY3Q6bXlQcm9qZWN0IGxpbWl0OjE1Citbc2VjdGlvbiAiTWVyZ2VkIENoYW5nZXMiXQorICBxdWVyeSA9IHN0YXR1czptZXJnZWQgcHJvamVjdDpteVByb2plY3QgbGltaXQ6MTUKKy0tLS0KKworT25jZSBkZWZpbmVkLCBwcm9qZWN0IGRhc2hib2FyZHMgYXJlIGFjY2Vzc2libGUgdXNpbmcgc3RhYmxlIFVSTHMgYnkKK3VzaW5nIHRoZSBwcm9qZWN0IG5hbWUsIHJlZm5hbWUgYW5kIHBhdGhuYW1lIG9mIHRoZSBkYXNoYm9hcmQgdmlhIFVSTHMKK2xpa2U6CistLS0tCisgIC8jL3Byb2plY3RzL0FsbC1Qcm9qZWN0cyxkYXNoYm9hcmRzL1NpdGU6TWFpbgorLS0tLQorCitQcm9qZWN0IGRhc2hib2FyZHMgYXJlIGluaGVyaXRlZCBmcm9tIGFuY2VzdG9yIHByb2plY3RzIHVubGVzcworb3ZlcnJpZGRlbiBieSBkYXNoYm9hcmRzIHdpdGggdGhlIHNhbWUgcmVmIGFuZCBuYW1lLiAgVGhpcyBtYWtlcworaXQgZWFzeSB0byBkZWZpbmUgY29tbW9uIGRhc2hib2FyZHMgZm9yIGV2ZXJ5IHByb2plY3QgYnkgc2ltcGx5CitkZWZpbmluZyBwcm9qZWN0IGRhc2hib2FyZHMgb24gdGhlIEFsbC1Qcm9qZWN0cyBwcm9qZWN0LgorCitUb2tlbiBgJHtwcm9qZWN0fWAKK35+fn5+fn5+fn5+fn5+fn5+fgorCitQcm9qZWN0IGRhc2hib2FyZCBxdWVyaWVzIG1heSBjb250YWluIHRoZSBzcGVjaWFsIGAke3Byb2plY3R9YCB0b2tlbgord2hpY2ggd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHdoaWNoIHRoZQorZGFzaGJvYXJkIGlzIGJlaW5nIGFwcGxpZWQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVmaW5pbmcgZGFzaGJvYXJkcworZGVzaWduZWQgdG8gYmUgaW5oZXJpdGVkLiAgV2l0aCB0aGlzIHRva2VuLCBpdCBpcyBwb3NzaWJsZSB0byBjYXVzZSBhCitxdWVyeSBpbiBhIHByb2plY3QgZGFzaGJvYXJkIHRvIGJlIHJlc3RyaWN0ZWQgdG8gb25seSBjaGFuZ2VzIGZvciB0aGUKK3Byb2plY3QgaW4gd2hpY2ggYW4gaW5oZXJpdGVkIGRhc2hib2FyZCBpcyBiZWluZyBhcHBsaWVkIGJ5IHNpbXBseQorYWRkaW5nIGBwcm9qZWN0OiR7cHJvamVjdH1gIHRvIHRoZSBxdWVyeSBpbiB0aGUgZGFzaGJvYXJkLgorCitUaGUgYCR7cHJvamVjdH1gIHRva2VuIGNhbiBhbHNvIGJlIHVzZWQgaW4gdGhlIGxpbms6I2Rhc2hib2FyZC50aXRsZVsKK2Rhc2hib2FyZCB0aXRsZV0gYW5kIGluIHRoZSBsaW5rOiNkYXNoYm9hcmQuZGVzY3JpcHRpb25bZGFzaGJvYXJkCitkZXNjcmlwdGlvbl0uCisKK1NlY3Rpb24gYGRhc2hib2FyZGAKK35+fn5+fn5+fn5+fn5+fn5+fn4KKworW1tkYXNoYm9hcmQudGl0bGVdXWRhc2hib2FyZC50aXRsZTo6CisrCitUaGUgdGl0bGUgb2YgdGhlIGRhc2hib2FyZC4KKysKK0lmIG5vdCBzcGVjaWZpZWQgdGhlIHBhdGggb2YgdGhlIGRhc2hib2FyZCBjb25maWcgZmlsZSBpcyB1c2VkIGFzCit0aXRsZS4KKworW1tkYXNoYm9hcmQuZGVzY3JpcHRpb25dXWRhc2hib2FyZC5kZXNjcmlwdGlvbjo6CisrCitUaGUgZGVzY3JpcHRpb24gb2YgdGhlIGRhc2hib2FyZC4KKworZGFzaGJvYXJkLmZvcmVhY2g6OgorKworVGhlIHZhbHVlIG9mIHRoZSBmb3JlYWNoIHBhcmFtZXRlciBnZXRzIGFwcGVuZGVkIHRvIGV2ZXJ5IHF1ZXJ5IGluIHRoZQorZGFzaGJvYXJkLgorKworRXhhbXBsZSBkYXNoYm9hcmQgY29uZmlnIHNlY3Rpb24gdG8gY29uc3RyYWluIHRoZSBlbnRpcmUgZGFzaGJvYXJkIHRvCit0aGUgcHJvamVjdCB0byB3aGljaCBpdCBpcyBhcHBsaWVkOgorKworLS0tLQorW2Rhc2hib2FyZF0KKyAgZm9yZWFjaCA9IHByb2plY3Q6JHtwcm9qZWN0fQorLS0tLQorCisKK1NlY3Rpb24gYHNlY3Rpb25gCit+fn5+fn5+fn5+fn5+fn5+fgorCitzZWN0aW9uLjxuYW1lPi5xdWVyeTo6CisrCitUaGUgY2hhbmdlIHF1ZXJ5IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcG9wdWxhdGUgdGhlIHNlY3Rpb24gd2l0aCB0aGUKK2dpdmVuIG5hbWUuCisKK1tbcHJvamVjdC1kZWZhdWx0LWRhc2hib2FyZF1dCitQcm9qZWN0IERlZmF1bHQgRGFzaGJvYXJkCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSBhIGRlZmF1bHQgZGFzaGJvYXJkIGZvciBhIHByb2plY3QgaW4gdGhlCitwcm9qZWN0cyBgcHJvamVjdC5jb25maWdgIGZpbGUgaW4gdGhlIGByZWZzL21ldGEvY29uZmlnYCBicmFuY2g6CisKKy0tLS0KK1tkYXNoYm9hcmRdCisgIGRlZmF1bHQgPSByZWZzL21ldGEvZGFzaGJvYXJkcy9tYWluOmRlZmF1bHQKKy0tLS0KKworVGhlIGRhc2hib2FyZCBzZXQgYXMgdGhlIGRlZmF1bHQgZGFzaGJvYXJkIHdpbGwgYmUgaW5oZXJpdGVkIGFzIHRoZQorZGVmYXVsdCBkYXNoYm9hcmQgYnkgY2hpbGQgcHJvamVjdHMgaWYgdGhleSBkbyBub3QgZGVmaW5lIHRoZWlyIG93bgorZGVmYXVsdCBkYXNoYm9hcmQuIFRoZSBgbG9jYWwtZGVmYXVsdGAgZW50cnkgbWFrZXMgaXQgcG9zc2libGUgdG8KK2RlZmluZSBhIGRpZmZlcmVudCBkZWZhdWx0IGRhc2hib2FyZCB0aGF0IGlzIG9ubHkgdXNlZCBieSB0aGlzIHByb2plY3QKK2J1dCBub3QgaW5oZXJpdGVkIHRvIHRoZSBjaGlsZCBwcm9qZWN0cy4KKworLS0tLQorW2Rhc2hib2FyZF0KKyAgZGVmYXVsdCA9IHJlZnMvbWV0YS9kYXNoYm9hcmRzL21haW46ZGVmYXVsdAorICBsb2NhbC1kZWZhdWx0ID0gcmVmcy9tZXRhL2Rhc2hib2FyZHMvbWFpbjpsb2NhbAorLS0tLQorCitHRVJSSVQKKy0tLS0tLQorUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2VyLW5vdGlmeS50eHQgYi9Eb2N1bWVudGF0aW9uL3VzZXItbm90aWZ5LnR4dAppbmRleCBhZTNjMmQwOS4uNzExZDFhYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi91c2VyLW5vdGlmeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2VyLW5vdGlmeS50eHQKQEAgLTE4LDkgKzE4LDkgQEAKIGBBbGwtUHJvamVjdHNgIGNhbiBiZSB3YXRjaGVkIHRvIHdhdGNoIGFsbCBwcm9qZWN0cyB0aGF0CiBhcmUgdmlzaWJsZSB0byB0aGUgdXNlci4KIAotQ2hhbmdlIHNlYXJjaCBleHByZXNzaW9ucyBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgY2hhbmdlIG5vdGlmaWNhdGlvbnMKLXRvIHNwZWNpZmljIHN1YnNldHMsIGZvciBleGFtcGxlIGBicmFuY2g6bWFzdGVyYCB0byBvbmx5IHNlZSBjaGFuZ2VzCi1wcm9wb3NlZCBmb3IgdGhlIG1hc3RlciBicmFuY2guCitsaW5rOnVzZXItc2VhcmNoLmh0bWxbQ2hhbmdlIHNlYXJjaCBleHByZXNzaW9uc10gY2FuIGJlIHVzZWQgdG8gZmlsdGVyCitjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBzcGVjaWZpYyBzdWJzZXRzLCBmb3IgZXhhbXBsZSBgYnJhbmNoOm1hc3RlcmAKK3RvIG9ubHkgc2VlIGNoYW5nZXMgcHJvcG9zZWQgZm9yIHRoZSBtYXN0ZXIgYnJhbmNoLgogCiBQcm9qZWN0IExldmVsIFNldHRpbmdzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05MiwxMyArOTIsMjUgQEAKIGFyZSBzZW50LgogKwogKiBgbmV3X2NoYW5nZXNgOiBPbmx5IG5ld2x5IGNyZWF0ZWQgY2hhbmdlcy4KKyogYG5ld19wYXRjaHNldHNgOiBPbmx5IG5ld2x5IGNyZWF0ZWQgcGF0Y2ggc2V0cy4KICogYGFsbF9jb21tZW50c2A6IE9ubHkgY29tbWVudHMgb24gZXhpc3RpbmcgY2hhbmdlcy4KICogYHN1Ym1pdHRlZF9jaGFuZ2VzYDogT25seSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZC4KKyogYGFiYW5kb25lZF9jaGFuZ2VzYDogT25seSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGFiYW5kb25lZC4KICogYGFsbGA6IEFsbCBub3RpZmljYXRpb25zLgogCiArCiBMaWtlIGVtYWlsLCB0aGlzIHZhcmlhYmxlIG1heSBiZSBhIGxpc3Qgb2Ygb3B0aW9ucy4KIAorW1tub3RpZnkubmFtZS5oZWFkZXJdXW5vdGlmeS48bmFtZT4uaGVhZGVyOjoKKysKK0VtYWlsIGhlYWRlciB1c2VkIHRvIGxpc3QgdGhlIGRlc3RpbmF0aW9uLiBJZiBub3Qgc2V0IEJDQyBpcyB1c2VkLgorT25seSBvbmUgdmFsdWUgbWF5IGJlIHNwZWNpZmllZC4gVG8gdXNlIGRpZmZlcmVudCBoZWFkZXJzIGZvciBlYWNoCithZGRyZXNzIGxpc3QgdGhlbSBpbiBkaWZmZXJlbnQgbm90aWZ5IGJsb2Nrcy4KKysKKyogYHRvYDogVGhlIHN0YW5kYXJkIFRvIGZpZWxkIGlzIHVzZWQ7IGFkZHJlc3NlcyBhcmUgdmlzaWJsZSB0byBhbGwuCisqIGBjY2A6IFRoZSBzdGFuZGFyZCBDQyBmaWVsZCBpcyB1c2VkOyBhZGRyZXNzZXMgYXJlIHZpc2libGUgdG8gYWxsLgorKiBgYmNjYDogU01UUCBSQ1BUIFRPIGlzIHVzZWQgdG8gaGlkZSB0aGUgYWRkcmVzcy4KKwogW1tub3RpZnkubmFtZS5maWx0ZXJdXW5vdGlmeS48bmFtZT4uZmlsdGVyOjoKICsKIGxpbms6dXNlci1zZWFyY2guaHRtbFtDaGFuZ2Ugc2VhcmNoIGV4cHJlc3Npb25dIHRvIG1hdGNoIGNoYW5nZXMgdGhhdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2VyLXNlYXJjaC50eHQgYi9Eb2N1bWVudGF0aW9uL3VzZXItc2VhcmNoLnR4dAppbmRleCA4YTIzMWZlLi5mNDMyOGJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXItc2VhcmNoLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzZXItc2VhcmNoLnR4dApAQCAtMSw3ICsxLDcgQEAKIEdlcnJpdCBDb2RlIFJldmlldyAtIFNlYXJjaGluZyBDaGFuZ2VzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1EZWZhdWx0IFNlYXJjaGVzIAorRGVmYXVsdCBTZWFyY2hlcwogLS0tLS0tLS0tLS0tLS0tLQogCiBNb3N0IGJhc2ljIHNlYXJjaGVzIGNhbiBiZSB2aWV3ZWQgYnkgY2xpY2tpbmcgb24gYSBsaW5rIGFsb25nIHRoZSB0b3AKQEAgLTIzLDYgKzIzLDcgQEAKIHxPcGVuIGNoYW5nZXMgaW4gRm9vICB8IHN0YXR1czpvcGVuIHByb2plY3Q6Rm9vCiB8PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisKIEJhc2ljIENoYW5nZSBTZWFyY2gKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzYsNyArMzcsNyBAQAogfEZ1bGwgb3IgYWJicmV2aWF0ZWQgQ2hhbmdlLUlkICAgIHwgSWMwZmYzMwogfEZ1bGwgb3IgYWJicmV2aWF0ZWQgY29tbWl0IFNIQS0xIHwgZDgxYjMyZWYKIHxFbWFpbCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICB8IHVzZXJAZXhhbXBsZS5jb20KLXxBcHByb3ZhbCByZXF1aXJlbWVudCAgICAgICAgICAgICB8IENvZGVSZXZpZXc+PSsyLCBWZXJpZmllZD0xCit8QXBwcm92YWwgcmVxdWlyZW1lbnQgICAgICAgICAgICAgfCBDb2RlLVJldmlldz49KzIsIFZlcmlmaWVkPTEKIHw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIApAQCAtMTA5LDcgKzExMCw2IEBACiBsaW5rOmh0dHA6Ly93d3cuYnJpY3MuZGsvYXV0b21hdG9uL1tkay5icmljcy5hdXRvbWF0b24KIGxpYnJhcnldIGlzIHVzZWQgZm9yIGV2YWx1YXRpb24gb2Ygc3VjaCBwYXR0ZXJucy4KIAotCiBbW2JyYW5jaF1dCiBicmFuY2g6J0JSQU5DSCc6OgogKwpAQCAtMjcxLDYgKzI3MSwxNyBAQAogQ2hhbmdlIGhhcyBiZWVuIGFiYW5kb25lZC4KIAogCitBcmd1bWVudCBRdW90aW5nCistLS0tLS0tLS0tLS0tLS0tCisKK09wZXJhdG9yIHZhbHVlcyB0aGF0IGFyZSBub3QgYmFyZSB3b3JkcyAocm91Z2hseSBBLVosIGEteiwgMC05LCBALAoraHlwZW4sIGRvdCBhbmQgdW5kZXJzY29yZSkgbXVzdCBiZSBxdW90ZWQgZm9yIHRoZSBxdWVyeSBwYXJzZXIuCisKK1F1b3RpbmcgaXMgYWNjZXB0ZWQgYXMgZWl0aGVyIGRvdWJsZSBxdW90ZXMKKyhlLmcuICBgbWVzc2FnZToidGhlIHZhbHVlImApIG9yIGFzIG1hdGNoZWQKK2N1cmx5IGJyYWNlcyAoZS5nLiBgbWVzc2FnZTp7dGhlIHZhbHVlfWApLgorCisKIEJvb2xlYW4gT3BlcmF0b3JzCiAtLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMDYsMTggKzMxNywxMiBAQAogLS0tLS0tCiBMYWJlbCBvcGVyYXRvcnMgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYXBwcm92YWwgc2NvcmVzIGdpdmVuIGR1cmluZwogYSBjb2RlIHJldmlldy4gIFRoZSBzcGVjaWZpYyBzZXQgb2Ygc3VwcG9ydGVkIGxhYmVscyBkZXBlbmRzIG9uCi10aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24sIGhvd2V2ZXIgYENvZGVSZXZpZXdgIGFuZCBgVmVyaWZpZWRgCit0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24sIGhvd2V2ZXIgYENvZGUtUmV2aWV3YCBhbmQgYFZlcmlmaWVkYAogYXJlIHRoZSBkZWZhdWx0IGxhYmVscyBwcm92aWRlZCBvdXQgb2YgdGhlIGJveC4KIAogQSBsYWJlbCBuYW1lIGlzIGFueSBvZiB0aGUgZm9sbG93aW5nOgogCi0qIFRoZSBjYXRlZ29yeSBuYW1lLiAgSWYgdGhlIGNhdGVnb3J5IG5hbWUgY29udGFpbnMgc3BhY2VzLAotICBpdCBtdXN0IGJlIHdyYXBwZWQgaW4gZG91YmxlIHF1b3Rlcy4gIEV4YW1wbGU6IGBsYWJlbDoiQ29kZSBSZXZpZXciYC4KLQotKiBUaGUgbmFtZSwgd2l0aG91dCBzcGFjZXMuICBUaGlzIGF2b2lkcyBuZWVkaW5nIHRvIHVzZSBkb3VibGUgcXVvdGVzCi0gIGZvciB0aGUgY29tbW9uIGNhdGVnb3J5IENvZGUgUmV2aWV3LiAgRXhhbXBsZTogYGxhYmVsOkNvZGVSZXZpZXdgLgotCi0qIFRoZSBpbnRlcm5hbCBzaG9ydCBuYW1lLiAgRXhhbXBsZTogYGxhYmVsOkNSVldgLCBvciBgbGFiZWw6VlJJRmAuCisqIFRoZSBsYWJlbCBuYW1lLiAgRXhhbXBsZTogYGxhYmVsOkNvZGUtUmV2aWV3YC4KIAogKiBUaGUgb25lIG9yIHR3byBjaGFyYWN0ZXIgYWJicmV2aWF0aW9uIHNob3duIGluIHRoZSBjb2x1bW4gaGVhZGVyCiAgIG9mIGNoYW5nZSBsaXN0IHBhZ2VzLiAgRXhhbXBsZTogYGxhYmVsOlJgIG9yIGBsYWJlbDpWYC4KQEAgLTMyNSwzOCArMzMwLDM4IEBACiBBIGxhYmVsIG5hbWUgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNjb3JlLCBvciBhbiBvcGVyYXRvciBhbmQgYSBzY29yZS4KIFRoZSBlYXNpZXN0IHdheSB0byBleHBsYWluIHRoaXMgaXMgYnkgZXhhbXBsZS4KIAotYGxhYmVsOkNvZGVSZXZpZXc9MmA6OgotYGxhYmVsOkNvZGVSZXZpZXc9KzJgOjoKLWBsYWJlbDpDb2RlUmV2aWV3KzJgOjoKK2BsYWJlbDpDb2RlLVJldmlldz0yYDo6CitgbGFiZWw6Q29kZS1SZXZpZXc9KzJgOjoKK2BsYWJlbDpDb2RlLVJldmlldysyYDo6CiArCi1NYXRjaGVzIGNoYW5nZXMgd2hlcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lICsyIHNjb3JlIGZvciBDb2RlIFJldmlldy4KK01hdGNoZXMgY2hhbmdlcyB3aGVyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgKzIgc2NvcmUgZm9yIENvZGUtUmV2aWV3LgogVGhlICsgcHJlZml4IGlzIG9wdGlvbmFsIGZvciBwb3NpdGl2ZSBzY29yZSB2YWx1ZXMuICBJZiB0aGUgKyBpcyB1c2VkLAogdGhlID0gb3BlcmF0b3IgaXMgb3B0aW9uYWwuCiAKLWBsYWJlbDpDb2RlUmV2aWV3PS0yYDo6Ci1gbGFiZWw6Q29kZVJldmlldy0yYDo6CitgbGFiZWw6Q29kZS1SZXZpZXc9LTJgOjoKK2BsYWJlbDpDb2RlLVJldmlldy0yYDo6CiArCi1NYXRjaGVzIGNoYW5nZXMgd2hlcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIC0yIHNjb3JlIGZvciBDb2RlIFJldmlldy4KK01hdGNoZXMgY2hhbmdlcyB3aGVyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgLTIgc2NvcmUgZm9yIENvZGUtUmV2aWV3LgogQmVjYXVzZSB0aGUgbmVnYXRpdmUgc2lnbiBpcyByZXF1aXJlZCwgdGhlID0gb3BlcmF0b3IgaXMgb3B0aW9uYWwuCiAKLWBsYWJlbDpDb2RlUmV2aWV3PTFgOjoKK2BsYWJlbDpDb2RlLVJldmlldz0xYDo6CiArCi1NYXRjaGVzIGNoYW5nZXMgd2hlcmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lICsxIHNjb3JlIGZvciBDb2RlIFJldmlldy4KK01hdGNoZXMgY2hhbmdlcyB3aGVyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgKzEgc2NvcmUgZm9yIENvZGUtUmV2aWV3LgogU2NvcmVzIG9mICsyIGFyZSBub3QgbWF0Y2hlZCwgZXZlbiB0aG91Z2ggdGhleSBhcmUgaGlnaGVyLgogCi1gbGFiZWw6Q29kZVJldmlldz49MWA6OgorYGxhYmVsOkNvZGUtUmV2aWV3Pj0xYDo6CiArCiBNYXRjaGVzIGNoYW5nZXMgd2l0aCBlaXRoZXIgYSArMSwgKzIsIG9yIGFueSBoaWdoZXIgc2NvcmUuCiAKLWBsYWJlbDpDb2RlUmV2aWV3PD0tMWA6OgorYGxhYmVsOkNvZGUtUmV2aWV3PD0tMWA6OgogKwogTWF0Y2hlcyBjaGFuZ2VzIHdpdGggZWl0aGVyIGEgLTEsIC0yLCBvciBhbnkgbG93ZXIgc2NvcmUuCiAKLWBpczpvcGVuIENvZGVSZXZpZXcrMiBWZXJpZmllZCsxIC1WZXJpZmllZC0xIC1Db2RlUmV2aWV3LTJgOjoKK2BpczpvcGVuIENvZGUtUmV2aWV3KzIgVmVyaWZpZWQrMSAtVmVyaWZpZWQtMSAtQ29kZS1SZXZpZXctMmA6OgogKwogTWF0Y2hlcyBjaGFuZ2VzIHRoYXQgYXJlIHJlYWR5IHRvIGJlIHN1Ym1pdHRlZC4KIAotYGlzOm9wZW4gKFZlcmlmaWVkLTEgT1IgQ29kZVJldmlldy0yKWA6OgorYGlzOm9wZW4gKFZlcmlmaWVkLTEgT1IgQ29kZS1SZXZpZXctMilgOjoKICsKIENoYW5nZXMgdGhhdCBhcmUgYmxvY2tlZCBmcm9tIHN1Ym1pc3Npb24gZHVlIHRvIGEgYmxvY2tpbmcgc2NvcmUuCiAKQEAgLTQyNyw2ICs0MzIsNyBAQAogb2YgYSBxdWVyeS4gIEluY2x1ZGluZyBlaXRoZXIgdmFsdWUgaW4gYSB3ZWIgcXVlcnkgbWF5IGxlYWQgdG8KIHVucHJlZGljdGFibGUgcmVzdWx0cy4KIAorCiBHRVJSSVQKIC0tLS0tLQogUGFydCBvZiBsaW5rOmluZGV4Lmh0bWxbR2Vycml0IENvZGUgUmV2aWV3XQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2VyLXN1Ym1vZHVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi91c2VyLXN1Ym1vZHVsZXMudHh0CmluZGV4IGNmYWYzZTkuLjZhYWI0M2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNlci1zdWJtb2R1bGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzZXItc3VibW9kdWxlcy50eHQKQEAgLTEsNSArMSw1IEBACi1HZXJyaXQgQ29kZSBSZXZpZXcgLSBTdXBlcnByb2plY3RzIHN1YnNjcmliZWQgdG8gc3VibW9kdWxlcyB1cGRhdGVzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitHZXJyaXQgQ29kZSBSZXZpZXcgLSBTdXBlcnByb2plY3Qgc3Vic2NyaXB0aW9uIHRvIHN1Ym1vZHVsZXMgdXBkYXRlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCkBAIC0yNSw3ICsyNSw3IEBACiBHaXQgU3VibW9kdWxlcyBPdmVydmlldwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotSXQgaXMgYSBnaXQgZmVhdHVyZSB0aGF0IGFsbG93cyBhbiBleHRlcm5hbCByZXBvc2l0b3J5IHRvIGJlCitTdWJtb2R1bGVzIGFyZSBhIGdpdCBmZWF0dXJlIHRoYXQgYWxsb3dzIGFuIGV4dGVybmFsIHJlcG9zaXRvcnkgdG8gYmUKIGF0dGFjaGVkIGluc2lkZSBhIHJlcG9zaXRvcnkgYXQgYSBzcGVjaWZpYyBwYXRoLiBUaGUgb2JqZWN0aXZlIGhlcmUKIGlzIHRvIHByb3ZpZGUgYSBicmllZiBvdmVydmlldywgZnVydGhlciBkZXRhaWxzIGNhbiBiZSBmb3VuZAogaW4gdGhlIG9mZmljaWFsIGdpdCBzdWJtb2R1bGUgY29tbWFuZCBkb2N1bWVudGF0aW9uLgpAQCAtMzcsMjAgKzM3LDIwIEBACiAnc3VwZXInOgogPT09PT0KIGdpdCBzdWJtb2R1bGUgYWRkIHNzaDovL3NlcnZlci9hIGEKLT09PT0KKz09PT09CiAKIFN0aWxsIGNvbnNpZGVyaW5nIHRoZSBhYm92ZSBleGFtcGxlLCBhZnRlciBpdHMgZXhlY3V0aW9uIG5vdGljZSB0aGF0CiBpbnNpZGUgdGhlIGxvY2FsIHJlcG9zaXRvcnkgJ3N1cGVyJyB0aGUgJ2EnIGZvbGRlciBpcyBjb25zaWRlcmVkIGEKIGdpdGxpbmsgdG8gdGhlIGV4dGVybmFsIHJlcG9zaXRvcnkgJ2EnLiBBbHNvIG5vdGljZSBhIGZpbGUgY2FsbGVkCi0uZ2l0bW9kdWxlcyBpcyBjcmVhdGVkIChpdCBpcyBhIGNvbmZpZyBmaWxlIGNvbnRhaW5pbmcgdGhlCi1zdWJzY3JpcHRpb24gb2YgJ2EnKS4gVG8gcHJvdmlkZSB0aGUgc2hhLTEgZWFjaCBnaXRsaW5rIHBvaW50cyB0byBpbgorLmdpdG1vZHVsZXMgaXMgY3JlYXRlZCAoaXQgaXMgYSBjb25maWd1cmF0aW9uIGZpbGUgY29udGFpbmluZyB0aGUKK3N1YnNjcmlwdGlvbiBvZiAnYScpLiBUbyBwcm92aWRlIHRoZSBTSEEtMSBlYWNoIGdpdGxpbmsgcG9pbnRzIHRvIGluCiB0aGUgZXh0ZXJuYWwgcmVwb3NpdG9yeSwgb25lIHNob3VsZCB1c2UgdGhlIGNvbW1hbmQ6CiA9PT09CiBnaXQgc3VibW9kdWxlIHN0YXR1cwogPT09PQogCiBJbiB0aGUgZXhhbXBsZSBwcm92aWRlZCwgaWYgJ2EnIGlzIHVwZGF0ZWQgYW5kICdzdXBlcicgaXMgc3VwcG9zZWQKLXRvIHNlZSB0aGUgbGF0ZXN0IHNoYS0xIChjb25zaWRlcmluZyBoZXJlICdhJyBoYXMgb25seSB0aGUgbWFzdGVyCit0byBzZWUgdGhlIGxhdGVzdCBTSEEtMSAoY29uc2lkZXJpbmcgaGVyZSAnYScgaGFzIG9ubHkgdGhlIG1hc3RlcgogYnJhbmNoKSwgb25lIHNob3VsZCB0aGVuIGNvbW1pdCB0aGUgbW9kaWZpZWQgZ2l0bGluayBmb3IgJ2EnIGluCiB0aGUgJ3N1cGVyJyBwcm9qZWN0LiBBY3R1YWxseSBpdCB3b3VsZCBub3QgZXZlbiBuZWVkIHRvIGJlIGFuCiBleHRlcm5hbCB1cGRhdGUsIG9uZSBjb3VsZCBtb3ZlIHRvICdhJyBmb2xkZXIgKGluc2lkZXIgJ3N1cGVyJyksCkBAIC02MywxMSArNjMsMTEgQEAKIERlZmluaW5nIHRoZSBTdWJtb2R1bGUgQnJhbmNoCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCi1UaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgU3VibW9kdWxlIHN1YnNjcmlwdGlvbiBpcyBhY3R1YWxseSB0aGUKK1RoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBzdWJtb2R1bGUgc3Vic2NyaXB0aW9uIGlzIGFjdHVhbGx5IHRoZQogc3Vic2NyaXB0aW9uIG9mIGEgc3VibW9kdWxlIHByb2plY3QgYW5kIG9uZSBvZiBpdHMgYnJhbmNoZXMgZm9yCiBhIGJyYW5jaCBvZiBhIHN1cGVyIHByb2plY3QuCiAKLVNpbmNlIGl0IG1hbmFnZXMgc3Vic2NyaXB0aW9ucyBpbiB0aGUgYnJhbmNoIHNjb3BlLCB3ZSBjb3VsZCBoYXZlCitTaW5jZSBHZXJyaXQgbWFuYWdlcyBzdWJzY3JpcHRpb25zIGluIHRoZSBicmFuY2ggc2NvcGUsIHdlIGNvdWxkIGhhdmUKIGEgc2NlbmFyaW8gaGF2aW5nIGEgcHJvamVjdCBjYWxsZWQgJ3N1cGVyJyBoYXZpbmcgYSBicmFuY2ggJ2ludGVncmF0aW9uJwogc3Vic2NyaWJlZCB0byBhIHByb2plY3QgY2FsbGVkICdhJyBpbiBicmFuY2ggJ2ludGVncmF0aW9uJywgYW5kIGFsc28KIGhhdmluZyB0aGUgc2FtZSAnc3VwZXInIHByb2plY3QgYnV0IGluIGJyYW5jaCAnZGV2JyBzdWJzY3JpYmVkIHRvIHRoZSAnYScKQEAgLTc3LDIyICs3NywyMyBAQAogdGhlIC5naXRtb2R1bGVzIGZpbGUgdG8gYWRkIGEgYnJhbmNoIGZpZWxkIHRvIGVhY2ggc3VibW9kdWxlCiBzZWN0aW9uIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIHN1YnNjcmliZWQuCiAKLVRoZSBicmFuY2ggZmllbGQgaXMgbm90IGZpbGxlZCBieSB0aGUgZ2l0IHN1Ym1vZHVsZSBjb21tYW5kLiBJdHMgdmFsdWUKLXNob3VsZCBpbmRpY2F0ZSB0aGUgYnJhbmNoIG9mIGEgc3VibW9kdWxlIHByb2plY3QgdGhhdCB3aGVuIHVwZGF0ZWQKLXdpbGwgdHJpZ2dlciBhdXRvbWF0aWMgdXBkYXRlIG9mIGl0cyByZWdpc3RlcmVkIGdpdGxpbmsuCitBcyB0aGUgYnJhbmNoIGZpZWxkIGlzIGEgR2Vycml0IHNwZWNpZmljIGZpZWxkIGl0IHdpbGwgbm90IGJlIGZpbGxlZAorYXV0b21hdGljYWxseSBieSB0aGUgZ2l0IHN1Ym1vZHVsZSBjb21tYW5kLCBzbyBvbmUgbmVlZHMgdG8gZWRpdCBpdAorbWFudWFsbHkuIEl0cyB2YWx1ZSBzaG91bGQgaW5kaWNhdGUgdGhlIGJyYW5jaCBvZiBhIHN1Ym1vZHVsZSBwcm9qZWN0Cit0aGF0IHdoZW4gdXBkYXRlZCB3aWxsIHRyaWdnZXIgYXV0b21hdGljIHVwZGF0ZSBvZiBpdHMgcmVnaXN0ZXJlZAorZ2l0bGluay4KIAotVGhlIGJyYW5jaCB2YWx1ZSBjb3VsZCBiZSAnLicgaWYgdGhlIHN1Ym1vZHVsZSBwcm9qZWN0IGJyYW5jaAorVGhlIGJyYW5jaCB2YWx1ZSBjb3VsZCBiZSAiJy4nIiBpZiB0aGUgc3VibW9kdWxlIHByb2plY3QgYnJhbmNoCiBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZGVzdGluYXRpb24gYnJhbmNoIG9mIHRoZSBjb21taXQgaGF2aW5nCiBnaXRsaW5rcy8uZ2l0bW9kdWxlcyBmaWxlLgogCi1UaGUgYnJhbmNoIGZpZWxkIG9mIGEgc3VibW9kdWxlIHNlY3Rpb24gaXMgYSBjdXN0b20gZ2l0IHN1Ym1vZHVsZQotZmVhdHVyZSBmb3IgR2Vycml0IHVzZS4gT25lIHNob3VsZCBhbHdheXMgYmUgc3VyZSB0byBmaWxsIGl0IGluCi1lZGl0aW5nIC5naXRtb2R1bGVzIGZpbGUgYWZ0ZXIgYWRkaW5nIHN1Ym1vZHVsZXMgdG8gYSBzdXBlciBwcm9qZWN0LAotaWYgaXQgaXMgdGhlIGludGVudGlvbiB0byBtYWtlIHVzZSBvZiB0aGUgR2Vycml0IGZlYXR1cmUgaW50cm9kdWNlZCBoZXJlLgorSWYgdGhlIGludGVudGlvbiBpcyB0byBtYWtlIHVzZSBvZiB0aGUgR2Vycml0IGZlYXR1cmUgZGVzY3JpYmVkCitoZXJlLCBvbmUgc2hvdWxkIGFsd2F5cyBiZSBzdXJlIHRvIHVwZGF0ZSB0aGUgLmdpdG1vZHVsZXMgZmlsZSBhZnRlcgorYWRkaW5nIHN1Ym1vZHVsZXMgdG8gYSBzdXBlciBwcm9qZWN0LgogCi1BbnkgZ2l0IHN1Ym1vZHVsZXMgd2hpY2ggYXJlIGFkZGVkIGFuZCBub3QgaGF2ZSB0aGUgYnJhbmNoIGZpZWxkCi1hdmFpbGFibGUgaW4gdGhlIC5naXRtb2R1bGVzIGZpbGUgd2lsbCBub3QgYmUgc3Vic2NyaWJlZCBieSBHZXJyaXQKLXRvIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBzdXBlcnByb2plY3QuCitJZiBhIGdpdCBzdWJtb2R1bGUgaXMgYWRkZWQgYnV0IHRoZSBicmFuY2ggZmllbGQgaXMgbm90IGFkZGVkIHRvIHRoZQorLmdpdG1vZHVsZXMgZmlsZSwgR2Vycml0IHdpbGwgbm90IGNyZWF0ZSBhIHN1YnNjcmlwdGlvbiBmb3IgdGhlCitzdWJtb2R1bGUgYW5kIHRoZXJlIHdpbGwgYmUgbm8gYXV0b21hdGljIHVwZGF0ZXMgdG8gdGhlIHN1cGVycHJvamVjdC4KIAogRGV0ZWN0aW5nIGFuZCBTdWJzY3JpYmluZyBTdWJtb2R1bGVzCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KQEAgLTExOCwxNyArMTE5LDYyIEBACiBjcmVhdGVzIGEgbmV3IGNvbW1pdCBvbiBicmFuY2ggJ2Rldicgb2YgJ3N1cGVyJyB1cGRhdGluZyB0aGUgZ2l0bGluawogdG8gcG9pbnQgdG8gdGhlIGp1c3QgbWVyZ2VkIGNvbW1pdC4KIAotQ2Fub25pY2FsIFdlYiBVcmwKLX5+fn5+fn5+fn5+fn5+fn5+CitTdWJzY3JpcHRpb24gTGltaXRhdGlvbnMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCi1HZXJyaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBvbmx5IHRoZSBzdXBlcnByb2plY3RzIHRoYXQgYWRkZWQKLXRoZSBzdWJtb2R1bGVzIG9mIHVybHMgb2YgdGhlIHJ1bm5pbmcgc2VydmVyICh0aGUgb25lIGRlc2NyaWJlZCBpbgotdGhlIGNhbm9uaWNhbCB3ZWIgdXJsIHZhbHVlIGluIEdlcnJpdCBjb25maWd1cmF0aW9uIGZpbGUpLgorR2Vycml0IHdpbGwgb25seSBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBzdXBlcnByb2plY3RzIHdoZXJlIHRoZQorc3VibW9kdWxlcyBhcmUgaG9zdGVkIG9uIHRoZSBzYW1lIEdlcnJpdCBpbnN0YW5jZSBhcyB0aGUKK3N1cGVycHJvamVjdC4gR2Vycml0IGRldGVybWluZXMgdGhpcyBieSBjaGVja2luZyB0aGUgaG9zdG5hbWUgb2YgdGhlCitzdWJtb2R1bGUgc3BlY2lmaWVkIGluIHRoZSAuZ2l0bW9kdWxlcyBmaWxlIGFuZCBjb21wYXJpbmcgaXQgdG8gdGhlCitob3N0bmFtZSBmcm9tIHRoZSBjYW5vbmljYWwgd2ViIFVSTC4KKworSXQgaXMgY3VycmVudGx5IG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIHN1Ym1vZHVsZSBzdWJzY3JpcHRpb24gZmVhdHVyZQord2l0aCBhIGNhbm9uaWNhbCB3ZWIgVVJMIGhvc3RuYW1lIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBob3N0bmFtZSBvZgordGhlIHN1Ym1vZHVsZS4gSW5zdGVhZCByZWxhdGl2ZSBzdWJtb2R1bGVzIHNob3VsZCBiZSB1c2VkLgogCiBUaGUgR2Vycml0IGluc3RhbmNlIGFkbWluaXN0cmF0b3IgZ3JvdXAgc2hvdWxkIGFsd2F5cyBjZXJ0aWZ5IHRvCi1wcm92aWRlIHRoZSBjYW5vbmljYWwgd2ViIHVybCB2YWx1ZSBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlLiBVc2Vycwotc2hvdWxkIGNlcnRpZnkgdG8gdXNlIHRoZSB1cmwgdmFsdWUgb2YgdGhlIHJ1bm5pbmcgR2Vycml0IGluc3RhbmNlIHRvCi1hZGQvc3Vic2NyaWJlIHN1Ym1vZHVsZXMuCitwcm92aWRlIHRoZSBjYW5vbmljYWwgd2ViIFVSTCB2YWx1ZSBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlLiBVc2Vycworc2hvdWxkIGNlcnRpZnkgdG8gdXNlIHRoZSBjb3JyZWN0IGhvc3RuYW1lIG9mIHRoZSBydW5uaW5nIEdlcnJpdAoraW5zdGFuY2UgdG8gYWRkL3N1YnNjcmliZSBzdWJtb2R1bGVzLgorCitSZWxhdGl2ZSBzdWJtb2R1bGVzCit+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RvIGVuYWJsZSBlYXNpZXIgdXNhZ2Ugb2YgR2Vycml0IG1pcnJvcnMgYW5kL29yIGRpc3RyaWJ1dGlvbiBvdmVyCitzZXZlcmFsIHByb3RvY29scywgc3VjaCBhcyBwbGFpbiBnaXQgYW5kIEhUVFAoUykgYXMgd2VsbCBhcyBTU0gsIG9uZQorY2FuIHVzZSByZWxhdGl2ZSBzdWJtb2R1bGVzLiBUaGlzIG1lYW5zIHRoYXQgaW5zdGVhZCBvZiBwcm92aWRpbmcgdGhlCitlbnRpcmUgVVJMIHRvIHRoZSBzdWJtb2R1bGUgYSByZWxhdGl2ZSBwYXRoIGlzIHN0YXRlZCBpbiB0aGUKKy5naXRtb2R1bGVzIGZpbGUuCisKK0dlcnJpdCB3aWxsIHRyeSB0byBtYXRjaCB0aGUgZW50aXJlIHByb2plY3QgbmFtZSBvZiB0aGUgc3VibW9kdWxlCitpbmNsdWRpbmcgZGlyZWN0b3JpZXMuIFRoZXJlZm9yZSBpdCBpcyBpbXBvcnRhbnQgdG8gc3VwcGx5IHRoZSBmdWxsCitwYXRoIG5hbWUgb2YgdGhlIEdlcnJpdCBwcm9qZWN0LCBub3Qgb25seSByZWxhdGl2ZSB0byB0aGUgc3VwZXIKK3JlcG9zaXRvcnkuIFNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKK1dlIGhhdmUgYSBzdXBlciByZXBvc2l0b3J5IHBsYWNlZCB1bmRlciBhIHN1YiBkaXJlY3RvcnkuCisKKyAgcHJvZHVjdC9zdXBlcl9yZXBvc2l0b3J5LmdpdAorCitUbyB0aGlzIHJlcG9zaXRvcnkgd2Ugd2lzaCBhZGQgYSBzdWJtb2R1bGUgImRlZXBlciIgaW50byB0aGUgZGlyZWN0b3J5CitzdHJ1Y3R1cmUuCisKKyAgcHJvZHVjdC9mcmFtZXdvcmsvc3ViY29tcG9uZW50LmdpdAorCitOb3cgd2UgbmVlZCB0byBlZGl0IHRoZSAuZ2l0bW9kdWxlcyB0byBpbmNsdWRlIHRoZSBjb21wbGV0ZSBwYXRoIHRvCit0aGUgR2Vycml0IHByb2plY3QuIE9ic2VydmUgdGhhdCB3ZSBuZWVkIHRvIHVzZSB0d28gIi4uLyIgdG8gaW5jbHVkZQordGhlIGNvbXBsZXRlIEdlcnJpdCBwcm9qZWN0IHBhdGguCisKKyAgcGF0aCA9IHN1YmNvbXBvbmVudC5naXQKKyAgdXJsID0gLi4vLi4vcHJvZHVjdC9mcmFtZXdvcmsvc3ViY29tcG9uZW50LmdpdAorICBicmFuY2ggPSBtYXN0ZXIKKworSW4gY29udHJhc3QgdGhlIGZvbGxvd2luZyB3aWxsIG5vdCBzZXR1cCBwcm9wZXIgc3VibW9kdWxlCitzdWJzY3JpcHRpb24sIGV2ZW4gaWYgdGhlIHN1Ym1vZHVsZSB3aWxsIGJlIHN1Y2Nlc3NmdWxseSBjbG9uZWQgYnkgZ2l0Citmcm9tIEdlcnJpdC4KKworICBwYXRoID0gc3ViY29tcG9uZW50LmdpdAorICB1cmwgPSAuLi9mcmFtZXdvcmsvc3ViY29tcG9uZW50LmdpdAorICBicmFuY2ggPSBtYXN0ZXIKIAogUmVtb3ZpbmcgU3Vic2NyaXB0aW9ucwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2VyLXVwbG9hZC50eHQgYi9Eb2N1bWVudGF0aW9uL3VzZXItdXBsb2FkLnR4dAppbmRleCA2YmRmZjdhLi41NWFiODk1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzZXItdXBsb2FkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzZXItdXBsb2FkLnR4dApAQCAtNyw4ICs3LDMxIEBACiAqIFVzZSBgZ2l0IHB1c2hgLCB0byBjcmVhdGUgY2hhbmdlcyBmb3IgcmV2aWV3CiAqIFVzZSBgZ2l0IHB1c2hgLCBhbmQgYnlwYXNzIGNvZGUgcmV2aWV3CiAKLUFsbCB0aHJlZSBtZXRob2RzIHJlbHkgb24gU1NIIHB1YmxpYyBrZXkgYXV0aGVudGljYXRpb24sIHdoaWNoIG11c3QKLWZpcnN0IGJlIGNvbmZpZ3VyZWQgYnkgdGhlIHVwbG9hZGluZyB1c2VyLgorQWxsIHRocmVlIG1ldGhvZHMgcmVseSBvbiBhdXRoZW50aWNhdGlvbiwgd2hpY2ggbXVzdCBmaXJzdCBiZSBjb25maWd1cmVkCitieSB0aGUgdXBsb2FkaW5nIHVzZXIuCisKK0dlcnJpdCBzdXBwb3J0cyB0d28gbWV0aG9kcyBvZiBhdXRoZW50aWNhdGluZyB0aGUgdXBsb2FkaW5nIHVzZXIuICBTU0gKK3B1YmxpYyBrZXksIGFuZCBIVFRQL0hUVFBTLgorCitbW2h0dHBdXQorSFRUUC9IVFRQUworLS0tLS0tLS0tLQorCitPbiBHZXJyaXQgaW5zdGFsbGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFNTSCBhdXRoZW50aWNhdGlvbiwgdGhlCit1c2VyIG11c3QgYXV0aGVudGljYXRlIHZpYSBIVFRQL0hUVFBTLgorCitXaGVuIGxpbms6Y29uZmlnLWdlcnJpdC5odG1sI2F1dGguZ2l0QmFzaWNBdXRoW2dpdEJhc2ljQXV0aF0gaXMgZW5hYmxlZCwKK3RoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgdXNpbmcgc3RhbmRhcmQgQmFzaWNBdXRoIGFuZCBjcmVkZW50aWFscyB2YWxpZGF0ZWQKK3VzaW5nIHRoZSBzYW1lIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBjb25maWd1cmVkIGZvciB0aGUgR2Vycml0IFdlYiBVSS4KKworV2hlbiBnaXRCYXNpY0F1dGggaXMgbm90IGNvbmZpZ3VyZWQsIHRoZSB1c2VyJ3MgSFRUUCBjcmVkZW50aWFscyBjYW4gYmUKK2FjY2Vzc2VkIHdpdGhpbiBHZXJyaXQgYnkgZ29pbmcgdG8gYFNldHRpbmdzYCwgYW5kIHRoZW4gYWNjZXNzaW5nIHRoZSBgSFRUUAorUGFzc3dvcmRgIHRhYi4KKworRm9yIEdlcnJpdCBpbnN0YWxsYXRpb25zIHdoZXJlIGFuIGxpbms6Y29uZmlnLWdlcnJpdC5odG1sI2F1dGguaHR0cFBhc3N3b3JkVXJsW0hUVFAgcGFzc3dvcmQgVVJMXQoraXMgY29uZmlndXJlZCwgdGhlIHBhc3N3b3JkIGNhbiBiZSBvYnRhaW5lZCBieSBjbGlja2luZyBvbiBgT2J0YWluIFBhc3N3b3JkYAorYW5kIHRoZW4gZm9sbG93aW5nIHRoZSBzaXRlLXNwZWNpZmljIGluc3RydWN0aW9ucy4gIE9uIHNpdGVzIHdoZXJlIHRoaXMgVVJMIGlzCitub3QgY29uZmlndXJlZCwgdGhlIHBhc3N3b3JkIGNhbiBiZSBvYnRhaW5lZCBieSBjbGlja2luZyBvbiBgR2VuZXJhdGUgUGFzc3dvcmRgLgogCiBTU0gKIC0tLQpAQCAtMTA4LDcgKzEzMSw3IEBACiBtYWdpY2FsIGByZWZzL2Zvci8nYnJhbmNoJ2AgcmVmIHVzaW5nIGFueSBHaXQgY2xpZW50IHRvb2w6CiAKID09PT0KLSAgZ2l0IHB1c2ggc3NoOi8vc3NodXNlcm5hbWVAaG9zdG5hbWU6Mjk0MTgvcHJvamVjdG5hbWUgSEVBRDpyZWZzL2Zvci9icmFuY2huYW1lCisgIGdpdCBwdXNoIHNzaDovL3NzaHVzZXJuYW1lQGhvc3RuYW1lOjI5NDE4L3Byb2plY3RuYW1lIEhFQUQ6cmVmcy9mb3IvYnJhbmNoCiA9PT09CiAKIEUuZy4gYGpvaG4uZG9lYCBjYW4gdXNlIGdpdCBwdXNoIHRvIHVwbG9hZCBuZXcgY2hhbmdlcyBmb3IgdGhlCkBAIC0xMzAsMTIgKzE1MywxMiBAQAogCiBUbyBpbmNsdWRlIGEgc2hvcnQgdGFnIGFzc29jaWF0ZWQgd2l0aCBhbGwgb2YgdGhlIGNoYW5nZXMgaW4gdGhlCiBzYW1lIGdyb3VwLCBzdWNoIGFzIHRoZSBsb2NhbCB0b3BpYyBicmFuY2ggbmFtZSwgYXBwZW5kIGl0IGFmdGVyCi10aGUgZGVzdGluYXRpb24gYnJhbmNoIG5hbWUuICBJbiB0aGlzIGV4YW1wbGUgdGhlIHNob3J0IHRvcGljIHRhZwordGhlIGRlc3RpbmF0aW9uIGJyYW5jaCBuYW1lLiBJbiB0aGlzIGV4YW1wbGUgdGhlIHNob3J0IHRvcGljIHRhZwogJ2RyaXZlci9pNDInIHdpbGwgYmUgc2F2ZWQgb24gZWFjaCBjaGFuZ2UgdGhpcyBwdXNoIGNyZWF0ZXMgb3IKIHVwZGF0ZXM6CiAKID09PT0KLSAgZ2l0IHB1c2ggc3NoOi8vam9obi5kb2VAZ2l0LmV4YW1wbGUuY29tOjI5NDE4L2tlcm5lbC9jb21tb24gSEVBRDpyZWZzL2Zvci9leHBlcmltZW50YWwvZHJpdmVyL2k0MgorICBnaXQgcHVzaCBzc2g6Ly9qb2huLmRvZUBnaXQuZXhhbXBsZS5jb206Mjk0MTgva2VybmVsL2NvbW1vbiBIRUFEOnJlZnMvZm9yL2V4cGVyaW1lbnRhbCV0b3BpYz1kcml2ZXIvaTQyCiA9PT09CiAKIElmIHlvdSBhcmUgZnJlcXVlbnRseSB1cGxvYWRpbmcgY2hhbmdlcyB0byB0aGUgc2FtZSBHZXJyaXQgc2VydmVyLApAQCAtMTU2LDE3ICsxNzksMTcgQEAKIAogU3BlY2lmaWMgcmV2aWV3ZXJzIGNhbiBiZSByZXF1ZXN0ZWQgYW5kL29yIGFkZGl0aW9uYWwgJ2NhcmJvbgogY29waWVzJyBvZiB0aGUgbm90aWZpY2F0aW9uIG1lc3NhZ2UgbWF5IGJlIHNlbnQgYnkgaW5jbHVkaW5nIHRoZXNlCi1hcyBhcmd1bWVudHMgdG8gYGdpdCByZWNlaXZlLXBhY2tgOgorYXMgb3B0aW9ucyBpbiB0aGUgcmVmZXJlbmNlCiAKID09PT0KLSAgZ2l0IHB1c2ggLS1yZWNlaXZlLXBhY2s9J2dpdCByZWNlaXZlLXBhY2sgLS1yZXZpZXdlcj1hQGEuY29tIC0tY2M9YkBvLmNvbScgdHI6a2VybmVsL2NvbW1vbiBIRUFEOnJlZnMvZm9yL2V4cGVyaW1lbnRhbAorICBnaXQgcHVzaCB0cjprZXJuZWwvY29tbW9uIEhFQUQ6cmVmcy9mb3IvZXhwZXJpbWVudGFsJXI9YUBhLmNvbSxjYz1iQG8uY29tCiA9PT09CiAKLVRoZSBgLS1yZXZpZXdlcj0nZW1haWwnYCBhbmQgYC0tY2M9J2VtYWlsJ2Agb3B0aW9ucyBtYXkgYmUKLXNwZWNpZmllZCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeSB0byBjb3ZlciBhbGwgaW50ZXJlc3RlZAotcGFydGllcy4gIEdlcnJpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYXZvaWQgc2VuZGluZyBkdXBsaWNhdGUgZW1haWwKLW5vdGlmaWNhdGlvbnMsIHN1Y2ggYXMgaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgcmV2aWV3ZXJzIG9yIENDCi1hZGRyZXNzZXMgaGFkIGFsc28gcmVxdWVzdGVkIHRvIHJlY2VpdmUgYWxsIG5ldyBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4KK1RoZSBgcj0nZW1haWwnYCBhbmQgYGNjPSdlbWFpbCdgIG9wdGlvbnMgbWF5IGJlIHNwZWNpZmllZCBhcyBtYW55Cit0aW1lcyBhcyBuZWNlc3NhcnkgdG8gY292ZXIgYWxsIGludGVyZXN0ZWQgcGFydGllcy4gR2Vycml0IHdpbGwKK2F1dG9tYXRpY2FsbHkgYXZvaWQgc2VuZGluZyBkdXBsaWNhdGUgZW1haWwgbm90aWZpY2F0aW9ucywgc3VjaCBhcworaWYgb25lIG9mIHRoZSBzcGVjaWZpZWQgcmV2aWV3ZXJzIG9yIENDIGFkZHJlc3NlcyBoYWQgYWxzbyByZXF1ZXN0ZWQKK3RvIHJlY2VpdmUgYWxsIG5ldyBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4KIAogSWYgeW91IGFyZSBmcmVxdWVudGx5IHNlbmRpbmcgY2hhbmdlcyB0byB0aGUgc2FtZSBwYXJ0aWVzIGFuZC9vcgogYnJhbmNoZXMsIGNvbnNpZGVyIGFkZGluZyBhIGN1c3RvbSByZW1vdGUgYmxvY2sgdG8geW91ciBwcm9qZWN0J3MKQEAgLTE3NSwxMiArMTk4LDExIEBACiA9PT09CiAgICQgY2F0IC5naXQvY29uZmlnCiAgIC4uLgotICBbcmVtb3RlICJmb3ItYS1leHAiXQorICBbcmVtb3RlICJleHAiXQogICAgIHVybCA9IHRyOmtlcm5lbC9jb21tb24KLSAgICByZWNlaXZlcGFjayA9IGdpdCByZWNlaXZlLXBhY2sgLS1yZXZpZXdlcj1hQGEuY29tIC0tY2M9YkBvLmNvbQotICAgIHB1c2ggPSBIRUFEOnJlZnMvZm9yL2V4cGVyaW1lbnRhbAorICAgIHB1c2ggPSBIRUFEOnJlZnMvZm9yL2V4cGVyaW1lbnRhbCVyPWFAYS5jb20sY2M9YkBvLmNvbQogCi0gICQgZ2l0IHB1c2ggZm9yLWEtZXhwCisgICQgZ2l0IHB1c2ggZXhwCiA9PT09CiAKIApkaWZmIC0tZ2l0IGEvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjAuMjEudHh0IGIvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjAuMjEudHh0CmluZGV4IDdkZDllZjQuLjQ3YmE2NTQgMTAwNjQ0Ci0tLSBhL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi4wLjIxLnR4dAorKysgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuMC4yMS50eHQKQEAgLTIwMSw3ICsyMDEsNyBAQAogR2Vycml0IG5vIGxvbmdlciBmb3JnZXMgdGhlIEZyb20gaGVhZGVyIGluIG5vdGlmaWNhdGlvbiBlbWFpbHMuCiBUbyBlbmFibGUgdGhlIHByaW9yIGZvcmdpbmcgYmVoYXZpb3IsIHNldCBgc2VuZGVtYWlsLmZyb21gCiB0byBgVVNFUmAgaW4gZ2Vycml0LmNvbmZpZy4gIEZvciBtb3JlIGRldGFpbHMgc2VlCi1baHR0cDovL2dlcnJpdC5nb29nbGVjb2RlLmNvbS9zdm4vZG9jdW1lbnRhdGlvbi8yLjAvY29uZmlnLWdlcnJpdC5odG1sI3NlbmRlbWFpbC5mcm9tIHNlbmRlbWFpbC5mcm9tXQorbGluazpodHRwOi8vZ2Vycml0Lmdvb2dsZWNvZGUuY29tL3N2bi9kb2N1bWVudGF0aW9uLzIuMC9jb25maWctZ2Vycml0Lmh0bWwjc2VuZGVtYWlsLmZyb21bc2VuZGVtYWlsLmZyb21dCiAKIEJ1ZyBGaXhlcwogLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuMC4yNC50eHQgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuMC4yNC50eHQKaW5kZXggOTQ4MWEzYS4uN2UwYTYxNyAxMDA2NDQKLS0tIGEvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjAuMjQudHh0CisrKyBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi4wLjI0LnR4dApAQCAtNjcsNyArNjcsNyBAQAogKiBpc3N1ZSAzMDAgICAgU3VwcG9ydCBTTVRQIG92ZXIgU1NML1RMUwogKwogRW5jcnlwdGVkIFNNVFAgaXMgbm93IHN1cHBvcnRlZCBuYXRpdmVseSB3aXRoaW4gR2Vycml0LCBzZWUKLVtodHRwOi8vZ2Vycml0Lmdvb2dsZWNvZGUuY29tL3N2bi9kb2N1bWVudGF0aW9uLzIuMC9jb25maWctZ2Vycml0Lmh0bWwjc2VuZGVtYWlsLnNtdHBFbmNyeXB0aW9uIHNlbmRlbWFpbC5zbXRwRW5jcnlwdGlvbl0KK2xpbms6aHR0cDovL2dlcnJpdC5nb29nbGVjb2RlLmNvbS9zdm4vZG9jdW1lbnRhdGlvbi8yLjAvY29uZmlnLWdlcnJpdC5odG1sI3NlbmRlbWFpbC5zbXRwRW5jcnlwdGlvbltzZW5kZW1haWwuc210cEVuY3J5cHRpb25dCiAKIEJ1ZyBGaXhlcwogLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS4xLnR4dCBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LjEudHh0CmluZGV4IGJhNGUyMDQuLjZmYzBkYzUgMTAwNjQ0Ci0tLSBhL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LjEudHh0CisrKyBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LjEudHh0CkBAIC0zOCw5ICszOCwxMCBAQAogYWRtaW5pc3RyYXRvcnMuCiArCiBJbiBhZGRpdGlvbiBpdCBpcyBub3cgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvCi0tIHNldCBhIG5vbi1leGlzdGluZyBwcm9qZWN0IGFzIHBhcmVudCAoYXMgdGhpcyB3b3VsZCBtYWtlIHRoZSBwcm9qZWN0CisrCisqKiBzZXQgYSBub24tZXhpc3RpbmcgcHJvamVjdCBhcyBwYXJlbnQgKGFzIHRoaXMgd291bGQgbWFrZSB0aGUgcHJvamVjdAogICBiZSBvcnBoYW5lZCkKLS0gc2V0IGEgcGFyZW50IHByb2plY3QgZm9yIHRoZSBgQWxsLVByb2plY3RzYCByb290IHByb2plY3QgKHRoZSByb290CisqKiBzZXQgYSBwYXJlbnQgcHJvamVjdCBmb3IgdGhlIGBBbGwtUHJvamVjdHNgIHJvb3QgcHJvamVjdCAodGhlIHJvb3QKICAgcHJvamVjdCBieSBkZWZpbml0aW9uIGhhcyBubyBwYXJlbnQpCiBieSBwdXNoaW5nIGNoYW5nZXMgb2YgdGhlIGBwcm9qZWN0LmNvbmZpZ2AgZmlsZSB0byBgcmVmcy9tZXRhL2NvbmZpZ2AuCiAKZGlmZiAtLWdpdCBhL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LjIudHh0IGIvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjUuMi50eHQKaW5kZXggY2ViMjNjMi4uMDhiNGY4NiAxMDA2NDQKLS0tIGEvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjUuMi50eHQKKysrIGIvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjUuMi50eHQKQEAgLTcsNyArNyw3IEBACiAKIFRoZXJlIGFyZSBubyBzY2hlbWEgY2hhbmdlcyBmcm9tIDIuNSwgb3IgMi41LjEuCiAKLUhvd2V2ZXIsIGlmIHVwZ3JhZGluZyBmcm9tIGEgdmVyc2lvbiBvbGRlciB0aGFuIDIuNSwgZm9sbG93IHRoZSB1cGdyYWRlCitIb3dldmVyLCBpZiB1cGdyYWRpbmcgZnJvbSBhbnkgZWFybGllciB2ZXJzaW9uLCBmb2xsb3cgdGhlIHVwZ3JhZGUKIHByb2NlZHVyZSBpbiB0aGUgMi41IGxpbms6UmVsZWFzZU5vdGVzLTIuNS5odG1sW1JlbGVhc2UgTm90ZXNdLgogCiBCdWcgRml4ZXMKZGlmZiAtLWdpdCBhL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LnR4dCBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi41LnR4dAppbmRleCA1NWZiYjYwLi4wMjNiNGJmIDEwMDY0NAotLS0gYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNS50eHQKKysrIGIvUmVsZWFzZU5vdGVzL1JlbGVhc2VOb3Rlcy0yLjUudHh0CkBAIC0yNzAsMTEgKzI3MCwxMSBAQAogKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjUvcmVzdC1hcGkuaHRtbFtEb2N1bWVudGF0aW9uIG9mIHRoZSBSRVNUIEFQSV0KIAogKiBTdXBwb3J0IFJFU1QgZW5kcG9pbnRzIHRvCi0qKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjUvcmVzdC1hcGkuaHRtbCNjaGFuZ2VzW3F1ZXJ5IGNoYW5nZXNdCi0qKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjUvcmVzdC1hcGkuaHRtbCNwcm9qZWN0c1tsaXN0IHByb2plY3RzXQotKiogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLmh0bWwjc3VnZ2VzdC1wcm9qZWN0c1tzdWdnZXN0CisqKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjUvcmVzdC1hcGktY2hhbmdlcy5odG1sW3F1ZXJ5IGNoYW5nZXNdCisqKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjUvcmVzdC1hcGktcHJvamVjdHMuaHRtbFtsaXN0IHByb2plY3RzXQorKiogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLXByb2plY3RzLmh0bWwjc3VnZ2VzdC1wcm9qZWN0c1tzdWdnZXN0CiAgICBwcm9qZWN0c10KLSoqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS9yZXN0LWFwaS5odG1sI2FjY291bnRzX3NlbGZfY2FwYWJpbGl0aWVzW3F1ZXJ5CisqKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjUvcmVzdC1hcGktYWNjb3VudHMuaHRtbCNsaXN0LWFjY291bnQtY2FwYWJpbGl0aWVzW3F1ZXJ5CiAgICB0aGUgZ2xvYmFsIGNhcGFiaWxpdGllcyBvZiB0aGUgY2FsbGluZyB1c2VyXQogCiAqIFN1cHBvcnQgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLmh0bWwjYXV0aGVudGljYXRpb25bYW5vbnltb3VzCkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogKiBBdm9pZCBzZWNvbmQgcmVtb3RlIGNhbGwgdG8gbG9va3VwIGFwcHJvdmFscyB3aGVuIGxvYWRpbmcgY2hhbmdlCiAgIHJlc3VsdHMKICsKLUJ5IHVzaW5nIHRoZSBuZXcgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLmh0bWwjY2hhbmdlc1tgL2NoYW5nZXMvYF0KK0J5IHVzaW5nIHRoZSBuZXcgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3Jlc3QtYXBpLWNoYW5nZXMuaHRtbFtgL2NoYW5nZXMvYF0KIFJFU1QgZW5kcG9pbnQgdGhlIHdlYiBVSSBjbGllbnQgbm93IG9idGFpbnMgdGhlIGxhYmVsIGluZm9ybWF0aW9uCiBkdXJpbmcgdGhlIHF1ZXJ5IGFuZCBhdm9pZHMgYSBzZWNvbmQgcm91bmQgdHJpcCB0byBsb29rdXAgdGhlIGN1cnJlbnQKIGFwcHJvdmFscyBmb3IgZWFjaCBkaXNwbGF5ZWQgY2hhbmdlLiBGb3IgbW9zdCB1c2VycyB0aGlzIHNob3VsZCBpbXByb3ZlCmRpZmYgLS1naXQgYS9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNi50eHQgYi9SZWxlYXNlTm90ZXMvUmVsZWFzZU5vdGVzLTIuNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyMTE4MgotLS0gL2Rldi9udWxsCisrKyBiL1JlbGVhc2VOb3Rlcy9SZWxlYXNlTm90ZXMtMi42LnR4dApAQCAtMCwwICsxLDE3ODAgQEAKK1JlbGVhc2Ugbm90ZXMgZm9yIEdlcnJpdCAyLjYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworR2Vycml0IDIuNiBpcyBub3cgYXZhaWxhYmxlOgorCitsaW5rOmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvZG93bmxvYWRzL2RldGFpbD9uYW1lPWdlcnJpdC0yLjYud2FyW2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvZG93bmxvYWRzL2RldGFpbD9uYW1lPWdlcnJpdC0yLjYud2FyXQorCitHZXJyaXQgMi42IGluY2x1ZGVzIHRoZSBidWcgZml4ZXMgZG9uZSB3aXRoCitsaW5rOlJlbGVhc2VOb3Rlcy0yLjUuMS5odG1sW0dlcnJpdCAyLjUuMV0sCitsaW5rOlJlbGVhc2VOb3Rlcy0yLjUuMi5odG1sW0dlcnJpdCAyLjUuMl0sCitsaW5rOlJlbGVhc2VOb3Rlcy0yLjUuMy5odG1sW0dlcnJpdCAyLjUuM10sIGFuZAorbGluazpSZWxlYXNlTm90ZXMtMi41LjQuaHRtbFtHZXJyaXQgMi41LjRdLiBUaGVzZSBidWcgZml4ZXMgYXJlICpub3QqCitsaXN0ZWQgaW4gdGhlc2UgcmVsZWFzZSBub3Rlcy4KKworU2NoZW1hIENoYW5nZQorLS0tLS0tLS0tLS0tLQorKldBUk5JTkc6KiBUaGlzIHJlbGVhc2UgY29udGFpbnMgc2NoZW1hIGNoYW5nZXMuICBUbyB1cGdyYWRlOgorLS0tLQorICBqYXZhIC1qYXIgZ2Vycml0LndhciBpbml0IC1kIHNpdGVfcGF0aAorLS0tLQorCisqV0FSTklORzoqIFVwZ3JhZGluZyB0byAyLjYueCByZXF1aXJlcyB0aGUgc2VydmVyIGJlIGZpcnN0IHVwZ3JhZGVkIHRvIDIuMS43IChvcgorYSBsYXRlciAyLjEueCB2ZXJzaW9uKSwgYW5kIHRoZW4gdG8gMi42LnguICBJZiB5b3UgYXJlIHVwZ3JhZGluZyBmcm9tIDIuMi54Lnggb3IKK25ld2VyLCB5b3UgbWF5IGlnbm9yZSB0aGlzIHdhcm5pbmcgYW5kIHVwZ3JhZGUgZGlyZWN0bHkgdG8gMi42LnguCisKK1JldmVyc2UgUHJveHkgQ29uZmlndXJhdGlvbiBDaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgYXJlIHJ1bm5pbmcgYSByZXZlcnNlIHByb3h5IGluIGZyb250IG9mIEdlcnJpdCAoZS5nLiBBcGFjaGUgb3IgTmdpbngpLAorbWFrZSBzdXJlIHRvIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiwgZXNwZWNpYWxseSBpZiB5b3UgYXJlIGVuY291bnRlcmluZworJ1BhZ2UgTm90IEZvdW5kJyBlcnJvcnMgd2hlbiBvcGVuaW5nIHRoZSBjaGFuZ2Ugc2NyZWVuLgorU2VlIHRoZSBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLXJldmVyc2Vwcm94eS5odG1sWworUmV2ZXJzZSBQcm94eSBDb25maWd1cmF0aW9uXSBmb3IgZGV0YWlscy4KKworR2Vycml0IG5vdyByZXF1aXJlcyBwYXNzZWQgVVJMcyB0byBiZSB1bmNoYW5nZWQgYnkgdGhlIHByb3h5LgorCitSZWxlYXNlIEhpZ2hsaWdodHMKKy0tLS0tLS0tLS0tLS0tLS0tLQorKiA0MnggaW1wcm92ZW1lbnQgb24gYGdpdCBjbG9uZWAgYW5kIGBnaXQgZmV0Y2hgCisrCitSdW5uaW5nIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jbWQtZ2MuaHRtbFsKK2dlcnJpdCBnY10gYWxsb3dzIEpHaXQgdG8gb3B0aW1pemUgYSByZXBvc2l0b3J5IHRvIHNlcnZlIGNsb25lIGFuZCBmZXRjaAorZmFzdGVyIHRoYW4gQyBHaXQgY2FuLCB3aXRoIG1hc3NpdmVseSBsb3dlciBzZXJ2ZXIgQ1BVIHJlcXVpcmVkLiBUeXBpY2FsbHkKK0dlcnJpdCAyLjYgY2FuIGNvbXBsZXRlbHkgdHJhbnNmZXIgYSBwcm9qZWN0IHRvIGEgY2xpZW50IGZhc3RlciB0aGFuIEMgR2l0CitjYW4gZmluaXNoICJDb3VudGluZyIgdGhlIG9iamVjdHMuCisKKyogQ29tcGxldGVseSBjdXN0b21pemFibGUgd29ya2Zsb3cKKysKK0luZGl2aWR1YWwgcHJvamVjdHMgY2FuIGFkZCAob3IgcmVtb3ZlKSBzY29yZSBjYXRlZ29yaWVzIHRocm91Z2gKK2xpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctbGFiZWxzLmh0bWxbCitsYWJlbHNdIGFuZCBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcHJvbG9nLWNvb2tib29rLmh0bWxbCitQcm9sb2cgcnVsZXNdLgorCitOZXcgRmVhdHVyZXMKKy0tLS0tLS0tLS0tLQorCitXZWIgVUkKK35+fn5+fgorCitHbG9iYWwKK15eXl5eXgorCisqIE5ldyBMb2dpbiBTY3JlZW5zCisrCitOZXcgZm9ybSBiYXNlZCBIVE1MIHNjcmVlbnMgZm9yIGxvZ2luIGFsbG93IGJyb3dzZXJzIHRvIG9mZmVyIHRoZQorY2hvaWNlIHRvIHNhdmUgdGhlIGxvZ2luIGRhdGEgbG9jYWxseSBpbiB0aGUgdXNlcidzIHBhc3N3b3JkIHN0b3JlLgorCisqIFJlbmFtZSAiR3JvdXBzIiB0b3AtbGV2ZWwgbWVudSB0byAiUGVvcGxlIgorCisqIE1vdmUgIkRyYWZ0IENvbW1lbnRzIiBsaW5rIG5leHQgdG8gIkRyYWZ0cyIgbGluaworCisqIEhpZ2hsaWdodCB0aGUgYWN0aXZlIG1lbnUgaXRlbQorCisqIE1vdmUgdXNlciBpbmZvLCBzZXR0aW5ncywgYW5kIGxvZ291dCB0byBwb3B1cCBkaWFsb2cKKworKiBTaG93IGEgc21hbGwgdmVyc2lvbiBvZiB0aGUgYXZhdGFyIGltYWdlIG5leHQgdG8gdGhlIHVzZXIncyBuYW1lLgorCisqIFNob3cgYXZhdGFyIGltYWdlIGluIHVzZXIgaW5mbyBwb3B1cCBkaWFsb2cKKworKiBBbHdheXMgc2hvdyAnV29ya2luZyAuLi4nIG1lc3NhZ2UKKysKK1RoZSAnV29ya2luZyAuLi4nIG1lc3NhZ2UgaXMgcmVsYXRpdmVseSBwb3NpdGlvbmVkIGZyb20gdGhlIHRvcCBvZgordGhlIGJyb3dzZXIsIHNvIHRoYXQgdGhlIG1lc3NhZ2UgaXMgYWx3YXlzIHZpc2libGUsIGV2ZW4gaWYgdGhlIHVzZXIKK2hhcyBzY3JvbGxlZCBkb3duIHRoZSBwYWdlLgorCisqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctZ2Vycml0Lmh0bWwjc3VnZ2VzdC5mcm9tWworICBzdWdnZXN0LmZyb21dIGNvbmZpZ3VyZXMgYSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJlZm9yZQorICBtYXRjaGVzIGZvciByZXZpZXdlcnMsIGFjY291bnRzLCBncm91cHMgb3IgcHJvamVjdHMgYXJlIG9mZmVyZWQuCisKKyogTWFrZSB0aGUgZGVmYXVsdCBmb250IHNpemUgInNtYWxsIi4KKworKiBNYXJrIGFsbCBDU1MgY2xhc3NlcyBhcyBleHRlcm5hbCBzbyB1c2VycyBjYW4gcmVseSBvbiB0aGVtLgorCisqIEFkZCBhIGxpbmsgdG8gdGhlIFJFU1QgQVBJIGRvY3VtZW50YXRpb24gaW4gdGhlIHRvcCBtZW51LgorCitTZWFyY2gKK15eXl5eXgorKiBTdWdnZXN0IHByb2plY3RzLCBncm91cHMgYW5kIHVzZXJzIGluIHNlYXJjaCBwYW5lbAorKworU3VnZ2VzdCBwcm9qZWN0cywgZ3JvdXBzIGFuZCB1c2VycyBpbiB0aGUgc2VhcmNoIHBhbmVsIGFzIHBhcmFtZXRlciBmb3IKK3Rob3NlIHNlYXJjaCBvcGVyYXRvcnMgdGhhdCBleHBlY3QgYSBwcm9qZWN0LCBncm91cCBvciB1c2VyLgorCisqIEluIHNlYXJjaCBwYW5lbCBzdWdnZXN0ICdzZWxmJyBhcyB2YWx1ZSBmb3Igb3BlcmF0b3JzIHRoYXQgZXhwZWN0IGEgdXNlcgorCisqIFF1b3RlIHZhbHVlcyBzdWdnZXN0ZWQgZm9yIHNlYXJjaCBvcGVyYXRvcnMgb25seSBpZiBuZWVkZWQKKysKK1RoZSB2YWx1ZXMgdGhhdCBhcmUgc3VnZ2VzdGVkIGZvciB0aGUgc2VhcmNoIG9wZXJhdG9ycyBpbiB0aGUgc2VhcmNoCitwYW5lbCBhcmUgbm93IG9ubHkgcXVvdGVkIGlmIHRoZXkgY29udGFpbiBhIHdoaXRlc3BhY2UuCisKK0NoYW5nZSBTY3JlZW5zCiteXl5eXl5eXl5eXl5eXgorCisqIEEgY2hhbmdlJ3MgY29tbWl0IG1lc3NhZ2UgY2FuIGJlIGVkaXRlZCBmcm9tIHRoZSBjaGFuZ2Ugc2NyZWVuLgorCisqIEEgY2hhbmdlJ3MgdG9waWMgY2FuIGJlIGFkZGVkLCByZW1vdmVkIG9yIGNoYW5nZWQgZnJvbSB0aGUKKyAgY2hhbmdlIHNjcmVlbi4KKworKiBBbiAiQWRkIENvbW1lbnQiIGJ1dHRvbiBpcyBhZGRlZCB0byBjaGFuZ2Ugc2NyZWVuCisKKyogVGhlIHJldmlld2VyIG1hdHJpeCBvbiBhIGNoYW5nZSBkaXNwbGF5cyBncmF5IGJveGVzIHdoZXJlIHBlcm1pc3Npb25zCisgIGRvIG5vdCBhbGxvdyB2b3RpbmcgaW4gdGhhdCBjYXRlZ29yeS4KKysKK1RoZSBjb2xvcmluZyBlbmFibGVzIGF1dGhvcnMgdG8gcXVpY2tseSBpZGVudGlmeSBpZiBhbm90aGVyIHJldmlld2VyCitpcyBuZWNlc3NhcnkgdG8gY29udGludWUgdGhlIGNoYW5nZS4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MzUzW0lzc3VlIDM1M10gJgorICBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTEyM1tJc3N1ZSAxMTIzXToKKyAgTmV3IGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9wcm9qZWN0LXNldHVwLmh0bWwjcmViYXNlX2lmX25lY2Vzc2FyeVsKKyAgUmViYXNlIElmIE5lY2Vzc2FyeV0gc3VibWl0IHR5cGUKKysKK1RoaXMgaXMgc2ltaWxhciB0byBjaGVycnkgcGljaywgYnV0IGhvbm9ycyBjaGFuZ2UgZGVwZW5kZW5jeQoraW5mb3JtYXRpb24uCisKKyogVGhlIHJlYmFzZSBidXR0b24gaXMgaGlkZGVuIHdoZW4gdGhlIHBhdGNoIHNldCBpcyBjdXJyZW50LgorCisqIEltcHJvdmVkIHJldmlldyBtZXNzYWdlIHdoZW4gYSBjaGFuZ2UgaXMgcmViYXNlZCBpbiB0aGUgVUkKKysKK1doZW4gYSBjaGFuZ2UgaXMgcmViYXNlZCBpbiB0aGUgVUkgYnkgcHJlc3NpbmcgdGhlIHJlYmFzZSBidXR0b24sIGEKK2NvbW1lbnQgaXMgYWRkZWQgb250byB0aGUgcmV2aWV3LiBJbnN0ZWFkIG9mIG9ubHkgc2F5aW5nICdSZWJhc2VkJyB0aGUKK21lc3NhZ2UgaXMgbm93IG1vcmUgdmVyYm9zZSwgZS5nLiAnUGF0Y2ggU2V0IDEgd2FzIHJlYmFzZWQnLgorCisqIFRoZSBzdWJtaXQgdHlwZSB0aGF0IGlzIHVzZWQgZm9yIHN1Ym1pdHRpbmcgYSBjaGFuZ2UgaXMgc2hvd24gb24gdGhlCisgIGNoYW5nZSBzY3JlZW4gaW4gdGhlIGluZm8gYmxvY2suCisrCitUaGlzIGlzIHVzZWZ1bCBiZWNhdXNlIHRoZSBzdWJtaXQgdHlwZSBvZiBhIGNoYW5nZSBjYW4gbm93IGJlCitsaW5rOiNzdWJtaXQtdHlwZS1mcm9tLXByb2xvZ1tjb250cm9sbGVkIGJ5IFByb2xvZ10uCisKKyogUmVwbGFjZSB0aGUgQWxsIERpZmYgYnV0dG9ucyBvbiB0aGUgY2hhbmdlIHNjcmVlbiB3aXRoIGxpbmtzCisrCitUaGUgYWN0aW9uIGJ1dHRvbnMgdG8gb3BlbiB0aGUgZGlmZiBmb3IgYWxsIGZpbGVzIGluIG93biB0YWJzIGNvbnN1bWVkCit0b28gbXVjaCBzcGFjZSBkdWUgdG8gdGhlIGxvbmcgbGFiZWwgdGV4dHMuCisKKyogVGhlIHBhdGNoIHNldCByZXZpZXcgc2NyZWVuIGNhbiBpbmNsdWRlIHJhZGlvIGJ1dHRvbnMgZm9yIGN1c3RvbQorICBsYWJlbHMgaWYgZW5hYmxlZCBieQorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcHJvbG9nLWNvb2tib29rLmh0bWwjX2hvd190b193cml0ZV9zdWJtaXRfcnVsZXNbc3VibWl0IHJ1bGVzXS4KKworKiBWb3Rpbmcgb24gZHJhZnQgY2hhbmdlcyBpcyBub3cgcG9zc2libGUuCisKKyogUmVjb21tZW5kIHJlYmFzZSBvbiBQYXRoIENvbmZsaWN0LgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjg1W0lzc3VlIDE2ODVdOgorICBBZnRlciAnVXAgdG8gY2hhbmdlJyBleHBhbmQgdGhlIHBhdGNoIHNldCB0aGF0IHdhcyBqdXN0IHJldmlld2VkCisrCitBZnRlciBjbGlja2luZyBvbiB0aGUgJ1VwIHRvIGNoYW5nZScgbGluayBvbiBhIHBhdGNoIHNjcmVlbiwgdGhlIHBhdGNoCitzZXQgdGhhdCB3YXMganVzdCByZXZpZXdlZCBpcyBhdXRvbWF0aWNhbGx5IGV4cGFuZGVkIG9uIHRoZSBjaGFuZ2UKK3NjcmVlbi4KKworKiBBbGxvdyBkaXJlY3QgY2hhbmdlIFVSTHMgdG8gZW5kIHdpdGggJy8nLgorCisqIFNsaWdodGx5IGluY3JlYXNlIGNvbW1pdCBtZXNzYWdlIHRleHQgc2l6ZSBmcm9tIDhweCB0byA5cHguCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTEzODFbSXNzdWUgMTM4MV06CisgIFJlbW92ZSB0aGUgSUQgY29sdW1uIGZyb20gY2hhbmdlIHRhYmxlcworKworVXNlcnMgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlIElEIGNvbHVtbiBwcmVzZW50LiBGb3IgbW9zdCBjaGFuZ2VzIHRoZQorc3ViamVjdCBpcyBkZXNjcmlwdGl2ZSBhbmQgdW5pcXVlIGVub3VnaCB0byBpZGVudGlmeSB0aGUgY29ycmVjdAorY2hhbmdlLgorCisqIERvIG5vdCB3cmFwIHByb2plY3QvYnJhbmNoL293bmVyIGZpZWxkcyBpbiBjaGFuZ2UgdGFibGUuCisrCitUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UgR2Vycml0IG9uIG5hcnJvdyBzY3JlZW5zLgorCisqIFJlbmFtZSAiT2xkIFZlcnNpb24gSGlzdG9yeSIgdG8gIlJlZmVyZW5jZSBWZXJzaW9uIi4KKworUGF0Y2ggU2NyZWVucworXl5eXl5eXl5eXl5eXgorCisqIFN1cHBvcnQgZm9yIGZpbGUgY29tbWVudHMKKysKK0l0IGlzIG5vdyBwb3NzaWJsZSB0byBjb21tZW50IG9uIGEgd2hvbGUgZmlsZSBpbiBhIHBhdGNoLgorCisqIEhhdmUgdGhlIHJldmlld2VkIHBhbmVsIGFsc28gYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGF0Y2ggc2NyZWVuCisrCitSZXZpZXdlcnMgbm9ybWFsbHkgcmV2aWV3IHBhdGNoZXMgdG9wIGRvd24sIGZpbmlzaGluZyB0aGUgcmV2aWV3IHdoZW4KK3RoZXkgcmVhY2ggdGhlIGJvdHRvbSBvZiB0aGUgcGF0Y2guIFRvIHVzZSB0aGUgc3RyZWFtbGluZWQgcmV2aWV3Cit3b3JrZmxvdyB0aGV5IG5vdyBkb24ndCBuZWVkIHRvIHNjcm9sbCBiYWNrIHRvIHRoZSB0b3AgdG8gZmluZCB0aGUKK3Jldmlld2VkIGNoZWNrYm94IGFuZCBsaW5rLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNDk0W0lzc3VlIDE0OTRdOgorICBVc2UgbW9uby1mb250IGZvciBkaXNwbGF5aW5nIHRoZSBmaWxlIGNvbnRlbnRzCisrCitUaGlzIGF2b2lkcyBhbGlnbm1lbnQgZXJyb3JzIHdoZW4gc3ludGF4IGhpZ2hsaWdodGluZyBpcyBlbmFibGVkLgorCisqIERpc3Rpbmd1aXNoIGJldHdlZW4gZXJyb3IgYW5kIHRpbWVvdXQgaW4gaW50cmFsaW5lIGRpZmYgZXJyb3IgbWVzc2FnZS4KKworKiBFbmFibGUgZXhwYW5kaW5nIHNraXBwZWQgbGluZXMgZXZlbiBpZiAnU3ludGF4IENvbG9yaW5nJyBpcyBvZmYuCisKK1Byb2plY3QgU2NyZWVucworXl5eXl5eXl5eXl5eXl5eCisKKyogU3VwcG9ydCBmaWx0ZXJpbmcgb2YgcHJvamVjdHMgaW4gdGhlIHByb2plY3QgbGlzdCBzY3JlZW4KKysKK0ZpbHRlciBtYXRjaGVzIGFyZSBoaWdobGlnaHRlZCBieSBib2xkIHByaW50aW5nLgorKworVGhlIGZpbHRlciBpcyByZWZsZWN0ZWQgYnkgdGhlIGBmaWx0ZXJgIFVSTCBwYXJhbWV0ZXIuCisKKyogU3VwcG9ydCBmaWx0ZXJpbmcgb2YgcHJvamVjdHMgaW4gUHJvamVjdExpc3RQb3B1cAorKworRmlsdGVyIG1hdGNoZXMgYXJlIGhpZ2hsaWdodGVkIGJ5IGJvbGQgcHJpbnRpbmcuCisKKyogRGlzcGxheSBhIHF1ZXJ5IGljb24gZm9yIGVhY2ggcHJvamVjdCBpbiB0aGUgcHJvamVjdCBsaXN0IHNjcmVlbiB0aGF0CisgIGxpbmtzIHRvIHRoZSBkZWZhdWx0IHF1ZXJ5L2Rhc2hib2FyZCBvZiB0aGF0IHByb2plY3QuCisKKyogUmVwbGFjZSBwcm9qZWN0cyBzaWRlIG1lbnVzIHdpdGggdG9wIG1lbnVzCisrCitUaGUgdG9wIG1lbnVzIGFyZSBzdWJtZW51cyB0byB0aGUgUHJvamVjdCBNZW51IGFuZCB0aGV5IGFwcGVhciBvbmx5Cit3aGVuIGEgcHJvamVjdCBoYXMgYmVlbiBzZWxlY3RlZC4KKworKiBSZW1lbWJlciB0aGUgbGFzdCBQcm9qZWN0IFNjcmVlbiB1c2VkCisrCitSZW1lbWJlciB0aGUgbGFzdCBwcm9qZWN0IHNjcmVlbiB1c2VkIGV2ZXJ5IHRpbWUgYSBwcm9qZWN0IHNjcmVlbiBpcworbG9hZGVkLiBHbyB0byB0aGUgcmVtZW1iZXJlZCBzY3JlZW4gd2hlbiBzZWxlY3RpbmcgYSBuZXcgcHJvamVjdCBmcm9tCit0aGUgcHJvamVjdCBsaXN0IGluc3RlYWQgb2YgYWx3YXlzIGdvaW5nIHRvIHRoZSBwcm9qZWN0IGluZm8gc2NyZWVuLgorCisqIFJlbWVtYmVyIHRoZSBsYXN0IHByb2plY3Qgdmlld2VkCisrCitSZW1lbWJlciB0aGUgbGFzdCBwcm9qZWN0IHZpZXdlZCB3aGVuIG5hdmlnYXRpbmcgYXdheSBmcm9tIGEgcHJvamVjdAorc2NyZWVuLiAgSWYgdGhlcmUgaXMgYSByZW1lbWJlcmVkIHByb2plY3QsIHRoZW4gdGhlIGV4dHJhIHByb2plY3QgbGlua3MKK2FyZSBub3QgaGlkZGVuLgorCisqIEFkZCBjbG9uZSBwYW5lbCB0byB0aGUgcHJvamVjdCBnZW5lcmFsIHNjcmVlbgorCisqIE5ldyBzY3JlZW4gZm9yIGxpc3RpbmcgYW5kIGFjY2Vzc2luZyB0aGUgcHJvamVjdCBkYXNoYm9hcmRzLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjc3W0lzc3VlIDE2NzddOgorICBQbGFjZSB0aGUgJ0Jyb3dzZScgYnV0dG9uIHRvIHNlbGVjdCBhIHdhdGNoZWQgcHJvamVjdCBuZXh0IHRvIGlucHV0IGZpZWxkCisKKyogQXNrIHVzZXIgdG8gbG9naW4gaWYgcHJvamVjdCBpcyBub3QgZm91bmQKKysKK0FjY2Vzc2luZyBhIHByb2plY3QgVVJMIHdhcyBmYWlsaW5nIHdpdGggJ05vdCBGb3VuZCAtIFRoZSBwYWdlIHlvdQorcmVxdWVzdGVkIHdhcyBub3QgZm91bmQsIG9yIHlvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcgdGhpcworcGFnZScgaWYgdGhlIHVzZXIgd2FzIG5vdCBzaWduZWQgaW4gYW5kIHRoZSBwcm9qZWN0IHdhcyBub3QgdmlzaWJsZSB0bworJ0Fub255bW91cyBVc2VycycuIEluc3RlYWQgR2Vycml0IG5vdyBhc2tzIHRoZSB1c2VyIHRvIGxvZ2luIGFuZAorYWZ0ZXJ3YXJkcyBzaG93cyB0aGUgcHJvamVjdCB0byB0aGUgdXNlciBpZiBpdCBleGlzdHMgYW5kIGlzIHZpc2libGUuCitJZiB0aGUgcHJvamVjdCBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCB2aXNpYmxlLCB0aGUgdXNlciB3aWxsIHN0aWxsIGdldAordGhlIE5vdCBGb3VuZCBzY3JlZW4gYWZ0ZXIgc2lnbiBpbi4KKworKiBJbXByb3ZlIGVycm9yIGhhbmRsaW5nIG9uIGJyYW5jaCBjcmVhdGlvbgorKworSW1wcm92ZSB0aGUgZXJyb3IgbWVzc2FnZXMgdGhhdCBhcmUgZGlzcGxheWVkIGluIHRoZSBXZWJVSSBpZiB0aGUKK2NyZWF0aW9uIG9mIGEgYnJhbmNoIGZhaWxzIGR1ZSB0byBpbnZhbGlkIHVzZXIgaW5wdXQuCisKK0dyb3VwIFNjcmVlbnMKK15eXl5eXl5eXl5eXl4KKworKiBTdXBwb3J0IGZpbHRlcmluZyBvZiBncm91cHMgaW4gdGhlIGdyb3VwIGxpc3Qgc2NyZWVuCisrCitGaWx0ZXIgbWF0Y2hlcyBhcmUgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBwcmludGluZy4KKysKK1RoZSBmaWx0ZXIgaXMgcmVmbGVjdGVkIGJ5IHRoZSBgZmlsdGVyYCBVUkwgcGFyYW1ldGVyLgorCisqIFJlbW92ZSBncm91cCB0eXBlIGZyb20gZ3JvdXAgaW5mbyBzY3JlZW4KKysKK1RoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ3JvdXAgdHlwZSB3YXMgbm90IG11Y2ggaGVscGZ1bC4gQWxsIGdyb3VwcwordGhhdCBjYW4gYmUgc2VlbiBpbiBHZXJyaXQgYXJlIG9mIHR5cGUgJ0lOVEVSTkFMJywgZXhjZXB0IGEgZmV3Cit3ZWxsLWtub3duIHN5c3RlbSBncm91cHMgd2hpY2ggYXJlIG9mIHR5cGUgJ1NZU1RFTScuIFRoZSBzeXN0ZW0gZ3JvdXBzCithcmUgc28gd2VsbC1rbm93biB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gZGlzcGxheSB0aGUgdHlwZSBmb3IgdGhlbS4KKworRGFzaGJvYXJkIFNjcmVlbnMKK15eXl5eXl5eXl5eXl5eXl5eCisKKyogTGluayBkYXNoYm9hcmQgdGl0bGUgdG8gYSBVUkwgdmVyc2lvbiBvZiBpdHNlbGYKKysKK1doZW4gdXNpbmcgYSBzdGFibGUgcHJvamVjdCBkYXNoYm9hcmQgVVJMLCB0aGUgVVJMIG9iZnVzY2F0ZXMgdGhlCitjb250ZW50IG9mIHRoZSBkYXNoYm9hcmQgd2hpY2ggY2FuIG1ha2UgaXQgaGFyZCB0byBkZWJ1ZyBhIGRhc2hib2FyZCBvcgorY29weSBhbmQgbW9kaWZ5IGl0LiBJbiB0aGUgc3BlY2lhbCBjYXNlIG9mIHN0YWJsZSBkYXNoYm9hcmRzLCBtYWtlIHRoZQordGl0bGUgYSBsaW5rIHRvIGFuIHVuc3RhYmxlIFVSTCB2ZXJzaW9uIG9mIHRoZSBkYXNoYm9hcmQgd2l0aCB0aGUgVVJMCityZWZsZWN0aW5nIHRoZSBhY3R1YWwgZGFzaGJvYXJkIGNvbnRlbnRzIHRoZSB3YXkgYSBjdXN0b20gZGFzaGJvYXJkCitkb2VzLgorCisqIEluY3JlYXNlIHRpbWUgc3BhbiBmb3IgIlJlY2VudGx5IENsb3NlZCIgc2VjdGlvbiBpbiB1c2VyIGRhc2hib2FyZCB0byA0IHdlZWtzLgorCitBY2NvdW50IFNjcmVlbnMKK15eXl5eXl5eXl5eXl5eXgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNzQwW0lzc3VlIDE3NDBdOgorICBEaXNwbGF5IGRlc2NyaXB0aW9uIGhvdyB0byBnZW5lcmF0ZSBTU0ggS2V5IGluIFNzaFBhbmVsCisrCitEaXNwbGF5IGEgZGVzY3JpcHRpb24gb2YgaG93IHRvIGdlbmVyYXRlIGFuIFNTSCBLZXkgaW4gYW4gZXhwYW5kYWJsZQorc2VjdGlvbiBpbiB0aGUgU3NoUGFuZWwgaW5zdGVhZCBvZiBsaW5raW5nIHRvIHRoZSBHaXRIdWIgU1NIIHR1dG9yaWFsLgorVGhlIEdpdEh1YiBTU0ggdHV0b3JpYWwgd2FzIHBhcnRpYWxseSBub3QgcmVsZXZhbnQgYW5kIGNvbmZ1c2VkIHVzZXJzLgorCisqIE1ha2UgdGhlIHRleHQgZm9yICJSZWdpc3RlciIgY3VzdG9taXphYmxlCisKK1BsdWdpbiBTY3JlZW5zCiteXl5eXl5eXl5eXl5eXgorCisqIFNob3cgc3RhdHVzIGZvciBlbmFibGVkIHBsdWdpbnMgaW4gdGhlIFdlYlVJIGFzICdFbmFibGVkJworKworRWFybGllciBubyBzdGF0dXMgd2FzIHNob3duIGZvciBlbmFibGVkIHBsdWdpbnMsIHdoaWNoIHdhcyBjb25mdXNpbmcgdG8KK3NvbWUgdXNlcnMuCisKK1JFU1QgQVBJCit+fn5+fn5+fgorCisqIEEgYmlnIGNodW5rIG9mIHRoZSBHZXJyaXQgZnVuY3Rpb25hbGl0eSBpcyBub3cgYXZhaWxhYmxlIHZpYSB0aGUKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Jlc3QtYXBpLmh0bWxbUkVTVCBBUEldLgorKworVGhlIFJFU1QgQVBJIGlzICpOT1QqIGNvbXBsZXRlIHlldCBhbmQgc29tZSBmdW5jdGlvbmFsaXR5IGlzIHN0aWxsIG1pc3NpbmcuCisrCitUbyBmaW5kIG91dCB3aGljaCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSwgY2hlY2sgdGhlIFJFU1QgZW5kcG9pbnQgZG9jdW1lbnRhdGlvbiBmb3IKK2xpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS1wcm9qZWN0cy5odG1sW3Byb2plY3RzXSwKK2xpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS1jaGFuZ2VzLmh0bWxbY2hhbmdlc10sCitsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcmVzdC1hcGktZ3JvdXBzLmh0bWxbZ3JvdXBzXSBhbmQKK2xpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS1hY2NvdW50cy5odG1sW2FjY291bnRzXS4KKworKiBTdXBwb3J0IHNldHRpbmcgYEhFQURgIG9mIGEgcHJvamVjdAorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcmVzdC1hcGktcHJvamVjdHMuaHRtbCNzZXQtaGVhZFt2aWEgUkVTVF0uCisKKyogQXVkaXQgc3VwcG9ydCBmb3IgUkVTVCBBUEkuCisrCitBbGxvdyBnZW5lcmF0aW5nIEF1ZGl0IGV2ZW50cyByZWxhdGVkIHRvIFJFU1QgQVBJIGV4ZWN1dGlvbi4gVGhlCitzdHJ1Y3R1cmUgb2YgdGhlIEF1ZGl0RXZlbnQgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCB0aGUgbmV3CituYW1lLW11bHRpdmFsdWUgcGFpcnMgdXNlZCBpbiB0aGUgUkVTVCBBUEkuCisrCitUaGlzIGlzIGJyZWFraW5nIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgMi41IEFQSSBhcyBpdCBjaGFuZ2VzIHRoZQorcGFyYW1zIGRhdGEgdHlwZSwgdGhpcyBpcyBuZWVkZWQgYW55d2F5IGFzIHRoZSBwcmV2aW91cyBsaXN0IG9mCitPYmplY3RzIHdhcyBub3QgcHJvdmlkaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIG9mCisid2hhdCByZWxhdGVzIHRvIHdoYXQiIGluIHRlcm1zIG9mIHBhcmFtZXRlcnMgaW5mby4KKysKK0V4aXN0aW5nIHN1cHBvcnQgZm9yIFNTSCBhbmQgSlNPTi1SUEMgZXZlbnRzIGhhdmUgYmVlbiBhZGFwdGVkIGluCitvcmRlciB0byBmaXQgaW50byB0aGUgbmV3IG5hbWUtbXVsdGl2YWx1ZSBzeW50YXg6IHRoaXMgYWxsb3cgYQorZ2VuZXJpYyBhdWRpdCBwbHVnLWluIHRvIGNhcHR1cmUgYWxsIHBhcmFtZXRlcnMgcmVnYXJkbGVzcyBvZiB3aGVyZQordGhleSBoYXZlIGJlZW4gZ2VuZXJhdGVkLgorCisqIFJlbW92ZSBzdXBwb3J0IGZvciBkZXByZWNhdGVkIGAtLWZvcm1hdGAgb3B0aW9uIHdoZW4gbGlzdGluZyBjaGFuZ2VzCisrCitRdWVyeWluZyBjaGFuZ2VzIHZpYSBSRVNUIGlzIG5vdyBhbHdheXMgcHJvZHVjaW5nIEpTT04gb3V0cHV0LgorCisqIEludHJvZHVjZSBgaWRgIHByb3BlcnR5IG9uIFJFU1QgZW50aXRpZXMKKysKK1RoZSBgL2NoYW5nZXMvYCBlbnRpdGllcyBub3cgdXNlIGBpZGAgdG8gaW5jbHVkZSBhIHRyaXBsZXQgb2YgdGhlCitwcm9qZWN0LCBicmFuY2ggYW5kIGNoYW5nZS1pZCBzdHJpbmcgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhhdCBjaGFuZ2UKK29uIHRoZSBzZXJ2ZXIuIFRoaXMgbW92ZXMgdGhlIG9sZCBgaWRgIGZpZWxkIHRvIGJlIG5hbWVkIGBjaGFuZ2VfaWRgLAord2hpY2ggaXMgYSBicmVha2luZyBjaGFuZ2UuCisKKyogQWNjZXB0IGNvbW1vbiBmb3JtcyBvZiBtYWxmb3JtZWQgSlNPTgorKworU29tZSBjbGllbnRzIG1heSBzZW5kIEpTT04taXNoIGluc3RlYWQgb2YgSlNPTi4gQmUgbmljZSB0byB0aG9zZQorY2xpZW50cyBhbmQgYWNjZXB0IHZhcmlvdXMgdXNlZnVsIGZvcm1zIG9mIGluY29ycmVjdCBzeW50YXg6CisrCisqKiBFbmQgb2YgbGluZSBjb21tZW50cyBzdGFydGluZyB3aXRoIGAvL2Agb3IgYCNgIGFuZCBlbmRpbmcgd2l0aCBhCisgICBuZXdsaW5lIGNoYXJhY3Rlci4KKyoqIEMtc3R5bGUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCBgLypgIGFuZCBlbmRpbmcgd2l0aCBgKi9gCisgICBTdWNoIGNvbW1lbnRzIG1heSBub3QgYmUgbmVzdGVkLgorKiogTmFtZXMgdGhhdCBhcmUgdW5xdW90ZWQgb3Igc2luZ2xlIHF1b3RlZC4KKyoqIFN0cmluZ3MgdGhhdCBhcmUgdW5xdW90ZWQgb3Igc2luZ2xlIHF1b3RlZC4KKyoqIEFycmF5IGVsZW1lbnRzIHNlcGFyYXRlZCBieSBgO2AgaW5zdGVhZCBvZiBgLGAuCisqKiBVbm5lY2Vzc2FyeSBhcnJheSBzZXBhcmF0b3JzLiBUaGVzZSBhcmUgaW50ZXJwcmV0ZWQgYXMgaWYgbnVsbCB3YXMKKyAgIHRoZSBvbWl0dGVkIHZhbHVlLgorKiogTmFtZXMgYW5kIHZhbHVlcyBzZXBhcmF0ZWQgYnkgYD1gIG9yIGA9PmAgaW5zdGVhZCBvZiBgOmAuCisqKiBOYW1lL3ZhbHVlIHBhaXJzIHNlcGFyYXRlZCBieSBgO2AgaW5zdGVhZCBvZiBgLGAuCisKKyogQmUgbW9yZSBsaWJlcmFsIGFib3V0IHBhcnNpbmcgSlNPTiByZXNwb25zZXMKKysKK0lmIHRoZSByZXNwb25zZSBiZWdpbnMgd2l0aCB0aGUgSlNPTiBtYWdpYyBzdHJpbmcsIHJlbW92ZSBpdCBiZWZvcmUKK3BhcnNpbmcuIElmIGEgcmVzcG9uc2UgaXMgbWlzc2luZyB0aGlzIGxlYWRpbmcgc3RyaW5nLCBwYXJzZSB0aGUKK3Jlc3BvbnNlIGFzLWlzLgorCisqIEFjY2VwdCBzaW1wbGUgZm9ybSBlbmNvZGVkIGRhdGEgZm9yIFJFU1QgQVBJcworKworU2ltcGxlIGNhc2VzIGxpa2UgYC9yZXZpZXdgIG9yIGAvYWJhbmRvbmAgY2FuIG5vdyBhY2NlcHQgc3RhbmRhcmQgZm9ybQordmFsdWVzIGZvciBiYXNpYyBwcm9wZXJ0aWVzLCBtYWtpbmcgaXQgc2ltcGxlIGZvciB0b29scyB0byBkaXJlY3RseQorcG9zdCBkYXRhOgorKworLS0tLQorICBjdXJsIC1uIC0tZGlnZXN0IFwKKyAgLS1kYXRhICdtZXNzYWdlPURvZXMgbm90IGNvbXBpbGUuJyBcCisgIC0tZGF0YSBsYWJlbHMuVmVyaWZpZWQ9LTEgXAorICBodHRwOi8vbG9jYWxob3N0OjgwODAvYS9jaGFuZ2VzLzMvcmV2aXNpb25zLzEvcmV2aWV3CistLS0tCisrCitGb3JtIGZpZWxkIG5hbWVzIGFyZSBKU09OIGZpZWxkIG5hbWVzIGluIHRoZSB0b3AgbGV2ZWwgb2JqZWN0LiAgSWYgZG90CithcHBlYXJzIGluIHRoZSBuYW1lIHRoZSBwYXJ0IHRvIHRoZSBsZWZ0IGlzIHRha2VuIGFzIHRoZSBKU09OIGZpZWxkCituYW1lIGFuZCB0aGUgcGFydCB0byB0aGUgcmlnaHQgYXMgdGhlIGtleSBmb3IgYSBNYXAuIFRoaXMgbmljZWx5IGZpdHMKK3dpdGggdGhlIGxhYmVscyBzdHJ1Y3R1cmUgdXNlZCBieSBgL3Jldmlld2AsIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlCittdWNoIG1vcmUgY29tcGxleCBpbmxpbmUgY29tbWVudCBjYXNlLiBDbGllbnRzIHRoYXQgbmVlZCB0byB1c2UgbW9yZQorY29tcGxleCBmaWVsZHMgbXVzdCB1c2UgSlNPTiBmb3JtYXR0aW5nIGZvciB0aGUgcmVxdWVzdCBib2R5LgorCisqIEFsbG93IGFkbWluaXN0cmF0b3JzIHRvIHNlZSBvdGhlciB1c2VyIGNhcGFiaWxpdGllcworKworRXhwYW5kIGAvYWNjb3VudHMve2lkfS9jYXBhYmlsaXRpZXNgIHRvIHBlcm1pdCBhbiBhZG1pbmlzdHJhdG9yCit0byBpbnNwZWN0IGFub3RoZXIgdXNlcidzIGVmZmVjdGl2ZSBjYXBhYmlsaXRpZXMuCisKKyogRGVjbGFyZSBraW5kIGluIEpTT04gQVBJIHJlc3VsdHMKKysKK1RoaXMgaXMgcmVjb21tZW5kZWQgdG8gaGludCB0byBjbGllbnRzIHdoYXQgdGhlIGVudGl0eSB0eXBlIGlzIHdoZW4KK3Byb2Nlc3NpbmcgdGhlIEpTT04gcGF5bG9hZC4KKworKiBGb3JtYXQgaC9oZWxwIG91dHB1dCBhcyBwbGFpbiB0ZXh0IG5vdCBKU09OCisrCitUaGUgb3V0cHV0IHByb2R1Y2VkIHdoZW4gdGhlIGNsaWVudCByZXF1ZXN0ZWQgdGhlIGggb3IgaGVscCBwcm9wZXJ0eQorZnJvbSBhIEpTT04gQVBJIGlzIGFsd2F5cyBwcm9kdWNlZCBmcm9tIGNvbnN0YW50IGNvbXBpbGVkIGludG8gdGhlCitzZXJ2ZXIuIEFzc3VtZSB0aGlzIHNhZmUgdG8gcmV0dXJuIHRvIHRoZSBjbGllbnQgYXMgdGV4dC9wbGFpbiBjb250ZW50CithbmQgYXZvaWQgd3JhcHBpbmcgaXQgaW50byBhbiBIVE1MIGVzY2FwZWQgSlNPTiBzdHJpbmcuCisKKyogVXNlIHN0cmluZyBmb3IgSlNPTiBlbmNvZGVkIHBsYWluIHRleHQgcmVwbGllcworKworSW5zdGVhZCBvZiB3cmFwcGluZyB0aGUgdmFsdWUgaW50byBhbiBvYmplY3QsIGp1c3QgcmV0dXJuIHRoZQorc3RyaW5nIGJ5IGl0c2VsZi4gVGhpcyBiZXR0ZXIgbWF0Y2hlcyB3aGF0IGhhcHBlbnMgd2l0aCB0aGUgcGxhaW4KK3RleHQgcmV0dXJuIGZvcm1hdC4KKworKiBXcmFwIHBvc3NpYmxlIEhUTUwgcGxhaW4gdGV4dCBpbiBKU09OIG9uIEdFVAorKworSWYgdGhlIEhUTUwgYXBwZWFycyBsaWtlIE1TSUUgbWlnaHQgZ3Vlc3MgaXQgaXMgSFRNTCAoc3VjaCBhcyBpZiBpdAorY29udGFpbnMgYDxgKSBlbmNvZGUgdGhlIHJlc3BvbnNlIGFzIGEgSlNPTiBvYmplY3QgaW5zdGVhZCBvZiBhcyBhCitzaW1wbGUgcGxhaW4gdGV4dCBzdHJpbmcuIFRoaXMgd29uJ3Qgc2hvdyB1cCB2ZXJ5IG9mdGVuIGZvciBjbGllbnRzLAorYW5kIHByb3RlY3RzIE1TSUUgdXNlcnMgc3R1Y2sgb24gYW5jaWVudCB2ZXJzaW9ucyAocHJlIE1TSUUgOCkuCisKKyogQXNrIE1TSUUgdG8gbmV2ZXIgc25pZmYgY29udGVudCB0eXBlcyBvbiBSRVNUIEFQSSByZXNwb25zZXMKKysKK05ld2VyIHZlcnNpb25zIG9mIE1TSUUgY2FuIGRpc2FibGUgdGhlIGNvbnRlbnQgc25pZmZpbmcgZmVhdHVyZSBpZiB0aGUKK3NlcnZlciBhc2tzIGl0IHRvIGJ5IHNldHRpbmcgYW4gZXh0ZW5zaW9uIGhlYWRlci4gSXQgaXMgYW5ub3lpbmcsIGJ1dAorbmVjZXNzYXJ5LCB0aGF0IGEgc2VydmVyIG5lZWRzIHRvIHNheSAiTm8gcmVhbGx5LCBJIF9hbV8gdGVsbGluZyB5b3UKK3RoZSByaWdodCBDb250ZW50LVR5cGUsIHRydXN0IGl0LiIKKysKK1RoaXMgZmVhdHVyZSB3YXMgYWRkZWQgaW4gTVNJRSA4IEJldGEgMiBzbyBpdCBkb2Vzbid0IHByb3RlY3QgdXNlcnMKK3J1bm5pbmcgTVNJRSA2IG9yIDcsIGJ1dCB0aG9zZSBhcmUgYW5jaWVudCBhbmQgdXNlcnMgc2hvdWxkIHVwZ3JhZGUuCisrCitFbmFibGUgdGhpcyBvbiB0aGUgUkVTVCBBUEkgcmVzcG9uc2VzIGJlY2F1c2Ugd2Ugc29tZXRpbWVzIHNlbmQgYmFjawordGV4dC9wbGFpbiByZXN1bHRzIHRoYXQgYXJlIHJlYWxseSBqdXN0IHBsYWluIHRleHQuIEV4aXN0aW5nIEpTT04KK3Jlc3BvbnNlcyBhcmUgcHJvdGVjdGVkIGZyb20gYWNjaWRlbnRpYWwgc25pZmZpbmcgYW5kIHRyZWF0bWVudCBhcworSFRNTCB0aGFua3MgdG8gR3NvbiBlbmNvZGluZyBIVE1MIGNvbnRyb2wgY2hhcmFjdGVycyB1c2luZyBVbmljb2RlCitjaGFyYWN0ZXIgZXNjYXBlcyB3aXRoaW4gSlNPTiBzdHJpbmdzLgorCitQcm9qZWN0IERhc2hib2FyZHMKK35+fn5+fn5+fn5+fn5+fn5+fgorKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvdXNlci1kYXNoYm9hcmRzLmh0bWwjcHJvamVjdC1kYXNoYm9hcmRzWworICBTdXBwb3J0IGZvciBzdG9yaW5nIGN1c3RvbSBkYXNoYm9hcmRzIGZvciBwcm9qZWN0c10KKysKK0N1c3RvbSBkYXNoYm9hcmRzIGNhbiBub3cgYmUgc3RvcmVkIGluIHRoZSBwcm9qZWN0cworYHJlZnMvbWV0YS9kYXNoYm9hcmRzLypgIGJyYW5jaGVzLgorKworVGhlIHByb2plY3QgZGFzaGJvYXJkcyBhcmUgc2hvd24gaW4gYSBuZXcgcHJvamVjdCBzY3JlZW4gYW5kIGNhbiBiZQorbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Jlc3QtYXBpLXByb2plY3RzLmh0bWwjZGFzaGJvYXJkLWVuZHBvaW50c1sKK2FjY2Vzc2VkIHZpYSBSRVNUXS4KKworKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvdXNlci1kYXNoYm9hcmRzLmh0bWwjcHJvamVjdC1kZWZhdWx0LWRhc2hib2FyZFsKKyAgQWxsb3cgZGVmaW5pbmcgYSBkZWZhdWx0IGRhc2hib2FyZCBmb3IgcHJvamVjdHNdCisKKyogU3VwcG9ydCBpbmhlcml0YW5jZSBmb3IgcHJvamVjdCBkYXNoYm9hcmRzLgorKworSW4gZGFzaGJvYXJkcyBxdWVyaWVzIHRoZSBgJHtwcm9qZWN0fWAgdG9rZW4gY2FuIGJlIHVzZWQgYXMgcGxhY2Vob2xkZXIKK2ZvciB0aGUgcHJvamVjdCBuYW1lLiBUaGlzIHRva2VuIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgcHJvamVjdCB0bword2hpY2ggYSBkYXNoYm9hcmQgaXMgYmVpbmcgYXBwbGllZC4KKworKiBPbiB0aGUgcHJvamVjdCBsaXN0IHNjcmVlbiBhIHF1ZXJ5IGljb24gaXMgZGlzcGxheWVkIGZvciBlYWNoIHByb2plY3QKKyAgdGhhdCBsaW5rcyB0byB0aGUgZGVmYXVsdCBkYXNoYm9hcmQgb2YgdGhhdCBwcm9qZWN0LgorCisqIFN1cHBvcnQgYSBgZm9yZWFjaGAgcGFyYW1ldGVyIGZvciBjdXN0b20gZGFzaGJvYXJkcy4KKysKK1RoZSBgZm9yZWFjaGAgcGFyYW1ldGVyIHdoaWNoIHdpbGwgZ2V0IGFwcGVuZGVkIHRvIGFsbCB0aGUgcXVlcmllcyBpbgordGhlIGRhc2hib2FyZC4KKworQWNjZXNzIENvbnRyb2xzCit+fn5+fn5+fn5+fn5+fn4KKyogQWxsb3cgdG8gb3ZlcnJ1bGUgYEJMT0NLYCBwZXJtaXNzaW9ucyBvbiB0aGUgc2FtZSBwcm9qZWN0CisrCitJdCB3YXMgaW1wb3NzaWJsZSB0byBibG9jayBhIHBlcm1pc3Npb24gZm9yIGEgZ3JvdXAgYW5kIGFsbG93IHRoZSBzYW1lCitwZXJtaXNzaW9uIGZvciBhIHN1Yi1ncm91cCBvZiB0aGF0IGdyb3VwIGFzIHRoZSBgQkxPQ0tgIHBlcm1pc3Npb24KK2Fsd2F5cyB3b24gb3ZlciBhbnkgYEFMTE9XYCBwZXJtaXNzaW9uLiBGb3IgZXhhbXBsZSwgaXQgd2FzIGltcG9zc2libGUKK3RvIGJsb2NrIHRoZSAiRm9yZ2UgQ29tbWl0dGVyIiBwZXJtaXNzaW9uIGZvciBhbGwgdXNlcnMgYW5kIHRoZW4gYWxsb3cKK2l0IG9ubHkgZm9yIGEgY291cGxlIG9mIHByaXZpbGVnZWQgdXNlcnMuCisrCitBbiBgQUxMT1dgIHBlcm1pc3Npb24gaGFzIG5vdyAgcHJpb3JpdHkgb3ZlciBhIGBCTE9DS2AgcGVybWlzc2lvbiB3aGVuCit0aGV5IGFyZSBkZWZpbmVkIGluIHRoZSBzYW1lIGFjY2VzcyBzZWN0aW9uIG9mIGEgcHJvamVjdC4gVG8gYWNoaWV2ZSB0aGUKK2Fib3ZlIG1lbnRpb25lZCBwb2xpY3kgdGhlIGZvbGxvd2luZyBjb3VsZCBiZSBkZWZpbmVkOgorKworICBbYWNjZXNzICJyZWZzL2hlYWRzLyoiXQorICAgIGZvcmdlQ29tbWl0dGVyID0gYmxvY2sgZ3JvdXAgQW5vbnltb3VzIFVzZXJzCisgICAgZm9yZ2VDb21taXR0ZXIgPSBncm91cCBQcml2aWxlZ2VkIFVzZXJzCisrCitBY3Jvc3MgcHJvamVjdHMgdGhlIGBCTE9DS2AgcGVybWlzc2lvbiBzdGlsbCB3aW5zIG92ZXIgYW55IGBBTExPV2AKK3Blcm1pc3Npb24uIFRoaXMgd2F5IG9uZSBjYW5ub3Qgb3ZlcnJpZGUgYW4gaW5oZXJpdGVkIGBCTE9DS2AKK3Blcm1pc3Npb24gaW4gYSBzdWJwcm9qZWN0LgorKworT3ZlcnJ1bGluZyBvZiBgQkxPQ0tgIHBlcm1pc3Npb25zIHdpdGggYEFMTE9XYCBwZXJtaXNzaW9ucyBhbHNvIHdvcmtzCitmb3IgbGFiZWxzIGkuZS4gcGVybWlzc2lvbiByYW5nZXMuIElmIGEgZGVkaWNhdGVkICdWZXJpZmllcnMnIGdyb3VwCituZWVkIHRvIGJlIHRoZSBvbmx5IGdyb3VwIHdobyBjYW4gdm90ZSBpbiB0aGUgJ1ZlcmlmaWVkJyBsYWJlbCBhbmQgaXQKK211c3QgYmUgZW5zdXJlZCB0aGF0IGV2ZW4gcHJvamVjdCBvd25lcnMgY2Fubm90IGNoYW5nZSB0aGlzIHBvbGljeSwKK3RoZW4gdGhlIGZvbGxvd2luZyBjYW4gYmUgZGVmaW5lZCBpbiBhIGNvbW1vbiBwYXJlbnQgcHJvamVjdDoKKysKKyAgW2FjY2VzcyAicmVmcy9oZWFkcy8qIl0KKyAgICBsYWJlbC1WZXJpZmllZCA9IGJsb2NrIC0xLi4rMSBncm91cCBBbm9ueW1vdXMgVXNlcnMKKyAgICBsYWJlbC1WZXJpZmllZCA9IC0xLi4rMSBncm91cCBWZXJpZmllcnMKKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTUxNltpc3N1ZSAxNTE2XToKKyAgU2hvdyBnbG9iYWwgY2FwYWJpbGl0aWVzIHRvIGFsbCB1c2VycyB0aGF0IGNhbiByZWFkIGByZWZzL21ldGEvY29uZmlnYAorKworVXNlcnMgY2FuIG5vdyBwcm9wb3NlIGNoYW5nZXMgdG8gdGhlIGdsb2JhbCBjYXBhYmlsaXRpZXMgZm9yIHJldmlldworZnJvbSB0aGUgV2ViVUkuCisKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2FjY2Vzcy1jb250cm9sLmh0bWwjY2F0ZWdvcnlfcmVtb3ZlX3Jldmlld2VyWworICBSZW1vdmUgUmV2aWV3ZXJdIGlzIGEgbmV3IHBlcm1pc3Npb24uCisKKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2FjY2Vzcy1jb250cm9sLmh0bWwjY2F0ZWdvcnlfcHVzaF9zaWduZWRbCisgIFB1c2hpbmcgYSBzaWduZWQgdGFnXSBpcyBhIG5ldyBwZXJtaXNzaW9uLgorCisqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9hY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X2VkaXRfdG9waWNfbmFtZVsKKyAgRWRpdGluZyB0aGUgdG9waWMgbmFtZV0gaXMgYSBuZXcgcGVybWlzc2lvbi4KKworKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvYWNjZXNzLWNvbnRyb2wuaHRtbCNjYXBhYmlsaXR5X2FjY2Vzc0RhdGFiYXNlWworICBSYXcgZGF0YWJhc2UgYWNjZXNzXSB3aXRoIHRoZSBgZ3NxbGAgY29tbWFuZCBpcyBhIG5ldyBnbG9iYWwgY2FwYWJpbGl0eS4KKysKK1ByZXZpb3VzbHkgc2l0ZSBhZG1pbmlzdHJhdG9ycyBoYWQgdGhpcyBjYXBhYmlsaXR5IGJ5IGRlZmF1bHQuICBOb3cgaXQgaGFzCit0byBiZSBleHBsaWNpdGx5IGFzc2lnbmVkLCBldmVuIGZvciBzaXRlIGFkbWluaXN0cmF0b3JzLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNTg1W0lzc3VlIDE1ODVdOgorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvYWNjZXNzLWNvbnRyb2wuaHRtbCNjYXRlZ29yeV92aWV3X2RyYWZ0c1sKKyAgVmlld2luZyBvdGhlciB1c2VycycgZHJhZnQgY2hhbmdlc10gaXMgYSBuZXcgcGVybWlzc2lvbi4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTY3NVtJc3N1ZSAxNjc1XToKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2FjY2Vzcy1jb250cm9sLmh0bWwjY2F0ZWdvcnlfZGVsZXRlX2RyYWZ0c1tEZWxldGluZ10gYW5kCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9hY2Nlc3MtY29udHJvbC5odG1sI2NhdGVnb3J5X3B1Ymxpc2hfZHJhZnRzW3B1Ymxpc2hpbmddCisgIG90aGVyIHVzZXJzJyBkcmFmdCBjaGFuZ2VzIGlzIGEgbmV3IHBlcm1pc3Npb24uCisKKyogR3JhbnQgbW9zdCBwZXJtaXNzaW9ucyB3aGVuIGNyZWF0aW5nIGBBbGwtUHJvamVjdHNgCisrCitNYWtlIEdlcnJpdCBtb3JlIGxpa2UgYSBHaXQgc2VydmVyIG91dC1vZi10aGUgYm94IGJ5IGdyYW50aW5nIGJvdGgKK0FkbWluaXN0cmF0b3JzIGFuZCBQcm9qZWN0IE93bmVycyBwZXJtaXNzaW9ucyB0byByZXZpZXcgY2hhbmdlcywgc3VibWl0Cit0aGVtLCBjcmVhdGUgYnJhbmNoZXMsIGNyZWF0ZSB0YWdzLCBhbmQgcHVzaCBkaXJlY3RseSB0byBicmFuY2hlcy4KKworKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWdlcnJpdC5odG1sI2xkYXAuZ3JvdXBOYW1lWworICBMREFQIGdyb3VwIG5hbWVzXSBhcmUgY29uZmlndXJhYmxlLCBgY25gIGlzIHN0aWxsIHRoZSBkZWZhdWx0LgorCisqIEtlcmJlcm9zIGF1dGhlbnRpY2F0aW9uIHRvIExEQVAgc2VydmVycyBpcyBub3cgc3VwcG9ydGVkLgorCisqIEJhc2ljIHByb2plY3QgcHJvcGVydGllcyBhcmUgbm93IGluaGVyaXRlZCBieSBkZWZhdWx0IGZyb20gcGFyZW50CisgIHByb2plY3RzOiBVc2UgQ29udGVudCBNZXJnZSwgUmVxdWlyZSBDb250cmlidXRvciBBZ3JlZW1lbnQsIFJlcXVpcmUKKyAgQ2hhbmdlIElkLCBSZXF1aXJlIFNpZ25lZCBPZmYgQnkuCisKKyogQWxsb3cgYXNzaWduaW5nIGBQdXNoYCBmb3IgYHJlZnMvbWV0YS9jb25maWdgIG9uIGBBbGwtUHJvamVjdHNgCisrCitUaGUgYHJlZnMvbWV0YS9jb25maWdgIGJyYW5jaCBvZiB0aGUgYEFsbC1Qcm9qZWN0c2AgcHJvamVjdCBzaG91bGQgb25seQorYmUgbW9kaWZpZWQgYnkgR2Vycml0IGFkbWluaXN0cmF0b3JzIGJlY2F1c2UgYmVpbmcgYWJsZSB0byBkbworbW9kaWZpY2F0aW9ucyBvbiB0aGlzIGJyYW5jaCBtZWFucyB0aGF0IHRoZSB1c2VyIGNvdWxkIGFzc2lnbiBoaW1zZWxmCithZG1pbmlzdHJhdG9yIHBlcm1pc3Npb25zLgorKworSW4gYWRkaXRpb24gdG8gYmVpbmcgYWRtaW5pc3RyYXRvciBHZXJyaXQgcmVxdWlyZXMgdGhhdCB0aGUKK2FkbWluaXN0cmF0b3IgaGFzIHRoZSBgUHVzaGAgYWNjZXNzIHJpZ2h0IGZvciBgcmVmcy9tZXRhL2NvbmZpZ2AgaW4KK29yZGVyIHRvIGJlIGFibGUgdG8gbW9kaWZ5IGl0IChqdXN0IGFzIHdpdGggYWxsIG90aGVyIGJyYW5jaGVzCithZG1pbmlzdHJhdG9ycyBkbyBub3QgaGF2ZSBlZGl0IHBlcm1pc3Npb25zIGJ5IGRlZmF1bHQpLgorKworVGhlIHByb2JsZW0gd2FzIHRoYXQgYXNzaWduaW5nIHRoZSBgUHVzaGAgYWNjZXNzIHJpZ2h0IGZvcgorYHJlZnMvbWV0YS9jb25maWdgIG9uIHRoZSBgQWxsLVByb2plY3RzYCBwcm9qZWN0IHdhcyBub3QgYWxsb3dlZC4KKysKK0hhdmluZyB0aGUgYFB1c2hgIGFjY2VzcyByaWdodCBmb3IgYHJlZnMvbWV0YS9jb25maWdgIG9uIHRoZQorYEFsbC1Qcm9qZWN0c2AgcHJvamVjdCB3aXRob3V0IGJlaW5nIGFkbWluaXN0cmF0b3IgaGFzIG5vIGVmZmVjdC4KKworSG9va3MKK35+fn5+CisqIENoYW5nZSB0b3BpYyBpcyBwYXNzZWQgdG8gaG9va3MgYXMgYC0tdG9waWMgTkFNRWAuCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xMjAwW0lzc3VlIDEyMDBdOgorTmV3IGByZXZpZXdlci1hZGRlZGAgaG9vayBhbmQgc3RyZWFtIGV2ZW50IHdoZW4gYSByZXZpZXdlciBpcyBhZGRlZC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTIzN1tJc3N1ZSAxMjM3XToKK05ldyBgbWVyZ2UtZmFpbGVkYCBob29rIGFuZCBzdHJlYW0gZXZlbnQgd2hlbiBhIGNoYW5nZSBjYW5ub3QgYmUgc3VibWl0dGVkIGR1ZSB0byBmYWlsZWQgbWVyZ2UuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTkyNVtJc3N1ZSA5MjVdOgorTmV3IGByZWYtdXBkYXRlYCBob29rIHJ1biBiZWZvcmUgYSBwdXNoIGlzIGFjY2VwdGVkIGJ5IEdlcnJpdC4KKworKiBBZGQgYC0taXMtZHJhZnRgIHBhcmFtZXRlciB0byBgY29tbWVudC1hZGRlZGAgaG9vaworCitHaXQKK35+fgorKiBBZGQgb3B0aW9ucyB0byBgcmVmcy9mb3IvYCBtYWdpYyBicmFuY2ggc3ludGF4CisrCitHaXQgZG9lc24ndCB3YW50IHRvIG1vZGlmeSB0aGUgbmV0d29yayBwcm90b2NvbCB0byBzdXBwb3J0IHBhc3NpbmcKK2RhdGEgZnJvbSB0aGUgZ2l0IHB1c2ggY2xpZW50IHRvIHRoZSBzZXJ2ZXIuIFdvcmsgYXJvdW5kIHRoaXMgYnkKK2VtYmVkZGluZyBvcHRpb24gZGF0YSBpbnRvIGEgbmV3IHN0eWxlIG9mIHJlZmVyZW5jZSBzcGVjaWZpY2F0aW9uOgorKworLS0tLQorICByZWZzL2Zvci9tYXN0ZXIlcj1hbGljZSxjYz1ib2IsY2M9Y2hhcmxpZSx0b3BpYz1vcHRpb25zCistLS0tCisrCitpcyBub3cgcGFyc2VkIGJ5IHRoZSBzZXJ2ZXIgYXM6CisrCistLQorKiogc2V0IHRvcGljIHRvICJvcHRpb25zIgorKiogQ0MgY2hhcmxpZSBhbmQgYm9iCisqKiBhZGQgcmV2aWV3ZXIgYWxpY2UKKyoqIGZvciBicmFuY2ggcmVmcy9oZWFkcy9tYXN0ZXIKKy0tCisrCitJZiBgJWAgaXMgdXNlZCB0aGUgZXh0cmEgaW5mb3JtYXRpb24gYWZ0ZXIgdGhlIGJyYW5jaCBuYW1lIGlzCitwYXJzZWQgYXMgb3B0aW9ucyB3aXRoIGFyZ3M0ai4gRWFjaCBvcHRpb24gaXMgZGVsaW1pdGVkIGJ5IGAsYC4KKysKK1NlbGVjdGluZyBwdWJsaXNoIHZzLiBkcmFmdCBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZSBvcHRpb25zIGBkcmFmdGAgb3IKK2BwdWJsaXNoYCwgYXBwZWFyaW5nIGFueXdoZXJlIGluIHRoZSByZWZzcGVjIGFmdGVyIHRoZSBgJWAgbWFya2VyOgorKworLS0tLQorICByZWZzL2Zvci9tYXN0ZXIlZHJhZnQKKyAgcmVmcy9mb3IvbWFzdGVyJWRyYWZ0LHI9YWxpY2UKKyAgcmVmcy9mb3IvbWFzdGVyJXI9YWxpY2UsZHJhZnQKKyAgcmVmcy9mb3IvbWFzdGVyJXI9YWxpY2UscHVibGlzaAorLS0tLQorCisqIEVuYWJsZSBjb250ZW50IG1lcmdlIGJ5IGRlZmF1bHQKKysKK01vc3QgdGVhbXMgc2VlbSB0byBleHBlY3QgR2Vycml0IHRvIG1hbmFnZSBzaW1wbGUgbWVyZ2VzIHdpdGhpbiBhCitzb3VyY2UgY29kZSBmaWxlLiBFbmFibGUgdGhpcyBvdXQtb2YtdGhlLWJveC4KKworKiBBZGRlZCBhIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctZ2Vycml0Lmh0bWwjY29yZS51c2VSZWN1cnNpdmVNZXJnZVsKKyAgc2VydmVyLWxldmVsIG9wdGlvbl0gdG8gdXNlIEpHaXQncyBuZXcsIGV4cGVyaW1lbnRhbCByZWN1cnNpdmUgbWVyZ2VyLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjA4W0lzc3VlIDE2MDhdOgorQ29tbWl0cyBwdXNoZWQgd2l0aG91dCBhIENoYW5nZS1JZCBub3cgd2FybiB3aXRoIGluc3RydWN0aW9ucyBvbiBob3cKK3RvIGRvd25sb2FkIGFuZCBpbnN0YWxsIHRoZSBjb21taXQtbXNnIGhvb2suCisKKyogQWRkIGBvbGRPYmplY3RJZGAgYW5kIGBuZXdPYmplY3RJZGAgdG8gdGhlIGBHaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIuVXBkYXRlYAorCitTU0gKK35+fgorKiBOZXcgU1NIIGNvbW1hbmQgdG8gaHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jbWQtZ2MuaHRtbFsKKyAgcnVuIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb25dCisrCitBbGwgR0MgcnVucyBhcmUgbG9nZ2VkIGluIGEgR0MgbG9nIGZpbGUuCisKKyogRGVzY3JpcHRpb25zIGFyZSBhZGRlZCB0byBzc2ggY29tbWFuZHMuCisrCitJZiBgZ2Vycml0YCBpcyBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGl0IHdpbGwgbm93IHNob3cgYSBsaXN0IG9mIGF2YWlsYWJsZQorY29tbWFuZHMgd2l0aCB0aGVpciBkZXNjcmlwdGlvbnMuCisKKyogYGNyZWF0ZS1hY2NvdW50IC0taHR0cC1wYXNzd29yZGAgZW5hYmxlcyBzZXR0aW5nL3Jlc2V0dGluZyB0aGUKKyAgSFRUUCBwYXNzd29yZCBvZiByb2xlIGFjY291bnRzLCBmb3IgR2l0IG9yIFJFU1QgQVBJIGFjY2Vzcy4KKworKiBodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NtZC1scy11c2VyLXJlZnMuaHRtbFsKKyAgbHMtdXNlci1yZWZzXSBsaXN0cyB3aGljaCByZWZzIGFyZSB2aXNpYmxlIGZvciBhIGdpdmVuIHVzZXIuCisKKyogYGxzLXByb2plY3RzIC0taGFzLWFjbC1mb3JgIGxpc3RzIHByb2plY3RzIHRoYXQgbWVudGlvbiBhIGdyb3VwCisgIGluIGFuIEFDTCwgaWRlbnRpZnlpbmcgd2hlcmUgcmlnaHRzIGFyZSBncmFudGVkLgorCisqIGByZXZpZXdgIGNvbW1hbmQgc3VwcG9ydHMgcHJvamVjdC1zcGVjaWZpYyBsYWJlbHMKKworKiBgdGVzdC1zdWJtaXQtcnVsZWAgd2FzIHJlbmFtZWQgdG8gYHRlc3Qtc3VibWl0IHJ1bGVgOgorKworYHJ1bGVgIGlzIG5vdyBhIHN1YmNvbW1hbmQgb2YgdGhlIGB0ZXN0LXN1Ym1pdGAgY29tbWFuZC4KKworKiBodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NtZC10ZXN0LXN1Ym1pdC10eXBlLmh0bWxbCisgIHRlc3Qtc3VibWl0IHR5cGVdIHRlc3RzIHRoZSBQcm9sb2cgc3VibWl0IHR5cGUgd2l0aCBhIGNob3NlbiBjaGFuZ2UuCisKK1F1ZXJ5Cit+fn5+fgorKiBBbGxvdyBge31gIHRvIGJlIHVzZWQgZm9yIHF1b3RpbmcgaW4gcXVlcnkgZXhwcmVzc2lvbnMKKysKK1RoaXMgbWFrZXMgaXQgYSBsaXR0bGUgZWFzaWVyIHRvIHF1ZXJ5IGZvciBncm91cCBuYW1lcyB0aGF0IGNvbnRhaW4KK2Egc3BhY2Ugb3ZlciBTU0g6CisrCisgIHNzaCBzcnYgZ2Vycml0IHF1ZXJ5ICIgJ3N0YXR1czpvcGVuIE5PVCByZXZpZXdlcmluOntEZXZlbG9wZXIgR3JvdXB9JyAiCisKKyogVGhlIHF1ZXJ5IHN1bW1hcnkgYmxvY2sgaW5jbHVkZXMgYHJlc3VtZVNvcnRLZXlgLgorCisqIFF1ZXJ5IHJlc3VsdHMgaW5jbHVkZSBhdXRob3IgYW5kIGNoYW5nZSBzaXplIGluZm9ybWF0aW9uIHdoZW4gY2VydGFpbgorICBvcHRpb25zIGFyZSBzcGVjaWZpZWQuCisKKyogV2hlbiBhIGZpbGUgaXMgcmVuYW1lZCB0aGUgb2xkIGZpbGUgbmFtZSBpcyBpbmNsdWRlZCBpbiB0aGUgUGF0Y2gKKyAgYXR0cmlidXRlCisKK1BsdWdpbnMKK35+fn5+fn4KKyogUGx1Z2lucyBjYW4gY29udHJpYnV0ZSBQcm9sb2cgZmFjdHMvcHJlZGljYXRlcyBmcm9tIEphdmEuCisqIFBsdWdpbnMgY2FuIHByb21wdCBmb3IgcGFyYW1ldGVycyBkdXJpbmcgYGluaXRgIHdpdGggYEluaXRTdGVwYC4KKyogUGx1Z2lucyBjYW4gbm93IGNvbnRyaWJ1dGUgSmF2YVNjcmlwdCB0byB0aGUgd2ViIFVJLiBVSSBwbHVnaW5zIGNhbgorICBhbHNvIGJlIHdyaXR0ZW4gYW5kIGNvbXBpbGVkIHdpdGggR1dULgorKiBOZXcgTWF2ZW4gYXJjaGV0eXBlcyBmb3IgSmF2YVNjcmlwdCBhbmQgR1dUIHBsdWdpbnMuCisqIFBsdWdpbnMgY2FuIGNvbnRyaWJ1dGUgdmFsaWRhdGlvbiBzdGVwcyB0byByZWNlaXZlZCBjb21taXRzLgorKiBDb21taXQgbWVzc2FnZSBsZW5ndGggY2hlY2tzIGFyZSBtb3ZlZCB0byB0aGUgYGNvbW1pdC1tZXNzYWdlLWxlbmd0aC12YWxpZGF0b3JgCisgIHBsdWdpbiB3aGljaCBpcyBpbmNsdWRlZCBhcyBhIGNvcmUgcGx1Z2luIGluIHRoZSBHZXJyaXQgZGlzdHJpYnV0aW9uIGFuZAorICBjYW4gYmUgaW5zdGFsbGVkIGR1cmluZyBzaXRlIGluaXRpYWxpemF0aW9uLgorKiBDcmVhdGlvbiBvZiBjb2RlIHJldmlldyBub3RlcyBpcyBtb3ZlZCB0byB0aGUgYHJldmlld25vdGVzYCBwbHVnaW4KKyAgd2hpY2ggaXMgaW5jbHVkZWQgYXMgYSBjb3JlIHBsdWdpbiBpbiB0aGUgR2Vycml0IGRpc3RyaWJ1dGlvbiBhbmQgY2FuCisgIGJlIGluc3RhbGxlZCBkdXJpbmcgc2l0ZSBpbml0aWFsaXphdGlvbi4KKyogQSBwbHVnaW4gZXh0ZW5zaW9uIHBvaW50IGZvciBhdmF0YXIgaW1hZ2VzIHdhcyBhZGRlZC4KKyogQWxsb3cgSFRUUCBwbHVnaW5zIHRvIGNoYW5nZSBgc3RhdGljYCBvciBgZG9jc2AgcHJlZml4ZXMKKysKK0FuIEhUVFAgcGx1Z2luIG1heSB3YW50IG1vcmUgY29udHJvbCBvdmVyIGl0cyBVUkwgc3BhY2UsIGJ1dCBzdGlsbAorZGVsZWdhdGUgdG8gdGhlIHBsdWdpbiBzZXJ2bGV0J3MgbWFnaWMgaGFuZGxpbmcgZm9yIHN0YXRpYyBmaWxlcyBhbmQKK2RvY3VtZW50YXRpb24uIEFkZCBKQVIgYXR0cmlidXRlcyB0byBjb25maWd1cmUgdGhlc2UgcHJlZml4ZXMuCisKK1Byb2xvZworfn5+fn5+CitbW3N1Ym1pdC10eXBlLWZyb20tcHJvbG9nXV0KKyogbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Byb2xvZy1jb29rYm9vay5odG1sI0hvd1RvV3JpdGVTdWJtaXRUeXBlWworICBTdXBwb3J0IGNvbnRyb2xsaW5nIHRoZSBzdWJtaXQgdHlwZSBmb3IgY2hhbmdlcyBmcm9tIFByb2xvZ10KKysKK1NpbWlsYXJseSBsaWtlIHRoZSBgc3VibWl0X3J1bGVgIHRoZXJlIGlzIG5vdyBhIGBzdWJtaXRfdHlwZWAgcHJlZGljYXRlCit3aGljaCByZXR1cm5zIHRoZSBhbGxvd2VkIHN1Ym1pdCB0eXBlIGZvciBhIGNoYW5nZS4gV2hlbiB0aGUKK2BzdWJtaXRfdHlwZWAgcHJlZGljYXRlIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgYHJ1bGVzLnBsYCB0aGVuIHRoZQorcHJvamVjdCBkZWZhdWx0IHN1Ym1pdCB0eXBlIGlzIHVzZWQgZm9yIGFsbCBjaGFuZ2VzIG9mIHRoYXQgcHJvamVjdC4KKysKK0ZpbHRlcmluZyB0aGUgcmVzdWx0cyBvZiB0aGUgYHN1Ym1pdF90eXBlYCBpcyBhbHNvIHN1cHBvcnRlZCBpbiB0aGUKK3NhbWUgd2F5IGxpa2UgZmlsdGVyaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBgc3VibWl0X3J1bGVgLiBVc2luZyBhCitgc3VibWl0X3R5cGVfZmlsdGVyYCBwcmVkaWNhdGUgb25lIGNhbiBlbmZvcmNlIGEgcGFydGljdWxhciBzdWJtaXQgdHlwZQorZnJvbSBhIHBhcmVudCBwcm9qZWN0LgorCisqIFBsdWdpbnMgY2FuIGNvbnRyaWJ1dGUgUHJvbG9nIGZhY3RzL3ByZWRpY2F0ZXMgZnJvbSBKYXZhLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0yODhbSXNzdWUgMjg4XToKKyAgRXhwb3NlIGJhc2ljIGNvbW1pdCBzdGF0aXN0aWNzIGZvciB0aGUgUHJvbG9nIHJ1bGUgZW5naW5lCisrCitBIG5ldyBtZXRob2QgYGdlcnJpdDpjb21taXRfc3RhdHMoLUZpbGVzLC1JbnNlcnRpb25zLCAtRGVsZXRpb25zKWAgd2FzCithZGRlZC4KKworKiBBIG5ldyBgbWF4X3dpdGhfYmxvY2tgIHByZWRpY2F0ZSB3YXMgYWRkZWQgZm9yIG1vcmUgY29udmVuaWVudCB1c2FnZQorCitFbWFpbAorfn5+fn4KKyogTm90aWZ5IHByb2plY3Qgd2F0Y2hlcnMgaWYgZHJhZnQgY2hhbmdlIGlzIHB1Ymxpc2hlZAorKiBOb3RpZnkgdXNlcnMgbWVudGlvbmVkIGluIGNvbW1pdCBmb290ZXIgb24gZHJhZnQgcHVibGlzaAorKiBBZGQgbmV3IG5vdGlmeSB0eXBlIHRoYXQgYWxsb3dzIHdhdGNoaW5nIG9mIG5ldyBwYXRjaCBzZXRzCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjg2W0lzc3VlIDE2ODZdOgorICBBZGQgbmV3IG5vdGlmeSB0eXBlIHRoYXQgYWxsb3dzIHdhdGNoaW5nIGFiYW5kb25pbmcgb2YgY2hhbmdlcworKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvdXNlci1ub3RpZnkuaHRtbFsKKyAgTm90aWZpY2F0aW9ucyBjb25maWd1cmVkIGluIGBwcm9qZWN0LmNvbmZpZ2BdIGNhbiBub3cgYmUgYWRkcmVzc2VkCisgIHVzaW5nIGFueSBvZiBUbywgQ0MsIG9yIEJDQyBoZWFkZXJzLgorKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTUzMVtJc3N1ZSAxNTMxXToKK0VtYWlsIGZvb3RlcnMgbm93IGluY2x1ZGUgYEdlcnJpdC1IYXNDb21tZW50czoge1llc3xOb31gLgorKiBgI2lmKCRlbWFpbC5oYXNJbmxpbmVDb21tZW50cygpKWAgY2FuIGJlIHVzZWQgaW4gdGVtcGxhdGVzIHRvIHRlc3QKKyAgaWYgdGhlcmUgYXJlIGNvbW1lbnRzIHRvIGJlIGluY2x1ZGVkIGluIHRoaXMgZW1haWwuCisqIE5vdGlmaWNhdGlvbiBlbWFpbHMgYXJlIHNlbnQgdG8gaW5jbHVkZWQgZ3JvdXBzLgorKiBDb21tZW50IG5vdGlmaWNhdGlvbiBlbWFpbHMgYXJlIHNlbnQgdG8gcHJvamVjdCB3YXRjaGVycy4KKyogIkNoYW5nZSBNZXJnZWQiIGVtYWlscyBpbmNsdWRlIHRoZSBkaWZmIG91dHB1dCB3aGVuIGBzZW5kZW1haWwuaW5jbHVkZURpZmZgIGlzIGVuYWJsZWQuCisqIFdoZW4gbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Jlc3QtYXBpLWNoYW5nZXMuaHRtbCNzZXQtcmV2aWV3WworICBwb3N0aW5nIGEgcmV2aWV3IHZpYSBSRVNUXSB0aGUgY2FsbGVyIGNhbiBjb250cm9sIGVtYWlsIGRlbGl2ZXJ5CisrCitUaGlzIG1heSBoZWxwIGF1dG9tYXRlZCBzeXN0ZW1zIHRvIGJlIGxlc3Mgbm9pc3kuIFRvb2xzIGNhbiBub3cgY2hvb3NlCit3aGljaCByZXZpZXcgdXBkYXRlcyBzaG91bGQgc2VuZCBlbWFpbCwgYW5kIHdoaWNoIGNhdGVnb3JpZXMgb2YgdXNlcnMKK29uIGEgY2hhbmdlIHNob3VsZCBnZXQgdGhhdCBlbWFpbC4KKworTGFiZWxzCit+fn5+fn4KKyogQXBwcm92YWwgY2F0ZWdvcmllcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGxhYmVscworICBjb25maWd1cmVkIGluIGBwcm9qZWN0LmNvbmZpZ2AuIEV4aXN0aW5nIGNhdGVnb3JpZXMgYXJlIG1pZ3JhdGVkIHRvCisgIGBwcm9qZWN0LmNvbmZpZ2AgaW4gYEFsbC1Qcm9qZWN0c2AgYXMgcGFydCBvZiB0aGUgc2NoZW1hIHVwZ3JhZGU7IG5vIHVzZXIKKyAgYWN0aW9uIGlzIHJlcXVpcmVkLgorKiBMYWJlbHMgYXJlIG5vIGxvbmdlciBnbG9iYWw7CisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctbGFiZWxzLmh0bWxbCisgIHByb2plY3RzIG1heSBkZWZpbmUgdGhlaXIgb3duIGxhYmVsc10sIHdpdGggaW5oZXJpdGFuY2UuCisqIERvbid0IGNyZWF0ZSBgVmVyaWZ5YCBjYXRlZ29yeSBieSBkZWZhdWx0CisrCitNb3N0IHByb2plY3QgdGVhbXMgc2VlbSBjb25mdXNlZCB3aXRoIHRoZSBvdXQtb2YtdGhlLWJveCBleHBlcmllbmNlCituZWVkaW5nIHRvIHZvdGUgb24gYm90aCBgQ29kZS1SZXZpZXdgIGFuZCBgVmVyaWZpZWRgIGNhdGVnb3JpZXMgaW4KK29yZGVyIHRvIHN1Ym1pdCBhIGNoYW5nZS4gU2ltcGxpZnkgdGhlIG91dC1vZi10aGUtYm94IHdvcmtmbG93IHRvIG9ubHkKK2hhdmUgYENvZGUtUmV2aWV3YC4gV2hlbiBhIHRlYW0gaW5zdGFsbHMgdGhlIEh1ZHNvbi9KZW5raW5zIGludGVncmF0aW9uCitvciB0aGVpciBvd24gYnVpbGQgc3lzdGVtIHRoZXkgY2FuIG5vdyB0cml2aWFsbHkgYWRkIHRoZSBgVmVyaWZpZWRgCitjYXRlZ29yeSBieSBwYXN0aW5nIDUgbGluZXMgaW50byBgcHJvamVjdC5jb25maWdgLgorCitEZXYKK35+fgorCisqIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kZXYtcmVhZG1lLmh0bWwjZGVidWctamF2YXNjcmlwdFsKKyAgU3VwcG9ydCBsb2FkaW5nIGRlYnVnIEphdmFTY3JpcHRdCisKKyogR2Vycml0IGFjY2VwdGFuY2UgdGVzdHMKKysKK0FuIGluZnJhc3RydWN0dXJlIGZvciB0ZXN0aW5nIHRoZSBHZXJyaXQgZGFlbW9uIHZpYSBSRVNUIGFuZC9vciBTU0gKK3Byb3RvY29scyBoYXMgYmVlbiBhZGRlZC4gR2Vycml0IGRhZW1vbiBpcyBydW4gaW4gdGhlIGhlYWRsZXNzIG1vZGUgYW5kCitpbiB0aGUgc2FtZSBKVk0gd2hlcmUgdGhlIHRlc3RzIHJ1bi4gQmVzaWRlcyB1c2luZyBSRVNUL1NTSCwgdGhlIHRlc3RzCitjYW4gYWxzbyBhY2Nlc3MgR2Vycml0IHNlcnZlciBpbnRlcm5hbHMgdG8gcHJlcGFyZSB0aGUgdGVzdCBlbnZpcm9ubWVudAorYW5kIHRvIHBlcmZvcm0gYXNzZXJ0aW9ucy4KKysKK0EgbmV3IHJldmlldyBzaXRlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggdGVzdCBhbmQgdGhlIEdlcnJpdCBkYWVtb24gaXMKK3N0YXJ0ZWQgb24gdGhhdCBzaXRlLiBXaGVuIHRoZSB0ZXN0IGhhcyBmaW5pc2hlZCB0aGUgR2Vycml0IGRhZW1vbiBpcworc2h1dGRvd24uCisKKyogTGlnaHR3ZWlnaHQgTERBUCBzZXJ2ZXIgZm9yIGRlYnVnZ2luZworCisqIEFkZCBhc2NpaWRvYyBjaGVja3MgaW4gdGhlIGRvY3VtZW50YXRpb24gbWFrZWZpbGUKKysKK0V4aXQgd2l0aCBlcnJvciBpZiB0aGUgYXNjaWlkb2MgZXhlY3V0YWJsZSBpcyBub3QgYXZhaWxhYmxlIG9yIGhhcwordmVyc2lvbiBsb3dlciB0aGFuIDguNi4zLgorKworVGhlIHJlbGVhc2Ugc2NyaXB0IGlzIGFib3J0ZWQgaWYgYXNjaWlkb2MgaXMgbWlzc2luZy4KKworKiBBZGRlZCBzdWJsaW1lIHByb2plY3QgZmlsZXMgdG8gYC5naXRpZ25vcmVgCisKKyogRXhjbHVkZSBhbGwgYHBvbS54bWxgIGZpbGVzIHRoYXQgYXJlIGFyY2hldHlwZSByZXNvdXJjZXMgaW4gYHZlcnNpb24uc2hgCisKKyogU291cmNlIGZpbGVzIGdlbmVyYXRlZCBieSBQcm9sb2cgYXJlIG5vdyBjb3JyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIEVjbGlwc2UKK3Byb2plY3QuCisKKyogQ29yZSBwbHVnaW5zIGFyZSBub3cgaW5jbHVkZWQgYXMgZ2l0IHN1Ym1vZHVsZXMuCisKKyogYG12biBwYWNrYWdlYCBub3cgZ2VuZXJhdGVzIHRoZSBkb2N1bWVudGF0aW9uIGJ5IGRlZmF1bHQuCisrCitUaGUgZG9jdW1lbnRhdGlvbiB3aWxsIGFsd2F5cyBiZSBnZW5lcmF0ZWQgdW5sZXNzIGAtRGdlcnJpdC5kb2N1bWVudGF0aW9uLnNraXBgCitpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorCisqIGBtdm4gdmVyaWZ5YCBub3cgcnVucyBhY2NlcHRhbmNlIHRlc3RzIGJ5IGRlZmF1bHQuCisrCitUaGUgYGFjY2VwdGFuY2VgIHByb2ZpbGUgaXMgbm8gbG9uZ2VyIHVzZWQuICBBY2NlcHRhbmNlIHRlc3RzIHdpbGwgYWx3YXlzCitiZSBydW4gdW5sZXNzIGAtRGdlcnJpdC5hY2NlcHRhbmNlLXRlc3RzLnNraXA9VHJ1ZWAgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworKiBWZXJ0aWNhbGx5IGFsaWduIHRoZSAiQ2hvb3NlOiIgaGVhZGVyIG9uIHRoZSBCZWNvbWUgQW55IEFjY291bnQgcGFnZS4KKyogIkJlY29tZSBBbnkgQWNjb3VudCIgY2FuIGJlIHVzZWQgZm9yIGFjY291bnRzIHdob3NlIGZ1bGwgbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcuCisKKworUGVyZm9ybWFuY2UKK35+fn5+fn5+fn5+CisqIEJpdG1hcCBPcHRpbWl6YXRpb25zCisrCitPbiBydW5uaW5nIHRoZSBodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NtZC1nYy5odG1sWworZ2FyYmFnZSBjb2xsZWN0aW9uXSBKR2l0IGNyZWF0ZXMgYml0bWFwIGRhdGEgdGhhdCBpcyBzYXZlZCB0byBhbgorYXV4aWxpYXJ5IGZpbGUuIFRoZSBiaXRtYXAgb3B0aW1pemF0aW9ucyBpbXByb3ZlIHRoZSBjbG9uZSBhbmQgZmV0Y2gKK3BlcmZvcm1hbmNlLiBnaXQtY29yZSB3aWxsIGlnbm9yZSB0aGUgYml0bWFwIGRhdGEuCisKKyogSW1wcm92ZSBzdWdnZXN0IHVzZXIgcGVyZm9ybWFuY2Ugd2hlbiBhZGRpbmcgYSByZXZpZXdlci4KKysKK0RvIG5vdCBjaGVjayB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgY2hhbmdlIGZvciBlYWNoIHN1Z2dlc3RlZCBhY2NvdW50IGlmCit0aGUgcmVmIGlzIHZpc2libGUgYnkgYWxsIHJlZ2lzdGVyZWQgdXNlcnMuCisrCitPbiBhIHN5c3RlbSB3aXRoIGFib3V0IDItMzAwMCB1c2Vycywgd2hlcmUgbW9zdCBvZiB0aGUgcHJvamVjdHMgYXJlCit2aXNpYmxlIGJ5IGV2ZXJ5IHJlZ2lzdGVyZWQgdXNlciwgdGhpcyBpbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlCitzdWdnZXN0aW5nIHJldmlld2VyIGJ5IGEgZmFjdG9yIG9mIDEwMDAgYXQgbGVhc3QuCisKKyogQ2FjaGUgUmVmQ29udHJvbC5pc1Zpc2libGUoKQorKworRm9yIEdpdCByZXBvc2l0b3JpZXMgd2l0aCBtYW55IGNoYW5nZXMgdGhlIHRpbWUgZm9yIGNhbGN1bGF0aW5nIHZpc2libGUKK3JlZnMgaXMgcmVkdWNlZCBieSAzMC01MCUuCisKKyogQWxsb3cgYWRtaW5zIHRvIGRpc2FibGUgbWFnaWMgcmVmIGNoZWNrIG9uIHVwbG9hZAorKworU29tZSBzaXRlcyBtYW5hZ2UgdG8gcnVuIHRoZWlyIHJlcG9zaXRvcmllcyBpbiBhIHdheSB0aGF0IHByZXZlbnRzCit1c2VycyBmcm9tIGV2ZXIgYmVpbmcgYWJsZSB0byBjcmVhdGUgYHJlZnMvZm9yYCwgYHJlZnMvZHJhZnRzYCBvcgorYHJlZnMvcHVibGlzaGAgbmFtZXMgaW4gYSByZXBvc2l0b3J5LiBBbGxvdyBhZG1pbnMgb24gdGhvc2Ugc2VydmVycwordG8gZGlzYWJsZSB0aGlzIChzb21ld2hhdCkgZXhwZW5zaXZlIGNoZWNrIGJlZm9yZSBldmVyeSB1cGxvYWQuCisKKyogUGVybWl0IFByb2plY3RDYWNoZUNsb2NrIHRvIGJlIGNvbXBsZXRlbHkgZGlzYWJsZWQKKysKK1NvbWUgYWRtaW5zIG1heSBqdXN0IHdhbnQgdG8gcmVxdWlyZSBhbGwgdXBkYXRlcyB0byBwcm9qZWN0cyB0byBiZQorbWFkZSB0aHJvdWdoIHRoZSB3ZWIgaW50ZXJmYWNlLCBhbmQgYXZvaWQgdGhlIHNtYWxsIGV4cGVuc2Ugb2YgYQorYmFja2dyb3VuZCB0aHJlYWQgdGlja2luZyBvZmYgY2hhbmdlcy4KKworKiBCYXRjaCByZWFkIENoYW5nZSBvYmplY3RzIGR1cmluZyBxdWVyeQorCisqIERlZmF1bHQgYGNvcmUuc3RyZWFtRmlsZVRocmVzaG9sZGAgdG8gYSBsYXJnZXIgdmFsdWUKKysKK0lmIHRoaXMgdmFsdWUgaXMgbm90IGNvbmZpZ3VyZWQgYnkgdGhlIHNlcnZlciBhZG1pbmlzdHJhdG9yCitwZXJmb3JtYW5jZSBvbiBsYXJnZXIgdGV4dCBmaWxlcyBzdWZmZXJzIGNvbnNpZGVyYWJseSBhbmQKK0dlcnJpdCBtYXkgZ3JpbmQgdG8gYSBoYWx0IGFuZCBiZSB1bmFibGUgdG8gYW5zd2VyIHVzZXJzLgorKworRGVmYXVsdCB0byBlaXRoZXIgMjUlIG9mIHRoZSBhdmFpbGFibGUgSlZNIGhlYXAgb3IgfjIwNDhtLgorCisqIEltcHJvdmUgcGVyZm9ybWFuY2Ugb2YgUmVjZWl2ZUNvbW1pdHMgZm9yIHJlcG9zaXRvcmllcyB3aXRoIG1hbnkgcmVmcworKworQXZvaWQgYWRkaW5nIGByZWZzL2NoYW5nZXMvYCBhbmQgYHJlZnMvdGFncy9gIHRvIFJldldhbGsncyBhcwordW5pbnRlcmVzdGluZyBzaW5jZSBKR2l0IFJldldhbGsgZG9lc24ndCBwZXJmb3JtIHdlbGwgd2hlbiBhIGxhcmdlCitudW1iZXIgb2Ygb2JqZWN0cyBpcyBtYXJrZWQgYXMgdW5pbnRlcmVzdGluZy4KKworKiBQYXRjaFNldC5pc1JlZigpLW9wdGltaXphdGlvbnMuCisrCitQYXRjaFNldC5pc1JlZigpIGlzIHVzZWQgZXh0ZW5zaXZlbHkgd2hlbiBwcmVwYXJpbmcgZm9yIGEgcmVmCithZHZlcnRpc21lbnQgYW5kIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBieSBpc1JlZnMoKSB3YXMgbm90YWJseQorY29zdGx5IGluIHRoZXNlIGNpcmN1bXN0YW5jZXMsIGVzcGVjaWFsbHkgc2luY2UgaXQgY291bGQgbm90IGJlCitwcmUtY29tcGlsZWQuCisrCitUaGUgcmVndWxhciBleHByZXNzaW9uIGlzIHJlbW92ZWQgYW5kIHRoZSBjaGVjayBpcyBub3cgZGlyZWN0bHkKK2ltcGxlbWVudGVkLiBBcyByZXN1bHQgdGhlIHBlcmZvcm1hbmNlIG9mIGBnaXQgbHMtcmVtb3RlYCBjb3VsZCBiZQoraW5jcmVhc2VkIHVwdG8gMTUlLgorCisqIE5ldyBjb25maWcgb3B0aW9uIGByZWNlaXZlLmNoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGVgCisrCitJZiBzZXQgdG8gdHJ1ZSwgR2Vycml0IHdpbGwgdmFsaWRhdGUgdGhhdCBhbGwgcmVmZXJlbmNlZCBvYmplY3RzIHRoYXQKK2FyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlY2VpdmVkIHBhY2sgYXJlIHJlYWNoYWJsZSBieSB0aGUgdXNlci4KKysKK0NhcnJ5aW5nIG91dCB0aGlzIGNoZWNrIG9uIEdpdCByZXBvc2l0b3JpZXMgd2l0aCBtYW55IHJlZnMgYW5kIGNvbW1pdHMKK2NhbiBiZSBhIHZlcnkgQ1BVLWhlYXZ5IG9wZXJhdGlvbi4gRm9yIG5vbiBwdWJsaWMgR2Vycml0IHNlcnZlcnMgaXQgbWF5CittYWtlIHNlbnNlIHRvIGRpc2FibGUgdGhpcyBjaGVjaywgd2hpY2ggaXMgbm93IHBvc3NpYmxlLgorCisqIENhY2hlIGNvbmZpZyB2YWx1ZSBpbiBMZGFwQXV0aEJhY2tlbmQKKworKiBQZXJmb3JtIGEgc2luZ2xlIC9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcyBvbiBwYWdlIGxvYWQKKysKK1RoaXMgam9pbnMgdXAgMyByZXF1ZXN0cyBpbnRvIGEgc2luZ2xlIGNhbGwsIHdoaWNoIHNob3VsZCBzcGVlZCB1cAoraW5pdGlhbCBwYWdlIGxvYWQgZm9yIG1vc3QgdXNlcnMuCisKKyogT25seSBnemlwIGNvbXByZXNzIHJlc3BvbnNlcyB0aGF0IGFyZSBzbWFsbGVyIGNvbXByZXNzZWQKKworKiBDYWNoaW5nIG9mIGNoYW5nZXMKKysKK0R1cmluZyBSZWYgQWR2ZXJ0aXNtZW50cyAodmlhIFZpc2libGVSZWZGaWx0ZXIpLCBhbGwgY2hhbmdlcyBuZWVkIHRvCitiZSBmZXRjaGVkIGZyb20gdGhlIGRhdGFiYXNlIHRvIGFsbG93IEdlcnJpdCB0byBmaWd1cmUgb3V0IHdoaWNoIGNoYW5nZQorcmVmcyBhcmUgdmlzaWJsZSBhbmQgc2hvdWxkIGJlIGFkdmVydGlzZWQgdG8gdGhlIHVzZXIuIFRvIHJlZHVjZQorZGF0YWJhc2UgdHJhZmZpYyBhIGNhY2hlIGZvciBjaGFuZ2VzIHdhcyBpbnRyb2R1Y2VkLiBUaGlzIGNhY2hlIGlzCitkaXNhYmxlZCBieSBkZWZhdWx0IHNpbmNlIGl0IGNhbiBtZXNzLXVwIG11bHRpLXNlcnZlciBzZXR1cHMuCisKK01pc2MKK35+fn4KKyogQWRkIGNvbmZpZyBwYXJhbWV0ZXIgdG8gbWFrZSBuZXcgZ3JvdXBzIGJ5IGRlZmF1bHQgdmlzaWJsZSB0byBhbGwKKysKK0FkZCBhIG5ldyBodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCNncm91cHMubmV3R3JvdXBzVmlzaWJsZVRvQWxsWworR2Vycml0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXSB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgbmV3bHkKK2NyZWF0ZWQgZ3JvdXBzIHNob3VsZCBiZSBieSBkZWZhdWx0IHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMuCisKKyogU3VwcG9ydCBmb3IgT3BlbklEIGRvbWFpbiBmaWx0ZXJpbmcKKysKK0FkZGVkIHRoZSBhYmlsaXR5IHRvIG9ubHkgYWxsb3cgZW1haWwgYWRkcmVzc2VzIHVuZGVyIHNwZWNpZmljIGRvbWFpbnMKK3RvIGJlIHVzZWQgZm9yIE9wZW5JRCBsb2dpbi4KKysKK1RoZSBhbGxvd2VkIGRvbWFpbnMgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgc2V0dGluZworaHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctZ2Vycml0Lmh0bWwjYXV0aC5vcGVuSWREb21haW5bCithdXRoLm9wZW5JZERvbWFpbl0gaW4gdGhlIEdlcnJpdCBjb25maWd1cmF0aW9uLgorCisqIEFsd2F5cyBjb25maWd1cmUKKyAgaHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctZ2Vycml0Lmh0bWwjZ2Vycml0LmNhbm9uaWNhbFdlYlVybFsKKyAgZ2Vycml0LmNhbm9uaWNhbFdlYlVybF0gb24gaW5pdAorKworR2Vycml0IGhhcyBiZWVuIHJlcXVpcmluZyB0aGlzIGZpZWxkIGZvciBzZXZlcmFsIHZlcnNpb25zIG5vdywgYnV0IGluaXQKK2RpZCBub3QgY29uZmlndXJlIGl0LiBFbnN1cmUgdGhlcmUgaXMgYSB2YWx1ZSBzZXQgc28gdGhlIHNlcnZlciBpcyBub3QKK2NvbmZ1c2VkIGF0IHJ1bnRpbWUuCisKKyogQWRkIHN1Ym1vZHVsZSBzdWJzY3JpcHRpb25zIGZldGNoaW5nIGJ5IHByb2plY3RzCisrCitXaGlsZSBzdWJtb2R1bGUgc3Vic2NyaXB0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBicmFuY2gsIHNvbWUgcGx1Z2lucworKGUuZy46IGRlbGV0ZS1wcm9qZWN0KSB3b3VsZCByYXRoZXIgbmVlZCB0byBhY2Nlc3MgYWxsIHN1Ym1vZHVsZQorc3Vic2NyaXB0aW9ucyBvZiBhIHByb2plY3QgKHJlZ2FyZGxlc3Mgb2YgdGhlIGJyYW5jaCkuIEluc3RlYWQgb2YKK2l0ZXJhdGluZyBvdmVyIGFsbCBicmFuY2hlcyBvZiBhIHByb2plY3QsIGFuZCBmZXRjaGluZyB0aGUKK3N1YnNjcmlwdGlvbiBmb3IgZWFjaCBicmFuY2ggc2VwYXJhdGVseSwgd2UgYWxsb3cgZmV0Y2hpbmcgb2YKK3N1YnNjcmlwdGlvbnMgZGlyZWN0bHkgYnkgcHJvamVjdHMuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE4MDVbSXNzdWUgMTgwNV06CisgIE1ha2UgY2xpZW50IFNTTCBjZXJ0aWZpY2F0ZXMgdGhhdCBjb250YWluIGFuIGVtYWlsIGFkZHJlc3Mgd29yaworKworQXV0aGVudGljYXRpb24gd2l0aCBDTElFTlRfU1NMX0NFUlRfTERBUCBkaWRuJ3Qgd29yayBpZiB0aGUgY2VydGlmaWNhdGUKK2NvbnRhaW5lZCBlbWFpbCBhZGRyZXNzLgorCisqIEd1ZXNzIExEQVAgdHlwZSBvZiBBY3RpdmUgRGlyZWN0b3J5IExEUyBhcyBBY3RpdmVEaXJlY3RvcnkKKysKK0lmIEdlcnJpdCBjb25uZWN0cyB0byBhbiBBRCBMRFMgWzFdIHNlcnZlciBpdCB3aWxsIGd1ZXNzIGl0cyB0eXBlIGFzCitSQ0ZfMjMwNyBpbnN0ZWFkIG9mIEFjdGl2ZURpcmVjdG9yeS4gVGhlIHJlYXNvbiBpcyB0aGF0IGFuIEFEIExEUworZG9lc24ndCBzdXBwb3J0IHRoZSAiMS4yLjg0MC4xMTM1NTYuMS40LjgwMCIgY2FwYWJpbGl0eS4gIEhvd2V2ZXIsCitBRCBMRFMgYmVoYXZlcyBsaWtlIEFjdGl2ZURpcmVjdG9yeSBhbmQgR2Vycml0IGFsc28gbmVlZHMgdG8gZ3Vlc3MKK2l0cyB0eXBlIGFzIEFjdGl2ZURpcmVjdG9yeSB0byBtYWtlIHRoZSBkZWZhdWx0IHF1ZXJ5IHBhdHRlcm5zIHdvcmsKK3Byb3Blcmx5LgorKworRXh0ZW5kIHRoZSBMREFQIHNlcnZlciB0eXBlIGd1ZXNzaW5nIGJ5IGNoZWNraW5nIGZvciBwcmVzZW5jZSBvZiB0aGUKKyIxLjIuODQwLjExMzU1Ni4xLjQuMTg1MSIgY2FwYWJpbGl0eSB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGlzIExEQVAKK3NlcnZlciBydW5zIEFjdGl2ZURpcmVjdG9yeSBhcyBBRCBMRFMgWzJdLgorKworQWxzbyByZW1vdmUgdGhlIGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlICJkZWZhdWx0TmFtaW5nQ29udGV4dCIKK2F0dHJpYnV0ZSBhcyB3ZSBkb24ndCB1c2UgaXQgYW55d2hlcmUgYW5kLCBieSBkZWZhdWx0LCB0aGlzIGF0dHJpYnV0ZSBpcworbm90IHNldCBvbiBhbiBBRCBMRFMgWzNdCisrCitbMV0gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhNzA1ODg2KFZTLjg1KS5hc3B4ICsKK1syXSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2MyMjMzNjQuYXNweCArCitbM10gaHR0cDovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2NjODE2OTI5KHY9d3MuMTApLmFzcHgKKworKiBBbGxvdyBncm91cCBkZXNjcmlwdGlvbnMgdG8gc3VwcGx5IGVtYWlsIGFuZCBVUkwKKysKK1NvbWUgYmFja2VuZHMgaGF2ZSBleHRlcm5hbCBtYW5hZ2VtZW50IGludGVyZmFjZXMgdGhhdCBhcmUgbm90CitlbWJlZGRlZCBpbnRvIEdlcnJpdCBDb2RlIFJldmlldy4gQWxsb3cgdGhvc2UgYmFja2VuZHMgdG8gc3VwcGx5CithIFVSTCB0byB0aGUgd2ViIG1hbmFnZW1lbnQgaW50ZXJmYWNlIGZvciBhIGdyb3VwLCBzbyBhIHVzZXIgY2FuCittYW5hZ2UgdGhlaXIgbWVtYmVyc2hpcCwgdmlldyBjdXJyZW50IG1lbWJlcnMsIG9yIGRvIHdoYXRldmVyIG90aGVyCitmZWF0dXJlcyB0aGUgZ3JvdXAgc3lzdGVtIG1pZ2h0IHN1cHBvcnQuCisrCitTb21lIGJhY2tlbmRzIGFsc28gaGF2ZSBhbiBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBldmVyeQorZ3JvdXAuIFNlbmRpbmcgZW1haWwgdG8gdGhhdCBhZGRyZXNzIHdpbGwgZGlzdHJpYnV0ZSB0aGUgbWVzc2FnZSB0bwordGhlIGdyb3VwJ3MgbWVtYmVycy4gUGVybWl0IGJhY2tlbmRzIHRvIHN1cHBseSBhbiBvcHRpb25hbCBlbWFpbAorYWRkcmVzcywgYW5kIHVzZSB0aGlzIGluIHRoZSBwcm9qZWN0IGxldmVsIG5vdGlmaWNhdGlvbiBzeXN0ZW0gaWYKK2EgZ3JvdXAgaXMgc2VsZWN0ZWQgYXMgdGhlIHRhcmdldCBmb3IgYSBtZXNzYWdlLgorCisqIEFsbG93IGdyb3VwIGJhY2tlbmRzIHRvIGd1ZXNzIG9uIHJlbGV2YW50IFVVSURzCisrCitFeHBvc2UgYWxsIGNoZWFwbHkga25vd24gZ3JvdXAgVVVJRHMgZnJvbSB0aGUgUHJvamVjdENhY2hlLAorZW51bWVyYXRpbmcgZ3JvdXBzIHVzZWQgYnkgYWNjZXNzIGNvbnRyb2xzLiBUaGlzIGFsbG93cyBhIGJhY2tlbmQKK3RoYXQgaGFzIGEgbGFyZ2UgbnVtYmVyIG9mIGdyb3VwcyB0byBmaWx0ZXIgaXRzIGdldEtub3duR3JvdXBzKCkKK291dHB1dCB0byBvbmx5IGdyb3VwcyB0aGF0IG1heSBiZSByZWxldmFudCBmb3IgdGhpcyBHZXJyaXQgc2VydmVyLgorKworVGhlIGJlc3QgdXNlIGNhc2UgdG8gY29uc2lkZXIgaXMgYW4gTERBUCBzZXJ2ZXIgYXQgYSBsYXJnZQorb3JnYW5pemF0aW9uLiBBIHR5cGljYWwgdXNlciBtYXkgYmVsb25nIHRvIDUwIExEQVAgZ3JvdXBzLCBidXQgb25seQorMyBhcmUgcmVsZXZhbnQgdG8gdGhpcyBHZXJyaXQgc2VydmVyLiBUYWtpbmcgdGhlIGludGVyc2VjdGlvbiBvZgordGhlIHR3byBncm91cHMgbGltaXRzIHRoZSBvdXRwdXQgR2Vycml0IGRpc3BsYXlzIHRvIHVzZXJzLCBvciB1c2VzCit3aGVuIGNvbnNpZGVyaW5nIHNhbWUgZ3JvdXAgdmlzaWJpbGl0eS4KKworKiBBZGQgbW9yZSBmb3JiaWRkZW4gY2hhcmFjdGVycyBmb3IgcHJvamVjdCBuYW1lcworKworYD9gLCBgJWAsIGAqYCwgYDpgLCBgPGAsIGA+YCwgYHxgLCBgJGAsIGBccmAgYXJlIG5vdyBmb3JiaWRkZW4gaW4KK3Byb2plY3QgbmFtZXMuCisKKyogTWFrZSBgZ2Vycml0LnNoYCBMU0IgY29tcGxpYW50CisrCisqKiBBZGQgTFNCIGhlYWRlcnMKKyoqIEFkZCAnc3RhdHVzJyBhcyBzeW5vbnltIGZvciAnY2hlY2snCisqKiBGaXggZXhpdCBzdGF0dXMgY29kZXMgYWNjb3JkaW5nIHRvIGh0dHA6Ly9yZWZzcGVjcy5saW51eC1mb3VuZGF0aW9uLm9yZy9MU0JfMy4yLjAvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL2luaXNjcnB0YWN0Lmh0bWwKKworKiBPcHRpb24gdG8gc3RhcnQgaGVhZGxlc3MgR2Vycml0IGRhZW1vbgorKworQWRkIGAtLWhlYWRsZXNzYCBvcHRpb24gdG8gdGhlIERhZW1vbiB3aGljaCB3aWxsIHN0YXJ0IEdlcnJpdCBkYWVtb24KK3dpdGhvdXQgdGhlIFdlYiBVSSBmcm9udCBlbmQgKGhlYWRsZXNzIG1vZGUpLgorKworVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBydW5uaW5nIEdlcnJpdCBzZXJ2ZXIgd2l0aCBhbiBhbHRlcm5hdGl2ZSAocmVzdAorYmFzZWQpIFVJIG9yIHdoZW4gc3RhcnRpbmcgR2Vycml0IHNlcnZlciBmb3IgdGhlIHB1cnBvc2Ugb2YgYXV0b21hdGVkCitSRVNUL1NTSCBiYXNlZCB0ZXN0aW5nLgorKworQ3VycmVudGx5IHRoaXMgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIHZpYSB0aGUgYC0taGVhZGxlc3NgIG9wdGlvbiBvZgordGhlIGRhZW1vbiBwcm9ncmFtLiBXZSB3b3VsZCBuZWVkIHRvIGludHJvZHVjZSBhIGNvbmZpZyBvcHRpb24gaW4gb3JkZXIKK3RvIHN1cHBvcnQgdGhpcyBmZWF0dXJlIGZvciBkZXBsb3llZCB3YXIgbW9kZS4KKworKiBTaG93IHBhdGggdG8gZ2Vycml0LndhciBpbiBjb21tYW5kIGZvciB1cGdyYWRlIHNjaGVtYQorCitVcGdyYWRlcworfn5+fn5+fn4KKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2MTlbSXNzdWUgMTYxOV06CitFbWJlZGRlZCBKZXR0eSBpcyBub3cgOC4xLjcudjIwMTIwOTEwLgorCisqIEFTTSBieXRlY29kZSBsaWJyYXJ5IGlzIG5vdyA0LjAuCisqIEpHaXQgaXMgbm93IDIuMy4xLjIwMTMwMjIwMTgzOC1yLjIwOC1nNzVlMWJkYi4KKyogYXNjaWlkb2MgOC42LjMgaXMgbm93IHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBkb2N1bWVudGF0aW9uLgorKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTE1NVtJc3N1ZSAxMTU1XToKK3ByZXR0aWZ5IGlzIG5vdyByMjI1CisKKyogVGhlIHVzZWQgR1dUIHZlcnNpb24gaXMgbm93IDIuNS4wCisrCitGaXhlcyBzb21lIGlzc3VlcyB3aXRoIElFOSBhbmQgSUUxMC4KKworQnVnIEZpeGVzCistLS0tLS0tLS0KKworV2ViIFVJCit+fn5+fn4KKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE2NjJbSXNzdWUgMTY2Ml06CisgIERvbid0IHNob3cgZXJyb3Igb24gQUNMIG1vZGlmaWNhdGlvbiBpZiBlbXB0eSBwZXJtaXNzaW9ucyBhcmUgYWRkZWQKKysKK1RoaXMgZXJyb3IgbWVzc2FnZSB3YXMgaW5jb3JyZWN0bHkgZGlzcGxheWVkIGlmIGEgcGVybWlzc2lvbiB3aXRob3V0CitydWxlcyB3YXMgYWRkZWQsIGFsdGhvdWdoIHRoZSBzYXZlIHdhcyBhY3R1YWxseSBzdWNjZXNzZnVsLgorCisqIERvbid0IHNob3cgZXJyb3Igb24gQUNMIG1vZGlmaWNhdGlvbiBpZiBhIHNlY3Rpb24gaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UKKysKK1RoaXMgZXJyb3IgbWVzc2FnZSB3YXMgaW5jb3JyZWN0bHkgZGlzcGxheWVkIGlmIG11bHRpcGxlIHNlY3Rpb25zIGZvcgordGhlIHNhbWUgcmVmIHdlcmUgYWRkZWQsIGFsdGhvdWdoIHRoZSBzYXZlIHdhcyBhY3R1YWxseSBzdWNjZXNzZnVsLgorCisqIExpbmtzIHRvIENHaXQgd2VyZSBicm9rZW4gd2hlbiBgcmVtb3ZlLXN1ZmZpeGAgd2FzIGVuYWJsZWQuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTkyNltJc3N1ZSA5MjZdOgorSW50ZXJuZXQgRXhwbG9yZXIgdmVyc2lvbnMgOSBhbmQgMTAgYXJlIHN1cHBvcnRlZC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTY2NFtJc3N1ZSAxNjY0XToKKyAgUmV2ZXJ0aW5nIGEgY2hhbmdlIGRpZCBub3QgcHJlc2VydmUgdGhlIGNoYW5nZSdzIHRvcGljCisKKyogRml4OiBVc2VyIGNvdWxkIGdldCBhcm91bmQgcmVzdHJpY3Rpb25zIGJ5IHJldmVydGluZyBhIGNvbW1pdAorKworVGhlIEdlcnJpdCBzZXJ2ZXIgbWF5IGVuZm9yY2Ugc2V2ZXJhbCByZXN0cmljdGlvbnMgb24gdGhlIGNvbW1pdAorbWVzc2FnZSAoY2hhbmdlLWlkIHJlcXVpcmVkLCBzaWduZWQtb2ZmLWJ5LCBldGMpLiBBIHVzZXIgd2FzIGFibGUgdG8KK2dldCBhcm91bmQgdGhlc2UgcmVzdHJpY3Rpb25zIGJ5IHJldmVydGluZyBhIGNvbW1pdCB1c2luZyB0aGUgVUkuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE1MThbSXNzdWUgMTUxOF06CisgIFJlc2V0ICdPbGQgVmVyc2lvbiBIaXN0b3J5JyBpZiBkZXBlbmRlbnQgY2hhbmdlIGlzIG9wZW5lZAorKworRm9sbG93aW5nIHRoZSBuYXZpZ2F0aW9uIGxpbmsgaW4gdGhlIGRlcGVuZGVuY2llcyB0YWJsZSBvbiB0aGUKK2NoYW5nZSBzY3JlZW4sIHRoZSB1c2VyIGNhbiBkaXJlY3RseSBuYXZpZ2F0ZSB0byBkZXBlbmRlbnQgY2hhbmdlcy4KK1RoZSB2YWx1ZSBmb3IgJ09sZCBWZXJzaW9uIEhpc3RvcnknIG9mIHRoZSBjdXJyZW50IGNoYW5nZSB3YXMKK2luY29ycmVjdGx5IGFwcGxpZWQgdG8gdGhlIG5ldyBjaGFuZ2UuIElmIHRoZSB2YWx1ZSB3YXMgaW52YWxpZCBmb3IKK3RoZSBuZXcgY2hhbmdlIHRoZSAnT2xkIFZlcnNpb24gSGlzdG9yeScgZmllbGQgYmVjYW1lIGJsYW5rLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNzM2W0lzc3VlIDE3MzZdOgorICBDbGVhciAnT2xkIFZlcnNpb24gSGlzdG9yeScgTGlzdEJveCBiZWZvcmUgcG9wdWxhdGluZyBpdAorKworVGhlIExpc3RCb3ggd2FzIG5vdCBhbHdheXMgY2xlYXJlZCBhbmQgYXMgcmVzdWx0IHRoZSBzYW1lIGVudHJpZXMgd2VyZQorc29tZXRpbWVzIGFkZGVkIG11bHRpcGxlIHRpbWVzIGUuZy4gYWZ0ZXIgcmViYXNpbmcgYSBjaGFuZ2UgaW4gdGhlCitXZWJVSS4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTY3M1tJc3N1ZSAxNjczXToKKyAgRml4IGRpc2FwcGVhcmFuY2Ugb2YgcGF0Y2ggaGVhZGVycyB3aGVuIGNvbXBhcmVkIHBhdGNoZXMgYXJlIGlkZW50aWNhbAorKworV2hlbiB0d28gcGF0Y2hlcyB3ZXJlIGNvbXBhcmVkIHRoYXQgd2VyZSBpZGVudGljYWwgJ05vIERpZmZlcmVuY2VzJyBpcworZGlzcGxheWVkIHRvIHRoZSB1c2VyLiBJbiB0aGlzIGNhc2UgdGhlIHBhdGNoIGhlYWRlcnMgZGlzYXBwZWFyZWQgYW5kCithcyByZXN1bHQgdGhlIHVzZXIgY291bGRuJ3QgY2hhbmdlIHRoZSBwYXRjaCBzZWxlY3Rpb24gYW55bW9yZS4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTc1OVtJc3N1ZSAxNzU5XToKKyAgRml4IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBvbiBpbnRyYWxpbmUgZGlmZgorKworSW4gc29tZSBjYXNlcyBkaXNwbGF5aW5nIHRoZSBpbnRyYWxpbmUgZGlmZiBmYWlsZWQgd2l0aCBhbiBleGNlcHRpb24gbGlrZQordGhpczoKKysKKy0tLS0KK2phdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb246IEFycmF5IGluZGV4IG91dCBvZiByYW5nZTogMTAKKyAgYXQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLlNwYXJzZUZpbGVDb250ZW50Lm1hcEluZGV4VG9MaW5lKFNwYXJzZUZpbGVDb250ZW50LmphdmE6MTQ5KQorICBhdCBjb20uZ29vZ2xlLmdlcnJpdC5wcmV0dGlmeS5jb21tb24uUHJldHR5Rm9ybWF0dGVyLmZvcm1hdChQcmV0dHlGb3JtYXR0ZXIuamF2YToxODgpCisgIGF0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLkFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuZ2V0U3BhcnNlSHRtbEZpbGVCKEFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuamF2YToyODcpCisgIGF0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlNpZGVCeVNpZGVUYWJsZS5yZW5kZXIoU2lkZUJ5U2lkZVRhYmxlLmphdmE6MTEzKQorICBhdCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5BYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlLmRpc3BsYXkoQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZS5qYXZhOjIzOCkKKyAgYXQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuUGF0Y2hTY3JlZW4ub25SZXN1bHQoUGF0Y2hTY3JlZW4uamF2YTo0NDQpCisuLi4KKy0tLS0KKysKK1RoaXMgaGFwcGVuZWQgd2hlbiB0aGUgb2xkIGxpbmUgd2FzOgorKworLS0tLQorICBmb28tb2xkPExGPgorLS0tLQorKworYW5kIHRoZSBuZXcgbGluZSB3YXM6CisrCistLS0tCisgIGZvby1uZXc8Q1JMRj4KKy0tLS0KKworKiBQcmV2ZW50IGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBvbiB1c2VyJ3MgRnVsbCBOYW1lCisrCitTdHJpcCBvZmYgdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBmcm9tIHRoZSBGdWxsIE5hbWUgdGhhdCB0aGUKK3VzZXIgZW50ZXJzIG9uIHRoZSBDb250YWN0IEluZm9ybWF0aW9uIGZvcm0uCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE0ODBbSXNzdWUgMTQ4MF06CisgIFNob3cgcHJvcGVyIGVycm9yIG1lc3NhZ2UgaWYgcmVnaXN0ZXJpbmcgZW1haWwgYWRkcmVzcyBmYWlscworCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD04MTZbSXNzdWUgODE2XToKKyAgRHVlIHRvIGlzc3VlcyB3aXRoIHRoZSBkaWZmX2ludHJhbGluZSBjYWNoZSB0aGUgZmlsZSBpbmRlbnRpb24gaW4gdGhlCisgIFNpZGUtQnktU2lkZSBkaWZmIHdhcyBzb21ldGltZXMgd3JvbmcuCisKKyogTWFrZSByZWJhc2UgZmFpbGVkIGFuZCBtZXJnZSBmYWlsZWQgbWVzc2FnZXMgY29uc2lzdGVudAorCisqIFNlbGVjdCAnUHJvamVjdHMnIG1lbnUgb24gbG9hZGluZyBvZiBhIHByb2plY3Qgc2NyZWVuCisrCitJZiBpbiB0aGUgdG9wIGxldmVsIG1lbnUgJ0FsbCcgaXMgc2VsZWN0ZWQgYW5kIHRoZSB1c2VyIG5hdmlnYXRlcyB0bworYSBjaGFuZ2UgYW5kIHRoZW4gZnJvbSB0aGUgY2hhbmdlIHRvIHRoZSBwcm9qZWN0IGJ5IGNsaWNraW5nIG9uIHRoZQorcHJvamVjdCBsaW5rIGluIHRoZSBDaGFuZ2VJbmZvQmxvY2ssIHRoZSBwcm9qZWN0IHNjcmVlbiBpcyBsb2FkZWQgYnV0Cit0aGUgJ1Byb2plY3RzJyBtZW51IHdhcyBub3Qgc2VsZWN0ZWQuCisKKyogRml4IGRpc3BsYXkgaXNzdWVzIGZvciBpbmxpbmUgY29tbWVudHMgYW5kIGlubGluZSBjb21tZW50IGVkaXRvcnMKKysKKyoqIFNvbWV0aW1lcyBhIHNlY29uZCBjb21tZW50IGVkaXRvciB3YXMgc2hvd24gaW5zdGVhZCBvZiB1c2luZyB0aGUKKyAgIGV4aXN0aW5nIGNvbW1lbnQgZWRpdG9yLgorKiogRml4IGRvdWJsaWNhdGVkIGJvcmRlciBsaW5lIGJldHdlZW4gY29tbWVudHMuCisqKiBTb21ldGltZXMgdGhlIHBhcnRzIG9mIHRoZSBib3JkZXIgd2VyZSBtaXNzaW5nIHdoZW4gYSBjb21tZW50IHdhcworICAgZXhwYW5kZWQuCisqKiBGaXggZGlzcGxheWluZyB0aGUgYmx1ZSBsaW5lIHRoYXQgbWFya3MgdGhlIGN1cnJlbnQgbGluZSB3aGVuIHRoZXJlCisgICBhcmUgc2V2ZXJhbCBwdWJsaXNoZWQgY29tbWVudHMuCisqKiBTb21ldGltZXMgb24gZGlzY2FyZCBvZiBhIGNvbW1lbnQgc29tZSBmcmFtZXMgb2YgdGhlIGNvbW1lbnQgZWRpdG9yCisgICBzdGF5ZWQgYW5kIHNvbWUgYm9yZGVyIGxpbmVzIG9mIG5laWdoYm91ciBjb21tZW50cyBkaXNhcHBlYXJlZC4KKworKiBJbiBkaWZmIHZpZXcgZG9uJ3QgbGV0IGFycm93IGNvbHVtbiBhY2NlcHQgY2xpY2tzLgorCisqIEZpeCBkaXNwbGF5IG9mIGNvbW1pdCBtZXNzYWdlCisrCitJZiB0aGVyZSBhcmUgbm8gSFRNTCB0YWdzIGluIHRoZSB0ZXh0LCBqdXN0IGJyZWFrIG9uIGxpbmVzLgorCisqIFVwb24gc2VsZWN0aW9uIGluIEFkZE1lbWJlckJveCwgZm9jdXMgdGhlIGJveCdzIHRleHQgZmllbGQKKysKK0luIHRoZSBjaGFuZ2Ugc2NyZWVuLCBhZnRlciBjbGlja2luZyBvbiBhbiBlbGVtZW50IG9mIHRoZSAnQWRkCitSZXZpZXdlcicgc3VnZ2VzdGlvbiBsaXN0LCB1c2VycyBleHBlY3QgdG8gYmUgYWJsZSB0byBhZGQgdGhlIHJldmlld2VyCitieSBoaXR0aW5nIGVudGVyLiBUaGlzIGRpZCBub3Qgd29yayBpbiBGaXJlZm94LgorCisqIEZpeCBlbnRlciBrZXkgZGV0ZWN0aW9uIGluIHByb2plY3QgY3JlYXRpb24gc2NyZWVuCisrCitUaGUgZW50ZXIga2V5IGRldGVjdGlvbiB3YXMgbm90IHdvcmtpbmcgaW4gYWxsIGJyb3dzZXJzIChlLmcuIEZpcmVmb3gpLgorCisqIERpc3BsYXkgYSB0b29sdGlwIGZvciBhbGwgdGlueSBpY29ucyBhbmQgZW5zdXJlIHRoYXQgdGhlIGN1cnNvciBpcworICBzaG93biBhcyBwb2ludGVyIHdoZW4gaG92ZXJpbmcgb3ZlciB0aGVtLgorCisqIENsZWFuIHF1ZXJ5IHN0cmluZyB3aGVuIHN3aXRjaGluZyBwYWdlcworKworSWYgd2UgbG9hZCBhIHBhZ2Ugd2l0aG91dCBhIHF1ZXJ5IHN0cmluZywgc3VjaCBhcyBQcm9qZWN0cy0+TGlzdCwKK015LT5DaGFuZ2VzLCBvciBTZXR0aW5ncywgaXQgbWlnaHQgYmUgY29uZnVzaW5nIHRvIHNob3cgdGhlIG9sZCBxdWVyeQorc3RyaW5nIGZyb20gdGhlIHByZXZpb3VzIHBhZ2UuIFRoZSBxdWVyeSBzdHJpbmcgaXMgbm93IGNsZWFyZWQgb3V0Cit3aGVuIHN3aXRjaGluZyBwYWdlcywgbGVhdmluZyB0aGUgaGVscCB0ZXh0IHZpc2libGUuCisKKyogRml4IGhpZ2hsaWdodGluZyBpbiBzZWFyY2ggc3VnZ2VzdGlvbnMKKysKK1RoZSBwcm92aWRlZCBzdWdnZXN0aW9ucyBzaG91bGQgaGlnaGxpZ2h0IHRoZSBwYXJ0IHRoYXQgdGhlIHVzZXIgaGFzCithbHJlYWR5IHR5cGVkIGFzIGJvbGQgdGV4dC4gVGhpcyBvbmx5IHdvcmtlZCBmb3IgdGhlIGZpcnN0IG9wZXJhdG9yLgorRm9yIHN1Z2dlc3Rpb25zIG9mIGFueSBmdXJ0aGVyIG9wZXJhdG9yIG5vIGhpZ2h0bGlnaHRpbmcgd2FzIGRvbmUuCisKKyogRml4IHN0eWxlIG9mIGhpbnQgdGV4dCBpbiBzZWFyY2ggYm94IG9uIGluaXRpYWwgcGFnZSBsb2FkCisrCitUaGUgaGludCB0ZXh0IHNob3VsZCBiZSBhIGxpZ2h0IGdyYXkgb24gdGhlIHdoaXRlIGJhY2tncm91bmQsCitidXQgd2FzIGNvbWluZyB1cCBibGFjayBvbiBpbml0aWFsIHBhZ2UgbG9hZCBkdWUgdG8gYSBzdHlsZSBzZXR1cAorb3JkZXJpbmcgaXNzdWUgYmV0d2VlbiB0aGUgU2VhcmNoUGFuZWwgYW5kIHRoZSBIaW50VGV4dEJveC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTY2MVtJc3N1ZSAxNjYxXToKKyAgVXBkYXRlIGxpbmtzIHRvIENoYW5nZS1JZCBhbmQgU2lnbmVkLW9mZi1ieSBkb2N1bWVudGF0aW9uIG9uIHByb2plY3QgaW5mbworICBzY3JlZW4KKworKiBVc2UgaHJlZj0iamF2YXNjcmlwdDsiIGZvciBBbGwge1NpZGUtYnktU2lkZSxVbmlmaWVkfSBsaW5rcworKworVGhlc2UgbGlua3Mgc2hvdWxkbid0IGhhdmUgYW4gYW5jaG9yIGxvY2F0aW9uLiBUaGVyZSBpcyBub3RoaW5nIGZvcgordGhlIGJyb3dzZXIgdG8gcmVtZW1iZXIgb3IgdmlzaXQgaWYgaXQgd2VyZSBvcGVuZWQgaW4gYSBuZXcgdGFiIGZvcgorZXhhbXBsZS4KKworKiBJbXByb3ZlIG1lc3NhZ2UgZm9yIHVuc2F0aXNmaWFibGUgZGVwZW5kZW5jaWVzCisrCitJZiBhIGNoYW5nZSBjYW5ub3QgYmUgbWVyZ2VkIGR1ZSB0byB1bnNhdGlzZmlhYmxlIGRlcGVuZGVuY2llcyBhCitjb21tZW50IGlzIGFkZGVkIHRvIHRoZSBjaGFuZ2UgdGhhdCBsaXN0cyB0aGUgbWlzc2luZyBjb21taXRzIGFuZCBzYXlzCit0aGF0IGEgcmViYXNlIGlzIG5lY2Vzc2FyeS4KKysKK0ZvciBlYWNoIG1pc3NpbmcgY29tbWl0IHRoZSBjb21tZW50IHNhaWQgIkRlcGVuZHMgb24gcGF0Y2ggc2V0IFgKK29mIC4uLiwgaG93ZXZlciB0aGUgY3VycmVudCBwYXRjaCBzZXQgaXMgWS4iCisrCitJZiBtdWx0aXBsZSBjb21taXRzIGFyZSBtaXNzaW5nIGl0IG1heSBiZSB0aGF0IGZvciBzb21lIGNvbW1pdHMgdGhlCitkZXBlbmRlbmN5IGlzIG5vdCBvdXRkYXRlZCAoWCA9PSBZKS4gSW4gdGhpcyBjYXNlIHRoZSBtZXNzYWdlIHdhcworY29uZnVzaW5nLgorKworIiwgaG93ZXZlciB0aGUgY3VycmVudCBwYXRjaCBzZXQgaXMgWS4iIGlzIG5vdyBza2lwcGVkIGlmIFkgPT0gWC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTg0M1tJc3N1ZSAxODQzXToKKyAgRW5hYmxlIHRoZSAiQ3JlYXRlIFByb2plY3QiIGFuZCAiQ3JlYXRlIEdyb3VwIiBidXR0b25zIHdoZW4gcGFzdGluZyB0aGUgbmFtZQorICBpbnRvIHRoZSB0ZXh0IGJveC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTM3MFtJc3N1ZSAxMzcwXToKKyAgRml4IFBhdGNoU2NyZWVuIGxlYWsgd2hlbiBtb3ZpbmcgYmV0d2VlbiBmaWxlcy4KKworKiBQcmV2ZW50IGFjY291bnQncyBmdWxsIG5hbWUgZnJvbSBiZWluZyBzZXQgdG8gZW1wdHkgc3RyaW5nLiAgU2V0IGl0IHRvCisgIG51bGwgaW5zdGVhZC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTY4MltJc3N1ZSAxNjgyXToKK0NvcnJlY3RseSBoYW5kbGUgcGF0aHMgd2l0aCBVUkwtZXNjYXBlZCBjaGFyYWN0ZXJzCisrCitVUkwtdW5lc2NhcGUgdGhlIHBhdGggcG9ydGlvbiBvZiBhIGNoYW5nZSBoaXN0b3J5IHRva2VuIHRvIGNvcnJlY3RseQoraGFuZGxlIHBhdGhzIHdpdGggVVJMLWVzY2FwYWJsZSBjaGFyYWN0ZXJzLCBpLmUuICcrJywgJyAnLCBldGMuCisKKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE5MTVbSXNzdWUgMTkxNV06CitEb24ndCBzaG93IG5vbi12aXNpYmxlIGRyYWZ0cyBpbiB0aGUgZGlmZiBzY3JlZW5zLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xODAxW0lzc3VlIDE4MDFdOgorQ29ycmVjdGx5IGtlZXAgcGF0Y2ggc2V0IG9yZGVyaW5nIGFmdGVyIGEgbmV3IHBhdGNoIHNldCBpcyBhZGRlZCB2aWEKK3RoZSBXZWIgVUkuCisKK1JFU1QgQVBJCit+fn5+fn5+fgorKiBGaXggcmV0dXJuaW5nIG9mICdFbWFpbCBSZXZpZXdlcnMnIGNhcGFiaWxpdHkgdmlhIFJFU1QKKysKK1RoZSBgL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzL2AgZGlkbid0IHJldHVybiB0aGUgJ0VtYWlsIFJldmlld2VycycKK2NhcGFiaWxpdHkgd2hlbiBpdCB3YXMgbm90IGV4cGxpY2l0bHkgYXNzaWduZWQsIGFsdGhvdWdoIGJ5IGRlZmF1bHQKK2V2ZXJ5b25lIGhhcyB0aGUgJ0VtYWlsIFJldmlld2VycycgY2FwYWJpbGl0eS4KKysKK0lmICdFbWFpbCBSZXZpZXdlcnMnIGNhcGFiaWxpdHkgd2FzIGFsbG93ZWQgb3IgZGVuaWVkLAorYC9hY2NvdW50cy9zZWxmL2NhcGFiaWxpdGllcy9gIHJldHVybmVkIHRoZSAnRW1haWwgUmV2aWV3ZXJzJworY2FwYWJpbGl0eSBhbHdheXMgYXMgdHJ1ZSwgd2hpY2ggd2FzIHdyb25nIGZvciB0aGUgREVOWSBjYXNlLgorCisqIFByb3ZpZGUgYSBtb3JlIGRlc2NyaXB0aXZlIGVycm9yIG1lc3NhZ2UgZm9yIHVuYXV0aGVudGljYXRlZCBSRVNUCisgIEFQSSBhY2Nlc3MKKworR2l0Cit+fn4KKyogVGhlIHdpbGRjYXJkIGAuYCBpcyBub3cgcGVybWl0dGVkIGluIHJlZmVyZW5jZSByZWdleCBydWxlcy4KKworKiBDaGVja2luZyBpZiBhIGNoYW5nZSBpcyBtZXJnZWFibGUgbm8gbG9uZ2VyIHdyaXRlcyB0byB0aGUgcmVwb3NpdG9yeS4KKworKiBTdWJtaXR0ZWQgYnV0IHVubWVyZ2VkIGNoYW5nZXMgYXJlIHBlcmlvZGljYWxseSByZXRyaWVkLiBUaGlzIGlzCisgIG5lY2Vzc2FyeSBmb3IgYSBtdWx0aS1tYXN0ZXIgY29uZmlndXJhdGlvbiB3aGVyZSB0aGUgc2Vjb25kIG1hc3RlcgorICBtYXkgbmVlZCB0byByZXRyeSBhIGNoYW5nZSBub3QgeWV0IG1lcmdlZCBieSB0aGUgZmlyc3QuIFBsZWFzZSBub3RlCisgIHdlIHN0aWxsIGRvIG5vdCBiZWxpZXZlIHRoaXMgaXMgc3VmZmljaWVudCB0byBlbmFibGUgbXVsdGktbWFzdGVyLgorCisqIFJldHJ5IG1lcmdlIGFmdGVyIExPQ0tfRkFJTFVSRSB3aGVuIHVwZGF0aW5nIGJyYW5jaAorKworSWYgdGhlIHByb2plY3QgcmVxdWlyZXMgZmFzdC1mb3J3YXJkcywgdGhlIG1lcmdlIGNhbm5vdCBzdWNjZWVkIG9uY2UKK2EgbG9jayBmYWlsdXJlIG9jY3VycywgYnV0IGluIG90aGVyIGNhc2VzLCBpdCBpcyBzYWZlIHRvIHJldHJ5IHRoZQorbWVyZ2UgaW1tZWRpYXRlbHkuCisKKyogRG8gbm90IGF1dG9tYXRpY2FsbHkgYWRkIHJldmlld2VycyBmcm9tIGZvb3RlciBsaW5lcyB0byBkcmFmdCBwYXRjaCBzZXRzCisrCitHZXJyaXQgYWxyZWFkeSBhdm9pZHMgYWRkaW5nIHJldmlld2VycyBmcm9tIGZvb3RlciBsaW5lcyB3aGVuIGEgbmV3CitkcmFmdCBjaGFuZ2UgaXMgY3JlYXRlZC4gTm93IHRoZSBzYW1lIGlzIGRvbmUgZm9yIGRyYWZ0IHBhdGNoIHNldHMuCisKKyogQWRkIHVzZXJzIG1lbnRpb25lZCBpbiBjb21taXQgZm9vdGVyIGFzIHJldmlld2VycyBvbiBkcmFmdCBwdWJsaXNoCisKKyogSGlkZSBhbnkgZXhpc3RpbmcgbWFnaWMgYnJhbmNoZXMgZHVyaW5nIHB1c2gKKysKK0lmIHRoZXJlIGlzIGEgbWFnaWMgYnJhbmNoIHZpc2libGUgZHVyaW5nIHB1c2gsIGp1c3QgaGlkZSBpdCBmcm9tIHRoZQorY2xpZW50LiBBZG1pbmlzdHJhdG9ycyBjYW4gY2xlYXIgdGhlc2UgYnkgYWNjZXNzaW5nIHRoZSByZXBvc2l0b3J5CitkaXJlY3RseS4KKworKiBQcmV2ZW50IGZyb20gZGVsZXRpbmcgYHJlZnMvY2hhbmdlcy9gCisrCitFdmVyeXRoaW5nIHVuZGVyIGByZWZzL2NoYW5nZXMvYCBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IEdlcnJpdCwgdXNlcnMKK3Nob3VsZG4ndCBiZSBhYmxlIHRvIGRlbGV0ZSBhIHBhcnRpY3VsYXIgcGF0Y2ggc2V0IG9yIGEgd2hvbGUgY2hhbmdlCitmcm9tIHRoZSByZXZpZXcgcHJvY2Vzcy4KKworKiBVcGRhdGUgZGVzY3JpcHRpb24gZmlsZSBpbiBHaXQKKysKK1doZW4gd3JpdGluZyB0aGUgZGVzY3JpcHRpb24gdG8gYHByb2plY3QuY29uZmlnYCwgaXQgaXMgYWxzbyBuZWNlc3NhcnkKK3RvIHdyaXRlIGl0IHRvIHRoZSBkZXNjcmlwdGlvbiBmaWxlIGluIHRoZSByZXBvc2l0b3J5IHNvIHRoZSBzYW1lIHRleHQKK2lzIHZpc2libGUgaW4gQ0dpdCBvciBHaXRXZWIuCisKKyogV3JpdGUgdmFsaWQgcmVmbG9nIGZvciBgSEVBRGAgd2hlbiBjcmVhdGluZyB0aGUgYEFsbC1Qcm9qZWN0c2AKKyAgcHJvamVjdAorKworV2hlbiB0aGUgYEFsbC1Qcm9qZWN0c2AgcHJvamVjdCBpcyBjcmVhdGVkIGR1cmluZyB0aGUgc2NoZW1hCitpbml0aWFsaXphdGlvbiwgYEhFQURgIGlzIHNldCB0byBwb2ludCB0byB0aGUgYHJlZnMvbWV0YS9jb25maWdgCiticmFuY2guIFdoZW4gYEhFQURgIGlzIHVwZGF0ZWQgYW4gZW50cnkgaW50byB0aGUgcmVmbG9nIGlzIHdyaXR0ZW4uCitUaGlzIHJlZiBsb2cgZW50cnkgc2hvdWxkIGNvbnRhaW4gdGhlIElEIG9mIHRoZSBpbml0aWFsIGNvbW1pdCBhcwordGFyZ2V0LCBidXQgaW5zdGVhZCB0aGUgdGFyZ2V0IHdhcyB0aGUgemVybyBJRC4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTcwMltJc3N1ZSAxNzAyXToKKyAgRml4OiAnaW50ZXJuYWwgc2VydmVyIGVycm9yJyB3aGVuIHB1c2hpbmcgdGhlIHNhbWUgY29tbWl0IHR3aWNlCisrCitPbiB0aGUgc2Vjb25kIHB1c2ggb2YgdGhlIHNhbWUgY29tbWl0IHRvIGByZWZzL2Zvci88YnJhbmNoIG5hbWU+YCwgR2Vycml0CityZXR1cm5zICdubyBuZXcgY2hhbmdlcycuCisrCitIb3dldmVyIGlmIHRoZSB1c2VyIHB1c2hlZCB0byAncmVmcy9jaGFuZ2VzLzxjaGFuZ2UgaWQ+JywgR2Vycml0IHJldHVybmVkCisnaW50ZXJuYWwgc2VydmVyIGVycm9yJy4KKworKiBNYXRjaCBhbGwgZ2l0IGZldGNoL2Nsb25lL3B1c2ggY29tbWFuZHMgdG8gdGhlIGNvbW1hbmQgZXhlY3V0b3IKKysKK1JvdXRlIG5vdCBqdXN0IGAvcC9gIGJ1dCBhbnkgR2l0IGFjY2VzcyB0byB0aGUgc2FtZSB0aHJlYWQgcG9vbCBhcyB0aGUKK1NTSCBzZXJ2ZXIgaXMgdXNpbmcsIGFsbG93aW5nIGFsbCByZXF1ZXN0cyB0byBjb21wZXRlIGZhaXJseSBmb3IKK3Jlc291cmNlcy4KKworKiBGaXggYXV0byBjbG9zaW5nIG9mIGNoYW5nZXMgb24gZGlyZWN0IHB1c2gKKysKK1doZW4gYSBjb21taXQgd2FzIGRpcmVjdGx5IHB1c2hlZCBpbnRvIGEgcmVwb3NpdG9yeSAoYnlwYXNzaW5nIGNvZGUKK3JldmlldykgYW5kIHRoaXMgY29tbWl0IGhhZCBhIENoYW5nZS1JZCBpbiBpdHMgY29tbWl0IG1lc3NhZ2UgdGhlbiB0aGUKK2NvcnJlc3BvbmRpbmcgY2hhbmdlIHdhcyBub3QgYXV0b21hdGljYWxseSBjbG9zZWQgaWYgaXQgd2FzIG9wZW4uCisKKyogU2V0IGNoYW5nZSBzdGF0ZSB0byBORVcgaWYgbWVyZ2UgZmFpbHMgZHVlIHRvIG5vbi1leGlzdGluZyBkZXN0IGJyYW5jaAorKworSWYgYSBzdWJtaXR0ZWQgY2hhbmdlIGZhaWxlZCB0byBtZXJnZSBiZWNhdXNlIHRoZSBkZXN0aW5hdGlvbiBicmFuY2gKK2RpZG4ndCBleGlzdCBhbnltb3JlLCBpdCBzdGF5ZWQgaW4gc3RhdGUgJ1N1Ym1pdHRlZCwgTWVyZ2UgUGVuZGluZycuCitUaGlzIG1lYW50IEdlcnJpdCB3YXMgcmUtYXR0ZW1wdGluZyB0byBtZXJnZSB0aGlzIGNoYW5nZSAoZS5nLiBvbgorc3RhcnR1cCksIGJ1dCB0aGlzIGRpZG4ndCBtYWtlIHNlbnNlLiBFaXRoZXIgdGhlIGJyYW5jaCBkaWQgc3RpbGwgbm90CitleGlzdCAodGhlbiB0aGVyZSB3YXMgbm8gbmVlZCB0byB0cnkgbWVyZ2luZyBpdCkgb3IgYSBuZXcgYnJhbmNoIHdpdGgKK3RoZSBvbGQgbmFtZSB3YXMgY3JlYXRlZCAodGhlbiBpdCB3YXMgcXVlc3Rpb25hYmxlIGlmIHRoZSBjaGFuZ2Ugc2hvdWxkCitzdGlsbCBiZSBtZXJnZWQgaW50byB0aGlzIGJyYW5jaCkuIFRoaXMgaXMgd2h5IGl0J3MgYmV0dGVyIHRvIHNldCB0aGUKK2NoYW5nZSBiYWNrIHRvIHRoZSAnUmV2aWV3IGluIFByb2dyZXNzJyBzdGF0ZSBhbmQgdXBkYXRlIGl0IHdpdGggYQorbWVzc2FnZSBzYXlpbmcgdGhhdCBpdCBjb3VsZG4ndCBiZSBtZXJnZWQgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24KK2JyYW5jaCBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCisrCitJbiBhZGRpdGlvbiBHZXJyaXQgd2FzIHdyaXRpbmcgYW4gZXJyb3IgaW50byB0aGUgZXJyb3IgbG9nIGlmIGEgY2hhbmdlCitjb3VsZG4ndCBiZSBtZXJnZWQgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gYnJhbmNoIHdhc3MgbWlzc2luZy4KK1RoYXQgd2FzIG5vdCByZWFsbHkgYSBzZXJ2ZXIgZXJyb3IgYW5kIGlzIG5vdCBsb2dnZWQgYW55bW9yZS4KKworKiBGaXggTlBFIHdoZW4gcHVzaGluZyBhIHBhdGNoIHdpdGggYW4gaW52YWxpZCBhdXRob3Igd2l0aAorICBgRm9yZ2UgQXV0aG9yYCBwZXJtaXNzaW9ucworCisqIEZpeCBkdXBsaWNhdGVkIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZXZlbnQgb24gcHJvamVjdCBjcmVhdGlvbi4KKysKK0NyZWF0aW5nIGEgbmV3IEdlcnJpdCBwcm9qZWN0IHdhcyBmaXJpbmcgdGhlIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZXZlbnQKK2ZvciB0aGUgYHJlZnMvbWV0YS9jb25maWdgIGJyYW5jaCB0d28gdGltZXMuCisKKyogRml4IGVycm9yIGxvZyBtZXNzYWdlIGluIFJlY2VpdmVDb21taXRzCisrCitXaGVuIHRoZSBjcmVhdGlvbiBvZiBvbmUgb3IgbW9yZSByZWZlcmVuY2VzIGZhaWxlZCBSZWNlaXZlQ29tbWl0cyBmYWlsZWQKK3dpdGggJ2ludGVybmFsIHNlcnZlciBlcnJvcicgYW5kIHdyb3RlIHRoZSBmb2xsb3dpbmcgZXJyb3IgbG9nOgorIk9ubHkgWCBvZiBZIG5ldyBjaGFuZ2UgcmVmcyBjcmVhdGVkIGluIHh4eDsgYWJvcnRpbmciCitUaGUgcHJpbnRlZCB2YWx1ZSBmb3IgWSBjb3VsZCBiZSB3cm9uZyBzaW5jZSBpdCBkaWRuJ3QgaW5jbHVkZSB0aGUKK3JlcGxhY2VDb3VudC4gQXMgYSByZXN1bHQsIGEgY29uZnVzaW5nIG1lc3NhZ2UgbGlrZQorIk9ubHkgMCBvZiAwIG5ldyBjaGFuZ2UgcmVmcyBjcmVhdGVkIGluIHh4eDsgYWJvcnRpbmciCitjb3VsZCBhcHBlYXIgaW4gdGhlIGVycm9yIGxvZy4KKworU1NICit+fn4KKyogYHJldmlldyAtLXJlc3RvcmVgIGFsbG93cyBhIHJldmlldyBzY29yZSB0byBiZSBhZGRlZCBvbiB0aGUgcmVzdG9yZWQgY2hhbmdlLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNzIxW0lzc3VlIDE3MjFdOgorICBgcmV2aWV3IC0tbWVzc2FnZWAgb25seSBhZGRzIHRoZSBtZXNzYWdlIG9uY2UuCisKKyogYGxzLWdyb3Vwc2AgcHJpbnRzICJOL0EiIGlmIHRoZSBncm91cCdzIG5hbWUgaXMgbm90IHNldC4KKworKiBgc2V0LXByb2plY3QtcGFyZW50IC0tY2hpbGRyZW4tb2ZgOiBGaXggZ2V0dGluZyBwYXJlbnQgZm9yIGxldmVsIDEgcHJvamVjdHMKKysKK0ZvciBkaXJlY3QgY2hpbGQgcHJvamVjdHMgb2YgdGhlIGBBbGwtUHJvamVjdHNgIHByb2plY3QgdGhlIG5hbWUgb2YgdGhlCitwYXJlbnQgcHJvamVjdCB3YXMgaW5jb3JyZWN0bHkgcmV0cmlldmVkIGlmIHRoZSBwYXJlbnQgbmFtZSB3YXMgbm90CitleHBsaWNpdGx5IHN0b3JlZCBhcyBgQWxsLVByb2plY3RzYCBpbiB0aGUgcHJvamVjdC5jb25maWcgZmlsZS4KKworKiBGaXggTlBFIHdoZW4gYWJhbmRvbmluZyBjaGFuZ2Ugd2l0aCBpbnZhbGlkIGF1dGhvcgorKworSWYgdGhlIGF1dGhvciBvZiBhIGNoYW5nZSBpc24ndCBrbm93biB0byBHZXJyaXQgKHB1c2hlZCB3aXRoCitgRm9yZ2UgQXV0aG9yYCBwZXJtaXNzaW9ucyksIHRyeWluZyB0byBhYmFuZG9uIHRoYXQgY2hhbmdlIG92ZXIgU1NICitmYWlsZWQgd2l0aCBhbiBOUEUuCisKKyogRml4IHNldHRpbmcgYWNjb3VudCdzIGZ1bGwgbmFtZSB2aWEgc3NoLgorCitRdWVyeQorfn5+fn4KKyogbGluazpodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC9pc3N1ZXMvZGV0YWlsP2lkPTE3MjlbSXNzdWUgMTcyOV06CisgIEZpeCBxdWVyeSBieSAnbGFiZWw6VmVyaWZpZWQ9MCcKKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTc3MltJc3N1ZSAxNzcyXToKKyAgU2V0IGBfbW9yZV9jaGFuZ2VzYCBpZiByZXN1bHQgaXMgbGltaXRlZCBkdWUgdG8gY29uZmlndXJlZCBxdWVyeSBsaW1pdAorCisqIEZpeCBxdWVyeSBjb3N0IGZvciAic3RhdHVzOm1lcmdlZCBjb21taXQ6YzBmZmVlIgorCitQbHVnaW5zCit+fn5+fn5+CisqIFNraXAgZGlzYWJsZWQgcGx1Z2lucyBvbiByZXNjYW4KKysKK0luIGEgYmFja2dyb3VuZCB0aHJlYWQgR2Vycml0IHBlcmlvZGljYWxseSBzY2FucyBmb3IgbmV3IG9yIGNoYW5nZWQKK3BsdWdpbnMuIE9uIGV2ZXJ5IHN1Y2ggYSByZXNjYW4gZGlzYWJsZWQgcGx1Z2lucyB3ZXJlIGxvYWRlZCBhbmQgYSBuZXcKK2NvcHkgb2YgdGhlaXIgamFyIGZpbGVzIHdhcyBzdG9yZWQgaW4gdGhlIHJldmlldyBzaXRlJ3MgdG1wIGZvbGRlci4KKworKiBGaXggY2xlYW51cCBvZiBwbHVnaW5zIGZyb20gdG1wIGZvbGRlciBvbiBncmFjZWZ1bCBHZXJyaXQgc2h1dGRvd24KKysKK0xvYWRlZCBwbHVnaW4gamFycyBhcmUgY29waWVkIHRvIHRoZSByZXZpZXcgc2l0ZSdzIHRtcCBmb2xkZXIgdG8gc3VwcG9ydAoraG90IHVwZGF0ZXMgb2YgdGhlIHBsdWdpbiBqYXJzIGluIHRoZSBwbHVnaW5zIGZvbGRlci4gT24gR2Vycml0IHNodXRkb3duCit0aGVzZSBjb3BpZXMgb2YgdGhlIGphciBmaWxlcyBzaG91bGQgYmUgY2xlYW5lZCB1cC4gRm9yIHRoaXMgcHVycG9zZSBhCitDbGVhbnVwSGFuZGxlIGlzIGNyZWF0ZWQsIGJ1dCB0aGUgQ2xlYW51cEhhbmRsZSB3YXNuJ3QgZW5xdWV1ZWQgaW4gdGhlCitjbGVhbnVwUXVldWUgd2hpY2ggaXMgd2h5IGNsZWFudXAgb24gR2Vycml0IHNodXRkb3duIGRpZG4ndCBoYXBwZW4uCisKKyogUmVhdHRlbXB0IGRlbGV0aW9uIG9mIHBsdWdpbiBqYXJzIGZyb20gdG1wIGZvbGRlciBvbiBKVk0gdGVybWluYXRpb24KKysKK0xvYWRlZCBwbHVnaW4gamFycyBhcmUgY29waWVkIHRvIHRoZSByZXZpZXcgc2l0ZSdzIHRtcCBmb2xkZXIgdG8gc3VwcG9ydAoraG90IHVwZGF0ZXMgb2YgdGhlIHBsdWdpbiBqYXJzIGluIHRoZSBwbHVnaW5zIGZvbGRlci4gT24gR2Vycml0IHNodXRkb3duCit0aGVzZSBjb3BpZXMgb2YgdGhlIGphciBmaWxlcyBzaG91bGQgYmUgY2xlYW5lZCB1cC4gRm9yIHRoaXMgcHVycG9zZSBhCitDbGVhbnVwSGFuZGxlIGlzIGNyZWF0ZWQuIFRoZSBkZWxldGlvbiBvZiB0aGUgdG1wIGZpbGUgaW4gdGhlCitDbGVhbnVwSGFuZGxlIGNhbiBmYWlsIGFsdGhvdWdoIHRoZSBqYXIgZmlsZSB3YXMgY2xvc2VkLiBJbiB0aGlzIGNhc2UKK3JlYXR0ZW1wdCB0aGUgZGVsZXRpb24gb24gdGVybWluYXRpb24gb2YgdGhlIHZpcnR1YWwgbWFjaGluZS4gVGhpcworbm9ybWFsbHkgc3VjY2VlZHMuCisKKyogRml4IHVubG9hZGluZyBvZiBwbHVnaW5zCisrCitXaGVuIHR3byBwbHVnaW5zLCBzYXkgcGx1Z2luQSwgYW5kIHBsdWdpbkIgaGFkIGJlZW4gbG9hZGVkLCBhbmQgcGx1Z2luQQord2FzIHJlbW92ZWQgZnJvbSAkc2l0ZVBhdGgvcGx1Z2lucywgcGx1Z2luQSBnb3Qgc3RvcHBlZCwgYW5kIGEgY2xlYW5pbmcKK3J1biB3YXMgb3JkZXJlZC4gQnV0IHRoaXMgY2xlYW5pbmcgcnVuIGNsZWFuZWQgYm90aCBwbHVnaW5zIGFuZCBib3RoCitwbHVnaW5zIGhhZCB0aGVpciBqYXJzIHJlbW92ZWQuIFRoaXMgbGVmdCBwbHVnaW5CIHZpc2libGUgdG8gR2Vycml0CithbHRob3VnaCBpdCdzIGJhY2tpbmcgamFyIHdhcyBnb25lLiBVcG9uIGNhbGxpbmcgbm90IHlldCBpbml0aWFsaXplZAorcGFydHMgb2YgcGx1Z2luQiAoZS5nLjogdmlld2luZyBub3QgeWV0IHZpZXdlZCBEb2N1bWVudGF0aW9uIHBhZ2VzIG9mCitwbHVnaW5CKSwgZXhjZXB0aW9ucyBhcyBmb2xsb3dpbmcgd2VyZSB0aHJvd246CisrCistLS0tCisgIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb246IHppcCBmaWxlIGNsb3NlZAorICAgICAgICAgIGF0IGphdmEudXRpbC56aXAuWmlwRmlsZS5lbnN1cmVPcGVuKFppcEZpbGUuamF2YTo0MjApCisgICAgICAgICAgYXQgamF2YS51dGlsLnppcC5aaXBGaWxlLmdldEVudHJ5KFppcEZpbGUuamF2YToxNjUpCistLS0tCisKKyogRml4IGRvdWJsZSBib3VuZCBleGNlcHRpb24gd2hlbiBsb2FkaW5nIGV4dGVuc2lvbnMKKysKK1NlcnZlckluZm9ybWF0aW9uIGNsYXNzIHdhcyBhbHJlYWR5IGJvdW5kLCB0aGVyZWZvcmUgaXQgc2hvdWxkbid0IGJlCitib3VuZCBhIHNlY29uZCB0aW1lIGZvciBHZXJyaXQgZXh0ZW5zaW9ucy4KKworKiBEbyBub3QgY2FsbCBvbk1vZHVsZUxvYWQoKSBzZWNvbmQgdGltZQorKworb25Nb2R1bGVMb2FkKCkgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IEdXVCBmcmFtZXdvcmsuIENhbGxpbmcKK2l0IG9uY2UgYWdhaW4gaW4gUGx1Z2luR2VuZXJhdG9yIGNhdXNlZCBkb3VibGUgcGx1Z2luIGluaXRpYWxpemF0aW9uLgorCisqIFJlcXVpcmUgYEFkbWluaXN0cmF0ZSBTZXJ2ZXJgIGNhcGFiaWxpdHkgdG8gR0VUIC9wbHVnaW5zLworKworTGlzdGluZyBwbHVnaW5zIHJlcXVpcmVzIGJlaW5nIGFuIGFkbWluaXN0cmF0b3IuIFRoaXMgd2FzIG1pc3NlZCBpbiB0aGUKK1JFU1QgQVBJLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xODI3W0lzc3VlIDE4MjddOgorICBBbGxvdyBJbnRlcm5hbFVzZXIgKGFrYSBwbHVnaW5zKSB0byBzZWUgYW55IGludGVybmFsIGdyb3VwLCBhbmQgcnVuCisgIHBsdWdpbiBzdGFydHVwIGFuZCBzaHV0ZG93biBhcyBQbHVnaW5Vc2VyLgorCitFbWFpbAorfn5+fn4KKyogTWVyZ2UgZmFpbHVyZSBlbWFpbHMgYXJlIG9ubHkgc2VudCBvbmNlIHBlciBkYXkuCisqIFVudXNlZCBtYWNyb3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbWFpbCB0ZW1wbGF0ZXMuCisqIFVubmVjZXNzYXJ5IGVsbGlwc2VzIGFyZSBubyBsb25nZXIgYXBwbGllZCB0byBlbWFpbCBzdWJqZWN0cy4KKyogVGhlIGVtcHR5IGRpZmYgb3V0cHV0IGZyb20gYW4gIm9jdG9wdXMgbWVyZ2UiIGlzIG5vdyBleHBsYWluZWQgaW4gY2hhbmdlIG5vdGlmaWNhdGlvbiBlbWFpbHMuCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNDgwW0lzc3VlIDE0ODBdOgorUHJvcGVyIGVycm9yIG1lc3NhZ2UgaXMgc2hvd24gd2hlbiByZWdpc3RlcmluZyBhbiBlbWFpbCBhZGRyZXNzIGZhaWxzLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjkyW0lzc3VlIDE2OTJdOgorUmV2aWV3IGNvbW1lbnRzIGFyZSBzb3J0ZWQgYmVmb3JlIGJlaW5nIGFkZGVkIHRvIG5vdGlmaWNhdGlvbiBlbWFpbHMuCisKKyogRml4IHdhdGNoaW5nIG9mICdBbGwgQ29tbWVudHMnIG9uIGBBbGwtUHJvamVjdHNgCisrCitJZiBhIHVzZXIgaXMgd2F0Y2hpbmcgJ0FsbCBDb21tZW50cycgb24gYEFsbC1Qcm9qZWN0c2AgdGhpcyBzaG91bGQKK2FwcGx5IHRvIGFsbCBwcm9qZWN0cy4KKworTWlzYworfn5+fgorKiBQcm92aWRlIG1vcmUgZGVzY3JpcHRpdmUgbWVzc2FnZSBmb3IgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbgorCisqIE9uIGludGVybmFsIGVycm9yIGR1ZSB0byByZWNlaXZlIHRpbWVvdXQgaW5jbHVkZSB0aGUgdmFsdWUgb2YKKyAgYHJlY2VpdmUudGltZW91dGAgaW50byB0aGUgbG9nIG1lc3NhZ2UKKworKiBTaWxlbmNlIElORk8vREVCVUcgb3V0cHV0IGZyb20gYXBhY2hlLmh0dHAKKysKK1RoaXMgc3BhbW1lZCB0aGUgbG9nIHdoZW4gdXNpbmcgT3BlbklELCBmb3IgZWFjaCBhbmQgZXZlcnkgbG9naW4uCisKKyogUmVtb3ZlIGBteXNxbF9uZXh0dmFsYCBzY3JpcHQKKysKK1RoaXMgZnVuY3Rpb24gZG9lcyBub3Qgd29yayBvbiBiaW5hcnkgbG9nZ2luZyBlbmFibGVkIHNlcnZlcnMsCithcyBNeVNRTCBpcyB1bmFibGUgdG8gZXhlY3V0ZSB0aGUgZnVuY3Rpb24gb24gc2xhdmVzIHdpdGhvdXQKK2NhdXNpbmcgcG9zc2libGUgY29ycnVwdGlvbi4gRHJvcCB0aGUgZnVuY3Rpb24gc2luY2UgaXQgd2FzIG9ubHkKK2NyZWF0ZWQgdG8gaGVscCBhZG1pbmlzdHJhdG9ycywgYW5kIGlzIHVuc2FmZS4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTMxMltJc3N1ZSAxMzEyXToKKyAgRml4IHJlbGF0aXZlIFVSTCBkZXRlY3Rpb24gaW4gc3VibW9kdWxlcworKworUmVsYXRpdmUgc3VibW9kdWxlcyBkbyBub3Qgc3RhcnQgd2l0aCBgL2AuIEluc3RlYWQgdGhleSBzdGFydCB3aXRoCitgLi4vYC4gIEZpeCB0aGUgU3VibW9kdWxlIFN1YnNjcmlwdGlvbnMgZW5naW5lIHRvIHJlY29nbml6ZSByZWxhdGl2ZQorc3VibW9kdWxlcy4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTYyMltJc3N1ZSAxNjIyXToKKyAgRml4IE5QRSBpbiBMREFQIEhlbHBlciBjbGFzcyBpZiB1c2VybmFtZSBpcyBudWxsCisKKyogRml4IGNvbW1pdC1tc2cgaG9vayBmYWlsdXJlIHdpdGggc3BhY2VzIGluIHBhdGgKKysKK0lmIHRoZSBwcm9qZWN0IGFic29sdXRlIHBhdGggaGFkIGFueSB3aGl0ZXNwYWNlLCB0aGUgY29tbWl0Citob29rIGZhaWxlZCB0byBjb21wbGV0ZSBiZWNhdXNlIGEgc2NyaXB0IHZhcmlhYmxlIHdhcyBub3QKK2VuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMuCisKKyogRHJvcCB0aGUgdHJhaWxpbmcgIi5naXQiIHN1ZmZpeCBvZiB0aGUgbmFtZSBvZiBuZXcgcHJvamVjdAorCisqIFByZXZlbnQgcG9zc2libGUgTlBFIHdoZW4gcnVubmluZyBgY2hhbmdlLW1lcmdlZGAgaG9vaworKworSXQncyBwb3NzaWJsZSB0aGF0IHRoZSBzdWJtaXR0ZXIgaXMgbnVsbC4gQWRkIGEgY2hlY2sgZm9yIHRoaXMKK2JlZm9yZSBpbnZva2luZyB0aGUgYGNoYW5nZS1tZXJnZWRgIGhvb2sgd2l0aCBpdC4KKworKiBLZWVwIGNoYW5nZSBvcGVuIGlmIGl0cyBjb21taXQgaXMgcHVzaGVkIHRvIGFub3RoZXIgYnJhbmNoLgorCisqIEZpcmUgR2l0UmVmZXJlbmNlVXBkYXRlZCBldmVudCB3aGVuIEJhbkNvbW1pdCB1cGRhdGVzIHRoZQorICBgcmVmcy9tZXRhL3JlamVjdC1jb21taXRzYCBicmFuY2guCisKKyogRml4IEdpdFdlYiBDYWNoaW5nCisrCitHaXRXZWIgQ2FjaGluZyB3YXMgbm90IHdvcmtpbmcgd2hlbiBpdHMgY2dpIGZpbGUgd2FzIGV4ZWN1dGVkIGZyb20KK291dHNpZGUuIFRoZSBzYW1lIGFwcHJvYWNoIHdpbGwgYWxzbyB3b3JrIHdpdGggdmFuaWxsYSBHaXRXZWIuCisKKyogRml4IGluZmluaXRlIGxvb3BzIHdoZW4gd2Fsa2luZyBwcm9qZWN0IGhpZXJhcmNoeQorCisqIEZpeCByZXNvdXJjZSBsZWFrIGluIE1hcmtkb3duRm9ybWF0dGVyCisKKyogUXVlcnkgYWxsIGV4dGVybmFsIGdyb3VwcyBmb3IgaW50ZXJuYWwgZ3JvdXAgbWVtYmVyc2hpcHMKKysKK1doZW4gYXNraW5nIGZvciB0aGUga25vd24gZ3JvdXBzIGEgdXNlciBiZWxvbmdzIHRvIHRoZXkgbWF5IGJlbG9uZwordG8gYW4gaW50ZXJuYWwgZ3JvdXAgYnkgd2F5IG9mIG1lbWJlcnNoaXAgaW4gYSBub24taW50ZXJuYWwgZ3JvdXAsCitzdWNoIGFzIExEQVAuIENhY2hlIGluIG1lbW9yeSB0aGUgY29tcGxldGUgbGlzdCBvZiBhbnkgbm9uLWludGVybmFsCitncm91cCBVVUlEcyB1c2VkIGFzIG1lbWJlcnMgb2YgYW4gaW50ZXJuYWwgZ3JvdXAuIFRoZXNlIG11c3QgZ2V0CitjaGVja2VkIGZvciBtZW1iZXJzaGlwIGJlZm9yZSBjb21wbGV0aW5nIHRoZSBrbm93biBncm91cCBkYXRhIGZyb20KK3RoZSBpbnRlcm5hbCBiYWNrZW5kLgorCisqIEhhbmRsZSBzb3J0aW5nIGdyb3VwcyB3aXRoIG5vIG5hbWUgdG8gYXZvaWQgTlBFCisKKyogYGdlcnJpdC5zaGAKKyoqIERvbid0IHN1Z2dlc3Qgc2l0ZSBpbml0IGlmIHNjaGVtYSB2ZXJzaW9uIGlzIG5ld2VyIHRoYW4gZXhwZWN0ZWQKKyoqIEltcHJvdmUgZXJyb3IgbWVzc2FnZXMgaW4gc2NoZW1hIGNoZWNrCisqKiBTdWdnZXN0IGNoYW5naW5nIGBnZXJyaXQuY29uZmlnYCB3aGVuIEpESyBub3QgZm91bmQKKyoqIEV4cGxpY2l0bHkgc2V0IGEgc2hlbGwKKyoqIERldGVybWluZSBgR0VSUklUX1NJVEVgIGZyb20gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyoqIEZpeCBgZ2Vycml0LnNoIHJlc3RhcnRgIGZvciByZWxhdGl2ZSBwYXRocworKiogRml4IHNpdGUgcGF0aCBjb21wdXRhdGlvbiBpZiAnLicgb2NjdXJzIGluIHBhdGgKKyoqIFdoaXRlc3BhY2UgZml4ZXMKKworKiBEaXNwbGF5IHRoZSByZWFzb24gb2YgYW4gSW5pdCBpbmplY3Rpb24gZmFpbHVyZS4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTgyMVtJc3N1ZSAxODIxXToKKyAgV2FybiBpZiBgY2FjaGUud2ViX3Nlc3Npb25zLm1heEFnZWAgaXMgdG8gc21hbGwKKysKK1NldHRpbmcgYG1heEFnZWAgdG8gYSBzbWFsbCB2YWx1ZSBjYW4gcmVzdWx0IGluIHRoZSBicm93c2VyIGVuZGxlc3NseQorcmVkaXJlY3RpbmcgdHJ5aW5nIHRvIHNldHVwIGEgbmV3IHZhbGlkIHNlc3Npb24uIFdhcm4gYWRtaW5pc3RyYXRvcnMKK3RoYXQgdGhlIHZhbHVlIGlzIHNldCBzbWFsbGVyIHRoYW4gNSBtaW51dGVzLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xODIxW0lzc3VlIDE4MjFdOgorICBTdXBwb3J0IGBjYWNoZS53ZWJfc2Vzc2lvbnMubWF4QWdlYCA8IDEgbWludXRlCisKKyogVXNlIFNFQ09ORFMgYXMgZGVmYXVsdCB0aW1lIHVuaXQgZm9yIGBjYWNoZS53ZWJfc2Vzc2lvbnMubWF4QWdlYAorKworRGVmYXVsdENhY2hlRmFjdG9yeSBhbHJlYWR5IHVzZXMgU0VDT05EUyBhcyBkZWZhdWx0IHRpbWUgdW5pdCBmb3IKK2BjYWNoZS4qLm1heEFnZWAuCisrCitVcGRhdGUgdGhlIGRlc2NyaWJlZCBkZWZhdWx0IHRpbWUgdW5pdCBmb3IgYGNhY2hlLioubWF4QWdlYCBpbiB0aGUKK2RvY3VtZW50YXRpb24uCisrCitBZG1pbmlzdHJhdG9ycyBtYXkgbmVlZCB0byB1cGRhdGUgdGhlaXIgY29uZmlndXJhdGlvbiB0byBmb3IgdGhlIG5ldworZGVmYXVsdCB0aW1lIHVuaXQuCisKKyogQWRkIHB5bGludCBjb25maWd1cmF0aW9uIGZvciBjb250cmlidXRlZCBQeXRob24gc2NyaXB0cworCisqIFZhcmlvdXMgZml4ZXMgYW5kIGltcHJvdmVtZW50cyBvZiB0aGUgYGNvbnRyaWIvdHJpdmlhbF9yZWJhc2UucHlgCisgIHNjcmlwdAorKworKiogQWRhcHQgb3B0aW9ucyB0byBHZXJyaXQgMi42CisqKiBVc2UgY2hhbmdlLXVybCBmbGFnIGZvciBDaGFuZ2VJZAorKiogUHJldmVudCBleGNlcHRpb24gZm9yIGVtcHR5IGNvbW1pdAorKiogRml4IHB5bGludCBlcnJvcnMKKyoqIENhbGwgYGdlcnJpdCByZXZpZXdgIGluc3RlYWQgb2YgYGdlcnJpdCBhcHByb3ZlYAorKiogTWFrZSB0aGUgcHJpdmF0ZSBrZXkgYXJndW1lbnQgb3B0aW9uYWwKKyoqIFN1cHBvcnQgYWx0ZXJuYXRpdmUgc3NoIGV4ZWN1dGFibGUsIGZvciBleGFtcGxlIGBwbGlua2AKKyoqIFN1cHBvcnQgY3VzdG9tIHJldmlldyBsYWJlbHMKKyoqIENvcnJlY3RseSBoYW5kbGUgZW1wdHkgcGF0Y2ggSUQKKysKK0lmIG9ubHkgb25lIG9mIHRoZSBwYXRjaCBJRHMgaXMgZW1wdHksIGl0IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZAorYSB0cml2aWFsIHJlYmFzZS4KKworKiogVXNlIHBsYWluIHB5dGhvbiBpbnN0ZWFkIG9mIHB5dGhvbjIuNgorKworV2luZG93cyBpbnN0YWxsYXRpb24gb25seSBoYXMgcHl0aG9uLmV4ZQorCisqIENvcnJlY3QgTUlNRSB0eXBlIG9mIGBmYXZpY29uLmljb2AgcmVmZXJlbmNlCisrCitUaGlzIGlzIG5vdCBhIEdJRiwgaXQgaXMgYW4gIk1TIFdpbmRvd3MgaWNvbiByZXNvdXJjZSIuCitTb21lIGJyb3dzZXJzIG1heSBza2lwIHRoZSBpbWFnZSBpZiB0aGUgdHlwZSBpcyB3cm9uZy4KKworKiBVc2UgYDxsaW5rIHJlbD0ic2hvcnRjdXQgaWNvbiI+YCBmb3IgYGZhdmljb24uaWNvYCByZWZlcmVuY2UKKysKK0lFIGxvb2tzIGZvciBhIHR3by13b3JkICJzaG9ydGN1dCBpY29uIiByZWxhdGlvbnNoaXAuICBPdGhlciBicm93c2VycworaW50ZXJwcmV0IHRoaXMgYXMgdHdvIHJlbGF0aW9uc2hpcHMsIG9uZSBvZiB3aGljaCBpcyAiaWNvbiIsIHNvIHRoZXkKK2NhbiBoYW5kbGUgdGhpcyBzeW50YXggYXMgd2VsbC4KKysKK1NlZToKKysKKyoqIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNzY1NihWUy44NSkuYXNweAorKiogaHR0cDovL2plZmZjb2RlLmJsb2dzcG90LmNvbS8yMDA3LzEyL3doeS1kb2VzbnQtZmF2aWNvbi1mb3ItbXktc2l0ZS1hcHBlYXIuaHRtbAorCisqIFJlbW92ZSBgc2VydmxldC1hcGlgIGZyb20gYFdBUi9saWJgCisrCitJdCBpcyB3cm9uZyB0byBpbmNsdWRlIHRoZSBzZXJ2bGV0IEFQSSBpbiBhIFdBUidzIGBXRUItSU5GL2xpYmAKK2RpcmVjdG9yeS4gVGhpcyBjb25mdXNlcyBzb21lIHNlcnZsZXQgY29udGFpbmVycyB3aG8gcmVmdXNlIHRvCitsb2FkIHRoZSBHZXJyaXQgV0FSLiBJbnN0ZWFkIHBhY2thZ2UgdGhlIEpldHR5IHJ1bnRpbWUgYW5kIHRoZQorc2VydmxldCBBUEkgaW4gYSBuZXcgYFdFQi1JTkYvcGdtLWxpYmAgZGlyZWN0b3J5LgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xODIyW0lzc3VlIDE4MjJdOgorICBWZXJpZnkgc2Vzc2lvbiBtYXRjaGVzIGNvbnRhaW5lciBhdXRoZW50aWF0aW9uIGhlYWRlcgorKworSWYgdGhlIHVzZXIgYWx0ZXJzIHRoZWlyIGlkZW50aXR5IGluIHRoZSBjb250YWluZXIgaW52YWxpZGF0ZQordGhlIEdlcnJpdCB1c2VyIHNlc3Npb24gYW5kIGZvcmNlIGEgbmV3IG9uZSB0byBiZWdpbi4KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTc0M1tJc3N1ZSAxNzQzXToKKyAgTW92ZSBSUEMgYXV0aCB0b2tlbiBmcm9tIGBBdXRob3JpemF0aW9uYCBoZWFkZXIgdG8gYFgtR2Vycml0LUF1dGhgCisrCitTZXJ2ZXJzIHRoYXQgcnVuIHdpdGggYXV0aC50eXBlID0gSFRUUCBvciBIVFRQX0xEQVAgYXJlIHVuYWJsZSB0bwordXNlIHRoZSB3ZWIgVUkgYmVjYXVzZSB0aGUgQXV0aG9yaXphdGlvbiBjb2RlIHN1cHBsaWVkIGJ5IHRoZSBVSQorb3ZlcnJpZGVzIHRoZSBicm93c2VyJ3MgbmF0aXZlIGBBdXRob3JpemF0aW9uYCBoZWFkZXIgYW5kIGNhdXNlcyB0aGUKK3JlcXVlc3QgdG8gYmUgYmxvY2tlZCBhdCB0aGUgSFRUUCByZXZlcnNlIHByb3h5LCBiZWZvcmUgR2Vycml0IGV2ZW4KK3NlZXMgdGhlIHJlcXVlc3QuCisrCitJbnN0ZWFkIGluc2VydCBhIHVuaXF1ZSB0b2tlbiBpbnRvIGBYLUdlcnJpdC1BdXRoYCwgbGVhdmluZyB0aGUgSFRUUAorc3RhbmRhcmQgYEF1dGhvcml6YXRpb25gIGhlYWRlciB1bnNwZWNpZmllZCBhbmQgYXZhaWxhYmxlIGZvciB1c2UgaW4KK0hUVFAgcmV2ZXJzZSBwcm94aWVzLgorCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCisKK1RoZSBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvaW5kZXguaHRtbFsKK2RvY3VtZW50YXRpb24gaW5kZXhdIGlzIHJlc3RydWN0dXJlZCB0byBtYWtlIGl0IGVhc2llciB0byB1c2UgZm9yIGRpZmZlcmVudCBraW5kcyBvZgordXNlcnMuCisKK1VzZXIgRG9jdW1lbnRhdGlvbgorfn5+fn5+fn5+fn5+fn5+fn5+CisqIFNwbGl0IGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9yZXN0LWFwaS5odG1sWworICBSRVNUIEFQSSBkb2N1bWVudGF0aW9uXSBhbmQgaGF2ZSBvbmUgcGFnZSBwZXIgdG9wIGxldmVsIHJlc291cmNlCisKKyogQWRkIGV4ZWN1dGFibGUgZXhhbXBsZXMgZm9yIEdFVCByZXF1ZXN0cyB0bworICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvcmVzdC1hcGkuaHRtbFsKKyAgUkVTVCBBUEkgZG9jdW1lbnRhdGlvbl0KKysKK0FkZCBleGFtcGxlcyBmb3IgR0VUIHJlcXVlc3RzIHRvIHRoZSBSRVNUIEFQSSBkb2N1bWVudGF0aW9uIG9uIHdoaWNoCit0aGUgdXNlciBjYW4gY2xpY2sgdG8gZmlyZSB0aGUgcmVxdWVzdHMuIFRoaXMgYWxsb3dzIHVzZXJzIHRvCitpbW1lZGlhdGVseSB0cnkgb3V0IHRoZSByZXF1ZXN0cyBhbmQgcGxheSBhcm91bmQgd2l0aCB0aGVtLgorCisqIERvY3VtZW50IHRoZSBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvYWNjZXNzLWNvbnRyb2wuaHRtbCNibG9ja1sKKyAgQkxPQ0sgYWNjZXNzIHJ1bGVdLgorCisqIEFkZGVkIGRvY3VtZW50YXRpb24gb2YKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3VzZXItdXBsb2FkLmh0bWwjaHR0cFsKKyAgaG93IHRvIGF1dGhlbnRpY2F0ZSB1cGxvYWRzIG92ZXIgSFRUUF0uCisKKyogQWRkZWQgZG9jdW1lbnRhdGlvbiBvZiB0aGUKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCNhdXRoLmVkaXRGdWxsTmFtZVVybFthdXRoLmVkaXRGdWxsTmFtZVVybF0gYW5kCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctZ2Vycml0Lmh0bWwjYXV0aC5odHRwUGFzc3dvcmRVcmxbYXV0aC5odHRwUGFzc3dvcmRVcmxdCisgIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKworKiBBZGQgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Byb2xvZy1jb29rYm9vay5odG1sWworICBzdWJtaXRfcnVsZSBleGFtcGxlc10gZnJvbSBHZXJyaXQgVXNlciBTdW1taXQgMjAxMi4KKworKiBJbXByb3ZlZCB0aGUgcHVzaCB0YWcgZXhhbXBsZXMgaW4gdGhlIGFjY2VzcyBjb250cm9sIGRvY3VtZW50YXRpb24uCisKKyogSW1wcm92ZWQgZG9jdW1lbnRhdGlvbiBvZiBlcnJvciBtZXNzYWdlcyByZWxhdGVkIHRvIGNvbW1pdCBtZXNzYWdlIGZvb3RlciBjb250ZW50LgorCisqIEFkZGVkIGRvY3VtZW50YXRpb24gb2YgdGhlCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9lcnJvci1jb21taXQtYWxyZWFkeS1leGlzdHMuaHRtbFsKKyAgY29tbWl0IGFscmVhZHkgZXhpc3RzXSBlcnJvciBtZXNzYWdlLgorCisqIEFkZGVkIG1pc3NpbmcgZG9jdW1lbnRhdGlvbiBvZiB0aGUgc3NoCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jbWQtdmVyc2lvbi5odG1sWworICB2ZXJzaW9uXSBjb21tYW5kLgorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xMzY5W0lzc3VlIDEzNjldOgorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWdpdHdlYi5odG1sWworICBHaXR3ZWIgSW5zdHJ1Y3Rpb24gVXBkYXRlc10KKworKiBsaW5rOmh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0L2lzc3Vlcy9kZXRhaWw/aWQ9MTU5NFtJc3N1ZSAxNTk0XToKKyAgRG9jdW1lbnQgZXhlY3V0ZSBwZXJtaXNzaW9uIGZvciBjb21taXQtbXNnIGluCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi91c2VyLWNoYW5nZWlkLmh0bWwjY3JlYXRpb25bCisgIENoYW5nZS1JZCBkb2NzXQorCisqIGxpbms6aHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNjAyW0lzc3VlIDE2MDJdOgorQ29ycmVjdGVkIHJlZmVyZW5jZXMgdG8gYHJlZnMvY2hhbmdlc2AgaW4gdGhlIGFjY2VzcyBjb250cm9sIGRvY3VtZW50YXRpb24uCisKKyogVXBkYXRlIGRvY3VtZW50YXRpb24gb2YKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2NvbmZpZy1nZXJyaXQuaHRtbCN0cmFja2luZ2lkLm5hbWUubWF0Y2hbCisgIG1heGltYWwgbGVuZ3RoIGZvciB0cmFja2luZyBpZHNdCisKKyogQWRkZWQgbWlzc2luZyBkb2N1bWVudGF0aW9uIG9mCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9qc29uLmh0bWxbSlNPTiBhdHRyaWJ1dGVzXS4KKworKiBSZW5hbWUgYGN1c3RvbS1kYXNoYm9hcmRzLmh0bWxgIHRvCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi91c2VyLWRhc2hib2FyZHMuaHRtbFt1c2VyLWRhc2hib2FyZHMuaHRtbF0KKysKK1RoaXMgZG9jdW1lbnQgbm8gbG9uZ2VyIGRlYWxzIGV4Y2x1c2l2ZWx5IHdpdGggY3VzdG9tIGRhc2hib2FyZHMsIGl0IG5vdyBkZXNjcmliZXMgcHJvamVjdCBsZXZlbCBkYXNoYm9hcmRzIGFsc28uCisKKyogU2VwYXJhdGUgdGhlCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9jb25maWctbG9naW4tcmVnaXN0ZXIuaHRtbFsKKyAgaW5pdGlhbCB1c2VyIHNldHVwIGluc3RydWN0aW9uc10gdG8gYSBzaGFyZWQgZmlsZQorCisqIFNlcGFyYXRlIHRoZQorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGF0YWJhc2Utc2V0dXAuaHRtbFsKKyAgZGF0YWJhc2Ugc2V0dXAgaW5zdHJ1Y3Rpb25zXSB0byBhIHNoYXJlZCBmaWxlCisKKyogSW1wcm92ZSB0aGUgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2RhdGFiYXNlLXNldHVwLmh0bWxbCisgIGluc3RydWN0aW9ucyBmb3IgUGdTUUwgc2V0dXBdCisKKyogRml4IHRoZSBvcmRlciBvZiBzdGVwcyBpbiB0aGUKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2luc3RhbGwtajJlZS5odG1sWworICBKMkVFIEluc3RhbGxhdGlvbiBkb2N1bWVudF0KKysKK0l0IGlzIGJldHRlciB0byBmaXJzdCBkZWZpbmUgdGhlIEpOREkgZGF0YSBzb3VyY2UgaW4gdGhlIGFwcGxpY2F0aW9uCitzZXJ2ZXIgYW5kIHRoZW4gZGVwbG95IEdlcnJpdCB0aGFuIG9wcG9zaXRlLiBUaGlzIHNob3VsZCBhdm9pZCBlcnJvcnMKK2xpa2UgIk5vIERhdGFTb3VyY2UiIG9uIHRoZSBmaXJzdCBkZXBsb3ltZW50LgorCisqIENsYXJpZnkgZG9jdW1lbnRhdGlvbiBvZgorICBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvY29uZmlnLWdlcnJpdC5odG1sI2xkYXAuZ3JvdXBOYW1lWworICBMREFQIGdyb3VwIG5hbWUgc2V0dGluZ10KKworKiBJbXByb3ZlIHRoZSBkb2N1bWVudGF0aW9uIG9mCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi91c2VyLXN1Ym1vZHVsZS5odG1sWworICBnaXQgc3VibW9kdWxlIHN1YnNjcmlwdGlvbiBoYW5kbGluZ10KKworKiBDbGFyaWZ5IHRoZSBkb2N1bWVudGF0aW9uIG9mIGNoYW5nZSBjYWNoZSBzZXR1cC4KKworKiBJbXByb3ZlIHRoZSBleHBsYW5hdGlvbiBvZiBwYXRoIGNvbmZsaWN0cyBpbiB0aGUKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L3Byb2plY3Qtc2V0dXAuaHRtbFsKKyAgcHJvamVjdCBzZXR1cCBkb2N1bWVudGF0aW9uXS4KKworKiBBZGQgZXhwbGFuYXRpb25zIG9mIHNwZWNpYWwvbWFnaWMgcmVmcyBpbiB0aGUKKyAgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2FjY2Vzcy1jb250cm9sLmh0bWwjcmVmZXJlbmNlc1sKKyAgYWNjZXNzIGNvbnRyb2wgZG9jdW1lbnRhdGlvbl0uCisKKyogQ2xhcmlmeSBob3cgdG8gc2V0IEdsb2JhbCBDYXBhYmlsaXRpZXMuCisqIENvcnJlY3QgZG9jdW1lbnRhdGlvbiBvZiB0aGUgYGNyZWF0ZS1hY2NvdW50YCBzc2ggY29tbWFuZC4KKyogQWRkIGRvY3VtZW50YXRpb24gb2YgdGhlIGBkYXRhYmFzZS5jb25uZWN0aW9uUG9vbGAgc2V0dGluZy4KKyogQWRhcHQgZG9jdW1lbnRhdGlvbiB0byBoYXZpbmcgJ1Byb2plY3RzJyBhcyB0b3AgbGV2ZWwgbWVudQorKiBBZGRlZCBtaXNzaW5nIGRvY3VtZW50YXRpb24gb2YgbWFpbCB0ZW1wbGF0ZXMuCisqIEFkZGVkIGRvY3VtZW50YXRpb24gb2YgY29udHJpYnV0b3IgYWdyZWVtZW50cy4KKyogRml4IGBpbml0LmRgIHN5bWJvbGljIGxpbmsgY29tbWFuZHMuCisqIFJlbW92ZSBvYnNvbGV0ZSBkaXNrYnVmZmVyIHNldHRpbmcgZnJvbSBleGFtcGxlIGNvbmZpZyBmaWxlLgorKiBWYXJpb3VzIG1pbm9yIGdyYW1tYXRpY2FsIGFuZCBmb3JtYXR0aW5nIGNvcnJlY3Rpb25zLgorKiBGaXggZXh0ZXJuYWwgbGlua3MgaW4gMi4wLjIxIGFuZCAyLjAuMjQgcmVsZWFzZSBub3RlcworKiBNYW51YWwgcGFnZXMgY2FuIGJlIG9wdGlvbmFsbHkgY3JlYXRlZC9pbnN0YWxsZWQgZm9yIGNvcmUgZ2Vycml0IHNzaCBjb21tYW5kcy4KKworRGV2ZWxvcGVyIEFuZCBNYWludGFpbmVyIERvY3VtZW50YXRpb24KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisqIFVwZGF0ZWQgdGhlIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kZXYtZWNsaXBzZS5odG1sI21hdmVuWworICBNYXZlbiBwbHVnaW4gaW5zdGFsbGF0aW9uIGluc3RydWN0aW9uc10gZm9yIEVjbGlwc2UgMy43IChJbmRpZ28pLgorCisqIERvY3VtZW50IGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kZXYtY29udHJpYnV0aW5nLmh0bWwjY29tbWl0LW1lc3NhZ2VbCisgIHVzYWdlIG9mIHRoZSBwYXN0IHRlbnNlIGluIGNvbW1pdCBtZXNzYWdlc10KKworKiBBZGQgbGluazpodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi42L2Rldi1jb250cmlidXRpbmcuaHRtbFsKKyAgaW5zdHJ1Y3Rpb25zXSBvbiBob3cgdG8gY29uZmlndXJlIGdpdCBmb3IgcHVzaGluZyB0byBHZXJyaXQncyBHZXJyaXQKKworKiBsaW5rOmh0dHA6Ly9nZXJyaXQtZG9jdW1lbnRhdGlvbi5nb29nbGVjb2RlLmNvbS9zdm4vRG9jdW1lbnRhdGlvbi8yLjYvZGV2LWNvbnRyaWJ1dGluZy5odG1sI3Byb2Nlc3NbCisgIFN0YWJsZSBicmFuY2hlcyBwcm9jZXNzIGRvY3VtZW50YXRpb25dCisKKyogSW1wcm92ZWQgdGhlCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kZXYtcmVsZWFzZS5odG1sWworICByZWxlYXNlIGRvY3VtZW50YXRpb25dLgorCisqIERvY3VtZW50IHRoYXQgcGxhbnMgZm9yCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kZXYtcmVsZWFzZS5odG1sI3N0YWJsZVsKKyAgc3RhYmxlLWZpeCByZWxlYXNlc10gc2hvdWxkIGJlIGFubm91bmNlZAorCisqIERvY3VtZW50IHByb2Nlc3MgZm9yCisgIGxpbms6aHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNi9kZXYtcmVsZWFzZS5odG1sI3NlY3VyaXR5WworICBzZWN1cml0eS1maXggcmVsZWFzZXNdCisKKyogVGhlIHJlbGVhc2Ugbm90ZXMgYXJlIG5vdyBtYWRlIHdoZW4gYSByZWxlYXNlIGlzIGNyZWF0ZWQgYnkgcnVubmluZyB0aGUgYHRvb2xzL3JlbGVhc2Uuc2hgIHNjcmlwdC4KKwpkaWZmIC0tZ2l0IGEvUmVsZWFzZU5vdGVzL2luZGV4LnR4dCBiL1JlbGVhc2VOb3Rlcy9pbmRleC50eHQKaW5kZXggMDdlNmFhNS4uOThjYzNhYyAxMDA2NDQKLS0tIGEvUmVsZWFzZU5vdGVzL2luZGV4LnR4dAorKysgYi9SZWxlYXNlTm90ZXMvaW5kZXgudHh0CkBAIC0xLDYgKzEsMTEgQEAKIEdlcnJpdCBDb2RlIFJldmlldyAtIFJlbGVhc2UgTm90ZXMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorW1syXzZdXQorVmVyc2lvbiAyLjYueAorLS0tLS0tLS0tLS0tLQorKiBsaW5rOlJlbGVhc2VOb3Rlcy0yLjYuaHRtbFsyLjZdCisKIFtbMl81XV0KIFZlcnNpb24gMi41LngKIC0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvLnB5bGludHJjIGIvY29udHJpYi8ucHlsaW50cmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4ODgyZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvLnB5bGludHJjCkBAIC0wLDAgKzEsMzAxIEBACisjIGxpbnQgUHl0aG9uIG1vZHVsZXMgdXNpbmcgZXh0ZXJuYWwgY2hlY2tlcnMuCisjCisjIFRoaXMgaXMgdGhlIG1haW4gY2hlY2tlciBjb250cm9saW5nIHRoZSBvdGhlciBvbmVzIGFuZCB0aGUgcmVwb3J0cworIyBnZW5lcmF0aW9uLiBJdCBpcyBpdHNlbGYgYm90aCBhIHJhdyBjaGVja2VyIGFuZCBhbiBhc3RuZyBjaGVja2VyIGluIG9yZGVyCisjIHRvOgorIyAqIGhhbmRsZSBtZXNzYWdlIGFjdGl2YXRpb24gLyBkZWFjdGl2YXRpb24gYXQgdGhlIG1vZHVsZSBsZXZlbAorIyAqIGhhbmRsZSBzb21lIGJhc2ljIGJ1dCBuZWNlc3Nhcnkgc3RhdHMnZGF0YSAobnVtYmVyIG9mIGNsYXNzZXMsIG1ldGhvZHMuLi4pCisjCitbTUFTVEVSXQorCisjIFNwZWNpZnkgYSBjb25maWd1cmF0aW9uIGZpbGUuCisjcmNmaWxlPQorCisjIFB5dGhvbiBjb2RlIHRvIGV4ZWN1dGUsIHVzdWFsbHkgZm9yIHN5cy5wYXRoIG1hbmlwdWxhdGlvbiBzdWNoIGFzCisjIHB5Z3RrLnJlcXVpcmUoKS4KKyNpbml0LWhvb2s9CisKKyMgUHJvZmlsZWQgZXhlY3V0aW9uLgorcHJvZmlsZT1ubworCisjIEFkZCA8ZmlsZSBvciBkaXJlY3Rvcnk+IHRvIHRoZSBibGFjayBsaXN0LiBJdCBzaG91bGQgYmUgYSBiYXNlIG5hbWUsIG5vdCBhCisjIHBhdGguIFlvdSBtYXkgc2V0IHRoaXMgb3B0aW9uIG11bHRpcGxlIHRpbWVzLgoraWdub3JlPVNWTgorCisjIFBpY2tsZSBjb2xsZWN0ZWQgZGF0YSBmb3IgbGF0ZXIgY29tcGFyaXNvbnMuCitwZXJzaXN0ZW50PXllcworCisjIFNldCB0aGUgY2FjaGUgc2l6ZSBmb3IgYXN0bmcgb2JqZWN0cy4KK2NhY2hlLXNpemU9NTAwCisKKyMgTGlzdCBvZiBwbHVnaW5zIChhcyBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzIG9mIHB5dGhvbiBtb2R1bGVzIG5hbWVzKSB0byBsb2FkLAorIyB1c3VhbGx5IHRvIHJlZ2lzdGVyIGFkZGl0aW9uYWwgY2hlY2tlcnMuCitsb2FkLXBsdWdpbnM9CisKKworW01FU1NBR0VTIENPTlRST0xdCisKKyMgRW5hYmxlIG9ubHkgY2hlY2tlcihzKSB3aXRoIHRoZSBnaXZlbiBpZChzKS4gVGhpcyBvcHRpb24gY29uZmxpY3RzIHdpdGggdGhlCisjIGRpc2FibGUtY2hlY2tlciBvcHRpb24KKyNlbmFibGUtY2hlY2tlcj0KKworIyBFbmFibGUgYWxsIGNoZWNrZXIocykgZXhjZXB0IHRob3NlIHdpdGggdGhlIGdpdmVuIGlkKHMpLiBUaGlzIG9wdGlvbgorIyBjb25mbGljdHMgd2l0aCB0aGUgZW5hYmxlLWNoZWNrZXIgb3B0aW9uCisjZGlzYWJsZS1jaGVja2VyPQorCisjIEVuYWJsZSBhbGwgbWVzc2FnZXMgaW4gdGhlIGxpc3RlZCBjYXRlZ29yaWVzLgorI2VuYWJsZS1tc2ctY2F0PQorCisjIERpc2FibGUgYWxsIG1lc3NhZ2VzIGluIHRoZSBsaXN0ZWQgY2F0ZWdvcmllcy4KKyNkaXNhYmxlLW1zZy1jYXQ9CisKKyMgRW5hYmxlIHRoZSBtZXNzYWdlKHMpIHdpdGggdGhlIGdpdmVuIGlkKHMpLgorZW5hYmxlPVJQMDAwNAorCisjIERpc2FibGUgdGhlIG1lc3NhZ2Uocykgd2l0aCB0aGUgZ2l2ZW4gaWQocykuCitkaXNhYmxlPVIwOTAzLFIwOTEyLFIwOTEzLFIwOTE0LFIwOTE1LFcwMTQxLEMwMTExLEMwMTAzLFcwNjAzLFcwNzAzLFIwOTExLEMwMzAxLEMwMzAyLFIwOTAyLFIwOTA0LFcwMTQyLFcwMjEyLEUxMTAxLEUxMTAzLFIwMjAxLFcwMjAxLFcwMTIyLFcwMjMyLFJQMDAwMSxSUDAwMDMsUlAwMTAxLFJQMDAwMixSUDA0MDEsUlAwNzAxLFJQMDgwMQorCitbUkVQT1JUU10KKworIyBzZXQgdGhlIG91dHB1dCBmb3JtYXQuIEF2YWlsYWJsZSBmb3JtYXRzIGFyZSB0ZXh0LCBwYXJzZWFibGUsIGNvbG9yaXplZCwgbXN2cworIyAodmlzdWFsIHN0dWRpbykgYW5kIGh0bWwKK291dHB1dC1mb3JtYXQ9dGV4dAorCisjIEluY2x1ZGUgbWVzc2FnZSdzIGlkIGluIG91dHB1dAoraW5jbHVkZS1pZHM9eWVzCisKKyMgUHV0IG1lc3NhZ2VzIGluIGEgc2VwYXJhdGUgZmlsZSBmb3IgZWFjaCBtb2R1bGUgLyBwYWNrYWdlIHNwZWNpZmllZCBvbiB0aGUKKyMgY29tbWFuZCBsaW5lIGluc3RlYWQgb2YgcHJpbnRpbmcgdGhlbSBvbiBzdGRvdXQuIFJlcG9ydHMgKGlmIGFueSkgd2lsbCBiZQorIyB3cml0dGVuIGluIGEgZmlsZSBuYW1lICJweWxpbnRfZ2xvYmFsLlt0eHR8aHRtbF0iLgorZmlsZXMtb3V0cHV0PW5vCisKKyMgVGVsbHMgd2hldGhlciB0byBkaXNwbGF5IGEgZnVsbCByZXBvcnQgb3Igb25seSB0aGUgbWVzc2FnZXMKK3JlcG9ydHM9eWVzCisKKyMgUHl0aG9uIGV4cHJlc3Npb24gd2hpY2ggc2hvdWxkIHJldHVybiBhIG5vdGUgbGVzcyB0aGFuIDEwICgxMCBpcyB0aGUgaGlnaGVzdAorIyBub3RlKS5Zb3UgaGF2ZSBhY2Nlc3MgdG8gdGhlIHZhcmlhYmxlcyBlcnJvcnMgd2FybmluZywgc3RhdGVtZW50IHdoaWNoCisjIHJlc3BlY3Rpdmx5IGNvbnRhaW4gdGhlIG51bWJlciBvZiBlcnJvcnMgLyB3YXJuaW5ncyBtZXNzYWdlcyBhbmQgdGhlIHRvdGFsCisjIG51bWJlciBvZiBzdGF0ZW1lbnRzIGFuYWx5emVkLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGdsb2JhbCBldmFsdWF0aW9uIHJlcG9ydAorIyAoUjAwMDQpLgorZXZhbHVhdGlvbj0xMC4wIC0gKChmbG9hdCg1ICogZXJyb3IgKyB3YXJuaW5nICsgcmVmYWN0b3IgKyBjb252ZW50aW9uKSAvIHN0YXRlbWVudCkgKiAxMCkKKworIyBBZGQgYSBjb21tZW50IGFjY29yZGluZyB0byB5b3VyIGV2YWx1YXRpb24gbm90ZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBnbG9iYWwKKyMgZXZhbHVhdGlvbiByZXBvcnQgKFIwMDA0KS4KK2NvbW1lbnQ9bm8KKworIyBjaGVja3MgZm9yCisjICogdW51c2VkIHZhcmlhYmxlcyAvIGltcG9ydHMKKyMgKiB1bmRlZmluZWQgdmFyaWFibGVzCisjICogcmVkZWZpbml0aW9uIG9mIHZhcmlhYmxlIGZyb20gYnVpbHRpbnMgb3IgZnJvbSBhbiBvdXRlciBzY29wZQorIyAqIHVzZSBvZiB2YXJpYWJsZSBiZWZvcmUgYXNzaWdtZW50CisjCitbVkFSSUFCTEVTXQorCisjIFRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGNoZWNrIGZvciB1bnVzZWQgaW1wb3J0IGluIF9faW5pdF9fIGZpbGVzLgoraW5pdC1pbXBvcnQ9bm8KKworIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBuYW1lcyB1c2VkIGZvciBkdW1teSB2YXJpYWJsZXMgKGkuZS4gbm90IHVzZWQpLgorZHVtbXktdmFyaWFibGVzLXJneD1ffGR1bW15CisKKyMgTGlzdCBvZiBhZGRpdGlvbmFsIG5hbWVzIHN1cHBvc2VkIHRvIGJlIGRlZmluZWQgaW4gYnVpbHRpbnMuIFJlbWVtYmVyIHRoYXQKKyMgeW91IHNob3VsZCBhdm9pZCB0byBkZWZpbmUgbmV3IGJ1aWx0aW5zIHdoZW4gcG9zc2libGUuCithZGRpdGlvbmFsLWJ1aWx0aW5zPQorCisKKyMgdHJ5IHRvIGZpbmQgYnVncyBpbiB0aGUgY29kZSB1c2luZyB0eXBlIGluZmVyZW5jZQorIworW1RZUEVDSEVDS10KKworIyBUZWxscyB3aGV0aGVyIG1pc3NpbmcgbWVtYmVycyBhY2Nlc3NlZCBpbiBtaXhpbiBjbGFzcyBzaG91bGQgYmUgaWdub3JlZC4gQQorIyBtaXhpbiBjbGFzcyBpcyBkZXRlY3RlZCBpZiBpdHMgbmFtZSBlbmRzIHdpdGggIm1peGluIiAoY2FzZSBpbnNlbnNpdGl2ZSkuCitpZ25vcmUtbWl4aW4tbWVtYmVycz15ZXMKKworIyBMaXN0IG9mIGNsYXNzZXMgbmFtZXMgZm9yIHdoaWNoIG1lbWJlciBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgY2hlY2tlZAorIyAodXNlZnVsIGZvciBjbGFzc2VzIHdpdGggYXR0cmlidXRlcyBkeW5hbWljYWx5IHNldCkuCitpZ25vcmVkLWNsYXNzZXM9U1FMT2JqZWN0CisKKyMgV2hlbiB6b3BlIG1vZGUgaXMgYWN0aXZhdGVkLCBjb25zaWRlciB0aGUgYWNxdWlyZWQtbWVtYmVycyBvcHRpb24gdG8gaWdub3JlCisjIGFjY2VzcyB0byBzb21lIHVuZGVmaW5lZCBhdHRyaWJ1dGVzLgorem9wZT1ubworCisjIExpc3Qgb2YgbWVtYmVycyB3aGljaCBhcmUgdXN1YWxseSBnZXQgdGhyb3VnaCB6b3BlJ3MgYWNxdWlzaXRpb24gbWVjYW5pc20gYW5kCisjIHNvIHNob3VsZG4ndCB0cmlnZ2VyIEUwMjAxIHdoZW4gYWNjZXNzZWQgKG5lZWQgem9wZT15ZXMgdG8gYmUgY29uc2lkZXJlZCkuCithY3F1aXJlZC1tZW1iZXJzPVJFUVVFU1QsYWNsX3VzZXJzLGFxX3BhcmVudAorCisKKyMgY2hlY2tzIGZvciA6CisjICogZG9jIHN0cmluZ3MKKyMgKiBtb2R1bGVzIC8gY2xhc3NlcyAvIGZ1bmN0aW9ucyAvIG1ldGhvZHMgLyBhcmd1bWVudHMgLyB2YXJpYWJsZXMgbmFtZQorIyAqIG51bWJlciBvZiBhcmd1bWVudHMsIGxvY2FsIHZhcmlhYmxlcywgYnJhbmNocywgcmV0dXJucyBhbmQgc3RhdGVtZW50cyBpbgorIyBmdW5jdGlvbnMsIG1ldGhvZHMKKyMgKiByZXF1aXJlZCBtb2R1bGUgYXR0cmlidXRlcworIyAqIGRhbmdlcm91cyBkZWZhdWx0IHZhbHVlcyBhcyBhcmd1bWVudHMKKyMgKiByZWRlZmluaXRpb24gb2YgZnVuY3Rpb24gLyBtZXRob2QgLyBjbGFzcworIyAqIHVzZXMgb2YgdGhlIGdsb2JhbCBzdGF0ZW1lbnQKKyMKK1tCQVNJQ10KKworIyBSZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciBtb2R1bGUsIHNlcGFyYXRlZCBieSBhIGNvbW1hCityZXF1aXJlZC1hdHRyaWJ1dGVzPQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBmdW5jdGlvbnMgb3IgY2xhc3NlcyBuYW1lIHdoaWNoIGRvCisjIG5vdCByZXF1aXJlIGEgZG9jc3RyaW5nCituby1kb2NzdHJpbmctcmd4PV9tYWlufF9fLipfXworCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1vZHVsZSBuYW1lcworbW9kdWxlLXJneD0oKFthLXpfXVthLXowLTlfXSopfChbQS1aXVthLXpBLVowLTldKykpJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1vZHVsZSBsZXZlbCBuYW1lcworY29uc3Qtcmd4PSgoW0EtWl9dW0EtWjEtOV9dKil8KF9fLipfXykpfChsb2cpJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGNsYXNzIG5hbWVzCitjbGFzcy1yZ3g9W0EtWl9dW2EtekEtWjAtOV0rJAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IGZ1bmN0aW9uIG5hbWVzCitmdW5jdGlvbi1yZ3g9W2Etel9dW2EtejAtOV9dezIsMzB9JAorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzaG91bGQgb25seSBtYXRjaCBjb3JyZWN0IG1ldGhvZCBuYW1lcworbWV0aG9kLXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgaW5zdGFuY2UgYXR0cmlidXRlIG5hbWVzCithdHRyLXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgYXJndW1lbnQgbmFtZXMKK2FyZ3VtZW50LXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgdmFyaWFibGUgbmFtZXMKK3ZhcmlhYmxlLXJneD1bYS16X11bYS16MC05X117MiwzMH0kCisKKyMgUmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNob3VsZCBvbmx5IG1hdGNoIGNvcnJlY3QgbGlzdCBjb21wcmVoZW5zaW9uIC8KKyMgZ2VuZXJhdG9yIGV4cHJlc3Npb24gdmFyaWFibGUgbmFtZXMKK2lubGluZXZhci1yZ3g9W0EtWmEtel9dW0EtWmEtejAtOV9dKiQKKworIyBHb29kIHZhcmlhYmxlIG5hbWVzIHdoaWNoIHNob3VsZCBhbHdheXMgYmUgYWNjZXB0ZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hCitnb29kLW5hbWVzPWksaixrLGV4LFJ1bixfLGUsZDEsZDIsdixmLGwsZAorCisjIEJhZCB2YXJpYWJsZSBuYW1lcyB3aGljaCBzaG91bGQgYWx3YXlzIGJlIHJlZnVzZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hCitiYWQtbmFtZXM9Zm9vLGJhcixiYXosdG90byx0dXR1LHRhdGEKKworIyBMaXN0IG9mIGJ1aWx0aW5zIGZ1bmN0aW9uIG5hbWVzIHRoYXQgc2hvdWxkIG5vdCBiZSB1c2VkLCBzZXBhcmF0ZWQgYnkgYSBjb21tYQorYmFkLWZ1bmN0aW9ucz1tYXAsZmlsdGVyLGFwcGx5LGlucHV0CisKKworIyBjaGVja3MgZm9yIHNpZ24gb2YgcG9vci9taXNkZXNpZ246CisjICogbnVtYmVyIG9mIG1ldGhvZHMsIGF0dHJpYnV0ZXMsIGxvY2FsIHZhcmlhYmxlcy4uLgorIyAqIHNpemUsIGNvbXBsZXhpdHkgb2YgZnVuY3Rpb25zLCBtZXRob2RzCisjCitbREVTSUdOXQorCisjIE1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gLyBtZXRob2QKK21heC1hcmdzPTUKKworIyBNYXhpbXVtIG51bWJlciBvZiBsb2NhbHMgZm9yIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1sb2NhbHM9MTUKKworIyBNYXhpbXVtIG51bWJlciBvZiByZXR1cm4gLyB5aWVsZCBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keQorbWF4LXJldHVybnM9NgorCisjIE1heGltdW0gbnVtYmVyIG9mIGJyYW5jaCBmb3IgZnVuY3Rpb24gLyBtZXRob2QgYm9keQorbWF4LWJyYW5jaHM9MTIKKworIyBNYXhpbXVtIG51bWJlciBvZiBzdGF0ZW1lbnRzIGluIGZ1bmN0aW9uIC8gbWV0aG9kIGJvZHkKK21heC1zdGF0ZW1lbnRzPTUwCisKKyMgTWF4aW11bSBudW1iZXIgb2YgcGFyZW50cyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAxKS4KK21heC1wYXJlbnRzPTcKKworIyBNYXhpbXVtIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBhIGNsYXNzIChzZWUgUjA5MDIpLgorbWF4LWF0dHJpYnV0ZXM9MjAKKworIyBNaW5pbXVtIG51bWJlciBvZiBwdWJsaWMgbWV0aG9kcyBmb3IgYSBjbGFzcyAoc2VlIFIwOTAzKS4KK21pbi1wdWJsaWMtbWV0aG9kcz0yCisKKyMgTWF4aW11bSBudW1iZXIgb2YgcHVibGljIG1ldGhvZHMgZm9yIGEgY2xhc3MgKHNlZSBSMDkwNCkuCittYXgtcHVibGljLW1ldGhvZHM9MzAKKworCisjIGNoZWNrcyBmb3IKKyMgKiBleHRlcm5hbCBtb2R1bGVzIGRlcGVuZGVuY2llcworIyAqIHJlbGF0aXZlIC8gd2lsZGNhcmQgaW1wb3J0cworIyAqIGN5Y2xpYyBpbXBvcnRzCisjICogdXNlcyBvZiBkZXByZWNhdGVkIG1vZHVsZXMKKyMKK1tJTVBPUlRTXQorCisjIERlcHJlY2F0ZWQgbW9kdWxlcyB3aGljaCBzaG91bGQgbm90IGJlIHVzZWQsIHNlcGFyYXRlZCBieSBhIGNvbW1hCitkZXByZWNhdGVkLW1vZHVsZXM9cmVnc3ViLHN0cmluZyxURVJNSU9TLEJhc3Rpb24scmV4ZWMKKworIyBDcmVhdGUgYSBncmFwaCBvZiBldmVyeSAoaS5lLiBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwpIGRlcGVuZGVuY2llcyBpbiB0aGUKKyMgZ2l2ZW4gZmlsZSAocmVwb3J0IFIwNDAyIG11c3Qgbm90IGJlIGRpc2FibGVkKQoraW1wb3J0LWdyYXBoPQorCisjIENyZWF0ZSBhIGdyYXBoIG9mIGV4dGVybmFsIGRlcGVuZGVuY2llcyBpbiB0aGUgZ2l2ZW4gZmlsZSAocmVwb3J0IFIwNDAyIG11c3QKKyMgbm90IGJlIGRpc2FibGVkKQorZXh0LWltcG9ydC1ncmFwaD0KKworIyBDcmVhdGUgYSBncmFwaCBvZiBpbnRlcm5hbCBkZXBlbmRlbmNpZXMgaW4gdGhlIGdpdmVuIGZpbGUgKHJlcG9ydCBSMDQwMiBtdXN0CisjIG5vdCBiZSBkaXNhYmxlZCkKK2ludC1pbXBvcnQtZ3JhcGg9CisKKworIyBjaGVja3MgZm9yIDoKKyMgKiBtZXRob2RzIHdpdGhvdXQgc2VsZiBhcyBmaXJzdCBhcmd1bWVudAorIyAqIG92ZXJyaWRkZW4gbWV0aG9kcyBzaWduYXR1cmUKKyMgKiBhY2Nlc3Mgb25seSB0byBleGlzdGFudCBtZW1iZXJzIHZpYSBzZWxmCisjICogYXR0cmlidXRlcyBub3QgZGVmaW5lZCBpbiB0aGUgX19pbml0X18gbWV0aG9kCisjICogc3VwcG9ydGVkIGludGVyZmFjZXMgaW1wbGVtZW50YXRpb24KKyMgKiB1bnJlYWNoYWJsZSBjb2RlCisjCitbQ0xBU1NFU10KKworIyBMaXN0IG9mIGludGVyZmFjZSBtZXRob2RzIHRvIGlnbm9yZSwgc2VwYXJhdGVkIGJ5IGEgY29tbWEuIFRoaXMgaXMgdXNlZCBmb3IKKyMgaW5zdGFuY2UgdG8gbm90IGNoZWNrIG1ldGhvZHMgZGVmaW5lcyBpbiBab3BlJ3MgSW50ZXJmYWNlIGJhc2UgY2xhc3MuCitpZ25vcmUtaWZhY2UtbWV0aG9kcz1pc0ltcGxlbWVudGVkQnksZGVmZXJyZWQsZXh0ZW5kcyxuYW1lcyxuYW1lc0FuZERlc2NyaXB0aW9ucyxxdWVyeURlc2NyaXB0aW9uRm9yLGdldEJhc2VzLGdldERlc2NyaXB0aW9uRm9yLGdldERvYyxnZXROYW1lLGdldFRhZ2dlZFZhbHVlLGdldFRhZ2dlZFZhbHVlVGFncyxpc0VxdWFsT3JFeHRlbmRlZEJ5LHNldFRhZ2dlZFZhbHVlLGlzSW1wbGVtZW50ZWRCeUluc3RhbmNlc09mLGFkYXB0V2l0aCxpc19pbXBsZW1lbnRlZF9ieQorCisjIExpc3Qgb2YgbWV0aG9kIG5hbWVzIHVzZWQgdG8gZGVjbGFyZSAoaS5lLiBhc3NpZ24pIGluc3RhbmNlIGF0dHJpYnV0ZXMuCitkZWZpbmluZy1hdHRyLW1ldGhvZHM9X19pbml0X18sX19uZXdfXyxzZXRVcAorCisKKyMgY2hlY2tzIGZvciBzaW1pbGFyaXRpZXMgYW5kIGR1cGxpY2F0ZWQgY29kZS4gVGhpcyBjb21wdXRhdGlvbiBtYXkgYmUKKyMgbWVtb3J5IC8gQ1BVIGludGVuc2l2ZSwgc28geW91IHNob3VsZCBkaXNhYmxlIGl0IGlmIHlvdSBleHBlcmltZW50cyBzb21lCisjIHByb2JsZW1zLgorIworW1NJTUlMQVJJVElFU10KKworIyBNaW5pbXVtIGxpbmVzIG51bWJlciBvZiBhIHNpbWlsYXJpdHkuCittaW4tc2ltaWxhcml0eS1saW5lcz00CisKKyMgSWdub3JlIGNvbW1lbnRzIHdoZW4gY29tcHV0aW5nIHNpbWlsYXJpdGllcy4KK2lnbm9yZS1jb21tZW50cz15ZXMKKworIyBJZ25vcmUgZG9jc3RyaW5ncyB3aGVuIGNvbXB1dGluZyBzaW1pbGFyaXRpZXMuCitpZ25vcmUtZG9jc3RyaW5ncz15ZXMKKworCisjIGNoZWNrcyBmb3I6CisjICogd2FybmluZyBub3RlcyBpbiB0aGUgY29kZSBsaWtlIEZJWE1FLCBYWFgKKyMgKiBQRVAgMjYzOiBzb3VyY2UgY29kZSB3aXRoIG5vbiBhc2NpaSBjaGFyYWN0ZXIgYnV0IG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uCisjCitbTUlTQ0VMTEFORU9VU10KKworIyBMaXN0IG9mIG5vdGUgdGFncyB0byB0YWtlIGluIGNvbnNpZGVyYXRpb24sIHNlcGFyYXRlZCBieSBhIGNvbW1hLgorbm90ZXM9RklYTUUsWFhYLFRPRE8KKworCisjIGNoZWNrcyBmb3IgOgorIyAqIHVuYXV0aG9yaXplZCBjb25zdHJ1Y3Rpb25zCisjICogc3RyaWN0IGluZGVudGF0aW9uCisjICogbGluZSBsZW5ndGgKKyMgKiB1c2Ugb2YgPD4gaW5zdGVhZCBvZiAhPQorIworW0ZPUk1BVF0KKworIyBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9uIGEgc2luZ2xlIGxpbmUuCittYXgtbGluZS1sZW5ndGg9ODAKKworIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyBpbiBhIG1vZHVsZQorbWF4LW1vZHVsZS1saW5lcz0xMDAwCisKKyMgU3RyaW5nIHVzZWQgYXMgaW5kZW50YXRpb24gdW5pdC4gVGhpcyBpcyB1c3VhbGx5ICIgICAgIiAoNCBzcGFjZXMpIG9yICJcdCIgKDEKKyMgdGFiKS4gIEluIHJlcG8gaXQgaXMgMiBzcGFjZXMuCitpbmRlbnQtc3RyaW5nPScgICcKZGlmZiAtLWdpdCBhL2NvbnRyaWIvZmFrZV9sZGFwLnBsIGIvY29udHJpYi9mYWtlX2xkYXAucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MjNhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL2Zha2VfbGRhcC5wbApAQCAtMCwwICsxLDMzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIEZha2UgTERBUCBzZXJ2ZXIgZm9yIEdlcnJpdAorIyBBdXRob3I6IE9saXZpZXIgQ3JvcXVldHRlIDxvY3JvcXVldHRlQGZyZWUuZnI+CisjIExhc3QgY2hhbmdlOiAyMDEyLTExLTEyCisjCisjIEFic3RyYWN0OgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBHZXJyaXQgY3VycmVudGx5IHN1cHBvcnRzIHNldmVyYWwgYXV0aGVudGljYXRpb24gc2NoZW1lcywgYnV0CisjIHVuZm9ydHVuYXRlbHkgbm90IHRoZSBtb3N0IGJhc2ljIG9uZSwgZS5nLiBsb2NhbCBhY2NvdW50cyB3aXRoCisjIGxvY2FsIHBhc3N3b3Jkcy4KKyMKKyMgQXMgYSB3b3JrYXJvdW5kLCB0aGlzIHNjcmlwdCBpbXBsZW1lbnRzIGEgbWluaW1hbCBMREFQIHNlcnZlcgorIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGF1dGhlbnRpY2F0ZSBhZ2FpbnN0IEdlcnJpdC4gVGhlIGluZm9ybWF0aW9uCisjIHJlcXVpcmVkIGJ5IEdlcnJpdCByZWxhdGl2ZSB0byB1c2VycyAodXNlciBJRCwgcGFzc3dvcmQsIGRpc3BsYXkKKyMgbmFtZSwgZW1haWwpIGlzIHN0b3JlZCBpbiBhIHRleHQgZmlsZSBzaW1pbGFyIHRvIC9ldGMvcGFzc3dkCisjCisjCisjIFVzYWdlIChzZWUgYmVsb3cgZm9yIHRoZSBzZXR1cCkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgVG8gY3JlYXRlIGEgbmV3IGZpbGUgdG8gc3RvcmUgdGhlIHVzZXIgaW5mb3JtYXRpb246CisjICAgZmFrZS1sZGFwIGVkaXR1c2VyIC0tZGF0YWZpbGUgL3BhdGgvZGF0YWZpbGUgLS11c2VybmFtZSBtYXhwb3dlciBcCisjICAgICAtLWRpc3BsYXluYW1lICJNYXggUG93ZXIiIC0tZW1haWwgbWF4LnBvd2VyQHByb3ZpZGVyLmNvbQorIworIyBUbyBtb2RpZnkgYW4gZXhpc3RpbmcgdXNlciAoZm9yIGluc3RhbmNlIHRoZSBlbWFpbCk6CisjICAgZmFrZS1sZGFwIGVkaXR1c2VyIC0tZGF0YWZpbGUgL3BhdGgvZGF0YWZpbGUgLS11c2VybmFtZSBvY3JvcXVldHRlIFwKKyMgICAgIC0tZW1haWwgbWF4LnBvd2VyQHByb3ZpZGVyMi5jb20KKyMKKyMgVG8gc2V0IGEgbmV3IHBhc3N3b3JkIGZvciBhbiBleGlzdGluZyB1c2VyOgorIyAgIGZha2UtbGRhcCBlZGl0dXNlciAtLWRhdGFmaWxlIC9wYXRoL2RhdGFmaWxlIC0tdXNlcm5hbWUgb2Nyb3F1ZXR0ZSBcCisjICAgICAtLXBhc3N3b3JkICIiCisjCisjIFRvIHN0YXJ0IHRoZSBzZXJ2ZXI6CisjICAgZmFrZS1sZGFwIHN0YXJ0IC0tZGF0YWZpbGUgL3BhdGgvZGF0YWZpbGUKKyMKKyMgVGhlIHNlcnZlciByZWFkcyB0aGUgdXNlciBkYXRhIGZpbGUgb24gZWFjaCBuZXcgY29ubmVjdGlvbi4gSXQncyBub3QKKyMgc2NhbGFibGUgYnV0IGl0IHNob3VsZCBub3QgYmUgYSBwcm9ibGVtIGZvciB0aGUgaW50ZW5kZWQgdXNhZ2UKKyMgKHNtYWxsIHRlYW1zLCB0ZXN0aW5nLC4uLikKKyMKKyMKKyMgU2V0dXAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBJbnN0YWxsIHRoZSBkZXBlbmRlbmNpZXMKKyMKKyMgICBJbnN0YWxsIHRoZSBQZXJsIG1vZHVsZSBkZXBlbmRlbmNpZXMuIE9uIERlYmlhbiBhbmQgTWFjUG9ydHMsCisjICAgYWxsIG1vZHVsZXMgYXJlIGF2YWlsYWJsZSBhcyBwYWNrYWdlcywgZXhjZXB0IE5ldDo6TERBUDo6U2VydmVyLgorIworIyAgIERlYmlhbjogYXB0LWdldCBpbnN0YWxsIGxpYnRlcm0tcmVhZGtleS1wZXJsCisjCisjICAgU2luY2UgTmV0OjpMREFQOjpTZXJ2ZXIgY29uc2lzdHMgb25seSBvZiBvbmUgZmlsZSwgeW91IGNhbiBwdXQgaXQKKyMgICBhbG9uZyB0aGUgc2NyaXB0IGluIE5ldC9MREFQL1NlcnZlci5wbQorIworIyBDcmVhdGUgdGhlIGRhdGEgZmlsZSB3aXRoIHRoZSBmaXJzdCB1c2VyIChzZWUgYWJvdmUpCisjCisjIFN0YXJ0IGFzIHRoZSBzY3JpcHQgYSBzZXJ2ZXIgKCJzdGFydCIgY29tbWFuZCwgc2VlIGFib3ZlKQorIworIyBDb25maWd1cmUgR2Vycml0IHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOgorIworIyAgIGdlcnJpdC5jYW5vbmljYWxXZWJVcmwgPSAuLi4gKHdvcmthcm91bmQgZm9yIGEga25vd24gR2Vycml0IGJ1ZykKKyMgICBhdXRoLnR5cGUgPSBMREFQX0JJTkQKKyMgICBsZGFwLnNlcnZlciA9IGxkYXA6Ly9sb2NhbGhvc3Q6MTAzODkKKyMgICBsZGFwLmFjY291bnRCYXNlID0gb3U9UGVvcGxlLGRjPW5vZG9tYWluCisjICAgbGRhcC5ncm91cEJhc2UgPSBvdT1Hcm91cCxkYz1ub2RvbWFpbgorIworIyBTdGFydCBHZXJyaXQKKyMKKyMgTG9nIG9uIGluIHRoZSBXZWIgaW50ZXJmYWNlCisjCisjIElmIHlvdSB3YW50IHRoZSBmYWtlIExEQVAgc2VydmVyIHRvIHN0YXJ0IGF0IGJvb3QgdGltZSwgYWRkIGl0IHRvCisjIC9ldGMvaW5pdHRhYiwgd2l0aCBhIGxpbmUgbGlrZToKKyMKKyMgbGQxOjY6cmVzcGF3bjpzdSBzb21ldXNlciAvcGF0aC9mYWtlLWxkYXAgc3RhcnQgLS1kYXRhZmlsZSAvcGF0aC9kYXRhZmlsZQorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3VzZSBzdHJpY3Q7CisKKyMgR2xvYmFsIHZhciBjb250YWluaW5nIHRoZSBvcHRpb25zIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lOgorbXkgJWNtZExpbmVPcHRpb25zOworCisjIEdsb2JhbCB2YXIgY29udGFpbmluZyB0aGUgdXNlciBkYXRhIHJlYWQgZnJvbSB0aGUgZGF0YSBmaWxlOgorbXkgJXVzZXJEYXRhOworCitteSAkZGVmYXVsdHBvcnQgPSAxMDM4OTsKKworcGFja2FnZSBNeVNlcnZlcjsKKwordXNlIERhdGE6OkR1bXBlcjsKK3VzZSBOZXQ6OkxEQVA6OlNlcnZlcjsKK3VzZSBOZXQ6OkxEQVA6OkNvbnN0YW50IHF3KExEQVBfU1VDQ0VTUyBMREFQX0lOVkFMSURfQ1JFREVOVElBTFMgTERBUF9PUEVSQVRJT05TX0VSUk9SKTsKK3VzZSBJTzo6U29ja2V0OwordXNlIElPOjpTZWxlY3Q7Cit1c2UgVGVybTo6UmVhZEtleTsKKwordXNlIEdldG9wdDo6TG9uZzsKKwordXNlIGJhc2UgJ05ldDo6TERBUDo6U2VydmVyJzsKKworc3ViIGJpbmQgeworICBteSAkc2VsZiA9IHNoaWZ0OworICBteSAoJHJlcURhdGEsICRmdWxsUmVxdWVzdCkgPSBAXzsKKworICBwcmludCAiYmluZCBjYWxsZWRcbiIgaWYgJGNtZExpbmVPcHRpb25ze3ZlcmJvc2V9ID49IDE7CisgIHByaW50IER1bXBlcihcQF8pIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAyOworICBteSAkc2hhMSA9IHVuZGVmOworICBteSAkdWlkID0gdW5kZWY7CisgIGV2YWx7CisgICAgJHVpZCA9ICRyZXFEYXRhLT57bmFtZX07CisgICAgJHNoYTEgPSBtYWluOjplbmNyeXB0cHdkKCR1aWQsICRyZXFEYXRhLT57YXV0aGVudGljYXRpb259LT57c2ltcGxlfSkKKyAgfTsKKyAgaWYgKCRAKSB7CisgICAgd2FybiAkQDsKKyAgICByZXR1cm4oeworICAgICAgICAnbWF0Y2hlZEROJyA9PiAnJywKKyAgICAgICAgJ2Vycm9yTWVzc2FnZScgPT4gJEAsCisgICAgICAgICdyZXN1bHRDb2RlJyA9PiBMREFQX09QRVJBVElPTlNfRVJST1IKKyAgICB9KTsKKyAgfQorCisgIHByaW50ICRzaGExIC4gIlxuIiBpZiAkY21kTGluZU9wdGlvbnN7dmVyYm9zZX0gPj0gMjsKKyAgcHJpbnQgRHVtcGVyKCR1c2VyRGF0YXskdWlkfSkgLiAiXG4iIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAyOworCisgIGlmICggZGVmaW5lZCgkc2hhMSkgJiYgJHNoYTEgJiYgJHVzZXJEYXRheyR1aWR9ICYmICggJHNoYTEgZXEgJHVzZXJEYXRheyR1aWR9LT57cGFzc3dvcmR9ICkgKSB7CisgICAgcHJpbnQgImF1dGhlbnRpY2F0aW9uIG9mICR1aWQgc3VjY2VlZGVkXG4iIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAxOworICAgIHJldHVybih7CisgICAgICAnbWF0Y2hlZEROJyA9PiAiZG49JHVpZCxvdT1QZW9wbGUsZGM9bm9kb21haW4iLAorICAgICAgJ2Vycm9yTWVzc2FnZScgPT4gJycsCisgICAgICAncmVzdWx0Q29kZScgPT4gTERBUF9TVUNDRVNTCisgICAgfSk7CisgIH0KKyAgZWxzZSB7CisgICAgcHJpbnQgImF1dGhlbnRpY2F0aW9uIG9mICR1aWQgZmFpbGVkXG4iIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAxOworICAgIHJldHVybih7CisgICAgICAnbWF0Y2hlZEROJyA9PiAnJywKKyAgICAgICdlcnJvck1lc3NhZ2UnID0+ICcnLAorICAgICAgJ3Jlc3VsdENvZGUnID0+IExEQVBfSU5WQUxJRF9DUkVERU5USUFMUworICAgIH0pOworICB9Cit9CisKK3N1YiBzZWFyY2ggeworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgKCRyZXFEYXRhLCAkZnVsbFJlcXVlc3QpID0gQF87CisgICAgcHJpbnQgInNlYXJjaCBjYWxsZWRcbiIgaWYgJGNtZExpbmVPcHRpb25ze3ZlcmJvc2V9ID49IDE7CisgICAgcHJpbnQgRHVtcGVyKCRyZXFEYXRhKSAgaWYgJGNtZExpbmVPcHRpb25ze3ZlcmJvc2V9ID49IDI7CisgICAgbXkgQGVudHJpZXM7CisgICAgaWYgKCAkcmVxRGF0YS0+e2Jhc2VPYmplY3R9IGVxICdvdT1QZW9wbGUsZGM9bm9kb21haW4nICkgeworICAgICAgICBteSAkdWlkID0gJHJlcURhdGEtPntmaWx0ZXJ9LT57ZXF1YWxpdHlNYXRjaH0tPnthc3NlcnRpb25WYWx1ZX07CisgICAgICAgIHB1c2ggQGVudHJpZXMsIE5ldDo6TERBUDo6RW50cnktPm5ldyAoICJkbj0kdWlkLG91PVBlb3BsZSxkYz1ub2RvbWFpbiIsCisgICAgICAgLCAnb2JqZWN0TmFtZSc9PiJkbj11aWQsb3U9UGVvcGxlLGRjPW5vZG9tYWluIiwgJ3VpZCc9PiR1aWQsICdtYWlsJz0+JHVzZXJEYXRheyR1aWR9LT57ZW1haWx9LCAnZGlzcGxheU5hbWUnPT4kdXNlckRhdGF7JHVpZH0tPntkaXNwbGF5TmFtZX0pOworICAgfQorICAgZWxzaWYgKCAkcmVxRGF0YS0+e2Jhc2VPYmplY3R9IGVxICdvdT1Hcm91cCxkYz1ub2RvbWFpbicgICkgeworICAgICAgICBwdXNoIEBlbnRyaWVzLCBOZXQ6OkxEQVA6OkVudHJ5LT5uZXcgKCAnZG49VXNlcnMsb3U9R3JvdXAsZGM9bm9kb21haW4nLAorICAgICAgICwgJ29iamVjdE5hbWUnPT4nZG49VXNlcnMsb3U9R3JvdXAsZGM9bm9kb21haW4nKTsKKyAgIH0KKworICAgIHJldHVybiB7CisgICAgICAgICdtYXRjaGVkRE4nID0+ICcnLAorICAgICAgICAnZXJyb3JNZXNzYWdlJyA9PiAnJywKKyAgICAgICAgJ3Jlc3VsdENvZGUnID0+IExEQVBfU1VDQ0VTUworICAgIH0sIEBlbnRyaWVzOworfQorCisKK3BhY2thZ2UgbWFpbjsKKwordXNlIERpZ2VzdDo6U0hBMSAgcXcoc2hhMSBzaGExX2hleCBzaGExX2Jhc2U2NCk7CisKK3N1YiBleGl0V2l0aEVycm9yIHsKKyAgbXkgJG1zZyA9IHNoaWZ0OworICBwcmludCBTVERFUlIgJG1zZyAuICJcbiI7CisgIGV4aXQoMSk7Cit9CisKK3N1YiBlbmNyeXB0cHdkIHsKKyAgbXkgKCR1aWQsICRwYXNzd2QpID0gQF87CisgICMgVXNlIHRoZSB1c2VyIGlkIHRvIGNvbXB1dGUgdGhlIGhhc2gsIHRvIGF2b2lkIHJhaW5ib3ggdGFibGUgYXR0YWNrcworICByZXR1cm4gc2hhMV9oZXgoJHVpZC4kcGFzc3dkKTsKK30KKworbXkgJHJlc3VsdCA9IEdldG9wdDo6TG9uZzo6R2V0T3B0aW9ucyAoCisgICJwb3J0PWkiICAgICAgICA9PiBcJGNtZExpbmVPcHRpb25ze3BvcnR9LAorICAiZGF0YWZpbGU9cyIgICAgPT4gXCRjbWRMaW5lT3B0aW9uc3tkYXRhZmlsZX0sCisgICJlbWFpbD1zIiAgICAgICA9PiBcJGNtZExpbmVPcHRpb25ze2VtYWlsfSwKKyAgImRpc3BsYXluYW1lPXMiID0+IFwkY21kTGluZU9wdGlvbnN7ZGlzcGxheU5hbWV9LAorICAidXNlcm5hbWU9cyIgICAgPT4gXCRjbWRMaW5lT3B0aW9uc3t1c2VyTmFtZX0sCisgICJwYXNzd29yZD1zIiAgICA9PiBcJGNtZExpbmVPcHRpb25ze3Bhc3N3b3JkfSwKKyAgInZlcmJvc2U9aSIgICAgID0+IFwkY21kTGluZU9wdGlvbnN7dmVyYm9zZX0sCispOworZXhpdFdpdGhFcnJvcigiRmFpbGVkIHRvIHBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMiKSBpZiAhICRyZXN1bHQ7CitleGl0V2l0aEVycm9yKCJQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIHBhdGggZm9yIHRoZSBkYXRhZmlsZSIpIGlmICEgJGNtZExpbmVPcHRpb25ze2RhdGFmaWxlfTsKKworbXkgQGNvbW1hbmRzID0gcXcoc3RhcnQgZWRpdHVzZXIpOworaWYgKCBAQVJHViAhPSAxIHx8ICEgZ3JlcCB7JF8gZXEgJEFSR1ZbMF19IEBjb21tYW5kcyApIHsKKyAgZXhpdFdpdGhFcnJvcigiUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCBjb21tYW5kIGFtb25nOiAiIC4gam9pbigiLCIsIEBjb21tYW5kcykpOworfQorCitteSAkY29tbWFuZCA9ICRBUkdWWzBdOworaWYgKCAkY29tbWFuZCBlcSAic3RhcnQiKSB7CisgIHN0YXJ0U2VydmVyKCk7Cit9CitlbHNpZiAoICRjb21tYW5kIGVxICJlZGl0dXNlciIpIHsKKyAgZWRpdFVzZXIoKTsKK30KKworCitzdWIgc3RhcnRTZXJ2ZXIoKSB7CisKKyAgbXkgJHBvcnQgPSAkY21kTGluZU9wdGlvbnN7cG9ydH0gfHwgJGRlZmF1bHRwb3J0OworCisgIHByaW50ICJzdGFydGluZyBvbiBwb3J0ICRwb3J0XG4iIGlmICRjbWRMaW5lT3B0aW9uc3t2ZXJib3NlfSA+PSAxOworCisgIG15ICRzb2NrID0gSU86OlNvY2tldDo6SU5FVC0+bmV3KAorICAgIExpc3RlbiA9PiA1LAorICAgIFByb3RvID0+ICd0Y3AnLAorICAgIFJldXNlID0+IDEsCisgICAgTG9jYWxBZGRyID0+ICJsb2NhbGhvc3QiLCAjIENvbW1lbnQgdGhpcyBsaW5lIGlmIEdlcnJpdCBkb2Vzbid0IHJ1biBvbiB0aGlzIGhvc3QKKyAgICBMb2NhbFBvcnQgPT4gJHBvcnQKKyAgKTsKKworICBteSAkc2VsID0gSU86OlNlbGVjdC0+bmV3KCRzb2NrKTsKKyAgbXkgJUhhbmRsZXJzOworICB3aGlsZSAobXkgQHJlYWR5ID0gJHNlbC0+Y2FuX3JlYWQpIHsKKyAgICBmb3JlYWNoIG15ICRmaCAoQHJlYWR5KSB7CisgICAgICBpZiAoJGZoID09ICRzb2NrKSB7CisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBkYXRhIGlzIHVwIHRvIGRhdGUgb24gbmV3IGV2ZXJ5IGNvbm5lY3Rpb24KKyAgICAgICAgcmVhZFVzZXJEYXRhKCk7CisKKyAgICAgICAgIyBsZXQncyBjcmVhdGUgYSBuZXcgc29ja2V0CisgICAgICAgIG15ICRwc29jayA9ICRzb2NrLT5hY2NlcHQ7CisgICAgICAgICRzZWwtPmFkZCgkcHNvY2spOworICAgICAgICAkSGFuZGxlcnN7KiRwc29ja30gPSBNeVNlcnZlci0+bmV3KCRwc29jayk7CisgICAgICB9IGVsc2UgeworICAgICAgICBteSAkcmVzdWx0ID0gJEhhbmRsZXJzeyokZmh9LT5oYW5kbGU7CisgICAgICAgIGlmICgkcmVzdWx0KSB7CisgICAgICAgICAgIyB3ZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhlIHNvY2tldAorICAgICAgICAgICRzZWwtPnJlbW92ZSgkZmgpOworICAgICAgICAgICRmaC0+Y2xvc2U7CisgICAgICAgICAgZGVsZXRlICRIYW5kbGVyc3sqJGZofTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdWIgcmVhZFVzZXJEYXRhIHsKKyAgJXVzZXJEYXRhID0gKCk7CisgIG9wZW4gKE1ZRklMRSwgIjwkY21kTGluZU9wdGlvbnN7ZGF0YWZpbGV9IikgfHwgZXhpdFdpdGhFcnJvcigiQ291bGQgbm90IG9wZW4gXCIkY21kTGluZU9wdGlvbnN7ZGF0YWZpbGV9XCIgZm9yIHJlYWRpbmciKTsKKyAgd2hpbGUgKDxNWUZJTEU+KSB7CisgICAgY2hvbXA7CisgICAgbXkgQGZpZWxkcyA9IHNwbGl0KC86LywgJF8pOworICAgICR1c2VyRGF0YXskZmllbGRzWzBdfSA9IHsgcGFzc3dvcmQ9PiRmaWVsZHNbMV0sIGRpc3BsYXlOYW1lPT4kZmllbGRzWzJdLCBlbWFpbD0+JGZpZWxkc1szXSB9OworICB9CisgIGNsb3NlIChNWUZJTEUpOworfQorCitzdWIgd3JpdGVVc2VyRGF0YSB7CisgIG9wZW4gKE1ZRklMRSwgIj4kY21kTGluZU9wdGlvbnN7ZGF0YWZpbGV9IikgfHwgZXhpdFdpdGhFcnJvcigiQ291bGQgbm90IG9wZW4gXCIkY21kTGluZU9wdGlvbnN7ZGF0YWZpbGV9XCIgZm9yIHdyaXRpbmciKTsKKyAgZm9yZWFjaCBteSAkdXNlcmlkIChzb3J0KGtleXMoJXVzZXJEYXRhKSkpIHsKKyAgICBteSAkdXNlckluZm8gPSAkdXNlckRhdGF7JHVzZXJpZH07CisgICAgcHJpbnQgTVlGSUxFIGpvaW4oIjoiLAorICAgICAgJHVzZXJpZCwKKyAgICAgICR1c2VySW5mby0+e3Bhc3N3b3JkfSwKKyAgICAgICR1c2VySW5mby0+e2Rpc3BsYXlOYW1lfSwKKyAgICAgICR1c2VySW5mby0+e2VtYWlsfQorICAgICAgKS4gIlxuIjsKKyAgfQorICBjbG9zZSAoTVlGSUxFKTsKK30KKworc3ViIHJlYWRQYXNzd29yZCB7CisgIFRlcm06OlJlYWRLZXk6OlJlYWRNb2RlKCdub2VjaG8nKTsKKyAgbXkgJHBhc3N3b3JkID0gVGVybTo6UmVhZEtleTo6UmVhZExpbmUoMCk7CisgIFRlcm06OlJlYWRLZXk6OlJlYWRNb2RlKCdub3JtYWwnKTsKKyAgcHJpbnQgIlxuIjsKKyAgcmV0dXJuICRwYXNzd29yZDsKK30KKworc3ViIHJlYWRBbmRDb25maXJtUGFzc3dvcmQgeworICBwcmludCAiUGxlYXNlIGVudGVyIHRoZSBwYXNzd29yZDogIjsKKyAgbXkgJHB3ZCA9IHJlYWRQYXNzd29yZCgpOworICBwcmludCAiUGxlYXNlIHJlLWVudGVyIHRoZSBwYXNzd29yZDogIjsKKyAgbXkgJHB3ZENoZWNrID0gcmVhZFBhc3N3b3JkKCk7CisgIGV4aXRXaXRoRXJyb3IoIlRoZSBwYXNzd29yZHMgYXJlIGRpZmZlcmVudCIpIGlmICRwd2QgbmUgJHB3ZENoZWNrOworICByZXR1cm4gJHB3ZDsKK30KKworc3ViIGVkaXRVc2VyIHsKKyAgZXhpdFdpdGhFcnJvcigiUGxlYXNlIHByb3ZpZGUgYSB2YWxpZCB1c2VyIG5hbWUiKSBpZiAhICRjbWRMaW5lT3B0aW9uc3t1c2VyTmFtZX07CisgIG15ICR1c2VyTmFtZSA9ICRjbWRMaW5lT3B0aW9uc3t1c2VyTmFtZX07CisKKyAgcmVhZFVzZXJEYXRhKCkgaWYgLXIgJGNtZExpbmVPcHRpb25ze2RhdGFmaWxlfTsKKworICBteSAkZW5jcnlwdGVkUGFzc3dvcmQgPSB1bmRlZjsKKyAgaWYgKCAhIGRlZmluZWQoJHVzZXJEYXRheyR1c2VyTmFtZX0pICkgeworICAgICMgTmV3IHVzZXIKKworICAgIGV4aXRXaXRoRXJyb3IoIlBsZWFzZSBwcm92aWRlIGEgdmFsaWQgZGlzcGxheSBuYW1lIikgaWYgISAkY21kTGluZU9wdGlvbnN7ZGlzcGxheU5hbWV9OworICAgIGV4aXRXaXRoRXJyb3IoIlBsZWFzZSBwcm92aWRlIGEgdmFsaWQgZW1haWwiKSBpZiAhICRjbWRMaW5lT3B0aW9uc3tlbWFpbH07CisKKyAgICAkdXNlckRhdGF7JHVzZXJOYW1lfSA9IHsgfTsKKworICAgIGlmICggISBkZWZpbmVkKCRjbWRMaW5lT3B0aW9uc3twYXNzd29yZH0pICkgeworICAgICAgIyBObyBwYXNzd29yZCBwcm92aWRlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3JjZSByZWFkaW5nIGZyb20gdGVybWluYWwuCisgICAgICAkY21kTGluZU9wdGlvbnN7cGFzc3dvcmR9ID0gIiI7CisgICAgfQorICB9CisKKyAgaWYgKCBkZWZpbmVkKCRjbWRMaW5lT3B0aW9uc3twYXNzd29yZH0pICYmICEgJGNtZExpbmVPcHRpb25ze3Bhc3N3b3JkfSApIHsKKyAgICAkY21kTGluZU9wdGlvbnN7cGFzc3dvcmR9ID0gcmVhZEFuZENvbmZpcm1QYXNzd29yZCgpOworICAgIGV4aXRXaXRoRXJyb3IoIlBsZWFzZSBwcm92aWRlIGEgbm9uIGVtcHR5IHBhc3N3b3JkIikgaWYgISAkY21kTGluZU9wdGlvbnN7cGFzc3dvcmR9OworICB9CisKKworICBpZiAoICRjbWRMaW5lT3B0aW9uc3twYXNzd29yZH0gKSB7CisgICAgJGVuY3J5cHRlZFBhc3N3b3JkID0gZW5jcnlwdHB3ZCgkdXNlck5hbWUsICRjbWRMaW5lT3B0aW9uc3twYXNzd29yZH0pOworICB9CisKKworICAkdXNlckRhdGF7JHVzZXJOYW1lfS0+e3Bhc3N3b3JkfSAgICA9ICRlbmNyeXB0ZWRQYXNzd29yZCBpZiAkZW5jcnlwdGVkUGFzc3dvcmQ7CisgICR1c2VyRGF0YXskdXNlck5hbWV9LT57ZGlzcGxheU5hbWV9ID0gJGNtZExpbmVPcHRpb25ze2Rpc3BsYXlOYW1lfSBpZiAkY21kTGluZU9wdGlvbnN7ZGlzcGxheU5hbWV9OworICAkdXNlckRhdGF7JHVzZXJOYW1lfS0+e2VtYWlsfSAgICAgICA9ICRjbWRMaW5lT3B0aW9uc3tlbWFpbH0gaWYgJGNtZExpbmVPcHRpb25ze2VtYWlsfTsKKyAgIyBwcmludCBEYXRhOjpEdW1wZXI6OkR1bXBlcihcJXVzZXJEYXRhKTsKKworICBwcmludCAiTmV3IHVzZXIgZGF0YSBmb3IgJGNtZExpbmVPcHRpb25ze3VzZXJOYW1lfTpcbiI7CisgIGZvcmVhY2ggKCBzb3J0KGtleXMoJXskdXNlckRhdGF7JHVzZXJOYW1lfX0pKSkgeworICAgIHByaW50ZiAiICAlLTE1cyA6ICVzXG4iLCAkXywgJHVzZXJEYXRheyR1c2VyTmFtZX0tPnskX30KKyAgfQorICB3cml0ZVVzZXJEYXRhKCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aGVtZXMvZGlmZnkvZXRjL0dlcnJpdFNpdGUuY3NzIGIvY29udHJpYi90aGVtZXMvZGlmZnkvZXRjL0dlcnJpdFNpdGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzY5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RoZW1lcy9kaWZmeS9ldGMvR2Vycml0U2l0ZS5jc3MKQEAgLTAsMCArMSwyOSBAQAorLyogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZ2Vycml0X3RvcG1lbnUgeworICBsZWZ0OiA2MHB4OworICBtYXJnaW4tcmlnaHQ6IDYwcHg7CisgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CisgIHBvc2l0aW9uOiByZWxhdGl2ZTsKK30KKworI2RpZmZ5X2xvZ28geworICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OworICBtYXJnaW4tYm90dG9tOiAtNTVweDsKKyAgcGFkZGluZy1sZWZ0OiAyMHB4OworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogLTQ1cHg7CisgIHdpZHRoOiA2MHB4OworfQpkaWZmIC0tZ2l0IGEvY29udHJpYi90aGVtZXMvZGlmZnkvZXRjL0dlcnJpdFNpdGVIZWFkZXIuaHRtbCBiL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L2V0Yy9HZXJyaXRTaXRlSGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliNGRiNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L2V0Yy9HZXJyaXRTaXRlSGVhZGVyLmh0bWwKQEAgLTAsMCArMSw1IEBACis8ZGl2PgorICA8ZGl2IGlkPSJkaWZmeV9sb2dvIj4KKyAgICA8aW1nIHdpZHRoPSI1MCIgaGVpZ2h0PSI0NiIgc3JjPSJzdGF0aWMvbG9nby5wbmciLz4KKyAgPC9kaXY+Cis8L2Rpdj4KZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L3N0YXRpYy9sb2dvLnBuZyBiL2NvbnRyaWIvdGhlbWVzL2RpZmZ5L3N0YXRpYy9sb2dvLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODljMzAzCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi90aGVtZXMvZGlmZnkvc3RhdGljL2xvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvZXRjL0dlcnJpdFNpdGUuY3NzIGIvY29udHJpYi90aGVtZXMvc3BvdGlmeS9ldGMvR2Vycml0U2l0ZS5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5NDUyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvZXRjL0dlcnJpdFNpdGUuY3NzCkBAIC0wLDAgKzEsMTEzIEBACisjZ2Vycml0X3RvcG1lbnUgeworCWZvbnQtc2l6ZTogOXB0ICFpbXBvcnRhbnQ7CisJcGFkZGluZy10b3A6IDVweCAhaW1wb3J0YW50OworCXBhZGRpbmctbGVmdDogMTVweCAhaW1wb3J0YW50OworCXBhZGRpbmctcmlnaHQ6IDE1cHggIWltcG9ydGFudDsKKwliYWNrZ3JvdW5kOiB1cmwoc3RhdGljL2JhY2tncm91bmQtc3BvdGlncmVlbi5qcGcpICFpbXBvcnRhbnQ7CisJZmxvYXQ6IGxlZnQgIWltcG9ydGFudDsKKwltYXJnaW4tbGVmdDogMjUwcHggIWltcG9ydGFudDsKKwltYXJnaW4tcmlnaHQ6IDE1MHB4ICFpbXBvcnRhbnQ7CisJYm9yZGVyLXJhZGl1czogMCAwIDEwcHggMTBweCAhaW1wb3J0YW50OworCXBhZGRpbmctYm90dG9tOiAxMHB4ICFpbXBvcnRhbnQ7CisJYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNhYmM1MDYgIWltcG9ydGFudDsKKwlib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYWJjNTA2ICFpbXBvcnRhbnQ7CisJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYWJjNTA2ICFpbXBvcnRhbnQ7Cit9CisKK2JvZHksIC5nd3QtRGlhbG9nQm94IC5kaWFsb2dNaWRkbGVDZW50ZXIgeworCWJhY2tncm91bmQ6ICNGRkYgdXJsKHN0YXRpYy9iYWNrZ3JvdW5kLWdyYWRpZW50LnBuZykgbm8tcmVwZWF0ICFpbXBvcnRhbnQ7Cit9CisKKyNsb2dvLXNwb3RpZnkgeworCWJhY2tncm91bmQ6IHVybChzdGF0aWMvbG9nby5wbmcpIG5vLXJlcGVhdDsKKwloZWlnaHQ6IDk4cHg7CisJd2lkdGg6IDIyOHB4OworCW1hcmdpbi1sZWZ0OiAycHg7Cit9CisKKyNnZXJyaXRfaGVhZGVyIHsKKwliYWNrZ3JvdW5kOiAjRkNGRUVGOworCXBhZGRpbmctYm90dG9tOiAxMHB4OworCWJvcmRlci1ib3R0b206IGRhc2hlZCAxcHggcmdiYSgwLCAwLCAwLCAwLjA1KTsKK30KKworI2dlcnJpdF90b3BtZW51IC5nd3QtVGV4dEJveCB7CisJbWFyZ2luLXRvcDogMTVweDsKKwl3aWR0aDogMjQwcHg7Cit9CisKKyNnZXJyaXRfdG9wbWVudSA+IHRhYmxlIHsKKyAgICBmbG9hdDogbGVmdDsKK30KKworI2dlcnJpdF90b3BtZW51ID4gdGFibGUgPiB0Ym9keSA+IHRyID4gdGQ6bnRoLWNoaWxkKDMpIGEgeworCW1hcmdpbi1sZWZ0OiA1cHg7CisJYmFja2dyb3VuZC1jb2xvcjogI0ZGQzsKKwlib3JkZXItcmFkaXVzOiAzcHg7CisJcGFkZGluZzogNXB4IDVweDsKKwlib3JkZXItcmlnaHQ6IG5vbmUgIWltcG9ydGFudDsKK30KKworLmd3dC1UYWJQYW5lbEJvdHRvbSB7CisJYmFja2dyb3VuZDogI0ZGQyAhaW1wb3J0YW50OworCWJvcmRlci1yYWRpdXM6IDAgMCAzcHggM3B4ICFpbXBvcnRhbnQ7CisJcGFkZGluZy1ib3R0b206IDZweCAhaW1wb3J0YW50OworCXBhZGRpbmctdG9wOiA2cHggIWltcG9ydGFudDsKK30KKworLmd3dC1UYWJCYXIgLmd3dC1UYWJCYXJJdGVtLCAuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhclJlc3QsIC5nd3QtVGFiQmFyIC5nd3QtVGFiUGFuZWxCb3R0b20geworCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7Cit9CisKKy5nd3QtVGFiQmFySXRlbS13cmFwcGVyIHsKKwliYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMikgIWltcG9ydGFudDsKK30KKworI2dlcnJpdF90b3BtZW51IC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbS1zZWxlY3RlZCB7CisJYmFja2dyb3VuZDogI0ZGQyAhaW1wb3J0YW50OworCWJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwICFpbXBvcnRhbnQ7Cit9CisKKyNnZXJyaXRfdG9wbWVudSAuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhckl0ZW0tc2VsZWN0ZWQ6aG92ZXIgeworCWJhY2tncm91bmQ6ICNGRkMgIWltcG9ydGFudDsKK30KKworI2dlcnJpdF90b3BtZW51IC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbS1zZWxlY3RlZDpmb2N1cyB7CisJb3V0bGluZTogbm9uZSAhaW1wb3J0YW50OworfQorCisjZ2Vycml0X3RvcG1lbnUgPiB0YWJsZSA+IHRib2R5ID4gdHIgPiB0ZCA+IHRhYmxlIHsKKwlib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKK30KKworLmd3dC1UYWJCYXIgeworCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTJFMkFEICFpbXBvcnRhbnQ7Cit9CisKKy5nd3QtVGFiQmFySXRlbSB7CisJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiYSg3OSwgNTgsIDAsIDAuMykgIWltcG9ydGFudDsKKwliYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMikgIWltcG9ydGFudDsKK30KKworLmd3dC1UYWJCYXJJdGVtOmhvdmVyIHsKKwliYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSkgIWltcG9ydGFudDsKK30KKworYSwgYTp2aXNpdGVkIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKKwljb2xvcjogIzNGNEQwMCAhaW1wb3J0YW50OworfQorCithOmhvdmVyIHsKKwljb2xvcjogIzVkNzIwMCAhaW1wb3J0YW50OworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lICFpbXBvcnRhbnQ7Cit9CisKKy5nd3QtTGFiZWwgeworaGVpZ2h0OiAzMHB4ICFpbXBvcnRhbnQ7CitsaW5lLWhlaWdodDogMzBweCAhaW1wb3J0YW50OworfQorCisjZ2Vycml0X2J0bW1lbnUgPiBkaXYgeworCWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMykgIWltcG9ydGFudDsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250cmliL3RoZW1lcy9zcG90aWZ5L2V0Yy9HZXJyaXRTaXRlSGVhZGVyLmh0bWwgYi9jb250cmliL3RoZW1lcy9zcG90aWZ5L2V0Yy9HZXJyaXRTaXRlSGVhZGVyLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmODRiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvZXRjL0dlcnJpdFNpdGVIZWFkZXIuaHRtbApAQCAtMCwwICsxIEBACis8ZGl2IGlkPSJsb2dvLXNwb3RpZnkiPjwvZGl2PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvc3RhdGljL2JhY2tncm91bmQtZ3JhZGllbnQucG5nIGIvY29udHJpYi90aGVtZXMvc3BvdGlmeS9zdGF0aWMvYmFja2dyb3VuZC1ncmFkaWVudC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwZjM1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvc3RhdGljL2JhY2tncm91bmQtZ3JhZGllbnQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvc3RhdGljL2JhY2tncm91bmQtc3BvdGlncmVlbi5qcGcgYi9jb250cmliL3RoZW1lcy9zcG90aWZ5L3N0YXRpYy9iYWNrZ3JvdW5kLXNwb3RpZ3JlZW4uanBnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzc5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3RoZW1lcy9zcG90aWZ5L3N0YXRpYy9iYWNrZ3JvdW5kLXNwb3RpZ3JlZW4uanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvc3RhdGljL2xvZ28ucG5nIGIvY29udHJpYi90aGVtZXMvc3BvdGlmeS9zdGF0aWMvbG9nby5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlMWZjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvdGhlbWVzL3Nwb3RpZnkvc3RhdGljL2xvZ28ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRyaWIvdHJpdmlhbF9yZWJhc2UucHkgYi9jb250cmliL3RyaXZpYWxfcmViYXNlLnB5CmluZGV4IGE1MTRiNGMuLjc3NjQ0NzAgMTAwNzU1Ci0tLSBhL2NvbnRyaWIvdHJpdmlhbF9yZWJhc2UucHkKKysrIGIvY29udHJpYi90cml2aWFsX3JlYmFzZS5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjIuNgorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAKICMgQ29weXJpZ2h0IChjKSAyMDEwLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMKQEAgLTI3LDE5NiArMjcsMjI0IEBACiAjIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KICMgSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKLSMgVGhpcyBzY3JpcHQgaXMgZGVzaWduZWQgdG8gZGV0ZWN0IHdoZW4gYSBwYXRjaHNldCB1cGxvYWRlZCB0byBHZXJyaXQgaXMKLSMgJ2lkZW50aWNhbCcgKGRldGVybWluZWQgdmlhIGdpdC1wYXRjaC1pZCkgYW5kIHJlYXBwbHkgcmV2aWV3cyBvbnRvIHRoZSBuZXcKLSMgcGF0Y2hzZXQgZnJvbSB0aGUgcHJldmlvdXMgcGF0Y2hzZXQuCisiIiIgVGhpcyBzY3JpcHQgaXMgZGVzaWduZWQgdG8gZGV0ZWN0IHdoZW4gYSBwYXRjaHNldCB1cGxvYWRlZCB0byBHZXJyaXQgaXMKKydpZGVudGljYWwnIChkZXRlcm1pbmVkIHZpYSBnaXQtcGF0Y2gtaWQpIGFuZCByZWFwcGx5IHJldmlld3Mgb250byB0aGUgbmV3CitwYXRjaHNldCBmcm9tIHRoZSBwcmV2aW91cyBwYXRjaHNldC4KIAotIyBHZXQgdXNhZ2UgYW5kIGhlbHAgaW5mbyBieSBydW5uaW5nOiAuL3RyaXZpYWxfcmViYXNlLnB5IC0taGVscAotIyBEb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBoZXJlOiBodHRwczovL3d3dy5jb2RlYXVyb3JhLm9yZy94d2lraS9iaW4vUUFFUC9HZXJyaXQKK0dldCB1c2FnZSBhbmQgaGVscCBpbmZvIGJ5IHJ1bm5pbmc6IC4vdHJpdmlhbF9yZWJhc2UucHkgLS1oZWxwCitEb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBoZXJlOiBodHRwczovL3d3dy5jb2RlYXVyb3JhLm9yZy94d2lraS9iaW4vUUFFUC9HZXJyaXQKIAorIiIiCisKK2ltcG9ydCBhcmdwYXJzZQogaW1wb3J0IGpzb24KLWZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgoraW1wb3J0IHJlCiBpbXBvcnQgc3VicHJvY2VzcwotZnJvbSBzeXMgaW1wb3J0IGV4aXQKK2ltcG9ydCBzeXMKIAotY2xhc3MgQ2hlY2tDYWxsRXJyb3IoT1NFcnJvcik6Ci0gICIiIkNoZWNrQ2FsbCgpIHJldHVybmVkIG5vbi0wLiIiIgotICBkZWYgX19pbml0X18oc2VsZiwgY29tbWFuZCwgY3dkLCByZXRjb2RlLCBzdGRvdXQsIHN0ZGVycj1Ob25lKToKLSAgICBPU0Vycm9yLl9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGN3ZCwgcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIpCi0gICAgc2VsZi5jb21tYW5kID0gY29tbWFuZAotICAgIHNlbGYuY3dkID0gY3dkCi0gICAgc2VsZi5yZXRjb2RlID0gcmV0Y29kZQotICAgIHNlbGYuc3Rkb3V0ID0gc3Rkb3V0Ci0gICAgc2VsZi5zdGRlcnIgPSBzdGRlcnIKK2NsYXNzIFRyaXZpYWxSZWJhc2U6CisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICB1c2FnZSA9ICIlKHByb2cpcyA8cmVxdWlyZWQgb3B0aW9ucz4gWy0tc2VydmVyLXBvcnQ9UE9SVF0iCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIodXNhZ2U9dXNhZ2UpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1jaGFuZ2UtdXJsIiwgZGVzdD0iY2hhbmdlVXJsIiwgaGVscD0iQ2hhbmdlIFVSTCIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wcm9qZWN0IiwgaGVscD0iUHJvamVjdCBwYXRoIGluIEdlcnJpdCIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1jb21taXQiLCBoZWxwPSJHaXQgY29tbWl0LWlzaCBmb3IgdGhpcyBwYXRjaHNldCIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1wYXRjaHNldCIsIHR5cGU9aW50LCBoZWxwPSJUaGUgcGF0Y2hzZXQgbnVtYmVyIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLXByaXZhdGUta2V5LXBhdGgiLCBkZXN0PSJwcml2YXRlX2tleV9wYXRoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkZ1bGwgcGF0aCB0byBHZXJyaXQgU1NIIGRhZW1vbidzIHByaXZhdGUgaG9zdCBrZXkiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tc2VydmVyIiwgZGVmYXVsdD0nbG9jYWxob3N0JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkdlcnJpdCBTU0ggc2VydmVyIFtkZWZhdWx0OiAlKGRlZmF1bHQpc10iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tc2VydmVyLXBvcnQiLCBkZXN0PSJwb3J0IiwgZGVmYXVsdD0nMjk0MTgnLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUG9ydCB0byBjb25uZWN0IHRvIEdlcnJpdCdzIFNTSCBkYWVtb24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW2RlZmF1bHQ6ICUoZGVmYXVsdClzXSIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1zc2giLCBkZWZhdWx0PSJzc2giLCBoZWxwPSJTU0ggZXhlY3V0YWJsZSIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1zc2gtcG9ydC1mbGFnIiwgZGVzdD0ic3NoX3BvcnRfZmxhZyIsIGRlZmF1bHQ9Ii1wIiwgaGVscD0iU1NIIHBvcnQgZmxhZyIpCiAKLWRlZiBDaGVja0NhbGwoY29tbWFuZCwgY3dkPU5vbmUpOgotICAiIiJMaWtlIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgpIGJ1dCByZXR1cm5zIHN0ZG91dC4KKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoKVswXQorICAgIGlmIE5vbmUgaW4gW2FyZ3MuY2hhbmdlVXJsLCBhcmdzLnByb2plY3QsIGFyZ3MuY29tbWl0LCBhcmdzLnBhdGNoc2V0XToKKyAgICAgIHBhcnNlci5lcnJvcigiSW5jb21wbGV0ZSBhcmd1bWVudHMiKQorICAgIHRyeToKKyAgICAgIHNlbGYuY2hhbmdlSWQgPSByZS5zZWFyY2gocidcZCskJywgYXJncy5jaGFuZ2VVcmwpLmdyb3VwKCkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICBwYXJzZXIuZXJyb3IoIkludmFsaWQgY2hhbmdlSWQiKQorICAgIHNlbGYucHJvamVjdCA9IGFyZ3MucHJvamVjdAorICAgIHNlbGYuY29tbWl0ID0gYXJncy5jb21taXQKKyAgICBzZWxmLnBhdGNoc2V0ID0gYXJncy5wYXRjaHNldAorICAgIHNlbGYucHJpdmF0ZV9rZXlfcGF0aCA9IGFyZ3MucHJpdmF0ZV9rZXlfcGF0aAorICAgIHNlbGYuc2VydmVyID0gYXJncy5zZXJ2ZXIKKyAgICBzZWxmLnBvcnQgPSBhcmdzLnBvcnQKKyAgICBzZWxmLnNzaCA9IGFyZ3Muc3NoCisgICAgc2VsZi5zc2hfcG9ydF9mbGFnID0gYXJncy5zc2hfcG9ydF9mbGFnCiAKLSAgV29ya3Mgb24gcHl0aG9uIDIuNAotICAiIiIKLSAgdHJ5OgotICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIGN3ZD1jd2QsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gICAgc3RkX291dCwgc3RkX2VyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQotICBleGNlcHQgT1NFcnJvciwgZToKLSAgICByYWlzZSBDaGVja0NhbGxFcnJvcihjb21tYW5kLCBjd2QsIGUuZXJybm8sIE5vbmUpCi0gIGlmIHByb2Nlc3MucmV0dXJuY29kZToKLSAgICByYWlzZSBDaGVja0NhbGxFcnJvcihjb21tYW5kLCBjd2QsIHByb2Nlc3MucmV0dXJuY29kZSwgc3RkX291dCwgc3RkX2VycikKLSAgcmV0dXJuIHN0ZF9vdXQsIHN0ZF9lcnIKKyAgY2xhc3MgQ2hlY2tDYWxsRXJyb3IoT1NFcnJvcik6CisgICAgIiIiQ2hlY2tDYWxsKCkgcmV0dXJuZWQgbm9uLTAuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGN3ZCwgcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnI9Tm9uZSk6CisgICAgICBPU0Vycm9yLl9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGN3ZCwgcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIpCisgICAgICBzZWxmLmNvbW1hbmQgPSBjb21tYW5kCisgICAgICBzZWxmLmN3ZCA9IGN3ZAorICAgICAgc2VsZi5yZXRjb2RlID0gcmV0Y29kZQorICAgICAgc2VsZi5zdGRvdXQgPSBzdGRvdXQKKyAgICAgIHNlbGYuc3RkZXJyID0gc3RkZXJyCiAKLWRlZiBHc3FsUXVlcnkoc3FsX3F1ZXJ5LCBzZXJ2ZXIsIHBvcnQpOgotICAiIiJSdW5zIGEgZ2Vycml0IGdzcWwgcXVlcnkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCIiIgotICBnc3FsX2NtZCA9IFsnc3NoJywgJy1wJywgcG9ydCwgc2VydmVyLCAnZ2Vycml0JywgJ2dzcWwnLCAnLS1mb3JtYXQnLAotICAgICAgICAgICAgICAnSlNPTicsICctYycsIHNxbF9xdWVyeV0KLSAgdHJ5OgotICAgIChnc3FsX291dCwgZ3NxbF9zdGRlcnIpID0gQ2hlY2tDYWxsKGdzcWxfY21kKQotICBleGNlcHQgQ2hlY2tDYWxsRXJyb3IsIGU6Ci0gICAgcHJpbnQgInJldHVybiBjb2RlIGlzICVzIiAlIGUucmV0Y29kZQotICAgIHByaW50ICJzdGRvdXQgYW5kIHN0ZGVyciBpc1xuJXMlcyIgJSAoZS5zdGRvdXQsIGUuc3RkZXJyKQotICAgIHJhaXNlCisgIGRlZiBDaGVja0NhbGwoc2VsZiwgY29tbWFuZCwgY3dkPU5vbmUpOgorICAgICIiIkxpa2Ugc3VicHJvY2Vzcy5jaGVja19jYWxsKCkgYnV0IHJldHVybnMgc3Rkb3V0LgogCi0gIG5ld19vdXQgPSBnc3FsX291dC5yZXBsYWNlKCd9fVxuJywgJ319XG5zcGxpdCBoZXJlXG4nKQotICByZXR1cm4gbmV3X291dC5zcGxpdCgnc3BsaXQgaGVyZVxuJykKKyAgICBXb3JrcyBvbiBweXRob24gMi40CiAKLWRlZiBGaW5kUHJldlJldihjaGFuZ2VJZCwgcGF0Y2hzZXQsIHNlcnZlciwgcG9ydCk6Ci0gICIiIkZpbmRzIHRoZSByZXZpc2lvbiBvZiB0aGUgcHJldmlvdXMgcGF0Y2ggc2V0IG9uIHRoZSBjaGFuZ2UiIiIKLSAgc3FsX3F1ZXJ5ID0gKCJcIlNFTEVDVCByZXZpc2lvbiBGUk9NIHBhdGNoX3NldHMsY2hhbmdlcyBXSEVSRSAiCi0gICAgICAgICAgICAgICAicGF0Y2hfc2V0cy5jaGFuZ2VfaWQgPSBjaGFuZ2VzLmNoYW5nZV9pZCBBTkQgIgotICAgICAgICAgICAgICAgInBhdGNoX3NldHMucGF0Y2hfc2V0X2lkID0gJXMgQU5EICIKLSAgICAgICAgICAgICAgICJjaGFuZ2VzLmNoYW5nZV9rZXkgPSBcJyVzXCdcIiIgJSAoKHBhdGNoc2V0IC0gMSksIGNoYW5nZUlkKSkKLSAgcmV2aXNpb25zID0gR3NxbFF1ZXJ5KHNxbF9xdWVyeSwgc2VydmVyLCBwb3J0KQorICAgICIiIgorICAgIHRyeToKKyAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKGNvbW1hbmQsIGN3ZD1jd2QsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICBzdGRfb3V0LCBzdGRfZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICByYWlzZSBzZWxmLkNoZWNrQ2FsbEVycm9yKGNvbW1hbmQsIGN3ZCwgZS5lcnJubywgTm9uZSkKKyAgICBpZiBwcm9jZXNzLnJldHVybmNvZGU6CisgICAgICByYWlzZSBzZWxmLkNoZWNrQ2FsbEVycm9yKGNvbW1hbmQsIGN3ZCwgcHJvY2Vzcy5yZXR1cm5jb2RlLCBzdGRfb3V0LCBzdGRfZXJyKQorICAgIHJldHVybiBzdGRfb3V0LCBzdGRfZXJyCiAKLSAganNvbl9kaWN0ID0ganNvbi5sb2FkcyhyZXZpc2lvbnNbMF0sIHN0cmljdD1GYWxzZSkKLSAgcmV0dXJuIGpzb25fZGljdFsiY29sdW1ucyJdWyJyZXZpc2lvbiJdCisgIGRlZiBHc3FsUXVlcnkoc2VsZiwgc3FsX3F1ZXJ5KToKKyAgICAiIiJSdW4gYSBnZXJyaXQgZ3NxbCBxdWVyeSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuIiIiCisgICAgZ3NxbF9jbWQgPSBbc2VsZi5zc2gsIHNlbGYuc3NoX3BvcnRfZmxhZywgc2VsZi5wb3J0LCBzZWxmLnNlcnZlciwgJ2dlcnJpdCcsICdnc3FsJywKKyAgICAgICAgICAgICAgICAnLS1mb3JtYXQnLCAnSlNPTicsICctYycsIHNxbF9xdWVyeV0KKyAgICB0cnk6CisgICAgICAoZ3NxbF9vdXQsIF9nc3FsX3N0ZGVycikgPSBzZWxmLkNoZWNrQ2FsbChnc3FsX2NtZCkKKyAgICBleGNlcHQgc2VsZi5DaGVja0NhbGxFcnJvciwgZToKKyAgICAgIHByaW50ICJyZXR1cm4gY29kZSBpcyAlcyIgJSBlLnJldGNvZGUKKyAgICAgIHByaW50ICJzdGRvdXQgYW5kIHN0ZGVyciBpc1xuJXMlcyIgJSAoZS5zdGRvdXQsIGUuc3RkZXJyKQorICAgICAgcmFpc2UKIAotZGVmIEdldEFwcHJvdmFscyhjaGFuZ2VJZCwgcGF0Y2hzZXQsIHNlcnZlciwgcG9ydCk6Ci0gICIiIkdldCBhbGwgdGhlIGFwcHJvdmFscyBvbiBhIHNwZWNpZmljIHBhdGNoIHNldAorICAgIG5ld19vdXQgPSBnc3FsX291dC5yZXBsYWNlKCd9fVxuJywgJ319XG5zcGxpdCBoZXJlXG4nKQorICAgIHJldHVybiBuZXdfb3V0LnNwbGl0KCdzcGxpdCBoZXJlXG4nKQogCi0gIFJldHVybnMgYSBsaXN0IG9mIGFwcHJvdmFsIGRpY3RzIiIiCi0gIHNxbF9xdWVyeSA9ICgiXCJTRUxFQ1QgdmFsdWUsYWNjb3VudF9pZCxjYXRlZ29yeV9pZCBGUk9NIHBhdGNoX3NldF9hcHByb3ZhbHMgIgotICAgICAgICAgICAgICAgIldIRVJFIHBhdGNoX3NldF9pZCA9ICVzIEFORCBjaGFuZ2VfaWQgPSAoU0VMRUNUIGNoYW5nZV9pZCBGUk9NICIKLSAgICAgICAgICAgICAgICJjaGFuZ2VzIFdIRVJFIGNoYW5nZV9rZXkgPSBcJyVzXCcpIEFORCB2YWx1ZSA8PiAwXCIiCi0gICAgICAgICAgICAgICAlICgocGF0Y2hzZXQgLSAxKSwgY2hhbmdlSWQpKQotICBnc3FsX291dCA9IEdzcWxRdWVyeShzcWxfcXVlcnksIHNlcnZlciwgcG9ydCkKLSAgYXBwcm92YWxzID0gW10KLSAgZm9yIGpzb25fc3RyIGluIGdzcWxfb3V0OgotICAgIGRpY3QgPSBqc29uLmxvYWRzKGpzb25fc3RyLCBzdHJpY3Q9RmFsc2UpCi0gICAgaWYgZGljdFsidHlwZSJdID09ICJyb3ciOgotICAgICAgYXBwcm92YWxzLmFwcGVuZChkaWN0WyJjb2x1bW5zIl0pCi0gIHJldHVybiBhcHByb3ZhbHMKKyAgZGVmIEZpbmRQcmV2UmV2KHNlbGYpOgorICAgICIiIkZpbmQgdGhlIHJldmlzaW9uIG9mIHRoZSBwcmV2aW91cyBwYXRjaCBzZXQgb24gdGhlIGNoYW5nZS4iIiIKKyAgICBzcWxfcXVlcnkgPSAoIlwiU0VMRUNUIHJldmlzaW9uIEZST00gcGF0Y2hfc2V0cyBXSEVSRSAiCisgICAgICAgICAgICAgICAgICJjaGFuZ2VfaWQgPSAlcyBBTkQgcGF0Y2hfc2V0X2lkID0gJXNcIiIgJQorICAgICAgICAgICAgICAgICAoc2VsZi5jaGFuZ2VJZCwgKHNlbGYucGF0Y2hzZXQgLSAxKSkpCisgICAgcmV2aXNpb25zID0gc2VsZi5Hc3FsUXVlcnkoc3FsX3F1ZXJ5KQogCi1kZWYgR2V0RW1haWxGcm9tQWNjdElkKGFjY291bnRfaWQsIHNlcnZlciwgcG9ydCk6Ci0gICIiIlJldHVybnMgdGhlIHByZWZlcnJlZCBlbWFpbCBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudF9pZCIiIgotICBzcWxfcXVlcnkgPSAoIlwiU0VMRUNUIHByZWZlcnJlZF9lbWFpbCBGUk9NIGFjY291bnRzIFdIRVJFIGFjY291bnRfaWQgPSAlc1wiIgotICAgICAgICAgICAgICAgJSBhY2NvdW50X2lkKQotICBlbWFpbF9hZGRyID0gR3NxbFF1ZXJ5KHNxbF9xdWVyeSwgc2VydmVyLCBwb3J0KQorICAgIGpzb25fZGljdCA9IGpzb24ubG9hZHMocmV2aXNpb25zWzBdLCBzdHJpY3Q9RmFsc2UpCisgICAgcmV0dXJuIGpzb25fZGljdFsiY29sdW1ucyJdWyJyZXZpc2lvbiJdCiAKLSAganNvbl9kaWN0ID0ganNvbi5sb2FkcyhlbWFpbF9hZGRyWzBdLCBzdHJpY3Q9RmFsc2UpCi0gIHJldHVybiBqc29uX2RpY3RbImNvbHVtbnMiXVsicHJlZmVycmVkX2VtYWlsIl0KKyAgZGVmIEdldEFwcHJvdmFscyhzZWxmKToKKyAgICAiIiJHZXQgYWxsIHRoZSBhcHByb3ZhbHMgb24gYSBzcGVjaWZpYyBwYXRjaCBzZXQuCiAKLWRlZiBHZXRQYXRjaElkKHJldmlzaW9uKToKLSAgZ2l0X3Nob3dfY21kID0gWydnaXQnLCAnc2hvdycsIHJldmlzaW9uXQotICBwYXRjaF9pZF9jbWQgPSBbJ2dpdCcsICdwYXRjaC1pZCddCi0gIHBhdGNoX2lkX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKHBhdGNoX2lkX2NtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQotICBnaXRfc2hvd19wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihnaXRfc2hvd19jbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gIHJldHVybiBwYXRjaF9pZF9wcm9jZXNzLmNvbW11bmljYXRlKGdpdF9zaG93X3Byb2Nlc3MuY29tbXVuaWNhdGUoKVswXSlbMF0KKyAgICBSZXR1cm5zIGEgbGlzdCBvZiBhcHByb3ZhbCBkaWN0cy4KIAotZGVmIFN1RXhlYyhzZXJ2ZXIsIHBvcnQsIHByaXZhdGVfa2V5LCBhc191c2VyLCBjbWQpOgotICBzdWV4ZWNfY21kID0gWydzc2gnLCAnLWwnLCAiR2Vycml0IENvZGUgUmV2aWV3IiwgJy1wJywgcG9ydCwgc2VydmVyLCAnLWknLAotICAgICAgICAgICAgICAgIHByaXZhdGVfa2V5LCAnc3VleGVjJywgJy0tYXMnLCBhc191c2VyLCAnLS0nLCBjbWRdCi0gIENoZWNrQ2FsbChzdWV4ZWNfY21kKQorICAgICIiIgorICAgIHNxbF9xdWVyeSA9ICgiXCJTRUxFQ1QgdmFsdWUsYWNjb3VudF9pZCxjYXRlZ29yeV9pZCBGUk9NIHBhdGNoX3NldF9hcHByb3ZhbHMgIgorICAgICAgICAgICAgICAgICAiV0hFUkUgY2hhbmdlX2lkID0gJXMgQU5EIHBhdGNoX3NldF9pZCA9ICVzIEFORCB2YWx1ZSAhPSAwXCIiCisgICAgICAgICAgICAgICAgICUgKHNlbGYuY2hhbmdlSWQsIChzZWxmLnBhdGNoc2V0IC0gMSkpKQorICAgIGdzcWxfb3V0ID0gc2VsZi5Hc3FsUXVlcnkoc3FsX3F1ZXJ5KQorICAgIGFwcHJvdmFscyA9IFtdCisgICAgZm9yIGpzb25fc3RyIGluIGdzcWxfb3V0OgorICAgICAgZGF0YSA9IGpzb24ubG9hZHMoanNvbl9zdHIsIHN0cmljdD1GYWxzZSkKKyAgICAgIGlmIGRhdGFbInR5cGUiXSA9PSAicm93IjoKKyAgICAgICAgYXBwcm92YWxzLmFwcGVuZChkYXRhWyJjb2x1bW5zIl0pCisgICAgcmV0dXJuIGFwcHJvdmFscwogCi1kZWYgRGlmZkNvbW1pdE1lc3NhZ2VzKGNvbW1pdDEsIGNvbW1pdDIpOgotICBsb2dfY21kMSA9IFsnZ2l0JywgJ2xvZycsICctLXByZXR0eT1mb3JtYXQ6IiVhbiAlYWUlbiVzJW4lYiInLAotICAgICAgICAgICAgICBjb21taXQxICsgJ14hJ10KLSAgY29tbWl0MV9sb2cgPSBDaGVja0NhbGwobG9nX2NtZDEpCi0gIGxvZ19jbWQyID0gWydnaXQnLCAnbG9nJywgJy0tcHJldHR5PWZvcm1hdDoiJWFuICVhZSVuJXMlbiViIicsCi0gICAgICAgICAgICAgIGNvbW1pdDIgKyAnXiEnXQotICBjb21taXQyX2xvZyA9IENoZWNrQ2FsbChsb2dfY21kMikKLSAgaWYgY29tbWl0MV9sb2cgIT0gY29tbWl0Ml9sb2c6Ci0gICAgcmV0dXJuIFRydWUKLSAgcmV0dXJuIEZhbHNlCisgIGRlZiBBcHBlbmRBY2N0QXBwcm92YWwoc2VsZiwgYWNjb3VudF9pZCwgdmFsdWUpOgorICAgIHRyeToKKyAgICAgIG5ld3ZhbCA9IHNlbGYuYWNjdF9hcHByb3ZhbHNbYWNjb3VudF9pZF0gKyAnICcgKyB2YWx1ZQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgIG5ld3ZhbCA9IHZhbHVlCisgICAgc2VsZi5hY2N0X2FwcHJvdmFsc1thY2NvdW50X2lkXSA9IG5ld3ZhbAogCi1kZWYgTWFpbigpOgotICBzZXJ2ZXIgPSAnbG9jYWxob3N0JwotICB1c2FnZSA9ICJ1c2FnZTogJXByb2cgPHJlcXVpcmVkIG9wdGlvbnM+IFstLXNlcnZlci1wb3J0PVBPUlRdIgotICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9dXNhZ2UpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCItLWNoYW5nZSIsIGRlc3Q9ImNoYW5nZUlkIiwgaGVscD0iQ2hhbmdlIGlkZW50aWZpZXIiKQotICBwYXJzZXIuYWRkX29wdGlvbigiLS1wcm9qZWN0IiwgaGVscD0iUHJvamVjdCBwYXRoIGluIEdlcnJpdCIpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCItLWNvbW1pdCIsIGhlbHA9IkdpdCBjb21taXQtaXNoIGZvciB0aGlzIHBhdGNoc2V0IikKLSAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcGF0Y2hzZXQiLCB0eXBlPSJpbnQiLCBoZWxwPSJUaGUgcGF0Y2hzZXQgbnVtYmVyIikKLSAgcGFyc2VyLmFkZF9vcHRpb24oIi0tcHJpdmF0ZS1rZXktcGF0aCIsIGRlc3Q9InByaXZhdGVfa2V5X3BhdGgiLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSJGdWxsIHBhdGggdG8gR2Vycml0IFNTSCBkYWVtb24ncyBwcml2YXRlIGhvc3Qga2V5IikKLSAgcGFyc2VyLmFkZF9vcHRpb24oIi0tc2VydmVyLXBvcnQiLCBkZXN0PSJwb3J0IiwgZGVmYXVsdD0nMjk0MTgnLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSJQb3J0IHRvIGNvbm5lY3QgdG8gR2Vycml0J3MgU1NIIGRhZW1vbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIltkZWZhdWx0OiAlZGVmYXVsdF0iKQorICBkZWYgR2V0RW1haWxGcm9tQWNjdElkKHNlbGYsIGFjY291bnRfaWQpOgorICAgICIiIlJldHVybiB0aGUgcHJlZmVycmVkIGVtYWlsIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50X2lkLiIiIgorICAgIHNxbF9xdWVyeSA9ICgiXCJTRUxFQ1QgcHJlZmVycmVkX2VtYWlsIEZST00gYWNjb3VudHMgV0hFUkUgYWNjb3VudF9pZCA9ICVzXCIiCisgICAgICAgICAgICAgICAgICUgYWNjb3VudF9pZCkKKyAgICBlbWFpbF9hZGRyID0gc2VsZi5Hc3FsUXVlcnkoc3FsX3F1ZXJ5KQogCi0gIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBqc29uX2RpY3QgPSBqc29uLmxvYWRzKGVtYWlsX2FkZHJbMF0sIHN0cmljdD1GYWxzZSkKKyAgICByZXR1cm4ganNvbl9kaWN0WyJjb2x1bW5zIl1bInByZWZlcnJlZF9lbWFpbCJdCiAKLSAgaWYgbm90IG9wdGlvbnMuY2hhbmdlSWQ6Ci0gICAgcGFyc2VyLnByaW50X2hlbHAoKQotICAgIGV4aXQoMCkKKyAgZGVmIEdldFBhdGNoSWQoc2VsZiwgcmV2aXNpb24pOgorICAgIGdpdF9zaG93X2NtZCA9IFsnZ2l0JywgJ3Nob3cnLCByZXZpc2lvbl0KKyAgICBwYXRjaF9pZF9jbWQgPSBbJ2dpdCcsICdwYXRjaC1pZCddCisgICAgZ2l0X3Nob3dfcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oZ2l0X3Nob3dfY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgIHBhdGNoX2lkX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKHBhdGNoX2lkX2NtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1naXRfc2hvd19wcm9jZXNzLnN0ZG91dCkKKyAgICByZXMgPSBwYXRjaF9pZF9wcm9jZXNzLmNvbW11bmljYXRlKClbMF0gb3IgJzAnCisgICAgcmV0dXJuIHJlcy5zcGxpdCgpWzBdCiAKLSAgaWYgb3B0aW9ucy5wYXRjaHNldCA9PSAxOgotICAgICMgTm90aGluZyB0byBkZXRlY3Qgb24gZmlyc3QgcGF0Y2hzZXQKLSAgICBleGl0KDApCi0gIHByZXZfcmV2aXNpb24gPSBOb25lCi0gIHByZXZfcmV2aXNpb24gPSBGaW5kUHJldlJldihvcHRpb25zLmNoYW5nZUlkLCBvcHRpb25zLnBhdGNoc2V0LCBzZXJ2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvcnQpCi0gIGlmIG5vdCBwcmV2X3JldmlzaW9uOgotICAgICMgQ291bGRuJ3QgZmluZCBhIHByZXZpb3VzIHJldmlzaW9uCi0gICAgZXhpdCgwKQotICBwcmV2X3BhdGNoX2lkID0gR2V0UGF0Y2hJZChwcmV2X3JldmlzaW9uKQotICBjdXJfcGF0Y2hfaWQgPSBHZXRQYXRjaElkKG9wdGlvbnMuY29tbWl0KQotICBpZiBjdXJfcGF0Y2hfaWQuc3BsaXQoKVswXSAhPSBwcmV2X3BhdGNoX2lkLnNwbGl0KClbMF06Ci0gICAgIyBwYXRjaC1pZHMgZG9uJ3QgbWF0Y2gKLSAgICBleGl0KDApCi0gICMgUGF0Y2ggaWRzIG1hdGNoLiBUaGlzIGlzIGEgdHJpdmlhbCByZWJhc2UuCi0gICMgSW4gYWRkaXRpb24gdG8gcGF0Y2gtaWQgd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSBjb21taXQgbWVzc2FnZSBjaGFuZ2VkLiBNb3N0Ci0gICMgYXBwcm92ZXJzIHdvdWxkIHdhbnQgdG8gcmUtcmV2aWV3IGNoYW5nZXMgd2hlbiB0aGUgY29tbWl0IG1lc3NhZ2UgY2hhbmdlcy4KLSAgY2hhbmdlZCA9IERpZmZDb21taXRNZXNzYWdlcyhwcmV2X3JldmlzaW9uLCBvcHRpb25zLmNvbW1pdCkKLSAgaWYgY2hhbmdlZDoKLSAgICAjIEluc2VydCBhIGNvbW1lbnQgaW50byB0aGUgY2hhbmdlIGxldHRpbmcgdGhlIGFwcHJvdmVycyBrbm93IG9ubHkgdGhlCi0gICAgIyBjb21taXQgbWVzc2FnZSBjaGFuZ2VkCi0gICAgY29tbWVudF9tc2cgPSAoIlwnLS1tZXNzYWdlPU5ldyBwYXRjaHNldCBwYXRjaC1pZCBtYXRjaGVzIHByZXZpb3VzIHBhdGNoc2V0IgotICAgICAgICAgICAgICAgICAgICIsIGJ1dCBjb21taXQgbWVzc2FnZSBoYXMgY2hhbmdlZC4nIikKLSAgICBjb21tZW50X2NtZCA9IFsnc3NoJywgJy1wJywgb3B0aW9ucy5wb3J0LCBzZXJ2ZXIsICdnZXJyaXQnLCAnYXBwcm92ZScsCi0gICAgICAgICAgICAgICAgICAgJy0tcHJvamVjdCcsIG9wdGlvbnMucHJvamVjdCwgY29tbWVudF9tc2csIG9wdGlvbnMuY29tbWl0XQotICAgIENoZWNrQ2FsbChjb21tZW50X2NtZCkKLSAgICBleGl0KDApCisgIGRlZiBTdUV4ZWMoc2VsZiwgYXNfdXNlciwgY21kKToKKyAgICBzdWV4ZWNfY21kID0gW3NlbGYuc3NoLCAnLWwnLCAiR2Vycml0IENvZGUgUmV2aWV3Iiwgc2VsZi5zc2hfcG9ydF9mbGFnLCBzZWxmLnBvcnQsIHNlbGYuc2VydmVyXQorICAgIGlmIHNlbGYucHJpdmF0ZV9rZXlfcGF0aDoKKyAgICAgIHN1ZXhlY19jbWQgKz0gWyctaScsIHNlbGYucHJpdmF0ZV9rZXlfcGF0aF0KKyAgICBzdWV4ZWNfY21kICs9IFsnc3VleGVjJywgJy0tYXMnLCBhc191c2VyLCAnLS0nLCBjbWRdCisgICAgc2VsZi5DaGVja0NhbGwoc3VleGVjX2NtZCkKIAotICAjIE5lZWQgdG8gZ2V0IGFsbCBhcHByb3ZhbHMgb24gcHJpb3IgcGF0Y2ggc2V0LCB0aGVuIHN1ZXhlYyB0aGVtIG9udG8KLSAgIyB0aGlzIHBhdGNoc2V0LgotICBhcHByb3ZhbHMgPSBHZXRBcHByb3ZhbHMob3B0aW9ucy5jaGFuZ2VJZCwgb3B0aW9ucy5wYXRjaHNldCwgc2VydmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wb3J0KQotICBnZXJyaXRfYXBwcm92ZV9tc2cgPSAoIlwnQXV0b21hdGljYWxseSByZS1hZGRlZCBieSBHZXJyaXQgdHJpdmlhbCByZWJhc2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgImRldGVjdGlvbiBzY3JpcHQuXCciKQotICBmb3IgYXBwcm92YWwgaW4gYXBwcm92YWxzOgotICAgICMgTm90ZTogU2l0ZXMgd2l0aCBkaWZmZXJlbnQgJ2NvcHlfbWluX3Njb3JlJyB2YWx1ZXMgaW4gdGhlCi0gICAgIyBhcHByb3ZhbF9jYXRlZ29yaWVzIERCIHRhYmxlIG1pZ2h0IHdhbnQgZGlmZmVyZW50IGJlaGF2aW9yIGhlcmUuCi0gICAgIyBBZGRpdGlvbmFsIGNhdGVnb3JpZXMgc2hvdWxkIGFsc28gYmUgYWRkZWQgaWYgZGVzaXJlZC4KLSAgICBpZiBhcHByb3ZhbFsiY2F0ZWdvcnlfaWQiXSA9PSAiQ1JWVyI6Ci0gICAgICBhcHByb3ZlX2NhdGVnb3J5ID0gJy0tY29kZS1yZXZpZXcnCi0gICAgZWxpZiBhcHByb3ZhbFsiY2F0ZWdvcnlfaWQiXSA9PSAiVlJJRiI6Ci0gICAgICAjIERvbid0IHJlLWFkZCB2ZXJpZmllcwotICAgICAgI2FwcHJvdmVfY2F0ZWdvcnkgPSAnLS12ZXJpZmllZCcKLSAgICAgIGNvbnRpbnVlCi0gICAgZWxpZiBhcHByb3ZhbFsiY2F0ZWdvcnlfaWQiXSA9PSAiU1VCTSI6Ci0gICAgICAjIFdlIGRvbid0IGNhcmUgYWJvdXQgcHJldmlvdXMgc3VibWl0IGF0dGVtcHRzCi0gICAgICBjb250aW51ZQotICAgIGVsc2U6Ci0gICAgICBwcmludCAiVW5zdXBwb3J0ZWQgY2F0ZWdvcnk6ICVzIiAlIGFwcHJvdmFsCi0gICAgICBleGl0KDApCisgIGRlZiBEaWZmQ29tbWl0TWVzc2FnZXMoc2VsZiwgcHJldl9jb21taXQpOgorICAgIGxvZ19jbWQxID0gWydnaXQnLCAnbG9nJywgJy0tcHJldHR5PWZvcm1hdDoiJWFuICVhZSVuJXMlbiViIicsCisgICAgICAgICAgICAgICAgcHJldl9jb21taXQgKyAnXiEnXQorICAgIGNvbW1pdDFfbG9nID0gc2VsZi5DaGVja0NhbGwobG9nX2NtZDEpCisgICAgbG9nX2NtZDIgPSBbJ2dpdCcsICdsb2cnLCAnLS1wcmV0dHk9Zm9ybWF0OiIlYW4gJWFlJW4lcyVuJWIiJywKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1pdCArICdeISddCisgICAgY29tbWl0Ml9sb2cgPSBzZWxmLkNoZWNrQ2FsbChsb2dfY21kMikKKyAgICBpZiBjb21taXQxX2xvZyAhPSBjb21taXQyX2xvZzoKKyAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCiAKLSAgICBzY29yZSA9IGFwcHJvdmFsWyJ2YWx1ZSJdCi0gICAgZ2Vycml0X2FwcHJvdmVfY21kID0gWydnZXJyaXQnLCAnYXBwcm92ZScsICctLXByb2plY3QnLCBvcHRpb25zLnByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICctLW1lc3NhZ2UnLCBnZXJyaXRfYXBwcm92ZV9tc2csIGFwcHJvdmVfY2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlLCBvcHRpb25zLmNvbW1pdF0KLSAgICBlbWFpbF9hZGRyID0gR2V0RW1haWxGcm9tQWNjdElkKGFwcHJvdmFsWyJhY2NvdW50X2lkIl0sIHNlcnZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucG9ydCkKLSAgICBTdUV4ZWMoc2VydmVyLCBvcHRpb25zLnBvcnQsIG9wdGlvbnMucHJpdmF0ZV9rZXlfcGF0aCwgZW1haWxfYWRkciwKLSAgICAgICAgICAgJyAnLmpvaW4oZ2Vycml0X2FwcHJvdmVfY21kKSkKLSAgZXhpdCgwKQorICBkZWYgUnVuKHNlbGYpOgorICAgIGlmIHNlbGYucGF0Y2hzZXQgPT0gMToKKyAgICAgICMgTm90aGluZyB0byBkZXRlY3Qgb24gZmlyc3QgcGF0Y2hzZXQKKyAgICAgIHJldHVybgorICAgIHByZXZfcmV2aXNpb24gPSBzZWxmLkZpbmRQcmV2UmV2KCkKKyAgICBhc3NlcnQgcHJldl9yZXZpc2lvbiwgIlByZXZpb3VzIHJldmlzaW9uIG5vdCBmb3VuZCIKKyAgICBwcmV2X3BhdGNoX2lkID0gc2VsZi5HZXRQYXRjaElkKHByZXZfcmV2aXNpb24pCisgICAgY3VyX3BhdGNoX2lkID0gc2VsZi5HZXRQYXRjaElkKHNlbGYuY29tbWl0KQorICAgIGlmIHByZXZfcGF0Y2hfaWQgPT0gJzAnIGFuZCBjdXJfcGF0Y2hfaWQgPT0gJzAnOgorICAgICAgcHJpbnQgImNvbW1pdHMgJXMgYW5kICVzIGFyZSBib3RoIGVtcHR5IG9yIG1lcmdlIGNvbW1pdHMiICUgKHByZXZfcmV2aXNpb24sIHNlbGYuY29tbWl0KQorICAgICAgcmV0dXJuCisgICAgaWYgY3VyX3BhdGNoX2lkICE9IHByZXZfcGF0Y2hfaWQ6CisgICAgICAjIHBhdGNoLWlkcyBkb24ndCBtYXRjaAorICAgICAgcmV0dXJuCisgICAgIyBQYXRjaCBpZHMgbWF0Y2guIFRoaXMgaXMgYSB0cml2aWFsIHJlYmFzZS4KKyAgICAjIEluIGFkZGl0aW9uIHRvIHBhdGNoLWlkIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgY29tbWl0IG1lc3NhZ2UgY2hhbmdlZC4gTW9zdAorICAgICMgYXBwcm92ZXJzIHdvdWxkIHdhbnQgdG8gcmUtcmV2aWV3IGNoYW5nZXMgd2hlbiB0aGUgY29tbWl0IG1lc3NhZ2UgY2hhbmdlcy4KKyAgICBjaGFuZ2VkID0gc2VsZi5EaWZmQ29tbWl0TWVzc2FnZXMocHJldl9yZXZpc2lvbikKKyAgICBpZiBjaGFuZ2VkOgorICAgICAgIyBJbnNlcnQgYSBjb21tZW50IGludG8gdGhlIGNoYW5nZSBsZXR0aW5nIHRoZSBhcHByb3ZlcnMga25vdyBvbmx5IHRoZQorICAgICAgIyBjb21taXQgbWVzc2FnZSBjaGFuZ2VkCisgICAgICBjb21tZW50X21zZyA9ICgiXCctLW1lc3NhZ2U9TmV3IHBhdGNoc2V0IHBhdGNoLWlkIG1hdGNoZXMgcHJldmlvdXMgcGF0Y2hzZXQiCisgICAgICAgICAgICAgICAgICAgICAiLCBidXQgY29tbWl0IG1lc3NhZ2UgaGFzIGNoYW5nZWQuJyIpCisgICAgICBjb21tZW50X2NtZCA9IFtzZWxmLnNzaCwgc2VsZi5zc2hfcG9ydF9mbGFnLCBzZWxmLnBvcnQsIHNlbGYuc2VydmVyLCAnZ2Vycml0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZXZpZXcnLCAnLS1wcm9qZWN0Jywgc2VsZi5wcm9qZWN0LCBjb21tZW50X21zZywgc2VsZi5jb21taXRdCisgICAgICBzZWxmLkNoZWNrQ2FsbChjb21tZW50X2NtZCkKKyAgICAgIHJldHVybgorCisgICAgIyBOZWVkIHRvIGdldCBhbGwgYXBwcm92YWxzIG9uIHByaW9yIHBhdGNoIHNldCwgdGhlbiBzdWV4ZWMgdGhlbSBvbnRvCisgICAgIyB0aGlzIHBhdGNoc2V0LgorICAgIGFwcHJvdmFscyA9IHNlbGYuR2V0QXBwcm92YWxzKCkKKyAgICBzZWxmLmFjY3RfYXBwcm92YWxzID0gZGljdCgpCisgICAgZm9yIGFwcHJvdmFsIGluIGFwcHJvdmFsczoKKyAgICAgICMgTm90ZTogU2l0ZXMgd2l0aCBkaWZmZXJlbnQgJ2NvcHlfbWluX3Njb3JlJyB2YWx1ZXMgaW4gdGhlCisgICAgICAjIGFwcHJvdmFsX2NhdGVnb3JpZXMgREIgdGFibGUgbWlnaHQgd2FudCBkaWZmZXJlbnQgYmVoYXZpb3IgaGVyZS4KKyAgICAgICMgQWRkaXRpb25hbCBjYXRlZ29yaWVzIHNob3VsZCBhbHNvIGJlIGFkZGVkIGlmIGRlc2lyZWQuCisgICAgICBpZiBhcHByb3ZhbFsiY2F0ZWdvcnlfaWQiXSA9PSAiQ29kZS1SZXZpZXciIGFuZCBhcHByb3ZhbFsndmFsdWUnXSAhPSAnLTInOgorICAgICAgICBzZWxmLkFwcGVuZEFjY3RBcHByb3ZhbChhcHByb3ZhbFsnYWNjb3VudF9pZCddLCAnLS1jb2RlLXJldmlldyAlcycgJSBhcHByb3ZhbFsndmFsdWUnXSkKKyAgICAgIGVsaWYgYXBwcm92YWxbImNhdGVnb3J5X2lkIl0gPT0gIlZlcmlmaWVkIjoKKyAgICAgICAgIyBEb24ndCByZS1hZGQgdmVyaWZpZXMKKyAgICAgICAgIyBzZWxmLkFwcGVuZEFjY3RBcHByb3ZhbChhcHByb3ZhbFsnYWNjb3VudF9pZCddLCAnLS12ZXJpZmllZCAlcycgJSBhcHByb3ZhbFsndmFsdWUnXSkKKyAgICAgICAgY29udGludWUKKyAgICAgIGVsaWYgYXBwcm92YWxbImNhdGVnb3J5X2lkIl0gPT0gIlNVQk0iOgorICAgICAgICAjIFdlIGRvbid0IGNhcmUgYWJvdXQgcHJldmlvdXMgc3VibWl0IGF0dGVtcHRzCisgICAgICAgIGNvbnRpbnVlCisgICAgICBlbHNlOgorICAgICAgICBzZWxmLkFwcGVuZEFjY3RBcHByb3ZhbChhcHByb3ZhbFsnYWNjb3VudF9pZCddLCAnLS0lcyAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwcm92YWxbJ2NhdGVnb3J5X2lkJ10ubG93ZXIoKS5yZXBsYWNlKCcgJywgJy0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHJvdmFsWyd2YWx1ZSddKSkKKworICAgIGdlcnJpdF9yZXZpZXdfbXNnID0gKCJcJ0F1dG9tYXRpY2FsbHkgcmUtYWRkZWQgYnkgR2Vycml0IHRyaXZpYWwgcmViYXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImRldGVjdGlvbiBzY3JpcHQuXCciKQorICAgIGZvciBhY2N0LCBmbGFncyBpbiBzZWxmLmFjY3RfYXBwcm92YWxzLml0ZW1zKCk6CisgICAgICBnZXJyaXRfcmV2aWV3X2NtZCA9IFsnZ2Vycml0JywgJ3JldmlldycsICctLXByb2plY3QnLCBzZWxmLnByb2plY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tbWVzc2FnZScsIGdlcnJpdF9yZXZpZXdfbXNnLCBmbGFncywgc2VsZi5jb21taXRdCisgICAgICBlbWFpbF9hZGRyID0gc2VsZi5HZXRFbWFpbEZyb21BY2N0SWQoYWNjdCkKKyAgICAgIHNlbGYuU3VFeGVjKGVtYWlsX2FkZHIsICcgJy5qb2luKGdlcnJpdF9yZXZpZXdfY21kKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgTWFpbigpCisgIHRyeToKKyAgICBUcml2aWFsUmViYXNlKCkuUnVuKCkKKyAgZXhjZXB0IEFzc2VydGlvbkVycm9yLCBlOgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5naXRpZ25vcmUgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOTE0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNyBAQAorL2JpbgorL3RhcmdldAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLy5zZXR0aW5ncy9vcmcubWF2ZW4uaWRlLmVjbGlwc2UucHJlZnMKKy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubTJlLmNvcmUucHJlZnMKKy9nZXJyaXQtY29tbW9uLmltbApkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDliMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSwzIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvL3NyYy90ZXN0L2phdmE9VVRGLTgKK2VuY29kaW5nLzxwcm9qZWN0Pj1VVEYtOApkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwYWQyMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKQEAgLTAsMCArMSwyIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorbGluZS5zZXBhcmF0b3I9XG4KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc2NWIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMjYzIEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS42CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS42CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl9saW5lc19pbl9jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9Mworb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9c3BhY2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZGQzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNjAgQEAKK2VjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCitlZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKK2Zvcm1hdHRlcl9wcm9maWxlPV9Hb29nbGUgRm9ybWF0Citmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQorb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj1jb20uZ29vZ2xlO2NvbTtqdW5pdDtuZXQ7b3JnO2phdmE7amF2YXg7CitvcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9OTkKK29yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQorb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgorc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCitzcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCitzcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKK3NwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQorc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQorc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKK3NwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQorc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCitzcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT1mYWxzZQorc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGVfY2hhbmdlc19vbmx5PWZhbHNlCitzcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9dHJ1ZQorc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9dHJ1ZQorc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKK3NwX2NsZWFudXAubWFrZV90eXBlX2Fic3RyYWN0X2lmX21pc3NpbmdfbWV0aG9kPWZhbHNlCitzcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPWZhbHNlCitzcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKK3NwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKK3NwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPXRydWUKK3NwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCitzcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQorc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQorc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCitzcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKK3NwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKK3NwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCitzcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKK3NwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQorc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKK3NwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQorc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCitzcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvcG9tLnhtbCBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyNzMwMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3BvbS54bWwKQEAgLTAsMCArMSwxNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+Z2Vycml0LWFjY2VwdGFuY2UtdGVzdHM8L2FydGlmYWN0SWQ+CisKKyAgPG5hbWU+R2Vycml0IENvZGUgUmV2aWV3IC0gQWNjZXB0YW5jZSBUZXN0czwvbmFtZT4KKworICA8ZGVzY3JpcHRpb24+CisgICAgR2Vycml0IEFjY2VwdGFuY2UgVGVzdHMKKyAgPC9kZXNjcmlwdGlvbj4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXJldmlld2RiPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtbWFpbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtb3BlbmlkPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtc3NoZDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LWh0dHBkPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGdtPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9leGNsdXNpb24+CisgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmFjY2VwdGFuY2U8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICA8bmFtZT4hZ2Vycml0LmFjY2VwdGFuY2UtdGVzdHMuc2tpcDwvbmFtZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD5pbnRlZ3JhdGlvbi10ZXN0PC9pZD4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5pbnRlZ3JhdGlvbi10ZXN0PC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDxpZD52ZXJpZnk8L2lkPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPnZlcmlmeTwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgPC9idWlsZD4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvQWJzdHJhY3REYWVtb25UZXN0LmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvQWJzdHJhY3REYWVtb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjN2IzZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9BYnN0cmFjdERhZW1vblRlc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERhZW1vblRlc3QgeworCisgIHByaXZhdGUgR2Vycml0U2VydmVyIHNlcnZlcjsKKworICBAQmVmb3JlCisgIHB1YmxpYyBmaW5hbCB2b2lkIGJlZm9yZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXIgPSBHZXJyaXRTZXJ2ZXIuc3RhcnQoKTsKKyAgICBzZXJ2ZXIuZ2V0VGVzdEluamVjdG9yKCkuaW5qZWN0TWVtYmVycyh0aGlzKTsKKyAgfQorCisgIEBBZnRlcgorICBwdWJsaWMgZmluYWwgdm9pZCBhZnRlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBzZXJ2ZXIuc3RvcCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvQWNjb3VudENyZWF0b3IuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9BY2NvdW50Q3JlYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NmVmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvQWNjb3VudENyZWF0b3IuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRTc2hLZXk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRCeUVtYWlsQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hLZXlDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5LZXlQYWlyOworCitwdWJsaWMgY2xhc3MgQWNjb3VudENyZWF0b3IgeworCisgIHByaXZhdGUgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gcmV2aWV3RGJQcm92aWRlcjsKKyAgcHJpdmF0ZSBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisgIHByaXZhdGUgU3NoS2V5Q2FjaGUgc3NoS2V5Q2FjaGU7CisgIHByaXZhdGUgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKKyAgcHJpdmF0ZSBBY2NvdW50QnlFbWFpbENhY2hlIGJ5RW1haWxDYWNoZTsKKworICBASW5qZWN0CisgIEFjY291bnRDcmVhdG9yKFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYSwgR3JvdXBDYWNoZSBncm91cENhY2hlLAorICAgICAgU3NoS2V5Q2FjaGUgc3NoS2V5Q2FjaGUsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCisgICAgICBBY2NvdW50QnlFbWFpbENhY2hlIGJ5RW1haWxDYWNoZSkgeworICAgIHJldmlld0RiUHJvdmlkZXIgPSBzY2hlbWE7CisgICAgdGhpcy5ncm91cENhY2hlID0gZ3JvdXBDYWNoZTsKKyAgICB0aGlzLnNzaEtleUNhY2hlID0gc3NoS2V5Q2FjaGU7CisgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7CisgICAgdGhpcy5ieUVtYWlsQ2FjaGUgPSBieUVtYWlsQ2FjaGU7CisgIH0KKworICBwdWJsaWMgVGVzdEFjY291bnQgY3JlYXRlKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIGVtYWlsLCBTdHJpbmcgZnVsbE5hbWUsCisgICAgICBTdHJpbmcuLi4gZ3JvdXBzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiB7CisgICAgUmV2aWV3RGIgZGIgPSByZXZpZXdEYlByb3ZpZGVyLm9wZW4oKTsKKyAgICB0cnkgeworICAgICAgQWNjb3VudC5JZCBpZCA9IG5ldyBBY2NvdW50LklkKGRiLm5leHRBY2NvdW50SWQoKSk7CisgICAgICBLZXlQYWlyIHNzaEtleSA9IGdlblNzaEtleSgpOworICAgICAgQWNjb3VudFNzaEtleSBrZXkgPQorICAgICAgICAgIG5ldyBBY2NvdW50U3NoS2V5KG5ldyBBY2NvdW50U3NoS2V5LklkKGlkLCAxKSwgcHVibGljS2V5KHNzaEtleSwgZW1haWwpKTsKKyAgICAgIEFjY291bnRFeHRlcm5hbElkIGV4dFVzZXIgPQorICAgICAgICAgIG5ldyBBY2NvdW50RXh0ZXJuYWxJZChpZCwgbmV3IEFjY291bnRFeHRlcm5hbElkLktleSgKKyAgICAgICAgICAgICAgQWNjb3VudEV4dGVybmFsSWQuU0NIRU1FX1VTRVJOQU1FLCB1c2VybmFtZSkpOworICAgICAgU3RyaW5nIGh0dHBQYXNzID0gImh0dHAtcGFzcyI7CisgICAgICBleHRVc2VyLnNldFBhc3N3b3JkKGh0dHBQYXNzKTsKKyAgICAgIGRiLmFjY291bnRFeHRlcm5hbElkcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oZXh0VXNlcikpOworCisgICAgICBpZiAoZW1haWwgIT0gbnVsbCkgeworICAgICAgICBBY2NvdW50RXh0ZXJuYWxJZCBleHRNYWlsdG8gPSBuZXcgQWNjb3VudEV4dGVybmFsSWQoaWQsIGdldEVtYWlsS2V5KGVtYWlsKSk7CisgICAgICAgIGV4dE1haWx0by5zZXRFbWFpbEFkZHJlc3MoZW1haWwpOworICAgICAgICBkYi5hY2NvdW50RXh0ZXJuYWxJZHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGV4dE1haWx0bykpOworICAgICAgfQorCisgICAgICBBY2NvdW50IGEgPSBuZXcgQWNjb3VudChpZCk7CisgICAgICBhLnNldEZ1bGxOYW1lKGZ1bGxOYW1lKTsKKyAgICAgIGEuc2V0UHJlZmVycmVkRW1haWwoZW1haWwpOworICAgICAgZGIuYWNjb3VudHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGEpKTsKKworICAgICAgZGIuYWNjb3VudFNzaEtleXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGtleSkpOworCisgICAgICBpZiAoZ3JvdXBzICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgbiA6IGdyb3VwcykgeworICAgICAgICAgIEFjY291bnRHcm91cC5OYW1lS2V5IGsgPSBuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkobik7CisgICAgICAgICAgQWNjb3VudEdyb3VwIGcgPSBncm91cENhY2hlLmdldChrKTsKKyAgICAgICAgICBBY2NvdW50R3JvdXBNZW1iZXIgbSA9CisgICAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBNZW1iZXIobmV3IEFjY291bnRHcm91cE1lbWJlci5LZXkoaWQsIGcuZ2V0SWQoKSkpOworICAgICAgICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG0pKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBzc2hLZXlDYWNoZS5ldmljdCh1c2VybmFtZSk7CisgICAgICBhY2NvdW50Q2FjaGUuZXZpY3RCeVVzZXJuYW1lKHVzZXJuYW1lKTsKKyAgICAgIGJ5RW1haWxDYWNoZS5ldmljdChlbWFpbCk7CisKKyAgICAgIHJldHVybiBuZXcgVGVzdEFjY291bnQoaWQsIHVzZXJuYW1lLCBlbWFpbCwgZnVsbE5hbWUsIHNzaEtleSwgaHR0cFBhc3MpOworICAgIH0gZmluYWxseSB7CisgICAgICBkYi5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBUZXN0QWNjb3VudCBjcmVhdGUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgZ3JvdXApCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gY3JlYXRlKHVzZXJuYW1lLCBudWxsLCB1c2VybmFtZSwgZ3JvdXApOworICB9CisKKyAgcHVibGljIFRlc3RBY2NvdW50IGNyZWF0ZShTdHJpbmcgdXNlcm5hbWUpCisgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gY3JlYXRlKHVzZXJuYW1lLCBudWxsLCB1c2VybmFtZSwgKFN0cmluZ1tdKSBudWxsKTsKKyAgfQorCisgIHByaXZhdGUgQWNjb3VudEV4dGVybmFsSWQuS2V5IGdldEVtYWlsS2V5KFN0cmluZyBlbWFpbCkgeworICAgIHJldHVybiBuZXcgQWNjb3VudEV4dGVybmFsSWQuS2V5KEFjY291bnRFeHRlcm5hbElkLlNDSEVNRV9NQUlMVE8sIGVtYWlsKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEtleVBhaXIgZ2VuU3NoS2V5KCkgdGhyb3dzIEpTY2hFeGNlcHRpb24geworICAgIEpTY2gganNjaCA9IG5ldyBKU2NoKCk7CisgICAgcmV0dXJuIEtleVBhaXIuZ2VuS2V5UGFpcihqc2NoLCBLZXlQYWlyLlJTQSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHVibGljS2V5KEtleVBhaXIgc3NoS2V5LCBTdHJpbmcgY29tbWVudCkKKyAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgIHNzaEtleS53cml0ZVB1YmxpY0tleShvdXQsIGNvbW1lbnQpOworICAgIHJldHVybiBvdXQudG9TdHJpbmcoIkFTQ0lJIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9HY0Fzc2VydC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0djQXNzZXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3Mjg5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvR2NBc3NlcnQuamF2YQpAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEdjQXNzZXJ0IHsKKworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOworCisgIEBJbmplY3QKKyAgcHVibGljIEdjQXNzZXJ0KEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyKSB7CisgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOworICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0SGFzUGFja0ZpbGUoUHJvamVjdC5OYW1lS2V5Li4uIHByb2plY3RzKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGZvciAoUHJvamVjdC5OYW1lS2V5IHAgOiBwcm9qZWN0cykgeworICAgICAgYXNzZXJ0VHJ1ZSgiUHJvamVjdCAiICsgcC5nZXQoKSArICIgaGFzIG5vIHBhY2sgZmlsZXMuIiwKKyAgICAgICAgICBnZXRQYWNrRmlsZXMocCkubGVuZ3RoID4gMCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgYXNzZXJ0SGFzTm9QYWNrRmlsZShQcm9qZWN0Lk5hbWVLZXkuLi4gcHJvamVjdHMpCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgZm9yIChQcm9qZWN0Lk5hbWVLZXkgcCA6IHByb2plY3RzKSB7CisgICAgICBhc3NlcnRUcnVlKCJQcm9qZWN0ICIgKyBwLmdldCgpICsgIiBoYXMgcGFjayBmaWxlcy4iLAorICAgICAgICAgIGdldFBhY2tGaWxlcyhwKS5sZW5ndGggPT0gMCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRQYWNrRmlsZXMoUHJvamVjdC5OYW1lS2V5IHApCisgICAgICB0aHJvd3MgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmVwb3NpdG9yeSByZXBvID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkocCk7CisgICAgdHJ5IHsKKyAgICAgIEZpbGUgcGFja0RpciA9IG5ldyBGaWxlKHJlcG8uZ2V0RGlyZWN0b3J5KCksICJvYmplY3RzL3BhY2siKTsKKyAgICAgIHJldHVybiBwYWNrRGlyLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgIHJldHVybiBuYW1lLmVuZHNXaXRoKCIucGFjayIpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcmVwby5jbG9zZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0dlcnJpdFNlcnZlci5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL0dlcnJpdFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmFiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvR2Vycml0U2VydmVyLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQnJva2VuQmFycmllckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DeWNsaWNCYXJyaWVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uRGFlbW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS5Jbml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuRmFjdG9yeU1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CisKK2NsYXNzIEdlcnJpdFNlcnZlciB7CisKKyAgLyoqIFJldHVybnMgZnVsbHkgc3RhcnRlZCBHZXJyaXQgc2VydmVyICovCisgIHN0YXRpYyBHZXJyaXRTZXJ2ZXIgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIFN0cmluZyBzaXRlUGF0aCA9IGluaXRTaXRlKCk7CisKKyAgICBmaW5hbCBDeWNsaWNCYXJyaWVyIHNlcnZlclN0YXJ0ZWQgPSBuZXcgQ3ljbGljQmFycmllcigyKTsKKworICAgIGZpbmFsIERhZW1vbiBkYWVtb24gPSBuZXcgRGFlbW9uKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBzZXJ2ZXJTdGFydGVkLmF3YWl0KCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoQnJva2VuQmFycmllckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKworICAgIEV4ZWN1dG9yU2VydmljZSBkYWVtb25TZXJ2aWNlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgZGFlbW9uU2VydmljZS5zdWJtaXQobmV3IENhbGxhYmxlPFZvaWQ+KCkgeworICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgcmMgPSBkYWVtb24ubWFpbihuZXcgU3RyaW5nW10geyItZCIsIHNpdGVQYXRoLCAiLS1oZWFkbGVzcyIgfSk7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGYWlsZWQgdG8gc3RhcnQgR2Vycml0IGRhZW1vbi4gQ2hlY2sgIgorICAgICAgICAgICAgICArIHNpdGVQYXRoICsgIi9sb2dzL2Vycm9yX2xvZyIpOworICAgICAgICAgIHNlcnZlclN0YXJ0ZWQucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH07CisgICAgfSk7CisKKyAgICBzZXJ2ZXJTdGFydGVkLmF3YWl0KCk7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJHZXJyaXQgU2VydmVyIFN0YXJ0ZWQiKTsKKworICAgIEluamVjdG9yIGkgPSBjcmVhdGVUZXN0SW5qZWN0b3IoZGFlbW9uKTsKKyAgICByZXR1cm4gbmV3IEdlcnJpdFNlcnZlcihpLCBkYWVtb24sIGRhZW1vblNlcnZpY2UpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGluaXRTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgRGF0ZUZvcm1hdCBkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5TU1kZEhIbW1zcyIpOworICAgIFN0cmluZyBwYXRoID0gInRhcmdldC90ZXN0X3NpdGVfIiArIGRmLmZvcm1hdChuZXcgRGF0ZSgpKTsKKyAgICBJbml0IGluaXQgPSBuZXcgSW5pdCgpOworICAgIGludCByYyA9IGluaXQubWFpbihuZXcgU3RyaW5nW10geyItZCIsIHBhdGgsICItLWJhdGNoIiwgIi0tbm8tYXV0by1zdGFydCJ9KTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkbid0IGluaXRpYWxpemUgc2l0ZSIpOworICAgIH0KKyAgICByZXR1cm4gcGF0aDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEluamVjdG9yIGNyZWF0ZVRlc3RJbmplY3RvcihEYWVtb24gZGFlbW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBJbmplY3RvciBzeXNJbmplY3RvciA9IGdldChkYWVtb24sICJzeXNJbmplY3RvciIpOworICAgIE1vZHVsZSBtb2R1bGUgPSBuZXcgRmFjdG9yeU1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kKEFjY291bnRDcmVhdG9yLmNsYXNzKTsKKyAgICAgIH0KKyAgICB9OworICAgIHJldHVybiBzeXNJbmplY3Rvci5jcmVhdGVDaGlsZEluamVjdG9yKG1vZHVsZSk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgZ2V0KE9iamVjdCBvYmosIFN0cmluZyBmaWVsZCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uLAorICAgICAgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgRmllbGQgZiA9IG9iai5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoZmllbGQpOworICAgIGYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICByZXR1cm4gKFQpIGYuZ2V0KG9iaik7CisgIH0KKworICBwcml2YXRlIERhZW1vbiBkYWVtb247CisgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGRhZW1vblNlcnZpY2U7CisgIHByaXZhdGUgSW5qZWN0b3IgdGVzdEluamVjdG9yOworCisgIHByaXZhdGUgR2Vycml0U2VydmVyKEluamVjdG9yIHRlc3RJbmplY3RvciwKKyAgICAgIERhZW1vbiBkYWVtb24sIEV4ZWN1dG9yU2VydmljZSBkYWVtb25TZXJ2aWNlKSB7CisgICAgdGhpcy50ZXN0SW5qZWN0b3IgPSB0ZXN0SW5qZWN0b3I7CisgICAgdGhpcy5kYWVtb24gPSBkYWVtb247CisgICAgdGhpcy5kYWVtb25TZXJ2aWNlID0gZGFlbW9uU2VydmljZTsKKyAgfQorCisgIEluamVjdG9yIGdldFRlc3RJbmplY3RvcigpIHsKKyAgICByZXR1cm4gdGVzdEluamVjdG9yOworICB9CisKKyAgdm9pZCBzdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgTGlmZWN5Y2xlTWFuYWdlciBtYW5hZ2VyID0gZ2V0KGRhZW1vbiwgIm1hbmFnZXIiKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkdlcnJpdCBTZXJ2ZXIgU2h1dGRvd24iKTsKKyAgICBtYW5hZ2VyLnN0b3AoKTsKKyAgICBkYWVtb25TZXJ2aWNlLnNodXRkb3duTm93KCk7CisgICAgZGFlbW9uU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKExvbmcuTUFYX1ZBTFVFLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1Jlc3RSZXNwb25zZS5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1Jlc3RSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTM0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvUmVzdFJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmVzdGFwaS5SZXN0QXBpU2VydmxldC5KU09OX01BR0lDOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworcHVibGljIGNsYXNzIFJlc3RSZXNwb25zZSB7CisKKyAgcHJpdmF0ZSBIdHRwUmVzcG9uc2UgcmVzcG9uc2U7CisgIHByaXZhdGUgUmVhZGVyIHJlYWRlcjsKKworICBSZXN0UmVzcG9uc2UoSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICB9CisKKyAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHJlYWRlciA9PSBudWxsICYmIHJlc3BvbnNlLmdldEVudGl0eSgpICE9IG51bGwpIHsKKyAgICAgIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRDb250ZW50KCkpOworICAgICAgcmVhZGVyLnNraXAoSlNPTl9NQUdJQy5sZW5ndGgpOworICAgIH0KKyAgICByZXR1cm4gcmVhZGVyOworICB9CisKKyAgcHVibGljIHZvaWQgY29uc3VtZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZWFkZXIgcmVhZGVyID0gZ2V0UmVhZGVyKCk7CisgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICB3aGlsZSAocmVhZGVyLnJlYWQoKSAhPSAtMSk7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgeworICAgIHJldHVybiByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvUmVzdFNlc3Npb24uamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9SZXN0U2Vzc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjY1MjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvUmVzdFNlc3Npb24uamF2YQpAQCAtMCwwICsxLDg2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjb3BlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5hdXRoLlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cERlbGV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cFBvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmVudGl0eS5TdHJpbmdFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkRlZmF1bHRIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5tZXNzYWdlLkJhc2ljSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IVFRQOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFJlc3RTZXNzaW9uIHsKKworICBwcml2YXRlIGZpbmFsIFRlc3RBY2NvdW50IGFjY291bnQ7CisgIERlZmF1bHRIdHRwQ2xpZW50IGNsaWVudDsKKworICBwdWJsaWMgUmVzdFNlc3Npb24oVGVzdEFjY291bnQgYWNjb3VudCkgeworICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CisgIH0KKworICBwdWJsaWMgUmVzdFJlc3BvbnNlIGdldChTdHJpbmcgZW5kUG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgSHR0cEdldCBnZXQgPSBuZXcgSHR0cEdldCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EiICsgZW5kUG9pbnQpOworICAgIHJldHVybiBuZXcgUmVzdFJlc3BvbnNlKGdldENsaWVudCgpLmV4ZWN1dGUoZ2V0KSk7CisgIH0KKworICBwdWJsaWMgUmVzdFJlc3BvbnNlIHB1dChTdHJpbmcgZW5kUG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHB1dChlbmRQb2ludCwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgUmVzdFJlc3BvbnNlIHB1dChTdHJpbmcgZW5kUG9pbnQsIE9iamVjdCBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEh0dHBQdXQgcHV0ID0gbmV3IEh0dHBQdXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hIiArIGVuZFBvaW50KTsKKyAgICBpZiAoY29udGVudCAhPSBudWxsKSB7CisgICAgICBwdXQuYWRkSGVhZGVyKG5ldyBCYXNpY0hlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICBwdXQuc2V0RW50aXR5KG5ldyBTdHJpbmdFbnRpdHkoKG5ldyBHc29uKCkpLnRvSnNvbihjb250ZW50KSwgSFRUUC5VVEZfOCkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFJlc3RSZXNwb25zZShnZXRDbGllbnQoKS5leGVjdXRlKHB1dCkpOworICB9CisKKyAgcHVibGljIFJlc3RSZXNwb25zZSBwb3N0KFN0cmluZyBlbmRQb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gcG9zdChlbmRQb2ludCwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgUmVzdFJlc3BvbnNlIHBvc3QoU3RyaW5nIGVuZFBvaW50LCBPYmplY3QgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBIdHRwUG9zdCBwb3N0ID0gbmV3IEh0dHBQb3N0KCJodHRwOi8vbG9jYWxob3N0OjgwODAvYSIgKyBlbmRQb2ludCk7CisgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkgeworICAgICAgcG9zdC5hZGRIZWFkZXIobmV3IEJhc2ljSGVhZGVyKCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgIHBvc3Quc2V0RW50aXR5KG5ldyBTdHJpbmdFbnRpdHkoKG5ldyBHc29uKCkpLnRvSnNvbihjb250ZW50KSwgSFRUUC5VVEZfOCkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IFJlc3RSZXNwb25zZShnZXRDbGllbnQoKS5leGVjdXRlKHBvc3QpKTsKKyAgfQorCisgIHB1YmxpYyBSZXN0UmVzcG9uc2UgZGVsZXRlKFN0cmluZyBlbmRQb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBIdHRwRGVsZXRlIGRlbGV0ZSA9IG5ldyBIdHRwRGVsZXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYSIgKyBlbmRQb2ludCk7CisgICAgcmV0dXJuIG5ldyBSZXN0UmVzcG9uc2UoZ2V0Q2xpZW50KCkuZXhlY3V0ZShkZWxldGUpKTsKKyAgfQorCisgIHByaXZhdGUgRGVmYXVsdEh0dHBDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgIGlmIChjbGllbnQgPT0gbnVsbCkgeworICAgICAgY2xpZW50ID0gbmV3IERlZmF1bHRIdHRwQ2xpZW50KCk7CisgICAgICBjbGllbnQuZ2V0Q3JlZGVudGlhbHNQcm92aWRlcigpLnNldENyZWRlbnRpYWxzKAorICAgICAgICAgIG5ldyBBdXRoU2NvcGUoImxvY2FsaG9zdCIsIDgwODApLAorICAgICAgICAgIG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMoYWNjb3VudC51c2VybmFtZSwgYWNjb3VudC5odHRwUGFzc3dvcmQpKTsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1NzaFNlc3Npb24uamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9Tc2hTZXNzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlOTIzNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9Tc2hTZXNzaW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guQ2hhbm5lbEV4ZWM7CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2g7CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CisKK3B1YmxpYyBjbGFzcyBTc2hTZXNzaW9uIHsKKworICBwcml2YXRlIGZpbmFsIFRlc3RBY2NvdW50IGFjY291bnQ7CisgIHByaXZhdGUgU2Vzc2lvbiBzZXNzaW9uOworICBwcml2YXRlIFN0cmluZyBlcnJvcjsKKworICBwdWJsaWMgU3NoU2Vzc2lvbihUZXN0QWNjb3VudCBhY2NvdW50KSB7CisgICAgdGhpcy5hY2NvdW50ID0gYWNjb3VudDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZXhlYyhTdHJpbmcgY29tbWFuZCkgdGhyb3dzIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBDaGFubmVsRXhlYyBjaGFubmVsID0gKENoYW5uZWxFeGVjKSBnZXRTZXNzaW9uKCkub3BlbkNoYW5uZWwoImV4ZWMiKTsKKyAgICB0cnkgeworICAgICAgY2hhbm5lbC5zZXRDb21tYW5kKGNvbW1hbmQpOworICAgICAgY2hhbm5lbC5zZXRJbnB1dFN0cmVhbShudWxsKTsKKyAgICAgIElucHV0U3RyZWFtIGluID0gY2hhbm5lbC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgY2hhbm5lbC5jb25uZWN0KCk7CisKKyAgICAgIFNjYW5uZXIgcyA9IG5ldyBTY2FubmVyKGNoYW5uZWwuZ2V0RXJyU3RyZWFtKCkpLnVzZURlbGltaXRlcigiXFxBIik7CisgICAgICBlcnJvciA9ICBzLmhhc05leHQoKSA/IHMubmV4dCgpIDogbnVsbDsKKworICAgICAgcyA9IG5ldyBTY2FubmVyKGluKS51c2VEZWxpbWl0ZXIoIlxcQSIpOworICAgICAgcmV0dXJuIHMuaGFzTmV4dCgpID8gcy5uZXh0KCkgOiAiIjsKKyAgICB9IGZpbmFsbHkgeworICAgICAgY2hhbm5lbC5kaXNjb25uZWN0KCk7CisgICAgfQorICB9CisKKyAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7CisgICAgcmV0dXJuIGVycm9yICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEVycm9yKCkgeworICAgIHJldHVybiBlcnJvcjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKKyAgICAgIHNlc3Npb24uZGlzY29ubmVjdCgpOworICAgICAgc2Vzc2lvbiA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTZXNzaW9uIGdldFNlc3Npb24oKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgeworICAgICAgSlNjaCBqc2NoID0gbmV3IEpTY2goKTsKKyAgICAgIGpzY2guYWRkSWRlbnRpdHkoIktleVBhaXIiLAorICAgICAgICAgIGFjY291bnQucHJpdmF0ZUtleSgpLCBhY2NvdW50LnNzaEtleS5nZXRQdWJsaWNLZXlCbG9iKCksIG51bGwpOworICAgICAgc2Vzc2lvbiA9IGpzY2guZ2V0U2Vzc2lvbihhY2NvdW50LnVzZXJuYW1lLCAibG9jYWxob3N0IiwgMjk0MTgpOworICAgICAgc2Vzc2lvbi5zZXRDb25maWcoIlN0cmljdEhvc3RLZXlDaGVja2luZyIsICJubyIpOworICAgICAgc2Vzc2lvbi5jb25uZWN0KCk7CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBiLmFwcGVuZCgic3NoOi8vIik7CisgICAgYi5hcHBlbmQoc2Vzc2lvbi5nZXRVc2VyTmFtZSgpKTsKKyAgICBiLmFwcGVuZCgiQCIpOworICAgIGIuYXBwZW5kKHNlc3Npb24uZ2V0SG9zdCgpKTsKKyAgICBiLmFwcGVuZCgiOiIpOworICAgIGIuYXBwZW5kKHNlc3Npb24uZ2V0UG9ydCgpKTsKKyAgICByZXR1cm4gYi50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvU3lzdGVtR3JvdXBzSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9TeXN0ZW1Hcm91cHNJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZTIwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvU3lzdGVtR3JvdXBzSVQuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cC5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQW4gZXhhbXBsZSB0ZXN0IHRoYXQgdGVzdHMgcHJlc2VuY2Ugb2Ygc3lzdGVtIGdyb3VwcyBpbiBhIG5ld2x5IGluaXRpYWxpemVkCisgKiByZXZpZXcgc2l0ZS4KKyAqCisgKiBUaGUgdGVzdCBzaG93cyBob3cgdG8gcGVyZm9ybSB0aGVzZSBjaGVja3MgdmlhIFNTSCwgUkVTVCBvciB1c2luZyBHZXJyaXQKKyAqIGludGVybmFscy4KKyAqLworcHVibGljIGNsYXNzIFN5c3RlbUdyb3Vwc0lUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gcmV2aWV3RGJQcm92aWRlcjsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgcHJvdGVjdGVkIFRlc3RBY2NvdW50IGFkbWluOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9IGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiYWRtaW5Ac2FwLmNvbSIsICJBZG1pbmlzdHJhdG9yIiwKKyAgICAgICAgICAgICJBZG1pbmlzdHJhdG9ycyIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc3lzdGVtR3JvdXBzQ3JlYXRlZF9zc2goKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFNzaFNlc3Npb24gc2Vzc2lvbiA9IG5ldyBTc2hTZXNzaW9uKGFkbWluKTsKKyAgICBTdHJpbmcgcmVzdWx0ID0gc2Vzc2lvbi5leGVjKCJnZXJyaXQgbHMtZ3JvdXBzIik7CisgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIkFkbWluaXN0cmF0b3JzIikpOworICAgIGFzc2VydFRydWUocmVzdWx0LmNvbnRhaW5zKCJBbm9ueW1vdXMgVXNlcnMiKSk7CisgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIk5vbi1JbnRlcmFjdGl2ZSBVc2VycyIpKTsKKyAgICBhc3NlcnRUcnVlKHJlc3VsdC5jb250YWlucygiUHJvamVjdCBPd25lcnMiKSk7CisgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIlJlZ2lzdGVyZWQgVXNlcnMiKSk7CisgICAgc2Vzc2lvbi5jbG9zZSgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgc3lzdGVtR3JvdXBzQ3JlYXRlZF9yZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXN0U2Vzc2lvbiBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZ2V0KCIvZ3JvdXBzLyIpOworICAgIEdzb24gZ3NvbiA9IG5ldyBHc29uKCk7CisgICAgTWFwPFN0cmluZywgR3JvdXBJbmZvPiByZXN1bHQgPQorICAgICAgICBnc29uLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgR3JvdXBJbmZvPj4oKSB7fS5nZXRUeXBlKCkpOworICAgIFNldDxTdHJpbmc+IG5hbWVzID0gcmVzdWx0LmtleVNldCgpOworICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIkFkbWluaXN0cmF0b3JzIikpOworICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIkFub255bW91cyBVc2VycyIpKTsKKyAgICBhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKCJOb24tSW50ZXJhY3RpdmUgVXNlcnMiKSk7CisgICAgYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygiUHJvamVjdCBPd25lcnMiKSk7CisgICAgYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygiUmVnaXN0ZXJlZCBVc2VycyIpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHN5c3RlbUdyb3Vwc0NyZWF0ZWRfaW50ZXJuYWxzKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgUmV2aWV3RGIgZGIgPSByZXZpZXdEYlByb3ZpZGVyLm9wZW4oKTsKKyAgICB0cnkgeworICAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgIGZvciAoQWNjb3VudEdyb3VwIGcgOiBkYi5hY2NvdW50R3JvdXBzKCkuYWxsKCkpIHsKKyAgICAgICAgbmFtZXMuYWRkKGcuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGFzc2VydFRydWUobmFtZXMuY29udGFpbnMoIkFkbWluaXN0cmF0b3JzIikpOworICAgICAgYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygiQW5vbnltb3VzIFVzZXJzIikpOworICAgICAgYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygiTm9uLUludGVyYWN0aXZlIFVzZXJzIikpOworICAgICAgYXNzZXJ0VHJ1ZShuYW1lcy5jb250YWlucygiUHJvamVjdCBPd25lcnMiKSk7CisgICAgICBhc3NlcnRUcnVlKG5hbWVzLmNvbnRhaW5zKCJSZWdpc3RlcmVkIFVzZXJzIikpOworICAgIH0gZmluYWxseSB7CisgICAgICBkYi5jbG9zZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1RlbXBGaWxlVXRpbC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1RlbXBGaWxlVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZWUzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvVGVtcEZpbGVVdGlsLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2U7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK3B1YmxpYyBjbGFzcyBUZW1wRmlsZVV0aWwgeworCisgIHByaXZhdGUgc3RhdGljIGludCB0ZXN0Q291bnQ7CisgIHByaXZhdGUgc3RhdGljIERhdGVGb3JtYXQgZGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eU1NZGRISG1tc3MiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSB0ZW1wID0gbmV3IEZpbGUobmV3IEZpbGUoInRhcmdldCIpLCAidGVtcCIpOworCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVUZXN0Rm9sZGVyTmFtZSgpIHsKKyAgICByZXR1cm4gInRlc3RfIiArIChkZi5mb3JtYXQobmV3IERhdGUoKSkgKyAiXyIgKyAodGVzdENvdW50KyspKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyZWN0b3J5KCkgeworICAgIGZpbmFsIFN0cmluZyBuYW1lID0gY3JlYXRlVW5pcXVlVGVzdEZvbGRlck5hbWUoKTsKKyAgICBmaW5hbCBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXAsIG5hbWUpOworICAgIGlmICghZGlyZWN0b3J5Lm1rZGlycygpKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZmFpbGVkIHRvIGNyZWF0ZSBmb2xkZXIgJyIKKyAgICAgICAgICArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSArICInIik7CisgICAgfQorICAgIHJldHVybiBkaXJlY3Rvcnk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9UZXN0QWNjb3VudC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL1Rlc3RBY2NvdW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4NjgwZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9UZXN0QWNjb3VudC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5LZXlQYWlyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CisKKworcHVibGljIGNsYXNzIFRlc3RBY2NvdW50IHsKKyAgcHVibGljIGZpbmFsIEFjY291bnQuSWQgaWQ7CisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdXNlcm5hbWU7CisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW1haWw7CisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7CisgIHB1YmxpYyBmaW5hbCBLZXlQYWlyIHNzaEtleTsKKyAgcHVibGljIGZpbmFsIFN0cmluZyBodHRwUGFzc3dvcmQ7CisKKyAgVGVzdEFjY291bnQoQWNjb3VudC5JZCBpZCwgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgZW1haWwsIFN0cmluZyBmdWxsTmFtZSwKKyAgICAgIEtleVBhaXIgc3NoS2V5LCBTdHJpbmcgaHR0cFBhc3N3b3JkKSB7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgdGhpcy5mdWxsTmFtZSA9IGZ1bGxOYW1lOworICAgIHRoaXMuc3NoS2V5ID0gc3NoS2V5OworICAgIHRoaXMuaHR0cFBhc3N3b3JkID0gaHR0cFBhc3N3b3JkOworICB9CisKKyAgcHVibGljIGJ5dGVbXSBwcml2YXRlS2V5KCkgeworICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgc3NoS2V5LndyaXRlUHJpdmF0ZUtleShvdXQpOworICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKKyAgfQorCisgIHB1YmxpYyBQZXJzb25JZGVudCBnZXRJZGVudCgpIHsKKyAgICByZXR1cm4gbmV3IFBlcnNvbklkZW50KHVzZXJuYW1lLCBlbWFpbCk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEh0dHBVcmwoKSB7CisgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBiLmFwcGVuZCgiaHR0cDovLyIpOworICAgIGIuYXBwZW5kKHVzZXJuYW1lKTsKKyAgICBiLmFwcGVuZCgiOiIpOworICAgIGIuYXBwZW5kKGh0dHBQYXNzd29yZCk7CisgICAgYi5hcHBlbmQoIkBsb2NhbGhvc3Q6ODA4MCIpOworICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9naXQvR2l0VXRpbC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL2dpdC9HaXRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZjMyYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9naXQvR2l0VXRpbC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlNzaFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZW1wRmlsZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5TZXNzaW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuQWRkQ29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5DbG9uZUNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuQ29tbWl0Q29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuUHVzaENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Kc2NoQ29uZmlnU2Vzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuT3BlblNzaENvbmZpZy5Ib3N0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmU3BlYzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Tc2hTZXNzaW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQ2hhbmdlSWRVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitwdWJsaWMgY2xhc3MgR2l0VXRpbCB7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRTc2goZmluYWwgVGVzdEFjY291bnQgYSkgeworICAgIGZpbmFsIFByb3BlcnRpZXMgY29uZmlnID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBjb25maWcucHV0KCJTdHJpY3RIb3N0S2V5Q2hlY2tpbmciLCAibm8iKTsKKyAgICBKU2NoLnNldENvbmZpZyhjb25maWcpOworCisgICAgLy8gcmVnaXN0ZXIgYSBKc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkgdGhhdCBhZGRzIHRoZSBwcml2YXRlIGtleSBhcyBpZGVudGl0eQorICAgIC8vIHRvIHRoZSBKU2NoIGluc3RhbmNlIG9mIEpHaXQgc28gdGhhdCBTU0ggY29tbXVuaWNhdGlvbiB2aWEgSkdpdCBjYW4KKyAgICAvLyBzdWNjZWVkCisgICAgU3NoU2Vzc2lvbkZhY3Rvcnkuc2V0SW5zdGFuY2UobmV3IEpzY2hDb25maWdTZXNzaW9uRmFjdG9yeSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKEhvc3QgaGMsIFNlc3Npb24gc2Vzc2lvbikgeworICAgICAgICB0cnkgeworICAgICAgICAgIGZpbmFsIEpTY2gganNjaCA9IGdldEpTY2goaGMsIEZTLkRFVEVDVEVEKTsKKyAgICAgICAgICBqc2NoLmFkZElkZW50aXR5KCJLZXlQYWlyIiwgYS5wcml2YXRlS2V5KCksCisgICAgICAgICAgICAgIGEuc3NoS2V5LmdldFB1YmxpY0tleUJsb2IoKSwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKEpTY2hFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUHJvamVjdChTc2hTZXNzaW9uIHMsIFN0cmluZyBuYW1lKQorICAgICAgdGhyb3dzIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBzLmV4ZWMoImdlcnJpdCBjcmVhdGUtcHJvamVjdCAtLWVtcHR5LWNvbW1pdCAtLW5hbWUgXCIiICsgbmFtZSArICJcIiIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBHaXQgY2xvbmVQcm9qZWN0KFN0cmluZyB1cmwpIHRocm93cyBHaXRBUElFeGNlcHRpb24geworICAgIGZpbmFsIEZpbGUgZ2l0RGlyID0gVGVtcEZpbGVVdGlsLmNyZWF0ZVRlbXBEaXJlY3RvcnkoKTsKKyAgICBmaW5hbCBDbG9uZUNvbW1hbmQgY2xvbmVDbWQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCk7CisgICAgY2xvbmVDbWQuc2V0VVJJKHVybCk7CisgICAgY2xvbmVDbWQuc2V0RGlyZWN0b3J5KGdpdERpcik7CisgICAgcmV0dXJuIGNsb25lQ21kLmNhbGwoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoR2l0IGdpdCwgU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50KQorICAgICAgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIEZpbGUgZiA9IG5ldyBGaWxlKGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0RGlyZWN0b3J5KCkuZ2V0UGFyZW50RmlsZSgpLCBwYXRoKTsKKyAgICBGaWxlIHAgPSBmLmdldFBhcmVudEZpbGUoKTsKKyAgICBpZiAoIXAuZXhpc3RzKCkgJiYgIXAubWtkaXJzKCkpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGNyZWF0ZSBkaXI6ICIgKyBwLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9CisgICAgRmlsZVdyaXRlciB3ID0gbmV3IEZpbGVXcml0ZXIoZik7CisgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKHcpOworICAgIHRyeSB7CisgICAgICBvdXQud3JpdGUoY29udGVudCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKworICAgIGZpbmFsIEFkZENvbW1hbmQgYWRkQ21kID0gZ2l0LmFkZCgpOworICAgIGFkZENtZC5hZGRGaWxlcGF0dGVybihwYXRoKTsKKyAgICBhZGRDbWQuY2FsbCgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQ29tbWl0KEdpdCBnaXQsIFBlcnNvbklkZW50IGksIFN0cmluZyBtc2cpCisgICAgICB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNyZWF0ZUNvbW1pdChnaXQsIGksIG1zZywgdHJ1ZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb21taXQoR2l0IGdpdCwgUGVyc29uSWRlbnQgaSwgU3RyaW5nIG1zZywKKyAgICAgIGJvb2xlYW4gaW5zZXJ0Q2hhbmdlSWQpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBPYmplY3RJZCBjaGFuZ2VJZCA9IG51bGw7CisgICAgaWYgKGluc2VydENoYW5nZUlkKSB7CisgICAgICBjaGFuZ2VJZCA9IGNvbXB1dGVDaGFuZ2VJZChnaXQsIGksIG1zZyk7CisgICAgICBtc2cgPSBDaGFuZ2VJZFV0aWwuaW5zZXJ0SWQobXNnLCBjaGFuZ2VJZCk7CisgICAgfQorCisgICAgZmluYWwgQ29tbWl0Q29tbWFuZCBjb21taXRDbWQgPSBnaXQuY29tbWl0KCk7CisgICAgY29tbWl0Q21kLnNldEF1dGhvcihpKTsKKyAgICBjb21taXRDbWQuc2V0Q29tbWl0dGVyKGkpOworICAgIGNvbW1pdENtZC5zZXRNZXNzYWdlKG1zZyk7CisgICAgY29tbWl0Q21kLmNhbGwoKTsKKworICAgIHJldHVybiBjaGFuZ2VJZCAhPSBudWxsID8gIkkiICsgY2hhbmdlSWQuZ2V0TmFtZSgpIDogbnVsbDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIE9iamVjdElkIGNvbXB1dGVDaGFuZ2VJZChHaXQgZ2l0LCBQZXJzb25JZGVudCBpLCBTdHJpbmcgbXNnKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsoZ2l0LmdldFJlcG9zaXRvcnkoKSk7CisgICAgdHJ5IHsKKyAgICAgIFJldkNvbW1pdCBwYXJlbnQgPQorICAgICAgICAgIHJ3Lmxvb2t1cENvbW1pdChnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZihDb25zdGFudHMuSEVBRCkuZ2V0T2JqZWN0SWQoKSk7CisgICAgICByZXR1cm4gQ2hhbmdlSWRVdGlsLmNvbXB1dGVDaGFuZ2VJZChwYXJlbnQuZ2V0VHJlZSgpLCBwYXJlbnQuZ2V0SWQoKSwgaSwgaSwgbXNnKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgcncucmVsZWFzZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgUHVzaFJlc3VsdCBwdXNoSGVhZChHaXQgZ2l0LCBTdHJpbmcgcmVmKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKKyAgICBQdXNoQ29tbWFuZCBwdXNoQ21kID0gZ2l0LnB1c2goKTsKKyAgICBwdXNoQ21kLnNldFJlZlNwZWNzKG5ldyBSZWZTcGVjKCJIRUFEOiIgKyByZWYpKTsKKyAgICBJdGVyYWJsZTxQdXNoUmVzdWx0PiByID0gcHVzaENtZC5jYWxsKCk7CisgICAgcmV0dXJuIEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL2dpdC9QdXNoRm9yUmV2aWV3SVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9naXQvUHVzaEZvclJldmlld0lULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwNTM1MAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9naXQvUHVzaEZvclJldmlld0lULmphdmEKQEAgLTAsMCArMSwzMDkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLmdpdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLmdpdC5HaXRVdGlsLmFkZDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQuR2l0VXRpbC5jbG9uZVByb2plY3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuZ2l0LkdpdFV0aWwuY3JlYXRlQ29tbWl0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLmdpdC5HaXRVdGlsLmNyZWF0ZVByb2plY3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuZ2l0LkdpdFV0aWwuaW5pdFNzaDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQuR2l0VXRpbC5wdXNoSGVhZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5Tc2hTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVzdEFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdpdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlB1c2hSZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVtb3RlUmVmVXBkYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVJlZlVwZGF0ZS5TdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUHVzaEZvclJldmlld0lUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBwcml2YXRlIGVudW0gUHJvdG9jb2wgeworICAgIFNTSCwgSFRUUAorICB9CisKKyAgQFBhcmFtZXRlcnMobmFtZT0iezB9IikKKyAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiBnZXRQYXJhbSgpIHsKKyAgICBMaXN0PE9iamVjdFtdPiBwYXJhbXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBmb3IoUHJvdG9jb2wgcCA6IFByb3RvY29sLnZhbHVlcygpKSB7CisgICAgICBwYXJhbXMuYWRkKG5ldyBPYmplY3RbXSB7cH0pOworICAgIH0KKyAgICByZXR1cm4gcGFyYW1zOworICB9CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiByZXZpZXdEYlByb3ZpZGVyOworCisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CisgIHByaXZhdGUgR2l0IGdpdDsKKyAgcHJpdmF0ZSBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBQcm90b2NvbCBwcm90b2NvbDsKKworICBwdWJsaWMgUHVzaEZvclJldmlld0lUKFByb3RvY29sIHApIHsKKyAgICB0aGlzLnByb3RvY29sID0gcDsKKyAgfQorCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9CisgICAgICAgIGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiYWRtaW5AZXhhbXBsZS5jb20iLCAiQWRtaW5pc3RyYXRvciIsCisgICAgICAgICAgICAiQWRtaW5pc3RyYXRvcnMiKTsKKworICAgIHByb2plY3QgPSBuZXcgUHJvamVjdC5OYW1lS2V5KCJwIik7CisgICAgaW5pdFNzaChhZG1pbik7CisgICAgU3NoU2Vzc2lvbiBzc2hTZXNzaW9uID0gbmV3IFNzaFNlc3Npb24oYWRtaW4pOworICAgIGNyZWF0ZVByb2plY3Qoc3NoU2Vzc2lvbiwgcHJvamVjdC5nZXQoKSk7CisgICAgU3RyaW5nIHVybDsKKyAgICBzd2l0Y2ggKHByb3RvY29sKSB7CisgICAgICBjYXNlIFNTSDoKKyAgICAgICAgdXJsID0gc3NoU2Vzc2lvbi5nZXRVcmwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEhUVFA6CisgICAgICAgIHVybCA9IGFkbWluLmdldEh0dHBVcmwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHByb3RvY29sOiAiICsgcHJvdG9jb2wpOworICAgIH0KKyAgICBnaXQgPSBjbG9uZVByb2plY3QodXJsICsgIi8iICsgcHJvamVjdC5nZXQoKSk7CisgICAgc3NoU2Vzc2lvbi5jbG9zZSgpOworCisgICAgZGIgPSByZXZpZXdEYlByb3ZpZGVyLm9wZW4oKTsKKyAgfQorCisgIEBBZnRlcgorICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworICAgIGRiLmNsb3NlKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEZvck1hc3RlcigpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKKyAgICAgIElPRXhjZXB0aW9uIHsKKyAgICBQdXNoT25lQ29tbWl0IHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIFN0cmluZyByZWYgPSAicmVmcy9mb3IvbWFzdGVyIjsKKyAgICBQdXNoUmVzdWx0IHIgPSBwdXNoLnRvKHJlZik7CisgICAgYXNzZXJ0T2tTdGF0dXMociwgcmVmKTsKKyAgICBhc3NlcnRDaGFuZ2UocHVzaC5jaGFuZ2VJZCwgQ2hhbmdlLlN0YXR1cy5ORVcsIFB1c2hPbmVDb21taXQuU1VCSkVDVCwgbnVsbCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEZvck1hc3RlcldpdGhUb3BpYygpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCisgICAgICBPcm1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAvLyBzcGVjaWZ5IHRvcGljIGluIHJlZgorICAgIFB1c2hPbmVDb21taXQgcHVzaCA9IG5ldyBQdXNoT25lQ29tbWl0KCk7CisgICAgU3RyaW5nIHRvcGljID0gIm15L3RvcGljIjsKKyAgICBTdHJpbmcgcmVmID0gInJlZnMvZm9yL21hc3Rlci8iICsgdG9waWM7CisgICAgUHVzaFJlc3VsdCByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydE9rU3RhdHVzKHIsIHJlZik7CisgICAgYXNzZXJ0Q2hhbmdlKHB1c2guY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMuTkVXLCBQdXNoT25lQ29tbWl0LlNVQkpFQ1QsIHRvcGljKTsKKworICAgIC8vIHNwZWNpZnkgdG9waWMgYXMgb3B0aW9uCisgICAgcHVzaCA9IG5ldyBQdXNoT25lQ29tbWl0KCk7CisgICAgcmVmID0gInJlZnMvZm9yL21hc3RlciV0b3BpYz0iICsgdG9waWM7CisgICAgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRPa1N0YXR1cyhyLCByZWYpOworICAgIGFzc2VydENoYW5nZShwdXNoLmNoYW5nZUlkLCBDaGFuZ2UuU3RhdHVzLk5FVywgUHVzaE9uZUNvbW1pdC5TVUJKRUNULCB0b3BpYyk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEZvck1hc3RlcldpdGhDYygpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKKyAgICAgIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICAvLyBjYyBvbmUgdXNlcgorICAgIFRlc3RBY2NvdW50IHVzZXIgPSBhY2NvdW50cy5jcmVhdGUoInVzZXIiLCAidXNlckBleGFtcGxlLmNvbSIsICJVc2VyIik7CisgICAgUHVzaE9uZUNvbW1pdCBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICBTdHJpbmcgdG9waWMgPSAibXkvdG9waWMiOworICAgIFN0cmluZyByZWYgPSAicmVmcy9mb3IvbWFzdGVyLyIgKyB0b3BpYyArICIlY2M9IiArIHVzZXIuZW1haWw7CisgICAgUHVzaFJlc3VsdCByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydE9rU3RhdHVzKHIsIHJlZik7CisgICAgYXNzZXJ0Q2hhbmdlKHB1c2guY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMuTkVXLCBQdXNoT25lQ29tbWl0LlNVQkpFQ1QsIHRvcGljKTsKKworICAgIC8vIGNjIHNldmVyYWwgdXNlcnMKKyAgICBUZXN0QWNjb3VudCB1c2VyMiA9CisgICAgICAgIGFjY291bnRzLmNyZWF0ZSgiYW5vdGhlci11c2VyIiwgImFub3RoZXIudXNlckBleGFtcGxlLmNvbSIsICJBbm90aGVyIFVzZXIiKTsKKyAgICBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICByZWYgPSAicmVmcy9mb3IvbWFzdGVyLyIgKyB0b3BpYyArICIlY2M9IiArIGFkbWluLmVtYWlsICsgIixjYz0iICsgdXNlci5lbWFpbAorICAgICAgICArICIsY2M9IiArIHVzZXIyLmVtYWlsOworICAgIHIgPSBwdXNoLnRvKHJlZik7CisgICAgYXNzZXJ0T2tTdGF0dXMociwgcmVmKTsKKyAgICBhc3NlcnRDaGFuZ2UocHVzaC5jaGFuZ2VJZCwgQ2hhbmdlLlN0YXR1cy5ORVcsIFB1c2hPbmVDb21taXQuU1VCSkVDVCwgdG9waWMpOworCisgICAgLy8gY2Mgbm9uLWV4aXN0aW5nIHVzZXIKKyAgICBTdHJpbmcgbm9uRXhpc3RpbmdFbWFpbCA9ICJub24uZXhpc3RpbmdAZXhhbXBsZS5jb20iOworICAgIHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIHJlZiA9ICJyZWZzL2Zvci9tYXN0ZXIvIiArIHRvcGljICsgIiVjYz0iICsgYWRtaW4uZW1haWwgKyAiLGNjPSIKKyAgICAgICAgKyBub25FeGlzdGluZ0VtYWlsICsgIixjYz0iICsgdXNlci5lbWFpbDsKKyAgICByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydEVycm9yU3RhdHVzKHIsICJ1c2VyIFwiIiArIG5vbkV4aXN0aW5nRW1haWwgKyAiXCIgbm90IGZvdW5kIiwgcmVmKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQdXNoRm9yTWFzdGVyV2l0aFJldmlld2VyKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwKKyAgICAgIE9ybUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24geworICAgIC8vIGFkZCBvbmUgcmV2aWV3ZXIKKyAgICBUZXN0QWNjb3VudCB1c2VyID0gYWNjb3VudHMuY3JlYXRlKCJ1c2VyIiwgInVzZXJAZXhhbXBsZS5jb20iLCAiVXNlciIpOworICAgIFB1c2hPbmVDb21taXQgcHVzaCA9IG5ldyBQdXNoT25lQ29tbWl0KCk7CisgICAgU3RyaW5nIHRvcGljID0gIm15L3RvcGljIjsKKyAgICBTdHJpbmcgcmVmID0gInJlZnMvZm9yL21hc3Rlci8iICsgdG9waWMgKyAiJXI9IiArIHVzZXIuZW1haWw7CisgICAgUHVzaFJlc3VsdCByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydE9rU3RhdHVzKHIsIHJlZik7CisgICAgYXNzZXJ0Q2hhbmdlKHB1c2guY2hhbmdlSWQsIENoYW5nZS5TdGF0dXMuTkVXLCBQdXNoT25lQ29tbWl0LlNVQkpFQ1QsCisgICAgICAgIHRvcGljLCB1c2VyKTsKKworICAgIC8vIGFkZCBzZXZlcmFsIHJldmlld2VycworICAgIFRlc3RBY2NvdW50IHVzZXIyID0KKyAgICAgICAgYWNjb3VudHMuY3JlYXRlKCJhbm90aGVyLXVzZXIiLCAiYW5vdGhlci51c2VyQGV4YW1wbGUuY29tIiwgIkFub3RoZXIgVXNlciIpOworICAgIHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIHJlZiA9ICJyZWZzL2Zvci9tYXN0ZXIvIiArIHRvcGljICsgIiVyPSIgKyBhZG1pbi5lbWFpbCArICIscj0iICsgdXNlci5lbWFpbAorICAgICAgICArICIscj0iICsgdXNlcjIuZW1haWw7CisgICAgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRPa1N0YXR1cyhyLCByZWYpOworICAgIC8vIGFkbWluIGlzIHRoZSBvd25lciBvZiB0aGUgY2hhbmdlIGFuZCBzaG91bGQgbm90IGFwcGVhciBhcyByZXZpZXdlcgorICAgIGFzc2VydENoYW5nZShwdXNoLmNoYW5nZUlkLCBDaGFuZ2UuU3RhdHVzLk5FVywgUHVzaE9uZUNvbW1pdC5TVUJKRUNULAorICAgICAgICB0b3BpYywgdXNlciwgdXNlcjIpOworCisgICAgLy8gYWRkIG5vbi1leGlzdGluZyB1c2VyIGFzIHJldmlld2VyCisgICAgU3RyaW5nIG5vbkV4aXN0aW5nRW1haWwgPSAibm9uLmV4aXN0aW5nQGV4YW1wbGUuY29tIjsKKyAgICBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICByZWYgPSAicmVmcy9mb3IvbWFzdGVyLyIgKyB0b3BpYyArICIlcj0iICsgYWRtaW4uZW1haWwgKyAiLHI9IgorICAgICAgICArIG5vbkV4aXN0aW5nRW1haWwgKyAiLHI9IiArIHVzZXIuZW1haWw7CisgICAgciA9IHB1c2gudG8ocmVmKTsKKyAgICBhc3NlcnRFcnJvclN0YXR1cyhyLCAidXNlciBcIiIgKyBub25FeGlzdGluZ0VtYWlsICsgIlwiIG5vdCBmb3VuZCIsIHJlZik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0UHVzaEZvck1hc3RlckFzRHJhZnQoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgLy8gY3JlYXRlIGRyYWZ0IGJ5IHB1c2hpbmcgdG8gJ3JlZnMvZHJhZnRzLycKKyAgICBQdXNoT25lQ29tbWl0IHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIFN0cmluZyByZWYgPSAicmVmcy9kcmFmdHMvbWFzdGVyIjsKKyAgICBQdXNoUmVzdWx0IHIgPSBwdXNoLnRvKHJlZik7CisgICAgYXNzZXJ0T2tTdGF0dXMociwgcmVmKTsKKyAgICBhc3NlcnRDaGFuZ2UocHVzaC5jaGFuZ2VJZCwgQ2hhbmdlLlN0YXR1cy5EUkFGVCwgUHVzaE9uZUNvbW1pdC5TVUJKRUNULCBudWxsKTsKKworICAgIC8vIGNyZWF0ZSBkcmFmdCBieSB1c2luZyAnZHJhZnQnIG9wdGlvbgorICAgIHB1c2ggPSBuZXcgUHVzaE9uZUNvbW1pdCgpOworICAgIHJlZiA9ICJyZWZzL2Zvci9tYXN0ZXIlZHJhZnQiOworICAgIHIgPSBwdXNoLnRvKHJlZik7CisgICAgYXNzZXJ0T2tTdGF0dXMociwgcmVmKTsKKyAgICBhc3NlcnRDaGFuZ2UocHVzaC5jaGFuZ2VJZCwgQ2hhbmdlLlN0YXR1cy5EUkFGVCwgUHVzaE9uZUNvbW1pdC5TVUJKRUNULCBudWxsKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RQdXNoRm9yTm9uRXhpc3RpbmdCcmFuY2goKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAorICAgICAgT3JtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUHVzaE9uZUNvbW1pdCBwdXNoID0gbmV3IFB1c2hPbmVDb21taXQoKTsKKyAgICBTdHJpbmcgYnJhbmNoTmFtZSA9ICJub24tZXhpc3RpbmciOworICAgIFN0cmluZyByZWYgPSAicmVmcy9mb3IvIiArIGJyYW5jaE5hbWU7CisgICAgUHVzaFJlc3VsdCByID0gcHVzaC50byhyZWYpOworICAgIGFzc2VydEVycm9yU3RhdHVzKHIsICJicmFuY2ggIiArIGJyYW5jaE5hbWUgKyAiIG5vdCBmb3VuZCIsIHJlZik7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0Q2hhbmdlKFN0cmluZyBjaGFuZ2VJZCwgQ2hhbmdlLlN0YXR1cyBleHBlY3RlZFN0YXR1cywKKyAgICAgIFN0cmluZyBleHBlY3RlZFN1YmplY3QsIFN0cmluZyBleHBlY3RlZFRvcGljLAorICAgICAgVGVzdEFjY291bnQuLi4gZXhwZWN0ZWRSZXZpZXdlcnMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIENoYW5nZSBjID0KKyAgICAgICAgSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KGRiLmNoYW5nZXMoKS5ieUtleShuZXcgQ2hhbmdlLktleShjaGFuZ2VJZCkpLnRvTGlzdCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdWJqZWN0LCBjLmdldFN1YmplY3QoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhdHVzLCBjLmdldFN0YXR1cygpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUb3BpYywgU3RyaW5ncy5lbXB0eVRvTnVsbChjLmdldFRvcGljKCkpKTsKKyAgICBhc3NlcnRSZXZpZXdlcnMoYywgZXhwZWN0ZWRSZXZpZXdlcnMpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydFJldmlld2VycyhDaGFuZ2UgYywgVGVzdEFjY291bnQuLi4gZXhwZWN0ZWRSZXZpZXdlcnMpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBTZXQ8QWNjb3VudC5JZD4gZXhwZWN0ZWRSZXZpZXdlcklkcyA9CisgICAgICAgIFNldHMubmV3SGFzaFNldChMaXN0cy50cmFuc2Zvcm0oQXJyYXlzLmFzTGlzdChleHBlY3RlZFJldmlld2VycyksCisgICAgICAgICAgICBuZXcgRnVuY3Rpb248VGVzdEFjY291bnQsIEFjY291bnQuSWQ+KCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIEFjY291bnQuSWQgYXBwbHkoVGVzdEFjY291bnQgYSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhLmlkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0KAorICAgICAgICBjLmN1cnJlbnRQYXRjaFNldElkKCkpKSB7CisgICAgICBhc3NlcnRUcnVlKCJ1bmV4cGVjdGVkIHJldmlld2VyICIgKyBwc2EuZ2V0QWNjb3VudElkKCksCisgICAgICAgICAgZXhwZWN0ZWRSZXZpZXdlcklkcy5yZW1vdmUocHNhLmdldEFjY291bnRJZCgpKSk7CisgICAgfQorICAgIGFzc2VydFRydWUoIm1pc3NpbmcgcmV2aWV3ZXJzOiAiICsgZXhwZWN0ZWRSZXZpZXdlcklkcywKKyAgICAgICAgZXhwZWN0ZWRSZXZpZXdlcklkcy5pc0VtcHR5KCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRPa1N0YXR1cyhQdXNoUmVzdWx0IHJlc3VsdCwgU3RyaW5nIHJlZikgeworICAgIGFzc2VydFN0YXR1cyhTdGF0dXMuT0ssIG51bGwsIHJlc3VsdCwgcmVmKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXJyb3JTdGF0dXMoUHVzaFJlc3VsdCByZXN1bHQsCisgICAgICBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlLCBTdHJpbmcgcmVmKSB7CisgICAgYXNzZXJ0U3RhdHVzKFN0YXR1cy5SRUpFQ1RFRF9PVEhFUl9SRUFTT04sIGV4cGVjdGVkTWVzc2FnZSwgcmVzdWx0LCByZWYpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTdGF0dXMoU3RhdHVzIGV4cGVjdGVkU3RhdHVzLAorICAgICAgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZSwgUHVzaFJlc3VsdCByZXN1bHQsIFN0cmluZyByZWYpIHsKKyAgICBSZW1vdGVSZWZVcGRhdGUgcmVmVXBkYXRlID0gcmVzdWx0LmdldFJlbW90ZVVwZGF0ZShyZWYpOworICAgIGFzc2VydEVxdWFscyhyZWZVcGRhdGUuZ2V0TWVzc2FnZSgpICsgIlxuIiArIHJlc3VsdC5nZXRNZXNzYWdlcygpLAorICAgICAgICBleHBlY3RlZFN0YXR1cywgcmVmVXBkYXRlLmdldFN0YXR1cygpKTsKKyAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZXNzYWdlLCByZWZVcGRhdGUuZ2V0TWVzc2FnZSgpKTsKKyAgfQorCisgIHByaXZhdGUgY2xhc3MgUHVzaE9uZUNvbW1pdCB7CisgICAgZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX05BTUUgPSAiYS50eHQiOworICAgIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklMRV9DT05URU5UID0gInNvbWUgY29udGVudCI7CisgICAgZmluYWwgc3RhdGljIFN0cmluZyBTVUJKRUNUID0gInRlc3QgY29tbWl0IjsKKyAgICBTdHJpbmcgY2hhbmdlSWQ7CisKKyAgICBwdWJsaWMgUHVzaFJlc3VsdCB0byhTdHJpbmcgcmVmKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICBhZGQoZ2l0LCBGSUxFX05BTUUsIEZJTEVfQ09OVEVOVCk7CisgICAgICBjaGFuZ2VJZCA9IGNyZWF0ZUNvbW1pdChnaXQsIGFkbWluLmdldElkZW50KCksIFNVQkpFQ1QpOworICAgICAgcmV0dXJuIHB1c2hIZWFkKGdpdCwgcmVmKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2FjY291bnQvQWNjb3VudEFzc2VydC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvYWNjb3VudC9BY2NvdW50QXNzZXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNjY2OQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2FjY291bnQvQWNjb3VudEFzc2VydC5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuYWNjb3VudDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKKworcHVibGljIGNsYXNzIEFjY291bnRBc3NlcnQgeworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBY2NvdW50SW5mbyhUZXN0QWNjb3VudCBhLCBBY2NvdW50SW5mbyBhaSkgeworICAgIGFzc2VydFRydWUoYS5pZC5nZXQoKSA9PSBhaS5fYWNjb3VudF9pZCk7CisgICAgYXNzZXJ0RXF1YWxzKGEuZnVsbE5hbWUsIGFpLm5hbWUpOworICAgIGFzc2VydEVxdWFscyhhLmVtYWlsLCBhaS5lbWFpbCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2FjY291bnQvQWNjb3VudEluZm8uamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2FjY291bnQvQWNjb3VudEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjg4YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvYWNjb3VudC9BY2NvdW50SW5mby5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuYWNjb3VudDsKKworcHVibGljIGNsYXNzIEFjY291bnRJbmZvIHsKKyAgcHVibGljIEludGVnZXIgX2FjY291bnRfaWQ7CisgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgcHVibGljIFN0cmluZyBlbWFpbDsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2FjY291bnQvR2V0QWNjb3VudElULmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9hY2NvdW50L0dldEFjY291bnRJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzU0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9hY2NvdW50L0dldEFjY291bnRJVC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuYWNjb3VudDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuYWNjb3VudC5BY2NvdW50QXNzZXJ0LmFzc2VydEFjY291bnRJbmZvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0U2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgR2V0QWNjb3VudElUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgcHJpdmF0ZSBUZXN0QWNjb3VudCBhZG1pbjsKKyAgcHJpdmF0ZSBSZXN0U2Vzc2lvbiBzZXNzaW9uOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9IGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiYWRtaW5AZXhhbXBsZS5jb20iLCAiQWRtaW5pc3RyYXRvciIsCisgICAgICAgICAgICAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGdldE5vbkV4aXN0aW5nQWNjb3VudF9Ob3RGb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5ELCBzZXNzaW9uLmdldCgiL2FjY291bnRzL25vbi1leGlzdGluZyIpCisgICAgICAgIC5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgZ2V0QWNjb3VudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgLy8gYnkgZm9ybWF0dGVkIHN0cmluZworICAgIHRlc3RHZXRBY2NvdW50KCIvYWNjb3VudHMvIgorICAgICAgICArIFVybC5lbmNvZGUoYWRtaW4uZnVsbE5hbWUgKyAiIDwiICsgYWRtaW4uZW1haWwgKyAiPiIpLCBhZG1pbik7CisKKyAgICAvLyBieSBlbWFpbAorICAgIHRlc3RHZXRBY2NvdW50KCIvYWNjb3VudHMvIiArIGFkbWluLmVtYWlsLCBhZG1pbik7CisKKyAgICAvLyBieSBmdWxsIG5hbWUKKyAgICB0ZXN0R2V0QWNjb3VudCgiL2FjY291bnRzLyIgKyBhZG1pbi5mdWxsTmFtZSwgYWRtaW4pOworCisgICAgLy8gYnkgYWNjb3VudCBJRAorICAgIHRlc3RHZXRBY2NvdW50KCIvYWNjb3VudHMvIiArIGFkbWluLmlkLmdldCgpLCBhZG1pbik7CisKKyAgICAvLyBieSB1c2VyIG5hbWUKKyAgICB0ZXN0R2V0QWNjb3VudCgiL2FjY291bnRzLyIgKyBhZG1pbi51c2VybmFtZSwgYWRtaW4pOworCisgICAgLy8gYnkgJ3NlbGYnCisgICAgdGVzdEdldEFjY291bnQoIi9hY2NvdW50cy9zZWxmIiwgYWRtaW4pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHRlc3RHZXRBY2NvdW50KFN0cmluZyB1cmwsIFRlc3RBY2NvdW50IGV4cGVjdGVkQWNjb3VudCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldCh1cmwpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgQWNjb3VudEluZm8gYWNjb3VudCA9CisgICAgICAgIChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLAorICAgICAgICAgICAgbmV3IFR5cGVUb2tlbjxBY2NvdW50SW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEFjY291bnRJbmZvKGV4cGVjdGVkQWNjb3VudCwgYWNjb3VudCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0FkZFJlbW92ZUdyb3VwTWVtYmVyc0lULmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9BZGRSZW1vdmVHcm91cE1lbWJlcnNJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNTRmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9BZGRSZW1vdmVHcm91cE1lbWJlcnNJVC5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5hY2NvdW50LkFjY291bnRBc3NlcnQuYXNzZXJ0QWNjb3VudEluZm87CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cC5Hcm91cEFzc2VydC5hc3NlcnRHcm91cEluZm87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlJlc3VsdFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIEFkZFJlbW92ZUdyb3VwTWVtYmVyc0lUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHJldmlld0RiUHJvdmlkZXI7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKworICBwcml2YXRlIFJlc3RTZXNzaW9uIHNlc3Npb247CisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgUmV2aWV3RGIgZGI7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFkbWluID0gYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIHNlc3Npb24gPSBuZXcgUmVzdFNlc3Npb24oYWRtaW4pOworICAgIGRiID0gcmV2aWV3RGJQcm92aWRlci5vcGVuKCk7CisgIH0KKworICBAQWZ0ZXIKKyAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgZGIuY2xvc2UoKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGFkZFRvTm9uRXhpc3RpbmdHcm91cF9Ob3RGb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5ELAorICAgICAgICBQVVQoIi9ncm91cHMvbm9uLWV4aXN0aW5nL21lbWJlcnMvYWRtaW4iKS5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgcmVtb3ZlRnJvbU5vbkV4aXN0aW5nR3JvdXBfTm90Rm91bmQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PVF9GT1VORCwKKyAgICAgICAgREVMRVRFKCIvZ3JvdXBzL25vbi1leGlzdGluZy9tZW1iZXJzL2FkbWluIikpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYWRkUmVtb3ZlTWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFjY291bnQgdSA9IGFjY291bnRzLmNyZWF0ZSgidXNlciIsICJ1c2VyQGV4YW1wbGUuY29tIiwgIkZ1bGwgTmFtZSIpOworICAgIFJlc3RSZXNwb25zZSByID0gUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL21lbWJlcnMvdXNlciIpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0NSRUFURUQsIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBBY2NvdW50SW5mbyBhaSA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLAorICAgICAgICBuZXcgVHlwZVRva2VuPEFjY291bnRJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0QWNjb3VudEluZm8odSwgYWkpOworICAgIGFzc2VydE1lbWJlcnMoIkFkbWluaXN0cmF0b3JzIiwgYWRtaW4sIHUpOworICAgIHIuY29uc3VtZSgpOworCisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfTk9fQ09OVEVOVCwKKyAgICAgICAgREVMRVRFKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL21lbWJlcnMvdXNlciIpKTsKKyAgICBhc3NlcnRNZW1iZXJzKCJBZG1pbmlzdHJhdG9ycyIsIGFkbWluKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGFkZEV4aXN0aW5nTWVtYmVyX09LKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywKKyAgICAgICAgUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL21lbWJlcnMvYWRtaW4iKS5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgYWRkTXVsdGlwbGVNZW1iZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZ3JvdXAoInVzZXJzIik7CisgICAgVGVzdEFjY291bnQgdTEgPSBhY2NvdW50cy5jcmVhdGUoInUxIiwgInUxQGV4YW1wbGUuY29tIiwgIkZ1bGwgTmFtZSAxIik7CisgICAgVGVzdEFjY291bnQgdTIgPSBhY2NvdW50cy5jcmVhdGUoInUyIiwgInUyQGV4YW1wbGUuY29tIiwgIkZ1bGwgTmFtZSAyIik7CisgICAgTWVtYmVyc0lucHV0IGlucHV0ID0gbmV3IE1lbWJlcnNJbnB1dCgpOworICAgIGlucHV0Lm1lbWJlcnMgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisgICAgaW5wdXQubWVtYmVycy5hZGQodTEudXNlcm5hbWUpOworICAgIGlucHV0Lm1lbWJlcnMuYWRkKHUyLnVzZXJuYW1lKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IFBPU1QoIi9ncm91cHMvdXNlcnMvbWVtYmVycyIsIGlucHV0KTsKKyAgICBMaXN0PEFjY291bnRJbmZvPiBhaSA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLAorICAgICAgICBuZXcgVHlwZVRva2VuPExpc3Q8QWNjb3VudEluZm8+PigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0TWVtYmVycyhhaSwgdTEsIHUyKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGluY2x1ZGVSZW1vdmVHcm91cCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJuZXdHcm91cCIpOworICAgIFJlc3RSZXNwb25zZSByID0gUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy9uZXdHcm91cCIpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0NSRUFURUQsIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBHcm91cEluZm8gaSA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPEdyb3VwSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIHIuY29uc3VtZSgpOworICAgIGFzc2VydEdyb3VwSW5mbyhncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkoIm5ld0dyb3VwIikpLCBpKTsKKyAgICBhc3NlcnRJbmNsdWRlcygiQWRtaW5pc3RyYXRvcnMiLCAibmV3R3JvdXAiKTsKKworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PX0NPTlRFTlQsCisgICAgICAgIERFTEVURSgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvbmV3R3JvdXAiKSk7CisgICAgYXNzZXJ0Tm9JbmNsdWRlcygiQWRtaW5pc3RyYXRvcnMiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGluY2x1ZGVFeGlzdGluZ0dyb3VwX09LKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZ3JvdXAoIm5ld0dyb3VwIik7CisgICAgUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy9uZXdHcm91cCIpLmNvbnN1bWUoKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywKKyAgICAgICAgUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy9uZXdHcm91cCIpLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBhZGRNdWx0aXBsZUluY2x1ZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZ3JvdXAoIm5ld0dyb3VwMSIpOworICAgIGdyb3VwKCJuZXdHcm91cDIiKTsKKyAgICBHcm91cHNJbnB1dCBpbnB1dCA9IG5ldyBHcm91cHNJbnB1dCgpOworICAgIGlucHV0Lmdyb3VwcyA9IExpc3RzLm5ld0xpbmtlZExpc3QoKTsKKyAgICBpbnB1dC5ncm91cHMuYWRkKCJuZXdHcm91cDEiKTsKKyAgICBpbnB1dC5ncm91cHMuYWRkKCJuZXdHcm91cDIiKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IFBPU1QoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvZ3JvdXBzIiwgaW5wdXQpOworICAgIExpc3Q8R3JvdXBJbmZvPiBnaSA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLAorICAgICAgICBuZXcgVHlwZVRva2VuPExpc3Q8R3JvdXBJbmZvPj4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEluY2x1ZGVzKGdpLCAibmV3R3JvdXAxIiwgIm5ld0dyb3VwMiIpOworICB9CisKKyAgcHJpdmF0ZSBSZXN0UmVzcG9uc2UgUFVUKFN0cmluZyBlbmRwb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gc2Vzc2lvbi5wdXQoZW5kcG9pbnQpOworICB9CisKKyAgcHJpdmF0ZSBpbnQgREVMRVRFKFN0cmluZyBlbmRwb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZGVsZXRlKGVuZHBvaW50KTsKKyAgICByLmNvbnN1bWUoKTsKKyAgICByZXR1cm4gci5nZXRTdGF0dXNDb2RlKCk7CisgIH0KKworICBwcml2YXRlIFJlc3RSZXNwb25zZSBQT1NUKFN0cmluZyBlbmRQb2ludCwgTWVtYmVyc0lucHV0IG1pKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBzZXNzaW9uLnBvc3QoZW5kUG9pbnQsIG1pKTsKKyAgfQorCisgIHByaXZhdGUgUmVzdFJlc3BvbnNlIFBPU1QoU3RyaW5nIGVuZFBvaW50LCBHcm91cHNJbnB1dCBnaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gc2Vzc2lvbi5wb3N0KGVuZFBvaW50LCBnaSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ3JvdXAoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR3JvdXBJbnB1dCBpbiA9IG5ldyBHcm91cElucHV0KCk7CisgICAgc2Vzc2lvbi5wdXQoIi9ncm91cHMvIiArIG5hbWUsIGluKS5jb25zdW1lKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVtYmVycyhTdHJpbmcgZ3JvdXAsIFRlc3RBY2NvdW50Li4uIG1lbWJlcnMpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgZyA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShncm91cCkpOworICAgIFNldDxBY2NvdW50LklkPiBpZHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwTWVtYmVyPiBhbGwgPQorICAgICAgICBkYi5hY2NvdW50R3JvdXBNZW1iZXJzKCkuYnlHcm91cChnLmdldElkKCkpOworICAgIGZvciAoQWNjb3VudEdyb3VwTWVtYmVyIG0gOiBhbGwpIHsKKyAgICAgIGlkcy5hZGQobS5nZXRBY2NvdW50SWQoKSk7CisgICAgfQorICAgIGFzc2VydFRydWUoaWRzLnNpemUoKSA9PSBtZW1iZXJzLmxlbmd0aCk7CisgICAgZm9yIChUZXN0QWNjb3VudCBhIDogbWVtYmVycykgeworICAgICAgYXNzZXJ0VHJ1ZShpZHMuY29udGFpbnMoYS5pZCkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRNZW1iZXJzKExpc3Q8QWNjb3VudEluZm8+IGFpLCBUZXN0QWNjb3VudC4uLiBtZW1iZXJzKSB7CisgICAgTWFwPEludGVnZXIsIEFjY291bnRJbmZvPiBpbmZvQnlJZCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoQWNjb3VudEluZm8gaSA6IGFpKSB7CisgICAgICBpbmZvQnlJZC5wdXQoaS5fYWNjb3VudF9pZCwgaSk7CisgICAgfQorCisgICAgZm9yIChUZXN0QWNjb3VudCBhIDogbWVtYmVycykgeworICAgICAgQWNjb3VudEluZm8gaSA9IGluZm9CeUlkLmdldChhLmlkLmdldCgpKTsKKyAgICAgIGFzc2VydE5vdE51bGwoaSk7CisgICAgICBhc3NlcnRBY2NvdW50SW5mbyhhLCBpKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKGFpLnNpemUoKSwgbWVtYmVycy5sZW5ndGgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEluY2x1ZGVzKFN0cmluZyBncm91cCwgU3RyaW5nLi4uIGluY2x1ZGVzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIGcgPSBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkoZ3JvdXApKTsKKyAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGlkcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIFJlc3VsdFNldDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBhbGwgPQorICAgICAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpLmJ5R3JvdXAoZy5nZXRJZCgpKTsKKyAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgbSA6IGFsbCkgeworICAgICAgaWRzLmFkZChtLmdldEluY2x1ZGVVVUlEKCkpOworICAgIH0KKyAgICBhc3NlcnRUcnVlKGlkcy5zaXplKCkgPT0gaW5jbHVkZXMubGVuZ3RoKTsKKyAgICBmb3IgKFN0cmluZyBpIDogaW5jbHVkZXMpIHsKKyAgICAgIEFjY291bnRHcm91cC5VVUlEIGlkID0gZ3JvdXBDYWNoZS5nZXQoCisgICAgICAgICAgbmV3IEFjY291bnRHcm91cC5OYW1lS2V5KGkpKS5nZXRHcm91cFVVSUQoKTsKKyAgICAgIGFzc2VydFRydWUoaWRzLmNvbnRhaW5zKGlkKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEluY2x1ZGVzKExpc3Q8R3JvdXBJbmZvPiBnaSwgU3RyaW5nLi4uIGluY2x1ZGVzKSB7CisgICAgTWFwPFN0cmluZywgR3JvdXBJbmZvPiBncm91cHNCeU5hbWUgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKEdyb3VwSW5mbyBpIDogZ2kpIHsKKyAgICAgIGdyb3Vwc0J5TmFtZS5wdXQoaS5uYW1lLCBpKTsKKyAgICB9CisKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogaW5jbHVkZXMpIHsKKyAgICAgIEdyb3VwSW5mbyBpID0gZ3JvdXBzQnlOYW1lLmdldChuYW1lKTsKKyAgICAgIGFzc2VydE5vdE51bGwoaSk7CisgICAgICBhc3NlcnRHcm91cEluZm8oZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KG5hbWUpKSwgaSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhnaS5zaXplKCksIGluY2x1ZGVzLmxlbmd0aCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm9JbmNsdWRlcyhTdHJpbmcgZ3JvdXApIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBnID0gZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KGdyb3VwKSk7CisgICAgSXRlcmF0b3I8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gaXQgPQorICAgICAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpLmJ5R3JvdXAoZy5nZXRJZCgpKS5pdGVyYXRvcigpOworICAgIGFzc2VydEZhbHNlKGl0Lmhhc05leHQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0NyZWF0ZUdyb3VwSVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0NyZWF0ZUdyb3VwSVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjQxZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvQ3JlYXRlR3JvdXBJVC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cC5Hcm91cEFzc2VydC5hc3NlcnRHcm91cEluZm87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0U2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ3JlYXRlR3JvdXBJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisKKyAgcHJpdmF0ZSBUZXN0QWNjb3VudCBhZG1pbjsKKyAgcHJpdmF0ZSBSZXN0U2Vzc2lvbiBzZXNzaW9uOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9IGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiYWRtaW5AZXhhbXBsZS5jb20iLCAiQWRtaW5pc3RyYXRvciIsCisgICAgICAgICAgICAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVHcm91cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIG5ld0dyb3VwTmFtZSA9ICJuZXdHcm91cCI7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL2dyb3Vwcy8iICsgbmV3R3JvdXBOYW1lKTsKKyAgICBHcm91cEluZm8gZyA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPEdyb3VwSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhuZXdHcm91cE5hbWUsIGcubmFtZSk7CisgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KG5ld0dyb3VwTmFtZSkpOworICAgIGFzc2VydE5vdE51bGwoZ3JvdXApOworICAgIGFzc2VydEdyb3VwSW5mbyhncm91cCwgZyk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlR3JvdXBXaXRoUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIG5ld0dyb3VwTmFtZSA9ICJuZXdHcm91cCI7CisgICAgR3JvdXBJbnB1dCBpbiA9IG5ldyBHcm91cElucHV0KCk7CisgICAgaW4uZGVzY3JpcHRpb24gPSAiVGVzdCBkZXNjcmlwdGlvbiI7CisgICAgaW4udmlzaWJsZV90b19hbGwgPSB0cnVlOworICAgIGluLm93bmVyX2lkID0gZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJBZG1pbmlzdHJhdG9ycyIpKS5nZXRHcm91cFVVSUQoKS5nZXQoKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucHV0KCIvZ3JvdXBzLyIgKyBuZXdHcm91cE5hbWUsIGluKTsKKyAgICBHcm91cEluZm8gZyA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPEdyb3VwSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhuZXdHcm91cE5hbWUsIGcubmFtZSk7CisgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KG5ld0dyb3VwTmFtZSkpOworICAgIGFzc2VydEVxdWFscyhpbi5kZXNjcmlwdGlvbiwgZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnZpc2libGVfdG9fYWxsLCBncm91cC5pc1Zpc2libGVUb0FsbCgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4ub3duZXJfaWQsIGdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkuZ2V0KCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUdyb3VwV2l0aG91dENhcGFiaWxpdHlfRm9yYmlkZGVuKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBUZXN0QWNjb3VudCB1c2VyID0gYWNjb3VudHMuY3JlYXRlKCJ1c2VyIiwgInVzZXJAZXhhbXBsZS5jb20iLCAiVXNlciIpOworICAgIFJlc3RSZXNwb25zZSByID0gKG5ldyBSZXN0U2Vzc2lvbih1c2VyKSkucHV0KCIvZ3JvdXBzL25ld0dyb3VwIik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfRk9SQklEREVOLCByLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlR3JvdXBXaGVuR3JvdXBBbHJlYWR5RXhpc3RzX0NvbmZsaWN0KCkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucHV0KCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzIik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfQ09ORkxJQ1QsIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR2V0R3JvdXBJVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR2V0R3JvdXBJVC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTM4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9HZXRHcm91cElULmphdmEKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBBc3NlcnQuYXNzZXJ0R3JvdXBJbmZvOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BYnN0cmFjdERhZW1vblRlc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BY2NvdW50Q3JlYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuVGVzdEFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEdldEdyb3VwSVQgZXh0ZW5kcyBBYnN0cmFjdERhZW1vblRlc3QgeworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50Q3JlYXRvciBhY2NvdW50czsKKworICBASW5qZWN0CisgIHByaXZhdGUgR3JvdXBDYWNoZSBncm91cENhY2hlOworCisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgUmVzdFNlc3Npb24gc2Vzc2lvbjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPSBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQGV4YW1wbGUuY29tIiwgIkFkbWluaXN0cmF0b3IiLAorICAgICAgICAgICAgIkFkbWluaXN0cmF0b3JzIik7CisgICAgc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R2V0R3JvdXAoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJBZG1pbmlzdHJhdG9ycyIpKTsKKworICAgIC8vIGJ5IFVVSUQKKyAgICB0ZXN0R2V0R3JvdXAoIi9ncm91cHMvIiArIGFkbWluR3JvdXAuZ2V0R3JvdXBVVUlEKCkuZ2V0KCksIGFkbWluR3JvdXApOworCisgICAgLy8gYnkgbmFtZQorICAgIHRlc3RHZXRHcm91cCgiL2dyb3Vwcy8iICsgYWRtaW5Hcm91cC5nZXROYW1lKCksIGFkbWluR3JvdXApOworCisgICAgLy8gYnkgbGVnYWN5IG51bWVyaWMgSUQKKyAgICB0ZXN0R2V0R3JvdXAoIi9ncm91cHMvIiArIGFkbWluR3JvdXAuZ2V0SWQoKS5nZXQoKSwgYWRtaW5Hcm91cCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdGVzdEdldEdyb3VwKFN0cmluZyB1cmwsIEFjY291bnRHcm91cCBleHBlY3RlZEdyb3VwKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQodXJsKTsKKyAgICBHcm91cEluZm8gZ3JvdXAgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxHcm91cEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRHcm91cEluZm8oZXhwZWN0ZWRHcm91cCwgZ3JvdXApOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cEFzc2VydC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBBc3NlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTJkOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBBc3NlcnQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgR3JvdXBBc3NlcnQgeworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRHcm91cHMoSXRlcmFibGU8U3RyaW5nPiBleHBlY3RlZCwgU2V0PFN0cmluZz4gYWN0dWFsKSB7CisgICAgZm9yIChTdHJpbmcgZyA6IGV4cGVjdGVkKSB7CisgICAgICBhc3NlcnRUcnVlKCJtaXNzaW5nIGdyb3VwICIgKyBnLCBhY3R1YWwucmVtb3ZlKGcpKTsKKyAgICB9CisgICAgYXNzZXJ0VHJ1ZSgidW5leHBlY3RlZCBncm91cHM6ICIgKyBhY3R1YWwsIGFjdHVhbC5pc0VtcHR5KCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEdyb3VwSW5mbyhBY2NvdW50R3JvdXAgZ3JvdXAsIEdyb3VwSW5mbyBpbmZvKSB7CisgICAgaWYgKGluZm8ubmFtZSAhPSBudWxsKSB7CisgICAgICAvLyAnbmFtZScgaXMgbm90IHNldCBpZiByZXR1cm5lZCBpbiBhIG1hcAorICAgICAgYXNzZXJ0RXF1YWxzKGdyb3VwLmdldE5hbWUoKSwgaW5mby5uYW1lKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKGdyb3VwLmdldEdyb3VwVVVJRCgpLmdldCgpLCBVcmwuZGVjb2RlKGluZm8uaWQpKTsKKyAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKGdyb3VwLmdldElkKCkuZ2V0KCkpLCBpbmZvLmdyb3VwX2lkKTsKKyAgICBhc3NlcnRFcXVhbHMoIiMvYWRtaW4vZ3JvdXBzL3V1aWQtIiArIFVybC5lbmNvZGUoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkuZ2V0KCkpLCBpbmZvLnVybCk7CisgICAgYXNzZXJ0RXF1YWxzKGdyb3VwLmlzVmlzaWJsZVRvQWxsKCksIHRvQm9vbGVhbihpbmZvLm9wdGlvbnMudmlzaWJsZV90b19hbGwpKTsKKyAgICBhc3NlcnRFcXVhbHMoZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKSwgaW5mby5kZXNjcmlwdGlvbik7CisgICAgYXNzZXJ0RXF1YWxzKGdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkuZ2V0KCksIFVybC5kZWNvZGUoaW5mby5vd25lcl9pZCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIHRvQm9vbGVhbihCb29sZWFuIGIpIHsKKyAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBiLmJvb2xlYW5WYWx1ZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cEluZm8uamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OGY5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cEluZm8uamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitwdWJsaWMgY2xhc3MgR3JvdXBJbmZvIHsKKyAgcHVibGljIFN0cmluZyBpZDsKKyAgcHVibGljIFN0cmluZyBuYW1lOworICBwdWJsaWMgU3RyaW5nIHVybDsKKyAgcHVibGljIEdyb3VwT3B0aW9uc0luZm8gb3B0aW9uczsKKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgcHVibGljIEludGVnZXIgZ3JvdXBfaWQ7CisgIHB1YmxpYyBTdHJpbmcgb3duZXJfaWQ7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cElucHV0LmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cElucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4NjQ4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cElucHV0LmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworcHVibGljIGNsYXNzIEdyb3VwSW5wdXQgeworICBTdHJpbmcgZGVzY3JpcHRpb247CisgIEJvb2xlYW4gdmlzaWJsZV90b19hbGw7CisgIFN0cmluZyBvd25lcl9pZDsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwT3B0aW9uc0luZm8uamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0dyb3VwT3B0aW9uc0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDU3ZmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBPcHRpb25zSW5mby5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXA7CisKK3B1YmxpYyBjbGFzcyBHcm91cE9wdGlvbnNJbmZvIHsKKyAgcHVibGljIEJvb2xlYW4gdmlzaWJsZV90b19hbGw7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cFByb3BlcnRpZXNJVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBQcm9wZXJ0aWVzSVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjIyMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBQcm9wZXJ0aWVzSVQuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBBc3NlcnQudG9Cb29sZWFuOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXAuR3JvdXBBc3NlcnQuYXNzZXJ0R3JvdXBJbmZvOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0U2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBHcm91cFByb3BlcnRpZXNJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisKKyAgcHJpdmF0ZSBUZXN0QWNjb3VudCBhZG1pbjsKKyAgcHJpdmF0ZSBSZXN0U2Vzc2lvbiBzZXNzaW9uOworCisgIEBCZWZvcmUKKyAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBhZG1pbiA9IGFjY291bnRzLmNyZWF0ZSgiYWRtaW4iLCAiYWRtaW5AZXhhbXBsZS5jb20iLCAiQWRtaW5pc3RyYXRvciIsCisgICAgICAgICAgICAiQWRtaW5pc3RyYXRvcnMiKTsKKyAgICBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHcm91cE5hbWUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cC5OYW1lS2V5IGFkbWluR3JvdXBOYW1lID0gbmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJBZG1pbmlzdHJhdG9ycyIpOworICAgIFN0cmluZyB1cmwgPSAiL2dyb3Vwcy8iICsgZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpLmdldEdyb3VwVVVJRCgpLmdldCgpICsgIi9uYW1lIjsKKworICAgIC8vIGdldCBuYW1lCisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldCh1cmwpOworICAgIFN0cmluZyBuYW1lID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48U3RyaW5nPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoIkFkbWluaXN0cmF0b3JzIiwgbmFtZSk7CisgICAgci5jb25zdW1lKCk7CisKKyAgICAvLyBzZXQgbmFtZSB3aXRoIG5hbWUgY29uZmxpY3QKKyAgICBHcm91cE5hbWVJbnB1dCBpbiA9IG5ldyBHcm91cE5hbWVJbnB1dCgpOworICAgIGluLm5hbWUgPSAiUmVnaXN0ZXJlZCBVc2VycyI7CisgICAgciA9IHNlc3Npb24ucHV0KHVybCwgaW4pOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0NPTkZMSUNULCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgci5jb25zdW1lKCk7CisKKyAgICAvLyBzZXQgbmFtZSB0byBzYW1lIG5hbWUKKyAgICBpbiA9IG5ldyBHcm91cE5hbWVJbnB1dCgpOworICAgIGluLm5hbWUgPSAiQWRtaW5pc3RyYXRvcnMiOworICAgIHIgPSBzZXNzaW9uLnB1dCh1cmwsIGluKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIHIuY29uc3VtZSgpOworCisgICAgLy8gcmVuYW1lCisgICAgaW4gPSBuZXcgR3JvdXBOYW1lSW5wdXQoKTsKKyAgICBpbi5uYW1lID0gIkFkbWlucyI7CisgICAgciA9IHNlc3Npb24ucHV0KHVybCwgaW4pOworICAgIFN0cmluZyBuZXdOYW1lID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48U3RyaW5nPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhc3NlcnROb3ROdWxsKGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShpbi5uYW1lKSkpOworICAgIGFzc2VydE51bGwoZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4ubmFtZSwgbmV3TmFtZSk7CisgICAgci5jb25zdW1lKCk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBEZXNjcmlwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwLk5hbWVLZXkgYWRtaW5Hcm91cE5hbWUgPSBuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkoIkFkbWluaXN0cmF0b3JzIik7CisgICAgQWNjb3VudEdyb3VwIGFkbWluR3JvdXAgPSBncm91cENhY2hlLmdldChhZG1pbkdyb3VwTmFtZSk7CisgICAgU3RyaW5nIHVybCA9ICIvZ3JvdXBzLyIgKyBhZG1pbkdyb3VwLmdldEdyb3VwVVVJRCgpLmdldCgpICsgIi9kZXNjcmlwdGlvbiI7CisKKyAgICAvLyBnZXQgZGVzY3JpcHRpb24KKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZ2V0KHVybCk7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48U3RyaW5nPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYWRtaW5Hcm91cC5nZXREZXNjcmlwdGlvbigpLCBkZXNjcmlwdGlvbik7CisgICAgci5jb25zdW1lKCk7CisKKyAgICAvLyBzZXQgZGVzY3JpcHRpb24KKyAgICBHcm91cERlc2NyaXB0aW9uSW5wdXQgaW4gPSBuZXcgR3JvdXBEZXNjcmlwdGlvbklucHV0KCk7CisgICAgaW4uZGVzY3JpcHRpb24gPSAiQWxsIHVzZXJzIHRoYXQgY2FuIGFkbWluaXN0cmF0ZSB0aGUgR2Vycml0IFNlcnZlci4iOworICAgIHIgPSBzZXNzaW9uLnB1dCh1cmwsIGluKTsKKyAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxTdHJpbmc+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIGFzc2VydEVxdWFscyhpbi5kZXNjcmlwdGlvbiwgbmV3RGVzY3JpcHRpb24pOworICAgIGFkbWluR3JvdXAgPSBncm91cENhY2hlLmdldChhZG1pbkdyb3VwTmFtZSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLmRlc2NyaXB0aW9uLCBhZG1pbkdyb3VwLmdldERlc2NyaXB0aW9uKCkpOworICAgIHIuY29uc3VtZSgpOworCisgICAgLy8gZGVsZXRlIGRlc2NyaXB0aW9uCisgICAgciA9IHNlc3Npb24uZGVsZXRlKHVybCk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfTk9fQ09OVEVOVCwgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIGFkbWluR3JvdXAgPSBncm91cENhY2hlLmdldChhZG1pbkdyb3VwTmFtZSk7CisgICAgYXNzZXJ0TnVsbChhZG1pbkdyb3VwLmdldERlc2NyaXB0aW9uKCkpOworCisgICAgLy8gc2V0IGRlc2NyaXB0aW9uIHRvIGVtcHR5IHN0cmluZworICAgIGluID0gbmV3IEdyb3VwRGVzY3JpcHRpb25JbnB1dCgpOworICAgIGluLmRlc2NyaXB0aW9uID0gIiI7CisgICAgciA9IHNlc3Npb24ucHV0KHVybCwgaW4pOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX05PX0NPTlRFTlQsIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIGFzc2VydE51bGwoYWRtaW5Hcm91cC5nZXREZXNjcmlwdGlvbigpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHcm91cE9wdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cC5OYW1lS2V5IGFkbWluR3JvdXBOYW1lID0gbmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJBZG1pbmlzdHJhdG9ycyIpOworICAgIEFjY291bnRHcm91cCBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIFN0cmluZyB1cmwgPSAiL2dyb3Vwcy8iICsgYWRtaW5Hcm91cC5nZXRHcm91cFVVSUQoKS5nZXQoKSArICIvb3B0aW9ucyI7CisKKyAgICAvLyBnZXQgb3B0aW9ucworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQodXJsKTsKKyAgICBHcm91cE9wdGlvbnNJbmZvIG9wdGlvbnMgPSAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwgbmV3IFR5cGVUb2tlbjxHcm91cE9wdGlvbnNJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoYWRtaW5Hcm91cC5pc1Zpc2libGVUb0FsbCgpLCB0b0Jvb2xlYW4ob3B0aW9ucy52aXNpYmxlX3RvX2FsbCkpOworICAgIHIuY29uc3VtZSgpOworCisgICAgLy8gc2V0IG9wdGlvbnMKKyAgICBHcm91cE9wdGlvbnNJbnB1dCBpbiA9IG5ldyBHcm91cE9wdGlvbnNJbnB1dCgpOworICAgIGluLnZpc2libGVfdG9fYWxsID0gIWFkbWluR3JvdXAuaXNWaXNpYmxlVG9BbGwoKTsKKyAgICByID0gc2Vzc2lvbi5wdXQodXJsLCBpbik7CisgICAgR3JvdXBPcHRpb25zSW5mbyBuZXdPcHRpb25zID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48R3JvdXBPcHRpb25zSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnZpc2libGVfdG9fYWxsLCB0b0Jvb2xlYW4obmV3T3B0aW9ucy52aXNpYmxlX3RvX2FsbCkpOworICAgIGFkbWluR3JvdXAgPSBncm91cENhY2hlLmdldChhZG1pbkdyb3VwTmFtZSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnZpc2libGVfdG9fYWxsLCBhZG1pbkdyb3VwLmlzVmlzaWJsZVRvQWxsKCkpOworICAgIHIuY29uc3VtZSgpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEdyb3VwT3duZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cC5OYW1lS2V5IGFkbWluR3JvdXBOYW1lID0gbmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJBZG1pbmlzdHJhdG9ycyIpOworICAgIEFjY291bnRHcm91cCBhZG1pbkdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cE5hbWUpOworICAgIFN0cmluZyB1cmwgPSAiL2dyb3Vwcy8iICsgYWRtaW5Hcm91cC5nZXRHcm91cFVVSUQoKS5nZXQoKSArICIvb3duZXIiOworCisgICAgLy8gZ2V0IG93bmVyCisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldCh1cmwpOworICAgIEdyb3VwSW5mbyBvcHRpb25zID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48R3JvdXBJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhc3NlcnRHcm91cEluZm8oZ3JvdXBDYWNoZS5nZXQoYWRtaW5Hcm91cC5nZXRPd25lckdyb3VwVVVJRCgpKSwgb3B0aW9ucyk7CisgICAgci5jb25zdW1lKCk7CisKKyAgICAvLyBzZXQgb3duZXIgYnkgbmFtZQorICAgIEdyb3VwT3duZXJJbnB1dCBpbiA9IG5ldyBHcm91cE93bmVySW5wdXQoKTsKKyAgICBpbi5vd25lciA9ICJSZWdpc3RlcmVkIFVzZXJzIjsKKyAgICByID0gc2Vzc2lvbi5wdXQodXJsLCBpbik7CisgICAgR3JvdXBJbmZvIG5ld093bmVyID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48R3JvdXBJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4ub3duZXIsIG5ld093bmVyLm5hbWUpOworICAgIGFkbWluR3JvdXAgPSBncm91cENhY2hlLmdldChhZG1pbkdyb3VwTmFtZSk7CisgICAgYXNzZXJ0R3JvdXBJbmZvKGdyb3VwQ2FjaGUuZ2V0KGFkbWluR3JvdXAuZ2V0T3duZXJHcm91cFVVSUQoKSksIG5ld093bmVyKTsKKyAgICByLmNvbnN1bWUoKTsKKworICAgIC8vIHNldCBvd25lciBieSBVVUlECisgICAgaW4gPSBuZXcgR3JvdXBPd25lcklucHV0KCk7CisgICAgaW4ub3duZXIgPSBhZG1pbkdyb3VwLmdldEdyb3VwVVVJRCgpLmdldCgpOworICAgIHIgPSBzZXNzaW9uLnB1dCh1cmwsIGluKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIGFkbWluR3JvdXAgPSBncm91cENhY2hlLmdldChhZG1pbkdyb3VwTmFtZSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLm93bmVyLCBncm91cENhY2hlLmdldChhZG1pbkdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkpLmdldEdyb3VwVVVJRCgpLmdldCgpKTsKKyAgICByLmNvbnN1bWUoKTsKKworICAgIC8vIHNldCBub24gZXhpc3Rpbmcgb3duZXIKKyAgICBpbiA9IG5ldyBHcm91cE93bmVySW5wdXQoKTsKKyAgICBpbi5vd25lciA9ICJOb24tRXhpc3RpbmcgR3JvdXAiOworICAgIHIgPSBzZXNzaW9uLnB1dCh1cmwsIGluKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19VTlBST0NFU1NBQkxFX0VOVElUWSwgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIHIuY29uc3VtZSgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JvdXBOYW1lSW5wdXQgeworICAgIFN0cmluZyBuYW1lOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR3JvdXBEZXNjcmlwdGlvbklucHV0IHsKKyAgICBTdHJpbmcgZGVzY3JpcHRpb247CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcm91cE9wdGlvbnNJbnB1dCB7CisgICAgQm9vbGVhbiB2aXNpYmxlX3RvX2FsbDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyb3VwT3duZXJJbnB1dCB7CisgICAgU3RyaW5nIG93bmVyOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9Hcm91cHNJbnB1dC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBzSW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWNlZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvR3JvdXBzSW5wdXQuamF2YQpAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBHcm91cHNJbnB1dCB7CisgIExpc3Q8U3RyaW5nPiBncm91cHM7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9MaXN0R3JvdXBJbmNsdWRlc0lULmphdmEgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9ncm91cC9MaXN0R3JvdXBJbmNsdWRlc0lULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3ZjQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0xpc3RHcm91cEluY2x1ZGVzSVQuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitwdWJsaWMgY2xhc3MgTGlzdEdyb3VwSW5jbHVkZXNJVCBleHRlbmRzIEFic3RyYWN0RGFlbW9uVGVzdCB7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFjY291bnRDcmVhdG9yIGFjY291bnRzOworCisgIHByaXZhdGUgUmVzdFNlc3Npb24gc2Vzc2lvbjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgVGVzdEFjY291bnQgYWRtaW4gPSBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgIkFkbWluaXN0cmF0b3JzIik7CisgICAgc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCBsaXN0Tm9uRXhpc3RpbmdHcm91cEluY2x1ZGVzX05vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5ELAorICAgICAgc2Vzc2lvbi5nZXQoIi9ncm91cHMvbm9uLWV4aXN0aW5nL2dyb3Vwcy8iKS5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbGlzdEVtcHR5R3JvdXBJbmNsdWRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGFzc2VydFRydWUoR0VUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy8iKS5pc0VtcHR5KCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbGlzdE5vbkVtcHR5R3JvdXBJbmNsdWRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGdyb3VwKCJneCIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIGdyb3VwKCJneSIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvZ3giKTsKKyAgICBQVVQoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvZ3JvdXBzL2d5Iik7CisKKyAgICBhc3NlcnRJbmNsdWRlcyhHRVQoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvZ3JvdXBzLyIpLCAiZ3giLCAiZ3kiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3RPbmVJbmNsdWRlTWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZ3JvdXAoImd4IiwgIkFkbWluaXN0cmF0b3JzIik7CisgICAgZ3JvdXAoImd5IiwgIkFkbWluaXN0cmF0b3JzIik7CisgICAgUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy9neCIpOworICAgIFBVVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9ncm91cHMvZ3kiKTsKKworICAgIGFzc2VydEVxdWFscyhHRVRfT05FKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy9neCIpLm5hbWUsICJneCIpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PEdyb3VwSW5mbz4gR0VUKFN0cmluZyBlbmRwb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZ2V0KGVuZHBvaW50KTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19PSywgci5nZXRTdGF0dXNDb2RlKCkpOworICAgIHJldHVybiAobmV3IEdzb24oKSkuZnJvbUpzb24oci5nZXRSZWFkZXIoKSwKKyAgICAgICAgbmV3IFR5cGVUb2tlbjxMaXN0PEdyb3VwSW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgfQorCisgIHByaXZhdGUgR3JvdXBJbmZvIEdFVF9PTkUoU3RyaW5nIGVuZHBvaW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5nZXQoZW5kcG9pbnQpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX09LLCByLmdldFN0YXR1c0NvZGUoKSk7CisgICAgcmV0dXJuIChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLAorICAgICAgICBuZXcgVHlwZVRva2VuPEdyb3VwSW5mbz4oKSB7fS5nZXRUeXBlKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFBVVChTdHJpbmcgZW5kcG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc2Vzc2lvbi5wdXQoZW5kcG9pbnQpLmNvbnN1bWUoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBncm91cChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyR3JvdXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgR3JvdXBJbnB1dCBpbiA9IG5ldyBHcm91cElucHV0KCk7CisgICAgaW4ub3duZXJfaWQgPSBvd25lckdyb3VwOworICAgIHNlc3Npb24ucHV0KCIvZ3JvdXBzLyIgKyBuYW1lLCBpbikuY29uc3VtZSgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEluY2x1ZGVzKExpc3Q8R3JvdXBJbmZvPiBpbmNsdWRlcywgU3RyaW5nIG5hbWUsCisgICAgICBTdHJpbmcuLi4gbmFtZXMpIHsKKyAgICBDb2xsZWN0aW9uPFN0cmluZz4gaW5jbHVkZU5hbWVzID0gQ29sbGVjdGlvbnMyLnRyYW5zZm9ybShpbmNsdWRlcywKKyAgICAgICAgbmV3IEZ1bmN0aW9uPEdyb3VwSW5mbywgU3RyaW5nPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KEBOdWxsYWJsZSBHcm91cEluZm8gaW5mbykgeworICAgICAgICAgICAgcmV0dXJuIGluZm8ubmFtZTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGFzc2VydFRydWUoaW5jbHVkZU5hbWVzLmNvbnRhaW5zKG5hbWUpKTsKKyAgICBmb3IgKFN0cmluZyBuIDogbmFtZXMpIHsKKyAgICAgIGFzc2VydFRydWUoaW5jbHVkZU5hbWVzLmNvbnRhaW5zKG4pKTsKKyAgICB9CisgICAgYXNzZXJ0RXF1YWxzKGluY2x1ZGVzLnNpemUoKSwgbmFtZXMubGVuZ3RoICsgMSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0xpc3RHcm91cE1lbWJlcnNJVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvTGlzdEdyb3VwTWVtYmVyc0lULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhYTNkZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0xpc3RHcm91cE1lbWJlcnNJVC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQ29sbGVjdGlvbnMyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0U2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKK3B1YmxpYyBjbGFzcyBMaXN0R3JvdXBNZW1iZXJzSVQgZXh0ZW5kcyBBYnN0cmFjdERhZW1vblRlc3QgeworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50Q3JlYXRvciBhY2NvdW50czsKKworICBwcml2YXRlIFJlc3RTZXNzaW9uIHNlc3Npb247CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIFRlc3RBY2NvdW50IGFkbWluID0gYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIHNlc3Npb24gPSBuZXcgUmVzdFNlc3Npb24oYWRtaW4pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbGlzdE5vbkV4aXN0aW5nR3JvdXBNZW1iZXJzX05vdEZvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5ELAorICAgICAgICBzZXNzaW9uLmdldCgiL2dyb3Vwcy9ub24tZXhpc3RpbmcvbWVtYmVycy8iKS5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbGlzdEVtcHR5R3JvdXBNZW1iZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZ3JvdXAoImVtcHR5IiwgIkFkbWluaXN0cmF0b3JzIik7CisgICAgYXNzZXJ0VHJ1ZShHRVQoIi9ncm91cHMvZW1wdHkvbWVtYmVycy8iKS5pc0VtcHR5KCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbGlzdE5vbkVtcHR5R3JvdXBNZW1iZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0TWVtYmVycyhHRVQoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvbWVtYmVycy8iKSwgImFkbWluIik7CisKKyAgICBhY2NvdW50cy5jcmVhdGUoImFkbWluMiIsICJBZG1pbmlzdHJhdG9ycyIpOworICAgIGFzc2VydE1lbWJlcnMoR0VUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL21lbWJlcnMvIiksICJhZG1pbiIsICJhZG1pbjIiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIGxpc3RPbmVHcm91cE1lbWJlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEdFVF9PTkUoIi9ncm91cHMvQWRtaW5pc3RyYXRvcnMvbWVtYmVycy9hZG1pbiIpLm5hbWUsCisgICAgICAgICJhZG1pbiIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgbGlzdEdyb3VwTWVtYmVyc1JlY3Vyc2l2ZWx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgZ3JvdXAoImd4IiwgIkFkbWluaXN0cmF0b3JzIik7CisgICAgYWNjb3VudHMuY3JlYXRlKCJ1eCIsICJneCIpOworCisgICAgZ3JvdXAoImd5IiwgIkFkbWluaXN0cmF0b3JzIik7CisgICAgYWNjb3VudHMuY3JlYXRlKCJ1eSIsICJneSIpOworCisgICAgUFVUKCIvZ3JvdXBzL0FkbWluaXN0cmF0b3JzL2dyb3Vwcy9neCIpOworICAgIFBVVCgiL2dyb3Vwcy9neC9ncm91cHMvZ3kiKTsKKyAgICBhc3NlcnRNZW1iZXJzKEdFVCgiL2dyb3Vwcy9BZG1pbmlzdHJhdG9ycy9tZW1iZXJzLz9yZWN1cnNpdmUiKSwKKyAgICAgICAgImFkbWluIiwgInV4IiwgInV5Iik7CisgIH0KKworICBwcml2YXRlIExpc3Q8QWNjb3VudEluZm8+IEdFVChTdHJpbmcgZW5kcG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldChlbmRwb2ludCk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICByZXR1cm4gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksCisgICAgICAgIG5ldyBUeXBlVG9rZW48TGlzdDxBY2NvdW50SW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgfQorCisgIHByaXZhdGUgQWNjb3VudEluZm8gR0VUX09ORShTdHJpbmcgZW5kcG9pbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldChlbmRwb2ludCk7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICByZXR1cm4gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksCisgICAgICAgIG5ldyBUeXBlVG9rZW48QWNjb3VudEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBQVVQoU3RyaW5nIGVuZHBvaW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNlc3Npb24ucHV0KGVuZHBvaW50KS5jb25zdW1lKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ3JvdXAoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckdyb3VwKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBHcm91cElucHV0IGluID0gbmV3IEdyb3VwSW5wdXQoKTsKKyAgICBpbi5vd25lcl9pZCA9IG93bmVyR3JvdXA7CisgICAgc2Vzc2lvbi5wdXQoIi9ncm91cHMvIiArIG5hbWUsIGluKS5jb25zdW1lKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVtYmVycyhMaXN0PEFjY291bnRJbmZvPiBtZW1iZXJzLCBTdHJpbmcgbmFtZSwKKyAgICAgIFN0cmluZy4uLiBuYW1lcykgeworICAgIENvbGxlY3Rpb248U3RyaW5nPiBtZW1iZXJOYW1lcyA9IENvbGxlY3Rpb25zMi50cmFuc2Zvcm0obWVtYmVycywKKyAgICAgICAgbmV3IEZ1bmN0aW9uPEFjY291bnRJbmZvLCBTdHJpbmc+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoQE51bGxhYmxlIEFjY291bnRJbmZvIGluZm8pIHsKKyAgICAgICAgICAgIHJldHVybiBpbmZvLm5hbWU7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgIGFzc2VydFRydWUobWVtYmVyTmFtZXMuY29udGFpbnMobmFtZSkpOworICAgIGZvciAoU3RyaW5nIG4gOiBuYW1lcykgeworICAgICAgYXNzZXJ0VHJ1ZShtZW1iZXJOYW1lcy5jb250YWlucyhuKSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhtZW1iZXJzLnNpemUoKSwgbmFtZXMubGVuZ3RoICsgMSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0xpc3RHcm91cHNJVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvTGlzdEdyb3Vwc0lULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjN2M5MwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL0xpc3RHcm91cHNJVC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0Lmdyb3VwOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cC5Hcm91cEFzc2VydC5hc3NlcnRHcm91cEluZm87CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UucmVzdC5ncm91cC5Hcm91cEFzc2VydC5hc3NlcnRHcm91cHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFic3RyYWN0RGFlbW9uVGVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkFjY291bnRDcmVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuUmVzdFNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5UZXN0QWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitwdWJsaWMgY2xhc3MgTGlzdEdyb3Vwc0lUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKworICBwcml2YXRlIFRlc3RBY2NvdW50IGFkbWluOworICBwcml2YXRlIFJlc3RTZXNzaW9uIHNlc3Npb247CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFkbWluID0gYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJhZG1pbkBleGFtcGxlLmNvbSIsICJBZG1pbmlzdHJhdG9yIiwKKyAgICAgICAgICAgICJBZG1pbmlzdHJhdG9ycyIpOworICAgIHNlc3Npb24gPSBuZXcgUmVzdFNlc3Npb24oYWRtaW4pOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdExpc3RBbGxHcm91cHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgSXRlcmFibGU8U3RyaW5nPiBleHBlY3RlZEdyb3VwcyA9IEl0ZXJhYmxlcy50cmFuc2Zvcm0oZ3JvdXBDYWNoZS5hbGwoKSwKKyAgICAgICAgbmV3IEZ1bmN0aW9uPEFjY291bnRHcm91cCwgU3RyaW5nPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBATnVsbGFibGUKKyAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KEBOdWxsYWJsZSBBY2NvdW50R3JvdXAgZ3JvdXApIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cC5nZXROYW1lKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24uZ2V0KCIvZ3JvdXBzLyIpOworICAgIE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4gcmVzdWx0ID0KKyAgICAgICAgKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgR3JvdXBJbmZvPj4oKSB7fS5nZXRUeXBlKCkpOworICAgIGFzc2VydEdyb3VwcyhleHBlY3RlZEdyb3VwcywgcmVzdWx0LmtleVNldCgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RPbmx5VmlzaWJsZUdyb3Vwc1JldHVybmVkKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEpTY2hFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZEdyb3VwcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGV4cGVjdGVkR3JvdXBzLmFkZCgiQW5vbnltb3VzIFVzZXJzIik7CisgICAgZXhwZWN0ZWRHcm91cHMuYWRkKCJSZWdpc3RlcmVkIFVzZXJzIik7CisgICAgVGVzdEFjY291bnQgdXNlciA9IGFjY291bnRzLmNyZWF0ZSgidXNlciIsICJ1c2VyQGV4YW1wbGUuY29tIiwgIlVzZXIiKTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IChuZXcgUmVzdFNlc3Npb24odXNlcikpLmdldCgiL2dyb3Vwcy8iKTsKKyAgICBNYXA8U3RyaW5nLCBHcm91cEluZm8+IHJlc3VsdCA9CisgICAgICAgIChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRHcm91cHMoZXhwZWN0ZWRHcm91cHMsIHJlc3VsdC5rZXlTZXQoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0QWxsR3JvdXBJbmZvRmllbGRzU2V0Q29ycmVjdGx5KCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgYWRtaW5Hcm91cCA9IGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleSgiQWRtaW5pc3RyYXRvcnMiKSk7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLmdldCgiL2dyb3Vwcy8/cT0iICsgYWRtaW5Hcm91cC5nZXROYW1lKCkpOworICAgIE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4gcmVzdWx0ID0KKyAgICAgICAgKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgR3JvdXBJbmZvPj4oKSB7fS5nZXRUeXBlKCkpOworICAgIEdyb3VwSW5mbyBhZG1pbkdyb3VwSW5mbyA9IHJlc3VsdC5nZXQoYWRtaW5Hcm91cC5nZXROYW1lKCkpOworICAgIGFzc2VydEdyb3VwSW5mbyhhZG1pbkdyb3VwLCBhZG1pbkdyb3VwSW5mbyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL01lbWJlcnNJbnB1dC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvZ3JvdXAvTWVtYmVyc0lucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NzlmNAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L2dyb3VwL01lbWJlcnNJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QuZ3JvdXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIE1lbWJlcnNJbnB1dCB7CisgIExpc3Q8U3RyaW5nPiBtZW1iZXJzOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvcHJvamVjdC9DcmVhdGVQcm9qZWN0SVQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvQ3JlYXRlUHJvamVjdElULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmZThlNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvQ3JlYXRlUHJvamVjdElULmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QucHJvamVjdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QucHJvamVjdC5Qcm9qZWN0QXNzZXJ0LmFzc2VydFByb2plY3RJbmZvOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QucHJvamVjdC5Qcm9qZWN0QXNzZXJ0LmFzc2VydFByb2plY3RPd25lcnM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0UmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5SZXN0U2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0U3RhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkdzb247CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQ3JlYXRlUHJvamVjdElUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKworICBASW5qZWN0CisgIHByaXZhdGUgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0OworCisgIHByaXZhdGUgVGVzdEFjY291bnQgYWRtaW47CisgIHByaXZhdGUgUmVzdFNlc3Npb24gc2Vzc2lvbjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPSBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQGV4YW1wbGUuY29tIiwgIkFkbWluaXN0cmF0b3IiLAorICAgICAgICAgICAgIkFkbWluaXN0cmF0b3JzIik7CisgICAgc2Vzc2lvbiA9IG5ldyBSZXN0U2Vzc2lvbihhZG1pbik7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gIm5ld1Byb2plY3QiOworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5wdXQoIi9wcm9qZWN0cy8iICsgbmV3UHJvamVjdE5hbWUpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0NSRUFURUQsIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICBQcm9qZWN0SW5mbyBwID0gKG5ldyBHc29uKCkpLmZyb21Kc29uKHIuZ2V0UmVhZGVyKCksIG5ldyBUeXBlVG9rZW48UHJvamVjdEluZm8+KCkge30uZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMobmV3UHJvamVjdE5hbWUsIHAubmFtZSk7CisgICAgUHJvamVjdFN0YXRlIHByb2plY3RTdGF0ZSA9IHByb2plY3RDYWNoZS5nZXQobmV3IFByb2plY3QuTmFtZUtleShuZXdQcm9qZWN0TmFtZSkpOworICAgIGFzc2VydE5vdE51bGwocHJvamVjdFN0YXRlKTsKKyAgICBhc3NlcnRQcm9qZWN0SW5mbyhwcm9qZWN0U3RhdGUuZ2V0UHJvamVjdCgpLCBwKTsKKyAgICBhc3NlcnRIZWFkKG5ld1Byb2plY3ROYW1lLCAicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9qZWN0V2l0aE5hbWVNaXNtYXRjaF9CYWRSZXF1ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBQcm9qZWN0SW5wdXQgaW4gPSBuZXcgUHJvamVjdElucHV0KCk7CisgICAgaW4ubmFtZSA9ICJvdGhlck5hbWUiOworICAgIFJlc3RSZXNwb25zZSByID0gc2Vzc2lvbi5wdXQoIi9wcm9qZWN0cy9zb21lTmFtZSIsIGluKTsKKyAgICBhc3NlcnRFcXVhbHMoSHR0cFN0YXR1cy5TQ19CQURfUkVRVUVTVCwgci5nZXRTdGF0dXNDb2RlKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb2plY3RXaXRoUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIG5ld1Byb2plY3ROYW1lID0gIm5ld1Byb2plY3QiOworICAgIFByb2plY3RJbnB1dCBpbiA9IG5ldyBQcm9qZWN0SW5wdXQoKTsKKyAgICBpbi5kZXNjcmlwdGlvbiA9ICJUZXN0IGRlc2NyaXB0aW9uIjsKKyAgICBpbi5zdWJtaXRfdHlwZSA9IFN1Ym1pdFR5cGUuQ0hFUlJZX1BJQ0s7CisgICAgaW4udXNlX2NvbnRyaWJ1dG9yX2FncmVlbWVudHMgPSBJbmhlcml0YWJsZUJvb2xlYW4uVFJVRTsKKyAgICBpbi51c2Vfc2lnbmVkX29mZl9ieSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICAgIGluLnVzZV9jb250ZW50X21lcmdlID0gSW5oZXJpdGFibGVCb29sZWFuLlRSVUU7CisgICAgaW4ucmVxdWlyZV9jaGFuZ2VfaWQgPSBJbmhlcml0YWJsZUJvb2xlYW4uVFJVRTsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucHV0KCIvcHJvamVjdHMvIiArIG5ld1Byb2plY3ROYW1lLCBpbik7CisgICAgUHJvamVjdEluZm8gcCA9IChuZXcgR3NvbigpKS5mcm9tSnNvbihyLmdldFJlYWRlcigpLCBuZXcgVHlwZVRva2VuPFByb2plY3RJbmZvPigpIHt9LmdldFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG5ld1Byb2plY3ROYW1lLCBwLm5hbWUpOworICAgIFByb2plY3QgcHJvamVjdCA9IHByb2plY3RDYWNoZS5nZXQobmV3IFByb2plY3QuTmFtZUtleShuZXdQcm9qZWN0TmFtZSkpLmdldFByb2plY3QoKTsKKyAgICBhc3NlcnRQcm9qZWN0SW5mbyhwcm9qZWN0LCBwKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4uZGVzY3JpcHRpb24sIHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnN1Ym1pdF90eXBlLCBwcm9qZWN0LmdldFN1Ym1pdFR5cGUoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnVzZV9jb250cmlidXRvcl9hZ3JlZW1lbnRzLCBwcm9qZWN0LmdldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4udXNlX3NpZ25lZF9vZmZfYnksIHByb2plY3QuZ2V0VXNlU2lnbmVkT2ZmQnkoKSk7CisgICAgYXNzZXJ0RXF1YWxzKGluLnVzZV9jb250ZW50X21lcmdlLCBwcm9qZWN0LmdldFVzZUNvbnRlbnRNZXJnZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMoaW4ucmVxdWlyZV9jaGFuZ2VfaWQsIHByb2plY3QuZ2V0UmVxdWlyZUNoYW5nZUlEKCkpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUNoaWxkUHJvamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgU3RyaW5nIHBhcmVudE5hbWUgPSAicGFyZW50IjsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucHV0KCIvcHJvamVjdHMvIiArIHBhcmVudE5hbWUpOworICAgIHIuY29uc3VtZSgpOworICAgIGZpbmFsIFN0cmluZyBjaGlsZE5hbWUgPSAiY2hpbGQiOworICAgIFByb2plY3RJbnB1dCBpbiA9IG5ldyBQcm9qZWN0SW5wdXQoKTsKKyAgICBpbi5wYXJlbnQgPSBwYXJlbnROYW1lOworICAgIHIgPSBzZXNzaW9uLnB1dCgiL3Byb2plY3RzLyIgKyBjaGlsZE5hbWUsIGluKTsKKyAgICBQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0Q2FjaGUuZ2V0KG5ldyBQcm9qZWN0Lk5hbWVLZXkoY2hpbGROYW1lKSkuZ2V0UHJvamVjdCgpOworICAgIGFzc2VydEVxdWFscyhpbi5wYXJlbnQsIHByb2plY3QuZ2V0UGFyZW50TmFtZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVDaGlsZFByb2plY3RVbmRlck5vbkV4aXN0aW5nUGFyZW50X1VucHJvY2Vzc2FibGVFbnRpdHkoKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBQcm9qZWN0SW5wdXQgaW4gPSBuZXcgUHJvamVjdElucHV0KCk7CisgICAgaW4ucGFyZW50ID0gIm5vbi1leGlzdGluZy1wcm9qZWN0IjsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucHV0KCIvcHJvamVjdHMvY2hpbGQiLCBpbik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfVU5QUk9DRVNTQUJMRV9FTlRJVFksIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9qZWN0V2l0aE93bmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTdHJpbmcgbmV3UHJvamVjdE5hbWUgPSAibmV3UHJvamVjdCI7CisgICAgUHJvamVjdElucHV0IGluID0gbmV3IFByb2plY3RJbnB1dCgpOworICAgIGluLm93bmVycyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSgzKTsKKyAgICBpbi5vd25lcnMuYWRkKCJBZG1pbmlzdHJhdG9ycyIpOyAvLyBieSBuYW1lCisgICAgaW4ub3duZXJzLmFkZChncm91cFV1aWQoIlJlZ2lzdGVyZWQgVXNlcnMiKS5nZXQoKSk7IC8vIGJ5IGdyb3VwIFVVSUQKKyAgICBpbi5vd25lcnMuYWRkKEludGVnZXIudG9TdHJpbmcoZ3JvdXBDYWNoZS5nZXQobmV3IEFjY291bnRHcm91cC5OYW1lS2V5KCJBbm9ueW1vdXMgVXNlcnMiKSkKKyAgICAgICAgLmdldElkKCkuZ2V0KCkpKTsgLy8gYnkgbGVnYWN5IGdyb3VwIElECisgICAgc2Vzc2lvbi5wdXQoIi9wcm9qZWN0cy8iICsgbmV3UHJvamVjdE5hbWUsIGluKTsKKyAgICBQcm9qZWN0U3RhdGUgcHJvamVjdFN0YXRlID0gcHJvamVjdENhY2hlLmdldChuZXcgUHJvamVjdC5OYW1lS2V5KG5ld1Byb2plY3ROYW1lKSk7CisgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBleHBlY3RlZE93bmVySWRzID0gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZSgzKTsKKyAgICBleHBlY3RlZE93bmVySWRzLmFkZChncm91cFV1aWQoIkFkbWluaXN0cmF0b3JzIikpOworICAgIGV4cGVjdGVkT3duZXJJZHMuYWRkKGdyb3VwVXVpZCgiUmVnaXN0ZXJlZCBVc2VycyIpKTsKKyAgICBleHBlY3RlZE93bmVySWRzLmFkZChncm91cFV1aWQoIkFub255bW91cyBVc2VycyIpKTsKKyAgICBhc3NlcnRQcm9qZWN0T3duZXJzKGV4cGVjdGVkT3duZXJJZHMsIHByb2plY3RTdGF0ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvamVjdFdpdGhOb25FeGlzdGluZ093bmVyX1VucHJvY2Vzc2FibGVFbnRpdHkoKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBQcm9qZWN0SW5wdXQgaW4gPSBuZXcgUHJvamVjdElucHV0KCk7CisgICAgaW4ub3duZXJzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgibm9uLWV4aXN0aW5nLWdyb3VwIik7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL3Byb2plY3RzL25ld1Byb2plY3QiLCBpbik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfVU5QUk9DRVNTQUJMRV9FTlRJVFksIHIuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQZXJtaXNzaW9uT25seVByb2plY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBuZXdQcm9qZWN0TmFtZSA9ICJuZXdQcm9qZWN0IjsKKyAgICBQcm9qZWN0SW5wdXQgaW4gPSBuZXcgUHJvamVjdElucHV0KCk7CisgICAgaW4ucGVybWlzc2lvbnNfb25seSA9IHRydWU7CisgICAgc2Vzc2lvbi5wdXQoIi9wcm9qZWN0cy8iICsgbmV3UHJvamVjdE5hbWUsIGluKTsKKyAgICBhc3NlcnRIZWFkKG5ld1Byb2plY3ROYW1lLCBHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQcm9qZWN0V2l0aEVtcHR5Q29tbWl0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBTdHJpbmcgbmV3UHJvamVjdE5hbWUgPSAibmV3UHJvamVjdCI7CisgICAgUHJvamVjdElucHV0IGluID0gbmV3IFByb2plY3RJbnB1dCgpOworICAgIGluLmNyZWF0ZV9lbXB0eV9jb21taXQgPSB0cnVlOworICAgIHNlc3Npb24ucHV0KCIvcHJvamVjdHMvIiArIG5ld1Byb2plY3ROYW1lLCBpbik7CisgICAgYXNzZXJ0RW1wdHlDb21taXQobmV3UHJvamVjdE5hbWUsICJyZWZzL2hlYWRzL21hc3RlciIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb2plY3RXaXRoQnJhbmNoZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGZpbmFsIFN0cmluZyBuZXdQcm9qZWN0TmFtZSA9ICJuZXdQcm9qZWN0IjsKKyAgICBQcm9qZWN0SW5wdXQgaW4gPSBuZXcgUHJvamVjdElucHV0KCk7CisgICAgaW4uY3JlYXRlX2VtcHR5X2NvbW1pdCA9IHRydWU7CisgICAgaW4uYnJhbmNoZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoMyk7CisgICAgaW4uYnJhbmNoZXMuYWRkKCJyZWZzL2hlYWRzL3Rlc3QiKTsKKyAgICBpbi5icmFuY2hlcy5hZGQoInJlZnMvaGVhZHMvbWFzdGVyIik7CisgICAgaW4uYnJhbmNoZXMuYWRkKCJyZWxlYXNlIik7IC8vIHdpdGhvdXQgJ3JlZnMvaGVhZHMnIHByZWZpeAorICAgIHNlc3Npb24ucHV0KCIvcHJvamVjdHMvIiArIG5ld1Byb2plY3ROYW1lLCBpbik7CisgICAgYXNzZXJ0SGVhZChuZXdQcm9qZWN0TmFtZSwgInJlZnMvaGVhZHMvdGVzdCIpOworICAgIGFzc2VydEVtcHR5Q29tbWl0KG5ld1Byb2plY3ROYW1lLCAicmVmcy9oZWFkcy90ZXN0IiwgInJlZnMvaGVhZHMvbWFzdGVyIiwKKyAgICAgICAgInJlZnMvaGVhZHMvcmVsZWFzZSIpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb2plY3RXaXRob3V0Q2FwYWJpbGl0eV9Gb3JiaWRkZW4oKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAorICAgICAgSlNjaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFRlc3RBY2NvdW50IHVzZXIgPSBhY2NvdW50cy5jcmVhdGUoInVzZXIiLCAidXNlckBleGFtcGxlLmNvbSIsICJVc2VyIik7CisgICAgUmVzdFJlc3BvbnNlIHIgPSAobmV3IFJlc3RTZXNzaW9uKHVzZXIpKS5wdXQoIi9wcm9qZWN0cy9uZXdQcm9qZWN0Iik7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfRk9SQklEREVOLCByLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KKworICBAVGVzdAorICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvamVjdFdoZW5Qcm9qZWN0QWxyZWFkeUV4aXN0c19Db25mbGljdCgpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgUmVzdFJlc3BvbnNlIHIgPSBzZXNzaW9uLnB1dCgiL3Byb2plY3RzL0FsbC1Qcm9qZWN0cyIpOworICAgIGFzc2VydEVxdWFscyhIdHRwU3RhdHVzLlNDX0NPTkZMSUNULCByLmdldFN0YXR1c0NvZGUoKSk7CisgIH0KKworICBwcml2YXRlIEFjY291bnRHcm91cC5VVUlEIGdyb3VwVXVpZChTdHJpbmcgZ3JvdXBOYW1lKSB7CisgICAgcmV0dXJuIGdyb3VwQ2FjaGUuZ2V0KG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShncm91cE5hbWUpKS5nZXRHcm91cFVVSUQoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhc3NlcnRIZWFkKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGV4cGVjdGVkUmVmKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJlcG9zaXRvcnkgcmVwbyA9IGdpdC5vcGVuUmVwb3NpdG9yeShuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3ROYW1lKSk7CisgICAgdHJ5IHsKKyAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlZiwgcmVwby5nZXRSZWYoQ29uc3RhbnRzLkhFQUQpLmdldFRhcmdldCgpCisgICAgICAgICAgLmdldE5hbWUoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0RW1wdHlDb21taXQoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcuLi4gcmVmcykKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBnaXQub3BlblJlcG9zaXRvcnkobmV3IFByb2plY3QuTmFtZUtleShwcm9qZWN0TmFtZSkpOworICAgIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZXBvKTsKKyAgICBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKTsKKyAgICB0cnkgeworICAgICAgZm9yIChTdHJpbmcgcmVmIDogcmVmcykgeworICAgICAgICBSZXZDb21taXQgY29tbWl0ID0gcncubG9va3VwQ29tbWl0KHJlcG8uZ2V0UmVmKHJlZikuZ2V0T2JqZWN0SWQoKSk7CisgICAgICAgIHJ3LnBhcnNlQm9keShjb21taXQpOworICAgICAgICB0dy5hZGRUcmVlKGNvbW1pdC5nZXRUcmVlKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgicmVmICIgKyByZWYgKyAiIGhhcyBub24gZW1wdHkgY29tbWl0IiwgdHcubmV4dCgpKTsKKyAgICAgICAgdHcucmVzZXQoKTsKKyAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgdHcucmVsZWFzZSgpOworICAgICAgcncucmVsZWFzZSgpOworICAgICAgcmVwby5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9qZWN0SW5wdXQgeworICAgIFN0cmluZyBuYW1lOworICAgIFN0cmluZyBwYXJlbnQ7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgIGJvb2xlYW4gcGVybWlzc2lvbnNfb25seTsKKyAgICBib29sZWFuIGNyZWF0ZV9lbXB0eV9jb21taXQ7CisgICAgU3VibWl0VHlwZSBzdWJtaXRfdHlwZTsKKyAgICBMaXN0PFN0cmluZz4gYnJhbmNoZXM7CisgICAgTGlzdDxTdHJpbmc+IG93bmVyczsKKyAgICBJbmhlcml0YWJsZUJvb2xlYW4gdXNlX2NvbnRyaWJ1dG9yX2FncmVlbWVudHM7CisgICAgSW5oZXJpdGFibGVCb29sZWFuIHVzZV9zaWduZWRfb2ZmX2J5OworICAgIEluaGVyaXRhYmxlQm9vbGVhbiB1c2VfY29udGVudF9tZXJnZTsKKyAgICBJbmhlcml0YWJsZUJvb2xlYW4gcmVxdWlyZV9jaGFuZ2VfaWQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvR2FyYmFnZUNvbGxlY3Rpb25JVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvcHJvamVjdC9HYXJiYWdlQ29sbGVjdGlvbklULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1YzUyYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvR2FyYmFnZUNvbGxlY3Rpb25JVC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LnByb2plY3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQuR2l0VXRpbC5jcmVhdGVQcm9qZWN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWJzdHJhY3REYWVtb25UZXN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuQWNjb3VudENyZWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5HY0Fzc2VydDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RSZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlJlc3RTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuU3NoU2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQWxsUHJvamVjdHNOYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2FyYmFnZUNvbGxlY3Rpb25RdWV1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5KU2NoRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBHYXJiYWdlQ29sbGVjdGlvbklUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0czsKKworICBASW5qZWN0CisgIHByaXZhdGUgR2FyYmFnZUNvbGxlY3Rpb25RdWV1ZSBnY1F1ZXVlOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBHY0Fzc2VydCBnY0Fzc2VydDsKKworICBwcml2YXRlIFRlc3RBY2NvdW50IGFkbWluOworICBwcml2YXRlIFJlc3RTZXNzaW9uIHNlc3Npb247CisgIHByaXZhdGUgUHJvamVjdC5OYW1lS2V5IHByb2plY3QxOworICBwcml2YXRlIFByb2plY3QuTmFtZUtleSBwcm9qZWN0MjsKKworICBAQmVmb3JlCisgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgYWRtaW4gPQorICAgICAgICBhY2NvdW50cy5jcmVhdGUoImFkbWluIiwgImFkbWluQGV4YW1wbGUuY29tIiwgIkFkbWluaXN0cmF0b3IiLAorICAgICAgICAgICAgIkFkbWluaXN0cmF0b3JzIik7CisKKyAgICBTc2hTZXNzaW9uIHNzaFNlc3Npb24gPSBuZXcgU3NoU2Vzc2lvbihhZG1pbik7CisKKyAgICBwcm9qZWN0MSA9IG5ldyBQcm9qZWN0Lk5hbWVLZXkoInAxIik7CisgICAgY3JlYXRlUHJvamVjdChzc2hTZXNzaW9uLCBwcm9qZWN0MS5nZXQoKSk7CisKKyAgICBwcm9qZWN0MiA9IG5ldyBQcm9qZWN0Lk5hbWVLZXkoInAyIik7CisgICAgY3JlYXRlUHJvamVjdChzc2hTZXNzaW9uLCBwcm9qZWN0Mi5nZXQoKSk7CisKKyAgICBzZXNzaW9uID0gbmV3IFJlc3RTZXNzaW9uKGFkbWluKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHY05vbkV4aXN0aW5nUHJvamVjdF9Ob3RGb3VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfTk9UX0ZPVU5ELCBQT1NUKCIvcHJvamVjdHMvbm9uLWV4aXN0aW5nL2djIikpOworICB9CisKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdEdjTm90QWxsb3dlZF9Gb3JiaWRkZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiB7CisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfRk9SQklEREVOLAorICAgICAgICBuZXcgUmVzdFNlc3Npb24oYWNjb3VudHMuY3JlYXRlKCJ1c2VyIiwgInVzZXJAZXhhbXBsZS5jb20iLCAiVXNlciIpKQorICAgICAgICAgICAgLnBvc3QoIi9wcm9qZWN0cy8iICsgYWxsUHJvamVjdHMuZ2V0KCkgKyAiL2djIikuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHY09uZVByb2plY3QoKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgYXNzZXJ0RXF1YWxzKEh0dHBTdGF0dXMuU0NfT0ssIFBPU1QoIi9wcm9qZWN0cy8iICsgYWxsUHJvamVjdHMuZ2V0KCkgKyAiL2djIikpOworICAgIGdjQXNzZXJ0LmFzc2VydEhhc1BhY2tGaWxlKGFsbFByb2plY3RzKTsKKyAgICBnY0Fzc2VydC5hc3NlcnRIYXNOb1BhY2tGaWxlKHByb2plY3QxLCBwcm9qZWN0Mik7CisgIH0KKworICBwcml2YXRlIGludCBQT1NUKFN0cmluZyBlbmRQb2ludCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBSZXN0UmVzcG9uc2UgciA9IHNlc3Npb24ucG9zdChlbmRQb2ludCk7CisgICAgci5jb25zdW1lKCk7CisgICAgcmV0dXJuIHIuZ2V0U3RhdHVzQ29kZSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L1Byb2plY3RBc3NlcnQuamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvUHJvamVjdEFzc2VydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1Y2NiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtYWNjZXB0YW5jZS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2FjY2VwdGFuY2UvcmVzdC9wcm9qZWN0L1Byb2plY3RBc3NlcnQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5yZXN0LnByb2plY3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFByb2plY3RBc3NlcnQgeworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQcm9qZWN0SW5mbyhQcm9qZWN0IHByb2plY3QsIFByb2plY3RJbmZvIGluZm8pIHsKKyAgICBpZiAoaW5mby5uYW1lICE9IG51bGwpIHsKKyAgICAgIC8vICduYW1lJyBpcyBub3Qgc2V0IGlmIHJldHVybmVkIGluIGEgbWFwCisgICAgICBhc3NlcnRFcXVhbHMocHJvamVjdC5nZXROYW1lKCksIGluZm8ubmFtZSk7CisgICAgfQorICAgIGFzc2VydEVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSwgVXJsLmRlY29kZShpbmZvLmlkKSk7CisgICAgUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUgPSBwcm9qZWN0LmdldFBhcmVudChuZXcgUHJvamVjdC5OYW1lS2V5KCJBbGwtUHJvamVjdHMiKSk7CisgICAgYXNzZXJ0RXF1YWxzKHBhcmVudE5hbWUgIT0gbnVsbCA/IHBhcmVudE5hbWUuZ2V0KCkgOiBudWxsLCBpbmZvLnBhcmVudCk7CisgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSwgU3RyaW5ncy5udWxsVG9FbXB0eShpbmZvLmRlc2NyaXB0aW9uKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UHJvamVjdE93bmVycyhTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGV4cGVjdGVkT3duZXJzLAorICAgICAgUHJvamVjdFN0YXRlIHN0YXRlKSB7CisgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBnIDogc3RhdGUuZ2V0T3duZXJzKCkpIHsKKyAgICAgIGFzc2VydFRydWUoInVuZXhwZWN0ZWQgb3duZXIgZ3JvdXAgIiArIGcsIGV4cGVjdGVkT3duZXJzLnJlbW92ZShnKSk7CisgICAgfQorICAgIGFzc2VydFRydWUoIm1pc3Npbmcgb3duZXIgZ3JvdXBzOiAiICsgZXhwZWN0ZWRPd25lcnMsCisgICAgICAgIGV4cGVjdGVkT3duZXJzLmlzRW1wdHkoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvUHJvamVjdEluZm8uamF2YSBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9yZXN0L3Byb2plY3QvUHJvamVjdEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmRkMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3Jlc3QvcHJvamVjdC9Qcm9qZWN0SW5mby5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLnJlc3QucHJvamVjdDsKKworcHVibGljIGNsYXNzIFByb2plY3RJbmZvIHsKKyAgcHVibGljIFN0cmluZyBpZDsKKyAgcHVibGljIFN0cmluZyBuYW1lOworICBwdWJsaWMgU3RyaW5nIHBhcmVudDsKKyAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9zc2gvR2FyYmFnZUNvbGxlY3Rpb25JVC5qYXZhIGIvZ2Vycml0LWFjY2VwdGFuY2UtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hY2NlcHRhbmNlL3NzaC9HYXJiYWdlQ29sbGVjdGlvbklULmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxZTdkMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1hY2NlcHRhbmNlLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYWNjZXB0YW5jZS9zc2gvR2FyYmFnZUNvbGxlY3Rpb25JVC5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5zc2g7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5naXQuR2l0VXRpbC5jcmVhdGVQcm9qZWN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BYnN0cmFjdERhZW1vblRlc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYWNjZXB0YW5jZS5BY2NvdW50Q3JlYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLkdjQXNzZXJ0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmFjY2VwdGFuY2UuU3NoU2Vzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hY2NlcHRhbmNlLlRlc3RBY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQWxsUHJvamVjdHNOYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2FyYmFnZUNvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HYXJiYWdlQ29sbGVjdGlvblF1ZXVlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK3B1YmxpYyBjbGFzcyBHYXJiYWdlQ29sbGVjdGlvbklUIGV4dGVuZHMgQWJzdHJhY3REYWVtb25UZXN0IHsKKworICBASW5qZWN0CisgIHByaXZhdGUgQWNjb3VudENyZWF0b3IgYWNjb3VudHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0czsKKworICBASW5qZWN0CisgIHByaXZhdGUgR2FyYmFnZUNvbGxlY3Rpb24uRmFjdG9yeSBnYXJiYWdlQ29sbGVjdGlvbkZhY3Rvcnk7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdhcmJhZ2VDb2xsZWN0aW9uUXVldWUgZ2NRdWV1ZTsKKworICBASW5qZWN0CisgIHByaXZhdGUgR2NBc3NlcnQgZ2NBc3NlcnQ7CisKKyAgcHJpdmF0ZSBUZXN0QWNjb3VudCBhZG1pbjsKKyAgcHJpdmF0ZSBTc2hTZXNzaW9uIHNzaFNlc3Npb247CisgIHByaXZhdGUgUHJvamVjdC5OYW1lS2V5IHByb2plY3QxOworICBwcml2YXRlIFByb2plY3QuTmFtZUtleSBwcm9qZWN0MjsKKyAgcHJpdmF0ZSBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdDM7CisKKyAgQEJlZm9yZQorICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIGFkbWluID0KKyAgICAgICAgYWNjb3VudHMuY3JlYXRlKCJhZG1pbiIsICJhZG1pbkBleGFtcGxlLmNvbSIsICJBZG1pbmlzdHJhdG9yIiwKKyAgICAgICAgICAgICJBZG1pbmlzdHJhdG9ycyIpOworCisgICAgc3NoU2Vzc2lvbiA9IG5ldyBTc2hTZXNzaW9uKGFkbWluKTsKKworICAgIHByb2plY3QxID0gbmV3IFByb2plY3QuTmFtZUtleSgicDEiKTsKKyAgICBjcmVhdGVQcm9qZWN0KHNzaFNlc3Npb24sIHByb2plY3QxLmdldCgpKTsKKworICAgIHByb2plY3QyID0gbmV3IFByb2plY3QuTmFtZUtleSgicDIiKTsKKyAgICBjcmVhdGVQcm9qZWN0KHNzaFNlc3Npb24sIHByb2plY3QyLmdldCgpKTsKKworICAgIHByb2plY3QzID0gbmV3IFByb2plY3QuTmFtZUtleSgicDMiKTsKKyAgICBjcmVhdGVQcm9qZWN0KHNzaFNlc3Npb24sIHByb2plY3QzLmdldCgpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHYygpIHRocm93cyBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHJlc3BvbnNlID0KKyAgICAgICAgc3NoU2Vzc2lvbi5leGVjKCJnZXJyaXQgZ2MgXCIiICsgcHJvamVjdDEuZ2V0KCkgKyAiXCIgXCIiCisgICAgICAgICAgICArIHByb2plY3QyLmdldCgpICsgIlwiIik7CisgICAgYXNzZXJ0RmFsc2Uoc3NoU2Vzc2lvbi5oYXNFcnJvcigpKTsKKyAgICBhc3NlcnROb0Vycm9yKHJlc3BvbnNlKTsKKyAgICBnY0Fzc2VydC5hc3NlcnRIYXNQYWNrRmlsZShwcm9qZWN0MSwgcHJvamVjdDIpOworICAgIGdjQXNzZXJ0LmFzc2VydEhhc05vUGFja0ZpbGUoYWxsUHJvamVjdHMsIHByb2plY3QzKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHY0FsbCgpIHRocm93cyBKU2NoRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHJlc3BvbnNlID0gc3NoU2Vzc2lvbi5leGVjKCJnZXJyaXQgZ2MgLS1hbGwiKTsKKyAgICBhc3NlcnRGYWxzZShzc2hTZXNzaW9uLmhhc0Vycm9yKCkpOworICAgIGFzc2VydE5vRXJyb3IocmVzcG9uc2UpOworICAgIGdjQXNzZXJ0LmFzc2VydEhhc1BhY2tGaWxlKGFsbFByb2plY3RzLCBwcm9qZWN0MSwgcHJvamVjdDIsIHByb2plY3QzKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHY1dpdGhvdXRDYXBhYmlsaXR5X0Vycm9yKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBKU2NoRXhjZXB0aW9uIHsKKyAgICBTc2hTZXNzaW9uIHMgPSBuZXcgU3NoU2Vzc2lvbihhY2NvdW50cy5jcmVhdGUoInVzZXIiLCAidXNlckBleGFtcGxlLmNvbSIsICJVc2VyIikpOworICAgIHMuZXhlYygiZ2Vycml0IGdjIC0tYWxsIik7CisgICAgYXNzZXJ0RXJyb3IoImZhdGFsOiB1c2VyIGRvZXMgbm90IGhhdmUgXCJydW5HQ1wiIGNhcGFiaWxpdHkuIiwgcy5nZXRFcnJvcigpKTsKKyAgfQorCisgIEBUZXN0CisgIHB1YmxpYyB2b2lkIHRlc3RHY0FscmVhZHlTY2hlZHVsZWQoKSB7CisgICAgZ2NRdWV1ZS5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9qZWN0MSkpOworICAgIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0IHJlc3VsdCA9IGdhcmJhZ2VDb2xsZWN0aW9uRmFjdG9yeS5jcmVhdGUoKS5ydW4oCisgICAgICAgIEFycmF5cy5hc0xpc3QoYWxsUHJvamVjdHMsIHByb2plY3QxLCBwcm9qZWN0MiwgcHJvamVjdDMpKTsKKyAgICBhc3NlcnRUcnVlKHJlc3VsdC5oYXNFcnJvcnMoKSk7CisgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRFcnJvcnMoKS5zaXplKCkpOworICAgIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yIGVycm9yID0gcmVzdWx0LmdldEVycm9ycygpLmdldCgwKTsKKyAgICBhc3NlcnRFcXVhbHMoR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IuVHlwZS5HQ19BTFJFQURZX1NDSEVEVUxFRCwgZXJyb3IuZ2V0VHlwZSgpKTsKKyAgICBhc3NlcnRFcXVhbHMocHJvamVjdDEsIGVycm9yLmdldFByb2plY3ROYW1lKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFzc2VydEVycm9yKFN0cmluZyBleHBlY3RlZEVycm9yLCBTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLCByZXNwb25zZS5jb250YWlucyhleHBlY3RlZEVycm9yKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm9FcnJvcihTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICBhc3NlcnRGYWxzZShyZXNwb25zZSwgcmVzcG9uc2UudG9Mb3dlckNhc2UoTG9jYWxlLlVTKS5jb250YWlucygiZXJyb3IiKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1hbnRsci9wb20ueG1sIGIvZ2Vycml0LWFudGxyL3BvbS54bWwKaW5kZXggMzRjYjQ2Zi4uZDg4ZWQ0MiAxMDA2NDQKLS0tIGEvZ2Vycml0LWFudGxyL3BvbS54bWwKKysrIGIvZ2Vycml0LWFudGxyL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1hbnRscjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1hbnRsci9zcmMvbWFpbi9hbnRscjMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L1F1ZXJ5LmcgYi9nZXJyaXQtYW50bHIvc3JjL21haW4vYW50bHIzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9RdWVyeS5nCmluZGV4IDc0Yjc4NTEuLjQyM2FjYjQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1hbnRsci9zcmMvbWFpbi9hbnRscjMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L1F1ZXJ5LmcKKysrIGIvZ2Vycml0LWFudGxyL3NyYy9tYWluL2FudGxyMy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvUXVlcnkuZwpAQCAtMTU1LDYgKzE1NSwxMCBAQAogICAgICAgU3RyaW5nIHMgPSAkdGV4dDsKICAgICAgIHNldFRleHQocy5zdWJzdHJpbmcoMSwgcy5sZW5ndGgoKSAtIDEpKTsKICAgICB9CisgIHwgJ3snICggfigneyd8J30nKSApKiAnfScgeworICAgICAgU3RyaW5nIHMgPSAkdGV4dDsKKyAgICAgIHNldFRleHQocy5zdWJzdHJpbmcoMSwgcy5sZW5ndGgoKSAtIDEpKTsKKyAgICB9CiAgIDsKIAogU0lOR0xFX1dPUkQKZGlmZiAtLWdpdCBhL2dlcnJpdC1jYWNoZS1oMi9wb20ueG1sIGIvZ2Vycml0LWNhY2hlLWgyL3BvbS54bWwKaW5kZXggNGQ0MzAzYy4uYTg0OGFlYyAxMDA2NDQKLS0tIGEvZ2Vycml0LWNhY2hlLWgyL3BvbS54bWwKKysrIGIvZ2Vycml0LWNhY2hlLWgyL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1jYWNoZS1oMjwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1jYWNoZS1oMi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jYWNoZS9oMi9IMkNhY2hlRmFjdG9yeS5qYXZhIGIvZ2Vycml0LWNhY2hlLWgyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NhY2hlL2gyL0gyQ2FjaGVGYWN0b3J5LmphdmEKaW5kZXggMjdkYTIwZi4uODVhMDUxYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWNhY2hlLWgyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NhY2hlL2gyL0gyQ2FjaGVGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LWNhY2hlLWgyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NhY2hlL2gyL0gyQ2FjaGVGYWN0b3J5LmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQAogICAgIH0KICAgfQogCi0gIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIiwgInJhd3R5cGVzIiwgImNhc3QifSkKKyAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQiLCAiY2FzdCJ9KQogICBAT3ZlcnJpZGUKICAgcHVibGljIDxLLCBWPiBDYWNoZTxLLCBWPiBidWlsZChDYWNoZUJpbmRpbmc8SywgVj4gZGVmKSB7CiAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKCFzdGFydGVkLCAiY2FjaGUgbXVzdCBiZSBidWlsdCBiZWZvcmUgc3RhcnQiKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vcG9tLnhtbCBiL2dlcnJpdC1jb21tb24vcG9tLnhtbAppbmRleCA5YjNmZTVmLi4wOWUxZDRlIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3BvbS54bWwKKysrIGIvZ2Vycml0LWNvbW1vbi9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtY29tbW9uPC9hcnRpZmFjdElkPgpAQCAtNjEsNiArNjEsMTEgQEAKICAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXRjaC1qZ2l0PC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmZpbmRidWdzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anNyMzA1PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKICAgPGJ1aWxkPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9QYWdlTGlua3MuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vUGFnZUxpbmtzLmphdmEKaW5kZXggMmI5YjcyYS4uYmVhYjFkOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9QYWdlTGlua3MuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL1BhZ2VMaW5rcy5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbjsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZUluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2UuU3RhdHVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKQEAgLTM3LDYgKzM4LDggQEAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QID0gIm4seiI7CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlORSA9ICIvIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVFMgPSAiL3Byb2plY3RzLyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBU0hCT0FSRFMgPSAiLGRhc2hib2FyZHMvIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fR1JPVVBTID0gIi9hZG1pbi9ncm91cHMvIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fQ1JFQVRFX0dST1VQID0gIi9hZG1pbi9jcmVhdGUtZ3JvdXAvIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURNSU5fUFJPSkVDVFMgPSAiL2FkbWluL3Byb2plY3RzLyI7CkBAIC01NSwxOCArNTgsMjYgQEAKICAgICByZXR1cm4gIi9jLyIgKyBwcy5nZXRQYXJlbnRLZXkoKSArICIvIiArIHBzLmdldCgpOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Qcm9qZWN0KGZpbmFsIFByb2plY3QuTmFtZUtleSBwKSB7CisgICAgcmV0dXJuIEFETUlOX1BST0pFQ1RTICsgcC5nZXQoKTsKKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUHJvamVjdEFjY2Vlc3MoZmluYWwgUHJvamVjdC5OYW1lS2V5IHApIHsKICAgICByZXR1cm4gIi9hZG1pbi9wcm9qZWN0cy8iICsgcC5nZXQoKSArICIsYWNjZXNzIjsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQWNjb3VudFF1ZXJ5KGZpbmFsIFN0cmluZyBmdWxsbmFtZSkgewotICAgIHJldHVybiB0b0FjY291bnRRdWVyeShmdWxsbmFtZSwgU3RhdHVzLk5FVyk7Ci0gIH0KLQogICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0FjY291bnRRdWVyeShTdHJpbmcgZnVsbG5hbWUsIFN0YXR1cyBzdGF0dXMpIHsKICAgICByZXR1cm4gdG9DaGFuZ2VRdWVyeShvcCgib3duZXIiLCBmdWxsbmFtZSkgKyAiICIgKyBzdGF0dXMoc3RhdHVzKSwgVE9QKTsKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvQ3VzdG9tRGFzaGJvYXJkKGZpbmFsIFN0cmluZyBwYXJhbXMpIHsKKyAgICByZXR1cm4gIi9kYXNoYm9hcmQvPyIgKyBwYXJhbXM7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1Byb2plY3REYXNoYm9hcmRzKFByb2plY3QuTmFtZUtleSBwcm9qKSB7CisgICAgcmV0dXJuIEFETUlOX1BST0pFQ1RTICsgcHJvai5nZXQoKSArICIsZGFzaGJvYXJkcyI7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0NoYW5nZVF1ZXJ5KGZpbmFsIFN0cmluZyBxdWVyeSkgewogICAgIHJldHVybiB0b0NoYW5nZVF1ZXJ5KHF1ZXJ5LCBUT1ApOwogICB9CkBAIC03NSwxMCArODYsMjIgQEAKICAgICByZXR1cm4gIi9xLyIgKyBLZXlVdGlsLmVuY29kZShxdWVyeSkgKyAiLCIgKyBwYWdlOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Qcm9qZWN0RGFzaGJvYXJkKFByb2plY3QuTmFtZUtleSBuYW1lLCBTdHJpbmcgaWQpIHsKKyAgICByZXR1cm4gUFJPSkVDVFMgKyBuYW1lLmdldCgpICsgREFTSEJPQVJEUyArIGlkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvamVjdFF1ZXJ5KFByb2plY3QuTmFtZUtleSBwcm9qKSB7CisgICAgcmV0dXJuIG9wKCJwcm9qZWN0IiwgcHJvai5nZXQoKSk7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9qZWN0UXVlcnkoUHJvamVjdC5OYW1lS2V5IHByb2osIFN0YXR1cyBzdGF0dXMpIHsKICAgICAgIHJldHVybiBzdGF0dXMoc3RhdHVzKSArICIgIiArIG9wKCJwcm9qZWN0IiwgcHJvai5nZXQoKSk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b0dyb3VwKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgICByZXR1cm4gQURNSU5fR1JPVVBTICsgInV1aWQtIiArIHV1aWQ7CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhdHVzKFN0YXR1cyBzdGF0dXMpIHsKICAgICBzd2l0Y2ggKHN0YXR1cykgewogICAgICAgY2FzZSBBQkFORE9ORUQ6CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL1Byb2plY3RBY2Nlc3NVdGlsLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL1Byb2plY3RBY2Nlc3NVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlNDdiMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vUHJvamVjdEFjY2Vzc1V0aWwuamF2YQpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0QWNjZXNzVXRpbCB7CisgIHB1YmxpYyBzdGF0aWMgTGlzdDxBY2Nlc3NTZWN0aW9uPiBtZXJnZVNlY3Rpb25zKGZpbmFsIExpc3Q8QWNjZXNzU2VjdGlvbj4gc3JjKSB7CisgICAgZmluYWwgTWFwPFN0cmluZywgQWNjZXNzU2VjdGlvbj4gbWFwID0KKyAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBBY2Nlc3NTZWN0aW9uPigpOworICAgIGZvciAoZmluYWwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uIDogc3JjKSB7CisgICAgICBpZiAoc2VjdGlvbi5nZXRQZXJtaXNzaW9ucygpLmlzRW1wdHkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZmluYWwgQWNjZXNzU2VjdGlvbiBwcmlvciA9IG1hcC5nZXQoc2VjdGlvbi5nZXROYW1lKCkpOworICAgICAgaWYgKHByaW9yICE9IG51bGwpIHsKKyAgICAgICAgcHJpb3IubWVyZ2VGcm9tKHNlY3Rpb24pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWFwLnB1dChzZWN0aW9uLmdldE5hbWUoKSwgc2VjdGlvbik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEFjY2Vzc1NlY3Rpb24+KG1hcC52YWx1ZXMoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIExpc3Q8QWNjZXNzU2VjdGlvbj4gcmVtb3ZlRW1wdHlQZXJtaXNzaW9uc0FuZFNlY3Rpb25zKAorICAgICAgZmluYWwgTGlzdDxBY2Nlc3NTZWN0aW9uPiBzcmMpIHsKKyAgICBmaW5hbCBTZXQ8QWNjZXNzU2VjdGlvbj4gc2VjdGlvbnNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0PEFjY2Vzc1NlY3Rpb24+KCk7CisgICAgZm9yIChmaW5hbCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24gOiBzcmMpIHsKKyAgICAgIGZpbmFsIFNldDxQZXJtaXNzaW9uPiBwZXJtaXNzaW9uc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8UGVybWlzc2lvbj4oKTsKKyAgICAgIGZvciAoZmluYWwgUGVybWlzc2lvbiBwZXJtaXNzaW9uIDogc2VjdGlvbi5nZXRQZXJtaXNzaW9ucygpKSB7CisgICAgICAgIGlmIChwZXJtaXNzaW9uLmdldFJ1bGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgcGVybWlzc2lvbnNUb1JlbW92ZS5hZGQocGVybWlzc2lvbik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoZmluYWwgUGVybWlzc2lvbiBwZXJtaXNzaW9uVG9SZW1vdmUgOiBwZXJtaXNzaW9uc1RvUmVtb3ZlKSB7CisgICAgICAgIHNlY3Rpb24ucmVtb3ZlKHBlcm1pc3Npb25Ub1JlbW92ZSk7CisgICAgICB9CisgICAgICBpZiAoc2VjdGlvbi5nZXRQZXJtaXNzaW9ucygpLmlzRW1wdHkoKSkgeworICAgICAgICBzZWN0aW9uc1RvUmVtb3ZlLmFkZChzZWN0aW9uKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChmaW5hbCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb25Ub1JlbW92ZSA6IHNlY3Rpb25zVG9SZW1vdmUpIHsKKyAgICAgIHNyYy5yZW1vdmUoc2VjdGlvblRvUmVtb3ZlKTsKKyAgICB9CisgICAgcmV0dXJuIHNyYzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9Qcm9qZWN0VXRpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9Qcm9qZWN0VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmE0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL1Byb2plY3RVdGlsLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbjsKKworcHVibGljIGNsYXNzIFByb2plY3RVdGlsIHsKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBHaXRTdWZmaXgoU3RyaW5nIG5hbWUpIHsKKyAgICBpZiAobmFtZS5lbmRzV2l0aCgiLmdpdCIpKSB7CisgICAgICAvLyBCZSBuaWNlIGFuZCBkcm9wIHRoZSB0cmFpbGluZyAiLmdpdCIgc3VmZml4LCB3aGljaCB3ZSBuZXZlciBrZWVwCisgICAgICAvLyBpbiBvdXIgZGF0YWJhc2UsIGJ1dCBjbGllbnRzIG1pZ2h0IG1pc3Rha2VubHkgcHJvdmlkZSBhbnl3YXkuCisgICAgICAvLworICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSA0KTsKKyAgICAgIHdoaWxlIChuYW1lLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICBwcml2YXRlIFByb2plY3RVdGlsKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvU2lnbkluTW9kZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL1NpZ25Jbk1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZWQ1Ni4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvU2lnbkluTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoOwotCi1wdWJsaWMgZW51bSBTaWduSW5Nb2RlIHsKLSAgU0lHTl9JTiwgTElOS19JREVOVElZLCBSRUdJU1RFUjsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9vcGVuaWQvRGlzY292ZXJ5UmVzdWx0LmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvb3BlbmlkL0Rpc2NvdmVyeVJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWQyNmZhLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9vcGVuaWQvRGlzY292ZXJ5UmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGZpbmFsIGNsYXNzIERpc2NvdmVyeVJlc3VsdCB7Ci0gIHB1YmxpYyBzdGF0aWMgZW51bSBTdGF0dXMgewotICAgIC8qKiBQcm92aWRlciB3YXMgZGlzY292ZXJlZCBhbmQge0Bjb2RlIHByb3ZpZGVyVXJsfSBpcyB2YWxpZC4gKi8KLSAgICBWQUxJRCwKLQotICAgIC8qKiBUaGUgaWRlbnRpZmllciBpcyBub3QgYWxsb3dlZCB0byBiZSB1c2VkLCBieSBzaXRlIGNvbmZpZ3VyYXRpb24uICovCi0gICAgTk9UX0FMTE9XRUQsCi0KLSAgICAvKiogSWRlbnRpZmllciBpc24ndCBmb3IgYW4gT3BlbklEIHByb3ZpZGVyLiAqLwotICAgIE5PX1BST1ZJREVSLAotCi0gICAgLyoqIFRoZSBwcm92aWRlciB3YXMgZGlzY292ZXJlZCwgYnV0IHNvbWV0aGluZyBlbHNlIGZhaWxlZC4gKi8KLSAgICBFUlJPUjsKLSAgfQotCi0gIHB1YmxpYyBTdGF0dXMgc3RhdHVzOwotICBwdWJsaWMgU3RyaW5nIHByb3ZpZGVyVXJsOwotICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBwcm92aWRlckFyZ3M7Ci0KLSAgcHJvdGVjdGVkIERpc2NvdmVyeVJlc3VsdCgpIHsKLSAgfQotCi0gIHB1YmxpYyBEaXNjb3ZlcnlSZXN1bHQoZmluYWwgU3RyaW5nIHJlZGlyZWN0LCBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MpIHsKLSAgICBzdGF0dXMgPSBTdGF0dXMuVkFMSUQ7Ci0gICAgcHJvdmlkZXJVcmwgPSByZWRpcmVjdDsKLSAgICBwcm92aWRlckFyZ3MgPSBhcmdzOwotICB9Ci0KLSAgcHVibGljIERpc2NvdmVyeVJlc3VsdChmaW5hbCBTdGF0dXMgcykgewotICAgIHN0YXR1cyA9IHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9vcGVuaWQvT3BlbklkUHJvdmlkZXJQYXR0ZXJuLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2F1dGgvb3BlbmlkL09wZW5JZFByb3ZpZGVyUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODBkM2ViLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9vcGVuaWQvT3BlbklkUHJvdmlkZXJQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRFeHRlcm5hbElkOwotCi1wdWJsaWMgY2xhc3MgT3BlbklkUHJvdmlkZXJQYXR0ZXJuIHsKLSAgcHVibGljIHN0YXRpYyBPcGVuSWRQcm92aWRlclBhdHRlcm4gY3JlYXRlKFN0cmluZyBwYXR0ZXJuKSB7Ci0gICAgT3BlbklkUHJvdmlkZXJQYXR0ZXJuIHIgPSBuZXcgT3BlbklkUHJvdmlkZXJQYXR0ZXJuKCk7Ci0gICAgci5yZWdleCA9IHBhdHRlcm4uc3RhcnRzV2l0aCgiXiIpICYmIHBhdHRlcm4uZW5kc1dpdGgoIiQiKTsKLSAgICByLnBhdHRlcm4gPSBwYXR0ZXJuOwotICAgIHJldHVybiByOwotICB9Ci0KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVnZXg7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcGF0dGVybjsKLQotICBwcm90ZWN0ZWQgT3BlbklkUHJvdmlkZXJQYXR0ZXJuKCkgewotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgaWQpIHsKLSAgICByZXR1cm4gcmVnZXggPyBpZC5tYXRjaGVzKHBhdHRlcm4pIDogaWQuc3RhcnRzV2l0aChwYXR0ZXJuKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoQWNjb3VudEV4dGVybmFsSWQgaWQpIHsKLSAgICByZXR1cm4gbWF0Y2hlcyhpZC5nZXRFeHRlcm5hbElkKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIHBhdHRlcm47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL29wZW5pZC9PcGVuSWRTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWJhMzQuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL29wZW5pZC9PcGVuSWRTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluTW9kZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5BbGxvd0Nyb3NzU2l0ZVJlcXVlc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5SZW1vdGVKc29uU2VydmljZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJwY0ltcGw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsLlZlcnNpb247Ci0KLUBScGNJbXBsKHZlcnNpb24gPSBWZXJzaW9uLlYyXzApCi1wdWJsaWMgaW50ZXJmYWNlIE9wZW5JZFNlcnZpY2UgZXh0ZW5kcyBSZW1vdGVKc29uU2VydmljZSB7Ci0gIEBBbGxvd0Nyb3NzU2l0ZVJlcXVlc3QKLSAgdm9pZCBkaXNjb3ZlcihTdHJpbmcgb3BlbmlkSWRlbnRpZmllciwgU2lnbkluTW9kZSBtb2RlLAotICAgICAgYm9vbGVhbiByZW1lbWJlciwgU3RyaW5nIHJldHVyblRva2VuLAotICAgICAgQXN5bmNDYWxsYmFjazxEaXNjb3ZlcnlSZXN1bHQ+IGNhbGxiYWNrKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC91c2VycGFzcy9Mb2dpblJlc3VsdC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL3VzZXJwYXNzL0xvZ2luUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OWNkZDIuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL3VzZXJwYXNzL0xvZ2luUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgudXNlcnBhc3M7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXV0aFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBMb2dpblJlc3VsdCB7Ci0gIHB1YmxpYyBib29sZWFuIHN1Y2Nlc3M7Ci0gIHB1YmxpYyBib29sZWFuIGlzTmV3OwotCi0gIHByb3RlY3RlZCBBdXRoVHlwZSBhdXRoVHlwZTsKLSAgcHJvdGVjdGVkIEVycm9yIGVycm9yOwotCi0gIHByb3RlY3RlZCBMb2dpblJlc3VsdCgpIHsKLSAgfQotCi0gIHB1YmxpYyBMb2dpblJlc3VsdChmaW5hbCBBdXRoVHlwZSBhdXRoVHlwZSkgewotICAgIHRoaXMuYXV0aFR5cGUgPSBhdXRoVHlwZTsKLSAgfQotCi0gIHB1YmxpYyBBdXRoVHlwZSBnZXRBdXRoVHlwZSgpIHsKLSAgICByZXR1cm4gYXV0aFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRFcnJvcihmaW5hbCBFcnJvciBlcnJvcikgewotICAgIHRoaXMuZXJyb3IgPSBlcnJvcjsKLSAgICBzdWNjZXNzID0gZXJyb3IgPT0gbnVsbDsKLSAgfQotCi0gIHB1YmxpYyBFcnJvciBnZXRFcnJvcigpIHsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGVudW0gRXJyb3IgewotICAgIC8qKiBVc2VybmFtZSBvciBwYXNzd29yZCBhcmUgaW52YWxpZCAqLwotICAgIElOVkFMSURfTE9HSU4sCi0KLSAgICAvKiogVGhlIGF1dGhlbnRpY2F0aW9uIHNlcnZlciBpcyB1bmF2YWlsYWJsZSBvciB0aGUgcXVlcnkgdG8gaXQgdGltZWQgb3V0ICovCi0gICAgQVVUSEVOVElDQVRJT05fVU5BVkFJTEFCTEUKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzQXV0aFNlcnZpY2UuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vYXV0aC91c2VycGFzcy9Vc2VyUGFzc0F1dGhTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzZkMjMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzQXV0aFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC51c2VycGFzczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdWRpdC5BdWRpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5BbGxvd0Nyb3NzU2l0ZVJlcXVlc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5SZW1vdGVKc29uU2VydmljZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJwY0ltcGw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsLlZlcnNpb247Ci0KLUBScGNJbXBsKHZlcnNpb24gPSBWZXJzaW9uLlYyXzApCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJQYXNzQXV0aFNlcnZpY2UgZXh0ZW5kcyBSZW1vdGVKc29uU2VydmljZSB7Ci0gIEBBdWRpdChhY3Rpb24gPSAic2lnbiBpbiIsIG9iZnVzY2F0ZT17MX0pCi0gIEBBbGxvd0Nyb3NzU2l0ZVJlcXVlc3QKLSAgdm9pZCBhdXRoZW50aWNhdGUoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQsCi0gICAgICBBc3luY0NhbGxiYWNrPExvZ2luUmVzdWx0PiBjYWxsYmFjayk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2NoYW5nZXMvTGlzdENoYW5nZXNPcHRpb24uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vY2hhbmdlcy9MaXN0Q2hhbmdlc09wdGlvbi5qYXZhCmluZGV4IGE1YWI4NTEuLjNkMDhkMDYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vY2hhbmdlcy9MaXN0Q2hhbmdlc09wdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vY2hhbmdlcy9MaXN0Q2hhbmdlc09wdGlvbi5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAvKiogT3V0cHV0IG9wdGlvbnMgYXZhaWxhYmxlIHdoZW4gdXNpbmcge0Bjb2RlIC9jaGFuZ2VzL30gUlBDcy4gKi8KIHB1YmxpYyBlbnVtIExpc3RDaGFuZ2VzT3B0aW9uIHsKICAgTEFCRUxTKDApLAorICBERVRBSUxFRF9MQUJFTFMoOCksCiAKICAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBvbiB0aGUgY3VycmVudCBwYXRjaCBzZXQgb2YgdGhlIGNoYW5nZS4gKi8KICAgQ1VSUkVOVF9SRVZJU0lPTigxKSwKQEAgLTMwLDcgKzMxLDEwIEBACiAKICAgLyoqIElmIGEgcGF0Y2ggc2V0IGlzIGluY2x1ZGVkLCBpbmNsdWRlIHRoZSBmaWxlcyBvZiB0aGUgcGF0Y2ggc2V0LiAqLwogICBDVVJSRU5UX0ZJTEVTKDUpLAotICBBTExfRklMRVMoNik7CisgIEFMTF9GSUxFUyg2KSwKKworICAvKiogSWYgYWNjb3VudHMgYXJlIGluY2x1ZGVkLCBpbmNsdWRlIGRldGFpbGVkIGFjY291bnQgaW5mby4gKi8KKyAgREVUQUlMRURfQUNDT1VOVFMoNyk7CiAKICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CiAKQEAgLTQyLDEwICs0Niw2IEBACiAgICAgcmV0dXJuIHZhbHVlOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlc09wdGlvbiBmcm9tVmFsdWUoaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIExpc3RDaGFuZ2VzT3B0aW9uLnZhbHVlcygpW3ZhbHVlXTsKLSAgfQotCiAgIHB1YmxpYyBzdGF0aWMgRW51bVNldDxMaXN0Q2hhbmdlc09wdGlvbj4gZnJvbUJpdHMoaW50IHYpIHsKICAgICBFbnVtU2V0PExpc3RDaGFuZ2VzT3B0aW9uPiByID0gRW51bVNldC5ub25lT2YoTGlzdENoYW5nZXNPcHRpb24uY2xhc3MpOwogICAgIGZvciAoTGlzdENoYW5nZXNPcHRpb24gbyA6IExpc3RDaGFuZ2VzT3B0aW9uLnZhbHVlcygpKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWNjb3VudERhc2hib2FyZEluZm8uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BY2NvdW50RGFzaGJvYXJkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjQ5MDBiLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BY2NvdW50RGFzaGJvYXJkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqIFN1bW1hcnkgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRpc3BsYXkgYW4gYWNjb3VudCBkYXNoYm9hcmQuICovCi1wdWJsaWMgY2xhc3MgQWNjb3VudERhc2hib2FyZEluZm8gewotICBwcm90ZWN0ZWQgQWNjb3VudEluZm9DYWNoZSBhY2NvdW50czsKLSAgcHJvdGVjdGVkIEFjY291bnQuSWQgb3duZXI7Ci0gIHByb3RlY3RlZCBMaXN0PENoYW5nZUluZm8+IGJ5T3duZXI7Ci0gIHByb3RlY3RlZCBMaXN0PENoYW5nZUluZm8+IGZvclJldmlldzsKLSAgcHJvdGVjdGVkIExpc3Q8Q2hhbmdlSW5mbz4gY2xvc2VkOwotCi0gIHByb3RlY3RlZCBBY2NvdW50RGFzaGJvYXJkSW5mbygpIHsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50RGFzaGJvYXJkSW5mbyhmaW5hbCBBY2NvdW50LklkIGZvclVzZXIpIHsKLSAgICBvd25lciA9IGZvclVzZXI7Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudEluZm9DYWNoZSBnZXRBY2NvdW50cygpIHsKLSAgICByZXR1cm4gYWNjb3VudHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBY2NvdW50cyhmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFjKSB7Ci0gICAgYWNjb3VudHMgPSBhYzsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50LklkIGdldE93bmVyKCkgewotICAgIHJldHVybiBvd25lcjsKLSAgfQotCi0gIHB1YmxpYyBMaXN0PENoYW5nZUluZm8+IGdldEJ5T3duZXIoKSB7Ci0gICAgcmV0dXJuIGJ5T3duZXI7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRCeU93bmVyKExpc3Q8Q2hhbmdlSW5mbz4gYykgewotICAgIGJ5T3duZXIgPSBjOwotICB9Ci0KLSAgcHVibGljIExpc3Q8Q2hhbmdlSW5mbz4gZ2V0Rm9yUmV2aWV3KCkgewotICAgIHJldHVybiBmb3JSZXZpZXc7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGb3JSZXZpZXcoTGlzdDxDaGFuZ2VJbmZvPiBjKSB7Ci0gICAgZm9yUmV2aWV3ID0gYzsKLSAgfQotCi0gIHB1YmxpYyBMaXN0PENoYW5nZUluZm8+IGdldENsb3NlZCgpIHsKLSAgICByZXR1cm4gY2xvc2VkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2xvc2VkKExpc3Q8Q2hhbmdlSW5mbz4gYykgewotICAgIGNsb3NlZCA9IGM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BY2NvdW50U2VjdXJpdHkuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BY2NvdW50U2VjdXJpdHkuamF2YQppbmRleCBhYTIxMmY5Li5jMmQwM2FiIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWNjb3VudFNlY3VyaXR5LmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FjY291bnRTZWN1cml0eS5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluUmVxdWlyZWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRFeHRlcm5hbElkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRTc2hLZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNvbnRhY3RJbmZvcm1hdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CkBAIC02MSw5ICs2MCw2IEBACiAgIEBTaWduSW5SZXF1aXJlZAogICB2b2lkIG15RXh0ZXJuYWxJZHMoQXN5bmNDYWxsYmFjazxMaXN0PEFjY291bnRFeHRlcm5hbElkPj4gY2FsbGJhY2spOwogCi0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIG15R3JvdXBzKEFzeW5jQ2FsbGJhY2s8TGlzdDxBY2NvdW50R3JvdXA+PiBjYWxsYmFjayk7Ci0KICAgQEF1ZGl0CiAgIEBTaWduSW5SZXF1aXJlZAogICB2b2lkIGRlbGV0ZUV4dGVybmFsSWRzKFNldDxBY2NvdW50RXh0ZXJuYWxJZC5LZXk+IGtleXMsCmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWRkQnJhbmNoUmVzdWx0LmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQWRkQnJhbmNoUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNTI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BZGRCcmFuY2hSZXN1bHQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7CisKK3B1YmxpYyBjbGFzcyBBZGRCcmFuY2hSZXN1bHQgeworICBwcm90ZWN0ZWQgTGlzdEJyYW5jaGVzUmVzdWx0IGxpc3RCcmFuY2hlc1Jlc3VsdDsKKyAgcHJvdGVjdGVkIEVycm9yIGVycm9yOworCisgIHByb3RlY3RlZCBBZGRCcmFuY2hSZXN1bHQoKSB7CisgIH0KKworICBwdWJsaWMgQWRkQnJhbmNoUmVzdWx0KGZpbmFsIEVycm9yIGVycm9yKSB7CisgICAgdGhpcy5lcnJvciA9IGVycm9yOworICB9CisKKyAgcHVibGljIEFkZEJyYW5jaFJlc3VsdChmaW5hbCBMaXN0QnJhbmNoZXNSZXN1bHQgbGlzdEJyYW5jaGVzUmVzdWx0KSB7CisgICAgdGhpcy5saXN0QnJhbmNoZXNSZXN1bHQgPSBsaXN0QnJhbmNoZXNSZXN1bHQ7CisgIH0KKworICBwdWJsaWMgTGlzdEJyYW5jaGVzUmVzdWx0IGdldExpc3RCcmFuY2hlc1Jlc3VsdCgpIHsKKyAgICByZXR1cm4gbGlzdEJyYW5jaGVzUmVzdWx0OworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaGFzRXJyb3IoKSB7CisgICAgcmV0dXJuIGVycm9yICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgRXJyb3IgZ2V0RXJyb3IoKSB7CisgICAgcmV0dXJuIGVycm9yOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvciB7CisgICAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUgeworICAgICAgLyoqIFRoZSBicmFuY2ggY2Fubm90IGJlIGNyZWF0ZWQgYmVjYXVzZSB0aGUgZ2l2ZW4gYnJhbmNoIG5hbWUgaXMgaW52YWxpZC4gKi8KKyAgICAgIElOVkFMSURfTkFNRSwKKworICAgICAgLyoqIFRoZSBicmFuY2ggY2Fubm90IGJlIGNyZWF0ZWQgYmVjYXVzZSB0aGUgZ2l2ZW4gcmV2aXNpb24gaXMgaW52YWxpZC4gKi8KKyAgICAgIElOVkFMSURfUkVWSVNJT04sCisKKyAgICAgIC8qKgorICAgICAgICogVGhlIGJyYW5jaCBjYW5ub3QgYmUgY3JlYXRlZCB1bmRlciB0aGUgZ2l2ZW4gcmVmbmFtZSBwcmVmaXggKGUuZworICAgICAgICogYnJhbmNoZXMgY2Fubm90IGJlIGNyZWF0ZWQgdW5kZXIgbWFnaWMgcmVmbmFtZSBwcmVmaXhlcykuCisgICAgICAgKi8KKyAgICAgIEJSQU5DSF9DUkVBVElPTl9OT1RfQUxMT1dFRF9VTkRFUl9SRUZOQU1FX1BSRUZJWCwKKworICAgICAgLyoqIFRoZSBicmFuY2ggdGhhdCBzaG91bGQgYmUgY3JlYXRlZCBleGlzdHMgYWxyZWFkeS4gKi8KKyAgICAgIEJSQU5DSF9BTFJFQURZX0VYSVNUUywKKworICAgICAgLyoqCisgICAgICAgKiBUaGUgYnJhbmNoIGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcKKyAgICAgICAqIGJyYW5jaCAoYnJhbmNoZXMgY2Fubm90IGJlIG5lc3RlZCkuCisgICAgICAgKi8KKyAgICAgIEJSQU5DSF9DUkVBVElPTl9DT05GTElDVAorICAgIH0KKworICAgIHByb3RlY3RlZCBUeXBlIHR5cGU7CisgICAgcHJvdGVjdGVkIFN0cmluZyByZWZuYW1lOworCisgICAgcHJvdGVjdGVkIEVycm9yKCkgeworICAgIH0KKworICAgIHB1YmxpYyBFcnJvcihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgIHRoaXModHlwZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIEVycm9yKGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgU3RyaW5nIHJlZm5hbWUpIHsKKyAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICB0aGlzLnJlZm5hbWUgPSByZWZuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZm5hbWUoKSB7CisgICAgICByZXR1cm4gcmVmbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgcmV0dXJuIHR5cGUgKyAiICIgKyByZWZuYW1lOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsRGV0YWlsLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxEZXRhaWwuamF2YQppbmRleCAzZDQzOGYyLi4zNmE5ODE0IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxEZXRhaWwuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxEZXRhaWwuamF2YQpAQCAtMTUsMzggKzE1LDQxIEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiAKLWltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgQXBwcm92YWxEZXRhaWwgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8QXBwcm92YWxEZXRhaWw+IFNPUlQgPQotICAgICAgbmV3IENvbXBhcmF0b3I8QXBwcm92YWxEZXRhaWw+KCkgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgQXBwcm92YWxEZXRhaWwgbzEsIGZpbmFsIEFwcHJvdmFsRGV0YWlsIG8yKSB7Ci0gICAgICAgICAgaW50IGNtcDsKLSAgICAgICAgICBjbXAgPSBvMi5oYXNOb25aZXJvIC0gbzEuaGFzTm9uWmVybzsKLSAgICAgICAgICBpZiAoY21wICE9IDApIHJldHVybiBjbXA7Ci0gICAgICAgICAgcmV0dXJuIG8xLnNvcnRPcmRlci5jb21wYXJlVG8obzIuc29ydE9yZGVyKTsKLSAgICAgICAgfQotICAgICAgfTsKLQotICBzdGF0aWMgZmluYWwgVGltZXN0YW1wIEVHXzAgPSBuZXcgVGltZXN0YW1wKDApOwotICBzdGF0aWMgZmluYWwgVGltZXN0YW1wIEVHX0QgPSBuZXcgVGltZXN0YW1wKExvbmcuTUFYX1ZBTFVFKTsKKyAgcHVibGljIHN0YXRpYyBMaXN0PEFwcHJvdmFsRGV0YWlsPiBzb3J0KENvbGxlY3Rpb248QXBwcm92YWxEZXRhaWw+IGFkcywKKyAgICAgIGZpbmFsIGludCBvd25lcikgeworICAgIExpc3Q8QXBwcm92YWxEZXRhaWw+IHNvcnRlZCA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxEZXRhaWw+KGFkcyk7CisgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQsIG5ldyBDb21wYXJhdG9yPEFwcHJvdmFsRGV0YWlsPigpIHsKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShBcHByb3ZhbERldGFpbCBvMSwgQXBwcm92YWxEZXRhaWwgbzIpIHsKKyAgICAgICAgaW50IGJ5T3duZXIgPSAobzIuYWNjb3VudC5nZXQoKSA9PSBvd25lciA/IDEgOiAwKQorICAgICAgICAgICAgLSAobzEuYWNjb3VudC5nZXQoKSA9PSBvd25lciA/IDEgOiAwKTsKKyAgICAgICAgcmV0dXJuIGJ5T3duZXIgIT0gMCA/IGJ5T3duZXIgOiAobzEuaGFzTm9uWmVybyAtIG8yLmhhc05vblplcm8pOworICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBzb3J0ZWQ7CisgIH0KIAogICBwcm90ZWN0ZWQgQWNjb3VudC5JZCBhY2NvdW50OwogICBwcm90ZWN0ZWQgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHM7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhblJlbW92ZTsKKyAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiB2b3RhYmxlOwogCiAgIHByaXZhdGUgdHJhbnNpZW50IFNldDxTdHJpbmc+IGFwcHJvdmVkOwogICBwcml2YXRlIHRyYW5zaWVudCBTZXQ8U3RyaW5nPiByZWplY3RlZDsKKyAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFN0cmluZywgSW50ZWdlcj4gdmFsdWVzOwogICBwcml2YXRlIHRyYW5zaWVudCBpbnQgaGFzTm9uWmVybzsKLSAgcHJpdmF0ZSB0cmFuc2llbnQgVGltZXN0YW1wIHNvcnRPcmRlciA9IEVHX0Q7CiAKICAgcHJvdGVjdGVkIEFwcHJvdmFsRGV0YWlsKCkgewogICB9CkBAIC02OCw0MSArNzEsMTIgQEAKICAgICBjYW5SZW1vdmUgPSByZW1vdmVhYmxlOwogICB9CiAKLSAgcHVibGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gZ2V0UGF0Y2hTZXRBcHByb3ZhbHMoKSB7Ci0gICAgcmV0dXJuIGFwcHJvdmFsczsKLSAgfQotCi0gIHB1YmxpYyBQYXRjaFNldEFwcHJvdmFsIGdldFBhdGNoU2V0QXBwcm92YWwoQXBwcm92YWxDYXRlZ29yeS5JZCBjYXRlZ29yeSkgewotICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBhcHByb3ZhbHMpIHsKLSAgICAgIGlmIChwc2EuZ2V0Q2F0ZWdvcnlJZCgpLmVxdWFscyhjYXRlZ29yeSkpIHsKLSAgICAgICAgcmV0dXJuIHBzYTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzb3J0Rmlyc3QoKSB7Ci0gICAgaGFzTm9uWmVybyA9IDE7Ci0gICAgc29ydE9yZGVyID0gQXBwcm92YWxEZXRhaWwuRUdfMDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhKSB7Ci0gICAgYXBwcm92YWxzLmFkZChjYSk7Ci0KLSAgICBmaW5hbCBUaW1lc3RhbXAgZyA9IGNhLmdldEdyYW50ZWQoKTsKLSAgICBpZiAoZyAhPSBudWxsICYmIGcuY29tcGFyZVRvKHNvcnRPcmRlcikgPCAwKSB7Ci0gICAgICBzb3J0T3JkZXIgPSBnOwotICAgIH0KLSAgICBpZiAoY2EuZ2V0VmFsdWUoKSAhPSAwKSB7Ci0gICAgICBoYXNOb25aZXJvID0gMTsKLSAgICB9Ci0gIH0KLQogICBwdWJsaWMgdm9pZCBhcHByb3ZlZChTdHJpbmcgbGFiZWwpIHsKICAgICBpZiAoYXBwcm92ZWQgPT0gbnVsbCkgewogICAgICAgYXBwcm92ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAgICAgfQogICAgIGFwcHJvdmVkLmFkZChsYWJlbCk7CisgICAgaGFzTm9uWmVybyA9IDE7CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZWplY3RlZChTdHJpbmcgbGFiZWwpIHsKQEAgLTExMCw2ICs4NCwyNCBAQAogICAgICAgcmVqZWN0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAgICAgfQogICAgIHJlamVjdGVkLmFkZChsYWJlbCk7CisgICAgaGFzTm9uWmVybyA9IDE7CisgIH0KKworICBwdWJsaWMgdm9pZCB2b3RhYmxlKFN0cmluZyBsYWJlbCkgeworICAgIGlmICh2b3RhYmxlID09IG51bGwpIHsKKyAgICAgIHZvdGFibGUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgfQorICAgIHZvdGFibGUuYWRkKGxhYmVsKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbHVlKFN0cmluZyBsYWJlbCwgaW50IHZhbHVlKSB7CisgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgfQorICAgIHZhbHVlcy5wdXQobGFiZWwsIHZhbHVlKTsKKyAgICBpZiAodmFsdWUgIT0gMCkgeworICAgICAgaGFzTm9uWmVybyA9IDE7CisgICAgfQogICB9CiAKICAgcHVibGljIGJvb2xlYW4gaXNBcHByb3ZlZChTdHJpbmcgbGFiZWwpIHsKQEAgLTExOSw0ICsxMTEsMTYgQEAKICAgcHVibGljIGJvb2xlYW4gaXNSZWplY3RlZChTdHJpbmcgbGFiZWwpIHsKICAgICByZXR1cm4gcmVqZWN0ZWQgIT0gbnVsbCAmJiByZWplY3RlZC5jb250YWlucyhsYWJlbCk7CiAgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjYW5Wb3RlKFN0cmluZyBsYWJlbCkgeworICAgIHJldHVybiB2b3RhYmxlICE9IG51bGwgJiYgdm90YWJsZS5jb250YWlucyhsYWJlbCk7CisgIH0KKworICBwdWJsaWMgaW50IGdldFZhbHVlKFN0cmluZyBsYWJlbCkgeworICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEludGVnZXIgdiA9IHZhbHVlcy5nZXQobGFiZWwpOworICAgIHJldHVybiB2ICE9IG51bGwgPyB2IDogMDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsU3VtbWFyeS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsU3VtbWFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM5ZDY3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFN1bW1hcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKiBTdW1tYXJpemVzIHRoZSBhcHByb3ZhbHMgKG9yIG5lZ2F0aXZlIGFwcHJvdmFscykgZm9yIGEgcGF0Y2ggc2V0LgotICogVGhpcyB3aWxsIHR5cGljYWxseSBjb250YWluIHplcm8gb3Igb25lIGFwcHJvdmFscyBmb3IgZWFjaAotICogY2F0ZWdvcnksIHdpdGggYWxsIG9mIHRoZSBhcHByb3ZhbHMgY29taW5nIGZyb20gYSBzaW5nbGUgcGF0Y2ggc2V0LgotICovCi1wdWJsaWMgY2xhc3MgQXBwcm92YWxTdW1tYXJ5IHsKLSAgcHJvdGVjdGVkIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHM7Ci0KLSAgcHJvdGVjdGVkIEFwcHJvdmFsU3VtbWFyeSgpIHsKLSAgfQotCi0gIHB1YmxpYyBBcHByb3ZhbFN1bW1hcnkoZmluYWwgSXRlcmFibGU8UGF0Y2hTZXRBcHByb3ZhbD4gbGlzdCkgewotICAgIGFwcHJvdmFscyA9IG5ldyBIYXNoTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+KCk7Ci0gICAgZm9yIChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGEgOiBsaXN0KSB7Ci0gICAgICBhcHByb3ZhbHMucHV0KGEuZ2V0Q2F0ZWdvcnlJZCgpLCBhKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+IGdldEFwcHJvdmFsTWFwKCkgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoYXBwcm92YWxzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsU3VtbWFyeVNldC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsU3VtbWFyeVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjExMDg1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFN1bW1hcnlTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqIENvbnRhaW5zIGEgc2V0IG9mIEFwcHJvdmFsU3VtbWFyeSBvYmplY3RzLCBrZXllZCBieSB0aGUgY2hhbmdlIGlkCi0gKiBmcm9tIHdoaWNoIHRoZXkgd2VyZSBkZXJpdmVkLgotICovCi1wdWJsaWMgY2xhc3MgQXBwcm92YWxTdW1tYXJ5U2V0IHsKLSAgcHJvdGVjdGVkIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudHM7Ci0KLSAgcHJvdGVjdGVkIE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4gc3VtbWFyaWVzOwotCi0gIHByb3RlY3RlZCBBcHByb3ZhbFN1bW1hcnlTZXQoKSB7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxTdW1tYXJ5U2V0KGZpbmFsIEFjY291bnRJbmZvQ2FjaGUgYWNjdHMsCi0gICAgICBmaW5hbCBNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+IG1hcCkgewotICAgIGFjY291bnRzID0gYWNjdHM7Ci0KLSAgICBzdW1tYXJpZXMgPSBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4oKTsKLSAgICBzdW1tYXJpZXMucHV0QWxsKG1hcCk7Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudEluZm9DYWNoZSBnZXRBY2NvdW50SW5mb0NhY2hlKCkgewotICAgIHJldHVybiBhY2NvdW50czsKLSAgfQotCi0gIHB1YmxpYyBNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+IGdldFN1bW1hcnlNYXAoKSB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChzdW1tYXJpZXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxUeXBlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzM2I5MWMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0FwcHJvdmFsVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgQXBwcm92YWxUeXBlIHsKLSAgcHJvdGVjdGVkIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnk7Ci0gIHByb3RlY3RlZCBMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gdmFsdWVzOwotICBwcm90ZWN0ZWQgc2hvcnQgbWF4TmVnYXRpdmU7Ci0gIHByb3RlY3RlZCBzaG9ydCBtYXhQb3NpdGl2ZTsKLQotICBwcml2YXRlIHRyYW5zaWVudCBMaXN0PEludGVnZXI+IGludExpc3Q7Ci0gIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTaG9ydCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlPiBieVZhbHVlOwotCi0gIHByb3RlY3RlZCBBcHByb3ZhbFR5cGUoKSB7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxUeXBlKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkgYWMsCi0gICAgICBmaW5hbCBMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gdmFsdWVMaXN0KSB7Ci0gICAgY2F0ZWdvcnkgPSBhYzsKLSAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4odmFsdWVMaXN0KTsKLSAgICBDb2xsZWN0aW9ucy5zb3J0KHZhbHVlcywgbmV3IENvbXBhcmF0b3I8QXBwcm92YWxDYXRlZ29yeVZhbHVlPigpIHsKLSAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShBcHByb3ZhbENhdGVnb3J5VmFsdWUgbzEsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBvMikgewotICAgICAgICByZXR1cm4gbzEuZ2V0VmFsdWUoKSAtIG8yLmdldFZhbHVlKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBtYXhOZWdhdGl2ZSA9IFNob3J0Lk1JTl9WQUxVRTsKLSAgICBtYXhQb3NpdGl2ZSA9IFNob3J0Lk1BWF9WQUxVRTsKLSAgICBpZiAodmFsdWVzLnNpemUoKSA+IDApIHsKLSAgICAgIGlmICh2YWx1ZXMuZ2V0KDApLmdldFZhbHVlKCkgPCAwKSB7Ci0gICAgICAgIG1heE5lZ2F0aXZlID0gdmFsdWVzLmdldCgwKS5nZXRWYWx1ZSgpOwotICAgICAgfQotICAgICAgaWYgKHZhbHVlcy5nZXQodmFsdWVzLnNpemUoKSAtIDEpLmdldFZhbHVlKCkgPiAwKSB7Ci0gICAgICAgIG1heFBvc2l0aXZlID0gdmFsdWVzLmdldCh2YWx1ZXMuc2l6ZSgpIC0gMSkuZ2V0VmFsdWUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGb3JjZSB0aGUgbGFiZWwgbmFtZSB0byBwcmUtY29tcHV0ZSBzbyB3ZSBkb24ndCBoYXZlIGRhdGEgcmFjZSBjb25kaXRpb25zLgotICAgIGdldENhdGVnb3J5KCkuZ2V0TGFiZWxOYW1lKCk7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeSBnZXRDYXRlZ29yeSgpIHsKLSAgICByZXR1cm4gY2F0ZWdvcnk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IGdldFZhbHVlcygpIHsKLSAgICByZXR1cm4gdmFsdWVzOwotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBnZXRNaW4oKSB7Ci0gICAgaWYgKHZhbHVlcy5pc0VtcHR5KCkpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gdmFsdWVzLmdldCgwKTsKLSAgfQotCi0gIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5VmFsdWUgZ2V0TWF4KCkgewotICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIHYgPSB2YWx1ZXMuZ2V0KHZhbHVlcy5zaXplKCkgLSAxKTsKLSAgICByZXR1cm4gdi5nZXRWYWx1ZSgpID4gMCA/IHYgOiBudWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNNYXhOZWdhdGl2ZShmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhKSB7Ci0gICAgcmV0dXJuIG1heE5lZ2F0aXZlID09IGNhLmdldFZhbHVlKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc01heFBvc2l0aXZlKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2EpIHsKLSAgICByZXR1cm4gbWF4UG9zaXRpdmUgPT0gY2EuZ2V0VmFsdWUoKTsKLSAgfQotCi0gIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5VmFsdWUgZ2V0VmFsdWUoZmluYWwgc2hvcnQgdmFsdWUpIHsKLSAgICBpbml0QnlWYWx1ZSgpOwotICAgIHJldHVybiBieVZhbHVlLmdldCh2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeVZhbHVlIGdldFZhbHVlKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2EpIHsKLSAgICBpbml0QnlWYWx1ZSgpOwotICAgIHJldHVybiBieVZhbHVlLmdldChjYS5nZXRWYWx1ZSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0QnlWYWx1ZSgpIHsKLSAgICBpZiAoYnlWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICBieVZhbHVlID0gbmV3IEhhc2hNYXA8U2hvcnQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4oKTsKLSAgICAgIGZvciAoZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIGFjdiA6IHZhbHVlcykgewotICAgICAgICBieVZhbHVlLnB1dChhY3YuZ2V0VmFsdWUoKSwgYWN2KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRWYWx1ZXNBc0xpc3QoKSB7Ci0gICAgaWYgKGludExpc3QgPT0gbnVsbCkgewotICAgICAgaW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4odmFsdWVzLnNpemUoKSk7Ci0gICAgICBmb3IgKEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBhY3YgOiB2YWx1ZXMpIHsKLSAgICAgICAgaW50TGlzdC5hZGQoSW50ZWdlci52YWx1ZU9mKGFjdi5nZXRWYWx1ZSgpKSk7Ci0gICAgICB9Ci0gICAgICBDb2xsZWN0aW9ucy5zb3J0KGludExpc3QpOwotICAgICAgQ29sbGVjdGlvbnMucmV2ZXJzZShpbnRMaXN0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGludExpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFR5cGVzLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQXBwcm92YWxUeXBlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWUzMmQxLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9BcHByb3ZhbFR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBBcHByb3ZhbFR5cGVzIHsKLSAgcHJvdGVjdGVkIExpc3Q8QXBwcm92YWxUeXBlPiBhcHByb3ZhbFR5cGVzOwotICBwcml2YXRlIHRyYW5zaWVudCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxUeXBlPiBieUlkOwotICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBBcHByb3ZhbFR5cGU+IGJ5TGFiZWw7Ci0KLSAgcHJvdGVjdGVkIEFwcHJvdmFsVHlwZXMoKSB7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxUeXBlcyhmaW5hbCBMaXN0PEFwcHJvdmFsVHlwZT4gYXBwcm92YWxzKSB7Ci0gICAgYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsczsKLSAgICBieUNhdGVnb3J5KCk7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxBcHByb3ZhbFR5cGU+IGdldEFwcHJvdmFsVHlwZXMoKSB7Ci0gICAgcmV0dXJuIGFwcHJvdmFsVHlwZXM7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxUeXBlIGJ5SWQoZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBpZCkgewotICAgIHJldHVybiBieUNhdGVnb3J5KCkuZ2V0KGlkKTsKLSAgfQotCi0gIHByaXZhdGUgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsVHlwZT4gYnlDYXRlZ29yeSgpIHsKLSAgICBpZiAoYnlJZCA9PSBudWxsKSB7Ci0gICAgICBieUlkID0gbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxUeXBlPigpOwotICAgICAgaWYgKGFwcHJvdmFsVHlwZXMgIT0gbnVsbCkgewotICAgICAgICBmb3IgKGZpbmFsIEFwcHJvdmFsVHlwZSB0IDogYXBwcm92YWxUeXBlcykgewotICAgICAgICAgIGJ5SWQucHV0KHQuZ2V0Q2F0ZWdvcnkoKS5nZXRJZCgpLCB0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYnlJZDsKLSAgfQotCi0gIHB1YmxpYyBBcHByb3ZhbFR5cGUgYnlMYWJlbChTdHJpbmcgbGFiZWxOYW1lKSB7Ci0gICAgcmV0dXJuIGJ5TGFiZWwoKS5nZXQobGFiZWxOYW1lLnRvTG93ZXJDYXNlKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBBcHByb3ZhbFR5cGU+IGJ5TGFiZWwoKSB7Ci0gICAgaWYgKGJ5TGFiZWwgPT0gbnVsbCkgewotICAgICAgYnlMYWJlbCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXBwcm92YWxUeXBlPigpOwotICAgICAgaWYgKGFwcHJvdmFsVHlwZXMgIT0gbnVsbCkgewotICAgICAgICBmb3IgKEFwcHJvdmFsVHlwZSB0IDogYXBwcm92YWxUeXBlcykgewotICAgICAgICAgIGJ5TGFiZWwucHV0KHQuZ2V0Q2F0ZWdvcnkoKS5nZXRMYWJlbE5hbWUoKS50b0xvd2VyQ2FzZSgpLCB0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYnlMYWJlbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZURldGFpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZURldGFpbC5qYXZhCmluZGV4IDc0ZDE5NjIuLjdhYzIxZGIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VEZXRhaWwuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlRGV0YWlsLmphdmEKQEAgLTE3LDEwICsxNyw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqIERldGFpbCBuZWNlc3NhcnkgdG8gZGlzcGxheSBhIGNoYW5nZS4gKi8KQEAgLTI4LDYgKzI2LDcgQEAKICAgcHJvdGVjdGVkIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudHM7CiAgIHByb3RlY3RlZCBib29sZWFuIGFsbG93c0Fub255bW91czsKICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQWJhbmRvbjsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdENvbW1pdE1lc3NhZ2U7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhblB1Ymxpc2g7CiAgIHByb3RlY3RlZCBib29sZWFuIGNhblJlYmFzZTsKICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuUmVzdG9yZTsKQEAgLTM4LDEzICszNywxNSBAQAogICBwcm90ZWN0ZWQgTGlzdDxDaGFuZ2VJbmZvPiBkZXBlbmRzT247CiAgIHByb3RlY3RlZCBMaXN0PENoYW5nZUluZm8+IG5lZWRlZEJ5OwogICBwcm90ZWN0ZWQgTGlzdDxQYXRjaFNldD4gcGF0Y2hTZXRzOwotICBwcm90ZWN0ZWQgTGlzdDxBcHByb3ZhbERldGFpbD4gYXBwcm92YWxzOwogICBwcm90ZWN0ZWQgTGlzdDxTdWJtaXRSZWNvcmQ+IHN1Ym1pdFJlY29yZHM7CisgIHByb3RlY3RlZCBQcm9qZWN0LlN1Ym1pdFR5cGUgc3VibWl0VHlwZTsKKyAgcHJvdGVjdGVkIFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZDsKICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuU3VibWl0OwogICBwcm90ZWN0ZWQgTGlzdDxDaGFuZ2VNZXNzYWdlPiBtZXNzYWdlczsKICAgcHJvdGVjdGVkIFBhdGNoU2V0LklkIGN1cnJlbnRQYXRjaFNldElkOwogICBwcm90ZWN0ZWQgUGF0Y2hTZXREZXRhaWwgY3VycmVudERldGFpbDsKICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdDsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuRWRpdFRvcGljTmFtZTsKIAogICBwdWJsaWMgQ2hhbmdlRGV0YWlsKCkgewogICB9CkBAIC03Myw2ICs3NCwxNCBAQAogICAgIGNhbkFiYW5kb24gPSBhOwogICB9CiAKKyAgcHVibGljIGJvb2xlYW4gY2FuRWRpdENvbW1pdE1lc3NhZ2UoKSB7CisgICAgcmV0dXJuIGNhbkVkaXRDb21taXRNZXNzYWdlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q2FuRWRpdENvbW1pdE1lc3NhZ2UoZmluYWwgYm9vbGVhbiBhKSB7CisgICAgY2FuRWRpdENvbW1pdE1lc3NhZ2UgPSBhOworICB9CisKICAgcHVibGljIGJvb2xlYW4gY2FuUHVibGlzaCgpIHsKICAgICByZXR1cm4gY2FuUHVibGlzaDsKICAgfQpAQCAtMTIxLDYgKzEzMCwxNCBAQAogICAgIGNhbkRlbGV0ZURyYWZ0ID0gYTsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIGNhbkVkaXRUb3BpY05hbWUoKSB7CisgICAgcmV0dXJuIGNhbkVkaXRUb3BpY05hbWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRDYW5FZGl0VG9waWNOYW1lKGJvb2xlYW4gYSkgeworICAgIGNhbkVkaXRUb3BpY05hbWUgPSBhOworICB9CisKICAgcHVibGljIENoYW5nZSBnZXRDaGFuZ2UoKSB7CiAgICAgcmV0dXJuIGNoYW5nZTsKICAgfQpAQCAtMTcwLDE1ICsxODcsNiBAQAogICAgIHBhdGNoU2V0cyA9IHM7CiAgIH0KIAotICBwdWJsaWMgTGlzdDxBcHByb3ZhbERldGFpbD4gZ2V0QXBwcm92YWxzKCkgewotICAgIHJldHVybiBhcHByb3ZhbHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBcHByb3ZhbHMoQ29sbGVjdGlvbjxBcHByb3ZhbERldGFpbD4gbGlzdCkgewotICAgIGFwcHJvdmFscyA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxEZXRhaWw+KGxpc3QpOwotICAgIENvbGxlY3Rpb25zLnNvcnQoYXBwcm92YWxzLCBBcHByb3ZhbERldGFpbC5TT1JUKTsKLSAgfQotCiAgIHB1YmxpYyB2b2lkIHNldFN1Ym1pdFJlY29yZHMoTGlzdDxTdWJtaXRSZWNvcmQ+IGFsbCkgewogICAgIHN1Ym1pdFJlY29yZHMgPSBhbGw7CiAgIH0KQEAgLTE4Nyw2ICsxOTUsMTQgQEAKICAgICByZXR1cm4gc3VibWl0UmVjb3JkczsKICAgfQogCisgIHB1YmxpYyB2b2lkIHNldFN1Ym1pdFR5cGVSZWNvcmQoU3VibWl0VHlwZVJlY29yZCBzdWJtaXRUeXBlUmVjb3JkKSB7CisgICAgdGhpcy5zdWJtaXRUeXBlUmVjb3JkID0gc3VibWl0VHlwZVJlY29yZDsKKyAgfQorCisgIHB1YmxpYyBTdWJtaXRUeXBlUmVjb3JkIGdldFN1Ym1pdFR5cGVSZWNvcmQoKSB7CisgICAgcmV0dXJuIHN1Ym1pdFR5cGVSZWNvcmQ7CisgIH0KKwogICBwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnRQYXRjaFNldChmaW5hbCBQYXRjaFNldERldGFpbCBkZXRhaWwpIHsKICAgICByZXR1cm4gY3VycmVudFBhdGNoU2V0SWQgIT0gbnVsbAogICAgICAgICAmJiBkZXRhaWwuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLmVxdWFscyhjdXJyZW50UGF0Y2hTZXRJZCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlSW5mby5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZUluZm8uamF2YQppbmRleCAzOTFkNjE1Li5mMmU4MzNmIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlSW5mby5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VJbmZvLmphdmEKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBsYXN0VXBkYXRlZE9uID0gYy5nZXRMYXN0VXBkYXRlZE9uKCk7CiAgICAgc29ydEtleSA9IGMuZ2V0U29ydEtleSgpOwogICAgIHBhdGNoU2V0SWQgPSBwYXRjaElkOwotICAgIGxhdGVzdCA9IHBhdGNoU2V0SWQgPT0gbnVsbCB8fCBjLmN1cnJQYXRjaFNldElkKCkuZXF1YWxzKHBhdGNoU2V0SWQpOworICAgIGxhdGVzdCA9IHBhdGNoU2V0SWQgPT0gbnVsbCB8fCBwYXRjaFNldElkLmVxdWFscyhjLmN1cnJlbnRQYXRjaFNldElkKCkpOwogICB9CiAKICAgcHVibGljIENoYW5nZUluZm8oZmluYWwgQ2hhbmdlIGMpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VNYW5hZ2VTZXJ2aWNlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ2hhbmdlTWFuYWdlU2VydmljZS5qYXZhCmluZGV4IDRlZjZiM2UuLmQwZTUxNTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9DaGFuZ2VNYW5hZ2VTZXJ2aWNlLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NoYW5nZU1hbmFnZVNlcnZpY2UuamF2YQpAQCAtMjcsMjIgKzI3LDggQEAKIHB1YmxpYyBpbnRlcmZhY2UgQ2hhbmdlTWFuYWdlU2VydmljZSBleHRlbmRzIFJlbW90ZUpzb25TZXJ2aWNlIHsKICAgQEF1ZGl0CiAgIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIHN1Ym1pdChQYXRjaFNldC5JZCBwYXRjaFNldElkLCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBhYmFuZG9uQ2hhbmdlKFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIFN0cmluZyBtZXNzYWdlLAotICAgICAgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgcmV2ZXJ0Q2hhbmdlKFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIFN0cmluZyBtZXNzYWdlLAotICAgICAgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgcmVzdG9yZUNoYW5nZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Q2hhbmdlRGV0YWlsPiBjYWxsYmFjayk7CisgIHZvaWQgY3JlYXRlTmV3UGF0Y2hTZXQoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwgZmluYWwgU3RyaW5nIG5ld0NvbW1pdE1lc3NhZ2UsCisgICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spOwogCiAgIEBBdWRpdAogICBAU2lnbkluUmVxdWlyZWQKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Db21tZW50RGV0YWlsLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvQ29tbWVudERldGFpbC5qYXZhCmluZGV4IDBlMDc5YjMuLjNjYjNmMDUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Db21tZW50RGV0YWlsLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0NvbW1lbnREZXRhaWwuamF2YQpAQCAtODksOSArODksNiBAQAogICB9CiAKICAgcHVibGljIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZ2V0Rm9yQShmaW5hbCBpbnQgbGluZU5icikgewotICAgIGlmIChsaW5lTmJyID09IDApIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB9CiAgICAgaWYgKGZvckEgPT0gbnVsbCkgewogICAgICAgZm9yQSA9IGluZGV4KGEpOwogICAgIH0KQEAgLTk5LDkgKzk2LDYgQEAKICAgfQogCiAgIHB1YmxpYyBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGdldEZvckIoZmluYWwgaW50IGxpbmVOYnIpIHsKLSAgICBpZiAobGluZU5iciA9PSAwKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgfQogICAgIGlmIChmb3JCID09IG51bGwpIHsKICAgICAgIGZvckIgPSBpbmRleChiKTsKICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjI4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuamF2YQpAQCAtMCwwICsxLDgyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdCB7CisgIHByb3RlY3RlZCBMaXN0PEVycm9yPiBlcnJvcnM7CisKKyAgcHVibGljIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0KCkgeworICAgIGVycm9ycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkRXJyb3IoRXJyb3IgZSkgeworICAgIGVycm9ycy5hZGQoZSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxFcnJvcj4gZ2V0RXJyb3JzKCkgeworICAgIHJldHVybiBlcnJvcnM7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7CisgICAgcmV0dXJuICFlcnJvcnMuaXNFbXB0eSgpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvciB7CisgICAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUgeworICAgICAgLyoqIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIGFscmVhZHkgc2NoZWR1bGVkIGZvciB0aGlzIHByb2plY3QgKi8KKyAgICAgIEdDX0FMUkVBRFlfU0NIRURVTEVELAorCisgICAgICAvKiogVGhlIHJlcG9zaXRvcnkgd2FzIG5vdCBmb3VuZC4gKi8KKyAgICAgIFJFUE9TSVRPUllfTk9UX0ZPVU5ELAorCisgICAgICAvKiogVGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24gZmFpbGVkLiAqLworICAgICAgR0NfRkFJTEVECisgICAgfQorCisgICAgcHJvdGVjdGVkIFR5cGUgdHlwZTsKKyAgICBwcm90ZWN0ZWQgUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lOworCisgICAgcHJvdGVjdGVkIEVycm9yKCkgeworICAgIH0KKworICAgIHB1YmxpYyBFcnJvcihUeXBlIHR5cGUsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSkgeworICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeworICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIFByb2plY3QuTmFtZUtleSBnZXRQcm9qZWN0TmFtZSgpIHsKKyAgICAgIHJldHVybiBwcm9qZWN0TmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGIuYXBwZW5kKHR5cGUpOworICAgICAgaWYgKHByb2plY3ROYW1lICE9IG51bGwpIHsKKyAgICAgICAgYi5hcHBlbmQoIiAiKS5hcHBlbmQocHJvamVjdE5hbWUpOworICAgICAgfQorICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HZXJyaXRDb25maWcuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HZXJyaXRDb25maWcuamF2YQppbmRleCA3YzE2MTI5Li4xNmI5OWRjIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2Vycml0Q29uZmlnLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dlcnJpdENvbmZpZy5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5vcGVuaWQuT3BlbklkUHJvdmlkZXJQYXR0ZXJuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50LkZpZWxkTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CkBAIC0yOCwxMCArMjcsOSBAQAogCiBwdWJsaWMgY2xhc3MgR2Vycml0Q29uZmlnIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKICAgcHJvdGVjdGVkIFN0cmluZyByZWdpc3RlclVybDsKKyAgcHJvdGVjdGVkIFN0cmluZyByZWdpc3RlclRleHQ7CiAgIHByb3RlY3RlZCBTdHJpbmcgaHR0cFBhc3N3b3JkVXJsOwogICBwcm90ZWN0ZWQgU3RyaW5nIHJlcG9ydEJ1Z1VybDsKLSAgcHJvdGVjdGVkIFN0cmluZyBvcGVuSWRTc29Vcmw7Ci0gIHByb3RlY3RlZCBMaXN0PE9wZW5JZFByb3ZpZGVyUGF0dGVybj4gYWxsb3dlZE9wZW5JRHM7CiAKICAgcHJvdGVjdGVkIEdpdHdlYkNvbmZpZyBnaXR3ZWI7CiAgIHByb3RlY3RlZCBib29sZWFuIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50czsKQEAgLTQ1LDEyICs0MywxMiBAQAogICBwcm90ZWN0ZWQgU3RyaW5nIHNzaGRBZGRyZXNzOwogICBwcm90ZWN0ZWQgU3RyaW5nIGVkaXRGdWxsTmFtZVVybDsKICAgcHJvdGVjdGVkIFByb2plY3QuTmFtZUtleSB3aWxkUHJvamVjdDsKLSAgcHJvdGVjdGVkIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKICAgcHJvdGVjdGVkIFNldDxBY2NvdW50LkZpZWxkTmFtZT4gZWRpdGFibGVBY2NvdW50RmllbGRzOwogICBwcm90ZWN0ZWQgTGlzdDxSZWdleEZpbmRSZXBsYWNlPiBjb21tZW50TGlua3M7CiAgIHByb3RlY3RlZCBib29sZWFuIGRvY3VtZW50YXRpb25BdmFpbGFibGU7CiAgIHByb3RlY3RlZCBib29sZWFuIHRlc3RDaGFuZ2VNZXJnZTsKICAgcHJvdGVjdGVkIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lOworICBwcm90ZWN0ZWQgaW50IHN1Z2dlc3RGcm9tOwogCiAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnaXN0ZXJVcmwoKSB7CiAgICAgcmV0dXJuIHJlZ2lzdGVyVXJsOwpAQCAtNjAsNiArNTgsMTQgQEAKICAgICByZWdpc3RlclVybCA9IHU7CiAgIH0KIAorICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lzdGVyVGV4dCgpIHsKKyAgICByZXR1cm4gcmVnaXN0ZXJUZXh0OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0UmVnaXN0ZXJUZXh0KGZpbmFsIFN0cmluZyB0KSB7CisgICAgcmVnaXN0ZXJUZXh0ID0gdDsKKyAgfQorCiAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwb3J0QnVnVXJsKCkgewogICAgIHJldHVybiByZXBvcnRCdWdVcmw7CiAgIH0KQEAgLTg0LDIyICs5MCw2IEBACiAgICAgaHR0cFBhc3N3b3JkVXJsID0gdXJsOwogICB9CiAKLSAgcHVibGljIFN0cmluZyBnZXRPcGVuSWRTc29VcmwoKSB7Ci0gICAgICByZXR1cm4gb3BlbklkU3NvVXJsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0T3BlbklkU3NvVXJsKGZpbmFsIFN0cmluZyB1KSB7Ci0gICAgb3BlbklkU3NvVXJsID0gdTsKLSAgfQotCi0gIHB1YmxpYyBMaXN0PE9wZW5JZFByb3ZpZGVyUGF0dGVybj4gZ2V0QWxsb3dlZE9wZW5JRHMoKSB7Ci0gICAgcmV0dXJuIGFsbG93ZWRPcGVuSURzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0QWxsb3dlZE9wZW5JRHMoTGlzdDxPcGVuSWRQcm92aWRlclBhdHRlcm4+IGwpIHsKLSAgICBhbGxvd2VkT3BlbklEcyA9IGw7Ci0gIH0KLQogICBwdWJsaWMgQXV0aFR5cGUgZ2V0QXV0aFR5cGUoKSB7CiAgICAgcmV0dXJuIGF1dGhUeXBlOwogICB9CkBAIC0xODYsMTQgKzE3Niw2IEBACiAgICAgd2lsZFByb2plY3QgPSB3cDsKICAgfQogCi0gIHB1YmxpYyBBcHByb3ZhbFR5cGVzIGdldEFwcHJvdmFsVHlwZXMoKSB7Ci0gICAgcmV0dXJuIGFwcHJvdmFsVHlwZXM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBcHByb3ZhbFR5cGVzKGZpbmFsIEFwcHJvdmFsVHlwZXMgYXQpIHsKLSAgICBhcHByb3ZhbFR5cGVzID0gYXQ7Ci0gIH0KLQogICBwdWJsaWMgYm9vbGVhbiBjYW5FZGl0KGZpbmFsIEFjY291bnQuRmllbGROYW1lIGYpIHsKICAgICByZXR1cm4gZWRpdGFibGVBY2NvdW50RmllbGRzLmNvbnRhaW5zKGYpOwogICB9CkBAIC0yMzgsNiArMjIwLDE0IEBACiAgICAgdGhpcy5hbm9ueW1vdXNDb3dhcmROYW1lID0gYW5vbnltb3VzQ293YXJkTmFtZTsKICAgfQogCisgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdEZyb20oKSB7CisgICAgcmV0dXJuIHN1Z2dlc3RGcm9tOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0U3VnZ2VzdEZyb20oZmluYWwgaW50IHN1Z2dlc3RGcm9tKSB7CisgICAgdGhpcy5zdWdnZXN0RnJvbSA9IHN1Z2dlc3RGcm9tOworICB9CisKICAgcHVibGljIGJvb2xlYW4gc2l0ZUhhc1VzZXJuYW1lcygpIHsKICAgICBpZiAoZ2V0QXV0aFR5cGUoKSA9PSBBdXRoVHlwZS5DVVNUT01fRVhURU5TSU9OCiAgICAgICAgICYmIGdldEh0dHBQYXNzd29yZFVybCgpICE9IG51bGwKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HaXRXZWJUeXBlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2l0V2ViVHlwZS5qYXZhCmluZGV4IDBlMmU1MGQuLjM1ODA3NzQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HaXRXZWJUeXBlLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dpdFdlYlR5cGUuamF2YQpAQCAtMzYsMTAgKzM2LDEwIEBACiAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoImNnaXQiKSkgewogICAgICAgdHlwZSA9IG5ldyBHaXRXZWJUeXBlKCk7CiAgICAgICB0eXBlLnNldExpbmtOYW1lKCJjZ2l0Iik7Ci0gICAgICB0eXBlLnNldFByb2plY3QoIiR7cHJvamVjdH0vc3VtbWFyeSIpOwotICAgICAgdHlwZS5zZXRSZXZpc2lvbigiJHtwcm9qZWN0fS9jb21taXQvP2lkPSR7Y29tbWl0fSIpOwotICAgICAgdHlwZS5zZXRCcmFuY2goIiR7cHJvamVjdH0vbG9nLz9oPSR7YnJhbmNofSIpOwotICAgICAgdHlwZS5zZXRGaWxlSGlzdG9yeSgiJHtwcm9qZWN0fS9sb2cvJHtmaWxlfT9oPSR7YnJhbmNofSIpOworICAgICAgdHlwZS5zZXRQcm9qZWN0KCIke3Byb2plY3R9LmdpdC9zdW1tYXJ5Iik7CisgICAgICB0eXBlLnNldFJldmlzaW9uKCIke3Byb2plY3R9LmdpdC9jb21taXQvP2lkPSR7Y29tbWl0fSIpOworICAgICAgdHlwZS5zZXRCcmFuY2goIiR7cHJvamVjdH0uZ2l0L2xvZy8/aD0ke2JyYW5jaH0iKTsKKyAgICAgIHR5cGUuc2V0RmlsZUhpc3RvcnkoIiR7cHJvamVjdH0uZ2l0L2xvZy8ke2ZpbGV9P2g9JHticmFuY2h9Iik7CiAKICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiY3VzdG9tIikpIHsKICAgICAgIHR5cGUgPSBuZXcgR2l0V2ViVHlwZSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dsb2JhbENhcGFiaWxpdHkuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9HbG9iYWxDYXBhYmlsaXR5LmphdmEKaW5kZXggODFkNGZjOS4uN2RiNjkxZCAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dsb2JhbENhcGFiaWxpdHkuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR2xvYmFsQ2FwYWJpbGl0eS5qYXZhCkBAIC0yMSw2ICsyMSw5IEBACiAKIC8qKiBTZXJ2ZXIgd2lkZSBjYXBhYmlsaXRpZXMuIFJlcHJlc2VudGVkIGFzIHtAbGluayBQZXJtaXNzaW9ufSBvYmplY3RzLiAqLwogcHVibGljIGNsYXNzIEdsb2JhbENhcGFiaWxpdHkgeworICAvKiogQWJpbGl0eSB0byBhY2Nlc3MgdGhlIGRhdGFiYXNlICh3aXRoIGdzcWwpLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1NfREFUQUJBU0UgPSAiYWNjZXNzRGF0YWJhc2UiOworCiAgIC8qKgogICAgKiBEZW5vdGVzIHRoZSBzZXJ2ZXIncyBhZG1pbmlzdHJhdG9ycy4KICAgICogPHA+CkBAIC0yOCw3ICszMSw3IEBACiAgICAqIGhhcyB0aGlzIGNhcGFiaWxpdHkgY2FuIHBlcmZvcm0gYWxtb3N0IGFueSBvdGhlciBhY3Rpb24sIG9yIGNhbiBncmFudAogICAgKiB0aGVtc2VsdmVzIHRoZSBwb3dlciB0byBwZXJmb3JtIGFueSBvdGhlciBhY3Rpb24gb24gdGhlIHNpdGUuIE1vc3Qgb2YKICAgICogdGhlIG90aGVyIGNhcGFiaWxpdGllcyBhbmQgcGVybWlzc2lvbnMgZmFsbC1iYWNrIHRvIHRoZSBwcmVkaWNhdGUKLSAgICogIk9SIHVzZXIgaGFzIGNhcGFibGl0eSBBRE1JTklTVFJBVEVfU0VSVkVSIi4KKyAgICogIk9SIHVzZXIgaGFzIGNhcGFiaWxpdHkgQURNSU5JU1RSQVRFX1NFUlZFUiIuCiAgICAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRE1JTklTVFJBVEVfU0VSVkVSID0gImFkbWluaXN0cmF0ZVNlcnZlciI7CiAKQEAgLTY0LDYgKzY3LDkgQEAKICAgLyoqIE1heGltdW0gcmVzdWx0IGxpbWl0IHBlciBleGVjdXRlZCBxdWVyeS4gKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTElNSVQgPSAicXVlcnlMaW1pdCI7CiAKKyAgLyoqIENhbiBydW4gdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24uICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9HQyA9ICJydW5HQyI7CisKICAgLyoqIEZvcmNlZnVsbHkgcmVzdGFydCByZXBsaWNhdGlvbiB0byBhbnkgY29uZmlndXJlZCBkZXN0aW5hdGlvbi4gKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfUkVQTElDQVRJT04gPSAic3RhcnRSZXBsaWNhdGlvbiI7CiAKQEAgLTgxLDYgKzg3LDcgQEAKIAogICBzdGF0aWMgewogICAgIE5BTUVTX0FMTCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIE5BTUVTX0FMTC5hZGQoQUNDRVNTX0RBVEFCQVNFKTsKICAgICBOQU1FU19BTEwuYWRkKEFETUlOSVNUUkFURV9TRVJWRVIpOwogICAgIE5BTUVTX0FMTC5hZGQoQ1JFQVRFX0FDQ09VTlQpOwogICAgIE5BTUVTX0FMTC5hZGQoQ1JFQVRFX0dST1VQKTsKQEAgLTkwLDYgKzk3LDcgQEAKICAgICBOQU1FU19BTEwuYWRkKEtJTExfVEFTSyk7CiAgICAgTkFNRVNfQUxMLmFkZChQUklPUklUWSk7CiAgICAgTkFNRVNfQUxMLmFkZChRVUVSWV9MSU1JVCk7CisgICAgTkFNRVNfQUxMLmFkZChSVU5fR0MpOwogICAgIE5BTUVTX0FMTC5hZGQoU1RBUlRfUkVQTElDQVRJT04pOwogICAgIE5BTUVTX0FMTC5hZGQoVklFV19DQUNIRVMpOwogICAgIE5BTUVTX0FMTC5hZGQoVklFV19DT05ORUNUSU9OUyk7CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBBZG1pblNlcnZpY2UuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEFkbWluU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I3ZmEyLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEFkbWluU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1ZGl0LkF1ZGl0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25JblJlcXVpcmVkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5SZW1vdGVKc29uU2VydmljZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJwY0ltcGw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUnBjSW1wbC5WZXJzaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotQFJwY0ltcGwodmVyc2lvbiA9IFZlcnNpb24uVjJfMCkKLXB1YmxpYyBpbnRlcmZhY2UgR3JvdXBBZG1pblNlcnZpY2UgZXh0ZW5kcyBSZW1vdGVKc29uU2VydmljZSB7Ci0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCB2aXNpYmxlR3JvdXBzKEFzeW5jQ2FsbGJhY2s8R3JvdXBMaXN0PiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGNyZWF0ZUdyb3VwKFN0cmluZyBuZXdOYW1lLCBBc3luY0NhbGxiYWNrPEFjY291bnRHcm91cC5JZD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBncm91cERldGFpbChBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8R3JvdXBEZXRhaWw+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgY2hhbmdlR3JvdXBEZXNjcmlwdGlvbihBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGNoYW5nZUdyb3VwT3B0aW9ucyhBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgR3JvdXBPcHRpb25zIGdyb3VwT3B0aW9ucywKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBjaGFuZ2VHcm91cE93bmVyKEFjY291bnRHcm91cC5JZCBncm91cElkLCBTdHJpbmcgbmV3T3duZXJOYW1lLAotICAgICAgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIHJlbmFtZUdyb3VwKEFjY291bnRHcm91cC5JZCBncm91cElkLCBTdHJpbmcgbmV3TmFtZSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8R3JvdXBEZXRhaWw+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgY2hhbmdlR3JvdXBUeXBlKEFjY291bnRHcm91cC5JZCBncm91cElkLCBBY2NvdW50R3JvdXAuVHlwZSBuZXdUeXBlLAotICAgICAgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGFkZEdyb3VwTWVtYmVyKEFjY291bnRHcm91cC5JZCBncm91cElkLCBTdHJpbmcgbmFtZU9yRW1haWwsCi0gICAgICBBc3luY0NhbGxiYWNrPEdyb3VwRGV0YWlsPiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGFkZEdyb3VwSW5jbHVkZShBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgU3RyaW5nIGdyb3VwTmFtZSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8R3JvdXBEZXRhaWw+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgZGVsZXRlR3JvdXBNZW1iZXJzKEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgU2V0PEFjY291bnRHcm91cE1lbWJlci5LZXk+IGtleXMsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBkZWxldGVHcm91cEluY2x1ZGVzKEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgU2V0PEFjY291bnRHcm91cEluY2x1ZGUuS2V5PiBrZXlzLCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERlc2NyaXB0aW9uLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBEZXNjcmlwdGlvbi5qYXZhCmluZGV4IDgyOGJmMjQuLmNjZDUwZmMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERlc2NyaXB0aW9uLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGVzY3JpcHRpb24uamF2YQpAQCAtMTYsNiArMTYsOCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIC8qKgogICogR3JvdXAgbWV0aG9kcyBleHBvc2VkIGJ5IHRoZSBHcm91cEJhY2tlbmQuCiAgKi8KQEAgLTMwLDggKzMyLDIxIEBACiAgICAgLyoqIEByZXR1cm4gdGhlIG5vbi1udWxsIG5hbWUgb2YgdGhlIGdyb3VwLiAqLwogICAgIFN0cmluZyBnZXROYW1lKCk7CiAKLSAgICAvKiogQHJldHVybiB3aGV0aGVyIHRoZSBncm91cCBpcyB2aXNpYmxlIHRvIGFsbCBhY2NvdW50cy4gKi8KLSAgICBib29sZWFuIGlzVmlzaWJsZVRvQWxsKCk7CisgICAgLyoqCisgICAgICogQHJldHVybiBvcHRpb25hbCBlbWFpbCBhZGRyZXNzIHRvIHNlbmQgdG8gdGhlIGdyb3VwJ3MgbWVtYmVycy4gSWYKKyAgICAgKiAgICAgICAgIHByb3ZpZGVkLCBHZXJyaXQgd2lsbCB1c2UgdGhpcyBlbWFpbCBhZGRyZXNzIHRvIHNlbmQKKyAgICAgKiAgICAgICAgIGNoYW5nZSBub3RpZmljYXRpb25zIHRvIHRoZSBncm91cC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0RW1haWxBZGRyZXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIG9wdGlvbmFsIFVSTCB0byBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ3JvdXAuIFR5cGljYWxseSBhIFVSTCB0byBhCisgICAgICogICAgICAgICB3ZWIgcGFnZSB0aGF0IHBlcm1pdHMgdXNlcnMgdG8gYXBwbHkgdG8gam9pbiB0aGUgZ3JvdXAsIG9yIG1hbmFnZQorICAgICAqICAgICAgICAgdGhlaXIgbWVtYmVyc2hpcC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0VXJsKCk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERlc2NyaXB0aW9ucy5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGVzY3JpcHRpb25zLmphdmEKaW5kZXggZTBiYzdkOC4uZjk4NjYwMCAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGVzY3JpcHRpb25zLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGVzY3JpcHRpb25zLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIAogaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CkBAIC00NCwxMyArNDUsMjAgQEAKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGVUb0FsbCgpIHsKLSAgICAgICAgcmV0dXJuIGdyb3VwLmlzVmlzaWJsZVRvQWxsKCk7CisgICAgICBwdWJsaWMgQWNjb3VudEdyb3VwIGdldEFjY291bnRHcm91cCgpIHsKKyAgICAgICAgcmV0dXJuIGdyb3VwOwogICAgICAgfQogCiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBBY2NvdW50R3JvdXAgZ2V0QWNjb3VudEdyb3VwKCkgewotICAgICAgICByZXR1cm4gZ3JvdXA7CisgICAgICBATnVsbGFibGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWxBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBATnVsbGFibGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gIiMiICsgUGFnZUxpbmtzLnRvR3JvdXAoZ2V0R3JvdXBVVUlEKCkpOwogICAgICAgfQogICAgIH07CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cERldGFpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGV0YWlsLmphdmEKaW5kZXggMDFjNzk4NS4uMGQyYmU1MSAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGV0YWlsLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwRGV0YWlsLmphdmEKQEAgLTE1LDE3ICsxNSwxNiBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YTsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgR3JvdXBEZXRhaWwgewogICBwdWJsaWMgQWNjb3VudEluZm9DYWNoZSBhY2NvdW50czsKLSAgcHVibGljIEdyb3VwSW5mb0NhY2hlIGdyb3VwczsKICAgcHVibGljIEFjY291bnRHcm91cCBncm91cDsKICAgcHVibGljIExpc3Q8QWNjb3VudEdyb3VwTWVtYmVyPiBtZW1iZXJzOwotICBwdWJsaWMgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlPiBpbmNsdWRlczsKKyAgcHVibGljIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gaW5jbHVkZXM7CiAgIHB1YmxpYyBHcm91cFJlZmVyZW5jZSBvd25lckdyb3VwOwogICBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnk7CiAKQEAgLTM2LDEwICszNSw2IEBACiAgICAgYWNjb3VudHMgPSBjOwogICB9CiAKLSAgcHVibGljIHZvaWQgc2V0R3JvdXBzKEdyb3VwSW5mb0NhY2hlIGMpIHsKLSAgICBncm91cHMgPSBjOwotICB9Ci0KICAgcHVibGljIHZvaWQgc2V0R3JvdXAoQWNjb3VudEdyb3VwIGcpIHsKICAgICBncm91cCA9IGc7CiAgIH0KQEAgLTQ4LDcgKzQzLDcgQEAKICAgICBtZW1iZXJzID0gbTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZT4gaSkgeworICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyhMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IGkpIHsKICAgICBpbmNsdWRlcyA9IGk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwSW5mby5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwSW5mby5qYXZhCmluZGV4IDU0N2E1ZjQuLjFhY2RkOWEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEluZm8uamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBJbmZvLmphdmEKQEAgLTE4LDkgKzE4LDEwIEBACiAKIC8qKiBTdW1tYXJ5IGluZm9ybWF0aW9uIGFib3V0IGFuIHtAbGluayBBY2NvdW50R3JvdXB9LCBmb3Igc2ltcGxlIHRhYnVsYXIgZGlzcGxheXMuICovCiBwdWJsaWMgY2xhc3MgR3JvdXBJbmZvIHsKLSAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5JZCBpZDsKKyAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5VVUlEIHV1aWQ7CiAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKICAgcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgcHJvdGVjdGVkIFN0cmluZyB1cmw7CiAKICAgcHJvdGVjdGVkIEdyb3VwSW5mbygpIHsKICAgfQpAQCAtMzIsOCArMzMsOCBAQAogICAgKiBsb29rdXAgaGFzIGZhaWxlZCBhbmQgYSBzdGFsZSBncm91cCBpZCBoYXMgYmVlbiBkaXNjb3ZlcmVkIGluIHRoZSBkYXRhCiAgICAqIHN0b3JlLgogICAgKi8KLSAgcHVibGljIEdyb3VwSW5mbyhmaW5hbCBBY2NvdW50R3JvdXAuSWQgaWQpIHsKLSAgICB0aGlzLmlkID0gaWQ7CisgIHB1YmxpYyBHcm91cEluZm8oZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgeworICAgIHRoaXMudXVpZCA9IHV1aWQ7CiAgIH0KIAogICAvKioKQEAgLTQxLDE1ICs0MiwyMCBAQAogICAgKgogICAgKiBAcGFyYW0gYSB0aGUgZGF0YSBzdG9yZSByZWNvcmQgaG9sZGluZyB0aGUgc3BlY2lmaWMgZ3JvdXAgZGV0YWlscy4KICAgICovCi0gIHB1YmxpYyBHcm91cEluZm8oZmluYWwgQWNjb3VudEdyb3VwIGEpIHsKLSAgICBpZCA9IGEuZ2V0SWQoKTsKKyAgcHVibGljIEdyb3VwSW5mbyhHcm91cERlc2NyaXB0aW9uLkJhc2ljIGEpIHsKKyAgICB1dWlkID0gYS5nZXRHcm91cFVVSUQoKTsKICAgICBuYW1lID0gYS5nZXROYW1lKCk7Ci0gICAgZGVzY3JpcHRpb24gPSBhLmdldERlc2NyaXB0aW9uKCk7CisgICAgdXJsID0gYS5nZXRVcmwoKTsKKworICAgIGlmIChhIGluc3RhbmNlb2YgR3JvdXBEZXNjcmlwdGlvbi5JbnRlcm5hbCkgeworICAgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gKChHcm91cERlc2NyaXB0aW9uLkludGVybmFsKSBhKS5nZXRBY2NvdW50R3JvdXAoKTsKKyAgICAgIGRlc2NyaXB0aW9uID0gZ3JvdXAuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICB9CiAgIH0KIAogICAvKiogQHJldHVybiB0aGUgdW5pcXVlIGxvY2FsIGlkIG9mIHRoZSBncm91cCAqLwotICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldElkKCkgewotICAgIHJldHVybiBpZDsKKyAgcHVibGljIEFjY291bnRHcm91cC5VVUlEIGdldElkKCkgeworICAgIHJldHVybiB1dWlkOwogICB9CiAKICAgLyoqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGdyb3VwOyBudWxsIGlmIG5vdCBzdXBwbGllZCAqLwpAQCAtNjEsNCArNjcsOCBAQAogICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewogICAgIHJldHVybiBkZXNjcmlwdGlvbjsKICAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgIHJldHVybiB1cmw7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cEluZm9DYWNoZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwSW5mb0NhY2hlLmphdmEKaW5kZXggNmE1ZGQ1Yy4uMDg1OTczYyAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwSW5mb0NhY2hlLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwSW5mb0NhY2hlLmphdmEKQEAgLTMzLDEzICszMywxMyBAQAogICAgIHJldHVybiBFTVBUWTsKICAgfQogCi0gIHByb3RlY3RlZCBNYXA8QWNjb3VudEdyb3VwLklkLCBHcm91cEluZm8+IGdyb3VwczsKKyAgcHJvdGVjdGVkIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgR3JvdXBJbmZvPiBncm91cHM7CiAKICAgcHJvdGVjdGVkIEdyb3VwSW5mb0NhY2hlKCkgewogICB9CiAKICAgcHVibGljIEdyb3VwSW5mb0NhY2hlKGZpbmFsIEl0ZXJhYmxlPEdyb3VwSW5mbz4gbGlzdCkgewotICAgIGdyb3VwcyA9IG5ldyBIYXNoTWFwPEFjY291bnRHcm91cC5JZCwgR3JvdXBJbmZvPigpOworICAgIGdyb3VwcyA9IG5ldyBIYXNoTWFwPEFjY291bnRHcm91cC5VVUlELCBHcm91cEluZm8+KCk7CiAgICAgZm9yIChmaW5hbCBHcm91cEluZm8gZ2kgOiBsaXN0KSB7CiAgICAgICBncm91cHMucHV0KGdpLmdldElkKCksIGdpKTsKICAgICB9CkBAIC01OCwxNSArNTgsMTUgQEAKICAgICogQHBhcmFtIGlkIHRoZSBpZCBkZXNpcmVkLgogICAgKiBAcmV0dXJuIGluZm8gYmxvY2sgZm9yIHRoZSBncm91cC4KICAgICovCi0gIHB1YmxpYyBHcm91cEluZm8gZ2V0KGZpbmFsIEFjY291bnRHcm91cC5JZCBpZCkgewotICAgIGlmIChpZCA9PSBudWxsKSB7CisgIHB1YmxpYyBHcm91cEluZm8gZ2V0KGZpbmFsIEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKKyAgICBpZiAodXVpZCA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBHcm91cEluZm8gciA9IGdyb3Vwcy5nZXQoaWQpOworICAgIEdyb3VwSW5mbyByID0gZ3JvdXBzLmdldCh1dWlkKTsKICAgICBpZiAociA9PSBudWxsKSB7Ci0gICAgICByID0gbmV3IEdyb3VwSW5mbyhpZCk7Ci0gICAgICBncm91cHMucHV0KGlkLCByKTsKKyAgICAgIHIgPSBuZXcgR3JvdXBJbmZvKHV1aWQpOworICAgICAgZ3JvdXBzLnB1dCh1dWlkLCByKTsKICAgICB9CiAgICAgcmV0dXJuIHI7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cExpc3QuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Hcm91cExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwOTVjZC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBHcm91cExpc3QgewotICBwcm90ZWN0ZWQgTGlzdDxBY2NvdW50R3JvdXA+IGdyb3VwczsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuQ3JlYXRlR3JvdXA7Ci0KLSAgcHJvdGVjdGVkIEdyb3VwTGlzdCgpIHsKLSAgfQotCi0gIHB1YmxpYyBHcm91cExpc3QoZmluYWwgTGlzdDxBY2NvdW50R3JvdXA+IGdyb3VwcywgZmluYWwgYm9vbGVhbiBjYW5DcmVhdGVHcm91cCkgewotICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOwotICAgIHRoaXMuY2FuQ3JlYXRlR3JvdXAgPSBjYW5DcmVhdGVHcm91cDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0PEFjY291bnRHcm91cD4gZ2V0R3JvdXBzKCkgewotICAgIHJldHVybiBncm91cHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHcm91cHMoTGlzdDxBY2NvdW50R3JvdXA+IGdyb3VwcykgewotICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDYW5DcmVhdGVHcm91cCgpIHsKLSAgICByZXR1cm4gY2FuQ3JlYXRlR3JvdXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDYW5DcmVhdGVHcm91cChib29sZWFuIHNldCkgewotICAgIGNhbkNyZWF0ZUdyb3VwID0gc2V0OwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBPcHRpb25zLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvR3JvdXBPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZWQ3ODEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0dyb3VwT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLQotLyoqCi0gKiBPcHRpb25zIGZvciBhbiB7QGxpbmsgQWNjb3VudEdyb3VwfS4KLSAqLwotcHVibGljIGNsYXNzIEdyb3VwT3B0aW9ucyB7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIHZpc2libGVUb0FsbDsKLQotICBwcm90ZWN0ZWQgR3JvdXBPcHRpb25zKCkgewotICB9Ci0KLSAgcHVibGljIEdyb3VwT3B0aW9ucyhmaW5hbCBib29sZWFuIHZpc2libGVUb0FsbCkgewotICAgIHRoaXMudmlzaWJsZVRvQWxsID0gdmlzaWJsZVRvQWxsOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlVG9BbGwoKSB7Ci0gICAgcmV0dXJuIHZpc2libGVUb0FsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0hvc3RQYWdlRGF0YS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0hvc3RQYWdlRGF0YS5qYXZhCmluZGV4IGY5OTFmNGMuLmYwMTRmNWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Ib3N0UGFnZURhdGEuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvSG9zdFBhZ2VEYXRhLmphdmEKQEAgLTE3LDEzICsxNywxNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RGlmZlByZWZlcmVuY2U7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogLyoqIERhdGEgc2VudCBhcyBwYXJ0IG9mIHRoZSBob3N0IHBhZ2UsIHRvIGJvb3RzdHJhcCB0aGUgVUkuICovCiBwdWJsaWMgY2xhc3MgSG9zdFBhZ2VEYXRhIHsKICAgcHVibGljIEFjY291bnQgYWNjb3VudDsKICAgcHVibGljIEFjY291bnREaWZmUHJlZmVyZW5jZSBhY2NvdW50RGlmZlByZWY7Ci0gIHB1YmxpYyBTdHJpbmcgeHNyZlRva2VuOworICBwdWJsaWMgU3RyaW5nIHhHZXJyaXRBdXRoOwogICBwdWJsaWMgR2Vycml0Q29uZmlnIGNvbmZpZzsKICAgcHVibGljIFRoZW1lIHRoZW1lOworICBwdWJsaWMgTGlzdDxTdHJpbmc+IHBsdWdpbnM7CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaGVtZSB7CiAgICAgcHVibGljIFN0cmluZyBiYWNrZ3JvdW5kQ29sb3I7CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxUeXBlLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhZTE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9MYWJlbFR5cGUuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBMYWJlbFR5cGUgeworICBwdWJsaWMgc3RhdGljIExhYmVsVHlwZSB3aXRoRGVmYXVsdFZhbHVlcyhTdHJpbmcgbmFtZSkgeworICAgIGNoZWNrTmFtZShuYW1lKTsKKyAgICBMaXN0PExhYmVsVmFsdWU+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8TGFiZWxWYWx1ZT4oMik7CisgICAgdmFsdWVzLmFkZChuZXcgTGFiZWxWYWx1ZSgoc2hvcnQpIDAsICJSZWplY3RlZCIpKTsKKyAgICB2YWx1ZXMuYWRkKG5ldyBMYWJlbFZhbHVlKChzaG9ydCkgMSwgIkFwcHJvdmVkIikpOworICAgIHJldHVybiBuZXcgTGFiZWxUeXBlKG5hbWUsIHZhbHVlcyk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgaWYgKCJTVUJNIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgIlJlc2VydmVkIGxhYmVsIG5hbWUgXCIiICsgbmFtZSArICJcIiIpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgICAgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICBpZiAoISgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8CisgICAgICAgICAgICAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8CisgICAgICAgICAgICAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8CisgICAgICAgICAgICBjID09ICctJykpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJJbGxlZ2FsIGxhYmVsIG5hbWUgXCIiICsgbmFtZSArICJcIiIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmFtZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlZmF1bHRBYmJyZXZpYXRpb24oU3RyaW5nIG5hbWUpIHsKKyAgICBTdHJpbmdCdWlsZGVyIGFiYnIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICBjaGFyIGMgPSBuYW1lLmNoYXJBdChpKTsKKyAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgICAgICBhYmJyLmFwcGVuZChjKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGFiYnIubGVuZ3RoKCkgPT0gMCkgeworICAgICAgYWJici5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKG5hbWUuY2hhckF0KDApKSk7CisgICAgfQorICAgIHJldHVybiBhYmJyLnRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBMaXN0PExhYmVsVmFsdWU+IHNvcnRWYWx1ZXMoTGlzdDxMYWJlbFZhbHVlPiB2YWx1ZXMpIHsKKyAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PExhYmVsVmFsdWU+KHZhbHVlcyk7CisgICAgaWYgKHZhbHVlcy5zaXplKCkgPD0gMSkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodmFsdWVzKTsKKyAgICB9CisgICAgQ29sbGVjdGlvbnMuc29ydCh2YWx1ZXMsIG5ldyBDb21wYXJhdG9yPExhYmVsVmFsdWU+KCkgeworICAgICAgcHVibGljIGludCBjb21wYXJlKExhYmVsVmFsdWUgbzEsIExhYmVsVmFsdWUgbzIpIHsKKyAgICAgICAgcmV0dXJuIG8xLmdldFZhbHVlKCkgLSBvMi5nZXRWYWx1ZSgpOworICAgICAgfQorICAgIH0pOworICAgIHNob3J0IG1pbiA9IHZhbHVlcy5nZXQoMCkuZ2V0VmFsdWUoKTsKKyAgICBzaG9ydCBtYXggPSB2YWx1ZXMuZ2V0KHZhbHVlcy5zaXplKCkgLSAxKS5nZXRWYWx1ZSgpOworICAgIHNob3J0IHYgPSBtaW47CisgICAgc2hvcnQgaSA9IDA7CisgICAgTGlzdDxMYWJlbFZhbHVlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PExhYmVsVmFsdWU+KG1heCAtIG1pbiArIDEpOworICAgIC8vIEZpbGwgaW4gYW55IG1pc3NpbmcgdmFsdWVzIHdpdGggZW1wdHkgdGV4dC4KKyAgICB3aGlsZSAoaSA8IHZhbHVlcy5zaXplKCkpIHsKKyAgICAgIHdoaWxlICh2IDwgdmFsdWVzLmdldChpKS5nZXRWYWx1ZSgpKSB7CisgICAgICAgIHJlc3VsdC5hZGQobmV3IExhYmVsVmFsdWUodisrLCAiIikpOworICAgICAgfQorICAgICAgdisrOworICAgICAgcmVzdWx0LmFkZCh2YWx1ZXMuZ2V0KGkrKykpOworICAgIH0KKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQpOworICB9CisKKyAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOworCisgIHByb3RlY3RlZCBTdHJpbmcgYWJicmV2aWF0aW9uOworICBwcm90ZWN0ZWQgU3RyaW5nIGZ1bmN0aW9uTmFtZTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gY29weU1pblNjb3JlOworCisgIHByb3RlY3RlZCBMaXN0PExhYmVsVmFsdWU+IHZhbHVlczsKKyAgcHJvdGVjdGVkIHNob3J0IG1heE5lZ2F0aXZlOworICBwcm90ZWN0ZWQgc2hvcnQgbWF4UG9zaXRpdmU7CisKKyAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBjYW5PdmVycmlkZTsKKyAgcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxJbnRlZ2VyPiBpbnRMaXN0OworICBwcml2YXRlIHRyYW5zaWVudCBNYXA8U2hvcnQsIExhYmVsVmFsdWU+IGJ5VmFsdWU7CisKKyAgcHJvdGVjdGVkIExhYmVsVHlwZSgpIHsKKyAgfQorCisgIHB1YmxpYyBMYWJlbFR5cGUoU3RyaW5nIG5hbWUsIExpc3Q8TGFiZWxWYWx1ZT4gdmFsdWVMaXN0KSB7CisgICAgdGhpcy5uYW1lID0gY2hlY2tOYW1lKG5hbWUpOworICAgIGNhbk92ZXJyaWRlID0gdHJ1ZTsKKyAgICB2YWx1ZXMgPSBzb3J0VmFsdWVzKHZhbHVlTGlzdCk7CisKKyAgICBhYmJyZXZpYXRpb24gPSBkZWZhdWx0QWJicmV2aWF0aW9uKG5hbWUpOworICAgIGZ1bmN0aW9uTmFtZSA9ICJNYXhXaXRoQmxvY2siOworCisgICAgbWF4TmVnYXRpdmUgPSBTaG9ydC5NSU5fVkFMVUU7CisgICAgbWF4UG9zaXRpdmUgPSBTaG9ydC5NQVhfVkFMVUU7CisgICAgaWYgKHZhbHVlcy5zaXplKCkgPiAwKSB7CisgICAgICBpZiAodmFsdWVzLmdldCgwKS5nZXRWYWx1ZSgpIDwgMCkgeworICAgICAgICBtYXhOZWdhdGl2ZSA9IHZhbHVlcy5nZXQoMCkuZ2V0VmFsdWUoKTsKKyAgICAgIH0KKyAgICAgIGlmICh2YWx1ZXMuZ2V0KHZhbHVlcy5zaXplKCkgLSAxKS5nZXRWYWx1ZSgpID4gMCkgeworICAgICAgICBtYXhQb3NpdGl2ZSA9IHZhbHVlcy5nZXQodmFsdWVzLnNpemUoKSAtIDEpLmdldFZhbHVlKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhQYXRjaFNldEFwcHJvdmFsIHBzYSkgeworICAgIHJldHVybiBwc2EuZ2V0TGFiZWxJZCgpLmdldCgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldEFiYnJldmlhdGlvbigpIHsKKyAgICByZXR1cm4gYWJicmV2aWF0aW9uOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0QWJicmV2aWF0aW9uKFN0cmluZyBhYmJyZXZpYXRpb24pIHsKKyAgICB0aGlzLmFiYnJldmlhdGlvbiA9IGFiYnJldmlhdGlvbjsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKCkgeworICAgIHJldHVybiBmdW5jdGlvbk5hbWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbk5hbWUoU3RyaW5nIGZ1bmN0aW9uTmFtZSkgeworICAgIHRoaXMuZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY2FuT3ZlcnJpZGUoKSB7CisgICAgcmV0dXJuIGNhbk92ZXJyaWRlOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0Q2FuT3ZlcnJpZGUoYm9vbGVhbiBjYW5PdmVycmlkZSkgeworICAgIHRoaXMuY2FuT3ZlcnJpZGUgPSBjYW5PdmVycmlkZTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PExhYmVsVmFsdWU+IGdldFZhbHVlcygpIHsKKyAgICByZXR1cm4gdmFsdWVzOworICB9CisKKyAgcHVibGljIExhYmVsVmFsdWUgZ2V0TWluKCkgeworICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlcy5nZXQoMCk7CisgIH0KKworICBwdWJsaWMgTGFiZWxWYWx1ZSBnZXRNYXgoKSB7CisgICAgaWYgKHZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBmaW5hbCBMYWJlbFZhbHVlIHYgPSB2YWx1ZXMuZ2V0KHZhbHVlcy5zaXplKCkgLSAxKTsKKyAgICByZXR1cm4gdi5nZXRWYWx1ZSgpID4gMCA/IHYgOiBudWxsOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNDb3B5TWluU2NvcmUoKSB7CisgICAgcmV0dXJuIGNvcHlNaW5TY29yZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldENvcHlNaW5TY29yZShib29sZWFuIGNvcHlNaW5TY29yZSkgeworICAgIHRoaXMuY29weU1pblNjb3JlID0gY29weU1pblNjb3JlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNNYXhOZWdhdGl2ZShQYXRjaFNldEFwcHJvdmFsIGNhKSB7CisgICAgcmV0dXJuIG1heE5lZ2F0aXZlID09IGNhLmdldFZhbHVlKCk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc01heFBvc2l0aXZlKFBhdGNoU2V0QXBwcm92YWwgY2EpIHsKKyAgICByZXR1cm4gbWF4UG9zaXRpdmUgPT0gY2EuZ2V0VmFsdWUoKTsKKyAgfQorCisgIHB1YmxpYyBMYWJlbFZhbHVlIGdldFZhbHVlKHNob3J0IHZhbHVlKSB7CisgICAgaW5pdEJ5VmFsdWUoKTsKKyAgICByZXR1cm4gYnlWYWx1ZS5nZXQodmFsdWUpOworICB9CisKKyAgcHVibGljIExhYmVsVmFsdWUgZ2V0VmFsdWUoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYSkgeworICAgIGluaXRCeVZhbHVlKCk7CisgICAgcmV0dXJuIGJ5VmFsdWUuZ2V0KGNhLmdldFZhbHVlKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluaXRCeVZhbHVlKCkgeworICAgIGlmIChieVZhbHVlID09IG51bGwpIHsKKyAgICAgIGJ5VmFsdWUgPSBuZXcgSGFzaE1hcDxTaG9ydCwgTGFiZWxWYWx1ZT4oKTsKKyAgICAgIGZvciAoZmluYWwgTGFiZWxWYWx1ZSB2IDogdmFsdWVzKSB7CisgICAgICAgIGJ5VmFsdWUucHV0KHYuZ2V0VmFsdWUoKSwgdik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHVibGljIExpc3Q8SW50ZWdlcj4gZ2V0VmFsdWVzQXNMaXN0KCkgeworICAgIGlmIChpbnRMaXN0ID09IG51bGwpIHsKKyAgICAgIGludExpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KHZhbHVlcy5zaXplKCkpOworICAgICAgZm9yIChMYWJlbFZhbHVlIHYgOiB2YWx1ZXMpIHsKKyAgICAgICAgaW50TGlzdC5hZGQoSW50ZWdlci52YWx1ZU9mKHYuZ2V0VmFsdWUoKSkpOworICAgICAgfQorICAgICAgQ29sbGVjdGlvbnMuc29ydChpbnRMaXN0KTsKKyAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoaW50TGlzdCk7CisgICAgfQorICAgIHJldHVybiBpbnRMaXN0OworICB9CisKKyAgcHVibGljIExhYmVsSWQgZ2V0TGFiZWxJZCgpIHsKKyAgICByZXR1cm4gbmV3IExhYmVsSWQobmFtZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobmFtZSkuYXBwZW5kKCdbJyk7CisgICAgTGFiZWxWYWx1ZSBtaW4gPSBnZXRNaW4oKTsKKyAgICBMYWJlbFZhbHVlIG1heCA9IGdldE1heCgpOworICAgIGlmIChtaW4gIT0gbnVsbCAmJiBtYXggIT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKG5ldyBQZXJtaXNzaW9uUmFuZ2UoUGVybWlzc2lvbi5mb3JMYWJlbChuYW1lKSwgbWluLmdldFZhbHVlKCksCisgICAgICAgICAgbWF4LmdldFZhbHVlKCkpLnRvU3RyaW5nKCkudHJpbSgpKTsKKyAgICB9IGVsc2UgaWYgKG1pbiAhPSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQobWluLmZvcm1hdFZhbHVlKCkudHJpbSgpKTsKKyAgICB9IGVsc2UgaWYgKG1heCAhPSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQobWF4LmZvcm1hdFZhbHVlKCkudHJpbSgpKTsKKyAgICB9CisgICAgc2IuYXBwZW5kKCddJyk7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9MYWJlbFR5cGVzLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxUeXBlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YTQ1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvTGFiZWxUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGE7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbC5MYWJlbElkOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIExhYmVsVHlwZXMgeworICBwcm90ZWN0ZWQgTGlzdDxMYWJlbFR5cGU+IGxhYmVsVHlwZXM7CisgIHByaXZhdGUgdHJhbnNpZW50IE1hcDxTdHJpbmcsIExhYmVsVHlwZT4gYnlMYWJlbDsKKyAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFN0cmluZywgSW50ZWdlcj4gcG9zaXRpb25zOworCisgIHByb3RlY3RlZCBMYWJlbFR5cGVzKCkgeworICB9CisKKyAgcHVibGljIExhYmVsVHlwZXMoZmluYWwgTGlzdDw/IGV4dGVuZHMgTGFiZWxUeXBlPiBhcHByb3ZhbHMpIHsKKyAgICBsYWJlbFR5cGVzID0KKyAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PExhYmVsVHlwZT4oYXBwcm92YWxzKSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxMYWJlbFR5cGU+IGdldExhYmVsVHlwZXMoKSB7CisgICAgcmV0dXJuIGxhYmVsVHlwZXM7CisgIH0KKworICBwdWJsaWMgTGFiZWxUeXBlIGJ5TGFiZWwoTGFiZWxJZCBsYWJlbElkKSB7CisgICAgcmV0dXJuIGJ5TGFiZWwoKS5nZXQobGFiZWxJZC5nZXQoKS50b0xvd2VyQ2FzZSgpKTsKKyAgfQorCisgIHB1YmxpYyBMYWJlbFR5cGUgYnlMYWJlbChTdHJpbmcgbGFiZWxOYW1lKSB7CisgICAgcmV0dXJuIGJ5TGFiZWwoKS5nZXQobGFiZWxOYW1lLnRvTG93ZXJDYXNlKCkpOworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYWJlbFR5cGU+IGJ5TGFiZWwoKSB7CisgICAgaWYgKGJ5TGFiZWwgPT0gbnVsbCkgeworICAgICAgYnlMYWJlbCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGFiZWxUeXBlPigpOworICAgICAgaWYgKGxhYmVsVHlwZXMgIT0gbnVsbCkgeworICAgICAgICBmb3IgKExhYmVsVHlwZSB0IDogbGFiZWxUeXBlcykgeworICAgICAgICAgIGJ5TGFiZWwucHV0KHQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCksIHQpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBieUxhYmVsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIGxhYmVsVHlwZXMudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyBDb21wYXJhdG9yPFN0cmluZz4gbmFtZUNvbXBhcmF0b3IoKSB7CisgICAgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gcG9zaXRpb25zID0gcG9zaXRpb25zKCk7CisgICAgcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbGVmdCwgU3RyaW5nIHJpZ2h0KSB7CisgICAgICAgIGludCBscCA9IHBvc2l0aW9uKGxlZnQpOworICAgICAgICBpbnQgcnAgPSBwb3NpdGlvbihyaWdodCk7CisgICAgICAgIGludCBjbXAgPSBscCAtIHJwOworICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICBjbXAgPSBsZWZ0LmNvbXBhcmVUbyhyaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb24oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgSW50ZWdlciBwID0gcG9zaXRpb25zLmdldChuYW1lKTsKKyAgICAgICAgcmV0dXJuIHAgIT0gbnVsbCA/IHAgOiBwb3NpdGlvbnMuc2l6ZSgpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IHBvc2l0aW9ucygpIHsKKyAgICBpZiAocG9zaXRpb25zID09IG51bGwpIHsKKyAgICAgIHBvc2l0aW9ucyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgIGlmIChsYWJlbFR5cGVzICE9IG51bGwpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKExhYmVsVHlwZSB0IDogbGFiZWxUeXBlcykgeworICAgICAgICAgIHBvc2l0aW9ucy5wdXQodC5nZXROYW1lKCksIGkrKyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBvc2l0aW9uczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL0xhYmVsVmFsdWUuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9MYWJlbFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyOWUwNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9MYWJlbFZhbHVlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOworCitwdWJsaWMgY2xhc3MgTGFiZWxWYWx1ZSB7CisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdFZhbHVlKHNob3J0IHZhbHVlKSB7CisgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgcmV0dXJuIFNob3J0LnRvU3RyaW5nKHZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlID09IDApIHsKKyAgICAgIHJldHVybiAiIDAiOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gIisiICsgU2hvcnQudG9TdHJpbmcodmFsdWUpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBzaG9ydCB2YWx1ZTsKKyAgcHJvdGVjdGVkIFN0cmluZyB0ZXh0OworCisgIHB1YmxpYyBMYWJlbFZhbHVlKHNob3J0IHZhbHVlLCBTdHJpbmcgdGV4dCkgeworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB0aGlzLnRleHQgPSB0ZXh0OworICB9CisKKyAgcHJvdGVjdGVkIExhYmVsVmFsdWUoKSB7CisgIH0KKworICBwdWJsaWMgc2hvcnQgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgIHJldHVybiB0ZXh0OworICB9CisKKyAgcHVibGljIFN0cmluZyBmb3JtYXRWYWx1ZSgpIHsKKyAgICByZXR1cm4gZm9ybWF0VmFsdWUodmFsdWUpOworICB9CisKKyAgcHVibGljIFN0cmluZyBmb3JtYXQoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGZvcm1hdFZhbHVlKCkpOworICAgIGlmICghdGV4dC5pc0VtcHR5KCkpIHsKKyAgICAgIHNiLmFwcGVuZCgnICcpLmFwcGVuZCh0ZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gZm9ybWF0KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaERldGFpbFNlcnZpY2UuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaERldGFpbFNlcnZpY2UuamF2YQppbmRleCA5MWVjYjkyLi41YjIzNGM3MSAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoRGV0YWlsU2VydmljZS5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaERldGFpbFNlcnZpY2UuamF2YQpAQCAtMTYsMjIgKzE2LDE1IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXVkaXQuQXVkaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluUmVxdWlyZWQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnREaWZmUHJlZmVyZW5jZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2guS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJlbW90ZUpzb25TZXJ2aWNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUnBjSW1wbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsLlZlcnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKIAogQFJwY0ltcGwodmVyc2lvbiA9IFZlcnNpb24uVjJfMCkKIHB1YmxpYyBpbnRlcmZhY2UgUGF0Y2hEZXRhaWxTZXJ2aWNlIGV4dGVuZHMgUmVtb3RlSnNvblNlcnZpY2UgewpAQCAtNjQsMzMgKzU3LDQgQEAKICAgQEF1ZGl0CiAgIEBTaWduSW5SZXF1aXJlZAogICB2b2lkIGRlbGV0ZURyYWZ0UGF0Y2hTZXQoUGF0Y2hTZXQuSWQgcHNpZCwgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKTsKLQotICBAQXVkaXQKLSAgQFNpZ25JblJlcXVpcmVkCi0gIHZvaWQgcHVibGlzaENvbW1lbnRzKFBhdGNoU2V0LklkIHBzaWQsIFN0cmluZyBtZXNzYWdlLAotICAgICAgU2V0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYXBwcm92YWxzLAotICAgICAgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjayk7Ci0KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIGFkZFJldmlld2VycyhDaGFuZ2UuSWQgaWQsIExpc3Q8U3RyaW5nPiByZXZpZXdlcnMsIGJvb2xlYW4gY29uZmlybWVkLAotICAgICAgQXN5bmNDYWxsYmFjazxSZXZpZXdlclJlc3VsdD4gY2FsbGJhY2spOwotCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCByZW1vdmVSZXZpZXdlcihDaGFuZ2UuSWQgaWQsIEFjY291bnQuSWQgcmV2aWV3ZXJJZCwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8UmV2aWV3ZXJSZXN1bHQ+IGNhbGxiYWNrKTsKLQotICB2b2lkIHVzZXJBcHByb3ZhbHMoU2V0PENoYW5nZS5JZD4gY2lkcywgQWNjb3VudC5JZCBhaWQsCi0gICAgICBBc3luY0NhbGxiYWNrPEFwcHJvdmFsU3VtbWFyeVNldD4gY2FsbGJhY2spOwotCi0gIHZvaWQgc3Ryb25nZXN0QXBwcm92YWxzKFNldDxDaGFuZ2UuSWQ+IGNpZHMsCi0gICAgICBBc3luY0NhbGxiYWNrPEFwcHJvdmFsU3VtbWFyeVNldD4gY2FsbGJhY2spOwotCi0gIC8qKgotICAgKiBVcGRhdGUgdGhlIHJldmlld2VkIHN0YXR1cyBmb3IgdGhlIHBhdGNoLgotICAgKi8KLSAgQEF1ZGl0Ci0gIEBTaWduSW5SZXF1aXJlZAotICB2b2lkIHNldFJldmlld2VkQnlDdXJyZW50VXNlcihLZXkgcGF0Y2hLZXksIGJvb2xlYW4gcmV2aWV3ZWQsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoU2NyaXB0LmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hTY3JpcHQuamF2YQppbmRleCAyMzA4Yjc3Li5mZWNiYjc2IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hTY3JpcHQuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hTY3JpcHQuamF2YQpAQCAtNTMsNiArNTMsNyBAQAogICBwcm90ZWN0ZWQgYm9vbGVhbiBodWdlRmlsZTsKICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50cmFsaW5lRGlmZmVyZW5jZTsKICAgcHJvdGVjdGVkIGJvb2xlYW4gaW50cmFsaW5lRmFpbHVyZTsKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaW50cmFsaW5lVGltZW91dDsKIAogICBwdWJsaWMgUGF0Y2hTY3JpcHQoZmluYWwgQ2hhbmdlLktleSBjaywgZmluYWwgQ2hhbmdlVHlwZSBjdCwgZmluYWwgU3RyaW5nIG9uLAogICAgICAgZmluYWwgU3RyaW5nIG5uLCBmaW5hbCBGaWxlTW9kZSBvbSwgZmluYWwgRmlsZU1vZGUgbm0sCkBAIC02MCw3ICs2MSw3IEBACiAgICAgICBmaW5hbCBTcGFyc2VGaWxlQ29udGVudCBjYSwgZmluYWwgU3BhcnNlRmlsZUNvbnRlbnQgY2IsCiAgICAgICBmaW5hbCBMaXN0PEVkaXQ+IGUsIGZpbmFsIERpc3BsYXlNZXRob2QgbWEsIGZpbmFsIERpc3BsYXlNZXRob2QgbWIsCiAgICAgICBmaW5hbCBDb21tZW50RGV0YWlsIGNkLCBmaW5hbCBMaXN0PFBhdGNoPiBoaXN0LCBmaW5hbCBib29sZWFuIGhmLAotICAgICAgZmluYWwgYm9vbGVhbiBpZCwgZmluYWwgYm9vbGVhbiBpZGYpIHsKKyAgICAgIGZpbmFsIGJvb2xlYW4gaWQsIGZpbmFsIGJvb2xlYW4gaWRmLCBmaW5hbCBib29sZWFuIGlkdCkgewogICAgIGNoYW5nZUlkID0gY2s7CiAgICAgY2hhbmdlVHlwZSA9IGN0OwogICAgIG9sZE5hbWUgPSBvbjsKQEAgLTc5LDYgKzgwLDcgQEAKICAgICBodWdlRmlsZSA9IGhmOwogICAgIGludHJhbGluZURpZmZlcmVuY2UgPSBpZDsKICAgICBpbnRyYWxpbmVGYWlsdXJlID0gaWRmOworICAgIGludHJhbGluZVRpbWVvdXQgPSBpZHQ7CiAgIH0KIAogICBwcm90ZWN0ZWQgUGF0Y2hTY3JpcHQoKSB7CkBAIC0xNTIsNiArMTU0LDEwIEBACiAgICAgcmV0dXJuIGludHJhbGluZUZhaWx1cmU7CiAgIH0KIAorICBwdWJsaWMgYm9vbGVhbiBoYXNJbnRyYWxpbmVUaW1lb3V0KCkgeworICAgIHJldHVybiBpbnRyYWxpbmVUaW1lb3V0OworICB9CisKICAgcHVibGljIGJvb2xlYW4gaXNFeHBhbmRBbGxDb21tZW50cygpIHsKICAgICByZXR1cm4gZGlmZlByZWZzLmlzRXhwYW5kQWxsQ29tbWVudHMoKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoU2V0UHVibGlzaERldGFpbC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1BhdGNoU2V0UHVibGlzaERldGFpbC5qYXZhCmluZGV4IDNjNWM2ODguLmE5YjYzMzUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QYXRjaFNldFB1Ymxpc2hEZXRhaWwuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGF0Y2hTZXRQdWJsaXNoRGV0YWlsLmphdmEKQEAgLTE0LDE1ICsxNCwxMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBQYXRjaFNldFB1Ymxpc2hEZXRhaWwgewpAQCAtMzAsNDMgKzI1LDE2IEBACiAgIHByb3RlY3RlZCBQYXRjaFNldEluZm8gcGF0Y2hTZXRJbmZvOwogICBwcm90ZWN0ZWQgQ2hhbmdlIGNoYW5nZTsKICAgcHJvdGVjdGVkIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZHJhZnRzOwotICBwcm90ZWN0ZWQgTGlzdDxQZXJtaXNzaW9uUmFuZ2U+IGxhYmVsczsKLSAgcHJvdGVjdGVkIExpc3Q8QXBwcm92YWxEZXRhaWw+IGFwcHJvdmFsczsKICAgcHJvdGVjdGVkIExpc3Q8U3VibWl0UmVjb3JkPiBzdWJtaXRSZWNvcmRzOwotICBwcm90ZWN0ZWQgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBnaXZlbjsKKyAgcHJvdGVjdGVkIFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZDsKICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuU3VibWl0OwogCi0gIHB1YmxpYyBMaXN0PFBlcm1pc3Npb25SYW5nZT4gZ2V0TGFiZWxzKCkgewotICAgIHJldHVybiBsYWJlbHM7CisgIHB1YmxpYyB2b2lkIHNldFN1Ym1pdFR5cGVSZWNvcmQoU3VibWl0VHlwZVJlY29yZCBzdWJtaXRUeXBlUmVjb3JkKSB7CisgICAgdGhpcy5zdWJtaXRUeXBlUmVjb3JkID0gc3VibWl0VHlwZVJlY29yZDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHNldExhYmVscyhMaXN0PFBlcm1pc3Npb25SYW5nZT4gbGFiZWxzKSB7Ci0gICAgdGhpcy5sYWJlbHMgPSBsYWJlbHM7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxBcHByb3ZhbERldGFpbD4gZ2V0QXBwcm92YWxzKCkgewotICAgIHJldHVybiBhcHByb3ZhbHM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRBcHByb3ZhbHMoQ29sbGVjdGlvbjxBcHByb3ZhbERldGFpbD4gbGlzdCkgewotICAgIGFwcHJvdmFscyA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxEZXRhaWw+KGxpc3QpOwotICAgIENvbGxlY3Rpb25zLnNvcnQoYXBwcm92YWxzLCBBcHByb3ZhbERldGFpbC5TT1JUKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFN1Ym1pdFJlY29yZHMoTGlzdDxTdWJtaXRSZWNvcmQ+IGFsbCkgewotICAgIHN1Ym1pdFJlY29yZHMgPSBhbGw7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxTdWJtaXRSZWNvcmQ+IGdldFN1Ym1pdFJlY29yZHMoKSB7Ci0gICAgcmV0dXJuIHN1Ym1pdFJlY29yZHM7Ci0gIH0KLQotICBwdWJsaWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBnZXRHaXZlbigpIHsKLSAgICByZXR1cm4gZ2l2ZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHaXZlbihMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGdpdmVuKSB7Ci0gICAgdGhpcy5naXZlbiA9IGdpdmVuOworICBwdWJsaWMgU3VibWl0VHlwZVJlY29yZCBnZXRTdWJtaXRUeXBlUmVjb3JkKCkgeworICAgIHJldHVybiBzdWJtaXRUeXBlUmVjb3JkOwogICB9CiAKICAgcHVibGljIHZvaWQgc2V0QWNjb3VudHMoQWNjb3VudEluZm9DYWNoZSBhY2NvdW50cykgewpAQCAtMTA1LDI0ICs3Myw2IEBACiAgICAgcmV0dXJuIGRyYWZ0czsKICAgfQogCi0gIHB1YmxpYyBQZXJtaXNzaW9uUmFuZ2UgZ2V0UmFuZ2UoZmluYWwgU3RyaW5nIHBlcm1pc3Npb25OYW1lKSB7Ci0gICAgZm9yIChQZXJtaXNzaW9uUmFuZ2UgcyA6IGxhYmVscykgewotICAgICAgaWYgKHMuZ2V0TmFtZSgpLmVxdWFscyhwZXJtaXNzaW9uTmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHM7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgcHVibGljIFBhdGNoU2V0QXBwcm92YWwgZ2V0Q2hhbmdlQXBwcm92YWwoQXBwcm92YWxDYXRlZ29yeS5JZCBpZCkgewotICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogZ2l2ZW4pIHsKLSAgICAgIGlmIChhLmdldENhdGVnb3J5SWQoKS5lcXVhbHMoaWQpKSB7Ci0gICAgICAgIHJldHVybiBhOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCiAgIHB1YmxpYyBib29sZWFuIGNhblN1Ym1pdCgpIHsKICAgICByZXR1cm4gY2FuU3VibWl0OwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGVybWlzc2lvbi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Blcm1pc3Npb24uamF2YQppbmRleCBmZDQwODg4Li4wNTg1NjUxIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUGVybWlzc2lvbi5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QZXJtaXNzaW9uLmphdmEKQEAgLTIzLDE3ICsyMywyMyBAQAogcHVibGljIGNsYXNzIFBlcm1pc3Npb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPFBlcm1pc3Npb24+IHsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJBTkRPTiA9ICJhYmFuZG9uIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFID0gImNyZWF0ZSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9EUkFGVFMgPSAiZGVsZXRlRHJhZnRzIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRURJVF9UT1BJQ19OQU1FID0gImVkaXRUb3BpY05hbWUiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JHRV9BVVRIT1IgPSAiZm9yZ2VBdXRob3IiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JHRV9DT01NSVRURVIgPSAiZm9yZ2VDb21taXR0ZXIiOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JHRV9TRVJWRVIgPSAiZm9yZ2VTZXJ2ZXJBc0NvbW1pdHRlciI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMID0gImxhYmVsLSI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9XTkVSID0gIm93bmVyIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSF9EUkFGVFMgPSAicHVibGlzaERyYWZ0cyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVU0ggPSAicHVzaCI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVU0hfTUVSR0UgPSAicHVzaE1lcmdlIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVTSF9UQUcgPSAicHVzaFRhZyI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVU0hfU0lHTkVEX1RBRyA9ICJwdXNoU2lnbmVkVGFnIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRCA9ICJyZWFkIjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVCQVNFID0gInJlYmFzZSI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRV9SRVZJRVdFUiA9ICJyZW1vdmVSZXZpZXdlciI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQk1JVCA9ICJzdWJtaXQiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSUVXX0RSQUZUUyA9ICJ2aWV3RHJhZnRzIjsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gTkFNRVNfTEM7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBsYWJlbEluZGV4OwpAQCAtNTAsOSArNTYsMTUgQEAKICAgICBOQU1FU19MQy5hZGQoUFVTSC50b0xvd2VyQ2FzZSgpKTsKICAgICBOQU1FU19MQy5hZGQoUFVTSF9NRVJHRS50b0xvd2VyQ2FzZSgpKTsKICAgICBOQU1FU19MQy5hZGQoUFVTSF9UQUcudG9Mb3dlckNhc2UoKSk7CisgICAgTkFNRVNfTEMuYWRkKFBVU0hfU0lHTkVEX1RBRy50b0xvd2VyQ2FzZSgpKTsKICAgICBOQU1FU19MQy5hZGQoTEFCRUwudG9Mb3dlckNhc2UoKSk7CiAgICAgTkFNRVNfTEMuYWRkKFJFQkFTRS50b0xvd2VyQ2FzZSgpKTsKKyAgICBOQU1FU19MQy5hZGQoUkVNT1ZFX1JFVklFV0VSLnRvTG93ZXJDYXNlKCkpOwogICAgIE5BTUVTX0xDLmFkZChTVUJNSVQudG9Mb3dlckNhc2UoKSk7CisgICAgTkFNRVNfTEMuYWRkKFZJRVdfRFJBRlRTLnRvTG93ZXJDYXNlKCkpOworICAgIE5BTUVTX0xDLmFkZChFRElUX1RPUElDX05BTUUudG9Mb3dlckNhc2UoKSk7CisgICAgTkFNRVNfTEMuYWRkKERFTEVURV9EUkFGVFMudG9Mb3dlckNhc2UoKSk7CisgICAgTkFNRVNfTEMuYWRkKFBVQkxJU0hfRFJBRlRTLnRvTG93ZXJDYXNlKCkpOwogCiAgICAgbGFiZWxJbmRleCA9IE5BTUVTX0xDLmluZGV4T2YoUGVybWlzc2lvbi5MQUJFTCk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9QZXJtaXNzaW9uUnVsZS5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Blcm1pc3Npb25SdWxlLmphdmEKaW5kZXggNTk2MDE2NS4uYTdhNjZiMSAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Blcm1pc3Npb25SdWxlLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Blcm1pc3Npb25SdWxlLmphdmEKQEAgLTE2LDYgKzE2LDcgQEAKIAogcHVibGljIGNsYXNzIFBlcm1pc3Npb25SdWxlIGltcGxlbWVudHMgQ29tcGFyYWJsZTxQZXJtaXNzaW9uUnVsZT4gewogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9QVVNIID0gIkZvcmNlIFB1c2giOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9FRElUID0gIkZvcmNlIEVkaXQiOwogICBwdWJsaWMgc3RhdGljIGVudW0gQWN0aW9uIHsKICAgICBBTExPVywgREVOWSwgQkxPQ0ssCiAKQEAgLTI1MSw3ICsyNTIsNyBAQAogICAgIHJldHVybiBydWxlOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlSW50KFN0cmluZyB2YWx1ZSkgeworICBwdWJsaWMgc3RhdGljIGludCBwYXJzZUludChTdHJpbmcgdmFsdWUpIHsKICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgiKyIpKSB7CiAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTsKICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdEFjY2Vzcy5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3RBY2Nlc3MuamF2YQppbmRleCAxODkzODQzLi45MDRjNWM3IDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdEFjY2Vzcy5qYXZhCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0QWNjZXNzLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IG93bmVyT2Y7CiAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29uZmlnVmlzaWJsZTsKICAgcHJvdGVjdGVkIGJvb2xlYW4gY2FuVXBsb2FkOworICBwcm90ZWN0ZWQgTGFiZWxUeXBlcyBsYWJlbFR5cGVzOwogCiAgIHB1YmxpYyBQcm9qZWN0QWNjZXNzKCkgewogICB9CkBAIC0xMDMsNCArMTA0LDEyIEBACiAgIHB1YmxpYyB2b2lkIHNldENhblVwbG9hZChib29sZWFuIGNhblVwbG9hZCkgewogICAgIHRoaXMuY2FuVXBsb2FkID0gY2FuVXBsb2FkOwogICB9CisKKyAgcHVibGljIExhYmVsVHlwZXMgZ2V0TGFiZWxUeXBlcygpIHsKKyAgICByZXR1cm4gbGFiZWxUeXBlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldExhYmVsVHlwZXMoTGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB7CisgICAgdGhpcy5sYWJlbFR5cGVzID0gbGFiZWxUeXBlczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3RBZG1pblNlcnZpY2UuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0QWRtaW5TZXJ2aWNlLmphdmEKaW5kZXggMTNjMGE0OC4uMDYzODkwNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3RBZG1pblNlcnZpY2UuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdEFkbWluU2VydmljZS5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uUmVtb3RlSnNvblNlcnZpY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5ScGNJbXBsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlJwY0ltcGwuVmVyc2lvbjsKIAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtMzUsMTIgKzM0LDYgQEAKICAgdm9pZCBwcm9qZWN0RGV0YWlsKFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwKICAgICAgIEFzeW5jQ2FsbGJhY2s8UHJvamVjdERldGFpbD4gY2FsbGJhY2spOwogCi0gIEBBdWRpdAotICBAU2lnbkluUmVxdWlyZWQKLSAgdm9pZCBjcmVhdGVOZXdQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsCi0gICAgICBib29sZWFuIGVtcHR5Q29tbWl0LCBib29sZWFuIHBlcm1pc3Npb25zT25seSwKLSAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spOwotCiAgIHZvaWQgcHJvamVjdEFjY2VzcyhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUsCiAgICAgICBBc3luY0NhbGxiYWNrPFByb2plY3RBY2Nlc3M+IGNhbGxiYWNrKTsKIApAQCAtNjYsNyArNTksNyBAQAogICBAQXVkaXQKICAgQFNpZ25JblJlcXVpcmVkCiAgIHZvaWQgYWRkQnJhbmNoKFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwgU3RyaW5nIGJyYW5jaE5hbWUsCi0gICAgICBTdHJpbmcgc3RhcnRpbmdSZXZpc2lvbiwgQXN5bmNDYWxsYmFjazxMaXN0QnJhbmNoZXNSZXN1bHQ+IGNhbGxiYWNrKTsKKyAgICAgIFN0cmluZyBzdGFydGluZ1JldmlzaW9uLCBBc3luY0NhbGxiYWNrPEFkZEJyYW5jaFJlc3VsdD4gY2FsbGJhY2spOwogCiAgIEBBdWRpdAogICBAU2lnbkluUmVxdWlyZWQKZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0RGV0YWlsLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUHJvamVjdERldGFpbC5qYXZhCmluZGV4IDFkODhjZjguLjFlNzU4OWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9Qcm9qZWN0RGV0YWlsLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Byb2plY3REZXRhaWwuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkluaGVyaXRlZEJvb2xlYW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiAKIHB1YmxpYyBjbGFzcyBQcm9qZWN0RGV0YWlsIHsKQEAgLTI0LDYgKzI1LDEwIEBACiAgIHB1YmxpYyBib29sZWFuIGNhbk1vZGlmeUFjY2VzczsKICAgcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5U3RhdGU7CiAgIHB1YmxpYyBib29sZWFuIGlzUGVybWlzc2lvbk9ubHk7CisgIHB1YmxpYyBJbmhlcml0ZWRCb29sZWFuIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50czsKKyAgcHVibGljIEluaGVyaXRlZEJvb2xlYW4gdXNlU2lnbmVkT2ZmQnk7CisgIHB1YmxpYyBJbmhlcml0ZWRCb29sZWFuIHVzZUNvbnRlbnRNZXJnZTsKKyAgcHVibGljIEluaGVyaXRlZEJvb2xlYW4gcmVxdWlyZUNoYW5nZUlEOwogCiAgIHB1YmxpYyBQcm9qZWN0RGV0YWlsKCkgewogICB9CkBAIC01NSw0ICs2MCwyMCBAQAogICBwdWJsaWMgdm9pZCBzZXRQZXJtaXNzaW9uT25seShmaW5hbCBib29sZWFuIGlwbykgewogICAgIGlzUGVybWlzc2lvbk9ubHkgPSBpcG87CiAgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoZmluYWwgSW5oZXJpdGVkQm9vbGVhbiB1Y2EpIHsKKyAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSB1Y2E7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVc2VTaWduZWRPZmZCeShmaW5hbCBJbmhlcml0ZWRCb29sZWFuIHVzb2IpIHsKKyAgICB1c2VTaWduZWRPZmZCeSA9IHVzb2I7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVc2VDb250ZW50TWVyZ2UoZmluYWwgSW5oZXJpdGVkQm9vbGVhbiB1Y20pIHsKKyAgICB1c2VDb250ZW50TWVyZ2UgPSB1Y207CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlQ2hhbmdlSUQoZmluYWwgSW5oZXJpdGVkQm9vbGVhbiByY2lkKSB7CisgICAgcmVxdWlyZUNoYW5nZUlEID0gcmNpZDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1JlZkNvbmZpZ1NlY3Rpb24uamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9SZWZDb25maWdTZWN0aW9uLmphdmEKaW5kZXggODEwZTkwNi4uZjc0MDQ2NCAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1JlZkNvbmZpZ1NlY3Rpb24uamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUmVmQ29uZmlnU2VjdGlvbi5qYXZhCkBAIC0yMSw5ICsyMSw2IEBACiAgIC8qKiBQYXR0ZXJuIHRoYXQgbWF0Y2hlcyBhbGwgYnJhbmNoZXMgaW4gYSBwcm9qZWN0LiAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFEUyA9ICJyZWZzL2hlYWRzLyoiOwogCi0gIC8qKiBDb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciBhIHByb2plY3Qge0Bjb2RlIHJlZnMvbWV0YS9jb25maWd9ICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRl9DT05GSUcgPSAicmVmcy9tZXRhL2NvbmZpZyI7Ci0KICAgLyoqIFByZWZpeCB0aGF0IHRyaWdnZXJzIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFR0VYX1BSRUZJWCA9ICJeIjsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Jldmlld1Jlc3VsdC5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1Jldmlld1Jlc3VsdC5qYXZhCmluZGV4IGMwYmY4MTguLjFjODdjNzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9SZXZpZXdSZXN1bHQuamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2RhdGEvUmV2aWV3UmVzdWx0LmphdmEKQEAgLTgyLDcgKzgyLDEwIEBACiAgICAgICBHSVRfRVJST1IsCiAKICAgICAgIC8qKiBUaGUgZGVzdGluYXRpb24gYnJhbmNoIGRvZXMgbm90IGV4aXN0ICovCi0gICAgICBERVNUX0JSQU5DSF9OT1RfRk9VTkQKKyAgICAgIERFU1RfQlJBTkNIX05PVF9GT1VORCwKKworICAgICAgLyoqIE5vdCBwZXJtaXR0ZWQgdG8gZWRpdCB0aGUgdG9waWMgbmFtZSAqLworICAgICAgRURJVF9UT1BJQ19OQU1FX05PVF9QRVJNSVRURUQKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgVHlwZSB0eXBlOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9kYXRhL1N1Ym1pdFR5cGVSZWNvcmQuamF2YSBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9TdWJtaXRUeXBlUmVjb3JkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYTc5OAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZGF0YS9TdWJtaXRUeXBlUmVjb3JkLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBzdWJtaXQgdHlwZSBmb3IgYSBjaGFuZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJtaXRUeXBlUmVjb3JkIHsKKyAgcHVibGljIHN0YXRpYyBlbnVtIFN0YXR1cyB7CisgICAgLyoqIFRoZSB0eXBlIHdhcyBjb21wdXRlZCBzdWNjZXNzZnVsbHkgKi8KKyAgICBPSywKKworICAgIC8qKiBBbiBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQgcHJldmVudGluZyBjb21wdXRhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBBZGRpdGlvbmFsIGRldGFpbCBtYXkgYmUgYXZhaWxhYmxlIGluIHtAbGluayBTdWJtaXRUeXBlUmVjb3JkI2Vycm9yTWVzc2FnZX0KKyAgICAgKi8KKyAgICBSVUxFX0VSUk9SCisgIH0KKworICBwdWJsaWMgc3RhdGljIFN1Ym1pdFR5cGVSZWNvcmQgT0soUHJvamVjdC5TdWJtaXRUeXBlIHR5cGUpIHsKKyAgICBTdWJtaXRUeXBlUmVjb3JkIHIgPSBuZXcgU3VibWl0VHlwZVJlY29yZCgpOworICAgIHIuc3RhdHVzID0gU3RhdHVzLk9LOworICAgIHIudHlwZSA9IHR5cGU7CisgICAgcmV0dXJuIHI7CisgIH0KKworICBwdWJsaWMgU3RhdHVzIHN0YXR1czsKKyAgcHVibGljIFByb2plY3QuU3VibWl0VHlwZSB0eXBlOworICBwdWJsaWMgU3RyaW5nIGVycm9yTWVzc2FnZTsKKworICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZChzdGF0dXMpOworICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzLlJVTEVfRVJST1IgJiYgZXJyb3JNZXNzYWdlICE9IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgnKCcpLmFwcGVuZChlcnJvck1lc3NhZ2UpLmFwcGVuZCgiKSIpOworICAgIH0KKyAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoJ1snKTsKKyAgICAgIHNiLmFwcGVuZCh0eXBlLm5hbWUoKSk7CisgICAgICBzYi5hcHBlbmQoJ10nKTsKKyAgICB9CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL0VtYWlsRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9FbWFpbEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTMzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9FbWFpbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzOworCitwdWJsaWMgY2xhc3MgRW1haWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIk1haWwgRXJyb3I6ICI7CisKKyAgcHVibGljIEVtYWlsRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihNRVNTQUdFICsgbXNnKTsKKyAgfQorCisgIHB1YmxpYyBFbWFpbEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgd2h5KSB7CisgICAgc3VwZXIoTUVTU0FHRSArIG1zZywgd2h5KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9OYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24uamF2YQppbmRleCBhMmQ0ODdiLi5lYTIwZTJlIDEwMDY0NAotLS0gYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9OYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24uamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9OYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24uamF2YQpAQCAtMTgsOSArMTgsOSBAQAogcHVibGljIGNsYXNzIE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiTmFtZSBBbHJlYWR5IFVzZWQiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIk5hbWUgQWxyZWFkeSBVc2VkOiAiOwogCi0gIHB1YmxpYyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKSB7Ci0gICAgc3VwZXIoTUVTU0FHRSk7CisgIHB1YmxpYyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHsKKyAgICBzdXBlcihNRVNTQUdFICsgbmFtZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL05vU3VjaEVudGl0eUV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvTm9TdWNoRW50aXR5RXhjZXB0aW9uLmphdmEKaW5kZXggYzQ3Y2YwNy4uMTgyOWM4YiAxMDA2NDQKLS0tIGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvTm9TdWNoRW50aXR5RXhjZXB0aW9uLmphdmEKKysrIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvTm9TdWNoRW50aXR5RXhjZXB0aW9uLmphdmEKQEAgLTIzLDQgKzIzLDggQEAKICAgcHVibGljIE5vU3VjaEVudGl0eUV4Y2VwdGlvbigpIHsKICAgICBzdXBlcihNRVNTQUdFKTsKICAgfQorCisgIHB1YmxpYyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9lcnJvcnMvUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDc2NTIwYWEuLjBmYWY0OTggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZXJyb3JzL1Blcm1pc3Npb25EZW5pZWRFeGNlcHRpb24uamF2YQorKysgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2Vycm9ycy9QZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzOwogCi0vKiogSW5kaWNhdHMgdGhlIHVzZXIgY2Fubm90IHBlcmZvcm0gdGhpcyB0YXNrLiAqLworLyoqIEluZGljYXRlcyB0aGUgdXNlciBjYW5ub3QgcGVyZm9ybSB0aGlzIHRhc2suICovCiBwdWJsaWMgY2xhc3MgUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2dyb3Vwcy9MaXN0R3JvdXBzT3B0aW9uLmphdmEgYi9nZXJyaXQtY29tbW9uL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL2dyb3Vwcy9MaXN0R3JvdXBzT3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhN2ZkNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1jb21tb24vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vZ3JvdXBzL0xpc3RHcm91cHNPcHRpb24uamF2YQpAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmdyb3VwczsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworCisKKy8qKiBPdXRwdXQgb3B0aW9ucyBhdmFpbGFibGUgd2hlbiB1c2luZyB7QGNvZGUgL2dyb3Vwcy99IFJQQ3MuICovCitwdWJsaWMgZW51bSBMaXN0R3JvdXBzT3B0aW9uIHsKKyAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBvbiB0aGUgZGlyZWN0IGdyb3VwIG1lbWJlcnMuICovCisgIE1FTUJFUlMoMCksCisKKyAgLyoqIFJldHVybiBpbmZvcm1hdGlvbiBvbiB0aGUgZGlyZWN0bHkgaW5jbHVkZWQgZ3JvdXBzLiAqLworICBJTkNMVURFUygxKTsKKworICBwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworICBwcml2YXRlIExpc3RHcm91cHNPcHRpb24oaW50IHYpIHsKKyAgICB0aGlzLnZhbHVlID0gdjsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBFbnVtU2V0PExpc3RHcm91cHNPcHRpb24+IGZyb21CaXRzKGludCB2KSB7CisgICAgRW51bVNldDxMaXN0R3JvdXBzT3B0aW9uPiByID0gRW51bVNldC5ub25lT2YoTGlzdEdyb3Vwc09wdGlvbi5jbGFzcyk7CisgICAgZm9yIChMaXN0R3JvdXBzT3B0aW9uIG8gOiBMaXN0R3JvdXBzT3B0aW9uLnZhbHVlcygpKSB7CisgICAgICBpZiAoKHYgJiAoMSA8PCBvLnZhbHVlKSkgIT0gMCkgeworICAgICAgICByLmFkZChvKTsKKyAgICAgICAgdiAmPSB+KDEgPDwgby52YWx1ZSk7CisgICAgICB9CisgICAgICBpZiAodiA9PSAwKSB7CisgICAgICAgIHJldHVybiByOworICAgICAgfQorICAgIH0KKyAgICBpZiAodiAhPSAwKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duICIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKHYpKTsKKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGludCB0b0JpdHMoRW51bVNldDxMaXN0R3JvdXBzT3B0aW9uPiBzZXQpIHsKKyAgICBpbnQgciA9IDA7CisgICAgZm9yIChMaXN0R3JvdXBzT3B0aW9uIG8gOiBzZXQpIHsKKyAgICAgIHIgfD0gMSA8PCBvLnZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmluZGV4IDQ3MDk0MmQuLjk0MWZiMzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1leHRlbnNpb24tYXBpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKQEAgLTcsNiArNyw3IEBACiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT1pZ25vcmUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9d2FybmluZwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvcG9tLnhtbCBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3BvbS54bWwKaW5kZXggZmY2NzJkNS4uOTU2ZGI1YSAxMDA2NDQKLS0tIGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvcG9tLnhtbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtZXh0ZW5zaW9uLWFwaTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9ldmVudHMvR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvZXZlbnRzL0dpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5qYXZhCmluZGV4IDQzODUwMGQuLjI5MTFkZWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9ldmVudHMvR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyLmphdmEKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL2V2ZW50cy9HaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIuamF2YQpAQCAtMjMsNiArMjMsOCBAQAogcHVibGljIGludGVyZmFjZSBHaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIgewogICBwdWJsaWMgaW50ZXJmYWNlIFVwZGF0ZSB7CiAgICAgU3RyaW5nIGdldFJlZk5hbWUoKTsKKyAgICBTdHJpbmcgZ2V0T2xkT2JqZWN0SWQoKTsKKyAgICBTdHJpbmcgZ2V0TmV3T2JqZWN0SWQoKTsKICAgfQogCiAgIHB1YmxpYyBpbnRlcmZhY2UgRXZlbnQgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljSXRlbS5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWRjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVnaXN0cmF0aW9uL0R5bmFtaWNJdGVtLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5LZXk7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlzaW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNjb3BlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5iaW5kZXIuTGlua2VkQmluZGluZ0J1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QudXRpbC5Qcm92aWRlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QudXRpbC5UeXBlczsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKKy8qKgorICogQSBzaW5nbGUgaXRlbSB0aGF0IGNhbiBiZSBtb2RpZmllZCBhcyBwbHVnaW5zIHJlbG9hZC4KKyAqIDxwPgorICogRHluYW1pY0l0ZW1zIGFyZSBhbHdheXMgbWFwcGVkIGFzIHNpbmdsZXRvbnMgaW4gR3VpY2UuIEl0ZW1zIHN0b3JlIGEgUHJvdmlkZXIKKyAqIGludGVybmFsbHksIGFuZCByZXNvbHZlIHRoZSBwcm92aWRlciB0byBhbiBpbnN0YW5jZSBvbiBkZW1hbmQuIFRoaXMgZW5hYmxlcworICogcmVnaXN0cmF0aW9ucyB0byBkZWNpZGUgYmV0d2VlbiBzaW5nbGV0b24gYW5kIG5vbi1zaW5nbGV0b24gbWVtYmVycy4gSWYKKyAqIG11bHRpcGxlIHBsdWdpbnMgdHJ5IHRvIHByb3ZpZGUgdGhlIHNhbWUgUHJvdmlkZXIsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgKi8KK3B1YmxpYyBjbGFzcyBEeW5hbWljSXRlbTxUPiB7CisgIC8qKiBQYWlyIG9mIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGFuZCBwbHVnaW4gcHJvdmlkaW5nIGl0LiAqLworICBzdGF0aWMgY2xhc3MgTmFtZWRQcm92aWRlcjxUPiB7CisgICAgZmluYWwgUHJvdmlkZXI8VD4gaW1wbDsKKyAgICBmaW5hbCBTdHJpbmcgcGx1Z2luTmFtZTsKKworICAgIE5hbWVkUHJvdmlkZXIoUHJvdmlkZXI8VD4gcHJvdmlkZXIsIFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgICB0aGlzLmltcGwgPSBwcm92aWRlcjsKKyAgICAgIHRoaXMucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIERlY2xhcmUgYSBzaW5nbGV0b24ge0Bjb2RlIER5bmFtaWNJdGVtPFQ+fSB3aXRoIGEgYmluZGVyLgorICAgKiA8cD4KKyAgICogSXRlbXMgbXVzdCBiZSBkZWZpbmVkIGluIGEgR3VpY2UgbW9kdWxlIGJlZm9yZSB0aGV5IGNhbiBiZSBib3VuZDoKKyAgICogPHByZT4KKyAgICogICBEeW5hbWljSXRlbS5pdGVtT2YoYmluZGVyKCksIEludGVyZmFjZS5jbGFzcyk7CisgICAqICAgRHluYW1pY0l0ZW0uYmluZChiaW5kZXIoKSwgSW50ZXJmYWNlLmNsYXNzKS50byhJbXBsLmNsYXNzKTsKKyAgICogPC9wcmU+CisgICAqCisgICAqIEBwYXJhbSBiaW5kZXIgYSBuZXcgYmluZGVyIGNyZWF0ZWQgaW4gdGhlIG1vZHVsZS4KKyAgICogQHBhcmFtIG1lbWJlciB0eXBlIG9mIGVudHJ5IHRvIHN0b3JlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VD4gdm9pZCBpdGVtT2YoQmluZGVyIGJpbmRlciwgQ2xhc3M8VD4gbWVtYmVyKSB7CisgICAgaXRlbU9mKGJpbmRlciwgVHlwZUxpdGVyYWwuZ2V0KG1lbWJlcikpOworICB9CisKKyAgLyoqCisgICAqIERlY2xhcmUgYSBzaW5nbGV0b24ge0Bjb2RlIER5bmFtaWNJdGVtPFQ+fSB3aXRoIGEgYmluZGVyLgorICAgKiA8cD4KKyAgICogSXRlbXMgbXVzdCBiZSBkZWZpbmVkIGluIGEgR3VpY2UgbW9kdWxlIGJlZm9yZSB0aGV5IGNhbiBiZSBib3VuZDoKKyAgICogPHByZT4KKyAgICogICBEeW5hbWljU2V0Lml0ZW1PZihiaW5kZXIoKSwgbmV3IFR5cGVMaXRlcmFsPFRoaW5nPEZvbz4+KCkge30pOworICAgKiA8L3ByZT4KKyAgICoKKyAgICogQHBhcmFtIGJpbmRlciBhIG5ldyBiaW5kZXIgY3JlYXRlZCBpbiB0aGUgbW9kdWxlLgorICAgKiBAcGFyYW0gbWVtYmVyIHR5cGUgb2YgZW50cnkgdG8gc3RvcmUuCisgICAqLworICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIGl0ZW1PZihCaW5kZXIgYmluZGVyLCBUeXBlTGl0ZXJhbDxUPiBtZW1iZXIpIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBLZXk8RHluYW1pY0l0ZW08VD4+IGtleSA9IChLZXk8RHluYW1pY0l0ZW08VD4+KSBLZXkuZ2V0KAorICAgICAgICBUeXBlcy5uZXdQYXJhbWV0ZXJpemVkVHlwZShEeW5hbWljSXRlbS5jbGFzcywgbWVtYmVyLmdldFR5cGUoKSkpOworICAgIGJpbmRlci5iaW5kKGtleSkKKyAgICAgIC50b1Byb3ZpZGVyKG5ldyBEeW5hbWljSXRlbVByb3ZpZGVyPFQ+KG1lbWJlciwga2V5KSkKKyAgICAgIC5pbihTY29wZXMuU0lOR0xFVE9OKTsKKyAgfQorCisgIC8qKgorICAgKiBCaW5kIG9uZSBpbXBsZW1lbnRhdGlvbiBhcyB0aGUgaXRlbSB1c2luZyBhIHVuaXF1ZSBhbm5vdGF0aW9uLgorICAgKgorICAgKiBAcGFyYW0gYmluZGVyIGEgbmV3IGJpbmRlciBjcmVhdGVkIGluIHRoZSBtb2R1bGUuCisgICAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgZW50cnkgdG8gc3RvcmUuCisgICAqIEByZXR1cm4gYSBiaW5kZXIgdG8gY29udGludWUgY29uZmlndXJpbmcgdGhlIG5ldyBpdGVtLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VD4gTGlua2VkQmluZGluZ0J1aWxkZXI8VD4gYmluZChCaW5kZXIgYmluZGVyLCBDbGFzczxUPiB0eXBlKSB7CisgICAgcmV0dXJuIGJpbmQoYmluZGVyLCBUeXBlTGl0ZXJhbC5nZXQodHlwZSkpOworICB9CisKKyAgLyoqCisgICAqIEJpbmQgb25lIGltcGxlbWVudGF0aW9uIGFzIHRoZSBpdGVtLgorICAgKgorICAgKiBAcGFyYW0gYmluZGVyIGEgbmV3IGJpbmRlciBjcmVhdGVkIGluIHRoZSBtb2R1bGUuCisgICAqIEBwYXJhbSB0eXBlIHR5cGUgb2YgZW50cnkgdG8gc3RvcmUuCisgICAqIEByZXR1cm4gYSBiaW5kZXIgdG8gY29udGludWUgY29uZmlndXJpbmcgdGhlIG5ldyBpdGVtLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyA8VD4gTGlua2VkQmluZGluZ0J1aWxkZXI8VD4gYmluZChCaW5kZXIgYmluZGVyLAorICAgICAgVHlwZUxpdGVyYWw8VD4gdHlwZSkgeworICAgIHJldHVybiBiaW5kZXIuYmluZCh0eXBlKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgS2V5PER5bmFtaWNJdGVtPFQ+PiBrZXk7CisgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPE5hbWVkUHJvdmlkZXI8VD4+IHJlZjsKKworICBEeW5hbWljSXRlbShLZXk8RHluYW1pY0l0ZW08VD4+IGtleSwgUHJvdmlkZXI8VD4gcHJvdmlkZXIsIFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgTmFtZWRQcm92aWRlcjxUPiBpbiA9IG51bGw7CisgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgIGluID0gbmV3IE5hbWVkUHJvdmlkZXI8VD4ocHJvdmlkZXIsIHBsdWdpbk5hbWUpOworICAgIH0KKyAgICB0aGlzLmtleSA9IGtleTsKKyAgICB0aGlzLnJlZiA9IG5ldyBBdG9taWNSZWZlcmVuY2U8TmFtZWRQcm92aWRlcjxUPj4oaW4pOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgY29uZmlndXJlZCBpdGVtLCBvciBudWxsLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIGl0ZW0gaW5zdGFuY2U7IG51bGwgaWYgbm8gaW1wbGVtZW50YXRpb24gaGFzIGJlZW4KKyAgICogICAgICAgICBib3VuZCB0byB0aGUgaXRlbS4gVGhpcyBpcyBjb21tb24gaWYgbm8gcGx1Z2luIHJlZ2lzdGVyZWQgYW4KKyAgICogICAgICAgICBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHR5cGUuCisgICAqLworICBwdWJsaWMgVCBnZXQoKSB7CisgICAgTmFtZWRQcm92aWRlcjxUPiBpdGVtID0gcmVmLmdldCgpOworICAgIHJldHVybiBpdGVtICE9IG51bGwgPyBpdGVtLmltcGwuZ2V0KCkgOiBudWxsOworICB9CisKKyAgLyoqCisgICAqIFNldCB0aGUgZWxlbWVudCB0byBwcm92aWRlLgorICAgKgorICAgKiBAcGFyYW0gaXRlbSB0aGUgaXRlbSB0byB1c2UuIE11c3Qgbm90IGJlIG51bGwuCisgICAqIEBwYXJhbSBwbHVnaW5OYW1lIHRoZSBuYW1lIG9mIHRoZSBwbHVnaW4gcHJvdmlkaW5nIHRoZSBpdGVtLgorICAgKiBAcmV0dXJuIGhhbmRsZSB0byByZW1vdmUgdGhlIGl0ZW0gYXQgYSBsYXRlciBwb2ludCBpbiB0aW1lLgorICAgKi8KKyAgcHVibGljIFJlZ2lzdHJhdGlvbkhhbmRsZSBzZXQoVCBpdGVtLCBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIHJldHVybiBzZXQoUHJvdmlkZXJzLm9mKGl0ZW0pLCBwbHVnaW5OYW1lKTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGVsZW1lbnQgdG8gcHJvdmlkZS4KKyAgICoKKyAgICogQHBhcmFtIGltcGwgdGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBjb2xsZWN0aW9uLiBNdXN0IG5vdCBiZSBudWxsLgorICAgKiBAcGFyYW0gcGx1Z2luTmFtZSBuYW1lIG9mIHRoZSBzb3VyY2UgcHJvdmlkaW5nIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICogQHJldHVybiBoYW5kbGUgdG8gcmVtb3ZlIHRoZSBpdGVtIGF0IGEgbGF0ZXIgcG9pbnQgaW4gdGltZS4KKyAgICovCisgIHB1YmxpYyBSZWdpc3RyYXRpb25IYW5kbGUgc2V0KFByb3ZpZGVyPFQ+IGltcGwsIFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgZmluYWwgTmFtZWRQcm92aWRlcjxUPiBpdGVtID0gbmV3IE5hbWVkUHJvdmlkZXI8VD4oaW1wbCwgcGx1Z2luTmFtZSk7CisgICAgd2hpbGUgKCFyZWYuY29tcGFyZUFuZFNldChudWxsLCBpdGVtKSkgeworICAgICAgTmFtZWRQcm92aWRlcjxUPiBvbGQgPSByZWYuZ2V0KCk7CisgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIiVzIGFscmVhZHkgcHJvdmlkZWQgYnkgJXMsIGlnbm9yaW5nIHBsdWdpbiAlcyIsCisgICAgICAgICAgICBrZXkuZ2V0VHlwZUxpdGVyYWwoKSwgb2xkLnBsdWdpbk5hbWUsIHBsdWdpbk5hbWUpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ldyBSZWdpc3RyYXRpb25IYW5kbGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgcmVmLmNvbXBhcmVBbmRTZXQoaXRlbSwgbnVsbCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIC8qKgorICAgKiBTZXQgdGhlIGVsZW1lbnQgdGhhdCBtYXkgYmUgaG90LXJlcGxhY2VhYmxlIGluIHRoZSBmdXR1cmUuCisgICAqCisgICAqIEBwYXJhbSBrZXkgdW5pcXVlIGRlc2NyaXB0aW9uIGZyb20gdGhlIGl0ZW0ncyBHdWljZSBiaW5kaW5nLiBUaGlzIGNhbiBiZQorICAgKiAgICAgICAgbGF0ZXIgb2J0YWluZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGhhbmRsZSB0byBmYWNpbGl0YXRlIG1hdGNoaW5nCisgICAqICAgICAgICB3aXRoIHRoZSBuZXcgZXF1aXZhbGVudCBpbnN0YW5jZSBkdXJpbmcgYSBob3QgcmVsb2FkLgorICAgKiBAcGFyYW0gaW1wbCB0aGUgaXRlbSB0byBzZXQgYXMgb3VyIHZhbHVlIHJpZ2h0IG5vdy4gTXVzdCBub3QgYmUgbnVsbC4KKyAgICogQHBhcmFtIHBsdWdpbk5hbWUgdGhlIG5hbWUgb2YgdGhlIHBsdWdpbiBwcm92aWRpbmcgdGhlIGl0ZW0uCisgICAqIEByZXR1cm4gYSBoYW5kbGUgdGhhdCBjYW4gcmVtb3ZlIHRoaXMgaXRlbSBsYXRlciwgb3IgaG90LXN3YXAgdGhlIGl0ZW0uCisgICAqLworICBwdWJsaWMgUmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTxUPiBzZXQoS2V5PFQ+IGtleSwgUHJvdmlkZXI8VD4gaW1wbCwKKyAgICAgIFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgZmluYWwgTmFtZWRQcm92aWRlcjxUPiBpdGVtID0gbmV3IE5hbWVkUHJvdmlkZXI8VD4oaW1wbCwgcGx1Z2luTmFtZSk7CisgICAgd2hpbGUgKCFyZWYuY29tcGFyZUFuZFNldChudWxsLCBpdGVtKSkgeworICAgICAgTmFtZWRQcm92aWRlcjxUPiBvbGQgPSByZWYuZ2V0KCk7CisgICAgICBpZiAob2xkICE9IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIiVzIGFscmVhZHkgcHJvdmlkZWQgYnkgJXMsIGlnbm9yaW5nIHBsdWdpbiAlcyIsCisgICAgICAgICAgICB0aGlzLmtleS5nZXRUeXBlTGl0ZXJhbCgpLCBvbGQucGx1Z2luTmFtZSwgcGx1Z2luTmFtZSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3IFJlbG9hZGFibGVIYW5kbGUoa2V5LCBpdGVtKTsKKyAgfQorCisgIHByaXZhdGUgY2xhc3MgUmVsb2FkYWJsZUhhbmRsZSBpbXBsZW1lbnRzIFJlbG9hZGFibGVSZWdpc3RyYXRpb25IYW5kbGU8VD4geworICAgIHByaXZhdGUgZmluYWwgS2V5PFQ+IGtleTsKKyAgICBwcml2YXRlIGZpbmFsIE5hbWVkUHJvdmlkZXI8VD4gaXRlbTsKKworICAgIFJlbG9hZGFibGVIYW5kbGUoS2V5PFQ+IGtleSwgTmFtZWRQcm92aWRlcjxUPiBpdGVtKSB7CisgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgIHRoaXMuaXRlbSA9IGl0ZW07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEtleTxUPiBnZXRLZXkoKSB7CisgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgIHJlZi5jb21wYXJlQW5kU2V0KGl0ZW0sIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZWxvYWRhYmxlSGFuZGxlIHJlcGxhY2UoS2V5PFQ+IG5ld0tleSwgUHJvdmlkZXI8VD4gbmV3SXRlbSkgeworICAgICAgTmFtZWRQcm92aWRlcjxUPiBuID0gbmV3IE5hbWVkUHJvdmlkZXI8VD4obmV3SXRlbSwgaXRlbS5wbHVnaW5OYW1lKTsKKyAgICAgIGlmIChyZWYuY29tcGFyZUFuZFNldChpdGVtLCBuKSkgeworICAgICAgICByZXR1cm4gbmV3IFJlbG9hZGFibGVIYW5kbGUobmV3S2V5LCBuKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljSXRlbVByb3ZpZGVyLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVnaXN0cmF0aW9uL0R5bmFtaWNJdGVtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDc0ZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljSXRlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBEeW5hbWljSXRlbVByb3ZpZGVyPFQ+IGltcGxlbWVudHMgUHJvdmlkZXI8RHluYW1pY0l0ZW08VD4+IHsKKyAgcHJpdmF0ZSBmaW5hbCBUeXBlTGl0ZXJhbDxUPiB0eXBlOworICBwcml2YXRlIGZpbmFsIEtleTxEeW5hbWljSXRlbTxUPj4ga2V5OworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBJbmplY3RvciBpbmplY3RvcjsKKworICBEeW5hbWljSXRlbVByb3ZpZGVyKFR5cGVMaXRlcmFsPFQ+IHR5cGUsIEtleTxEeW5hbWljSXRlbTxUPj4ga2V5KSB7CisgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB0aGlzLmtleSA9IGtleTsKKyAgfQorCisgIHB1YmxpYyBEeW5hbWljSXRlbTxUPiBnZXQoKSB7CisgICAgcmV0dXJuIG5ldyBEeW5hbWljSXRlbTxUPihrZXksIGZpbmQoaW5qZWN0b3IsIHR5cGUpLCAiZ2Vycml0Iik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyA8VD4gUHJvdmlkZXI8VD4gZmluZChJbmplY3RvciBzcmMsIFR5cGVMaXRlcmFsPFQ+IHR5cGUpIHsKKyAgICBMaXN0PEJpbmRpbmc8VD4+IGJpbmRpbmdzID0gc3JjLmZpbmRCaW5kaW5nc0J5VHlwZSh0eXBlKTsKKyAgICBpZiAoYmluZGluZ3MgIT0gbnVsbCAmJiBiaW5kaW5ncy5zaXplKCkgPT0gMSkgeworICAgICAgcmV0dXJuIGJpbmRpbmdzLmdldCgwKS5nZXRQcm92aWRlcigpOworICAgIH0gZWxzZSBpZiAoYmluZGluZ3MgIT0gbnVsbCAmJiBiaW5kaW5ncy5zaXplKCkgPiAxKSB7CisgICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICJNdWx0aXBsZSBwcm92aWRlcnMgYm91bmQgZm9yIER5bmFtaWNJdGVtPCVzPlxuIgorICAgICAgICArICJUaGlzIGlzIG5vdCBhbGxvd2VkOyBjaGVjayB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24uIiwKKyAgICAgICAgdHlwZSkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vRHluYW1pY1NldFByb3ZpZGVyLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVnaXN0cmF0aW9uL0R5bmFtaWNTZXRQcm92aWRlci5qYXZhCmluZGV4IDZjMjE1NTMuLjIxZmExYjggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vRHluYW1pY1NldFByb3ZpZGVyLmphdmEKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9EeW5hbWljU2V0UHJvdmlkZXIuamF2YQpAQCAtMTksNyArMTksNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmludGVybmFsLlVuaXF1ZUFubm90YXRpb25zOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0yNyw4ICsyNiw2IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIAogY2xhc3MgRHluYW1pY1NldFByb3ZpZGVyPFQ+IGltcGxlbWVudHMgUHJvdmlkZXI8RHluYW1pY1NldDxUPj4gewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBVTklRVUVfQU5OT1RBVElPTiA9Ci0gICAgICBVbmlxdWVBbm5vdGF0aW9ucy5jcmVhdGUoKS5nZXRDbGFzcygpOwogICBwcml2YXRlIGZpbmFsIFR5cGVMaXRlcmFsPFQ+IHR5cGU7CiAKICAgQEluamVjdApkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9Qcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNUeXBlcy5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3JlZ2lzdHJhdGlvbi9Qcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNUeXBlcy5qYXZhCmluZGV4IDY2ZGQ0NWQuLjhiYzU3YWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZWdpc3RyYXRpb24vUHJpdmF0ZUludGVybmFsc19EeW5hbWljVHlwZXMuamF2YQorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVnaXN0cmF0aW9uL1ByaXZhdGVJbnRlcm5hbHNfRHluYW1pY1R5cGVzLmphdmEKQEAgLTMwLDYgKzMwLDIyIEBACiAKIC8qKiA8Yj5ETyBOT1QgVVNFPC9iPiAqLwogcHVibGljIGNsYXNzIFByaXZhdGVJbnRlcm5hbHNfRHluYW1pY1R5cGVzIHsKKyAgcHVibGljIHN0YXRpYyBNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNJdGVtPD8+PiBkeW5hbWljSXRlbXNPZihJbmplY3RvciBzcmMpIHsKKyAgICBNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNJdGVtPD8+PiBtID0gbmV3SGFzaE1hcCgpOworICAgIGZvciAoTWFwLkVudHJ5PEtleTw/PiwgQmluZGluZzw/Pj4gZSA6IHNyYy5nZXRCaW5kaW5ncygpLmVudHJ5U2V0KCkpIHsKKyAgICAgIFR5cGVMaXRlcmFsPD8+IHR5cGUgPSBlLmdldEtleSgpLmdldFR5cGVMaXRlcmFsKCk7CisgICAgICBpZiAodHlwZS5nZXRSYXdUeXBlKCkgPT0gRHluYW1pY0l0ZW0uY2xhc3MpIHsKKyAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZS5nZXRUeXBlKCk7CisgICAgICAgIG0ucHV0KFR5cGVMaXRlcmFsLmdldChwLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSksCisgICAgICAgICAgICAoRHluYW1pY0l0ZW08Pz4pIGUuZ2V0VmFsdWUoKS5nZXRQcm92aWRlcigpLmdldCgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG0uaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICB9CisgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChtKTsKKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljU2V0PD8+PiBkeW5hbWljU2V0c09mKEluamVjdG9yIHNyYykgewogICAgIE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY1NldDw/Pj4gbSA9IG5ld0hhc2hNYXAoKTsKICAgICBmb3IgKE1hcC5FbnRyeTxLZXk8Pz4sIEJpbmRpbmc8Pz4+IGUgOiBzcmMuZ2V0QmluZGluZ3MoKS5lbnRyeVNldCgpKSB7CkBAIC02Miw2ICs3OCwzOCBAQAogICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobSk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIExpc3Q8UmVnaXN0cmF0aW9uSGFuZGxlPiBhdHRhY2hJdGVtcygKKyAgICAgIEluamVjdG9yIHNyYywKKyAgICAgIE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY0l0ZW08Pz4+IGl0ZW1zLCBTdHJpbmcgcGx1Z2luTmFtZSkgeworICAgIGlmIChzcmMgPT0gbnVsbCB8fCBpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIExpc3Q8UmVnaXN0cmF0aW9uSGFuZGxlPiBoYW5kbGVzID0gbmV3IEFycmF5TGlzdDxSZWdpc3RyYXRpb25IYW5kbGU+KDQpOworICAgIHRyeSB7CisgICAgICBmb3IgKE1hcC5FbnRyeTxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY0l0ZW08Pz4+IGUgOiBpdGVtcy5lbnRyeVNldCgpKSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBUeXBlTGl0ZXJhbDxPYmplY3Q+IHR5cGUgPSAoVHlwZUxpdGVyYWw8T2JqZWN0PikgZS5nZXRLZXkoKTsKKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgRHluYW1pY0l0ZW08T2JqZWN0PiBpdGVtID0gKER5bmFtaWNJdGVtPE9iamVjdD4pIGUuZ2V0VmFsdWUoKTsKKworICAgICAgICBmb3IgKEJpbmRpbmc8T2JqZWN0PiBiIDogYmluZGluZ3Moc3JjLCB0eXBlKSkgeworICAgICAgICAgIGlmIChiLmdldEtleSgpLmdldEFubm90YXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICBoYW5kbGVzLmFkZChpdGVtLnNldChiLmdldEtleSgpLCBiLmdldFByb3ZpZGVyKCksIHBsdWdpbk5hbWUpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlbW92ZShoYW5kbGVzKTsKKyAgICAgIHRocm93IGU7CisgICAgfSBjYXRjaCAoRXJyb3IgZSkgeworICAgICAgcmVtb3ZlKGhhbmRsZXMpOworICAgICAgdGhyb3cgZTsKKyAgICB9CisgICAgcmV0dXJuIGhhbmRsZXM7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIExpc3Q8UmVnaXN0cmF0aW9uSGFuZGxlPiBhdHRhY2hTZXRzKAogICAgICAgSW5qZWN0b3Igc3JjLAogICAgICAgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljU2V0PD8+PiBzZXRzKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BY2NlcHRzQ3JlYXRlLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BY2NlcHRzQ3JlYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2ZjI4MQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0FjY2VwdHNDcmVhdGUuamF2YQpAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKioKKyAqIE9wdGlvbmFsIGludGVyZmFjZSBmb3Ige0BsaW5rIFJlc3RDb2xsZWN0aW9ufS4KKyAqIDxwPgorICogQ29sbGVjdGlvbnMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgY2FuIGFjY2VwdCBhIHtAY29kZSBQVVR9IG9yCisgKiB7QGNvZGUgUE9TVH0gd2hlbiB0aGUgcGFyc2UgbWV0aG9kIHRocm93cyB7QGxpbmsgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbn0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWNjZXB0c0NyZWF0ZTxQIGV4dGVuZHMgUmVzdFJlc291cmNlPiB7CisgIC8qKgorICAgKiBIYW5kbGUgY3JlYXRpb24gb2YgYSBjaGlsZCByZXNvdXJjZS4KKyAgICoKKyAgICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29sbGVjdGlvbiBoYW5kbGUuCisgICAqIEBwYXJhbSBpZCBpZCBvZiB0aGUgcmVzb3VyY2UgYmVpbmcgY3JlYXRlZC4KKyAgICogQHJldHVybiBhIHZpZXcgdG8gcGVyZm9ybSB0aGUgY3JlYXRpb24uIFRoZSBjcmVhdGUgbWV0aG9kIG11c3QgZW1iZWQgdGhlIGlkCisgICAqICAgICAgICAgaW50byB0aGUgbmV3bHkgcmV0dXJuZWQgdmlldyBvYmplY3QsIGFzIGl0IHdpbGwgbm90IGJlIHBhc3NlZC4KKyAgICogQHRocm93cyBSZXN0QXBpRXhjZXB0aW9uIHRoZSB2aWV3IGNhbm5vdCBiZSBjb25zdHJ1Y3RlZC4KKyAgICovCisgIDxJPiBSZXN0TW9kaWZ5VmlldzxQLCBJPiBjcmVhdGUoUCBwYXJlbnQsIElkU3RyaW5nIGlkKSB0aHJvd3MgUmVzdEFwaUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0FjY2VwdHNQb3N0LmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BY2NlcHRzUG9zdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGVhODMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BY2NlcHRzUG9zdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKy8qKgorICogT3B0aW9uYWwgaW50ZXJmYWNlIGZvciB7QGxpbmsgUmVzdENvbGxlY3Rpb259LgorICogPHA+CisgKiBDb2xsZWN0aW9ucyB0aGF0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBjYW4gYWNjZXB0IGEge0Bjb2RlIFBPU1R9IGRpcmVjdGx5CisgKiBvbiB0aGUgY29sbGVjdGlvbiBpdHNlbGYgd2hlbiBubyBpZCB3YXMgZ2l2ZW4gaW4gdGhlIHBhdGguIFRoaXMgaW50ZXJmYWNlIGlzCisgKiBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggVG9wTGV2ZWxSZXNvdXJjZSBjb2xsZWN0aW9ucy4gTmVzdGVkIGNvbGxlY3Rpb25zCisgKiBvZnRlbiBiaW5kIFBPU1Qgb24gdGhlIHBhcmVudCBjb2xsZWN0aW9uIHRvIHRoZSB2aWV3IGltcGxlbWVudGF0aW9uIGhhbmRsaW5nCisgKiB0aGUgaW5zZXJ0aW9uIG9mIGEgbmV3IG1lbWJlci4KKyAqLworcHVibGljIGludGVyZmFjZSBBY2NlcHRzUG9zdDxQIGV4dGVuZHMgUmVzdFJlc291cmNlPiB7CisgIC8qKgorICAgKiBIYW5kbGUgY3JlYXRpb24gb2YgYSBjaGlsZCByZXNvdXJjZSBieSBQT1NUIG9uIHRoZSBjb2xsZWN0aW9uLgorICAgKgorICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBjb2xsZWN0aW9uIGhhbmRsZS4KKyAgICogQHJldHVybiBhIHZpZXcgdG8gcGVyZm9ybSB0aGUgY3JlYXRpb24uIFRoZSBpZCBvZiB0aGUgbmV3bHkgY3JlYXRlZAorICAgKiAgICAgICAgIHJlc291cmNlIHNob3VsZCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGlucHV0IGJvZHkuCisgICAqIEB0aHJvd3MgUmVzdEFwaUV4Y2VwdGlvbiB0aGUgdmlldyBjYW5ub3QgYmUgY29uc3RydWN0ZWQuCisgICAqLworICA8ST4gUmVzdE1vZGlmeVZpZXc8UCwgST4gcG9zdChQIHBhcmVudCkgdGhyb3dzIFJlc3RBcGlFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BdXRoRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9BdXRoRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0Y2RhNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0F1dGhFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogQ2FsbGVyIGNhbm5vdCBwZXJmb3JtIHRoZSByZXF1ZXN0IG9wZXJhdGlvbiAoSFRUUCA0MDMgRm9yYmlkZGVuKS4gKi8KK3B1YmxpYyBjbGFzcyBBdXRoRXhjZXB0aW9uIGV4dGVuZHMgUmVzdEFwaUV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKiBAcGFyYW0gbXNnIG1lc3NhZ2UgdG8gcmV0dXJuIHRvIHRoZSBjbGllbnQuICovCisgIHB1YmxpYyBBdXRoRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9CYWRSZXF1ZXN0RXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9CYWRSZXF1ZXN0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhOWMxZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0JhZFJlcXVlc3RFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogUmVxdWVzdCBjb3VsZCBub3QgYmUgcGFyc2VkIGFzIHNlbnQgKEhUVFAgNDAwIEJhZCBSZXF1ZXN0KS4gKi8KK3B1YmxpYyBjbGFzcyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGV4dGVuZHMgUmVzdEFwaUV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKiBAcGFyYW0gbXNnIGVycm9yIHRleHQgZm9yIGNsaWVudCBkZXNjcmliaW5nIGhvdyByZXF1ZXN0IGlzIGJhZC4gKi8KKyAgcHVibGljIEJhZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0JpbmFyeVJlc3VsdC5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQmluYXJ5UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4MDExYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0JpbmFyeVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBXcmFwcGVyIGFyb3VuZCBhIG5vbi1KU09OIHJlc3VsdCBmcm9tIGEge0BsaW5rIFJlc3RWaWV3fS4KKyAqIDxwPgorICogVmlld3MgbWF5IHJldHVybiB0aGlzIHR5cGUgdG8gc2lnbmFsIHRoZXkgd2FudCB0aGUgc2VydmVyIGdsdWUgdG8gd3JpdGUgcmF3CisgKiBkYXRhIHRvIHRoZSBjbGllbnQsIGluc3RlYWQgb2YgYXR0ZW1wdGluZyBhdXRvbWF0aWMgY29udmVyc2lvbiB0byBKU09OLiBUaGUKKyAqIGNyZWF0ZSBmb3JtIGlzIG92ZXJsb2FkZWQgdG8gaGFuZGxlIHBsYWluIHRleHQgZnJvbSBhIFN0cmluZywgb3IgYmluYXJ5IGRhdGEKKyAqIGZyb20gYSB7QGNvZGUgYnl0ZVtdfSBvciB7QGNvZGUgSW5wdXRTdGVhbX0uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlSZXN1bHQgaW1wbGVtZW50cyBDbG9zZWFibGUgeworICAvKiogRGVmYXVsdCBNSU1FIHR5cGUgZm9yIHVua25vd24gYmluYXJ5IGRhdGEuICovCisgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NURVRfU1RSRUFNID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisKKyAgLyoqIFByb2R1Y2UgYSBVVEYtOCBlbmNvZGVkIHJlc3VsdCBmcm9tIGEgc3RyaW5nLiAqLworICBwdWJsaWMgc3RhdGljIEJpbmFyeVJlc3VsdCBjcmVhdGUoU3RyaW5nIGRhdGEpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNyZWF0ZShkYXRhLmdldEJ5dGVzKCJVVEYtOCIpKQorICAgICAgICAuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKQorICAgICAgICAuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7CisgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSlZNIGRvZXMgbm90IHN1cHBvcnQgVVRGLTgiLCBlKTsKKyAgICB9CisgIH0KKworICAvKiogUHJvZHVjZSBhbiB7QGNvZGUgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtfSByZXN1bHQgZnJvbSBhIGJ5dGUgYXJyYXkuICovCisgIHB1YmxpYyBzdGF0aWMgQmluYXJ5UmVzdWx0IGNyZWF0ZShieXRlW10gZGF0YSkgeworICAgIHJldHVybiBuZXcgQXJyYXkoZGF0YSk7CisgIH0KKworICAvKioKKyAgICogUHJvZHVjZSBhbiB7QGNvZGUgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtfSBvZiB1bmtub3duIGxlbmd0aCBieSBjb3B5aW5nCisgICAqIHRoZSBJbnB1dFN0cmVhbSB1bnRpbCBFT0YuIFRoZSBzZXJ2ZXIgZ2x1ZSB3aWxsIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhpcworICAgKiBzdHJlYW0gd2hlbiBjb3B5aW5nIGlzIGNvbXBsZXRlLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBCaW5hcnlSZXN1bHQgY3JlYXRlKElucHV0U3RyZWFtIGRhdGEpIHsKKyAgICByZXR1cm4gbmV3IFN0cmVhbShkYXRhKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnRUeXBlID0gT0NURVRfU1RSRUFNOworICBwcml2YXRlIFN0cmluZyBjaGFyYWN0ZXJFbmNvZGluZzsKKyAgcHJpdmF0ZSBsb25nIGNvbnRlbnRMZW5ndGggPSAtMTsKKyAgcHJpdmF0ZSBib29sZWFuIGd6aXAgPSB0cnVlOworCisgIC8qKiBAcmV0dXJuIHRoZSBNSU1FIHR5cGUgb2YgdGhlIHJlc3VsdCwgZm9yIEhUVFAgY2xpZW50cy4gKi8KKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICBTdHJpbmcgZW5jID0gZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKyAgICBpZiAoZW5jICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBjb250ZW50VHlwZSArICI7IGNoYXJzZXQ9IiArIGVuYzsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRlbnRUeXBlOworICB9CisKKyAgLyoqIFNldCB0aGUgTUlNRSB0eXBlIG9mIHRoZSByZXN1bHQsIGFuZCByZXR1cm4ge0Bjb2RlIHRoaXN9LiAqLworICBwdWJsaWMgQmluYXJ5UmVzdWx0IHNldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgeworICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZSAhPSBudWxsID8gY29udGVudFR5cGUgOiBPQ1RFVF9TVFJFQU07CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKiogR2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmc7IG51bGwgaWYgbm90IGtub3duLiAqLworICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgIHJldHVybiBjaGFyYWN0ZXJFbmNvZGluZzsKKyAgfQorCisgIC8qKiBTZXQgdGhlIGNoYXJhY3RlciBzZXQgdXNlZCB0byBlbmNvZGUgdGV4dCBkYXRhIGFuZCByZXR1cm4ge0Bjb2RlIHRoaXN9LiAqLworICBwdWJsaWMgQmluYXJ5UmVzdWx0IHNldENoYXJhY3RlckVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgIGNoYXJhY3RlckVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKiogQHJldHVybiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHJlc3VsdDsgLTEgaWYgbm90IGtub3duLiAqLworICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgIHJldHVybiBjb250ZW50TGVuZ3RoOworICB9CisKKyAgLyoqIFNldCB0aGUgY29udGVudCBsZW5ndGggb2YgdGhlIHJlc3VsdDsgLTEgaWYgbm90IGtub3duLiAqLworICBwdWJsaWMgQmluYXJ5UmVzdWx0IHNldENvbnRlbnRMZW5ndGgobG9uZyBsZW4pIHsKKyAgICB0aGlzLmNvbnRlbnRMZW5ndGggPSBsZW47CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKiogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVzdWx0IGNhbiBiZSBnemlwIGNvbXByZXNzZWQgdG8gY2xpZW50cy4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuR3ppcCgpIHsKKyAgICByZXR1cm4gZ3ppcDsKKyAgfQorCisgIC8qKiBEaXNhYmxlIGd6aXAgY29tcHJlc3Npb24gZm9yIGFscmVhZHkgY29tcHJlc3NlZCByZXNwb25zZXMuICovCisgIHB1YmxpYyBCaW5hcnlSZXN1bHQgZGlzYWJsZUd6aXAoKSB7CisgICAgdGhpcy5nemlwID0gZmFsc2U7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvKioKKyAgICogV3JpdGUgb3IgY29weSB0aGUgcmVzdWx0IG9udG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgc3RyZWFtLgorICAgKgorICAgKiBAcGFyYW0gb3Mgc3RyZWFtIHRvIHdyaXRlIHJlc3VsdCBkYXRhIG9udG8uIFRoaXMgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIGJ5CisgICAqICAgICAgICB0aGUgY2FsbGVyIGFmdGVyIHRoaXMgbWV0aG9kIHJldHVybnMuCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHByb2R1Y2VkLCBvciB0aGUgT3V0cHV0U3RyZWFtCisgICAqICAgICAgICAge0Bjb2RlIG9zfSB0aHJvd3MgYW55IElPRXhjZXB0aW9uIGR1cmluZyBhIHdyaXRlIG9yIGZsdXNoIGNhbGwuCisgICAqLworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uOworCisgIC8qKiBDbG9zZSB0aGUgcmVzdWx0IGFuZCByZWxlYXNlIGFueSByZXNvdXJjZXMgaXQgaG9sZHMuICovCisgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIGlmIChnZXRDb250ZW50TGVuZ3RoKCkgPj0gMCkgeworICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIkJpbmFyeVJlc3VsdFtDb250ZW50LVR5cGU6ICVzLCBDb250ZW50LUxlbmd0aDogJWRdIiwKKyAgICAgICAgICBnZXRDb250ZW50VHlwZSgpLCBnZXRDb250ZW50TGVuZ3RoKCkpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgIkJpbmFyeVJlc3VsdFtDb250ZW50LVR5cGU6ICVzLCBDb250ZW50LUxlbmd0aDogdW5rbm93bl0iLAorICAgICAgICBnZXRDb250ZW50VHlwZSgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFycmF5IGV4dGVuZHMgQmluYXJ5UmVzdWx0IHsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBkYXRhOworCisgICAgQXJyYXkoYnl0ZVtdIGRhdGEpIHsKKyAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICBzZXRDb250ZW50TGVuZ3RoKGRhdGEubGVuZ3RoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgIG9zLndyaXRlKGRhdGEpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbSBleHRlbmRzIEJpbmFyeVJlc3VsdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBzcmM7CisKKyAgICBTdHJlYW0oSW5wdXRTdHJlYW0gc3JjKSB7CisgICAgICB0aGlzLnNyYyA9IHNyYzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICBpbnQgbjsKKyAgICAgIHdoaWxlICgwIDwgKG4gPSBzcmMucmVhZCh0bXApKSkgeworICAgICAgICBkc3Qud3JpdGUodG1wLCAwLCBuKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBzcmMuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0NoaWxkQ29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvQ2hpbGRDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZDlmOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0NoaWxkQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKworLyoqCisgKiBOZXN0ZWQgY29sbGVjdGlvbiBvZiB7QGxpbmsgUmVzdFJlc291cmNlfXMgYmVsb3cgYSBwYXJlbnQuCisgKgorICogQHBhcmFtIDxQPiB0eXBlIG9mIHRoZSBwYXJlbnQgcmVzb3VyY2UuCisgKiBAcGFyYW0gPEM+IHR5cGUgb2YgcmVzb3VyY2Ugb3BlcmF0ZWQgb24gYnkgZWFjaCB2aWV3LgorICovCitwdWJsaWMgaW50ZXJmYWNlIENoaWxkQ29sbGVjdGlvbjxQIGV4dGVuZHMgUmVzdFJlc291cmNlLCBDIGV4dGVuZHMgUmVzdFJlc291cmNlPgorICAgIGV4dGVuZHMgUmVzdFZpZXc8UD4sIFJlc3RDb2xsZWN0aW9uPFAsIEM+IHsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0RlZmF1bHRJbnB1dC5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvRGVmYXVsdElucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNDJkMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0RlZmF1bHRJbnB1dC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKiogQXBwbGllZCB0byBhIFN0cmluZyBmaWVsZCB0byBpbmRpY2F0ZSB0aGUgZGVmYXVsdCBpbnB1dCBwYXJhbWV0ZXIuICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBEZWZhdWx0SW5wdXQgeworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvSWRTdHJpbmcuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0lkU3RyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NzQyNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL0lkU3RyaW5nLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqCisgKiBSZXNvdXJjZSBpZGVudGlmaWVyIHNwbGl0IG91dCBmcm9tIGEgVVJMLgorICogPHA+CisgKiBJZGVudGlmaWVycyBhcmUgVVJMIGVuY29kZWQgYW5kIHVzdWFsbHkgbmVlZCB0byBiZSBkZWNvZGVkLgorICovCitwdWJsaWMgY2xhc3MgSWRTdHJpbmcgeworICAvKiogQ29uc3RydWN0IGFuIGlkZW50aWZpZXIgZnJvbSBhbiBhbHJlYWR5IGVuY29kZWQgc3RyaW5nLiAqLworICBwdWJsaWMgc3RhdGljIElkU3RyaW5nIGZyb21VcmwoU3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIG5ldyBJZFN0cmluZyhpZCk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFN0cmluZyB1cmxFbmNvZGVkOworCisgIHByaXZhdGUgSWRTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICB1cmxFbmNvZGVkID0gczsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHZhbHVlIG9mIHRoZSBzdHJpbmcuICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgIHJldHVybiBVcmwuZGVjb2RlKHVybEVuY29kZWQpOworICB9CisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIHRoZSBlbXB0eSBzdHJpbmcuICovCisgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgcmV0dXJuIHVybEVuY29kZWQuaXNFbXB0eSgpOworICB9CisKKyAgLyoqIEByZXR1cm4gdGhlIG9yaWdpbmFsIFVSTCBlbmNvZGluZyBzdXBwbGllZCBieSB0aGUgY2xpZW50LiAqLworICBwdWJsaWMgU3RyaW5nIGVuY29kZWQoKSB7CisgICAgcmV0dXJuIHVybEVuY29kZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICByZXR1cm4gdXJsRW5jb2RlZC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBJZFN0cmluZykgeworICAgICAgcmV0dXJuIHVybEVuY29kZWQuZXF1YWxzKCgoSWRTdHJpbmcpIG90aGVyKS51cmxFbmNvZGVkKTsKKyAgICB9IGVsc2UgaWYgKG90aGVyIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICByZXR1cm4gdXJsRW5jb2RlZC5lcXVhbHMob3RoZXIpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gZW5jb2RlZCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwZmRkMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL01ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogTWV0aG9kIGlzIG5vdCBhY2NlcHRhYmxlIG9uIHRoZSByZXNvdXJjZSAoSFRUUCA0MDUgTWV0aG9kIE5vdCBBbGxvd2VkKS4gKi8KK3B1YmxpYyBjbGFzcyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIGV4dGVuZHMgUmVzdEFwaUV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUHJlY29uZGl0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9QcmVjb25kaXRpb25GYWlsZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjIwNGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUHJlY29uZGl0aW9uRmFpbGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworLyoqCisgKiBSZXNvdXJjZSBzdGF0ZSBkb2VzIG5vdCBtYXRjaCByZXF1ZXN0IHN0YXRlIChIVFRQIDQxMiBQcmVjb25kaXRpb24gZmFpbGVkKS4KKyAqLworcHVibGljIGNsYXNzIFByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJlc3RBcGlFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwdWJsaWMgUHJlY29uZGl0aW9uRmFpbGVkRXhjZXB0aW9uKCkgeworICB9CisKKyAgLyoqIEBwYXJhbSBtc2cgbWVzc2FnZSB0byByZXR1cm4gdG8gdGhlIGNsaWVudCBkZXNjcmliaW5nIHRoZSBlcnJvci4gKi8KKyAgcHVibGljIFByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIobXNnKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUHV0SW5wdXQuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1B1dElucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkNjJiMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1B1dElucHV0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworCisvKiogUmF3IGRhdGEgc3RyZWFtIHN1cHBsaWVkIGJ5IHRoZSBib2R5IG9mIGEgUFVULiAqLworcHVibGljIGludGVyZmFjZSBQdXRJbnB1dCB7CisgIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOworICBsb25nIGdldENvbnRlbnRMZW5ndGgoKTsKKyAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2ZDgxMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc291cmNlQ29uZmxpY3RFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKioKKyAqIFJlc291cmNlIHN0YXRlIGRvZXMgbm90IHBlcm1pdCByZXF1ZXN0ZWQgb3BlcmF0aW9uIChIVFRQIDQwOSBDb25mbGljdCkuCisgKiA8cD4KKyAqIHtAbGluayBSZXN0TW9kaWZ5Vmlld30gaW1wbGVtZW50YXRpb25zIG1heSBmYWlsIHdpdGggdGhpcyBleGNlcHRpb24gd2hlbiB0aGUKKyAqIG5hbWVkIHJlc291cmNlIGRvZXMgbm90IHBlcm1pdCB0aGUgbW9kaWZpY2F0aW9uIHRvIHRha2UgcGxhY2UgYXQgdGhpcyB0aW1lLgorICogQW4gZXhhbXBsZSB1c2UgaXMgdHJ5aW5nIHRvIGFiYW5kb24gYSBjaGFuZ2UgdGhhdCBpcyBhbHJlYWR5IG1lcmdlZC4gVGhlCisgKiBjaGFuZ2UgY2Fubm90IGJlIGFiYW5kb25lZCBvbmNlIG1lcmdlZCBzbyBhbiBvcGVyYXRpb24gd291bGQgdGhyb3cuCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uIGV4dGVuZHMgUmVzdEFwaUV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKiBAcGFyYW0gbXNnIG1lc3NhZ2UgdG8gcmV0dXJuIHRvIHRoZSBjbGllbnQgZGVzY3JpYmluZyB0aGUgZXJyb3IuICovCisgIHB1YmxpYyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE4OTFjOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc291cmNlTm90Rm91bmRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogTmFtZWQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgKEhUVFAgNDA0IE5vdCBGb3VuZCkuICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFJlc3RBcGlFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKiogUmVxdWVzdGVkIHJlc291cmNlIGlzIG5vdCBmb3VuZCwgZmFpbGluZyBwb3J0aW9uIG5vdCBzcGVjaWZpZWQuICovCisgIHB1YmxpYyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCkgeworICB9CisKKyAgLyoqIEBwYXJhbSBpZCBwb3J0aW9uIG9mIHRoZSByZXNvdXJjZSBVUkkgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KKyAgcHVibGljIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGlkKSB7CisgICAgc3VwZXIoaWQpOworICB9CisKKyAgLyoqIEBwYXJhbSBpZCBwb3J0aW9uIG9mIHRoZSByZXNvdXJjZSBVUkkgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8KKyAgcHVibGljIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oSWRTdHJpbmcgaWQpIHsKKyAgICBzdXBlcihpZC5nZXQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3BvbnNlLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzRjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogU3BlY2lhbCByZXR1cm4gdmFsdWUgdG8gbWVhbiBzcGVjaWZpYyBIVFRQIHN0YXR1cyBjb2RlcyBpbiBhIFJFU1QgQVBJLiAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc3BvbnNlPFQ+IHsKKyAgQFN1cHByZXNzV2FybmluZ3MoeyJyYXd0eXBlcyJ9KQorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNwb25zZSBOT05FID0gbmV3IE5vbmUoKTsKKworICAvKiogSFRUUCAyMDAgT0s6IHBvaW50bGVzcyB3cmFwcGVyIGZvciB0eXBlIHNhZmV0eS4gKi8KKyAgcHVibGljIHN0YXRpYyA8VD4gUmVzcG9uc2U8VD4gb2soVCB2YWx1ZSkgeworICAgIHJldHVybiBuZXcgSW1wbDxUPigyMDAsIHZhbHVlKTsKKyAgfQorCisgIC8qKiBIVFRQIDIwMSBDcmVhdGVkOiB0eXBpY2FsbHkgdXNlZCB3aGVuIGEgbmV3IHJlc291cmNlIGlzIG1hZGUuICovCisgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlc3BvbnNlPFQ+IGNyZWF0ZWQoVCB2YWx1ZSkgeworICAgIHJldHVybiBuZXcgSW1wbDxUPigyMDEsIHZhbHVlKTsKKyAgfQorCisgIC8qKiBIVFRQIDIwNCBObyBDb250ZW50OiB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByZXNvdXJjZSBpcyBkZWxldGVkLiAqLworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgcHVibGljIHN0YXRpYyA8VD4gUmVzcG9uc2U8VD4gbm9uZSgpIHsKKyAgICByZXR1cm4gTk9ORTsKKyAgfQorCisgIC8qKiBIVFRQIDMwMiBGb3VuZDogdGVtcG9yYXJ5IHJlZGlyZWN0IHRvIGFub3RoZXIgVVJMLiAqLworICBwdWJsaWMgc3RhdGljIFJlZGlyZWN0IHJlZGlyZWN0KFN0cmluZyBsb2NhdGlvbikgeworICAgIHJldHVybiBuZXcgUmVkaXJlY3QobG9jYXRpb24pOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQiLCAicmF3dHlwZXMifSkKKyAgcHVibGljIHN0YXRpYyA8VD4gVCB1bndyYXAoVCBvYmopIHsKKyAgICB3aGlsZSAob2JqIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKKyAgICAgIG9iaiA9IChUKSAoKFJlc3BvbnNlKSBvYmopLnZhbHVlKCk7CisgICAgfQorICAgIHJldHVybiBvYmo7CisgIH0KKworICBwdWJsaWMgYWJzdHJhY3QgaW50IHN0YXR1c0NvZGUoKTsKKyAgcHVibGljIGFic3RyYWN0IFQgdmFsdWUoKTsKKyAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZygpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEltcGw8VD4gZXh0ZW5kcyBSZXNwb25zZTxUPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3RhdHVzQ29kZTsKKyAgICBwcml2YXRlIGZpbmFsIFQgdmFsdWU7CisKKyAgICBwcml2YXRlIEltcGwoaW50IHNjLCBUIHZhbCkgeworICAgICAgc3RhdHVzQ29kZSA9IHNjOworICAgICAgdmFsdWUgPSB2YWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzdGF0dXNDb2RlKCkgeworICAgICAgcmV0dXJuIHN0YXR1c0NvZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgdmFsdWUoKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiAiWyIgKyBzdGF0dXNDb2RlKCkgKyAiXSAiICsgdmFsdWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOb25lIGV4dGVuZHMgUmVzcG9uc2U8T2JqZWN0PiB7CisgICAgcHJpdmF0ZSBOb25lKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc3RhdHVzQ29kZSgpIHsKKyAgICAgIHJldHVybiAyMDQ7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCB2YWx1ZSgpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICByZXR1cm4gIlsyMDQgTm8gQ29udGVudF0gTm9uZSI7CisgICAgfQorICB9CisKKyAgLyoqIEFuIEhUVFAgcmVkaXJlY3QgdG8gYW5vdGhlciBsb2NhdGlvbi4gKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWRpcmVjdCB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbG9jYXRpb247CisKKyAgICBwcml2YXRlIFJlZGlyZWN0KFN0cmluZyB1cmwpIHsKKyAgICAgIHRoaXMubG9jYXRpb24gPSB1cmw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBsb2NhdGlvbigpIHsKKyAgICAgIHJldHVybiBsb2NhdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGxvY2F0aW9uLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICByZXR1cm4gbyBpbnN0YW5jZW9mIFJlZGlyZWN0CisgICAgICAgICYmICgoUmVkaXJlY3QpIG8pLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbMzAyIFJlZGlyZWN0XSAlcyIsIGxvY2F0aW9uKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RBcGlFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RBcGlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQyN2NkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdEFwaUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKy8qKiBSb290IGV4Y2VwdGlvbiB0eXBlIGZvciBKU09OIEFQSSBmYWlsdXJlcy4gKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXN0QXBpRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIFJlc3RBcGlFeGNlcHRpb24oKSB7CisgIH0KKworICBwdWJsaWMgUmVzdEFwaUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIobXNnKTsKKyAgfQorCisgIHB1YmxpYyBSZXN0QXBpRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKG1zZywgY2F1c2UpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0QXBpTW9kdWxlLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0QXBpTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhMGUxOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RBcGlNb2R1bGUuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuRXhwb3J0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuRXhwb3J0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5iaW5kZXIuTGlua2VkQmluZGluZ0J1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYmluZGVyLlNjb3BlZEJpbmRpbmdCdWlsZGVyOworCisvKiogR3VpY2UgRFNMIGZvciBiaW5kaW5nIHtAbGluayBSZXN0Vmlld30gaW1wbGVtZW50YXRpb25zLiAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc3RBcGlNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVCA9ICJHRVQiOworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVVQgPSAiUFVUIjsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMRVRFID0gIkRFTEVURSI7CisgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1QgPSAiUE9TVCI7CisKKyAgcHJvdGVjdGVkIDxSIGV4dGVuZHMgUmVzdFJlc291cmNlPgorICBSZWFkVmlld0JpbmRlcjxSPiBnZXQoVHlwZUxpdGVyYWw8UmVzdFZpZXc8Uj4+IHZpZXdUeXBlKSB7CisgICAgcmV0dXJuIG5ldyBSZWFkVmlld0JpbmRlcjxSPih2aWV3KHZpZXdUeXBlLCBHRVQsICIvIikpOworICB9CisKKyAgcHJvdGVjdGVkIDxSIGV4dGVuZHMgUmVzdFJlc291cmNlPgorICBNb2RpZnlWaWV3QmluZGVyPFI+IHB1dChUeXBlTGl0ZXJhbDxSZXN0VmlldzxSPj4gdmlld1R5cGUpIHsKKyAgICByZXR1cm4gbmV3IE1vZGlmeVZpZXdCaW5kZXI8Uj4odmlldyh2aWV3VHlwZSwgUFVULCAiLyIpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgTW9kaWZ5Vmlld0JpbmRlcjxSPiBwb3N0KFR5cGVMaXRlcmFsPFJlc3RWaWV3PFI+PiB2aWV3VHlwZSkgeworICAgIHJldHVybiBuZXcgTW9kaWZ5Vmlld0JpbmRlcjxSPih2aWV3KHZpZXdUeXBlLCBQT1NULCAiLyIpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgTW9kaWZ5Vmlld0JpbmRlcjxSPiBkZWxldGUoVHlwZUxpdGVyYWw8UmVzdFZpZXc8Uj4+IHZpZXdUeXBlKSB7CisgICAgcmV0dXJuIG5ldyBNb2RpZnlWaWV3QmluZGVyPFI+KHZpZXcodmlld1R5cGUsIERFTEVURSwgIi8iKSk7CisgIH0KKworICBwcm90ZWN0ZWQgPFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+CisgIFJlYWRWaWV3QmluZGVyPFI+IGdldChUeXBlTGl0ZXJhbDxSZXN0VmlldzxSPj4gdmlld1R5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG5ldyBSZWFkVmlld0JpbmRlcjxSPih2aWV3KHZpZXdUeXBlLCBHRVQsIG5hbWUpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgTW9kaWZ5Vmlld0JpbmRlcjxSPiBwdXQoVHlwZUxpdGVyYWw8UmVzdFZpZXc8Uj4+IHZpZXdUeXBlLCBTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBuZXcgTW9kaWZ5Vmlld0JpbmRlcjxSPih2aWV3KHZpZXdUeXBlLCBQVVQsIG5hbWUpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgTW9kaWZ5Vmlld0JpbmRlcjxSPiBwb3N0KFR5cGVMaXRlcmFsPFJlc3RWaWV3PFI+PiB2aWV3VHlwZSwgU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gbmV3IE1vZGlmeVZpZXdCaW5kZXI8Uj4odmlldyh2aWV3VHlwZSwgUE9TVCwgbmFtZSkpOworICB9CisKKyAgcHJvdGVjdGVkIDxSIGV4dGVuZHMgUmVzdFJlc291cmNlPgorICBNb2RpZnlWaWV3QmluZGVyPFI+IGRlbGV0ZShUeXBlTGl0ZXJhbDxSZXN0VmlldzxSPj4gdmlld1R5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG5ldyBNb2RpZnlWaWV3QmluZGVyPFI+KHZpZXcodmlld1R5cGUsIERFTEVURSwgbmFtZSkpOworICB9CisKKyAgcHJvdGVjdGVkIDxQIGV4dGVuZHMgUmVzdFJlc291cmNlPgorICBDaGlsZENvbGxlY3Rpb25CaW5kZXI8UD4gY2hpbGQoVHlwZUxpdGVyYWw8UmVzdFZpZXc8UD4+IHR5cGUsIFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG5ldyBDaGlsZENvbGxlY3Rpb25CaW5kZXI8UD4odmlldyh0eXBlLCBHRVQsIG5hbWUpKTsKKyAgfQorCisgIHByb3RlY3RlZCA8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4KKyAgTGlua2VkQmluZGluZ0J1aWxkZXI8UmVzdFZpZXc8Uj4+IHZpZXcoCisgICAgICBUeXBlTGl0ZXJhbDxSZXN0VmlldzxSPj4gdmlld1R5cGUsCisgICAgICBTdHJpbmcgbWV0aG9kLAorICAgICAgU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gYmluZCh2aWV3VHlwZSkuYW5ub3RhdGVkV2l0aChleHBvcnQobWV0aG9kLCBuYW1lKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBFeHBvcnQgZXhwb3J0KFN0cmluZyBtZXRob2QsIFN0cmluZyBuYW1lKSB7CisgICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAxICYmIG5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAvLyBWaWV3cyBtYXkgYmUgYm91bmQgYXMgIi8iIHRvIG1lYW4gdGhlIHJlc291cmNlIGl0c2VsZiwgb3IKKyAgICAgIC8vIGFzICJzdGF0dXMiIGFzIGluICIvdHlwZS97aWR9L3N0YXR1cyIuIERvbid0IGJpbmQgIi9zdGF0dXMiCisgICAgICAvLyBpZiB0aGUgY2FsbGVyIGFza2VkIGZvciB0aGF0LCBiaW5kIHdoYXQgdGhlIHNlcnZlciBleHBlY3RzLgorICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOworICAgIH0KKyAgICByZXR1cm4gRXhwb3J0cy5uYW1lZChtZXRob2QgKyAiLiIgKyBuYW1lKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVhZFZpZXdCaW5kZXI8UCBleHRlbmRzIFJlc3RSZXNvdXJjZT4geworICAgIHByaXZhdGUgZmluYWwgTGlua2VkQmluZGluZ0J1aWxkZXI8UmVzdFZpZXc8UD4+IGJpbmRlcjsKKworICAgIHByaXZhdGUgUmVhZFZpZXdCaW5kZXIoTGlua2VkQmluZGluZ0J1aWxkZXI8UmVzdFZpZXc8UD4+IGJpbmRlcikgeworICAgICAgdGhpcy5iaW5kZXIgPSBiaW5kZXI7CisgICAgfQorCisgICAgcHVibGljIDxUIGV4dGVuZHMgUmVzdFJlYWRWaWV3PFA+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvKENsYXNzPFQ+IGltcGwpIHsKKyAgICAgIHJldHVybiBiaW5kZXIudG8oaW1wbCk7CisgICAgfQorCisgICAgcHVibGljIDxUIGV4dGVuZHMgUmVzdFJlYWRWaWV3PFA+PgorICAgIHZvaWQgdG9JbnN0YW5jZShUIGltcGwpIHsKKyAgICAgIGJpbmRlci50b0luc3RhbmNlKGltcGwpOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RSZWFkVmlldzxQPj4KKyAgICBTY29wZWRCaW5kaW5nQnVpbGRlciB0b1Byb3ZpZGVyKENsYXNzPD8gZXh0ZW5kcyBQcm92aWRlcjw/IGV4dGVuZHMgVD4+IHByb3ZpZGVyVHlwZSkgeworICAgICAgcmV0dXJuIGJpbmRlci50b1Byb3ZpZGVyKHByb3ZpZGVyVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIDxUIGV4dGVuZHMgUmVzdFJlYWRWaWV3PFA+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvUHJvdmlkZXIoUHJvdmlkZXI8PyBleHRlbmRzIFQ+IHByb3ZpZGVyKSB7CisgICAgICByZXR1cm4gYmluZGVyLnRvUHJvdmlkZXIocHJvdmlkZXIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kaWZ5Vmlld0JpbmRlcjxQIGV4dGVuZHMgUmVzdFJlc291cmNlPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCaW5kaW5nQnVpbGRlcjxSZXN0VmlldzxQPj4gYmluZGVyOworCisgICAgcHJpdmF0ZSBNb2RpZnlWaWV3QmluZGVyKExpbmtlZEJpbmRpbmdCdWlsZGVyPFJlc3RWaWV3PFA+PiBiaW5kZXIpIHsKKyAgICAgIHRoaXMuYmluZGVyID0gYmluZGVyOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RNb2RpZnlWaWV3PFAsID8+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvKENsYXNzPFQ+IGltcGwpIHsKKyAgICAgIHJldHVybiBiaW5kZXIudG8oaW1wbCk7CisgICAgfQorCisgICAgcHVibGljIDxUIGV4dGVuZHMgUmVzdE1vZGlmeVZpZXc8UCwgPz4+CisgICAgdm9pZCB0b0luc3RhbmNlKFQgaW1wbCkgeworICAgICAgYmluZGVyLnRvSW5zdGFuY2UoaW1wbCk7CisgICAgfQorCisgICAgcHVibGljIDxUIGV4dGVuZHMgUmVzdE1vZGlmeVZpZXc8UCwgPz4+CisgICAgU2NvcGVkQmluZGluZ0J1aWxkZXIgdG9Qcm92aWRlcihDbGFzczw/IGV4dGVuZHMgUHJvdmlkZXI8PyBleHRlbmRzIFQ+PiBwcm92aWRlclR5cGUpIHsKKyAgICAgIHJldHVybiBiaW5kZXIudG9Qcm92aWRlcihwcm92aWRlclR5cGUpOworICAgIH0KKworICAgIHB1YmxpYyA8VCBleHRlbmRzIFJlc3RNb2RpZnlWaWV3PFAsID8+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvUHJvdmlkZXIoUHJvdmlkZXI8PyBleHRlbmRzIFQ+IHByb3ZpZGVyKSB7CisgICAgICByZXR1cm4gYmluZGVyLnRvUHJvdmlkZXIocHJvdmlkZXIpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGRDb2xsZWN0aW9uQmluZGVyPFAgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+IHsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZEJpbmRpbmdCdWlsZGVyPFJlc3RWaWV3PFA+PiBiaW5kZXI7CisKKyAgICBwcml2YXRlIENoaWxkQ29sbGVjdGlvbkJpbmRlcihMaW5rZWRCaW5kaW5nQnVpbGRlcjxSZXN0VmlldzxQPj4gYmluZGVyKSB7CisgICAgICB0aGlzLmJpbmRlciA9IGJpbmRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgPEMgZXh0ZW5kcyBSZXN0UmVzb3VyY2UsIFQgZXh0ZW5kcyBDaGlsZENvbGxlY3Rpb248UCwgQz4+CisgICAgU2NvcGVkQmluZGluZ0J1aWxkZXIgdG8oQ2xhc3M8VD4gaW1wbCkgeworICAgICAgcmV0dXJuIGJpbmRlci50byhpbXBsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPEMgZXh0ZW5kcyBSZXN0UmVzb3VyY2UsIFQgZXh0ZW5kcyBDaGlsZENvbGxlY3Rpb248UCwgQz4+CisgICAgdm9pZCB0b0luc3RhbmNlKFQgaW1wbCkgeworICAgICAgYmluZGVyLnRvSW5zdGFuY2UoaW1wbCk7CisgICAgfQorCisgICAgcHVibGljIDxDIGV4dGVuZHMgUmVzdFJlc291cmNlLCBUIGV4dGVuZHMgQ2hpbGRDb2xsZWN0aW9uPFAsIEM+PgorICAgIFNjb3BlZEJpbmRpbmdCdWlsZGVyIHRvUHJvdmlkZXIoQ2xhc3M8PyBleHRlbmRzIFByb3ZpZGVyPD8gZXh0ZW5kcyBUPj4gcHJvdmlkZXJUeXBlKSB7CisgICAgICByZXR1cm4gYmluZGVyLnRvUHJvdmlkZXIocHJvdmlkZXJUeXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPEMgZXh0ZW5kcyBSZXN0UmVzb3VyY2UsIFQgZXh0ZW5kcyBDaGlsZENvbGxlY3Rpb248UCwgQz4+CisgICAgU2NvcGVkQmluZGluZ0J1aWxkZXIgdG9Qcm92aWRlcihQcm92aWRlcjw/IGV4dGVuZHMgVD4gcHJvdmlkZXIpIHsKKyAgICAgIHJldHVybiBiaW5kZXIudG9Qcm92aWRlcihwcm92aWRlcik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0Q29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdENvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmQwZGJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdENvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIGFjY2Vzc2libGUgdGhyb3VnaCBhIFJFU1QgQVBJLgorICogPHA+CisgKiBUbyBidWlsZCBhIGNvbGxlY3Rpb24gZGVjbGFyZSBhIHJlc291cmNlLCB0aGUgbWFwIGluIGEgbW9kdWxlLCBhbmQgdGhlCisgKiBjb2xsZWN0aW9uIGl0c2VsZiBhY2NlcHRpbmcgdGhlIG1hcDoKKyAqCisgKiA8cHJlPgorICogcHVibGljIGNsYXNzIE15UmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICogICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsJmx0O1Jlc3RWaWV3Jmx0O015UmVzb3VyY2UmZ3Q7Jmd0OyBNWV9LSU5EID0KKyAqICAgICAgIG5ldyBUeXBlTGl0ZXJhbCZsdDtSZXN0VmlldyZsdDtNeVJlc291cmNlJmd0OyZndDsoKSB7fTsKKyAqIH0KKyAqCisgKiBwdWJsaWMgY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CisgKiAgICYjMDY0O092ZXJyaWRlCisgKiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAqICAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBNeVJlc291cmNlLk1ZX0tJTkQpOworICoKKyAqICAgICBnZXQoTXlSZXNvdXJjZS5NWV9LSU5ELCAmcXVvdDthY3Rpb24mcXVvdDspLnRvKE15QWN0aW9uLmNsYXNzKTsKKyAqICAgfQorICogfQorICoKKyAqIHB1YmxpYyBjbGFzcyBNeUNvbGxlY3Rpb24gZXh0ZW5kcyBSZXN0Q29sbGVjdGlvbiZsdDtUb3BMZXZlbFJlc291cmNlLCBNeVJlc291cmNlJmd0OyB7CisgKiAgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcCZsdDtSZXN0VmlldyZsdDtNeVJlc291cmNlJmd0OyZndDsgdmlld3M7CisgKgorICogICAmIzA2NDtJbmplY3QKKyAqICAgTXlDb2xsZWN0aW9uKER5bmFtaWNNYXAmbHQ7UmVzdFZpZXcmbHQ7TXlSZXNvdXJjZSZndDsmZ3Q7IHZpZXdzKSB7CisgKiAgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICogICB9CisgKgorICogICBwdWJsaWMgRHluYW1pY01hcCZsdDtSZXN0VmlldyZsdDtNeVJlc291cmNlJmd0OyZndDsgdmlld3MoKSB7CisgKiAgICAgcmV0dXJuIHZpZXdzOworICogICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFRvIGJ1aWxkIGEgbmVzdGVkIGNvbGxlY3Rpb24sIGltcGxlbWVudCB7QGxpbmsgQ2hpbGRDb2xsZWN0aW9ufS4KKyAqCisgKiBAcGFyYW0gPFA+IHR5cGUgb2YgdGhlIHBhcmVudCByZXNvdXJjZS4gRm9yIGEgdG9wIGxldmVsIGNvbGxlY3Rpb24gdGhpcworICogICAgICAgIHNob3VsZCBhbHdheXMgYmUge0BsaW5rIFRvcExldmVsUmVzb3VyY2V9LgorICogQHBhcmFtIDxSPiB0eXBlIG9mIHJlc291cmNlIG9wZXJhdGVkIG9uIGJ5IGVhY2ggdmlldy4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXN0Q29sbGVjdGlvbjxQIGV4dGVuZHMgUmVzdFJlc291cmNlLCBSIGV4dGVuZHMgUmVzdFJlc291cmNlPiB7CisgIC8qKgorICAgKiBDcmVhdGUgYSB2aWV3IHRvIGxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb2xsZWN0aW9uLgorICAgKiA8cD4KKyAgICogVGhlIHJldHVybmVkIHZpZXcgc2hvdWxkIGFjY2VwdCB0aGUgcGFyZW50IHR5cGUgdG8gc2NvcGUgdGhlIHNlYXJjaCwgYW5kCisgICAqIG1heSB3YW50IHRvIHRha2UgYSAicSIgcGFyYW1ldGVyIG9wdGlvbiB0byBuYXJyb3cgdGhlIHJlc3VsdHMuCisgICAqCisgICAqIEByZXR1cm4gdmlldyB0byBsaXN0IHRoZSBjb2xsZWN0aW9uLgorICAgKiBAdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNvbGxlY3Rpb24gY2Fubm90IGJlIGxpc3RlZC4KKyAgICogQHRocm93cyBBdXRoRXhjZXB0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uLgorICAgKi8KKyAgUmVzdFZpZXc8UD4gbGlzdCgpIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBQYXJzZSBhIHBhdGggY29tcG9uZW50IGludG8gYSByZXNvdXJjZSBoYW5kbGUuCisgICAqCisgICAqIEBwYXJhbSBwYXJlbnQgdGhlIGhhbmRsZSB0byB0aGUgY29sbGVjdGlvbi4KKyAgICogQHBhcmFtIGlkIHN0cmluZyBpZGVudGlmaWVyIHN1cHBsaWVkIGJ5IHRoZSBjbGllbnQuIEluIGEgVVJMIHN1Y2ggYXMKKyAgICogICAgICAgIHtAY29kZSAvY2hhbmdlcy8xMjM0L2FiYW5kb259IHRoaXMgc3RyaW5nIGlzIHtAY29kZSAiMTIzNCJ9LgorICAgKiBAcmV0dXJuIGEgcmVzb3VyY2UgaGFuZGxlIGZvciB0aGUgaWRlbnRpZmllZCBvYmplY3QuCisgICAqIEB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LCBvciB0aGUgY2FsbGVyCisgICAqICAgICAgICAgaXMgbm90IHBlcm1pdHRlZCB0byBrbm93IGlmIHRoZSByZXNvdXJjZSBleGlzdHMuCisgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHRoZSBpbXBsZW1lbnRhdGlvbiBoYWQgYW55IGVycm9ycyBjb252ZXJ0aW5nIHRvIGEKKyAgICogICAgICAgICByZXNvdXJjZSBoYW5kbGUuIFRoaXMgcmVzdWx0cyBpbiBhbiBIVFRQIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IuCisgICAqLworICBSIHBhcnNlKFAgcGFyZW50LCBJZFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIEV4Y2VwdGlvbjsKKworICAvKioKKyAgICogR2V0IHRoZSB2aWV3cyB0aGF0IHN1cHBvcnQgdGhpcyBjb2xsZWN0aW9uLgorICAgKiA8cD4KKyAgICogV2l0aGluIGEgcmVzb3VyY2UgdGhlIHZpZXdzIGFyZSBhY2Nlc3NlZCBhcyB7QGNvZGUgUkVTT1VSQ0UvcGx1Z2lufnZpZXd9LgorICAgKgorICAgKiBAcmV0dXJuIG1hcCBvZiB2aWV3cy4KKyAgICovCisgIER5bmFtaWNNYXA8UmVzdFZpZXc8Uj4+IHZpZXdzKCk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0TW9kaWZ5Vmlldy5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdE1vZGlmeVZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmEwMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdE1vZGlmeVZpZXcuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKioKKyAqIFJlc3RWaWV3IHRoYXQgc3VwcG9ydHMgYWNjZXB0aW5nIGlucHV0IGFuZCBjaGFuZ2luZyBhIHJlc291cmNlLgorICogPHA+CisgKiBUaGUgaW5wdXQgbXVzdCBiZSBzdXBwbGllZCBhcyBKU09OIGFzIHRoZSBib2R5IG9mIHRoZSBIVFRQIHJlcXVlc3QuIE1vZGlmeQorICogdmlld3MgY2FuIGJlIGludm9rZWQgYnkgYW55IEhUVFAgbWV0aG9kIHRoYXQgaXMgbm90IHtAY29kZSBHRVR9LCB3aGljaAorICogaW5jbHVkZXMge0Bjb2RlIFBPU1R9LCB7QGNvZGUgUFVUfSwge0Bjb2RlIERFTEVURX0uCisgKgorICogQHBhcmFtIDxSPiB0eXBlIG9mIHRoZSByZXNvdXJjZSB0aGUgdmlldyBtb2RpZmllcy4KKyAqIEBwYXJhbSA8ST4gdHlwZSBvZiBpbnB1dCB0aGUgSlNPTiBwYXJzZXIgd2lsbCBwYXJzZSB0aGUgaW5wdXQgaW50by4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXN0TW9kaWZ5VmlldzxSIGV4dGVuZHMgUmVzdFJlc291cmNlLCBJPiBleHRlbmRzIFJlc3RWaWV3PFI+IHsKKyAgLyoqCisgICAqIFByb2Nlc3MgdGhlIHZpZXcgb3BlcmF0aW9uIGJ5IGFsdGVyaW5nIHRoZSByZXNvdXJjZS4KKyAgICoKKyAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIHRvIG1vZGlmeS4KKyAgICogQHBhcmFtIGlucHV0IGlucHV0IGFmdGVyIHBhcnNpbmcgZnJvbSByZXF1ZXN0LgorICAgKiBAcmV0dXJuIHJlc3VsdCB0byByZXR1cm4gdG8gdGhlIGNsaWVudC4gVXNlIHtAbGluayBCaW5hcnlSZXN1bHR9IHRvIGF2b2lkCisgICAqICAgICAgICAgYXV0b21hdGljIGNvbnZlcnNpb24gdG8gSlNPTi4KKyAgICogQHRocm93cyBBdXRoRXhjZXB0aW9uIHRoZSBjbGllbnQgaXMgbm90IHBlcm1pdHRlZCB0byBhY2Nlc3MgdGhpcyB2aWV3LgorICAgKiBAdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24gdGhlIHJlcXVlc3Qgd2FzIGluY29ycmVjdGx5IHNwZWNpZmllZCBhbmQKKyAgICogICAgICAgICBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGlzIHZpZXcuCisgICAqIEB0aHJvd3MgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiB0aGUgcmVzb3VyY2Ugc3RhdGUgZG9lcyBub3QgcGVybWl0IHRoaXMKKyAgICogICAgICAgICB2aWV3IHRvIG1ha2UgdGhlIGNoYW5nZXMgYXQgdGhpcyB0aW1lLgorICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZpZXcgZmFpbGVkLiBUaGUgZXhjZXB0aW9uIHdpbGwKKyAgICogICAgICAgICBiZSBsb2dnZWQgYW5kIEhUVFAgNTAwIEludGVybmFsIFNlcnZlciBFcnJvciB3aWxsIGJlIHJldHVybmVkIHRvCisgICAqICAgICAgICAgdGhlIGNsaWVudC4KKyAgICovCisgIE9iamVjdCBhcHBseShSIHJlc291cmNlLCBJIGlucHV0KSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RSZWFkVmlldy5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdFJlYWRWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjMjUwZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RSZWFkVmlldy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKy8qKgorICogUmVzdFZpZXcgdG8gcmVhZCBhIHJlc291cmNlIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICoKKyAqIEBwYXJhbSA8Uj4gdHlwZSBvZiByZXNvdXJjZSB0aGUgdmlldyByZWFkcy4KKyAqLworcHVibGljIGludGVyZmFjZSBSZXN0UmVhZFZpZXc8UiBleHRlbmRzIFJlc3RSZXNvdXJjZT4gZXh0ZW5kcyBSZXN0VmlldzxSPiB7CisgIC8qKgorICAgKiBQcm9jZXNzIHRoZSB2aWV3IG9wZXJhdGlvbiBieSByZWFkaW5nIGZyb20gdGhlIHJlc291cmNlLgorICAgKgorICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgdG8gbW9kaWZ5LgorICAgKiBAcmV0dXJuIHJlc3VsdCB0byByZXR1cm4gdG8gdGhlIGNsaWVudC4gVXNlIHtAbGluayBCaW5hcnlSZXN1bHR9IHRvIGF2b2lkCisgICAqICAgICAgICAgYXV0b21hdGljIGNvbnZlcnNpb24gdG8gSlNPTi4KKyAgICogQHRocm93cyBBdXRoRXhjZXB0aW9uIHRoZSBjbGllbnQgaXMgbm90IHBlcm1pdHRlZCB0byBhY2Nlc3MgdGhpcyB2aWV3LgorICAgKiBAdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24gdGhlIHJlcXVlc3Qgd2FzIGluY29ycmVjdGx5IHNwZWNpZmllZCBhbmQKKyAgICogICAgICAgICBjYW5ub3QgYmUgaGFuZGxlZCBieSB0aGlzIHZpZXcuCisgICAqIEB0aHJvd3MgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiB0aGUgcmVzb3VyY2Ugc3RhdGUgZG9lcyBub3QgcGVybWl0IHRoaXMKKyAgICogICAgICAgICB2aWV3IHRvIG1ha2UgdGhlIGNoYW5nZXMgYXQgdGhpcyB0aW1lLgorICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZpZXcgZmFpbGVkLiBUaGUgZXhjZXB0aW9uIHdpbGwKKyAgICogICAgICAgICBiZSBsb2dnZWQgYW5kIEhUVFAgNTAwIEludGVybmFsIFNlcnZlciBFcnJvciB3aWxsIGJlIHJldHVybmVkIHRvCisgICAqICAgICAgICAgdGhlIGNsaWVudC4KKyAgICovCisgIE9iamVjdCBhcHBseShSIHJlc291cmNlKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzYTU3MAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1Jlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKy8qKgorICogR2VuZXJpYyByZXNvdXJjZSBoYW5kbGUgZGVmaW5pbmcgYXJndW1lbnRzIHRvIHZpZXdzLgorICogPHA+CisgKiBSZXNvdXJjZSBoYW5kbGUgcmV0dXJuZWQgYnkge0BsaW5rIFJlc3RDb2xsZWN0aW9ufSBhbmQgcGFzc2VkIHRvIGEKKyAqIHtAbGluayBSZXN0Vmlld30gc3VjaCBhcyB7QGxpbmsgUmVzdFJlYWRWaWV3fSBvciB7QGxpbmsgUmVzdE1vZGlmeVZpZXd9LgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc3RSZXNvdXJjZSB7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9SZXN0Vmlldy5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmFkZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvUmVzdFZpZXcuamF2YQpAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKioKKyAqIEFueSB0eXBlIG9mIHZpZXcsIHNlZSB7QGxpbmsgUmVzdFJlYWRWaWV3fSBmb3IgcmVhZHMsIHtAbGluayBSZXN0TW9kaWZ5Vmlld30KKyAqIGZvciB1cGRhdGVzLCBhbmQge0BsaW5rIFJlc3RDb2xsZWN0aW9ufSBmb3IgbmVzdGVkIGNvbGxlY3Rpb25zLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc3RWaWV3PFIgZXh0ZW5kcyBSZXN0UmVzb3VyY2U+IHsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1N0cmVhbWluZ1Jlc3BvbnNlLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9TdHJlYW1pbmdSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZmI5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9TdHJlYW1pbmdSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitwdWJsaWMgaW50ZXJmYWNlIFN0cmVhbWluZ1Jlc3BvbnNlIHsKKyAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOworICBwdWJsaWMgdm9pZCBzdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvVG9wTGV2ZWxSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LWV4dGVuc2lvbi1hcGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9leHRlbnNpb25zL3Jlc3RhcGkvVG9wTGV2ZWxSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGQyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9Ub3BMZXZlbFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aHRlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGk7CisKKy8qKiBTcGVjaWFsIG1hcmtlciByZXNvdXJjZSBuYW1pbmcgdGhlIHRvcC1sZXZlbCBvZiBhIFJFU1Qgc3BhY2UuICovCitwdWJsaWMgY2xhc3MgVG9wTGV2ZWxSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc3RSZXNvdXJjZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9wTGV2ZWxSZXNvdXJjZSBJTlNUQU5DRSA9IG5ldyBUb3BMZXZlbFJlc291cmNlKCk7CisKKyAgcHJpdmF0ZSBUb3BMZXZlbFJlc291cmNlKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzNjk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1VucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCisvKiogUmVzb3VyY2UgcmVmZXJlbmNlZCBpbiB0aGUgcmVxdWVzdCBib2R5IGlzIG5vdCBmb3VuZCAoSFRUUCA0MjIgVW5wcm9jZXNzYWJsZSBFbnRpdHkpLiAqLworcHVibGljIGNsYXNzIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24gZXh0ZW5kcyBSZXN0QXBpRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgcHVibGljIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24oU3RyaW5nIG1zZykgIHsKKyAgICBzdXBlcihtc2cpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9VcmwuamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy9yZXN0YXBpL1VybC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGQ5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvcmVzdGFwaS9VcmwuamF2YQpAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKKworLyoqIFVSTCByZWxhdGVkIHV0aWxpdHkgZnVuY3Rpb25zLiAqLworcHVibGljIGZpbmFsIGNsYXNzIFVybCB7CisgIC8qKgorICAgKiBFbmNvZGUgYSBwYXRoIHNlZ21lbnQsIGVzY2FwaW5nIGNoYXJhY3RlcnMgbm90IHZhbGlkIGZvciBhIFVSTC4KKyAgICogPHA+CisgICAqIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycyBhcmUgbm90IGVzY2FwZWQ6CisgICAqIDx1bD4KKyAgICogPGxpPntAY29kZSBhLi56LCBBLi5aLCAwLi45fQorICAgKiA8bGk+e0Bjb2RlIC4gLSAqIF99CisgICAqIDwvdWw+CisgICAqIDxwPgorICAgKiAnICcgKHNwYWNlKSBpcyBlbmNvZGVkIGFzICcrJy4KKyAgICogPHA+CisgICAqIEFsbCBvdGhlciBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgJy8nKSBhcmUgY29udmVydGVkIHRvIHRoZSB0cmlwbGV0ICIleHkiCisgICAqIHdoZXJlICJ4eSIgaXMgdGhlIGhleCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2hhcmFjdGVyIGluIFVURi04LgorICAgKgorICAgKiBAcGFyYW0gY29tcG9uZW50IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGV4dCB0byBlbmNvZGUuCisgICAqIEByZXR1cm4gYSBzdHJpbmcgd2l0aCBhbGwgaW52YWxpZCBVUkwgY2hhcmFjdGVycyBlc2NhcGVkLgorICAgKi8KKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBjb21wb25lbnQpIHsKKyAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJldHVybiBVUkxFbmNvZGVyLmVuY29kZShjb21wb25lbnQsICJVVEYtOCIpOworICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJKVk0gbXVzdCBzdXBwb3J0IFVURi04IiwgZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgLyoqIERlY29kZSBhIFVSTCBlbmNvZGVkIHN0cmluZywgZS5nLiBmcm9tIHtAY29kZSAiJTJGIn0gdG8ge0Bjb2RlICIvIn0uICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShTdHJpbmcgc3RyKSB7CisgICAgaWYgKHN0ciAhPSBudWxsKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gVVJMRGVjb2Rlci5kZWNvZGUoc3RyLCAiVVRGLTgiKTsKKyAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSlZNIG11c3Qgc3VwcG9ydCBVVEYtOCIsIGUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgVXJsKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvR3d0UGx1Z2luLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvR3d0UGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0MWEzZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy93ZWJ1aS9Hd3RQbHVnaW4uamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aTsKKworLyoqIENvbmZpZ3VyZXMgYSB3ZWIgVUkgcGx1Z2luIGNvbXBpbGVkIHVzaW5nIEdXVC4gKi8KK3B1YmxpYyBjbGFzcyBHd3RQbHVnaW4gZXh0ZW5kcyBXZWJVaVBsdWdpbiB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWU7CisKKyAgLyoqCisgICAqIEBwYXJhbSBtb2R1bGVOYW1lIG5hbWUgb2YgR1dUIG1vZHVsZS4gVGhlIHJlc291cmNlCisgICAqICAgICAgICB7QGNvZGUgc3RhdGljLyRNT0RVTEUvJE1PRFVMRS5ub2NhY2hlLmpzfSB3aWxsIGJlIHVzZWQuCisgICAqLworICBwdWJsaWMgR3d0UGx1Z2luKFN0cmluZyBtb2R1bGVOYW1lKSB7CisgICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEphdmFTY3JpcHRSZXNvdXJjZVBhdGgoKSB7CisgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInN0YXRpYy8lcy8lcy5ub2NhY2hlLmpzIiwgbW9kdWxlTmFtZSwgbW9kdWxlTmFtZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy93ZWJ1aS9KYXZhU2NyaXB0UGx1Z2luLmphdmEgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvSmF2YVNjcmlwdFBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YTRmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvSmF2YVNjcmlwdFBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLndlYnVpOworCisvKiogQ29uZmlndXJlcyBhIHdlYiBVSSBwbHVnaW4gd3JpdHRlbiB1c2luZyBKYXZhU2NyaXB0LiAqLworcHVibGljIGNsYXNzIEphdmFTY3JpcHRQbHVnaW4gZXh0ZW5kcyBXZWJVaVBsdWdpbiB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbGVOYW1lOworCisgIC8qKgorICAgKiBAcGFyYW0gZmlsZU5hbWUgb2YgSmF2YVNjcmlwdCBzb3VyY2UgZmlsZSB1bmRlciB7QGNvZGUgc3RhdGljL30KKyAgICogICAgICAgIHN1YmRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbidzIEpBUi4KKyAgICovCisgIHB1YmxpYyBKYXZhU2NyaXB0UGx1Z2luKFN0cmluZyBmaWxlTmFtZSkgeworICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEphdmFTY3JpcHRSZXNvdXJjZVBhdGgoKSB7CisgICAgcmV0dXJuICJzdGF0aWMvIiArIGZpbGVOYW1lOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvV2ViVWlQbHVnaW4uamF2YSBiL2dlcnJpdC1leHRlbnNpb24tYXBpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvZXh0ZW5zaW9ucy93ZWJ1aS9XZWJVaVBsdWdpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDE5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZXh0ZW5zaW9uLWFwaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2V4dGVuc2lvbnMvd2VidWkvV2ViVWlQbHVnaW4uamF2YQpAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuRXh0ZW5zaW9uUG9pbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5QbHVnaW5OYW1lOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBTcGVjaWZpZXMgSmF2YVNjcmlwdCB0byBkeW5hbWljYWxseSBsb2FkIGludG8gdGhlIHdlYiBVSS4KKyAqIDxwPgorICogVG8gYXV0b21hdGljYWxseSByZWdpc3RlciAoaW5zdGVhZCBvZiB3cml0aW5nIGEgR3VpY2UgbW9kdWxlKSwgZGVjbGFyZSB0aGUKKyAqIGludGVudGlvbiB3aXRoIHtAY29kZSBATGlzdGVufSwgZXh0ZW5kIHRoZSBjb3JyZWN0IGNsYXNzIGFuZCBkZWZpbmUgYQorICogY29uc3RydWN0b3IgdG8gY29uZmlndXJlIHRoZSBjb3JyZWN0IHJlc291cmNlOgorICoKKyAqIDxwcmU+CisgKiAmIzA2NDtMaXN0ZW4KKyAqIGNsYXNzIE15SnMgZXh0ZW5kcyBKYXZhU2NyaXB0UGx1Z2luIHsKKyAqICAgTXlKcygpIHsKKyAqICAgICBzdXBlcigmcXVvdDtoZWxsby5qcyZxdW90Oyk7CisgKiAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIEBzZWUgR3d0UGx1Z2luCisgKiBAc2VlIEphdmFTY3JpcHRQbHVnaW4KKyAqLworQEV4dGVuc2lvblBvaW50CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgV2ViVWlQbHVnaW4geworICBwdWJsaWMgc3RhdGljIGZpbmFsIEd3dFBsdWdpbiBnd3QoU3RyaW5nIG1vZHVsZU5hbWUpIHsKKyAgICByZXR1cm4gbmV3IEd3dFBsdWdpbihtb2R1bGVOYW1lKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVNjcmlwdFBsdWdpbiBqcyhTdHJpbmcgc2NyaXB0TmFtZSkgeworICAgIHJldHVybiBuZXcgSmF2YVNjcmlwdFBsdWdpbihzY3JpcHROYW1lKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIHBsdWdpbk5hbWU7CisKKyAgLyoqIEByZXR1cm4gaW5zdGFsbGVkIG5hbWUgb2YgdGhlIHBsdWdpbiB0aGF0IHByb3ZpZGVzIHRoaXMgVUkgZmVhdHVyZS4gICovCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGx1Z2luTmFtZSgpIHsKKyAgICByZXR1cm4gcGx1Z2luTmFtZTsKKyAgfQorCisgIEBJbmplY3QKKyAgdm9pZCBzZXRQbHVnaW5OYW1lKEBQbHVnaW5OYW1lIFN0cmluZyBwbHVnaW5OYW1lKSB7CisgICAgdGhpcy5wbHVnaW5OYW1lID0gcGx1Z2luTmFtZTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHBhdGggdG8gaW5pdGlhbGl6YXRpb24gc2NyaXB0IHdpdGhpbiB0aGUgcGx1Z2luJ3MgSkFSLiAqLworICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEphdmFTY3JpcHRSZXNvdXJjZVBhdGgoKTsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gZ2V0SmF2YVNjcmlwdFJlc291cmNlUGF0aCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0ZGVidWcvcG9tLnhtbCBiL2dlcnJpdC1nd3RkZWJ1Zy9wb20ueG1sCmluZGV4IDAxYjkzYTYuLmRhMTZlZGEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3RkZWJ1Zy9wb20ueG1sCisrKyBiL2dlcnJpdC1nd3RkZWJ1Zy9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtZ3d0ZGVidWc8L2FydGlmYWN0SWQ+CkBAIC0zNCwxMSArMzQsNiBAQAogCiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmd3dC1kZXY8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC1nd3R1aTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KQEAgLTczLDE0ICs2OCwxMiBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+Ym91bmN5Y2FzdGxlPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YmNwcm92LWpkazE1PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MTQwPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmJvdW5jeWNhc3RsZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmJjcGctamRrMTU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xNDA8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KIApAQCAtOTYsNSArODksMTIgQEAKICAgICAgIDxjbGFzc2lmaWVyPnNvdXJjZXM8L2NsYXNzaWZpZXI+CiAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KKworICAgICA8IS0tIFdvcmthcm91bmQgZm9yIG92ZXJ3cml0aW5nIG91ciBkZXBlbmRlbmNpZXMgKGxpa2UgYXJnczRqKSBieSBhZGRpdGlvbmFsCisgICAgICBjbGFzc2VzIHB1dCBpbiBnd3QtZGV2LmphciAtLT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3d0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3d0LWRldjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3BvbS54bWwgYi9nZXJyaXQtZ3d0dWkvcG9tLnhtbAppbmRleCBiMzI5MWQxLi40M2IyNmMxIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvcG9tLnhtbAorKysgYi9nZXJyaXQtZ3d0dWkvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LWd3dHVpPC9hcnRpZmFjdElkPgpAQCAtMjAyLDE2ICsyMDIsMzIgQEAKICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5nd3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8bW9kdWxlPiR7R2Vycml0R3d0VUkuYnJvd3NlclR5cGV9PC9tb2R1bGU+Ci0gICAgICAgICAgPGV4dHJhSnZtQXJncz4tWG14NTEybTwvZXh0cmFKdm1BcmdzPgotICAgICAgICAgIDxjb21waWxlUmVwb3J0PiR7Z3d0LmNvbXBpbGVSZXBvcnR9PC9jb21waWxlUmVwb3J0PgotICAgICAgICAgIDxkaXNhYmxlQ2xhc3NNZXRhZGF0YT50cnVlPC9kaXNhYmxlQ2xhc3NNZXRhZGF0YT4KLSAgICAgICAgICA8ZGlzYWJsZUNhc3RDaGVja2luZz50cnVlPC9kaXNhYmxlQ2FzdENoZWNraW5nPgotICAgICAgICAgIDxkcmFmdENvbXBpbGU+JHtHZXJyaXRHd3RVSS5kcmFmdENvbXBpbGV9PC9kcmFmdENvbXBpbGU+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5vcHRpbWl6ZWQ8L2lkPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxtb2R1bGU+JHtHZXJyaXRHd3RVSS5icm93c2VyVHlwZX08L21vZHVsZT4KKyAgICAgICAgICAgICAgPGV4dHJhSnZtQXJncz4tWG14NTEybTwvZXh0cmFKdm1BcmdzPgorICAgICAgICAgICAgICA8Y29tcGlsZVJlcG9ydD4ke2d3dC5jb21waWxlUmVwb3J0fTwvY29tcGlsZVJlcG9ydD4KKyAgICAgICAgICAgICAgPGRpc2FibGVDbGFzc01ldGFkYXRhPnRydWU8L2Rpc2FibGVDbGFzc01ldGFkYXRhPgorICAgICAgICAgICAgICA8ZGlzYWJsZUNhc3RDaGVja2luZz50cnVlPC9kaXNhYmxlQ2FzdENoZWNraW5nPgorICAgICAgICAgICAgICA8ZHJhZnRDb21waWxlPiR7R2Vycml0R3d0VUkuZHJhZnRDb21waWxlfTwvZHJhZnRDb21waWxlPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmRlYnVnPC9pZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8c3R5bGU+UFJFVFRZPC9zdHlsZT4KKyAgICAgICAgICAgICAgPG1vZHVsZT4ke0dlcnJpdEd3dFVJLmJyb3dzZXJUeXBlfTwvbW9kdWxlPgorICAgICAgICAgICAgICA8ZXh0cmFKdm1BcmdzPi1YbXg1MTJtPC9leHRyYUp2bUFyZ3M+CisgICAgICAgICAgICAgIDxkaXNhYmxlQ2xhc3NNZXRhZGF0YT50cnVlPC9kaXNhYmxlQ2xhc3NNZXRhZGF0YT4KKyAgICAgICAgICAgICAgPGRpc2FibGVSdW5Bc3luYz50cnVlPC9kaXNhYmxlUnVuQXN5bmM+CisgICAgICAgICAgICAgIDxkcmFmdENvbXBpbGU+dHJ1ZTwvZHJhZnRDb21waWxlPgorICAgICAgICAgICAgICA8d2ViYXBwRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9X2RiZzwvd2ViYXBwRGlyZWN0b3J5PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPGdvYWxzPgogICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgogICAgICAgICAgICAgPC9nb2Fscz4KQEAgLTIzMiw3ICsyNDgsOCBAQAogICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICAgIDx0YXJnZXQ+CiAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRzdCIgbG9jYXRpb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9Ii8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcCIgbG9jYXRpb249IiR7ZHN0fS9nZXJyaXQiLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZGJnIiBsb2NhdGlvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX1fZGJnIi8+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFwcCIgbG9jYXRpb249IiR7ZHN0fS9nZXJyaXRfdWkiLz4KIAogICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7YXBwfSIvPgogICAgICAgICAgICAgICAgIDxhcHBseSBleGVjdXRhYmxlPSJnemlwIiBhZGRzb3VyY2VmaWxlPSJmYWxzZSI+CkBAIC0yNDcsNiArMjY0LDE2IEBACiAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXRtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKiIgdG89IiR7YXBwfS8qLmd6Ii8+CiAgICAgICAgICAgICAgICAgICA8L3JlZGlyZWN0b3I+CiAgICAgICAgICAgICAgICAgPC9hcHBseT4KKworICAgICAgICAgICAgICAgIDxjb3B5IGZpbGU9IiR7ZGJnfS9nZXJyaXRfdWkvZ2Vycml0X3VpLm5vY2FjaGUuanMiCisgICAgICAgICAgICAgICAgICAgICAgdG9maWxlPSIke2FwcH0vZ2Vycml0X2RiZy5ub2NhY2hlLmpzIi8+CisgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7YXBwfSIgb3ZlcndyaXRlPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZGJnfS9nZXJyaXRfdWkiPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5jc3MiLz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iZGVmZXJyZWRqcy8qKi8qLmpzIi8+CisgICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgPC9jb3B5PgogICAgICAgICAgICAgICA8L3RhcmdldD4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICA8L2V4ZWN1dGlvbj4KQEAgLTI1Nyw3ICsyODQsNyBAQAogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxwYWNrYWdpbmdFeGNsdWRlcz5XRUItSU5GL2NsYXNzZXMvKiosV0VCLUlORi9saWIvKio8L3BhY2thZ2luZ0V4Y2x1ZGVzPgorICAgICAgICAgIDxwYWNrYWdpbmdFeGNsdWRlcz5XRUItSU5GL2NsYXNzZXMvKiosV0VCLUlORi9kZXBsb3kvKiosV0VCLUlORi9saWIvKio8L3BhY2thZ2luZ0V4Y2x1ZGVzPgogICAgICAgICAgIDxhdHRhY2hDbGFzc2VzPnRydWU8L2F0dGFjaENsYXNzZXM+CiAgICAgICAgICAgPGFyY2hpdmU+CiAgICAgICAgICAgICA8YWRkTWF2ZW5EZXNjcmlwdG9yPmZhbHNlPC9hZGRNYXZlbkRlc2NyaXB0b3I+CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSS5nd3QueG1sIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvR2Vycml0R3d0VUkuZ3d0LnhtbAppbmRleCA4NTU1Yzc1Li41ZmRjNWJiIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSS5nd3QueG1sCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJLmd3dC54bWwKQEAgLTEzLDcgKzEzLDcgQEAKICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxtb2R1bGUgcmVuYW1lLXRvPSJnZXJyaXQiPgorPG1vZHVsZSByZW5hbWUtdG89ImdlcnJpdF91aSI+CiAgIDxpbmhlcml0cyBuYW1lPSdjb20uZ29vZ2xlLmd3dC5lZGl0b3IuRWRpdG9yJy8+CiAgIDxpbmhlcml0cyBuYW1lPSdjb20uZ29vZ2xlLmd3dC51c2VyLlVzZXInLz4KICAgPGluaGVyaXRzIG5hbWU9J2NvbS5nb29nbGUuZ3d0LnJlc291cmNlcy5SZXNvdXJjZXMnLz4KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJZ2Vja28xXzguZ3d0LnhtbCBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJZ2Vja28xXzguZ3d0LnhtbAppbmRleCBkMWE5ZmU0Li5kN2U4MzVmIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSWdlY2tvMV84Lmd3dC54bWwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvR2Vycml0R3d0VUlnZWNrbzFfOC5nd3QueG1sCkBAIC0xMyw3ICsxMyw3IEBACiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08bW9kdWxlIHJlbmFtZS10bz0iZ2Vycml0Ij4KKzxtb2R1bGUgcmVuYW1lLXRvPSJnZXJyaXRfdWkiPgogICA8aW5oZXJpdHMgbmFtZT0nY29tLmdvb2dsZS5nZXJyaXQuR2Vycml0R3d0VUknLz4KICAgPHNldC1wcm9wZXJ0eSBuYW1lPSJ1c2VyLmFnZW50IiB2YWx1ZT0iZ2Vja28xXzgiIC8+CiAgIDxzZXQtcHJvcGVydHkgbmFtZT0ibG9jYWxlIiB2YWx1ZT0iZGVmYXVsdCIgLz4KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJc2FmYXJpLmd3dC54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9HZXJyaXRHd3RVSXNhZmFyaS5nd3QueG1sCmluZGV4IDc2NTVjMWYuLjg4YmVhODQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L0dlcnJpdEd3dFVJc2FmYXJpLmd3dC54bWwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvR2Vycml0R3d0VUlzYWZhcmkuZ3d0LnhtbApAQCAtMTMsNyArMTMsNyBAQAogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPG1vZHVsZSByZW5hbWUtdG89ImdlcnJpdCI+Cis8bW9kdWxlIHJlbmFtZS10bz0iZ2Vycml0X3VpIj4KICAgPGluaGVyaXRzIG5hbWU9J2NvbS5nb29nbGUuZ2Vycml0LkdlcnJpdEd3dFVJJy8+CiAgIDxzZXQtcHJvcGVydHkgbmFtZT0idXNlci5hZ2VudCIgdmFsdWU9InNhZmFyaSIgLz4KICAgPHNldC1wcm9wZXJ0eSBuYW1lPSJsb2NhbGUiIHZhbHVlPSJkZWZhdWx0IiAvPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0F2YXRhckltYWdlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvQXZhdGFySW1hZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDU5NzIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0F2YXRhckltYWdlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkVycm9yRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5FcnJvckhhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7CisKK3B1YmxpYyBjbGFzcyBBdmF0YXJJbWFnZSBleHRlbmRzIEltYWdlIHsKKworICAvKiogQSBkZWZhdWx0IHNpemVkIGF2YXRhciBpbWFnZS4gKi8KKyAgcHVibGljIEF2YXRhckltYWdlKEFjY291bnQuSWQgYWNjb3VudCkgeworICAgIHRoaXMoYWNjb3VudCwgMCk7CisgIH0KKworICAvKioKKyAgICogQW4gYXZhdGFyIGltYWdlIGZvciB0aGUgZ2l2ZW4gYWNjb3VudCB1c2luZyB0aGUgcmVxdWVzdGVkIHNpemUuCisgICAqCisgICAqIEBwYXJhbSBhY2NvdW50IFRoZSBhY2NvdW50IGluIHdoaWNoIHdlIGFyZSBpbnRlcmVzdGVkCisgICAqIEBwYXJhbSBzaXplIEEgcmVxdWVzdGVkIHNpemUuIE5vdGUgdGhhdCB0aGUgc2l6ZSBjYW4gYmUgaWdub3JlZCBkZXBlbmRpbmcKKyAgICogICAgICAgIG9uIHRoZSBhdmF0YXIgcHJvdmlkZXIuIEEgc2l6ZSA8PSAwIGluZGljYXRlcyB0byBsZXQgdGhlIHByb3ZpZGVyCisgICAqICAgICAgICBkZWNpZGUgYSBkZWZhdWx0IHNpemUuCisgICAqLworICBwdWJsaWMgQXZhdGFySW1hZ2UoQWNjb3VudC5JZCBhY2NvdW50LCBpbnQgc2l6ZSkgeworICAgIHN1cGVyKHVybChhY2NvdW50LCBzaXplKSk7CisKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgIC8vIElmIHRoZSBwcm92aWRlciBkb2VzIG5vdCByZXNpemUgdGhlIGltYWdlLCBmb3JjZSBpdCBpbiB0aGUgYnJvd3Nlci4KKyAgICAgIHNldFNpemUoc2l6ZSArICJweCIsIHNpemUgKyAicHgiKTsKKyAgICB9CisKKyAgICBhZGRFcnJvckhhbmRsZXIobmV3IEVycm9ySGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFcnJvckV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIFdlIGdvdCBhIDQwNCwgZG9uJ3QgYm90aGVyIHNob3dpbmcgdGhlIGltYWdlLiBFaXRoZXIgdGhlIHVzZXIgZG9lc24ndAorICAgICAgICAvLyBoYXZlIGFuIGF2YXRhciBvciB0aGVyZSBpcyBubyBhdmF0YXIgcHJvdmlkZXIgcGx1Z2luIGluc3RhbGxlZC4KKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXJsKEFjY291bnQuSWQgaWQsIGludCBzaXplKSB7CisgICAgU3RyaW5nIHU7CisgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkgJiYgaWQuZXF1YWxzKEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldElkKCkpKSB7CisgICAgICB1ID0gInNlbGYiOworICAgIH0gZWxzZSB7CisgICAgICB1ID0gaWQudG9TdHJpbmcoKTsKKyAgICB9CisgICAgUmVzdEFwaSBhcGkgPSBuZXcgUmVzdEFwaSgiL2FjY291bnRzLyIpLmlkKHUpLnZpZXcoImF2YXRhciIpOworICAgIGlmIChzaXplID4gMCkgeworICAgICAgYXBpLmFkZFBhcmFtZXRlcigicyIsIHNpemUpOworICAgIH0KKyAgICByZXR1cm4gYXBpLnVybCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvQ3VycmVudFVzZXJQb3B1cFBhbmVsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvQ3VycmVudFVzZXJQb3B1cFBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4M2Y5YwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9DdXJyZW50VXNlclBvcHVwUGFuZWwuamF2YQpAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpQmluZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUZpZWxkOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS51c2VyLmNsaWVudC5QbHVnaW5TYWZlUG9wdXBQYW5lbDsKKworcHVibGljIGNsYXNzIEN1cnJlbnRVc2VyUG9wdXBQYW5lbCBleHRlbmRzIFBsdWdpblNhZmVQb3B1cFBhbmVsIHsKKyAgaW50ZXJmYWNlIEJpbmRlciBleHRlbmRzIFVpQmluZGVyPFdpZGdldCwgQ3VycmVudFVzZXJQb3B1cFBhbmVsPiB7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaW5kZXIgYmluZGVyID0gR1dULmNyZWF0ZShCaW5kZXIuY2xhc3MpOworCisgIEBVaUZpZWxkKHByb3ZpZGVkID0gdHJ1ZSkKKyAgQXZhdGFySW1hZ2UgYXZhdGFyOworICBAVWlGaWVsZAorICBMYWJlbCB1c2VyTmFtZTsKKyAgQFVpRmllbGQKKyAgTGFiZWwgdXNlckVtYWlsOworICBAVWlGaWVsZAorICBBbmNob3IgbG9nb3V0OworICBAVWlGaWVsZAorICBBbmNob3Igc2V0dGluZ3M7CisKKyAgcHVibGljIEN1cnJlbnRVc2VyUG9wdXBQYW5lbChBY2NvdW50IGFjY291bnQsIGJvb2xlYW4gY2FuTG9nT3V0KSB7CisgICAgc3VwZXIoLyogYXV0byBoaWRlICovdHJ1ZSwgLyogbW9kYWwgKi9mYWxzZSk7CisgICAgYXZhdGFyID0gbmV3IEF2YXRhckltYWdlKGFjY291bnQuZ2V0SWQoKSwgMTAwKTsKKyAgICBzZXRXaWRnZXQoYmluZGVyLmNyZWF0ZUFuZEJpbmRVaSh0aGlzKSk7CisgICAgLy8gV2UgbXVzdCBzaG93IGFuZCB0aGVuIGhpZGUgdGhpcyBwb3B1cCBzbyB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIERPTS4KKyAgICAvLyBPdGhlcndpc2UgdGhlIGltYWdlIGRvZXMgbm90IGdldCBhbnkgZXZlbnRzLiAgQ2FsbGluZyBoaWRlKCkgd291bGQKKyAgICAvLyByZW1vdmUgaXQgZnJvbSB0aGUgRE9NIHNvIHdlIHVzZSBzZXRWaXNpYmxlKGZhbHNlKSBpbnN0ZWFkLgorICAgIHNob3coKTsKKyAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS51c2VySW5mb1BvcHVwKCkpOworICAgIGlmIChhY2NvdW50LmdldEZ1bGxOYW1lKCkgIT0gbnVsbCkgeworICAgICAgdXNlck5hbWUuc2V0VGV4dChhY2NvdW50LmdldEZ1bGxOYW1lKCkpOworICAgIH0KKyAgICBpZiAoYWNjb3VudC5nZXRQcmVmZXJyZWRFbWFpbCgpICE9IG51bGwpIHsKKyAgICAgIHVzZXJFbWFpbC5zZXRUZXh0KGFjY291bnQuZ2V0UHJlZmVycmVkRW1haWwoKSk7CisgICAgfQorICAgIGlmIChjYW5Mb2dPdXQpIHsKKyAgICAgIGxvZ291dC5zZXRIcmVmKEdlcnJpdC5zZWxmUmVkaXJlY3QoIi9sb2dvdXQiKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxvZ291dC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICB9CisgICAgc2V0dGluZ3Muc2V0SHJlZihHZXJyaXQuc2VsZlJlZGlyZWN0KFBhZ2VMaW5rcy5TRVRUSU5HUykpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvQ3VycmVudFVzZXJQb3B1cFBhbmVsLnVpLnhtbCBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9DdXJyZW50VXNlclBvcHVwUGFuZWwudWkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjU3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvQ3VycmVudFVzZXJQb3B1cFBhbmVsLnVpLnhtbApAQCAtMCwwICsxLDYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IURPQ1RZUEUgdWk6VWlCaW5kZXIgU1lTVEVNICJodHRwOi8vZGwuZ29vZ2xlLmNvbS9nd3QvRFREL3hodG1sLmVudCI+Cis8dWk6VWlCaW5kZXIgeG1sbnM6dWk9J3Vybjp1aTpjb20uZ29vZ2xlLmd3dC51aWJpbmRlcicKKyAgeG1sbnM6Zz0ndXJuOmltcG9ydDpjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aScKKyAgeG1sbnM6Z2Vycml0PSd1cm46aW1wb3J0OmNvbS5nb29nbGUuZ2Vycml0LmNsaWVudCc+CisgIDx1aTp3aXRoIGZpZWxkPSdjb25zdGFudHMnIHR5cGU9J2NvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXRDb25zdGFudHMnLz4KKworICA8dWk6c3R5bGU+CisgICAgLnBhbmVsIHsKKyAgICAgIHBhZGRpbmc6IDhweDsKKyAgICB9CisgICAgLmF2YXRhciB7CisgICAgICBwYWRkaW5nLXJpZ2h0OiA0cHg7CisgICAgICB3aWR0aDogMTAwcHg7CisgICAgICBoZWlnaHQ6IDEwMHB4OworICAgIH0KKyAgICAuaW5mb0NlbGwgeworICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICB9CisgICAgLnVzZXJOYW1lIHsKKyAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICAgIH0KKyAgICAuZW1haWwgeworICAgICAgcGFkZGluZy1ib3R0b206IDZweDsKKyAgICB9CisgICAgLmxvZ291dCB7CisgICAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7CisgICAgICBmbG9hdDogcmlnaHQ7CisgICAgfQorICA8L3VpOnN0eWxlPgorCisgIDxnOkhUTUxQYW5lbCBzdHlsZU5hbWU9J3tzdHlsZS5wYW5lbH0nPgorICAgIDx0YWJsZT48dHI+PHRkPgorICAgICAgPGdlcnJpdDpBdmF0YXJJbWFnZSB1aTpmaWVsZD0nYXZhdGFyJyBzdHlsZU5hbWU9J3tzdHlsZS5hdmF0YXJ9JyAvPgorICAgIDwvdGQ+PHRkIGNsYXNzPSd7c3R5bGUuaW5mb0NlbGx9Jz4KKyAgICAgIDxnOkxhYmVsIHVpOmZpZWxkPSd1c2VyTmFtZScgc3R5bGVOYW1lPSJ7c3R5bGUudXNlck5hbWV9IiAvPgorICAgICAgPGc6TGFiZWwgdWk6ZmllbGQ9J3VzZXJFbWFpbCcgc3R5bGVOYW1lPSJ7c3R5bGUuZW1haWx9IiAvPgorICAgIDwvdGQ+PC90cj48L3RhYmxlPgorICAgIDxnOkFuY2hvciB1aTpmaWVsZD0nc2V0dGluZ3MnPgorICAgICAgPHVpOnRleHQgZnJvbT0ne2NvbnN0YW50cy5tZW51U2V0dGluZ3N9JyAvPgorICAgIDwvZzpBbmNob3I+CisgICAgPGc6QW5jaG9yIHVpOmZpZWxkPSdsb2dvdXQnIHN0eWxlTmFtZT0ie3N0eWxlLmxvZ291dH0iPgorICAgICAgPHVpOnRleHQgZnJvbT0ne2NvbnN0YW50cy5tZW51U2lnbk91dH0nIC8+CisgICAgPC9nOkFuY2hvcj4KKyAgPC9nOkhUTUxQYW5lbD4KKzwvdWk6VWlCaW5kZXI+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0Rpc3BhdGNoZXIuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9EaXNwYXRjaGVyLmphdmEKaW5kZXggYWVmYWQyNy4uODdhMDljZiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0Rpc3BhdGNoZXIuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvRGlzcGF0Y2hlci5qYXZhCkBAIC0xNyw5ICsxNywxMSBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLkFETUlOX0NSRUFURV9HUk9VUDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5BRE1JTl9DUkVBVEVfUFJPSkVDVDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5BRE1JTl9HUk9VUFM7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuQURNSU5fUFJPSkVDVFM7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuQURNSU5fUExVR0lOUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5BRE1JTl9QUk9KRUNUUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5EQVNIQk9BUkRTOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzLk1JTkU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuUFJPSkVDVFM7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuUkVHSVNURVI7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuU0VUVElOR1M7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuU0VUVElOR1NfQUdSRUVNRU5UUzsKQEAgLTU0LDI0ICs1NiwyNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5QbHVnaW5MaXN0U2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0QWNjZXNzU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0QnJhbmNoZXNTY3JlZW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLlByb2plY3REYXNoYm9hcmRzU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0SW5mb1NjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uUHJvamVjdExpc3RTY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLlByb2plY3RTY3JlZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLlV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmF1dGgub3BlbmlkLk9wZW5JZFNpZ25JbkRpYWxvZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC51c2VycGFzcy5Vc2VyUGFzc1NpZ25JbkRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5BY2NvdW50RGFzaGJvYXJkU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZVNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5DdXN0b21EYXNoYm9hcmRTY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuUGF0Y2hUYWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5Qcm9qZWN0RGFzaGJvYXJkU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlB1Ymxpc2hDb21tZW50U2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlF1ZXJ5U2NyZWVuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kYXNoYm9hcmRzLkRhc2hib2FyZEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHMuRGFzaGJvYXJkTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwQXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlBhdGNoU2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5TaWduSW5Nb2RlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2V0RGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CkBAIC04MSw2ICs4NSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlJ1bkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuVVJMOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LldpbmRvdzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5VXRpbDsKIApAQCAtMTM3LDE2ICsxNDIsMjAgQEAKICAgICByZXR1cm4gIi9hZG1pbi9ncm91cHMvIiArIGlkLnRvU3RyaW5nKCkgKyAiLCIgKyBwYW5lbDsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvR3JvdXAoZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgewotICAgIHJldHVybiAiL2FkbWluL2dyb3Vwcy91dWlkLSIgKyB1dWlkLnRvU3RyaW5nKCk7CisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvR3JvdXAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgeworICAgIHJldHVybiBQYWdlTGlua3MudG9Hcm91cCh1dWlkKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvR3JvdXAoQWNjb3VudEdyb3VwLlVVSUQgdXVpZCwgU3RyaW5nIHBhbmVsKSB7Ci0gICAgcmV0dXJuICIvYWRtaW4vZ3JvdXBzL3V1aWQtIiArIHV1aWQudG9TdHJpbmcoKSArICIsIiArIHBhbmVsOworICAgIHJldHVybiB0b0dyb3VwKHV1aWQpICsgIiwiICsgcGFuZWw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1Byb2plY3QoUHJvamVjdC5OYW1lS2V5IG4pIHsKKyAgICByZXR1cm4gdG9Qcm9qZWN0QWRtaW4obiwgUHJvamVjdFNjcmVlbi5nZXRTYXZlZFBhbmVsKCkpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9Qcm9qZWN0QWRtaW4oUHJvamVjdC5OYW1lS2V5IG4sIFN0cmluZyBwYW5lbCkgewotICAgIGlmIChQcm9qZWN0U2NyZWVuLklORk8uZXF1YWxzKHBhbmVsKSkgeworICAgIGlmIChwYW5lbCA9PSBudWxsIHx8IFByb2plY3RTY3JlZW4uSU5GTy5lcXVhbHMocGFuZWwpKSB7CiAgICAgICByZXR1cm4gIi9hZG1pbi9wcm9qZWN0cy8iICsgbi50b1N0cmluZygpOwogICAgIH0KICAgICByZXR1cm4gIi9hZG1pbi9wcm9qZWN0cy8iICsgbi50b1N0cmluZygpICsgIiwiICsgcGFuZWw7CkBAIC0xODYsNiArMTk1LDkgQEAKICAgICB9IGVsc2UgaWYgKG1hdGNoUHJlZml4KCIvZGFzaGJvYXJkLyIsIHRva2VuKSkgewogICAgICAgZGFzaGJvYXJkKHRva2VuKTsKIAorICAgIH0gZWxzZSBpZiAobWF0Y2hQcmVmaXgoUFJPSkVDVFMsIHRva2VuKSkgeworICAgICAgcHJvamVjdHModG9rZW4pOworCiAgICAgfSBlbHNlIGlmIChtYXRjaEV4YWN0KFNFVFRJTkdTLCB0b2tlbikgLy8KICAgICAgICAgfHwgbWF0Y2hQcmVmaXgoIi9zZXR0aW5ncy8iLCB0b2tlbikgLy8KICAgICAgICAgfHwgbWF0Y2hFeGFjdCgicmVnaXN0ZXIiLCB0b2tlbikgLy8KQEAgLTM4NCw2ICszOTYsNTIgQEAKICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IE5vdEZvdW5kU2NyZWVuKCkpOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9qZWN0cyhmaW5hbCBTdHJpbmcgdG9rZW4pIHsKKyAgICBTdHJpbmcgcmVzdCA9IHNraXAodG9rZW4pOworICAgIGludCBjID0gcmVzdC5pbmRleE9mKERBU0hCT0FSRFMpOworICAgIGlmICgwIDw9IGMpIHsKKyAgICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0ID0gVVJMLmRlY29kZVBhdGhTZWdtZW50KHJlc3Quc3Vic3RyaW5nKDAsIGMpKTsKKyAgICAgIHJlc3QgPSByZXN0LnN1YnN0cmluZyhjKTsKKyAgICAgIGlmIChtYXRjaFByZWZpeChEQVNIQk9BUkRTLCByZXN0KSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZGFzaGJvYXJkSWQgPSBza2lwKHJlc3QpOworICAgICAgICBHZXJyaXRDYWxsYmFjazxEYXNoYm9hcmRJbmZvPiBjYiA9IG5ldyBHZXJyaXRDYWxsYmFjazxEYXNoYm9hcmRJbmZvPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoRGFzaGJvYXJkSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgIGlmIChtYXRjaFByZWZpeCgiL2Rhc2hib2FyZC8iLCByZXN1bHQudXJsKCkpKSB7CisgICAgICAgICAgICAgIFN0cmluZyBwYXJhbXMgPSBza2lwKHJlc3VsdC51cmwoKSkuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICBQcm9qZWN0RGFzaGJvYXJkU2NyZWVuIGRhc2ggPSBuZXcgUHJvamVjdERhc2hib2FyZFNjcmVlbigKKyAgICAgICAgICAgICAgICAgIG5ldyBQcm9qZWN0Lk5hbWVLZXkocHJvamVjdCksIHBhcmFtcyk7CisgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLCBkYXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgaWYgKCJkZWZhdWx0Ii5lcXVhbHMoZGFzaGJvYXJkSWQpICYmIFJlc3RBcGkuaXNOb3RGb3VuZChjYXVnaHQpKSB7CisgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZVF1ZXJ5KAorICAgICAgICAgICAgICAgICAgUGFnZUxpbmtzLnByb2plY3RRdWVyeShuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3QpKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBpZiAoImRlZmF1bHQiLmVxdWFscyhkYXNoYm9hcmRJZCkpIHsKKyAgICAgICAgICBEYXNoYm9hcmRMaXN0LmdldERlZmF1bHQobmV3IFByb2plY3QuTmFtZUtleShwcm9qZWN0KSwgY2IpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjID0gZGFzaGJvYXJkSWQuaW5kZXhPZigiOiIpOworICAgICAgICBpZiAoMCA8PSBjKSB7CisgICAgICAgICAgZmluYWwgU3RyaW5nIHJlZiA9IFVSTC5kZWNvZGVRdWVyeVN0cmluZyhkYXNoYm9hcmRJZC5zdWJzdHJpbmcoMCwgYykpOworICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gVVJMLmRlY29kZVF1ZXJ5U3RyaW5nKGRhc2hib2FyZElkLnN1YnN0cmluZyhjICsgMSkpOworICAgICAgICAgIERhc2hib2FyZExpc3QuZ2V0KG5ldyBQcm9qZWN0Lk5hbWVLZXkocHJvamVjdCksIHJlZiArICI6IiArIHBhdGgsIGNiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IE5vdEZvdW5kU2NyZWVuKCkpOworICB9CisKICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGFuZ2UoZmluYWwgU3RyaW5nIHRva2VuKSB7CiAgICAgU3RyaW5nIHJlc3QgPSBza2lwKHRva2VuKTsKICAgICBpbnQgYyA9IHJlc3QubGFzdEluZGV4T2YoJywnKTsKQEAgLTQzMiw3ICs0OTAsNyBAQAogICAgIH0KIAogICAgIGlmICghcmVzdC5pc0VtcHR5KCkpIHsKLSAgICAgIFBhdGNoLktleSBwID0gbmV3IFBhdGNoLktleShwcywgcmVzdCk7CisgICAgICBQYXRjaC5LZXkgcCA9IG5ldyBQYXRjaC5LZXkocHMsIEtleVV0aWwuZGVjb2RlKHJlc3QpKTsKICAgICAgIHBhdGNoKHRva2VuLCBiYXNlLCBwLCAwLCBudWxsLCBudWxsLCBwYW5lbCk7CiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChwYW5lbCA9PSBudWxsKSB7CkBAIC01NzIsMzAgKzYzMCw2IEBACiAgICAgICAgIGlmIChtYXRjaFByZWZpeCgiL1ZFLyIsIHRva2VuKSB8fCBtYXRjaFByZWZpeCgiVkUsIiwgdG9rZW4pKQogICAgICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGVFbWFpbFNjcmVlbihza2lwKHRva2VuKSk7CiAKLSAgICAgICAgaWYgKG1hdGNoUHJlZml4KCIvU2lnbkluRmFpbHVyZSwiLCB0b2tlbikpIHsKLSAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBhcmdzID0gc2tpcCh0b2tlbikuc3BsaXQoIiwiKTsKLSAgICAgICAgICBmaW5hbCBTaWduSW5Nb2RlIG1vZGUgPSBTaWduSW5Nb2RlLnZhbHVlT2YoYXJnc1swXSk7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IEtleVV0aWwuZGVjb2RlKGFyZ3NbMV0pOwotICAgICAgICAgIGZpbmFsIFN0cmluZyB0byA9IE1JTkU7Ci0gICAgICAgICAgc3dpdGNoIChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0QXV0aFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBPUEVOSUQ6Ci0gICAgICAgICAgICAgIG5ldyBPcGVuSWRTaWduSW5EaWFsb2cobW9kZSwgdG8sIG1zZykuY2VudGVyKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMREFQOgotICAgICAgICAgICAgY2FzZSBMREFQX0JJTkQ6Ci0gICAgICAgICAgICAgIG5ldyBVc2VyUGFzc1NpZ25JbkRpYWxvZyh0bywgbXNnKS5jZW50ZXIoKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3dpdGNoIChtb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIFNJR05fSU46Ci0gICAgICAgICAgICAgIHJldHVybiBRdWVyeVNjcmVlbi5mb3JRdWVyeSgic3RhdHVzOm9wZW4iKTsKLSAgICAgICAgICAgIGNhc2UgTElOS19JREVOVElZOgotICAgICAgICAgICAgICByZXR1cm4gbmV3IE15SWRlbnRpdGllc1NjcmVlbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIGlmIChtYXRjaEV4YWN0KFNFVFRJTkdTX05FV19BR1JFRU1FTlQsIHRva2VuKSkKICAgICAgICAgICByZXR1cm4gbmV3IE5ld0FncmVlbWVudFNjcmVlbigpOwogCkBAIC02MTYsMTQgKzY1MCwzNiBAQAogICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLCBuZXcgR3JvdXBMaXN0U2NyZWVuKCkpOwogCiAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hQcmVmaXgoIi9hZG1pbi9ncm91cHMvIiwgdG9rZW4pKSB7Ci0gICAgICAgICAgZ3JvdXAoKTsKKyAgICAgICAgICBTdHJpbmcgcmVzdCA9IHNraXAodG9rZW4pOworICAgICAgICAgIGlmIChyZXN0LnN0YXJ0c1dpdGgoIj8iKSkgeworICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBHcm91cExpc3RTY3JlZW4ocmVzdC5zdWJzdHJpbmcoMSkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3JvdXAoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmIChtYXRjaFByZWZpeCgiL2FkbWluL2dyb3VwcyIsIHRva2VuKSkgeworICAgICAgICAgIFN0cmluZyByZXN0ID0gc2tpcCh0b2tlbik7CisgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IEdyb3VwTGlzdFNjcmVlbihyZXN0LnN1YnN0cmluZygxKSkpOworICAgICAgICAgIH0KIAogICAgICAgICB9IGVsc2UgaWYgKG1hdGNoRXhhY3QoQURNSU5fUFJPSkVDVFMsIHRva2VuKQogICAgICAgICAgICAgfHwgbWF0Y2hFeGFjdCgiL2FkbWluL3Byb2plY3RzIiwgdG9rZW4pKSB7CiAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBQcm9qZWN0TGlzdFNjcmVlbigpKTsKIAogICAgICAgICB9IGVsc2UgaWYgKG1hdGNoUHJlZml4KCIvYWRtaW4vcHJvamVjdHMvIiwgdG9rZW4pKSB7Ci0gICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIHNlbGVjdFByb2plY3QoKSk7CisgICAgICAgICAgICBTdHJpbmcgcmVzdCA9IHNraXAodG9rZW4pOworICAgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLCBuZXcgUHJvamVjdExpc3RTY3JlZW4ocmVzdC5zdWJzdHJpbmcoMSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLCBzZWxlY3RQcm9qZWN0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hQcmVmaXgoIi9hZG1pbi9wcm9qZWN0cyIsIHRva2VuKSkgeworICAgICAgICAgIFN0cmluZyByZXN0ID0gc2tpcCh0b2tlbik7CisgICAgICAgICAgaWYgKHJlc3Quc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IFByb2plY3RMaXN0U2NyZWVuKHJlc3Quc3Vic3RyaW5nKDEpKSk7CisgICAgICAgICAgfQogCiAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hQcmVmaXgoQURNSU5fUExVR0lOUywgdG9rZW4pCiAgICAgICAgICAgICB8fCBtYXRjaEV4YWN0KCIvYWRtaW4vcGx1Z2lucyIsIHRva2VuKSkgewpAQCAtNjQ0LDI3ICs3MDAsMjYgQEAKIAogICAgICAgcHJpdmF0ZSB2b2lkIGdyb3VwKCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgcGFuZWw7Ci0gICAgICAgIEFjY291bnRHcm91cC5JZCBncm91cElkID0gbnVsbDsKLSAgICAgICAgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVVUlEID0gbnVsbDsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdyb3VwOwogCiAgICAgICAgIGlmIChtYXRjaFByZWZpeCgiL2FkbWluL2dyb3Vwcy91dWlkLSIsIHRva2VuKSkgewogICAgICAgICAgIFN0cmluZyBwID0gc2tpcCh0b2tlbik7CiAgICAgICAgICAgaW50IGMgPSBwLmluZGV4T2YoJywnKTsKICAgICAgICAgICBpZiAoYyA8IDApIHsKLSAgICAgICAgICAgIGdyb3VwVVVJRCA9IEFjY291bnRHcm91cC5VVUlELnBhcnNlKHApOworICAgICAgICAgICAgZ3JvdXAgPSBwOwogICAgICAgICAgICAgcGFuZWwgPSBudWxsOwogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBncm91cFVVSUQgPSBBY2NvdW50R3JvdXAuVVVJRC5wYXJzZShwLnN1YnN0cmluZygwLCBjKSk7CisgICAgICAgICAgICBncm91cCA9IHAuc3Vic3RyaW5nKDAsIGMpOwogICAgICAgICAgICAgcGFuZWwgPSBwLnN1YnN0cmluZyhjICsgMSk7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1hdGNoUHJlZml4KCIvYWRtaW4vZ3JvdXBzLyIsIHRva2VuKSkgewogICAgICAgICAgIFN0cmluZyBwID0gc2tpcCh0b2tlbik7CiAgICAgICAgICAgaW50IGMgPSBwLmluZGV4T2YoJywnKTsKICAgICAgICAgICBpZiAoYyA8IDApIHsKLSAgICAgICAgICAgIGdyb3VwSWQgPSBBY2NvdW50R3JvdXAuSWQucGFyc2UocCk7CisgICAgICAgICAgICBncm91cCA9IHA7CiAgICAgICAgICAgICBwYW5lbCA9IG51bGw7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdyb3VwSWQgPSBBY2NvdW50R3JvdXAuSWQucGFyc2UocC5zdWJzdHJpbmcoMCwgYykpOworICAgICAgICAgICAgZ3JvdXAgPSBwLnN1YnN0cmluZygwLCBjKTsKICAgICAgICAgICAgIHBhbmVsID0gcC5zdWJzdHJpbmcoYyArIDEpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTY3MiwzNyArNzI3LDMzIEBACiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgVXRpbC5HUk9VUF9TVkMuZ3JvdXBEZXRhaWwoZ3JvdXBJZCwgZ3JvdXBVVUlELAotICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhHcm91cERldGFpbCBncm91cERldGFpbCkgewotICAgICAgICAgICAgICAgIGlmIChwYW5lbCA9PSBudWxsIHx8IHBhbmVsLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgLy8gVGhlIHRva2VuIGRvZXMgbm90IHNheSB3aGljaCBncm91cCBzY3JlZW4gc2hvdWxkIGJlIHNob3duLAotICAgICAgICAgICAgICAgICAgLy8gYXMgZGVmYXVsdCBmb3IgaW50ZXJuYWwgZ3JvdXBzIHNob3cgdGhlIG1lbWJlcnMsIGFzIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgIC8vIGZvciBleHRlcm5hbCBhbmQgc3lzdGVtIGdyb3VwcyBzaG93IHRoZSBpbmZvIHNjcmVlbiAoc2luY2UKLSAgICAgICAgICAgICAgICAgIC8vIGZvciBleHRlcm5hbCBhbmQgc3lzdGVtIGdyb3VwcyB0aGUgbWVtYmVycyBjYW5ub3QgYmUKLSAgICAgICAgICAgICAgICAgIC8vIHNob3duIGluIHRoZSB3ZWIgVUkpLgotICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgIGlmIChncm91cERldGFpbC5ncm91cC5nZXRUeXBlKCkgPT0gQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwpIHsKLSAgICAgICAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9Hcm91cChncm91cERldGFpbC5ncm91cC5nZXRJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQWNjb3VudEdyb3VwU2NyZWVuLk1FTUJFUlMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZ3JvdXBEZXRhaWwsIHRva2VuKSk7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b0dyb3VwKGdyb3VwRGV0YWlsLmdyb3VwLmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBBY2NvdW50R3JvdXBTY3JlZW4uSU5GTyksCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWNjb3VudEdyb3VwSW5mb1NjcmVlbihncm91cERldGFpbCwgdG9rZW4pKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEFjY291bnRHcm91cFNjcmVlbi5JTkZPLmVxdWFscyhwYW5lbCkpIHsKLSAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmZvU2NyZWVuKGdyb3VwRGV0YWlsLCB0b2tlbikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQWNjb3VudEdyb3VwU2NyZWVuLk1FTUJFUlMuZXF1YWxzKHBhbmVsKSkgewotICAgICAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgbmV3IEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZ3JvdXBEZXRhaWwsIHRva2VuKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRva2VuLG5ldyBOb3RGb3VuZFNjcmVlbigpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIEdyb3VwQXBpLmdldEdyb3VwRGV0YWlsKGdyb3VwLCBuZXcgR2Vycml0Q2FsbGJhY2s8R3JvdXBJbmZvPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoR3JvdXBJbmZvIGdyb3VwKSB7CisgICAgICAgICAgICBpZiAocGFuZWwgPT0gbnVsbCB8fCBwYW5lbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgLy8gVGhlIHRva2VuIGRvZXMgbm90IHNheSB3aGljaCBncm91cCBzY3JlZW4gc2hvdWxkIGJlIHNob3duLAorICAgICAgICAgICAgICAvLyBhcyBkZWZhdWx0IGZvciBpbnRlcm5hbCBncm91cHMgc2hvdyB0aGUgbWVtYmVycywgYXMgZGVmYXVsdAorICAgICAgICAgICAgICAvLyBmb3IgZXh0ZXJuYWwgYW5kIHN5c3RlbSBncm91cHMgc2hvdyB0aGUgaW5mbyBzY3JlZW4gKHNpbmNlCisgICAgICAgICAgICAgIC8vIGZvciBleHRlcm5hbCBhbmQgc3lzdGVtIGdyb3VwcyB0aGUgbWVtYmVycyBjYW5ub3QgYmUKKyAgICAgICAgICAgICAgLy8gc2hvd24gaW4gdGhlIHdlYiBVSSkuCisgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgIGlmIChBY2NvdW50R3JvdXAuaXNJbnRlcm5hbEdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKQorICAgICAgICAgICAgICAgICAgJiYgIUFjY291bnRHcm91cC5pc1N5c3RlbUdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKSkgeworICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRvR3JvdXAoZ3JvdXAuZ2V0R3JvdXBJZCgpLCBBY2NvdW50R3JvdXBTY3JlZW4uTUVNQkVSUyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuKGdyb3VwLCB0b2tlbikpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KHRvR3JvdXAoZ3JvdXAuZ2V0R3JvdXBJZCgpLCBBY2NvdW50R3JvdXBTY3JlZW4uSU5GTyksCisgICAgICAgICAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmZvU2NyZWVuKGdyb3VwLCB0b2tlbikpOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQWNjb3VudEdyb3VwU2NyZWVuLklORk8uZXF1YWxzKHBhbmVsKSkgeworICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheSh0b2tlbiwgbmV3IEFjY291bnRHcm91cEluZm9TY3JlZW4oZ3JvdXAsIHRva2VuKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFjY291bnRHcm91cFNjcmVlbi5NRU1CRVJTLmVxdWFscyhwYW5lbCkpIHsKKyAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBBY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuKGdyb3VwLCB0b2tlbikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkodG9rZW4sIG5ldyBOb3RGb3VuZFNjcmVlbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgfQogCiAgICAgICBwcml2YXRlIFNjcmVlbiBzZWxlY3RQcm9qZWN0KCkgewpAQCAtNzI5LDYgKzc4MCwxMCBAQAogICAgICAgICAgIGlmIChQcm9qZWN0U2NyZWVuLkFDQ0VTUy5lcXVhbHMocGFuZWwpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFByb2plY3RBY2Nlc3NTY3JlZW4oayk7CiAgICAgICAgICAgfQorCisgICAgICAgICAgaWYgKFByb2plY3RTY3JlZW4uREFTSEJPQVJEUy5lcXVhbHMocGFuZWwpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByb2plY3REYXNoYm9hcmRzU2NyZWVuKGspOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kU2NyZWVuKCk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvRXJyb3JEaWFsb2cuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9FcnJvckRpYWxvZy5qYXZhCmluZGV4IDEzYmJhMTIuLjNhZGVjOGYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9FcnJvckRpYWxvZy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9FcnJvckRpYWxvZy5qYXZhCkBAIC0xNCwxMSArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5ScGNDb25zdGFudHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXNwb25zZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5TdGF0dXNDb2RlRXhjZXB0aW9uOwpAQCAtMTA0LDM0ICsxMDYsNTQgQEAKICAgcHVibGljIEVycm9yRGlhbG9nKGZpbmFsIFRocm93YWJsZSB3aGF0KSB7CiAgICAgdGhpcygpOwogCi0gICAgU3RyaW5nIGNuOwotICAgIGlmICh3aGF0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbikgewotICAgICAgY24gPSBScGNDb25zdGFudHMuQy5lcnJvclJlbW90ZUpzb25FeGNlcHRpb24oKTsKKyAgICBTdHJpbmcgaGRyOworICAgIFN0cmluZyBtc2c7CiAKLSAgICB9IGVsc2UgaWYgKHdoYXQgaW5zdGFuY2VvZiBTdGF0dXNDb2RlRXhjZXB0aW9uKSB7Ci0gICAgICBjbiA9IFJwY0NvbnN0YW50cy5DLmVycm9yU2VydmVyVW5hdmFpbGFibGUoKTsKKyAgICBpZiAod2hhdCBpbnN0YW5jZW9mIFN0YXR1c0NvZGVFeGNlcHRpb24pIHsKKyAgICAgIFN0YXR1c0NvZGVFeGNlcHRpb24gc2MgPSAoU3RhdHVzQ29kZUV4Y2VwdGlvbikgd2hhdDsKKyAgICAgIGlmIChSZXN0QXBpLmlzRXhwZWN0ZWQoc2MuZ2V0U3RhdHVzQ29kZSgpKSkgeworICAgICAgICBoZHIgPSBudWxsOworICAgICAgICBtc2cgPSBzYy5nZXRFbmNvZGVkUmVzcG9uc2UoKTsKKyAgICAgIH0gZWxzZSBpZiAoc2MuZ2V0U3RhdHVzQ29kZSgpID09IFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUikgeworICAgICAgICBoZHIgPSBudWxsOworICAgICAgICBtc2cgPSB3aGF0LmdldE1lc3NhZ2UoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGhkciA9IFJwY0NvbnN0YW50cy5DLmVycm9yU2VydmVyVW5hdmFpbGFibGUoKTsKKyAgICAgICAgbXNnID0gd2hhdC5nZXRNZXNzYWdlKCk7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHdoYXQgaW5zdGFuY2VvZiBSZW1vdGVKc29uRXhjZXB0aW9uKSB7CisgICAgICAvLyBUT0RPIFJlbW92ZSBSZW1vdGVKc29uRXhjZXB0aW9uIGZyb20gR2Vycml0IHNvdXJjZXMuCisgICAgICBoZHIgPSBScGNDb25zdGFudHMuQy5lcnJvclJlbW90ZUpzb25FeGNlcHRpb24oKTsKKyAgICAgIG1zZyA9IHdoYXQuZ2V0TWVzc2FnZSgpOwogCiAgICAgfSBlbHNlIHsKLSAgICAgIGNuID0gd2hhdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgIGlmIChjbi5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpIHsKLSAgICAgICAgY24gPSBjbi5zdWJzdHJpbmcoImphdmEubGFuZy4iLmxlbmd0aCgpKTsKLSAgICAgIH0gZWxzZSBpZiAoY24uc3RhcnRzV2l0aCgiY29tLmdvb2dsZS5nZXJyaXQuIikpIHsKLSAgICAgICAgY24gPSBjbi5zdWJzdHJpbmcoY24ubGFzdEluZGV4T2YoJy4nKSArIDEpOworICAgICAgLy8gVE9ETyBGaXggY2FsbGVycyBvZiBFcnJvckRpYWxvZyB0byBzdG9wIHBhc3NpbmcgcmFuZG9tIHR5cGVzLgorICAgICAgaGRyID0gd2hhdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgIGlmIChoZHIuc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpKSB7CisgICAgICAgIGhkciA9IGhkci5zdWJzdHJpbmcoImphdmEubGFuZy4iLmxlbmd0aCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoaGRyLnN0YXJ0c1dpdGgoImNvbS5nb29nbGUuZ2Vycml0LiIpKSB7CisgICAgICAgIGhkciA9IGhkci5zdWJzdHJpbmcoaGRyLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKICAgICAgIH0KLSAgICAgIGlmIChjbi5lbmRzV2l0aCgiRXhjZXB0aW9uIikpIHsKLSAgICAgICAgY24gPSBjbi5zdWJzdHJpbmcoMCwgY24ubGVuZ3RoKCkgLSAiRXhjZXB0aW9uIi5sZW5ndGgoKSk7Ci0gICAgICB9IGVsc2UgaWYgKGNuLmVuZHNXaXRoKCJFcnJvciIpKSB7Ci0gICAgICAgIGNuID0gY24uc3Vic3RyaW5nKDAsIGNuLmxlbmd0aCgpIC0gIkVycm9yIi5sZW5ndGgoKSk7CisgICAgICBpZiAoaGRyLmVuZHNXaXRoKCJFeGNlcHRpb24iKSkgeworICAgICAgICBoZHIgPSBoZHIuc3Vic3RyaW5nKDAsIGhkci5sZW5ndGgoKSAtICJFeGNlcHRpb24iLmxlbmd0aCgpKTsKKyAgICAgIH0gZWxzZSBpZiAoaGRyLmVuZHNXaXRoKCJFcnJvciIpKSB7CisgICAgICAgIGhkciA9IGhkci5zdWJzdHJpbmcoMCwgaGRyLmxlbmd0aCgpIC0gIkVycm9yIi5sZW5ndGgoKSk7CiAgICAgICB9CisgICAgICBtc2cgPSB3aGF0LmdldE1lc3NhZ2UoKTsKICAgICB9CiAKLSAgICBmaW5hbCBMYWJlbCByID0gbmV3IExhYmVsKGNuKTsKLSAgICByLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmVycm9yRGlhbG9nRXJyb3JUeXBlKCkpOwotICAgIGJvZHkuYWRkKHIpOworICAgIGlmIChoZHIgIT0gbnVsbCkgeworICAgICAgZmluYWwgTGFiZWwgciA9IG5ldyBMYWJlbChoZHIpOworICAgICAgci5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5lcnJvckRpYWxvZ0Vycm9yVHlwZSgpKTsKKyAgICAgIGJvZHkuYWRkKHIpOworICAgIH0KIAotICAgIGZpbmFsIExhYmVsIG0gPSBuZXcgTGFiZWwod2hhdC5nZXRNZXNzYWdlKCkpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShtLmdldEVsZW1lbnQoKSwid2hpdGVTcGFjZSIsInByZSIpOwotICAgIGJvZHkuYWRkKG0pOworICAgIGlmIChtc2cgIT0gbnVsbCkgeworICAgICAgZmluYWwgTGFiZWwgbSA9IG5ldyBMYWJlbChtc2cpOworICAgICAgRE9NLnNldFN0eWxlQXR0cmlidXRlKG0uZ2V0RWxlbWVudCgpLCAid2hpdGVTcGFjZSIsICJwcmUiKTsKKyAgICAgIGJvZHkuYWRkKG0pOworICAgIH0KICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldFRleHQoZmluYWwgU3RyaW5nIHQpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Gb3JtYXRVdGlsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvRm9ybWF0VXRpbC5qYXZhCmluZGV4IGYxMDc2MmEuLjU0NDhkYzAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Gb3JtYXRVdGlsLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0Zvcm1hdFV0aWwuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50LkRhdGVUaW1lRm9ybWF0OwpAQCAtMTE5LDEzICsxMTksOCBAQAogICAgIH0KICAgfQogCi0gIC8qKiBGb3JtYXQgYW4gYWNjb3VudCBhcyBhIG5hbWUgYW5kIGVtYWlsIGFkZHJlc3MuICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVFbWFpbChmaW5hbCBBY2NvdW50IGFjY3QpIHsKLSAgICByZXR1cm4gbmFtZUVtYWlsKG5ldyBBY2NvdW50SW5mbyhhY2N0KSk7Ci0gIH0KLQogICAvKioKLSAgICogRm9ybWF0cyBhbiBhY2NvdW50IGFzIGFuIG5hbWUgYW5kIGFuIGVtYWlsIGFkZHJlc3MuCisgICAqIEZvcm1hdHMgYW4gYWNjb3VudCBhcyBhIG5hbWUgYW5kIGFuIGVtYWlsIGFkZHJlc3MuCiAgICAqIDxwPgogICAgKiBFeGFtcGxlIG91dHB1dDoKICAgICogPHVsPgpAQCAtMTM1LDIyICsxMzAsMTcgQEAKICAgICogPGxpPjxjb2RlPkFub255bW91cyBDb3dhcmQgKDEyKTwvY29kZT46IG1pc3NpbmcgbmFtZSBhbmQgZW1haWwgYWRkcmVzczwvbGk+CiAgICAqIDwvdWw+CiAgICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lRW1haWwoZmluYWwgQWNjb3VudEluZm8gYWNjdCkgewotICAgIFN0cmluZyBuYW1lID0gYWNjdC5nZXRGdWxsTmFtZSgpOwotICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZUVtYWlsKEFjY291bnRJbmZvIGluZm8pIHsKKyAgICBTdHJpbmcgbmFtZSA9IGluZm8ubmFtZSgpOworICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICBuYW1lID0gR2Vycml0LmdldENvbmZpZygpLmdldEFub255bW91c0Nvd2FyZE5hbWUoKTsKICAgICB9CiAKLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIGIuYXBwZW5kKG5hbWUpOwotICAgIGlmIChhY2N0LmdldFByZWZlcnJlZEVtYWlsKCkgIT0gbnVsbCkgewotICAgICAgYi5hcHBlbmQoIiA8Iik7Ci0gICAgICBiLmFwcGVuZChhY2N0LmdldFByZWZlcnJlZEVtYWlsKCkpOwotICAgICAgYi5hcHBlbmQoIj4iKTsKLSAgICB9IGVsc2UgaWYgKGFjY3QuZ2V0SWQoKSAhPSBudWxsKSB7Ci0gICAgICBiLmFwcGVuZCgiICgiKTsKLSAgICAgIGIuYXBwZW5kKGFjY3QuZ2V0SWQoKS5nZXQoKSk7Ci0gICAgICBiLmFwcGVuZCgiKSIpOworICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKG5hbWUpOworICAgIGlmIChpbmZvLmVtYWlsKCkgIT0gbnVsbCkgeworICAgICAgYi5hcHBlbmQoIiA8IikuYXBwZW5kKGluZm8uZW1haWwoKSkuYXBwZW5kKCI+Iik7CisgICAgfSBlbHNlIGlmIChpbmZvLl9hY2NvdW50X2lkKCkgPiAwKSB7CisgICAgICBiLmFwcGVuZCgiICgiKS5hcHBlbmQoaW5mby5fYWNjb3VudF9pZCgpKS5hcHBlbmQoIikiKTsKICAgICB9CiAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKICAgfQpAQCAtMTYxLDEzICsxNTEsNDUgQEAKICAgICogSWYgdGhlIGFjY291bnQgaGFzIGEgZnVsbCBuYW1lLCBpdCByZXR1cm5zIG9ubHkgdGhlIGZ1bGwgbmFtZS4gT3RoZXJ3aXNlIGl0CiAgICAqIHJldHVybnMgYSBsb25nZXIgZm9ybSB0aGF0IGluY2x1ZGVzIHRoZSBlbWFpbCBhZGRyZXNzLgogICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbmFtZShmaW5hbCBBY2NvdW50SW5mbyBhaSkgewotICAgIGlmIChhaS5nZXRGdWxsTmFtZSgpICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBhaS5nZXRGdWxsTmFtZSgpOworICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lKEFjY291bnQgYWNjdCkgeworICAgIHJldHVybiBuYW1lKGFzSW5mbyhhY2N0KSk7CisgIH0KKworICAvKioKKyAgICogRm9ybWF0cyBhbiBhY2NvdW50IG5hbWUuCisgICAqIDxwPgorICAgKiBJZiB0aGUgYWNjb3VudCBoYXMgYSBmdWxsIG5hbWUsIGl0IHJldHVybnMgb25seSB0aGUgZnVsbCBuYW1lLiBPdGhlcndpc2UgaXQKKyAgICogcmV0dXJucyBhIGxvbmdlciBmb3JtIHRoYXQgaW5jbHVkZXMgdGhlIGVtYWlsIGFkZHJlc3MuCisgICAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBuYW1lKEFjY291bnRJbmZvIGFpKSB7CisgICAgaWYgKGFpLm5hbWUoKSAhPSBudWxsICYmICFhaS5uYW1lKCkudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIGFpLm5hbWUoKTsKICAgICB9Ci0gICAgaWYgKGFpLmdldFByZWZlcnJlZEVtYWlsKCkgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGFpLmdldFByZWZlcnJlZEVtYWlsKCk7CisgICAgU3RyaW5nIGVtYWlsID0gYWkuZW1haWwoKTsKKyAgICBpZiAoZW1haWwgIT0gbnVsbCkgeworICAgICAgaW50IGF0ID0gZW1haWwuaW5kZXhPZignQCcpOworICAgICAgcmV0dXJuIDAgPCBhdCA/IGVtYWlsLnN1YnN0cmluZygwLCBhdCkgOiBlbWFpbDsKICAgICB9CiAgICAgcmV0dXJuIG5hbWVFbWFpbChhaSk7CiAgIH0KKworICBwcml2YXRlIHN0YXRpYyBBY2NvdW50SW5mbyBhc0luZm8oQWNjb3VudCBhY2N0KSB7CisgICAgaWYgKGFjY3QgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgwLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgKKyAgICAgICAgYWNjdC5nZXRJZCgpICE9IG51bGwgPyBhY2N0LmdldElkKCkuZ2V0KCkgOiAwLAorICAgICAgICBhY2N0LmdldEZ1bGxOYW1lKCksCisgICAgICAgIGFjY3QuZ2V0UHJlZmVycmVkRW1haWwoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEFjY291bnRJbmZvIGFzSW5mbyhjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbyBhY2N0KSB7CisgICAgaWYgKGFjY3QgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgwLCBudWxsLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIEFjY291bnRJbmZvLmNyZWF0ZSgKKyAgICAgICAgYWNjdC5nZXRJZCgpICE9IG51bGwgPyBhY2N0LmdldElkKCkuZ2V0KCkgOiAwLAorICAgICAgICBhY2N0LmdldEZ1bGxOYW1lKCksCisgICAgICAgIGFjY3QuZ2V0UHJlZmVycmVkRW1haWwoKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXQuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXQuamF2YQppbmRleCA4ZmU2NThiLi5kNjdhNGNhIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0LmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdC5qYXZhCkBAIC0xNSwxMyArMTUsMTEgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50OwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUjsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfUFJPSkVDVDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfR1JPVVA7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX1BST0pFQ1Q7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50Q2FwYWJpbGl0aWVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZC5PcGVuSWRTaWduSW5EaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmF1dGgub3BlbmlkLk9wZW5JZFNzb1BhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzLlVzZXJQYXNzU2lnbkluRGlhbG9nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5Qcm9qZWN0U2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUNvbnN0YW50czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5DaGFuZ2VMaXN0U2NyZWVuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlBhdGNoU2NyZWVuOwpAQCAtMzEsOSArMjksOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Nb3JwaGluZ1RhYlBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5QYXRjaExpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU2NyZWVuTG9hZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DbGllbnRWZXJzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluTW9kZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HZXJyaXRDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2l0d2ViQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkhvc3RQYWdlRGF0YTsKQEAgLTQyLDEyICs0MCwyNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RGlmZlByZWZlcmVuY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkNhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkVudHJ5UG9pbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NyaXB0SW5qZWN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5BbmNob3JFbGVtZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRG9jdW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlEb3duRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlEb3duSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLlZhbHVlQ2hhbmdlSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRCdXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLlNpbXBsZUV2ZW50QnVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VcmxCdWlsZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkNvbW1hbmQ7CkBAIC01NSw5ICs2NSw5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3c7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93LkxvY2F0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb2N1c1BhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkdyaWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGxGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lSFRNTDsKQEAgLTY3LDkgKzc3LDEyIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5jbGlwcHkuY2xpZW50LkNvcHlhYmxlTGFiZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS51c2VyLmNsaWVudC5Vc2VyQWdlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS51c2VyLmNsaWVudC5WaWV3U2l0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50LkNhbGxiYWNrSGFuZGxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuSnNvbkRlZlRhcmdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50Lkpzb25VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuWHNyZk1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNsaWVudC5pbXBsLlJlc3VsdERlc2VyaWFsaXplcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwpAQCAtODEsMTcgKzk0LDE5IEBACiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR2Vycml0UmVzb3VyY2VzIFJFU09VUkNFUyA9CiAgICAgICBHV1QuY3JlYXRlKEdlcnJpdFJlc291cmNlcy5jbGFzcyk7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3lzdGVtSW5mb1NlcnZpY2UgU1lTVEVNX1NWQzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBFdmVudEJ1cyBFVkVOVF9CVVMgPSBHV1QuY3JlYXRlKFNpbXBsZUV2ZW50QnVzLmNsYXNzKTsKIAogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbXlIb3N0OwogICBwcml2YXRlIHN0YXRpYyBHZXJyaXRDb25maWcgbXlDb25maWc7CiAgIHByaXZhdGUgc3RhdGljIEhvc3RQYWdlRGF0YS5UaGVtZSBteVRoZW1lOwogICBwcml2YXRlIHN0YXRpYyBBY2NvdW50IG15QWNjb3VudDsKICAgcHJpdmF0ZSBzdGF0aWMgQWNjb3VudERpZmZQcmVmZXJlbmNlIG15QWNjb3VudERpZmZQcmVmOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeHNyZlRva2VuOworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeEdlcnJpdEF1dGg7CiAKICAgcHJpdmF0ZSBzdGF0aWMgTW9ycGhpbmdUYWJQYW5lbCBtZW51TGVmdDsKICAgcHJpdmF0ZSBzdGF0aWMgTGlua01lbnVCYXIgbWVudVJpZ2h0OwogICBwcml2YXRlIHN0YXRpYyBMaW5rTWVudUJhciBkaWZmQmFyOworICBwcml2YXRlIHN0YXRpYyBMaW5rTWVudUJhciBwcm9qZWN0c0JhcjsKICAgcHJpdmF0ZSBzdGF0aWMgUm9vdFBhbmVsIHNpdGVIZWFkZXI7CiAgIHByaXZhdGUgc3RhdGljIFJvb3RQYW5lbCBzaXRlRm9vdGVyOwogICBwcml2YXRlIHN0YXRpYyBTZWFyY2hQYW5lbCBzZWFyY2hQYW5lbDsKQEAgLTIzMyw2ICsyNDgsMTEgQEAKICAgICByZXR1cm4gbXlBY2NvdW50OwogICB9CiAKKyAgLyoqIEByZXR1cm4gYWNjZXNzIHRva2VuIHRvIHByb3ZlIHVzZXIgaWRlbnRpdHkgZHVyaW5nIFJFU1QgQVBJIGNhbGxzLiAqLworICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYR2Vycml0QXV0aCgpIHsKKyAgICByZXR1cm4geEdlcnJpdEF1dGg7CisgIH0KKwogICAvKiogQHJldHVybiB0aGUgY3VycmVudGx5IHNpZ25lZCBpbiB1c2VycydzIGRpZmYgcHJlZmVyZW5jZXM7IG51bGwgaWYgbm8gZGlmZiBwcmVmZXJlbmNlcyBkZWZpbmVkIGZvciB0aGUgYWNjb3VudCAqLwogICBwdWJsaWMgc3RhdGljIEFjY291bnREaWZmUHJlZmVyZW5jZSBnZXRBY2NvdW50RGlmZlByZWZlcmVuY2UoKSB7CiAgICAgcmV0dXJuIG15QWNjb3VudERpZmZQcmVmOwpAQCAtMjQ5LDM0ICsyNjksNyBAQAogCiAgIC8qKiBTaWduIHRoZSB1c2VyIGludG8gdGhlIGFwcGxpY2F0aW9uLiAqLwogICBwdWJsaWMgc3RhdGljIHZvaWQgZG9TaWduSW4oU3RyaW5nIHRva2VuKSB7Ci0gICAgc3dpdGNoIChteUNvbmZpZy5nZXRBdXRoVHlwZSgpKSB7Ci0gICAgICBjYXNlIEhUVFA6Ci0gICAgICBjYXNlIEhUVFBfTERBUDoKLSAgICAgIGNhc2UgQ0xJRU5UX1NTTF9DRVJUX0xEQVA6Ci0gICAgICBjYXNlIENVU1RPTV9FWFRFTlNJT046Ci0gICAgICAgIExvY2F0aW9uLmFzc2lnbihsb2dpblJlZGlyZWN0KHRva2VuKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKLSAgICAgICAgTG9jYXRpb24uYXNzaWduKHNlbGZSZWRpcmVjdCgiL2JlY29tZSIpKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgT1BFTklEX1NTTzoKLSAgICAgICAgZmluYWwgUm9vdFBhbmVsIGdCb2R5ID0gUm9vdFBhbmVsLmdldCgiZ2Vycml0X2JvZHkiKTsKLSAgICAgICAgT3BlbklkU3NvUGFuZWwgc2luZ2xlU2lnbk9uUGFuZWwgPSBuZXcgT3BlbklkU3NvUGFuZWwoKTsKLSAgICAgICAgZ0JvZHkuYWRkKHNpbmdsZVNpZ25PblBhbmVsKTsKLSAgICAgICAgc2luZ2xlU2lnbk9uUGFuZWwuYXV0aGVudGljYXRlKFNpZ25Jbk1vZGUuU0lHTl9JTiwgdG9rZW4pOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBPUEVOSUQ6Ci0gICAgICAgIG5ldyBPcGVuSWRTaWduSW5EaWFsb2coU2lnbkluTW9kZS5TSUdOX0lOLCB0b2tlbiwgbnVsbCkuY2VudGVyKCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIExEQVA6Ci0gICAgICBjYXNlIExEQVBfQklORDoKLSAgICAgICAgbmV3IFVzZXJQYXNzU2lnbkluRGlhbG9nKHRva2VuLCBudWxsKS5jZW50ZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorICAgIExvY2F0aW9uLmFzc2lnbihsb2dpblJlZGlyZWN0KHRva2VuKSk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIFN0cmluZyBsb2dpblJlZGlyZWN0KFN0cmluZyB0b2tlbikgewpAQCAtMzI3LDcgKzMyMCw3IEBACiAgIHN0YXRpYyB2b2lkIGRlbGV0ZVNlc3Npb25Db29raWUoKSB7CiAgICAgbXlBY2NvdW50ID0gbnVsbDsKICAgICBteUFjY291bnREaWZmUHJlZiA9IG51bGw7Ci0gICAgeHNyZlRva2VuID0gbnVsbDsKKyAgICB4R2Vycml0QXV0aCA9IG51bGw7CiAgICAgcmVmcmVzaE1lbnVCYXIoKTsKIAogICAgIC8vIElmIHRoZSBjb29raWUgd2FzIEh0dHBPbmx5LCB0aGlzIHJlcXVlc3QgdG8gZGVsZXRlIGl0IHdpbGwKQEAgLTM3MCwxOCArMzYzLDIwIEBACiAKICAgICBmaW5hbCBIb3N0UGFnZURhdGFTZXJ2aWNlIGhwZCA9IEdXVC5jcmVhdGUoSG9zdFBhZ2VEYXRhU2VydmljZS5jbGFzcyk7CiAgICAgaHBkLmxvYWQobmV3IEdlcnJpdENhbGxiYWNrPEhvc3RQYWdlRGF0YT4oKSB7CisgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBIb3N0UGFnZURhdGEgcmVzdWx0KSB7CisgICAgICAgIERvY3VtZW50LmdldCgpLmdldEVsZW1lbnRCeUlkKCJnZXJyaXRfaG9zdHBhZ2VkYXRhIikucmVtb3ZlRnJvbVBhcmVudCgpOwogICAgICAgICBteUNvbmZpZyA9IHJlc3VsdC5jb25maWc7CiAgICAgICAgIG15VGhlbWUgPSByZXN1bHQudGhlbWU7CiAgICAgICAgIGlmIChyZXN1bHQuYWNjb3VudCAhPSBudWxsKSB7CiAgICAgICAgICAgbXlBY2NvdW50ID0gcmVzdWx0LmFjY291bnQ7Ci0gICAgICAgICAgeHNyZlRva2VuID0gcmVzdWx0LnhzcmZUb2tlbjsKKyAgICAgICAgICB4R2Vycml0QXV0aCA9IHJlc3VsdC54R2Vycml0QXV0aDsKICAgICAgICAgfQogICAgICAgICBpZiAocmVzdWx0LmFjY291bnREaWZmUHJlZiAhPSBudWxsKSB7CiAgICAgICAgICAgbXlBY2NvdW50RGlmZlByZWYgPSByZXN1bHQuYWNjb3VudERpZmZQcmVmOwogICAgICAgICAgIGFwcGx5VXNlclByZWZlcmVuY2VzKCk7CiAgICAgICAgIH0KLSAgICAgICAgb25Nb2R1bGVMb2FkMigpOworICAgICAgICBvbk1vZHVsZUxvYWQyKHJlc3VsdCk7CiAgICAgICB9CiAgICAgfSk7CiAgIH0KQEAgLTQ2Myw3ICs0NTgsNyBAQAogICAgIGJ0bW1lbnUuYWRkKHBvd2VyZWRCeSk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgb25Nb2R1bGVMb2FkMigpIHsKKyAgcHJpdmF0ZSB2b2lkIG9uTW9kdWxlTG9hZDIoSG9zdFBhZ2VEYXRhIGhwZCkgewogICAgIFJFU09VUkNFUy5nd3Rfb3ZlcnJpZGUoKS5lbnN1cmVJbmplY3RlZCgpOwogICAgIFJFU09VUkNFUy5jc3MoKS5lbnN1cmVJbmplY3RlZCgpOwogCkBAIC00ODQsOCArNDc5LDggQEAKICAgICBnVG9wTWVudS5hZGQobWVudUxpbmUpOwogICAgIGZpbmFsIEZsb3dQYW5lbCBtZW51UmlnaHRQYW5lbCA9IG5ldyBGbG93UGFuZWwoKTsKICAgICBtZW51UmlnaHRQYW5lbC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLnRvcG1lbnVNZW51UmlnaHQoKSk7Ci0gICAgbWVudVJpZ2h0UGFuZWwuYWRkKG1lbnVSaWdodCk7CiAgICAgbWVudVJpZ2h0UGFuZWwuYWRkKHNlYXJjaFBhbmVsKTsKKyAgICBtZW51UmlnaHRQYW5lbC5hZGQobWVudVJpZ2h0KTsKICAgICBtZW51TGluZS5zZXRXaWRnZXQoMCwgMCwgbWVudUxlZnQpOwogICAgIG1lbnVMaW5lLnNldFdpZGdldCgwLCAxLCBuZXcgRmxvd1BhbmVsKCkpOwogICAgIG1lbnVMaW5lLnNldFdpZGdldCgwLCAyLCBtZW51UmlnaHRQYW5lbCk7CkBAIC01MjIsNyArNTE3LDcgQEAKICAgICBKc29uVXRpbC5zZXREZWZhdWx0WHNyZk1hbmFnZXIobmV3IFhzcmZNYW5hZ2VyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKEpzb25EZWZUYXJnZXQgcHJveHkpIHsKLSAgICAgICAgcmV0dXJuIHhzcmZUb2tlbjsKKyAgICAgICAgcmV0dXJuIHhHZXJyaXRBdXRoOwogICAgICAgfQogCiAgICAgICBAT3ZlcnJpZGUKQEAgLTU0MSw2ICs1MzYsNyBAQAogICAgIHJlZnJlc2hNZW51QmFyKCk7CiAKICAgICBIaXN0b3J5LmFkZFZhbHVlQ2hhbmdlSGFuZGxlcihuZXcgVmFsdWVDaGFuZ2VIYW5kbGVyPFN0cmluZz4oKSB7CisgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uVmFsdWVDaGFuZ2UoZmluYWwgVmFsdWVDaGFuZ2VFdmVudDxTdHJpbmc+IGV2ZW50KSB7CiAgICAgICAgIGRpc3BsYXkoZXZlbnQuZ2V0VmFsdWUoKSk7CiAgICAgICB9CkBAIC01NTYsNyArNTUyLDUwIEBACiAgICAgaWYgKHNpZ25JbkFuY2hvciAhPSBudWxsKSB7CiAgICAgICBzaWduSW5BbmNob3Iuc2V0SHJlZihsb2dpblJlZGlyZWN0KHRva2VuKSk7CiAgICAgfQotICAgIGRpc3BsYXkodG9rZW4pOworICAgIGxvYWRQbHVnaW5zKGhwZCwgdG9rZW4pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvYWRQbHVnaW5zKEhvc3RQYWdlRGF0YSBocGQsIGZpbmFsIFN0cmluZyB0b2tlbikgeworICAgIGlmIChocGQucGx1Z2lucyAhPSBudWxsKSB7CisgICAgICBmb3IgKGZpbmFsIFN0cmluZyB1cmwgOiBocGQucGx1Z2lucykgeworICAgICAgICBTY3JpcHRJbmplY3Rvci5mcm9tVXJsKHVybCkKKyAgICAgICAgICAgIC5zZXRXaW5kb3coU2NyaXB0SW5qZWN0b3IuVE9QX1dJTkRPVykKKyAgICAgICAgICAgIC5zZXRDYWxsYmFjayhuZXcgQ2FsbGJhY2s8Vm9pZCwgRXhjZXB0aW9uPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkIHJlc3VsdCkgeworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShFeGNlcHRpb24gcmVhc29uKSB7CisgICAgICAgICAgICAgICAgRXJyb3JEaWFsb2cgZCA9IG5ldyBFcnJvckRpYWxvZyhyZWFzb24pOworICAgICAgICAgICAgICAgIGQuc2V0VGl0bGUoTS5wbHVnaW5GYWlsZWQodXJsKSk7CisgICAgICAgICAgICAgICAgZC5jZW50ZXIoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuaW5qZWN0KCk7CisgICAgICB9CisgICAgfQorCisgICAgQ2FsbGJhY2tIYW5kbGU8Vm9pZD4gY2IgPSBuZXcgQ2FsbGJhY2tIYW5kbGU8Vm9pZD4oCisgICAgICAgIG5ldyBSZXN1bHREZXNlcmlhbGl6ZXI8Vm9pZD4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFZvaWQgZnJvbVJlc3VsdChKYXZhU2NyaXB0T2JqZWN0IHJlc3BvbnNlT2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPFZvaWQ+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFZvaWQgcmVzdWx0KSB7CisgICAgICAgICAgICBkaXNwbGF5KHRva2VuKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGNiLmluc3RhbGwoKTsKKyAgICBTY3JpcHRJbmplY3Rvci5mcm9tU3RyaW5nKGNiLmdldEZ1bmN0aW9uTmFtZSgpICsgIigpOyIpCisgICAgICAgIC5zZXRXaW5kb3coU2NyaXB0SW5qZWN0b3IuVE9QX1dJTkRPVykKKyAgICAgICAgLmluamVjdCgpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2hNZW51QmFyKCkgewpAQCAtNTc3LDkgKzYxNiw5IEBACiAgICAgICBtID0gbmV3IExpbmtNZW51QmFyKCk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15Q2hhbmdlcygpLCBQYWdlTGlua3MuTUlORSk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15RHJhZnRzKCksIFBhZ2VMaW5rcy50b0NoYW5nZVF1ZXJ5KCJpczpkcmFmdCIpKTsKKyAgICAgIGFkZExpbmsobSwgQy5tZW51TXlEcmFmdENvbW1lbnRzKCksIFBhZ2VMaW5rcy50b0NoYW5nZVF1ZXJ5KCJoYXM6ZHJhZnQiKSk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15V2F0Y2hlZENoYW5nZXMoKSwgUGFnZUxpbmtzLnRvQ2hhbmdlUXVlcnkoImlzOndhdGNoZWQgc3RhdHVzOm9wZW4iKSk7CiAgICAgICBhZGRMaW5rKG0sIEMubWVudU15U3RhcnJlZENoYW5nZXMoKSwgUGFnZUxpbmtzLnRvQ2hhbmdlUXVlcnkoImlzOnN0YXJyZWQiKSk7Ci0gICAgICBhZGRMaW5rKG0sIEMubWVudU15RHJhZnRDb21tZW50cygpLCBQYWdlTGlua3MudG9DaGFuZ2VRdWVyeSgiaGFzOmRyYWZ0IikpOwogICAgICAgbWVudUxlZnQuYWRkKG0sIEMubWVudU1pbmUoKSk7CiAgICAgICBtZW51TGVmdC5zZWxlY3RUYWIoMSk7CiAgICAgfSBlbHNlIHsKQEAgLTU5Niw0NCArNjM1LDQzIEBACiAgICAgYWRkRGlmZkxpbmsoZGlmZkJhciwgQy5tZW51RGlmZlBhdGNoU2V0cygpLCBQYXRjaFNjcmVlbi5Ub3BWaWV3LlBBVENIX1NFVFMpOwogICAgIGFkZERpZmZMaW5rKGRpZmZCYXIsIEMubWVudURpZmZGaWxlcygpLCBQYXRjaFNjcmVlbi5Ub3BWaWV3LkZJTEVTKTsKIAotICAgIGZpbmFsIExpbmtNZW51QmFyIHByb2plY3RzQmFyID0gbmV3IExpbmtNZW51QmFyKCk7CisgICAgcHJvamVjdHNCYXIgPSBuZXcgTGlua01lbnVCYXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU2NyZWVuTG9hZChTY3JlZW5Mb2FkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50LmdldFNjcmVlbigpIGluc3RhbmNlb2YgUHJvamVjdFNjcmVlbikgeworICAgICAgICAgIG1lbnVMZWZ0LnNlbGVjdFRhYihtZW51TGVmdC5nZXRXaWRnZXRJbmRleCh0aGlzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OwogICAgIGFkZExpbmsocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzTGlzdCgpLCBQYWdlTGlua3MuQURNSU5fUFJPSkVDVFMpOwotICAgIGlmKHNpZ25lZEluKSB7CisgICAgYWRkUHJvamVjdExpbmsocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzSW5mbygpLCBQcm9qZWN0U2NyZWVuLklORk8pOworICAgIGFkZFByb2plY3RMaW5rKHByb2plY3RzQmFyLCBDLm1lbnVQcm9qZWN0c0JyYW5jaGVzKCksIFByb2plY3RTY3JlZW4uQlJBTkNIKTsKKyAgICBhZGRQcm9qZWN0TGluayhwcm9qZWN0c0JhciwgQy5tZW51UHJvamVjdHNBY2Nlc3MoKSwgUHJvamVjdFNjcmVlbi5BQ0NFU1MpOworICAgIGFkZFByb2plY3RMaW5rKHByb2plY3RzQmFyLCBDLm1lbnVQcm9qZWN0c0Rhc2hib2FyZHMoKSwgUHJvamVjdFNjcmVlbi5EQVNIQk9BUkRTKTsKKyAgICBtZW51TGVmdC5hZGQocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzKCkpOworCisgICAgaWYgKHNpZ25lZEluKSB7CisgICAgICBmaW5hbCBMaW5rTWVudUJhciBwZW9wbGVCYXIgPSBuZXcgTGlua01lbnVCYXIoKTsKKyAgICAgIGFkZExpbmsocGVvcGxlQmFyLCBDLm1lbnVQZW9wbGVHcm91cHNMaXN0KCksIFBhZ2VMaW5rcy5BRE1JTl9HUk9VUFMpOworICAgICAgbWVudUxlZnQuYWRkKHBlb3BsZUJhciwgQy5tZW51UGVvcGxlKCkpOworCisgICAgICBmaW5hbCBMaW5rTWVudUJhciBwbHVnaW5zQmFyID0gbmV3IExpbmtNZW51QmFyKCk7CiAgICAgICBBY2NvdW50Q2FwYWJpbGl0aWVzLmFsbChuZXcgR2Vycml0Q2FsbGJhY2s8QWNjb3VudENhcGFiaWxpdGllcz4oKSB7CiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQWNjb3VudENhcGFiaWxpdGllcyByZXN1bHQpIHsKICAgICAgICAgICBpZiAocmVzdWx0LmNhblBlcmZvcm0oQ1JFQVRFX1BST0pFQ1QpKSB7CiAgICAgICAgICAgICBhZGRMaW5rKHByb2plY3RzQmFyLCBDLm1lbnVQcm9qZWN0c0NyZWF0ZSgpLCBQYWdlTGlua3MuQURNSU5fQ1JFQVRFX1BST0pFQ1QpOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgQ1JFQVRFX1BST0pFQ1QpOwotICAgIH0KLSAgICBtZW51TGVmdC5hZGQocHJvamVjdHNCYXIsIEMubWVudVByb2plY3RzKCkpOwotCi0gICAgaWYgKHNpZ25lZEluKSB7Ci0gICAgICBmaW5hbCBMaW5rTWVudUJhciBncm91cHNCYXIgPSBuZXcgTGlua01lbnVCYXIoKTsKLSAgICAgIGFkZExpbmsoZ3JvdXBzQmFyLCBDLm1lbnVHcm91cHNMaXN0KCksIFBhZ2VMaW5rcy5BRE1JTl9HUk9VUFMpOwotICAgICAgQWNjb3VudENhcGFiaWxpdGllcy5hbGwobmV3IEdlcnJpdENhbGxiYWNrPEFjY291bnRDYXBhYmlsaXRpZXM+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEFjY291bnRDYXBhYmlsaXRpZXMgcmVzdWx0KSB7CiAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5QZXJmb3JtKENSRUFURV9HUk9VUCkpIHsKLSAgICAgICAgICAgIGFkZExpbmsoZ3JvdXBzQmFyLCBDLm1lbnVHcm91cHNDcmVhdGUoKSwgUGFnZUxpbmtzLkFETUlOX0NSRUFURV9HUk9VUCk7CisgICAgICAgICAgICBhZGRMaW5rKHBlb3BsZUJhciwgQy5tZW51UGVvcGxlR3JvdXBzQ3JlYXRlKCksIFBhZ2VMaW5rcy5BRE1JTl9DUkVBVEVfR1JPVVApOwogICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSwgQ1JFQVRFX0dST1VQKTsKLSAgICAgIG1lbnVMZWZ0LmFkZChncm91cHNCYXIsIEMubWVudUdyb3VwcygpKTsKLQotICAgICAgZmluYWwgTGlua01lbnVCYXIgcGx1Z2luc0JhciA9IG5ldyBMaW5rTWVudUJhcigpOwotICAgICAgQWNjb3VudENhcGFiaWxpdGllcy5hbGwobmV3IEdlcnJpdENhbGxiYWNrPEFjY291bnRDYXBhYmlsaXRpZXM+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEFjY291bnRDYXBhYmlsaXRpZXMgcmVzdWx0KSB7CiAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5QZXJmb3JtKEFETUlOSVNUUkFURV9TRVJWRVIpKSB7CiAgICAgICAgICAgICBhZGRMaW5rKHBsdWdpbnNCYXIsIEMubWVudVBsdWdpbnNJbnN0YWxsZWQoKSwgUGFnZUxpbmtzLkFETUlOX1BMVUdJTlMpOwogICAgICAgICAgICAgbWVudUxlZnQuaW5zZXJ0KHBsdWdpbnNCYXIsIEMubWVudVBsdWdpbnMoKSwKLSAgICAgICAgICAgICAgICBtZW51TGVmdC5nZXRXaWRnZXRJbmRleChncm91cHNCYXIpICsgMSk7CisgICAgICAgICAgICAgICAgbWVudUxlZnQuZ2V0V2lkZ2V0SW5kZXgocGVvcGxlQmFyKSArIDEpOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgfSwgQURNSU5JU1RSQVRFX1NFUlZFUik7CisgICAgICB9LCBDUkVBVEVfUFJPSkVDVCwgQ1JFQVRFX0dST1VQLCBBRE1JTklTVFJBVEVfU0VSVkVSKTsKICAgICB9CiAKICAgICBpZiAoZ2V0Q29uZmlnKCkuaXNEb2N1bWVudGF0aW9uQXZhaWxhYmxlKCkpIHsKQEAgLTY0MiwxNSArNjgwLDEyIEBACiAgICAgICBhZGREb2NMaW5rKG0sIEMubWVudURvY3VtZW50YXRpb25TZWFyY2goKSwgInVzZXItc2VhcmNoLmh0bWwiKTsKICAgICAgIGFkZERvY0xpbmsobSwgQy5tZW51RG9jdW1lbnRhdGlvblVwbG9hZCgpLCAidXNlci11cGxvYWQuaHRtbCIpOwogICAgICAgYWRkRG9jTGluayhtLCBDLm1lbnVEb2N1bWVudGF0aW9uQWNjZXNzKCksICJhY2Nlc3MtY29udHJvbC5odG1sIik7CisgICAgICBhZGREb2NMaW5rKG0sIEMubWVudURvY3VtZW50YXRpb25BUEkoKSwgInJlc3QtYXBpLmh0bWwiKTsKICAgICAgIG1lbnVMZWZ0LmFkZChtLCBDLm1lbnVEb2N1bWVudGF0aW9uKCkpOwogICAgIH0KIAogICAgIGlmIChzaWduZWRJbikgewotICAgICAgd2hvQW1JKCk7Ci0gICAgICBhZGRMaW5rKG1lbnVSaWdodCwgQy5tZW51U2V0dGluZ3MoKSwgUGFnZUxpbmtzLlNFVFRJTkdTKTsKLSAgICAgIGlmIChjZmcuZ2V0QXV0aFR5cGUoKSAhPSBBdXRoVHlwZS5DTElFTlRfU1NMX0NFUlRfTERBUCkgewotICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcihDLm1lbnVTaWduT3V0KCksIHNlbGZSZWRpcmVjdCgiL2xvZ291dCIpKSk7Ci0gICAgICB9CisgICAgICB3aG9BbUkoY2ZnLmdldEF1dGhUeXBlKCkgIT0gQXV0aFR5cGUuQ0xJRU5UX1NTTF9DRVJUX0xEQVApOwogICAgIH0gZWxzZSB7CiAgICAgICBzd2l0Y2ggKGNmZy5nZXRBdXRoVHlwZSgpKSB7CiAgICAgICAgIGNhc2UgSFRUUDoKQEAgLTY2MSw4ICs2OTYsMTEgQEAKICAgICAgICAgY2FzZSBPUEVOSUQ6CiAgICAgICAgICAgbWVudVJpZ2h0LmFkZEl0ZW0oQy5tZW51UmVnaXN0ZXIoKSwgbmV3IENvbW1hbmQoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG8gPSBIaXN0b3J5LmdldFRva2VuKCk7Ci0gICAgICAgICAgICAgIG5ldyBPcGVuSWRTaWduSW5EaWFsb2coU2lnbkluTW9kZS5SRUdJU1RFUiwgdG8sIG51bGwpLmNlbnRlcigpOworICAgICAgICAgICAgICBTdHJpbmcgdCA9IEhpc3RvcnkuZ2V0VG9rZW4oKTsKKyAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHQgPSAiIjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkb1NpZ25JbihQYWdlTGlua3MuUkVHSVNURVIgKyB0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9KTsKICAgICAgICAgICBtZW51UmlnaHQuYWRkSXRlbShDLm1lbnVTaWduSW4oKSwgbmV3IENvbW1hbmQoKSB7CkBAIC02ODQsNyArNzIyLDggQEAKICAgICAgICAgY2FzZSBMREFQX0JJTkQ6CiAgICAgICAgIGNhc2UgQ1VTVE9NX0VYVEVOU0lPTjoKICAgICAgICAgICBpZiAoY2ZnLmdldFJlZ2lzdGVyVXJsKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgbWVudVJpZ2h0LmFkZChhbmNob3IoQy5tZW51UmVnaXN0ZXIoKSwgY2ZnLmdldFJlZ2lzdGVyVXJsKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZWdpc3RlclRleHQgPSBjZmcuZ2V0UmVnaXN0ZXJUZXh0KCkgPT0gbnVsbCA/IEMubWVudVJlZ2lzdGVyKCkgOiBjZmcuZ2V0UmVnaXN0ZXJUZXh0KCk7CisgICAgICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcihyZWdpc3RlclRleHQsIGNmZy5nZXRSZWdpc3RlclVybCgpKSk7CiAgICAgICAgICAgfQogICAgICAgICAgIG1lbnVSaWdodC5hZGRJdGVtKEMubWVudVNpZ25JbigpLCBuZXcgQ29tbWFuZCgpIHsKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CkBAIC02OTQsNyArNzMzLDcgQEAKICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKLSAgICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcigiQmVjb21lIiwgc2VsZlJlZGlyZWN0KCIvYmVjb21lIikpKTsKKyAgICAgICAgICBtZW51UmlnaHQuYWRkKGFuY2hvcigiQmVjb21lIiwgbG9naW5SZWRpcmVjdCgiIikpKTsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC03MTQsMTcgKzc1Myw1NCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgd2hvQW1JKCkgewotICAgIGZpbmFsIFN0cmluZyBuYW1lID0gRm9ybWF0VXRpbC5uYW1lRW1haWwoZ2V0VXNlckFjY291bnQoKSk7Ci0gICAgZmluYWwgSW5saW5lTGFiZWwgbCA9IG5ldyBJbmxpbmVMYWJlbChuYW1lKTsKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3aG9BbUkoYm9vbGVhbiBjYW5Mb2dPdXQpIHsKKyAgICBBY2NvdW50IGFjY291bnQgPSBnZXRVc2VyQWNjb3VudCgpOworICAgIGZpbmFsIEN1cnJlbnRVc2VyUG9wdXBQYW5lbCB1c2VyUG9wdXAgPQorICAgICAgICBuZXcgQ3VycmVudFVzZXJQb3B1cFBhbmVsKGFjY291bnQsIGNhbkxvZ091dCk7CisgICAgZmluYWwgRmxvd1BhbmVsIHVzZXJTdW1tYXJ5UGFuZWwgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgY2xhc3MgUG9wdXBIYW5kbGVyIGltcGxlbWVudHMgS2V5RG93bkhhbmRsZXIsIENsaWNrSGFuZGxlciB7CisgICAgICBwcml2YXRlIHZvaWQgc2hvd0hpZGVQb3B1cCgpIHsKKyAgICAgICAgaWYgKHVzZXJQb3B1cC5pc1Nob3dpbmcoKSAmJiB1c2VyUG9wdXAuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICB1c2VyUG9wdXAuaGlkZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVzZXJQb3B1cC5zaG93UmVsYXRpdmVUbyh1c2VyU3VtbWFyeVBhbmVsKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICBzaG93SGlkZVBvcHVwKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25LZXlEb3duKEtleURvd25FdmVudCBldmVudCkgeworICAgICAgICBpZihldmVudC5nZXROYXRpdmVLZXlDb2RlKCkgPT0gS2V5Q29kZXMuS0VZX0VOVEVSKSB7CisgICAgICAgICAgc2hvd0hpZGVQb3B1cCgpOworICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZmluYWwgUG9wdXBIYW5kbGVyIHBvcHVwSGFuZGxlciA9IG5ldyBQb3B1cEhhbmRsZXIoKTsKKyAgICBmaW5hbCBJbmxpbmVMYWJlbCBsID0gbmV3IElubGluZUxhYmVsKEZvcm1hdFV0aWwubmFtZShhY2NvdW50KSk7CiAgICAgbC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVCYXJVc2VyTmFtZSgpKTsKLSAgICBtZW51UmlnaHQuYWRkKGwpOworICAgIGZpbmFsIEF2YXRhckltYWdlIGF2YXRhciA9IG5ldyBBdmF0YXJJbWFnZShhY2NvdW50LmdldElkKCksIDI2KTsKKyAgICBhdmF0YXIuc2V0U3R5bGVOYW1lKFJFU09VUkNFUy5jc3MoKS5tZW51QmFyVXNlck5hbWVBdmF0YXIoKSk7CisgICAgdXNlclN1bW1hcnlQYW5lbC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVCYXJVc2VyTmFtZVBhbmVsKCkpOworICAgIHVzZXJTdW1tYXJ5UGFuZWwuYWRkKGwpOworICAgIHVzZXJTdW1tYXJ5UGFuZWwuYWRkKGF2YXRhcik7CisgICAgdXNlclN1bW1hcnlQYW5lbC5hZGQobmV3IElubGluZUxhYmVsKCIg4pa+IikpOworICAgIHVzZXJQb3B1cC5hZGRBdXRvSGlkZVBhcnRuZXIodXNlclN1bW1hcnlQYW5lbC5nZXRFbGVtZW50KCkpOworICAgIEZvY3VzUGFuZWwgZnAgPSBuZXcgRm9jdXNQYW5lbCh1c2VyU3VtbWFyeVBhbmVsKTsKKyAgICBmcC5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVCYXJVc2VyTmFtZUZvY3VzUGFuZWwoKSk7CisgICAgZnAuYWRkS2V5RG93bkhhbmRsZXIocG9wdXBIYW5kbGVyKTsKKyAgICBmcC5hZGRDbGlja0hhbmRsZXIocG9wdXBIYW5kbGVyKTsKKyAgICBtZW51UmlnaHQuYWRkKGZwKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIEFuY2hvciBhbmNob3IoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyB0bykgewogICAgIGZpbmFsIEFuY2hvciBhID0gbmV3IEFuY2hvcih0ZXh0LCB0byk7CiAgICAgYS5zZXRTdHlsZU5hbWUoUkVTT1VSQ0VTLmNzcygpLm1lbnVJdGVtKCkpOwotICAgIEFjY2Vzc2liaWxpdHkuc2V0Um9sZShhLmdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX01FTlVJVEVNKTsKKyAgICBSb2xlcy5nZXRNZW51aXRlbVJvbGUoKS5zZXQoYS5nZXRFbGVtZW50KCkpOwogICAgIHJldHVybiBhOwogICB9CiAKQEAgLTc0Niw2ICs4MjIsMzAgQEAKICAgICAgIH0pOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQcm9qZWN0TGluayhmaW5hbCBMaW5rTWVudUJhciBtLCBmaW5hbCBTdHJpbmcgdGV4dCwKKyAgICAgIGZpbmFsIFN0cmluZyBwYW5lbCkgeworICAgIG0uYWRkSXRlbShuZXcgTGlua01lbnVJdGVtKHRleHQsICIiKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNjcmVlbkxvYWQoU2NyZWVuTG9hZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgU2NyZWVuIHNjcmVlbiA9IGV2ZW50LmdldFNjcmVlbigpOworICAgICAgICAgIFByb2plY3QuTmFtZUtleSBwcm9qZWN0S2V5OworICAgICAgICAgIGlmIChzY3JlZW4gaW5zdGFuY2VvZiBQcm9qZWN0U2NyZWVuKSB7CisgICAgICAgICAgICBwcm9qZWN0S2V5ID0gKChQcm9qZWN0U2NyZWVuKXNjcmVlbikuZ2V0UHJvamVjdEtleSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9qZWN0S2V5ID0gUHJvamVjdFNjcmVlbi5nZXRTYXZlZEtleSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChwcm9qZWN0S2V5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICBzZXRUYXJnZXRIaXN0b3J5VG9rZW4oRGlzcGF0Y2hlci50b1Byb2plY3RBZG1pbihwcm9qZWN0S2V5LCBwYW5lbCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgc3VwZXIub25TY3JlZW5Mb2FkKGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgfSk7CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERpZmZMaW5rKGZpbmFsIExpbmtNZW51QmFyIG0sIGZpbmFsIFN0cmluZyB0ZXh0LAogICAgICAgZmluYWwgUGF0Y2hTY3JlZW4uVHlwZSB0eXBlKSB7CiAgICAgbS5hZGRJdGVtKG5ldyBMaW5rTWVudUl0ZW0odGV4dCwgIiIpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDb25zdGFudHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDb25zdGFudHMuamF2YQppbmRleCA4N2MwMWNjLi42ODNmMDU4IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0Q29uc3RhbnRzLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENvbnN0YW50cy5qYXZhCkBAIC00NCw3ICs0NCw2IEBACiAKICAgU3RyaW5nIG5vdEZvdW5kVGl0bGUoKTsKICAgU3RyaW5nIG5vdEZvdW5kQm9keSgpOwotICBTdHJpbmcgbmFtZUFscmVhZHlVc2VkQm9keSgpOwogICBTdHJpbmcgbm9TdWNoQWNjb3VudFRpdGxlKCk7CiAKICAgU3RyaW5nIG5vU3VjaEdyb3VwVGl0bGUoKTsKQEAgLTcxLDEyICs3MCwxNiBAQAogCiAgIFN0cmluZyBtZW51UHJvamVjdHMoKTsKICAgU3RyaW5nIG1lbnVQcm9qZWN0c0xpc3QoKTsKKyAgU3RyaW5nIG1lbnVQcm9qZWN0c0luZm8oKTsKKyAgU3RyaW5nIG1lbnVQcm9qZWN0c0JyYW5jaGVzKCk7CisgIFN0cmluZyBtZW51UHJvamVjdHNBY2Nlc3MoKTsKKyAgU3RyaW5nIG1lbnVQcm9qZWN0c0Rhc2hib2FyZHMoKTsKICAgU3RyaW5nIG1lbnVQcm9qZWN0c0NyZWF0ZSgpOwogCiAgIFN0cmluZyBtZW51UGVvcGxlKCk7Ci0gIFN0cmluZyBtZW51R3JvdXBzKCk7Ci0gIFN0cmluZyBtZW51R3JvdXBzTGlzdCgpOwotICBTdHJpbmcgbWVudUdyb3Vwc0NyZWF0ZSgpOworICBTdHJpbmcgbWVudVBlb3BsZUdyb3Vwc0xpc3QoKTsKKyAgU3RyaW5nIG1lbnVQZW9wbGVHcm91cHNDcmVhdGUoKTsKKwogICBTdHJpbmcgbWVudVBsdWdpbnMoKTsKICAgU3RyaW5nIG1lbnVQbHVnaW5zSW5zdGFsbGVkKCk7CiAKQEAgLTg1LDYgKzg4LDcgQEAKICAgU3RyaW5nIG1lbnVEb2N1bWVudGF0aW9uU2VhcmNoKCk7CiAgIFN0cmluZyBtZW51RG9jdW1lbnRhdGlvblVwbG9hZCgpOwogICBTdHJpbmcgbWVudURvY3VtZW50YXRpb25BY2Nlc3MoKTsKKyAgU3RyaW5nIG1lbnVEb2N1bWVudGF0aW9uQVBJKCk7CiAKICAgU3RyaW5nIHNlYXJjaEhpbnQoKTsKICAgU3RyaW5nIHNlYXJjaEJ1dHRvbigpOwpAQCAtMTA4LDQgKzExMiw2IEBACiAKICAgU3RyaW5nIHByb2plY3RBY2Nlc3NFcnJvcigpOwogICBTdHJpbmcgcHJvamVjdEFjY2Vzc1Byb3Bvc2VGb3JSZXZpZXdIaW50KCk7CisKKyAgU3RyaW5nIHVzZXJDYW5ub3RWb3RlVG9vbFRpcCgpOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENvbnN0YW50cy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENvbnN0YW50cy5wcm9wZXJ0aWVzCmluZGV4IDU5NmIzYWQuLmRlZmM3ZTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDb25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0Q29uc3RhbnRzLnByb3BlcnRpZXMKQEAgLTExLDcgKzExLDcgQEAKIHJlZ2lzdGVyRGlhbG9nVGl0bGUgPSBDb2RlIFJldmlldyAtIFJlZ2lzdGVyIE5ldyBBY2NvdW50CiBsb2dpblR5cGVVbnN1cHBvcnRlZCA9IFNpZ24gaW4gaXMgbm90IGF2YWlsYWJsZS4KIAotZXJyb3JEaWFsb2dUaXRsZSA9IEFwcGxpY2F0aW9uIEVycm9yCitlcnJvckRpYWxvZ1RpdGxlID0gQ29kZSBSZXZpZXcgLSBFcnJvcgogZXJyb3JEaWFsb2dDb250aW51ZSA9IENvbnRpbnVlCiAKIGNvbmZpcm1hdGlvbkRpYWxvZ09rID0gT0sKQEAgLTI3LDcgKzI3LDYgQEAKIAogbm90Rm91bmRUaXRsZSA9IE5vdCBGb3VuZAogbm90Rm91bmRCb2R5ID0gVGhlIHBhZ2UgeW91IHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLCBvciB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgcGFnZS4KLW5hbWVBbHJlYWR5VXNlZEJvZHkgPSBUaGUgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4KIG5vU3VjaEFjY291bnRUaXRsZSA9IENvZGUgUmV2aWV3IC0gVW5rbm93biBVc2VyCiAKIG5vU3VjaEdyb3VwVGl0bGUgPSBDb2RlIFJldmlldyAtIFVua25vd24gR3JvdXAKQEAgLTU0LDEyICs1MywxNSBAQAogCiBtZW51UHJvamVjdHMgPSBQcm9qZWN0cwogbWVudVByb2plY3RzTGlzdCA9IExpc3QKK21lbnVQcm9qZWN0c0luZm8gPSBHZW5lcmFsCittZW51UHJvamVjdHNCcmFuY2hlcyA9IEJyYW5jaGVzCittZW51UHJvamVjdHNBY2Nlc3MgPSBBY2Nlc3MKK21lbnVQcm9qZWN0c0Rhc2hib2FyZHMgPSBEYXNoYm9hcmRzCiBtZW51UHJvamVjdHNDcmVhdGUgPSBDcmVhdGUgTmV3IFByb2plY3QKIAogbWVudVBlb3BsZSA9IFBlb3BsZQotbWVudUdyb3VwcyA9IEdyb3VwcwotbWVudUdyb3Vwc0xpc3QgPSBMaXN0Ci1tZW51R3JvdXBzQ3JlYXRlID0gQ3JlYXRlIE5ldyBHcm91cAorbWVudVBlb3BsZUdyb3Vwc0xpc3QgPSBMaXN0IEdyb3VwcworbWVudVBlb3BsZUdyb3Vwc0NyZWF0ZSA9IENyZWF0ZSBOZXcgR3JvdXAKIAogbWVudVBsdWdpbnMgPSBQbHVnaW5zCiBtZW51UGx1Z2luc0luc3RhbGxlZCA9IEluc3RhbGxlZApAQCAtNjksOCArNzEsOSBAQAogbWVudURvY3VtZW50YXRpb25TZWFyY2ggPSBTZWFyY2hpbmcKIG1lbnVEb2N1bWVudGF0aW9uVXBsb2FkID0gVXBsb2FkaW5nCiBtZW51RG9jdW1lbnRhdGlvbkFjY2VzcyA9IEFjY2VzcyBDb250cm9scworbWVudURvY3VtZW50YXRpb25BUEkgPSBSRVNUIEFQSQogCi1zZWFyY2hIaW50ID0gQ2hhbmdlICMsIFNIQS0xLCB0cjppZCwgb3duZXI6ZW1haWwgb3IgcmV2aWV3ZXI6ZW1haWwKK3NlYXJjaEhpbnQgPSBDaGFuZ2UgIywgU0hBLTEsIHRyOmlkIG9yIG93bmVyOmVtYWlsCiBzZWFyY2hCdXR0b24gPSBTZWFyY2gKIAogcnBjU3RhdHVzV29ya2luZyA9IFdvcmtpbmcgLi4uCkBAIC05MiwzICs5NSw1IEBACiAKIHByb2plY3RBY2Nlc3NFcnJvciA9IFlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb25zIHRvIG1vZGlmeSB0aGUgYWNjZXNzIHJpZ2h0cyBmb3IgdGhlIGZvbGxvd2luZyByZWZzOgogcHJvamVjdEFjY2Vzc1Byb3Bvc2VGb3JSZXZpZXdIaW50ID0gWW91IG1heSBwcm9wb3NlIHRoZXNlIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHByb2plY3Qgb3duZXJzIGJ5IGNsaWNraW5nIG9uICdTYXZlIGZvciBSZXZpZXcnLgorCit1c2VyQ2Fubm90Vm90ZVRvb2xUaXAgPSBVc2VyIGNhbm5vdCB2b3RlIGluIHRoaXMgY2F0ZWdvcnkKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDc3MuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRDc3MuamF2YQppbmRleCA5Y2JmNWNkLi40ODlmZjAwIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0Q3NzLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdENzcy5qYXZhCkBAIC0xNywyMiArMTcsMTkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNzc1Jlc291cmNlOwogCiBwdWJsaWMgaW50ZXJmYWNlIEdlcnJpdENzcyBleHRlbmRzIENzc1Jlc291cmNlIHsKLSAgU3RyaW5nIGdyZWVuQ2hlY2tDbGFzcygpOwogICBTdHJpbmcgYWNjb3VudENvbnRhY3RPbkZpbGUoKTsKICAgU3RyaW5nIGFjY291bnRDb250YWN0UHJpdmFjeURldGFpbHMoKTsKICAgU3RyaW5nIGFjY291bnREYXNoYm9hcmQoKTsKICAgU3RyaW5nIGFjY291bnRJbmZvQmxvY2soKTsKICAgU3RyaW5nIGFjY291bnROYW1lKCk7Ci0gIFN0cmluZyBhY2NvdW50VXNlcm5hbWUoKTsKICAgU3RyaW5nIGFjY291bnRQYXNzd29yZCgpOworICBTdHJpbmcgYWNjb3VudFVzZXJuYW1lKCk7CiAgIFN0cmluZyBhY3RpdmVSb3coKTsKKyAgU3RyaW5nIGFkZEJyYW5jaCgpOwogICBTdHJpbmcgYWRkTWVtYmVyVGV4dEJveCgpOwogICBTdHJpbmcgYWRkUmV2aWV3ZXIoKTsKLSAgU3RyaW5nIHJlbW92ZVJldmlld2VyKCk7Ci0gIFN0cmluZyByZW1vdmVSZXZpZXdlckNlbGwoKTsKICAgU3RyaW5nIGFkZFNzaEtleVBhbmVsKCk7CiAgIFN0cmluZyBhZGRXYXRjaFBhbmVsKCk7Ci0gIFN0cmluZyBhcHByb3ZhbENhdGVnb3J5TGlzdCgpOwogICBTdHJpbmcgYXBwcm92YWxUYWJsZSgpOwogICBTdHJpbmcgYXBwcm92YWxoaW50KCk7CiAgIFN0cmluZyBhcHByb3ZhbHJvbGUoKTsKQEAgLTQwLDEyICszNywxMyBAQAogICBTdHJpbmcgYmxvY2tIZWFkZXIoKTsKICAgU3RyaW5nIGJvdHRvbWhlYWRlcigpOwogICBTdHJpbmcgY0FQUFJPVkFMKCk7Ci0gIFN0cmluZyBjSUQoKTsKICAgU3RyaW5nIGNMYXN0VXBkYXRlKCk7Ci0gIFN0cmluZyBjUFJPSkVDVCgpOworICBTdHJpbmcgY09XTkVSKCk7CiAgIFN0cmluZyBjU1VCSkVDVCgpOworICBTdHJpbmcgY2VsbHNOZXh0VG9GaWxlQ29tbWVudCgpOwogICBTdHJpbmcgY2hhbmdlQ29tbWVudHMoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9jaygpOworICBTdHJpbmcgY2hhbmdlSW5mb1RvcGljUGFuZWwoKTsKICAgU3RyaW5nIGNoYW5nZVNjcmVlbigpOwogICBTdHJpbmcgY2hhbmdlU2NyZWVuRGVzY3JpcHRpb24oKTsKICAgU3RyaW5nIGNoYW5nZVNjcmVlblN0YXJJY29uKCk7CkBAIC01NCwyMyArNTIsMjQgQEAKICAgU3RyaW5nIGNoYW5nZVR5cGVDZWxsKCk7CiAgIFN0cmluZyBjaGFuZ2VpZCgpOwogICBTdHJpbmcgY2xvc2Vkc3RhdGUoKTsKLSAgU3RyaW5nIGNvbW1lbnRlZEFjdGlvbkRpYWxvZygpOwotICBTdHJpbmcgY29tbWVudGVkQWN0aW9uTWVzc2FnZSgpOwogICBTdHJpbmcgY29tbWVudENlbGwoKTsKICAgU3RyaW5nIGNvbW1lbnRFZGl0b3JQYW5lbCgpOwogICBTdHJpbmcgY29tbWVudEhvbGRlcigpOworICBTdHJpbmcgY29tbWVudEhvbGRlckxlZnRtb3N0KCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWwoKTsKLSAgU3RyaW5nIGNvbW1lbnRQYW5lbEJvcmRlcigpOwogICBTdHJpbmcgY29tbWVudFBhbmVsQXV0aG9yQ2VsbCgpOworICBTdHJpbmcgY29tbWVudFBhbmVsQm9yZGVyKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxCdXR0b25zKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxDb250ZW50KCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxEYXRlQ2VsbCgpOwogICBTdHJpbmcgY29tbWVudFBhbmVsSGVhZGVyKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxMYXN0KCk7Ci0gIFN0cmluZyBjb21tZW50UGFuZWxNZXNzYWdlKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxNZW51QmFyKCk7CisgIFN0cmluZyBjb21tZW50UGFuZWxNZXNzYWdlKCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxTdW1tYXJ5KCk7CiAgIFN0cmluZyBjb21tZW50UGFuZWxTdW1tYXJ5Q2VsbCgpOworICBTdHJpbmcgY29tbWVudGVkQWN0aW9uRGlhbG9nKCk7CisgIFN0cmluZyBjb21tZW50ZWRBY3Rpb25NZXNzYWdlKCk7CiAgIFN0cmluZyBjb21wbGV4SGVhZGVyKCk7CiAgIFN0cmluZyBjb250ZW50KCk7CiAgIFN0cmluZyBjb250cmlidXRvckFncmVlbWVudEFscmVhZHlTdWJtaXR0ZWQoKTsKQEAgLTg3LDI1ICs4NiwyNyBAQAogICBTdHJpbmcgZGlmZlRleHRDT05URVhUKCk7CiAgIFN0cmluZyBkaWZmVGV4dERFTEVURSgpOwogICBTdHJpbmcgZGlmZlRleHRGaWxlSGVhZGVyKCk7CisgIFN0cmluZyBkaWZmVGV4dEZvckJpbmFyeUluU2lkZUJ5U2lkZSgpOwogICBTdHJpbmcgZGlmZlRleHRIdW5rSGVhZGVyKCk7CiAgIFN0cmluZyBkaWZmVGV4dElOU0VSVCgpOwogICBTdHJpbmcgZGlmZlRleHROb0xGKCk7CiAgIFN0cmluZyBkb3dubG9hZExpbmsoKTsKLSAgU3RyaW5nIGRvd25sb2FkTGlua19BY3RpdmUoKTsKLSAgU3RyaW5nIGRvd25sb2FkTGlua0xpc3RDZWxsKCk7CiAgIFN0cmluZyBkb3dubG9hZExpbmtDb3B5TGFiZWwoKTsKICAgU3RyaW5nIGRvd25sb2FkTGlua0hlYWRlcigpOwogICBTdHJpbmcgZG93bmxvYWRMaW5rSGVhZGVyR2FwKCk7CiAgIFN0cmluZyBkb3dubG9hZExpbmtMaXN0KCk7CisgIFN0cmluZyBkb3dubG9hZExpbmtMaXN0Q2VsbCgpOworICBTdHJpbmcgZG93bmxvYWRMaW5rX0FjdGl2ZSgpOwogICBTdHJpbmcgZHJhZnRzKCk7CiAgIFN0cmluZyBlbXB0eVNlY3Rpb24oKTsKICAgU3RyaW5nIGVycm9yRGlhbG9nKCk7Ci0gIFN0cmluZyBlcnJvckRpYWxvZ0dsYXNzKCk7Ci0gIFN0cmluZyBlcnJvckRpYWxvZ1RpdGxlKCk7CiAgIFN0cmluZyBlcnJvckRpYWxvZ0J1dHRvbnMoKTsKICAgU3RyaW5nIGVycm9yRGlhbG9nRXJyb3JUeXBlKCk7CisgIFN0cmluZyBlcnJvckRpYWxvZ0dsYXNzKCk7CiAgIFN0cmluZyBlcnJvckRpYWxvZ1RleHQoKTsKKyAgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGUoKTsKICAgU3RyaW5nIGZpbGVDb2x1bW5IZWFkZXIoKTsKKyAgU3RyaW5nIGZpbGVDb21tZW50Qm9yZGVyKCk7CiAgIFN0cmluZyBmaWxlTGluZSgpOwogICBTdHJpbmcgZmlsZUxpbmVDT05URVhUKCk7CiAgIFN0cmluZyBmaWxlTGluZURFTEVURSgpOwpAQCAtMTEzLDggKzExNCw5IEBACiAgIFN0cmluZyBmaWxlTGluZU1vZGUoKTsKICAgU3RyaW5nIGZpbGVMaW5lTm9uZSgpOwogICBTdHJpbmcgZmlsZVBhdGhDZWxsKCk7Ci0gIFN0cmluZyBnZXJyaXRUb3BNZW51KCk7CiAgIFN0cmluZyBnZXJyaXRCb2R5KCk7CisgIFN0cmluZyBnZXJyaXRUb3BNZW51KCk7CisgIFN0cmluZyBncmVlbkNoZWNrQ2xhc3MoKTsKICAgU3RyaW5nIGdyb3VwRGVzY3JpcHRpb25QYW5lbCgpOwogICBTdHJpbmcgZ3JvdXBFeHRlcm5hbE5hbWVGaWx0ZXJUZXh0Qm94KCk7CiAgIFN0cmluZyBncm91cEluY2x1ZGVzVGFibGUoKTsKQEAgLTEyNSwyNCArMTI3LDI5IEBACiAgIFN0cmluZyBncm91cE9wdGlvbnNQYW5lbCgpOwogICBTdHJpbmcgZ3JvdXBPd25lclBhbmVsKCk7CiAgIFN0cmluZyBncm91cE93bmVyVGV4dEJveCgpOwotICBTdHJpbmcgZ3JvdXBUeXBlUGFuZWwoKTsKICAgU3RyaW5nIGdyb3VwVHlwZVNlbGVjdExpc3RCb3goKTsKICAgU3RyaW5nIGdyb3VwVVVJRFBhbmVsKCk7CiAgIFN0cmluZyBoZWFkZXIoKTsKICAgU3RyaW5nIGh5cGVybGluaygpOwogICBTdHJpbmcgaWNvbkNlbGwoKTsKKyAgU3RyaW5nIGljb25DZWxsT2ZGaWxlQ29tbWVudFJvdygpOwogICBTdHJpbmcgaWNvbkhlYWRlcigpOwogICBTdHJpbmcgaWRlbnRpdHlVbnRydXN0ZWRFeHRlcm5hbElkKCk7CiAgIFN0cmluZyBpbmZvQmxvY2soKTsKICAgU3RyaW5nIGluZm9UYWJsZSgpOwogICBTdHJpbmcgaW5wdXRGaWVsZFR5cGVIaW50KCk7CiAgIFN0cmluZyBrZXloZWxwKCk7CisgIFN0cmluZyBsYWJlbExpc3QoKTsKICAgU3RyaW5nIGxlZnRNb3N0Q2VsbCgpOwogICBTdHJpbmcgbGluZUhlYWRlcigpOwogICBTdHJpbmcgbGluZU51bWJlcigpOworICBTdHJpbmcgbGluaygpOwogICBTdHJpbmcgbGlua01lbnVCYXIoKTsKICAgU3RyaW5nIGxpbmtNZW51SXRlbU5vdExhc3QoKTsKICAgU3RyaW5nIG1lbnVCYXJVc2VyTmFtZSgpOworICBTdHJpbmcgbWVudUJhclVzZXJOYW1lQXZhdGFyKCk7CisgIFN0cmluZyBtZW51QmFyVXNlck5hbWVGb2N1c1BhbmVsKCk7CisgIFN0cmluZyBtZW51QmFyVXNlck5hbWVQYW5lbCgpOwogICBTdHJpbmcgbWVudUl0ZW0oKTsKICAgU3RyaW5nIG1lbnVTY3JlZW5NZW51QmFyKCk7CiAgIFN0cmluZyBtaXNzaW5nQXBwcm92YWwoKTsKQEAgLTE1MiwxMCArMTU5LDEyIEBACiAgIFN0cmluZyBuZWdzY29yZSgpOwogICBTdHJpbmcgbm9MaW5lTGluZU51bWJlcigpOwogICBTdHJpbmcgbm9ib3JkZXIoKTsKKyAgU3RyaW5nIG5vdFZvdGFibGUoKTsKICAgU3RyaW5nIG91dGRhdGVkKCk7CiAgIFN0cmluZyBwYXJlbnRzVGFibGUoKTsKICAgU3RyaW5nIHBhdGNoQnJvd3NlclBvcHVwKCk7CiAgIFN0cmluZyBwYXRjaEJyb3dzZXJQb3B1cEJvZHkoKTsKKyAgU3RyaW5nIHBhdGNoQ2VsbFJldmVyc2VEaWZmKCk7CiAgIFN0cmluZyBwYXRjaENvbW1lbnRzKCk7CiAgIFN0cmluZyBwYXRjaENvbnRlbnRUYWJsZSgpOwogICBTdHJpbmcgcGF0Y2hIaXN0b3J5VGFibGUoKTsKQEAgLTE3MCwxMiArMTc5LDE4IEBACiAgIFN0cmluZyBwYXRjaFNpemVDZWxsKCk7CiAgIFN0cmluZyBwbHVnaW5zVGFibGUoKTsKICAgU3RyaW5nIHBvc3Njb3JlKCk7Ci0gIFN0cmluZyBwcm9qZWN0QWRtaW5BcHByb3ZhbENhdGVnb3J5UmFuZ2VMaW5lKCk7Ci0gIFN0cmluZyBwcm9qZWN0QWRtaW5BcHByb3ZhbENhdGVnb3J5VmFsdWUoKTsKKyAgU3RyaW5nIHByb2plY3RBZG1pbkxhYmVsUmFuZ2VMaW5lKCk7CisgIFN0cmluZyBwcm9qZWN0QWRtaW5MYWJlbFZhbHVlKCk7CisgIFN0cmluZyBwcm9qZWN0RmlsdGVyTGFiZWwoKTsKKyAgU3RyaW5nIHByb2plY3RGaWx0ZXJQYW5lbCgpOwogICBTdHJpbmcgcHVibGlzaENvbW1lbnRzU2NyZWVuKCk7CiAgIFN0cmluZyByZWdpc3RlclNjcmVlbkV4cGxhaW4oKTsKICAgU3RyaW5nIHJlZ2lzdGVyU2NyZWVuTmV4dExpbmtzKCk7CiAgIFN0cmluZyByZWdpc3RlclNjcmVlblNlY3Rpb24oKTsKKyAgU3RyaW5nIHJlbW92ZVJldmlld2VyKCk7CisgIFN0cmluZyByZW1vdmVSZXZpZXdlckNlbGwoKTsKKyAgU3RyaW5nIHJldmlld2VkUGFuZWxCb3R0b20oKTsKKyAgU3RyaW5nIHJpZ2h0Qm9yZGVyKCk7CiAgIFN0cmluZyByaWdodG1vc3QoKTsKICAgU3RyaW5nIHJwY1N0YXR1cygpOwogICBTdHJpbmcgcnBjU3RhdHVzTG9hZGluZygpOwpAQCAtMTg1LDggKzIwMCwxMCBAQAogICBTdHJpbmcgc2NyZWVuTm9IZWFkZXIoKTsKICAgU3RyaW5nIHNlYXJjaFBhbmVsKCk7CiAgIFN0cmluZyBzZWN0aW9uSGVhZGVyKCk7CisgIFN0cmluZyBzZWxlY3RQYXRjaFNldE9sZFZlcnNpb24oKTsKICAgU3RyaW5nIHNpZGVCeVNpZGVTY3JlZW5MaW5rVGFibGUoKTsKICAgU3RyaW5nIHNpZGVCeVNpZGVTY3JlZW5TaWRlQnlTaWRlVGFibGUoKTsKKyAgU3RyaW5nIHNpZGVCeVNpZGVUYWJsZUJpbmFyeUhlYWRlcigpOwogICBTdHJpbmcgc2luZ2xlTGluZSgpOwogICBTdHJpbmcgc2tpcExpbmUoKTsKICAgU3RyaW5nIHNtYWxsSGVhZGluZygpOwpAQCAtMTk5LDE3ICsyMTYsMTggQEAKICAgU3RyaW5nIHNzaEhvc3RLZXlQYW5lbEtub3duSG9zdEVudHJ5KCk7CiAgIFN0cmluZyBzc2hLZXlQYW5lbEVuY29kZWRLZXkoKTsKICAgU3RyaW5nIHNzaEtleVBhbmVsSW52YWxpZCgpOworICBTdHJpbmcgdG9wTW9zdENlbGwoKTsKICAgU3RyaW5nIHRvcG1lbnUoKTsKICAgU3RyaW5nIHRvcG1lbnVNZW51TGVmdCgpOwogICBTdHJpbmcgdG9wbWVudU1lbnVSaWdodCgpOwogICBTdHJpbmcgdG9wbWVudVREZ2x1ZSgpOwogICBTdHJpbmcgdG9wbWVudVREbWVudSgpOwogICBTdHJpbmcgdG9wbW9zdCgpOwotICBTdHJpbmcgdG9wTW9zdENlbGwoKTsKKyAgU3RyaW5nIHVuaWZpZWRUYWJsZSgpOworICBTdHJpbmcgdW5pZmllZFRhYmxlSGVhZGVyKCk7CisgIFN0cmluZyB1c2VySW5mb1BvcHVwKCk7CiAgIFN0cmluZyB1c2VyaWRlbnRpdHkoKTsKICAgU3RyaW5nIHVzZXJuYW1lRmllbGQoKTsKICAgU3RyaW5nIHZlcnNpb24oKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0RmlsdGVyKCk7Ci0gIFN0cmluZyBzZWxlY3RQYXRjaFNldE9sZFZlcnNpb24oKTsKLSAgU3RyaW5nIHBhdGNoQ2VsbFJldmVyc2VEaWZmKCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0TWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5qYXZhCmluZGV4IGFlZmEzYTUuLjhmYzE5NmEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5qYXZhCkBAIC0yMiw2ICsyMiwxNSBAQAogICBTdHJpbmcgcG93ZXJlZEJ5KFN0cmluZyB2ZXJzaW9uKTsKIAogICBTdHJpbmcgbm9TdWNoQWNjb3VudE1lc3NhZ2UoU3RyaW5nIHdobyk7Ci0KICAgU3RyaW5nIG5vU3VjaEdyb3VwTWVzc2FnZShTdHJpbmcgd2hvKTsKKyAgU3RyaW5nIG5hbWVBbHJlYWR5VXNlZEJvZHkoU3RyaW5nIGFscmVhZHlVc2VkTmFtZSk7CisKKyAgU3RyaW5nIGJyYW5jaENyZWF0aW9uRmFpbGVkKFN0cmluZyBicmFuY2hOYW1lLCBTdHJpbmcgZXJyb3IpOworICBTdHJpbmcgaW52YWxpZEJyYW5jaE5hbWUoU3RyaW5nIGJyYW5jaE5hbWUpOworICBTdHJpbmcgaW52YWxpZFJldmlzaW9uKFN0cmluZyByZXZpc2lvbik7CisgIFN0cmluZyBicmFuY2hDcmVhdGlvbk5vdEFsbG93ZWRVbmRlclJlZm5hbWVQcmVmaXgoU3RyaW5nIHJlZm5hbWVQcmVmaXgpOworICBTdHJpbmcgYnJhbmNoQWxyZWFkeUV4aXN0cyhTdHJpbmcgYnJhbmNoTmFtZSk7CisgIFN0cmluZyBicmFuY2hDcmVhdGlvbkNvbmZsaWN0KFN0cmluZyBicmFuY2hOYW1lLCBTdHJpbmcgZXhpc3RpbmdCcmFuY2hOYW1lKTsKKworICBTdHJpbmcgcGx1Z2luRmFpbGVkKFN0cmluZyBzY3JpcHRQYXRoKTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdE1lc3NhZ2VzLnByb3BlcnRpZXMKaW5kZXggNzk3NzJiZC4uNDFjYWE0NCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdE1lc3NhZ2VzLnByb3BlcnRpZXMKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdE1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTMsNSArMywxNCBAQAogcG93ZXJlZEJ5ID0gUG93ZXJlZCBieSA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0LyIgdGFyZ2V0PSJfYmxhbmsiPkdlcnJpdCBDb2RlIFJldmlldzwvYT4gKHswfSkKIAogbm9TdWNoQWNjb3VudE1lc3NhZ2UgPSB7MH0gaXMgbm90IGEgcmVnaXN0ZXJlZCB1c2VyLgotCiBub1N1Y2hHcm91cE1lc3NhZ2UgPSBHcm91cCB7MH0gZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHZpc2libGUgdG8geW91LgorbmFtZUFscmVhZHlVc2VkQm9keSA9IFRoZSBuYW1lIHswfSBpcyBhbHJlYWR5IGluIHVzZS4KKworYnJhbmNoQ3JlYXRpb25GYWlsZWQgPSBDcmVhdGluZyBicmFuY2ggezB9IGZhaWxlZC4gRXJyb3I6IHsxfQoraW52YWxpZEJyYW5jaE5hbWUgPSBUaGUgYnJhbmNoIG5hbWUgezB9IGlzIG5vdCB2YWxpZC4KK2ludmFsaWRSZXZpc2lvbiA9IFRoZSByZXZpc2lvbiB7MH0gaXMgbm90IHZhbGlkLgorYnJhbmNoQ3JlYXRpb25Ob3RBbGxvd2VkVW5kZXJSZWZuYW1lUHJlZml4ID0gQnJhbmNoIGNyZWF0aW9uIGlzIG5vdCBhbGxvd2VkIHVuZGVyIHswfS4KK2JyYW5jaEFscmVhZHlFeGlzdHMgPSBBIGJyYW5jaCB3aXRoIHRoZSBuYW1lIHswfSBhbHJlYWR5IGV4aXN0cy4KK2JyYW5jaENyZWF0aW9uQ29uZmxpY3QgPSBDYW5ub3QgY3JlYXRlIGJyYW5jaCB7MH0gc2luY2UgaXQgY29uZmxpY3RzIHdpdGggYnJhbmNoIHsxfS4KKworcGx1Z2luRmFpbGVkID0gUGx1Z2luIEphdmFTY3JpcHQgezB9IGZhaWxlZCB0byBsb2FkCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0UmVzb3VyY2VzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvR2Vycml0UmVzb3VyY2VzLmphdmEKaW5kZXggZDc2M2ZmMS4uZmM3ZWE1MyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L0dlcnJpdFJlc291cmNlcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9HZXJyaXRSZXNvdXJjZXMuamF2YQpAQCAtMjgsNiArMjgsOSBAQAogICBAU291cmNlKCJhcnJvd1JpZ2h0LmdpZiIpCiAgIHB1YmxpYyBJbWFnZVJlc291cmNlIGFycm93UmlnaHQoKTsKIAorICBAU291cmNlKCJlZGl0VGV4dC5wbmciKQorICBwdWJsaWMgSW1hZ2VSZXNvdXJjZSBlZGl0KCk7CisKICAgQFNvdXJjZSgic3Rhck9wZW4uZ2lmIikKICAgcHVibGljIEltYWdlUmVzb3VyY2Ugc3Rhck9wZW4oKTsKIApAQCAtNDIsNCArNDUsMTAgQEAKIAogICBAU291cmNlKCJkb3dubG9hZEljb24ucG5nIikKICAgcHVibGljIEltYWdlUmVzb3VyY2UgZG93bmxvYWRJY29uKCk7CisKKyAgQFNvdXJjZSgicXVlcnlJY29uLnBuZyIpCisgIHB1YmxpYyBJbWFnZVJlc291cmNlIHF1ZXJ5SWNvbigpOworCisgIEBTb3VyY2UoImFkZEZpbGVDb21tZW50LnBuZyIpCisgIHB1YmxpYyBJbWFnZVJlc291cmNlIGFkZEZpbGVDb21tZW50KCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvU2VhcmNoUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hQYW5lbC5qYXZhCmluZGV4IDdlN2I5MjcuLjQ2YjdkNGQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hQYW5lbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hQYW5lbC5qYXZhCkBAIC00Miw4ICs0Miw2IEBACiAgICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2VhcmNoUGFuZWwoKSk7CiAKICAgICBzZWFyY2hCb3ggPSBuZXcgSGludFRleHRCb3goKTsKLSAgICBzZWFyY2hCb3guc2V0VmlzaWJsZUxlbmd0aCg3MCk7Ci0gICAgc2VhcmNoQm94LnNldEhpbnRUZXh0KEdlcnJpdC5DLnNlYXJjaEhpbnQoKSk7CiAgICAgZmluYWwgTXlTdWdnZXN0aW9uRGlzcGxheSBzdWdnZXN0aW9uRGlzcGxheSA9IG5ldyBNeVN1Z2dlc3Rpb25EaXNwbGF5KCk7CiAgICAgc2VhcmNoQm94LmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewogICAgICAgQE92ZXJyaWRlCkBAIC01OSw2ICs1Nyw4IEBACiAgICAgZmluYWwgU3VnZ2VzdEJveCBzdWdnZXN0Qm94ID0KICAgICAgICAgbmV3IFN1Z2dlc3RCb3gobmV3IFNlYXJjaFN1Z2dlc3RPcmFjbGUoKSwgc2VhcmNoQm94LCBzdWdnZXN0aW9uRGlzcGxheSk7CiAgICAgc2VhcmNoQm94LnNldFN0eWxlTmFtZSgiZ3d0LVRleHRCb3giKTsKKyAgICBzZWFyY2hCb3guc2V0VmlzaWJsZUxlbmd0aCg3MCk7CisgICAgc2VhcmNoQm94LnNldEhpbnRUZXh0KEdlcnJpdC5DLnNlYXJjaEhpbnQoKSk7CiAKICAgICBmaW5hbCBCdXR0b24gc2VhcmNoQnV0dG9uID0gbmV3IEJ1dHRvbihHZXJyaXQuQy5zZWFyY2hCdXR0b24oKSk7CiAgICAgc2VhcmNoQnV0dG9uLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NlYXJjaFN1Z2dlc3RPcmFjbGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TZWFyY2hTdWdnZXN0T3JhY2xlLmphdmEKaW5kZXggMTcyYTJhZi4uZGQ0ZGUzMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NlYXJjaFN1Z2dlc3RPcmFjbGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvU2VhcmNoU3VnZ2VzdE9yYWNsZS5qYXZhCkBAIC0xNCwxMyArMTQsNTQgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQWNjb3VudFN1Z2dlc3RPcmFjbGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TdWdnZXN0T3JhY2xlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LkhpZ2hsaWdodFN1Z2dlc3RPcmFjbGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCiBwdWJsaWMgY2xhc3MgU2VhcmNoU3VnZ2VzdE9yYWNsZSBleHRlbmRzIEhpZ2hsaWdodFN1Z2dlc3RPcmFjbGUgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFBhcmFtU3VnZ2VzdGVyPiBwYXJhbVN1Z2dlc3RlciA9IEFycmF5cy5hc0xpc3QoCisgICAgICBuZXcgUGFyYW1TdWdnZXN0ZXIoInByb2plY3Q6IiwgbmV3IFByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZSgpKSwKKyAgICAgIG5ldyBQYXJhbVN1Z2dlc3RlcihBcnJheXMuYXNMaXN0KCJvd25lcjoiLCAicmV2aWV3ZXI6IiksCisgICAgICAgICAgbmV3IEFjY291bnRTdWdnZXN0T3JhY2xlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlcXVlc3RTdWdnZXN0aW9ucyhmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIENhbGxiYWNrIGRvbmUpIHsKKyAgICAgICAgICAgICAgc3VwZXIub25SZXF1ZXN0U3VnZ2VzdGlvbnMocmVxdWVzdCwgbmV3IENhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VnZ2VzdGlvbnNSZWFkeShmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICBpZiAoInNlbGYiLnN0YXJ0c1dpdGgocmVxdWVzdC5nZXRRdWVyeSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3VnZ2VzdE9yYWNsZS5TdWdnZXN0aW9uPiByID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3VnZ2VzdE9yYWNsZS5TdWdnZXN0aW9uPihyZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTdWdnZXN0aW9ucygpLnNpemUoKSArIDEpOworICAgICAgICAgICAgICAgICAgICByLmFkZEFsbChyZXNwb25zZS5nZXRTdWdnZXN0aW9ucygpKTsKKyAgICAgICAgICAgICAgICAgICAgci5hZGQobmV3IFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic2VsZiI7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3VnZ2VzdGlvbnMocik7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBkb25lLm9uU3VnZ2VzdGlvbnNSZWFkeShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KSwKKyAgICAgIG5ldyBQYXJhbVN1Z2dlc3RlcihBcnJheXMuYXNMaXN0KCJvd25lcmluOiIsICJyZXZpZXdlcmluOiIpLAorICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBTdWdnZXN0T3JhY2xlKCkpKTsKKwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmVlU2V0PFN0cmluZz4gc3VnZ2VzdGlvbnMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7CiAKICAgc3RhdGljIHsKQEAgLTkzLDE3ICsxMzQsMTkgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uUmVxdWVzdFN1Z2dlc3Rpb25zKFJlcXVlc3QgcmVxdWVzdCwgQ2FsbGJhY2sgZG9uZSkgewogICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IHJlcXVlc3QuZ2V0UXVlcnkoKTsKLSAgICBpbnQgbGFzdFNwYWNlID0gcXVlcnkubGFzdEluZGV4T2YoJyAnKTsKLSAgICBmaW5hbCBTdHJpbmcgbGFzdFdvcmQ7Ci0gICAgLy8gTk9URTogdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBpZiB0aGUgcXVlcnkgaXMgZW1wdHkuCi0gICAgaWYgKGxhc3RTcGFjZSA9PSBxdWVyeS5sZW5ndGgoKSAtIDEpIHsKKworICAgIGZpbmFsIFN0cmluZyBsYXN0V29yZCA9IGdldExhc3RXb3JkKHF1ZXJ5KTsKKyAgICBpZiAobGFzdFdvcmQgPT0gbnVsbCkgewogICAgICAgLy8gU3RhcnRpbmcgYSBuZXcgd29yZCAtIGRvbid0IHNob3cgc3VnZ2VzdGlvbnMgeWV0LgogICAgICAgZG9uZS5vblN1Z2dlc3Rpb25zUmVhZHkocmVxdWVzdCwgbnVsbCk7CiAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChsYXN0U3BhY2UgPT0gLTEpIHsKLSAgICAgIGxhc3RXb3JkID0gcXVlcnk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxhc3RXb3JkID0gcXVlcnkuc3Vic3RyaW5nKGxhc3RTcGFjZSArIDEpOworICAgIH0KKworICAgIGZvciAoZmluYWwgUGFyYW1TdWdnZXN0ZXIgcHMgOiBwYXJhbVN1Z2dlc3RlcikgeworICAgICAgaWYgKHBzLmFwcGxpY2FibGUobGFzdFdvcmQpKSB7CisgICAgICAgIHBzLnN1Z2dlc3QobGFzdFdvcmQsIHJlcXVlc3QsIGRvbmUpOworICAgICAgICByZXR1cm47CisgICAgICB9CiAgICAgfQogCiAgICAgZmluYWwgQXJyYXlMaXN0PFNlYXJjaFN1Z2dlc3Rpb24+IHIgPSBuZXcgQXJyYXlMaXN0PFNlYXJjaFN1Z2dlc3RPcmFjbGUuU2VhcmNoU3VnZ2VzdGlvbj4oKTsKQEAgLTExOCw2ICsxNjEsMjcgQEAKICAgICBkb25lLm9uU3VnZ2VzdGlvbnNSZWFkeShyZXF1ZXN0LCBuZXcgUmVzcG9uc2UocikpOwogICB9CiAKKyAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFzdFdvcmQoZmluYWwgU3RyaW5nIHF1ZXJ5KSB7CisgICAgZmluYWwgaW50IGxhc3RTcGFjZSA9IHF1ZXJ5Lmxhc3RJbmRleE9mKCcgJyk7CisgICAgaWYgKGxhc3RTcGFjZSA9PSBxdWVyeS5sZW5ndGgoKSAtIDEpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBpZiAobGFzdFNwYWNlID09IC0xKSB7CisgICAgICByZXR1cm4gcXVlcnk7CisgICAgfQorICAgIHJldHVybiBxdWVyeS5zdWJzdHJpbmcobGFzdFNwYWNlICsgMSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdWVyeVBhdHRlcm4oZmluYWwgU3RyaW5nIHF1ZXJ5KSB7CisgICAgcmV0dXJuIHN1cGVyLmdldFF1ZXJ5UGF0dGVybihnZXRMYXN0V29yZChxdWVyeSkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBib29sZWFuIGlzSFRNTCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlYXJjaFN1Z2dlc3Rpb24gaW1wbGVtZW50cyBTdWdnZXN0T3JhY2xlLlN1Z2dlc3Rpb24gewogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN1Z2dlc3Rpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbFF1ZXJ5OwpAQCAtMTM3LDQgKzIwMSw2NSBAQAogICAgICAgcmV0dXJuIGZ1bGxRdWVyeTsKICAgICB9CiAgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXJhbVN1Z2dlc3RlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gb3BlcmF0b3JzOworICAgIHByaXZhdGUgZmluYWwgU3VnZ2VzdE9yYWNsZSBwYXJhbWV0ZXJTdWdnZXN0aW9uT3JhY2xlOworCisgICAgUGFyYW1TdWdnZXN0ZXIoZmluYWwgU3RyaW5nIG9wZXJhdG9yLAorICAgICAgICBmaW5hbCBTdWdnZXN0T3JhY2xlIHBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUpIHsKKyAgICAgIHRoaXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvcGVyYXRvciksIHBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUpOworICAgIH0KKworICAgIFBhcmFtU3VnZ2VzdGVyKGZpbmFsIExpc3Q8U3RyaW5nPiBvcGVyYXRvcnMsCisgICAgICAgIGZpbmFsIFN1Z2dlc3RPcmFjbGUgcGFyYW1ldGVyU3VnZ2VzdGlvbk9yYWNsZSkgeworICAgICAgdGhpcy5vcGVyYXRvcnMgPSBvcGVyYXRvcnM7CisgICAgICB0aGlzLnBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUgPSBwYXJhbWV0ZXJTdWdnZXN0aW9uT3JhY2xlOworICAgIH0KKworICAgIGJvb2xlYW4gYXBwbGljYWJsZShmaW5hbCBTdHJpbmcgcXVlcnkpIHsKKyAgICAgIGZpbmFsIFN0cmluZyBvcGVyYXRvciA9IGdldEFwcGxpY2FibGVPcGVyYXRvcihxdWVyeSwgb3BlcmF0b3JzKTsKKyAgICAgIHJldHVybiBvcGVyYXRvciAhPSBudWxsICYmIHF1ZXJ5Lmxlbmd0aCgpID4gb3BlcmF0b3IubGVuZ3RoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwbGljYWJsZU9wZXJhdG9yKGZpbmFsIFN0cmluZyBsYXN0V29yZCwKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG9wZXJhdG9ycykgeworICAgICAgZm9yIChmaW5hbCBTdHJpbmcgb3BlcmF0b3IgOiBvcGVyYXRvcnMpIHsKKyAgICAgICAgaWYgKGxhc3RXb3JkLnN0YXJ0c1dpdGgob3BlcmF0b3IpKSB7CisgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB2b2lkIHN1Z2dlc3QoZmluYWwgU3RyaW5nIGxhc3RXb3JkLCBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIENhbGxiYWNrIGRvbmUpIHsKKyAgICAgIGZpbmFsIFN0cmluZyBvcGVyYXRvciA9IGdldEFwcGxpY2FibGVPcGVyYXRvcihsYXN0V29yZCwgb3BlcmF0b3JzKTsKKyAgICAgIHBhcmFtZXRlclN1Z2dlc3Rpb25PcmFjbGUucmVxdWVzdFN1Z2dlc3Rpb25zKAorICAgICAgICAgIG5ldyBSZXF1ZXN0KGxhc3RXb3JkLnN1YnN0cmluZyhvcGVyYXRvci5sZW5ndGgoKSksIHJlcXVlc3QuZ2V0TGltaXQoKSksCisgICAgICAgICAgbmV3IENhbGxiYWNrKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Z2dlc3Rpb25zUmVhZHkoZmluYWwgUmVxdWVzdCByZXEsCisgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5ID0gcmVxdWVzdC5nZXRRdWVyeSgpOworICAgICAgICAgICAgICBmaW5hbCBMaXN0PFNlYXJjaFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbj4gciA9CisgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbj4ocmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3VnZ2VzdGlvbnMoKS5zaXplKCkpOworICAgICAgICAgICAgICBmb3IgKGZpbmFsIFNlYXJjaFN1Z2dlc3RPcmFjbGUuU3VnZ2VzdGlvbiBzIDogcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgIC5nZXRTdWdnZXN0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgci5hZGQobmV3IFNlYXJjaFN1Z2dlc3Rpb24ocy5nZXREaXNwbGF5U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnN1YnN0cmluZygwLCBxdWVyeS5sZW5ndGgoKSAtIGxhc3RXb3JkLmxlbmd0aCgpKSArCisgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yICsgcXVvdGVJZk5lZWRlZChzLmdldFJlcGxhY2VtZW50U3RyaW5nKCkpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZG9uZS5vblN1Z2dlc3Rpb25zUmVhZHkocmVxdWVzdCwgbmV3IFJlc3BvbnNlKHIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXVvdGVJZk5lZWRlZChmaW5hbCBTdHJpbmcgcykgeworICAgICAgICAgICAgICBpZiAoIXMubWF0Y2hlcygiXlxcUyokIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlwiIiArIHMgKyAiXCIiOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NpZ25JbkRpYWxvZy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1NpZ25JbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmZkYjg1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9TaWduSW5EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5TaWduSW5Nb2RlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5HbG9iYWxLZXk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS51c2VyLmNsaWVudC5BdXRvQ2VudGVyRGlhbG9nQm94OwotCi0vKiogUHJvbXB0cyB0aGUgdXNlciB0byBzaWduIGluIHRvIHRoZWlyIGFjY291bnQuICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2lnbkluRGlhbG9nIGV4dGVuZHMgQXV0b0NlbnRlckRpYWxvZ0JveCB7Ci0gIHByb3RlY3RlZCBmaW5hbCBTaWduSW5Nb2RlIG1vZGU7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdG9rZW47Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBkaWFsb2cgdG8gaGFuZGxlIHVzZXIgc2lnbiBpbi4KLSAgICoKLSAgICogQHBhcmFtIHNpZ25Jbk1vZGUgdHlwZSBvZiBtb2RlIHRoZSBsb2dpbiB3aWxsIHBlcmZvcm0uCi0gICAqIEBwYXJhbSB0b2tlbiB0aGUgdG9rZW4gdG8ganVtcCB0byBhZnRlciBzaWduLWluIGlzIGNvbXBsZXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIFNpZ25JbkRpYWxvZyhmaW5hbCBTaWduSW5Nb2RlIHNpZ25Jbk1vZGUsIGZpbmFsIFN0cmluZyB0b2tlbikgewotICAgIHN1cGVyKC8qIGF1dG8gaGlkZSAqL3RydWUsIC8qIG1vZGFsICovdHJ1ZSk7Ci0gICAgc2V0R2xhc3NFbmFibGVkKHRydWUpOwotCi0gICAgdGhpcy5tb2RlID0gc2lnbkluTW9kZTsKLSAgICB0aGlzLnRva2VuID0gdG9rZW47Ci0KLSAgICBzd2l0Y2ggKHNpZ25Jbk1vZGUpIHsKLSAgICAgIGNhc2UgTElOS19JREVOVElZOgotICAgICAgICBzZXRUZXh0KEdlcnJpdC5DLmxpbmtJZGVudGl0eURpYWxvZ1RpdGxlKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUkVHSVNURVI6Ci0gICAgICAgIHNldFRleHQoR2Vycml0LkMucmVnaXN0ZXJEaWFsb2dUaXRsZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBzZXRUZXh0KEdlcnJpdC5DLnNpZ25JbkRpYWxvZ1RpdGxlKCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICBzdXBlci5zaG93KCk7Ci0gICAgR2xvYmFsS2V5LmRpYWxvZyh0aGlzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1ZvaWRSZXN1bHQuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Wb2lkUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdiY2QwYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9Wb2lkUmVzdWx0LmphdmEKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKK3B1YmxpYyBmaW5hbCBjbGFzcyBWb2lkUmVzdWx0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgIHByb3RlY3RlZCBWb2lkUmVzdWx0KCkgeworICB9CisKKyAgcHVibGljIHN0YXRpYyBWb2lkUmVzdWx0IGNyZWF0ZSgpIHsKKyAgICByZXR1cm4gY3JlYXRlT2JqZWN0KCkuY2FzdCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q2FwYWJpbGl0aWVzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q2FwYWJpbGl0aWVzLmphdmEKaW5kZXggMDU2NWQzZS4uNDIzOTllZSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENhcGFiaWxpdGllcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRDYXBhYmlsaXRpZXMuamF2YQpAQCAtMTYsMTYgKzE2LDE0IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiAKIC8qKiBDYXBhYmlsaXRpZXMgdGhlIGNhbGxlciBoYXMgZnJvbSB7QGNvZGUgL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzfS4gICovCiBwdWJsaWMgY2xhc3MgQWNjb3VudENhcGFiaWxpdGllcyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgewogICBwdWJsaWMgc3RhdGljIHZvaWQgYWxsKEFzeW5jQ2FsbGJhY2s8QWNjb3VudENhcGFiaWxpdGllcz4gY2IsIFN0cmluZy4uLiBmaWx0ZXIpIHsKLSAgICBSZXN0QXBpIGFwaSA9IG5ldyBSZXN0QXBpKCIvYWNjb3VudHMvc2VsZi9jYXBhYmlsaXRpZXMiKTsKLSAgICBmb3IgKFN0cmluZyBuYW1lIDogZmlsdGVyKSB7Ci0gICAgICBhcGkuYWRkUGFyYW1ldGVyKCJxIiwgbmFtZSk7Ci0gICAgfQotICAgIGFwaS5zZW5kKGNiKTsKKyAgICBuZXcgUmVzdEFwaSgiL2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzIikKKyAgICAgIC5hZGRQYXJhbWV0ZXIoInEiLCBmaWx0ZXIpCisgICAgICAuZ2V0KGNiKTsKICAgfQogCiAgIHByb3RlY3RlZCBBY2NvdW50Q2FwYWJpbGl0aWVzKCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENvbnN0YW50cy5qYXZhCmluZGV4IGQzNzRkMzUuLmZhMmM1ZmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRDb25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q29uc3RhbnRzLmphdmEKQEAgLTY5LDYgKzY5LDcgQEAKICAgU3RyaW5nIHNzaEtleVN0YXR1cygpOwogCiAgIFN0cmluZyBhZGRTc2hLZXlQYW5lbEhlYWRlcigpOworICBTdHJpbmcgYWRkU3NoS2V5SGVscFRpdGxlKCk7CiAgIFN0cmluZyBhZGRTc2hLZXlIZWxwKCk7CiAgIFN0cmluZyBzc2hKYXZhQXBwbGV0Tm90QXZhaWxhYmxlKCk7CiAgIFN0cmluZyBpbnZhbGlkU3NoS2V5RXJyb3IoKTsKQEAgLTk1LDggKzk2LDEwIEBACiAgIFN0cmluZyB3YXRjaGVkUHJvamVjdEZpbHRlcigpOwogICBTdHJpbmcgd2F0Y2hlZFByb2plY3RDb2x1bW5FbWFpbE5vdGlmaWNhdGlvbnMoKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0Q29sdW1uTmV3Q2hhbmdlcygpOworICBTdHJpbmcgd2F0Y2hlZFByb2plY3RDb2x1bW5OZXdQYXRjaFNldHMoKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0Q29sdW1uQWxsQ29tbWVudHMoKTsKICAgU3RyaW5nIHdhdGNoZWRQcm9qZWN0Q29sdW1uU3VibWl0dGVkQ2hhbmdlcygpOworICBTdHJpbmcgd2F0Y2hlZFByb2plY3RDb2x1bW5BYmFuZG9uZWRDaGFuZ2VzKCk7CiAKICAgU3RyaW5nIGNvbnRhY3RGaWVsZEZ1bGxOYW1lKCk7CiAgIFN0cmluZyBjb250YWN0RmllbGRFbWFpbCgpOwpAQCAtMTEwLDYgKzExMyw3IEBACiAgIFN0cmluZyBidXR0b25DYW5jZWwoKTsKICAgU3RyaW5nIHRpdGxlUmVnaXN0ZXJOZXdFbWFpbCgpOwogICBTdHJpbmcgZGVzY1JlZ2lzdGVyTmV3RW1haWwoKTsKKyAgU3RyaW5nIGVycm9yRGlhbG9nVGl0bGVSZWdpc3Rlck5ld0VtYWlsKCk7CiAKICAgU3RyaW5nIG5ld0FncmVlbWVudCgpOwogICBTdHJpbmcgYWdyZWVtZW50U3RhdHVzKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50Q29uc3RhbnRzLnByb3BlcnRpZXMKaW5kZXggOGIzMjE3NC4uZmQ1NDM2MyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQWNjb3VudENvbnN0YW50cy5wcm9wZXJ0aWVzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRDb25zdGFudHMucHJvcGVydGllcwpAQCAtNjAsNyArNjAsMjcgQEAKIGJ1dHRvbkxpbmtJZGVudGl0eSA9IExpbmsgQW5vdGhlciBJZGVudGl0eQogCiBhZGRTc2hLZXlQYW5lbEhlYWRlciA9IEFkZCBTU0ggUHVibGljIEtleQotYWRkU3NoS2V5SGVscCA9ICg8YSBocmVmPSJodHRwOi8vaGVscC5naXRodWIuY29tL2tleS1zZXR1cC1yZWRpcmVjdCIgdGFyZ2V0PSJfYmxhbmsiPkdpdEh1YidzIEd1aWRlIHRvIFNTSCBLZXlzPC9hPikKK2FkZFNzaEtleUhlbHBUaXRsZSA9IEhvdyB0byBHZW5lcmF0ZSBhbiBTU0ggS2V5CithZGRTc2hLZXlIZWxwID0gXAorICA8b2w+XAorICAgIDxsaT5cCisgICAgICBGcm9tIHRoZSBUZXJtaW5hbCBvciBHaXQgQmFzaCwgcnVuIDxlbT5zc2gta2V5Z2VuPC9lbT5cCisgICAgPC9saT5cCisgICAgPGxpPlwKKyAgICAgIENvbmZpcm0gdGhlIGRlZmF1bHQgcGF0aCA8ZW0+LnNzaC9pZF9yc2E8L2VtPlwKKyAgICA8L2xpPlwKKyAgICA8bGk+XAorICAgICAgRW50ZXIgYSBwYXNzcGhyYXNlIChyZWNvbW1lbmRlZCkgb3IgbGVhdmUgaXQgYmxhbmsuPGJyPlwKKyAgICAgIFJlbWVtYmVyIHRoaXMgcGFzc3BocmFzZSwgYXMgeW91IHdpbGwgbmVlZCBpdCB0byB1bmxvY2sgdGhlPGJyPlwKKyAgICAgIGtleSB3aGVuZXZlciB5b3UgdXNlIGl0LlwKKyAgICA8L2xpPlwKKyAgICA8bGk+XAorICAgICAgT3BlbiA8ZW0+fi8uc3NoL2lkX3JzYS5wdWI8L2VtPiBhbmQgY29weSAmIHBhc3RlIHRoZSBjb250ZW50cyBpbnRvPGJyPlwKKyAgICAgIHRoZSBib3ggYmVsb3csIHRoZW4gY2xpY2sgb24gIkFkZCIuPGJyPlwKKyAgICAgIE5vdGUgdGhhdCA8ZW0+aWRfcnNhLnB1YjwvZW0+IGlzIHlvdXIgcHVibGljIGtleSBhbmQgY2FuIGJlIHNoYXJlZCw8YnI+XAorICAgICAgd2hpbGUgPGVtPmlkX3JzYTwvZW0+IGlzIHlvdXIgcHJpdmF0ZSBrZXkgYW5kIHNob3VsZCBiZSBrZXB0IHNlY3JldC5cCisgICAgPC9saT5cCisgIDxcb2w+CiBpbnZhbGlkU3NoS2V5RXJyb3IgPSBJbnZhbGlkIFNTSCBLZXkKIHNzaEphdmFBcHBsZXROb3RBdmFpbGFibGUgPSBPcGVuIEtleSBVbmF2YWlsYWJsZTogSmF2YSBub3QgZW5hYmxlZAogCkBAIC03NSw4ICs5NSwxMCBAQAogd2F0Y2hlZFByb2plY3RGaWx0ZXIgPSBPbmx5IElmCiB3YXRjaGVkUHJvamVjdENvbHVtbkVtYWlsTm90aWZpY2F0aW9ucyA9IEVtYWlsIE5vdGlmaWNhdGlvbnMKIHdhdGNoZWRQcm9qZWN0Q29sdW1uTmV3Q2hhbmdlcyA9IE5ldyBDaGFuZ2VzCit3YXRjaGVkUHJvamVjdENvbHVtbk5ld1BhdGNoU2V0cyA9IE5ldyBQYXRjaCBTZXRzCiB3YXRjaGVkUHJvamVjdENvbHVtbkFsbENvbW1lbnRzID0gQWxsIENvbW1lbnRzCiB3YXRjaGVkUHJvamVjdENvbHVtblN1Ym1pdHRlZENoYW5nZXMgPSBTdWJtaXR0ZWQgQ2hhbmdlcword2F0Y2hlZFByb2plY3RDb2x1bW5BYmFuZG9uZWRDaGFuZ2VzID0gQWJhbmRvbmVkIENoYW5nZXMKIAogY29udGFjdEZpZWxkRnVsbE5hbWUgPSBGdWxsIE5hbWUKIGNvbnRhY3RGaWVsZEVtYWlsID0gUHJlZmVycmVkIEVtYWlsCkBAIC05OSw2ICsxMjEsNyBAQAogZGVzY1JlZ2lzdGVyTmV3RW1haWwgPSBcCiAgIDxwPkEgY29uZmlybWF0aW9uIGxpbmsgd2lsbCBiZSBzZW50IGJ5IGVtYWlsIHRvIHRoaXMgYWRkcmVzcy48L3A+XAogICA8cD5Zb3UgbXVzdCBjbGljayBvbiB0aGUgbGluayB0byBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIGFuZCBtYWtlIHRoZSBhZGRyZXNzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uLjwvcD4KK2Vycm9yRGlhbG9nVGl0bGVSZWdpc3Rlck5ld0VtYWlsID0gRW1haWwgUmVnaXN0cmF0aW9uIEZhaWxlZAogCiAKIG5ld0FncmVlbWVudCA9IE5ldyBDb250cmlidXRvciBBZ3JlZW1lbnQKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0FjY291bnRJbmZvLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWQ4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9BY2NvdW50SW5mby5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50SW5mbyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICBwdWJsaWMgZmluYWwgbmF0aXZlIGludCBfYWNjb3VudF9pZCgpIC8qLXsgcmV0dXJuIHRoaXMuX2FjY291bnRfaWQgfHwgMDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgbmFtZSgpIC8qLXsgcmV0dXJuIHRoaXMubmFtZTsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgZW1haWwoKSAvKi17IHJldHVybiB0aGlzLmVtYWlsOyB9LSovOworCisgIHB1YmxpYyBzdGF0aWMgbmF0aXZlIEFjY291bnRJbmZvIGNyZWF0ZShpbnQgaWQsIFN0cmluZyBuYW1lLAorICAgICAgU3RyaW5nIGVtYWlsKSAvKi17CisgICAgcmV0dXJuIHsnX2FjY291bnRfaWQnOiBpZCwgJ25hbWUnOiBuYW1lLCAnZW1haWwnOiBlbWFpbH07CisgIH0tKi87CisKKyAgcHJvdGVjdGVkIEFjY291bnRJbmZvKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Db250YWN0UGFuZWxTaG9ydC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvQ29udGFjdFBhbmVsU2hvcnQuamF2YQppbmRleCA0ZmJlN2EwLi5mMzViZDRiIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Db250YWN0UGFuZWxTaG9ydC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L0NvbnRhY3RQYW5lbFNob3J0LmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5PbkVkaXRFbmFibGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudC5GaWVsZE5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRFeHRlcm5hbElkOwpAQCAtMzAwLDcgKzMwMSwxNSBAQAogICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CiAgICAgICAgICAgICBpbkVtYWlsLnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICByZWdpc3Rlci5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICBpZiAoY2F1Z2h0LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKEVtYWlsRXhjZXB0aW9uLk1FU1NBR0UpKSB7CisgICAgICAgICAgICAgIGZpbmFsIEVycm9yRGlhbG9nIGQgPQorICAgICAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKGNhdWdodC5nZXRNZXNzYWdlKCkuc3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgIEVtYWlsRXhjZXB0aW9uLk1FU1NBR0UubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgZC5zZXRUZXh0KFV0aWwuQy5lcnJvckRpYWxvZ1RpdGxlUmVnaXN0ZXJOZXdFbWFpbCgpKTsKKyAgICAgICAgICAgICAgZC5jZW50ZXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgICB9CkBAIC0zMzksNyArMzQ4LDcgQEAKIAogICB2b2lkIGRvU2F2ZShmaW5hbCBBc3luY0NhbGxiYWNrPEFjY291bnQ+IG9uU2F2ZSkgewogICAgIFN0cmluZyBuZXdOYW1lID0gY2FuRWRpdEZ1bGxOYW1lKCkgPyBuYW1lVHh0LmdldFRleHQoKSA6IG51bGw7Ci0gICAgaWYgKCIiLmVxdWFscyhuZXdOYW1lKSkgeworICAgIGlmIChuZXdOYW1lICE9IG51bGwgJiYgbmV3TmFtZS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICBuZXdOYW1lID0gbnVsbDsKICAgICB9CiAKQEAgLTM4Myw2ICszOTIsNyBAQAogICAgIG1lLnNldEZ1bGxOYW1lKHJlc3VsdC5nZXRGdWxsTmFtZSgpKTsKICAgICBtZS5zZXRQcmVmZXJyZWRFbWFpbChyZXN1bHQuZ2V0UHJlZmVycmVkRW1haWwoKSk7CiAgICAgR2Vycml0LnJlZnJlc2hNZW51QmFyKCk7CisgICAgZGlzcGxheShtZSk7CiAgIH0KIAogICBDb250YWN0SW5mb3JtYXRpb24gdG9Db250YWN0SW5mb3JtYXRpb24oKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUdyb3Vwc1NjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlHcm91cHNTY3JlZW4uamF2YQppbmRleCA2Y2I3NDlkLi5mODNlOWVjIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUdyb3Vwc1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015R3JvdXBzU2NyZWVuLmphdmEKQEAgLTE1LDEwICsxNSw4IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50OwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLkdyb3VwVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cExpc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgTXlHcm91cHNTY3JlZW4gZXh0ZW5kcyBTZXR0aW5nc1NjcmVlbiB7CiAgIHByaXZhdGUgR3JvdXBUYWJsZSBncm91cHM7CkBAIC0yNiwxOCArMjQsMTggQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgewogICAgIHN1cGVyLm9uSW5pdFVJKCk7Ci0gICAgZ3JvdXBzID0gbmV3IEdyb3VwVGFibGUodHJ1ZSAvKiBoeXBlcmxpbmsgdG8gYWRtaW4gKi8pOworICAgIGdyb3VwcyA9IG5ldyBHcm91cFRhYmxlKCk7CiAgICAgYWRkKGdyb3Vwcyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgewogICAgIHN1cGVyLm9uTG9hZCgpOwotICAgIFV0aWwuQUNDT1VOVF9TRUMubXlHcm91cHMobmV3IFNjcmVlbkxvYWRDYWxsYmFjazxMaXN0PEFjY291bnRHcm91cD4+KHRoaXMpIHsKKyAgICBHcm91cExpc3QubXkobmV3IFNjcmVlbkxvYWRDYWxsYmFjazxHcm91cExpc3Q+KHRoaXMpIHsKICAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgcHJlRGlzcGxheShmaW5hbCBMaXN0PEFjY291bnRHcm91cD4gcmVzdWx0KSB7CisgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KEdyb3VwTGlzdCByZXN1bHQpIHsKICAgICAgICAgZ3JvdXBzLmRpc3BsYXkocmVzdWx0KTsKLSAgICAgIH0KLSAgICB9KTsKKyAgICAgICAgZ3JvdXBzLmZpbmlzaERpc3BsYXkoKTsKKyAgICAgIH19KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlJZGVudGl0aWVzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUlkZW50aXRpZXNTY3JlZW4uamF2YQppbmRleCA4OTlhYTAzLi5jYTg3MmNjIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUlkZW50aXRpZXNTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeUlkZW50aXRpZXNTY3JlZW4uamF2YQpAQCAtMTUsMTkgKzE1LDE5IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50OwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC5vcGVuaWQuT3BlbklkU2lnbkluRGlhbG9nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZC5PcGVuSWRVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZhbmN5RmxleFRhYmxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLk9wZW5JZFVybHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRFeHRlcm5hbElkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3cuTG9jYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNoZWNrQm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsZXhUYWJsZS5GbGV4Q2VsbEZvcm1hdHRlcjsKQEAgLTU5LDE5ICs1OSwxNSBAQAogICAgIH0pOwogICAgIGFkZChkZWxldGVJZGVudGl0eSk7CiAKLSAgICBzd2l0Y2ggKEdlcnJpdC5nZXRDb25maWcoKS5nZXRBdXRoVHlwZSgpKSB7Ci0gICAgICBjYXNlIE9QRU5JRDogewotICAgICAgICBmaW5hbCBCdXR0b24gbGlua0lkZW50aXR5ID0gbmV3IEJ1dHRvbihVdGlsLkMuYnV0dG9uTGlua0lkZW50aXR5KCkpOwotICAgICAgICBsaW5rSWRlbnRpdHkuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgdG8gPSBIaXN0b3J5LmdldFRva2VuKCk7Ci0gICAgICAgICAgICBuZXcgT3BlbklkU2lnbkluRGlhbG9nKFNpZ25Jbk1vZGUuTElOS19JREVOVElZLCB0bywgbnVsbCkuY2VudGVyKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgYWRkKGxpbmtJZGVudGl0eSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgIGlmIChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0QXV0aFR5cGUoKSA9PSBBdXRoVHlwZS5PUEVOSUQpIHsKKyAgICAgIEJ1dHRvbiBsaW5rSWRlbnRpdHkgPSBuZXcgQnV0dG9uKFV0aWwuQy5idXR0b25MaW5rSWRlbnRpdHkoKSk7CisgICAgICBsaW5rSWRlbnRpdHkuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICBMb2NhdGlvbi5hc3NpZ24oR2Vycml0LmxvZ2luUmVkaXJlY3QoSGlzdG9yeS5nZXRUb2tlbigpKSArICI/bGluayIpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGFkZChsaW5rSWRlbnRpdHkpOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVByZWZlcmVuY2VzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVByZWZlcmVuY2VzU2NyZWVuLmphdmEKaW5kZXggZGU2ZTY2Ni4uYzE3YTBhYSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlQcmVmZXJlbmNlc1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015UHJlZmVyZW5jZXNTY3JlZW4uamF2YQpAQCAtMjAsMTAgKzIwLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk9uRWRpdEVuYWJsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50LkRhdGVUaW1lRm9ybWF0OwpAQCAtNTIsMzkgKzUxLDE1IEBACiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgewogICAgIHN1cGVyLm9uSW5pdFVJKCk7CiAKLSAgICBmaW5hbCBDbGlja0hhbmRsZXIgb25DbGlja1NhdmUgPSBuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc2F2ZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgIH07Ci0gICAgZmluYWwgQ2hhbmdlSGFuZGxlciBvbkNoYW5nZVNhdmUgPSBuZXcgQ2hhbmdlSGFuZGxlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2UoZmluYWwgQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc2F2ZS5zZXRFbmFibGVkKHRydWUpOwotICAgICAgfQotICAgIH07Ci0KICAgICBzaG93U2l0ZUhlYWRlciA9IG5ldyBDaGVja0JveChVdGlsLkMuc2hvd1NpdGVIZWFkZXIoKSk7Ci0gICAgc2hvd1NpdGVIZWFkZXIuYWRkQ2xpY2tIYW5kbGVyKG9uQ2xpY2tTYXZlKTsKLQogICAgIHVzZUZsYXNoQ2xpcGJvYXJkID0gbmV3IENoZWNrQm94KFV0aWwuQy51c2VGbGFzaENsaXBib2FyZCgpKTsKLSAgICB1c2VGbGFzaENsaXBib2FyZC5hZGRDbGlja0hhbmRsZXIob25DbGlja1NhdmUpOwotCiAgICAgY29weVNlbGZPbkVtYWlscyA9IG5ldyBDaGVja0JveChVdGlsLkMuY29weVNlbGZPbkVtYWlscygpKTsKLSAgICBjb3B5U2VsZk9uRW1haWxzLmFkZENsaWNrSGFuZGxlcihvbkNsaWNrU2F2ZSk7Ci0KICAgICByZXZlcnNlUGF0Y2hTZXRPcmRlciA9IG5ldyBDaGVja0JveChVdGlsLkMucmV2ZXJzZVBhdGNoU2V0T3JkZXIoKSk7Ci0gICAgcmV2ZXJzZVBhdGNoU2V0T3JkZXIuYWRkQ2xpY2tIYW5kbGVyKG9uQ2xpY2tTYXZlKTsKLQogICAgIHNob3dVc2VybmFtZUluUmV2aWV3Q2F0ZWdvcnkgPSBuZXcgQ2hlY2tCb3goVXRpbC5DLnNob3dVc2VybmFtZUluUmV2aWV3Q2F0ZWdvcnkoKSk7Ci0gICAgc2hvd1VzZXJuYW1lSW5SZXZpZXdDYXRlZ29yeS5hZGRDbGlja0hhbmRsZXIob25DbGlja1NhdmUpOwotCiAgICAgbWF4aW11bVBhZ2VTaXplID0gbmV3IExpc3RCb3goKTsKICAgICBmb3IgKGZpbmFsIHNob3J0IHYgOiBQQUdFU0laRV9DSE9JQ0VTKSB7CiAgICAgICBtYXhpbXVtUGFnZVNpemUuYWRkSXRlbShVdGlsLk0ucm93c1BlclBhZ2UodiksIFN0cmluZy52YWx1ZU9mKHYpKTsKICAgICB9Ci0gICAgbWF4aW11bVBhZ2VTaXplLmFkZENoYW5nZUhhbmRsZXIob25DaGFuZ2VTYXZlKTsKIAogICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsKICAgICBkYXRlRm9ybWF0ID0gbmV3IExpc3RCb3goKTsKQEAgLTk2LDcgKzcxLDYgQEAKICAgICAgIHIuYXBwZW5kKERhdGVUaW1lRm9ybWF0LmdldEZvcm1hdChmbXQuZ2V0TG9uZ0Zvcm1hdCgpKS5mb3JtYXQobm93KSk7CiAgICAgICBkYXRlRm9ybWF0LmFkZEl0ZW0oci50b1N0cmluZygpLCBmbXQubmFtZSgpKTsKICAgICB9Ci0gICAgZGF0ZUZvcm1hdC5hZGRDaGFuZ2VIYW5kbGVyKG9uQ2hhbmdlU2F2ZSk7CiAKICAgICB0aW1lRm9ybWF0ID0gbmV3IExpc3RCb3goKTsKICAgICBmb3IgKEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuVGltZUZvcm1hdCBmbXQgOiBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLlRpbWVGb3JtYXQKQEAgLTEwNSw3ICs3OSw2IEBACiAgICAgICByLmFwcGVuZChEYXRlVGltZUZvcm1hdC5nZXRGb3JtYXQoZm10LmdldEZvcm1hdCgpKS5mb3JtYXQobm93KSk7CiAgICAgICB0aW1lRm9ybWF0LmFkZEl0ZW0oci50b1N0cmluZygpLCBmbXQubmFtZSgpKTsKICAgICB9Ci0gICAgdGltZUZvcm1hdC5hZGRDaGFuZ2VIYW5kbGVyKG9uQ2hhbmdlU2F2ZSk7CiAKICAgICBGbG93UGFuZWwgZGF0ZVRpbWVQYW5lbCA9IG5ldyBGbG93UGFuZWwoKTsKIApAQCAtMTYzLDYgKzEzNiwxNiBAQAogICAgICAgfQogICAgIH0pOwogICAgIGFkZChzYXZlKTsKKworICAgIGZpbmFsIE9uRWRpdEVuYWJsZXIgZSA9IG5ldyBPbkVkaXRFbmFibGVyKHNhdmUpOworICAgIGUubGlzdGVuVG8oc2hvd1NpdGVIZWFkZXIpOworICAgIGUubGlzdGVuVG8odXNlRmxhc2hDbGlwYm9hcmQpOworICAgIGUubGlzdGVuVG8oY29weVNlbGZPbkVtYWlscyk7CisgICAgZS5saXN0ZW5UbyhyZXZlcnNlUGF0Y2hTZXRPcmRlcik7CisgICAgZS5saXN0ZW5UbyhzaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5KTsKKyAgICBlLmxpc3RlblRvKG1heGltdW1QYWdlU2l6ZSk7CisgICAgZS5saXN0ZW5UbyhkYXRlRm9ybWF0KTsKKyAgICBlLmxpc3RlblRvKHRpbWVGb3JtYXQpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZWRQcm9qZWN0c1NjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlXYXRjaGVkUHJvamVjdHNTY3JlZW4uamF2YQppbmRleCBkMzgwMTVjLi5hNTI4OTEyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZWRQcm9qZWN0c1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015V2F0Y2hlZFByb2plY3RzU2NyZWVuLmphdmEKQEAgLTMzLDYgKzMzLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Ib3Jpem9udGFsUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TdWdnZXN0Qm94LkRlZmF1bHRTdWdnZXN0aW9uRGlzcGxheTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TdWdnZXN0T3JhY2xlLlN1Z2dlc3Rpb247CkBAIC02MCw3ICs2MSwxMCBAQAogICAgIGdyaWQgPSBuZXcgR3JpZCgyLCAyKTsKICAgICBncmlkLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmluZm9CbG9jaygpKTsKICAgICBncmlkLnNldFRleHQoMCwgMCwgVXRpbC5DLndhdGNoZWRQcm9qZWN0TmFtZSgpKTsKLSAgICBncmlkLnNldFdpZGdldCgwLCAxLCBuYW1lVHh0KTsKKyAgICBmaW5hbCBIb3Jpem9udGFsUGFuZWwgaHAgPSBuZXcgSG9yaXpvbnRhbFBhbmVsKCk7CisgICAgaHAuYWRkKG5hbWVUeHQpOworICAgIGhwLmFkZChicm93c2UpOworICAgIGdyaWQuc2V0V2lkZ2V0KDAsIDEsIGhwKTsKIAogICAgIGdyaWQuc2V0VGV4dCgxLCAwLCBVdGlsLkMud2F0Y2hlZFByb2plY3RGaWx0ZXIoKSk7CiAgICAgZ3JpZC5zZXRXaWRnZXQoMSwgMSwgZmlsdGVyVHh0KTsKQEAgLTc2LDcgKzgwLDYgQEAKICAgICBmcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hZGRXYXRjaFBhbmVsKCkpOwogICAgIGZwLmFkZChncmlkKTsKICAgICBmcC5hZGQoYWRkTmV3KTsKLSAgICBmcC5hZGQoYnJvd3NlKTsKICAgICBhZGQoZnApOwogCiAKQEAgLTkwLDcgKzkzLDcgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgb25Nb3ZlUG9pbnRlclRvKFN0cmluZyBwcm9qZWN0TmFtZSkgewogICAgICAgICAvLyBwcmV2ZW50IHVzZXIgaW5wdXQgZnJvbSBiZWluZyBvdmVyd3JpdHRlbiBieSBzaW1wbHkgcG9waW5nIHVwCi0gICAgICAgIGlmICghcHJvamVjdHNQb3B1cC5pc1BvcGluZ1VwKCkgfHwgIiIuZXF1YWxzKG5hbWVCb3guZ2V0VGV4dCgpKSkgeworICAgICAgICBpZiAoIXByb2plY3RzUG9wdXAuaXNQb3BwaW5nVXAoKSB8fCAiIi5lcXVhbHMobmFtZUJveC5nZXRUZXh0KCkpKSB7CiAgICAgICAgICAgbmFtZUJveC5zZXRUZXh0KHByb2plY3ROYW1lKTsKICAgICAgICAgfQogICAgICAgfQpAQCAtMTkzLDcgKzE5Niw3IEBACiAgIH0KIAogICBwcm90ZWN0ZWQgdm9pZCBkb0FkZE5ldygpIHsKLSAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBuYW1lVHh0LmdldFRleHQoKTsKKyAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBuYW1lVHh0LmdldFRleHQoKS50cmltKCk7CiAgICAgaWYgKCIiLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKICAgICAgIHJldHVybjsKICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZXNUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvTXlXYXRjaGVzVGFibGUuamF2YQppbmRleCBjMTU4YzJjLi5lMjI4NjQ3IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9NeVdhdGNoZXNUYWJsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hY2NvdW50L015V2F0Y2hlc1RhYmxlLmphdmEKQEAgLTUxLDEzICs1MSwxNyBAQAogICAgIGZtdC5zZXRSb3dTcGFuKDAsIDIsIDIpOwogICAgIERPTS5zZXRFbGVtZW50UHJvcGVydHkoZm10LmdldEVsZW1lbnQoMCwgMyksICJhbGlnbiIsICJjZW50ZXIiKTsKIAotICAgIGZtdC5zZXRDb2xTcGFuKDAsIDMsIDMpOworICAgIGZtdC5zZXRDb2xTcGFuKDAsIDMsIDUpOwogICAgIHRhYmxlLnNldFRleHQoMSwgMCwgVXRpbC5DLndhdGNoZWRQcm9qZWN0Q29sdW1uTmV3Q2hhbmdlcygpKTsKLSAgICB0YWJsZS5zZXRUZXh0KDEsIDEsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbkFsbENvbW1lbnRzKCkpOwotICAgIHRhYmxlLnNldFRleHQoMSwgMiwgVXRpbC5DLndhdGNoZWRQcm9qZWN0Q29sdW1uU3VibWl0dGVkQ2hhbmdlcygpKTsKKyAgICB0YWJsZS5zZXRUZXh0KDEsIDEsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbk5ld1BhdGNoU2V0cygpKTsKKyAgICB0YWJsZS5zZXRUZXh0KDEsIDIsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbkFsbENvbW1lbnRzKCkpOworICAgIHRhYmxlLnNldFRleHQoMSwgMywgVXRpbC5DLndhdGNoZWRQcm9qZWN0Q29sdW1uU3VibWl0dGVkQ2hhbmdlcygpKTsKKyAgICB0YWJsZS5zZXRUZXh0KDEsIDQsIFV0aWwuQy53YXRjaGVkUHJvamVjdENvbHVtbkFiYW5kb25lZENoYW5nZXMoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAwLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAyLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZSgxLCAzLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZSgxLCA0LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBkZWxldGVDaGVja2VkKCkgewpAQCAtMTM1LDggKzEzOSwxMCBAQAogICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsIGZwKTsKIAogICAgIGFkZE5vdGlmeUJ1dHRvbihBY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGUuTkVXX0NIQU5HRVMsIGluZm8sIHJvdywgMyk7Ci0gICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMsIGluZm8sIHJvdywgNCk7Ci0gICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5TVUJNSVRURURfQ0hBTkdFUywgaW5mbywgcm93LCA1KTsKKyAgICBhZGROb3RpZnlCdXR0b24oQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlLk5FV19QQVRDSFNFVFMsIGluZm8sIHJvdywgNCk7CisgICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMsIGluZm8sIHJvdywgNSk7CisgICAgYWRkTm90aWZ5QnV0dG9uKEFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZS5TVUJNSVRURURfQ0hBTkdFUywgaW5mbywgcm93LCA2KTsKKyAgICBhZGROb3RpZnlCdXR0b24oQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlLkFCQU5ET05FRF9DSEFOR0VTLCBpbmZvLCByb3csIDcpOwogCiAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbCgpKTsKQEAgLTE0NCw2ICsxNTAsOCBAQAogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCAzLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA0LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA1LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA2LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCA3LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogCiAgICAgc2V0Um93SXRlbShyb3csIGluZm8pOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Tc2hQYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvU3NoUGFuZWwuamF2YQppbmRleCA3MzEyN2YwLi5hYWFkYzVlNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FjY291bnQvU3NoUGFuZWwuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWNjb3VudC9Tc2hQYW5lbC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkVycm9yRGlhbG9nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tcGxleERpc2Nsb3N1cmVQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuRmFuY3lGbGV4VGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Tc2hIb3N0S2V5OwpAQCAtOTIsNyArOTMsMTEgQEAKICAgICBhZGRLZXlCbG9jay5zZXRWaXNpYmxlKGZhbHNlKTsKICAgICBhZGRLZXlCbG9jay5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hZGRTc2hLZXlQYW5lbCgpKTsKICAgICBhZGRLZXlCbG9jay5hZGQobmV3IFNtYWxsSGVhZGluZyhVdGlsLkMuYWRkU3NoS2V5UGFuZWxIZWFkZXIoKSkpOwotICAgIGFkZEtleUJsb2NrLmFkZChuZXcgSFRNTChVdGlsLkMuYWRkU3NoS2V5SGVscCgpKSk7CisKKyAgICBmaW5hbCBDb21wbGV4RGlzY2xvc3VyZVBhbmVsIGFkZFNzaEtleUhlbHAgPQorICAgICAgICBuZXcgQ29tcGxleERpc2Nsb3N1cmVQYW5lbChVdGlsLkMuYWRkU3NoS2V5SGVscFRpdGxlKCksIGZhbHNlKTsKKyAgICBhZGRTc2hLZXlIZWxwLnNldENvbnRlbnQobmV3IEhUTUwoVXRpbC5DLmFkZFNzaEtleUhlbHAoKSkpOworICAgIGFkZEtleUJsb2NrLmFkZChhZGRTc2hLZXlIZWxwKTsKIAogICAgIGFkZFR4dCA9IG5ldyBOcFRleHRBcmVhKCk7CiAgICAgYWRkVHh0LnNldFZpc2libGVMaW5lcygxMik7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRkRmlsZUNvbW1lbnQucG5nIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkZEZpbGVDb21tZW50LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWUzYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkZEZpbGVDb21tZW50LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjZXNzU2VjdGlvbkVkaXRvci5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY2Vzc1NlY3Rpb25FZGl0b3IuamF2YQppbmRleCBhOWFhNDE4Li4zNDQxMDRkIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjZXNzU2VjdGlvbkVkaXRvci5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2Nlc3NTZWN0aW9uRWRpdG9yLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdEFjY2VzczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZWZDb25maWdTZWN0aW9uOwpAQCAtMjI2LDEwICsyMjYsOCBAQAogICAgICAgICBhZGRQZXJtaXNzaW9uKHZhck5hbWUsIHBlcm1zKTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKFJlZkNvbmZpZ1NlY3Rpb24uaXNWYWxpZCh2YWx1ZS5nZXROYW1lKCkpKSB7Ci0gICAgICBmb3IgKEFwcHJvdmFsVHlwZSB0IDogR2Vycml0LmdldENvbmZpZygpLmdldEFwcHJvdmFsVHlwZXMoKQotICAgICAgICAgIC5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKLSAgICAgICAgU3RyaW5nIHZhck5hbWUgPSBQZXJtaXNzaW9uLkxBQkVMICsgdC5nZXRDYXRlZ29yeSgpLmdldExhYmVsTmFtZSgpOwotICAgICAgICBhZGRQZXJtaXNzaW9uKHZhck5hbWUsIHBlcm1zKTsKKyAgICAgIGZvciAoTGFiZWxUeXBlIHQgOiBwcm9qZWN0QWNjZXNzLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCkpIHsKKyAgICAgICAgYWRkUGVybWlzc2lvbihQZXJtaXNzaW9uLkxBQkVMICsgdC5nZXROYW1lKCksIHBlcm1zKTsKICAgICAgIH0KICAgICAgIGZvciAoU3RyaW5nIHZhck5hbWUgOiBVdGlsLkMucGVybWlzc2lvbk5hbWVzKCkua2V5U2V0KCkpIHsKICAgICAgICAgYWRkUGVybWlzc2lvbih2YXJOYW1lLCBwZXJtcyk7CkBAIC0yODQsNyArMjgyLDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGVybWlzc2lvbkVkaXRvciBjcmVhdGUoaW50IGluZGV4KSB7CiAgICAgICBQZXJtaXNzaW9uRWRpdG9yIHN1YkVkaXRvciA9Ci0gICAgICAgICAgbmV3IFBlcm1pc3Npb25FZGl0b3IocHJvamVjdEFjY2Vzcy5nZXRQcm9qZWN0TmFtZSgpLCByZWFkT25seSwgdmFsdWUpOworICAgICAgICAgIG5ldyBQZXJtaXNzaW9uRWRpdG9yKHByb2plY3RBY2Nlc3MuZ2V0UHJvamVjdE5hbWUoKSwgcmVhZE9ubHksIHZhbHVlLAorICAgICAgICAgICAgICBwcm9qZWN0QWNjZXNzLmdldExhYmVsVHlwZXMoKSk7CiAgICAgICBwZXJtaXNzaW9uQ29udGFpbmVyLmluc2VydChzdWJFZGl0b3IsIGluZGV4KTsKICAgICAgIHJldHVybiBzdWJFZGl0b3I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY2Vzc1NlY3Rpb25FZGl0b3IudWkueG1sIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY2Vzc1NlY3Rpb25FZGl0b3IudWkueG1sCmluZGV4IDUwMWMzZmMuLmIzMWUwMmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2Nlc3NTZWN0aW9uRWRpdG9yLnVpLnhtbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjZXNzU2VjdGlvbkVkaXRvci51aS54bWwKQEAgLTI5LDYgKzI5LDcgQEAKICAgQGV2YWwgdHJpbUNvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS50cmltQ29sb3I7CiAKICAgLnBhbmVsIHsKKyAgICB3aWR0aDogNTBlbTsKICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cEluZm9TY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBJbmZvU2NyZWVuLmphdmEKaW5kZXggZWE3YzA0Yi4uZWE4MzZjNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cEluZm9TY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjb3VudEdyb3VwSW5mb1NjcmVlbi5qYXZhCkBAIC0xNSwyOCArMTUsMjQgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuVm9pZFJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwQXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRHcm91cFN1Z2dlc3RPcmFjbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk9uRWRpdEVuYWJsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlJQQ1N1Z2dlc3RPcmFjbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cE9wdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2hhbmdlSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNoZWNrQm94OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkxhYmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkxpc3RCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuY2xpcHB5LmNsaWVudC5Db3B5YWJsZUxhYmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRBcmVhOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogCiBwdWJsaWMgY2xhc3MgQWNjb3VudEdyb3VwSW5mb1NjcmVlbiBleHRlbmRzIEFjY291bnRHcm91cFNjcmVlbiB7CiAgIHByaXZhdGUgQ29weWFibGVMYWJlbCBncm91cFVVSURMYWJlbDsKQEAgLTUxLDE0ICs0NywxMCBAQAogICBwcml2YXRlIE5wVGV4dEFyZWEgZGVzY1R4dDsKICAgcHJpdmF0ZSBCdXR0b24gc2F2ZURlc2M7CiAKLSAgcHJpdmF0ZSBMYWJlbCB0eXBlU3lzdGVtOwotICBwcml2YXRlIExpc3RCb3ggdHlwZVNlbGVjdDsKLSAgcHJpdmF0ZSBCdXR0b24gc2F2ZVR5cGU7Ci0KICAgcHJpdmF0ZSBDaGVja0JveCB2aXNpYmxlVG9BbGxDaGVja0JveDsKICAgcHJpdmF0ZSBCdXR0b24gc2F2ZUdyb3VwT3B0aW9uczsKIAotICBwdWJsaWMgQWNjb3VudEdyb3VwSW5mb1NjcmVlbihmaW5hbCBHcm91cERldGFpbCB0b1Nob3csIGZpbmFsIFN0cmluZyB0b2tlbikgeworICBwdWJsaWMgQWNjb3VudEdyb3VwSW5mb1NjcmVlbihmaW5hbCBHcm91cEluZm8gdG9TaG93LCBmaW5hbCBTdHJpbmcgdG9rZW4pIHsKICAgICBzdXBlcih0b1Nob3csIHRva2VuKTsKICAgfQogCkBAIC03MCwxNCArNjIsMTIgQEAKICAgICBpbml0T3duZXIoKTsKICAgICBpbml0RGVzY3JpcHRpb24oKTsKICAgICBpbml0R3JvdXBPcHRpb25zKCk7Ci0gICAgaW5pdEdyb3VwVHlwZSgpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUZvcm0oZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnkpIHsKICAgICBncm91cE5hbWVUeHQuc2V0RW5hYmxlZChjYW5Nb2RpZnkpOwogICAgIG93bmVyVHh0Qm94LnNldEVuYWJsZWQoY2FuTW9kaWZ5KTsKICAgICBkZXNjVHh0LnNldEVuYWJsZWQoY2FuTW9kaWZ5KTsKLSAgICB0eXBlU2VsZWN0LnNldEVuYWJsZWQoY2FuTW9kaWZ5KTsKICAgICB2aXNpYmxlVG9BbGxDaGVja0JveC5zZXRFbmFibGVkKGNhbk1vZGlmeSk7CiAgIH0KIApAQCAtMTA0LDEyICs5NCwxNSBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG5ld05hbWUgPSBncm91cE5hbWVUeHQuZ2V0VGV4dCgpLnRyaW0oKTsKLSAgICAgICAgVXRpbC5HUk9VUF9TVkMucmVuYW1lR3JvdXAoZ2V0R3JvdXBJZCgpLCBuZXdOYW1lLAotICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEdyb3VwRGV0YWlsIGdyb3VwRGV0YWlsKSB7CisgICAgICAgIEdyb3VwQXBpLnJlbmFtZUdyb3VwKGdldEdyb3VwVVVJRCgpLCBuZXdOYW1lLAorICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0PigpIHsKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0IHJlc3VsdCkgewogICAgICAgICAgICAgICAgIHNhdmVOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgIHNldFBhZ2VUaXRsZShVdGlsLk0uZ3JvdXAoZ3JvdXBEZXRhaWwuZ3JvdXAuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgZGlzcGxheShncm91cERldGFpbCk7CisgICAgICAgICAgICAgICAgc2V0UGFnZVRpdGxlKFV0aWwuTS5ncm91cChuZXdOYW1lKSk7CisgICAgICAgICAgICAgICAgZ3JvdXBOYW1lVHh0LnNldFRleHQobmV3TmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKGdldEdyb3VwVVVJRCgpLmVxdWFscyhnZXRPd25lckdyb3VwVVVJRCgpKSkgeworICAgICAgICAgICAgICAgICAgb3duZXJUeHQuc2V0VGV4dChuZXdOYW1lKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgICAgfQpAQCAtMTM5LDkgKzEzMiwxMCBAQAogICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBDbGlja0V2ZW50IGV2ZW50KSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBuZXdPd25lciA9IG93bmVyVHh0LmdldFRleHQoKS50cmltKCk7CiAgICAgICAgIGlmIChuZXdPd25lci5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBVdGlsLkdST1VQX1NWQy5jaGFuZ2VHcm91cE93bmVyKGdldEdyb3VwSWQoKSwgbmV3T3duZXIsCi0gICAgICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVm9pZFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICBHcm91cEFwaS5zZXRHcm91cE93bmVyKGdldEdyb3VwVVVJRCgpLCBuZXdPd25lciwKKyAgICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwSW5mbz4oKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEdyb3VwSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgIHVwZGF0ZU93bmVyR3JvdXAocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgIHNhdmVPd25lci5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0pOwpAQCAtMTcwLDcgKzE2NCw3IEBACiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgdHh0ID0gZGVzY1R4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgICAgICBVdGlsLkdST1VQX1NWQy5jaGFuZ2VHcm91cERlc2NyaXB0aW9uKGdldEdyb3VwSWQoKSwgdHh0LAorICAgICAgICBHcm91cEFwaS5zZXRHcm91cERlc2NyaXB0aW9uKGdldEdyb3VwVVVJRCgpLCB0eHQsCiAgICAgICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CiAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBWb2lkUmVzdWx0IHJlc3VsdCkgewogICAgICAgICAgICAgICAgIHNhdmVEZXNjLnNldEVuYWJsZWQoZmFsc2UpOwpAQCAtMjAwLDEwICsxOTQsOCBAQAogICAgIHNhdmVHcm91cE9wdGlvbnMuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBmaW5hbCBHcm91cE9wdGlvbnMgZ3JvdXBPcHRpb25zID0KLSAgICAgICAgICAgIG5ldyBHcm91cE9wdGlvbnModmlzaWJsZVRvQWxsQ2hlY2tCb3guZ2V0VmFsdWUoKSk7Ci0gICAgICAgIFV0aWwuR1JPVVBfU1ZDLmNoYW5nZUdyb3VwT3B0aW9ucyhnZXRHcm91cElkKCksIGdyb3VwT3B0aW9ucywKLSAgICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKKyAgICAgICAgR3JvdXBBcGkuc2V0R3JvdXBPcHRpb25zKGdldEdyb3VwVVVJRCgpLAorICAgICAgICAgICAgdmlzaWJsZVRvQWxsQ2hlY2tCb3guZ2V0VmFsdWUoKSwgbmV3IEdlcnJpdENhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewogICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVm9pZFJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICBzYXZlR3JvdXBPcHRpb25zLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICB9CkBAIC0yMTgsMTE0ICsyMTAsMjAgQEAKICAgICBlbmFibGVyLmxpc3RlblRvKHZpc2libGVUb0FsbENoZWNrQm94KTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBpbml0R3JvdXBUeXBlKCkgewotICAgIHR5cGVTeXN0ZW0gPSBuZXcgTGFiZWwoVXRpbC5DLmdyb3VwVHlwZV9TWVNURU0oKSk7Ci0KLSAgICB0eXBlU2VsZWN0ID0gbmV3IExpc3RCb3goKTsKLSAgICB0eXBlU2VsZWN0LnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmdyb3VwVHlwZVNlbGVjdExpc3RCb3goKSk7Ci0gICAgdHlwZVNlbGVjdC5hZGRJdGVtKFV0aWwuQy5ncm91cFR5cGVfSU5URVJOQUwoKSwgQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwubmFtZSgpKTsKLSAgICB0eXBlU2VsZWN0LmFkZENoYW5nZUhhbmRsZXIobmV3IENoYW5nZUhhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlKENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHNhdmVUeXBlLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBzYXZlVHlwZSA9IG5ldyBCdXR0b24oVXRpbC5DLmJ1dHRvbkNoYW5nZUdyb3VwVHlwZSgpKTsKLSAgICBzYXZlVHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBzYXZlVHlwZS5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIG9uU2F2ZVR5cGUoKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHN3aXRjaCAoR2Vycml0LmdldENvbmZpZygpLmdldEF1dGhUeXBlKCkpIHsKLSAgICAgIGNhc2UgSFRUUF9MREFQOgotICAgICAgY2FzZSBMREFQOgotICAgICAgY2FzZSBMREFQX0JJTkQ6Ci0gICAgICBjYXNlIENMSUVOVF9TU0xfQ0VSVF9MREFQOgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmaW5hbCBWZXJ0aWNhbFBhbmVsIGZwID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKLSAgICBmcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5ncm91cFR5cGVQYW5lbCgpKTsKLSAgICBmcC5hZGQobmV3IFNtYWxsSGVhZGluZyhVdGlsLkMuaGVhZGluZ0dyb3VwVHlwZSgpKSk7Ci0gICAgZnAuYWRkKHR5cGVTeXN0ZW0pOwotICAgIGZwLmFkZCh0eXBlU2VsZWN0KTsKLSAgICBmcC5hZGQoc2F2ZVR5cGUpOwotICAgIGFkZChmcCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0VHlwZShmaW5hbCBBY2NvdW50R3JvdXAuVHlwZSBuZXdUeXBlKSB7Ci0gICAgZmluYWwgYm9vbGVhbiBzeXN0ZW0gPSBuZXdUeXBlID09IEFjY291bnRHcm91cC5UeXBlLlNZU1RFTTsKLQotICAgIHR5cGVTeXN0ZW0uc2V0VmlzaWJsZShzeXN0ZW0pOwotICAgIHR5cGVTZWxlY3Quc2V0VmlzaWJsZSghc3lzdGVtKTsKLSAgICBzYXZlVHlwZS5zZXRWaXNpYmxlKCFzeXN0ZW0pOwotCi0gICAgaWYgKCFzeXN0ZW0pIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZVNlbGVjdC5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChuZXdUeXBlLm5hbWUoKS5lcXVhbHModHlwZVNlbGVjdC5nZXRWYWx1ZShpKSkpIHsKLSAgICAgICAgICB0eXBlU2VsZWN0LnNldFNlbGVjdGVkSW5kZXgoaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzYXZlVHlwZS5zZXRFbmFibGVkKGZhbHNlKTsKLQotICAgIHNldE1lbWJlcnNUYWJWaXNpYmxlKG5ld1R5cGUgPT0gQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9uU2F2ZVR5cGUoKSB7Ci0gICAgZmluYWwgaW50IGlkeCA9IHR5cGVTZWxlY3QuZ2V0U2VsZWN0ZWRJbmRleCgpOwotICAgIGZpbmFsIEFjY291bnRHcm91cC5UeXBlIG5ld1R5cGUgPQotICAgICAgICBBY2NvdW50R3JvdXAuVHlwZS52YWx1ZU9mKHR5cGVTZWxlY3QuZ2V0VmFsdWUoaWR4KSk7Ci0KLSAgICB0eXBlU2VsZWN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIHNhdmVUeXBlLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgVXRpbC5HUk9VUF9TVkMuY2hhbmdlR3JvdXBUeXBlKGdldEdyb3VwSWQoKSwgbmV3VHlwZSwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgdHlwZVNlbGVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2V0VHlwZShuZXdUeXBlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgdHlwZVNlbGVjdC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgc2F2ZVR5cGUuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheShmaW5hbCBHcm91cERldGFpbCBncm91cERldGFpbCkgewotICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGdyb3VwRGV0YWlsLmdyb3VwOworICBwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5KGZpbmFsIEdyb3VwSW5mbyBncm91cCwgZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnkpIHsKICAgICBncm91cFVVSURMYWJlbC5zZXRUZXh0KGdyb3VwLmdldEdyb3VwVVVJRCgpLmdldCgpKTsKLSAgICBncm91cE5hbWVUeHQuc2V0VGV4dChncm91cC5nZXROYW1lKCkpOwotICAgIGlmIChncm91cERldGFpbC5vd25lckdyb3VwICE9IG51bGwpIHsKLSAgICAgIG93bmVyVHh0LnNldFRleHQoZ3JvdXBEZXRhaWwub3duZXJHcm91cC5nZXROYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvd25lclR4dC5zZXRUZXh0KFV0aWwuTS5kZWxldGVkUmVmZXJlbmNlKGdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkuZ2V0KCkpKTsKLSAgICB9Ci0gICAgZGVzY1R4dC5zZXRUZXh0KGdyb3VwLmdldERlc2NyaXB0aW9uKCkpOworICAgIGdyb3VwTmFtZVR4dC5zZXRUZXh0KGdyb3VwLm5hbWUoKSk7CisgICAgb3duZXJUeHQuc2V0VGV4dChncm91cC5vd25lcigpICE9IG51bGw/Z3JvdXAub3duZXIoKTpVdGlsLk0uZGVsZXRlZFJlZmVyZW5jZShncm91cC5nZXRPd25lclVVSUQoKS5nZXQoKSkpOworICAgIGRlc2NUeHQuc2V0VGV4dChncm91cC5kZXNjcmlwdGlvbigpKTsKKyAgICB2aXNpYmxlVG9BbGxDaGVja0JveC5zZXRWYWx1ZShncm91cC5vcHRpb25zKCkuaXNWaXNpYmxlVG9BbGwoKSk7CisgICAgc2V0TWVtYmVyc1RhYlZpc2libGUoQWNjb3VudEdyb3VwLmlzSW50ZXJuYWxHcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkKKyAgICAgICAgJiYgIUFjY291bnRHcm91cC5pc1N5c3RlbUdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKSk7CiAKLSAgICB2aXNpYmxlVG9BbGxDaGVja0JveC5zZXRWYWx1ZShncm91cC5pc1Zpc2libGVUb0FsbCgpKTsKLQotICAgIHNldFR5cGUoZ3JvdXAuZ2V0VHlwZSgpKTsKLQotICAgIGVuYWJsZUZvcm0oZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKLSAgICBzYXZlTmFtZS5zZXRWaXNpYmxlKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgc2F2ZU93bmVyLnNldFZpc2libGUoZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKLSAgICBzYXZlRGVzYy5zZXRWaXNpYmxlKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgc2F2ZUdyb3VwT3B0aW9ucy5zZXRWaXNpYmxlKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgc2F2ZVR5cGUuc2V0VmlzaWJsZShncm91cERldGFpbC5jYW5Nb2RpZnkpOworICAgIGVuYWJsZUZvcm0oY2FuTW9kaWZ5KTsKKyAgICBzYXZlTmFtZS5zZXRWaXNpYmxlKGNhbk1vZGlmeSk7CisgICAgc2F2ZU93bmVyLnNldFZpc2libGUoY2FuTW9kaWZ5KTsKKyAgICBzYXZlRGVzYy5zZXRWaXNpYmxlKGNhbk1vZGlmeSk7CisgICAgc2F2ZUdyb3VwT3B0aW9ucy5zZXRWaXNpYmxlKGNhbk1vZGlmeSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjb3VudEdyb3VwTWVtYmVyc1NjcmVlbi5qYXZhCmluZGV4IDRjMGIxYmEuLmMyNzZhODkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cE1lbWJlcnNTY3JlZW4uamF2YQpAQCAtMTYsMzcgKzE2LDM2IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRGlzcGF0Y2hlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRHcm91cFN1Z2dlc3RPcmFjbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BZGRNZW1iZXJCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZhbmN5RmxleFRhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IeXBlcmxpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwSW5mbzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cEluZm9DYWNoZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ2hlY2tCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxleFRhYmxlLkZsZXhDZWxsRm9ybWF0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIHB1YmxpYyBjbGFzcyBBY2NvdW50R3JvdXBNZW1iZXJzU2NyZWVuIGV4dGVuZHMgQWNjb3VudEdyb3VwU2NyZWVuIHsKIAotICBwcml2YXRlIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudHMgPSBBY2NvdW50SW5mb0NhY2hlLmVtcHR5KCk7Ci0gIHByaXZhdGUgR3JvdXBJbmZvQ2FjaGUgZ3JvdXBzID0gR3JvdXBJbmZvQ2FjaGUuZW1wdHkoKTsKICAgcHJpdmF0ZSBNZW1iZXJUYWJsZSBtZW1iZXJzOwogICBwcml2YXRlIEluY2x1ZGVUYWJsZSBpbmNsdWRlczsKIApAQCAtNjAsNyArNTksNyBAQAogCiAgIHByaXZhdGUgRmxvd1BhbmVsIG5vTWVtYmVyc0luZm87CiAKLSAgcHVibGljIEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZmluYWwgR3JvdXBEZXRhaWwgdG9TaG93LCBmaW5hbCBTdHJpbmcgdG9rZW4pIHsKKyAgcHVibGljIEFjY291bnRHcm91cE1lbWJlcnNTY3JlZW4oZmluYWwgR3JvdXBJbmZvIHRvU2hvdywgZmluYWwgU3RyaW5nIHRva2VuKSB7CiAgICAgc3VwZXIodG9TaG93LCB0b2tlbik7CiAgIH0KIApAQCAtMTExLDggKzExMCw4IEBACiAKICAgcHJpdmF0ZSB2b2lkIGluaXRJbmNsdWRlTGlzdCgpIHsKICAgICBhZGRJbmNsdWRlQm94ID0KLSAgICAgIG5ldyBBZGRNZW1iZXJCb3goVXRpbC5DLmJ1dHRvbkFkZEluY2x1ZGVkR3JvdXAoKSwKLSAgICAgICAgICBVdGlsLkMuZGVmYXVsdEFjY291bnRHcm91cE5hbWUoKSwgbmV3IEFjY291bnRHcm91cFN1Z2dlc3RPcmFjbGUoKSk7CisgICAgICAgIG5ldyBBZGRNZW1iZXJCb3goVXRpbC5DLmJ1dHRvbkFkZEluY2x1ZGVkR3JvdXAoKSwKKyAgICAgICAgICAgIFV0aWwuQy5kZWZhdWx0QWNjb3VudEdyb3VwTmFtZSgpLCBuZXcgQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZSgpKTsKIAogICAgIGFkZEluY2x1ZGVCb3guYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTE0OCwyNCArMTQ3LDIwIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheShmaW5hbCBHcm91cERldGFpbCBncm91cERldGFpbCkgewotICAgIHN3aXRjaCAoZ3JvdXBEZXRhaWwuZ3JvdXAuZ2V0VHlwZSgpKSB7Ci0gICAgICBjYXNlIElOVEVSTkFMOgotICAgICAgICBhY2NvdW50cyA9IGdyb3VwRGV0YWlsLmFjY291bnRzOwotICAgICAgICBncm91cHMgPSBncm91cERldGFpbC5ncm91cHM7Ci0gICAgICAgIG1lbWJlcnMuZGlzcGxheShncm91cERldGFpbC5tZW1iZXJzKTsKLSAgICAgICAgaW5jbHVkZXMuZGlzcGxheShncm91cERldGFpbC5pbmNsdWRlcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgbWVtYmVyUGFuZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgICAgIGluY2x1ZGVQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbm9NZW1iZXJzSW5mby5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBicmVhazsKKyAgcHJvdGVjdGVkIHZvaWQgZGlzcGxheShmaW5hbCBHcm91cEluZm8gZ3JvdXAsIGZpbmFsIGJvb2xlYW4gY2FuTW9kaWZ5KSB7CisgICAgaWYgKEFjY291bnRHcm91cC5pc0ludGVybmFsR3JvdXAoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpCisgICAgICAgICYmICFBY2NvdW50R3JvdXAuaXNTeXN0ZW1Hcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgIG1lbWJlcnMuZGlzcGxheShOYXRpdmVzLmFzTGlzdChncm91cC5tZW1iZXJzKCkpKTsKKyAgICAgIGluY2x1ZGVzLmRpc3BsYXkoTmF0aXZlcy5hc0xpc3QoZ3JvdXAuaW5jbHVkZXMoKSkpOworICAgIH0gZWxzZSB7CisgICAgICBtZW1iZXJQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIGluY2x1ZGVQYW5lbC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgIG5vTWVtYmVyc0luZm8uc2V0VmlzaWJsZSh0cnVlKTsKICAgICB9CiAKLSAgICBlbmFibGVGb3JtKGdyb3VwRGV0YWlsLmNhbk1vZGlmeSk7Ci0gICAgZGVsTWVtYmVyLnNldFZpc2libGUoZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKLSAgICBkZWxJbmNsdWRlLnNldFZpc2libGUoZ3JvdXBEZXRhaWwuY2FuTW9kaWZ5KTsKKyAgICBlbmFibGVGb3JtKGNhbk1vZGlmeSk7CisgICAgZGVsTWVtYmVyLnNldFZpc2libGUoY2FuTW9kaWZ5KTsKKyAgICBkZWxJbmNsdWRlLnNldFZpc2libGUoY2FuTW9kaWZ5KTsKICAgfQogCiAgIHZvaWQgZG9BZGROZXdNZW1iZXIoKSB7CkBAIC0xNzUsMTUgKzE3MCwxMiBAQAogICAgIH0KIAogICAgIGFkZE1lbWJlckJveC5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBVdGlsLkdST1VQX1NWQy5hZGRHcm91cE1lbWJlcihnZXRHcm91cElkKCksIG5hbWVFbWFpbCwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgR3JvdXBEZXRhaWwgcmVzdWx0KSB7CisgICAgR3JvdXBBcGkuYWRkTWVtYmVyKGdldEdyb3VwVVVJRCgpLCBuYW1lRW1haWwsCisgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxBY2NvdW50SW5mbz4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEFjY291bnRJbmZvIG1lbWJlckluZm8pIHsKICAgICAgICAgICAgIGFkZE1lbWJlckJveC5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgYWRkTWVtYmVyQm94LnNldFRleHQoIiIpOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5hY2NvdW50cyAhPSBudWxsICYmIHJlc3VsdC5tZW1iZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgYWNjb3VudHMubWVyZ2UocmVzdWx0LmFjY291bnRzKTsKLSAgICAgICAgICAgICAgbWVtYmVycy5kaXNwbGF5KHJlc3VsdC5tZW1iZXJzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWJlcnMuaW5zZXJ0KG1lbWJlckluZm8pOwogICAgICAgICAgIH0KIAogICAgICAgICAgIEBPdmVycmlkZQpAQCAtMjAxLDE1ICsxOTMsMTIgQEAKICAgICB9CiAKICAgICBhZGRJbmNsdWRlQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIFV0aWwuR1JPVVBfU1ZDLmFkZEdyb3VwSW5jbHVkZShnZXRHcm91cElkKCksIGdyb3VwTmFtZSwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgR3JvdXBEZXRhaWwgcmVzdWx0KSB7CisgICAgR3JvdXBBcGkuYWRkSW5jbHVkZWRHcm91cChnZXRHcm91cFVVSUQoKSwgZ3JvdXBOYW1lLAorICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8R3JvdXBJbmZvPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgR3JvdXBJbmZvIHJlc3VsdCkgewogICAgICAgICAgICAgYWRkSW5jbHVkZUJveC5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgYWRkSW5jbHVkZUJveC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ3JvdXBzICE9IG51bGwgJiYgcmVzdWx0LmluY2x1ZGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZ3JvdXBzLm1lcmdlKHJlc3VsdC5ncm91cHMpOwotICAgICAgICAgICAgICBpbmNsdWRlcy5kaXNwbGF5KHJlc3VsdC5pbmNsdWRlcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpbmNsdWRlcy5pbnNlcnQocmVzdWx0KTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTIyMCw3ICsyMDksNyBAQAogICAgICAgICB9KTsKICAgfQogCi0gIHByaXZhdGUgY2xhc3MgTWVtYmVyVGFibGUgZXh0ZW5kcyBGYW5jeUZsZXhUYWJsZTxBY2NvdW50R3JvdXBNZW1iZXI+IHsKKyAgcHJpdmF0ZSBjbGFzcyBNZW1iZXJUYWJsZSBleHRlbmRzIEZhbmN5RmxleFRhYmxlPEFjY291bnRJbmZvPiB7CiAgICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOwogCiAgICAgTWVtYmVyVGFibGUoKSB7CkBAIC0yMzYsMjkgKzIyNSwyOCBAQAogICAgIHZvaWQgc2V0RW5hYmxlZChmaW5hbCBib29sZWFuIGVuYWJsZWQpIHsKICAgICAgIHRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCB0YWJsZS5nZXRSb3dDb3VudCgpOyByb3crKykgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgaWYgKGsgIT0gbnVsbCkgeworICAgICAgICBmaW5hbCBBY2NvdW50SW5mbyBpID0gZ2V0Um93SXRlbShyb3cpOworICAgICAgICBpZiAoaSAhPSBudWxsKSB7CiAgICAgICAgICAgKChDaGVja0JveCkgdGFibGUuZ2V0V2lkZ2V0KHJvdywgMSkpLnNldEVuYWJsZWQoZW5hYmxlZCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKICAgICB2b2lkIGRlbGV0ZUNoZWNrZWQoKSB7Ci0gICAgICBmaW5hbCBIYXNoU2V0PEFjY291bnRHcm91cE1lbWJlci5LZXk+IGlkcyA9Ci0gICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwTWVtYmVyLktleT4oKTsKKyAgICAgIGZpbmFsIEhhc2hTZXQ8SW50ZWdlcj4gaWRzID0gbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKTsKICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHJvdysrKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cE1lbWJlciBrID0gZ2V0Um93SXRlbShyb3cpOwotICAgICAgICBpZiAoayAhPSBudWxsICYmICgoQ2hlY2tCb3gpIHRhYmxlLmdldFdpZGdldChyb3csIDEpKS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgaWRzLmFkZChrLmdldEtleSgpKTsKKyAgICAgICAgZmluYWwgQWNjb3VudEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiAoKENoZWNrQm94KSB0YWJsZS5nZXRXaWRnZXQocm93LCAxKSkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIGlkcy5hZGQoaS5fYWNjb3VudF9pZCgpKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKCFpZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFV0aWwuR1JPVVBfU1ZDLmRlbGV0ZUdyb3VwTWVtYmVycyhnZXRHcm91cElkKCksIGlkcywKKyAgICAgICAgR3JvdXBBcGkucmVtb3ZlTWVtYmVycyhnZXRHcm91cFVVSUQoKSwgaWRzLAogICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewogICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVm9pZFJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCB0YWJsZS5nZXRSb3dDb3VudCgpOykgewotICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyIGsgPSBnZXRSb3dJdGVtKHJvdyk7Ci0gICAgICAgICAgICAgICAgICBpZiAoayAhPSBudWxsICYmIGlkcy5jb250YWlucyhrLmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgZmluYWwgQWNjb3VudEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgICAgICAgICAgIGlmIChpICE9IG51bGwgJiYgaWRzLmNvbnRhaW5zKGkuX2FjY291bnRfaWQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgdGFibGUucmVtb3ZlUm93KHJvdyk7CiAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICByb3crKzsKQEAgLTI2OSwzNiArMjU3LDgwIEBACiAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBkaXNwbGF5KGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwTWVtYmVyPiByZXN1bHQpIHsKKyAgICB2b2lkIGRpc3BsYXkoZmluYWwgTGlzdDxBY2NvdW50SW5mbz4gcmVzdWx0KSB7CiAgICAgICB3aGlsZSAoMSA8IHRhYmxlLmdldFJvd0NvdW50KCkpCiAgICAgICAgIHRhYmxlLnJlbW92ZVJvdyh0YWJsZS5nZXRSb3dDb3VudCgpIC0gMSk7CiAKLSAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyIGsgOiByZXN1bHQpIHsKKyAgICAgIGZvciAoZmluYWwgQWNjb3VudEluZm8gaSA6IHJlc3VsdCkgewogICAgICAgICBmaW5hbCBpbnQgcm93ID0gdGFibGUuZ2V0Um93Q291bnQoKTsKICAgICAgICAgdGFibGUuaW5zZXJ0Um93KHJvdyk7CiAgICAgICAgIGFwcGx5RGF0YVJvd1N0eWxlKHJvdyk7Ci0gICAgICAgIHBvcHVsYXRlKHJvdywgayk7CisgICAgICAgIHBvcHVsYXRlKHJvdywgaSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgaykgewotICAgICAgZmluYWwgQWNjb3VudC5JZCBhY2NvdW50SWQgPSBrLmdldEFjY291bnRJZCgpOworICAgIHZvaWQgaW5zZXJ0KEFjY291bnRJbmZvIGluZm8pIHsKKyAgICAgIENvbXBhcmF0b3I8QWNjb3VudEluZm8+IGMgPSBuZXcgQ29tcGFyYXRvcjxBY2NvdW50SW5mbz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoQWNjb3VudEluZm8gYSwgQWNjb3VudEluZm8gYikgeworICAgICAgICAgIGludCBjbXAgPSBudWxsVG9FbXB0eShhLm5hbWUoKSkuY29tcGFyZVRvKG51bGxUb0VtcHR5KGIubmFtZSgpKSk7CisgICAgICAgICAgaWYgKGNtcCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gY21wOworICAgICAgICAgIH0KKworICAgICAgICAgIGNtcCA9IG51bGxUb0VtcHR5KGEuZW1haWwoKSkuY29tcGFyZVRvKG51bGxUb0VtcHR5KGIuZW1haWwoKSkpOworICAgICAgICAgIGlmIChjbXAgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm4gYS5fYWNjb3VudF9pZCgpIC0gYi5fYWNjb3VudF9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBudWxsVG9FbXB0eShTdHJpbmcgc3RyKSB7CisgICAgICAgICAgcmV0dXJuIHN0ciA9PSBudWxsID8gIiIgOiBzdHI7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBpbnQgaW5zZXJ0UG9zaXRpb24gPSB0YWJsZS5nZXRSb3dDb3VudCgpOworICAgICAgaW50IGxlZnQgPSAxOworICAgICAgaW50IHJpZ2h0ID0gdGFibGUuZ2V0Um93Q291bnQoKSAtIDE7CisgICAgICB3aGlsZSAobGVmdCA8PSByaWdodCkgeworICAgICAgICBpbnQgbWlkZGxlID0gKGxlZnQgKyByaWdodCkgPj4+IDE7IC8vIChsZWZ0K3JpZ2h0KS8yCisgICAgICAgIEFjY291bnRJbmZvIGkgPSBnZXRSb3dJdGVtKG1pZGRsZSk7CisgICAgICAgIGludCBjbXAgPSBjLmNvbXBhcmUoaSwgaW5mbyk7CisKKyAgICAgICAgaWYgKGNtcCA8IDApIHsKKyAgICAgICAgICBsZWZ0ID0gbWlkZGxlICsgMTsKKyAgICAgICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7CisgICAgICAgICAgcmlnaHQgPSBtaWRkbGUgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIGdyb3VwIGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSB0YWJsZQorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW5zZXJ0UG9zaXRpb24gPSBsZWZ0OworCisgICAgICB0YWJsZS5pbnNlcnRSb3coaW5zZXJ0UG9zaXRpb24pOworICAgICAgYXBwbHlEYXRhUm93U3R5bGUoaW5zZXJ0UG9zaXRpb24pOworICAgICAgcG9wdWxhdGUoaW5zZXJ0UG9zaXRpb24sIGluZm8pOworICAgIH0KKworICAgIHZvaWQgcG9wdWxhdGUoZmluYWwgaW50IHJvdywgZmluYWwgQWNjb3VudEluZm8gaSkgewogICAgICAgQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgQ2hlY2tCb3goKTsKICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsIGNoZWNrQm94KTsKICAgICAgIGNoZWNrQm94LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAyLCBBY2NvdW50TGluay5saW5rKGFjY291bnRzLCBhY2NvdW50SWQpKTsKLSAgICAgIHRhYmxlLnNldFRleHQocm93LCAzLCBhY2NvdW50cy5nZXQoYWNjb3VudElkKS5nZXRQcmVmZXJyZWRFbWFpbCgpKTsKKyAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsIG5ldyBBY2NvdW50TGluayhpKSk7CisgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMywgaS5lbWFpbCgpKTsKIAogICAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsKCkpOwogICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMywgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKIAotICAgICAgc2V0Um93SXRlbShyb3csIGspOworICAgICAgc2V0Um93SXRlbShyb3csIGkpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgY2xhc3MgSW5jbHVkZVRhYmxlIGV4dGVuZHMgRmFuY3lGbGV4VGFibGU8QWNjb3VudEdyb3VwSW5jbHVkZT4geworICBwcml2YXRlIGNsYXNzIEluY2x1ZGVUYWJsZSBleHRlbmRzIEZhbmN5RmxleFRhYmxlPEdyb3VwSW5mbz4gewogICAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVkID0gdHJ1ZTsKIAogICAgIEluY2x1ZGVUYWJsZSgpIHsKQEAgLTMxNCwyOSArMzQ2LDI4IEBACiAgICAgdm9pZCBzZXRFbmFibGVkKGZpbmFsIGJvb2xlYW4gZW5hYmxlZCkgewogICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHJvdysrKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgaWYgKGsgIT0gbnVsbCkgeworICAgICAgICBmaW5hbCBHcm91cEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgaWYgKGkgIT0gbnVsbCkgewogICAgICAgICAgICgoQ2hlY2tCb3gpIHRhYmxlLmdldFdpZGdldChyb3csIDEpKS5zZXRFbmFibGVkKGVuYWJsZWQpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBkZWxldGVDaGVja2VkKCkgewotICAgICAgZmluYWwgSGFzaFNldDxBY2NvdW50R3JvdXBJbmNsdWRlLktleT4ga2V5cyA9Ci0gICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZS5LZXk+KCk7CisgICAgICBmaW5hbCBIYXNoU2V0PEFjY291bnRHcm91cC5VVUlEPiBpZHMgPSBuZXcgSGFzaFNldDxBY2NvdW50R3JvdXAuVVVJRD4oKTsKICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IHRhYmxlLmdldFJvd0NvdW50KCk7IHJvdysrKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgaWYgKGsgIT0gbnVsbCAmJiAoKENoZWNrQm94KSB0YWJsZS5nZXRXaWRnZXQocm93LCAxKSkuZ2V0VmFsdWUoKSkgewotICAgICAgICAgIGtleXMuYWRkKGsuZ2V0S2V5KCkpOworICAgICAgICBmaW5hbCBHcm91cEluZm8gaSA9IGdldFJvd0l0ZW0ocm93KTsKKyAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiAoKENoZWNrQm94KSB0YWJsZS5nZXRXaWRnZXQocm93LCAxKSkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgIGlkcy5hZGQoaS5nZXRHcm91cFVVSUQoKSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmICgha2V5cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgVXRpbC5HUk9VUF9TVkMuZGVsZXRlR3JvdXBJbmNsdWRlcyhnZXRHcm91cElkKCksIGtleXMsCisgICAgICBpZiAoIWlkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgR3JvdXBBcGkucmVtb3ZlSW5jbHVkZWRHcm91cHMoZ2V0R3JvdXBVVUlEKCksIGlkcywKICAgICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIFZvaWRSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgdGFibGUuZ2V0Um93Q291bnQoKTspIHsKLSAgICAgICAgICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgayA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgICAgICAgICAgIGlmIChrICE9IG51bGwgJiYga2V5cy5jb250YWlucyhrLmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgZmluYWwgR3JvdXBJbmZvIGkgPSBnZXRSb3dJdGVtKHJvdyk7CisgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBudWxsICYmIGlkcy5jb250YWlucyhpLmdldEdyb3VwVVVJRCgpKSkgewogICAgICAgICAgICAgICAgICAgICB0YWJsZS5yZW1vdmVSb3cocm93KTsKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJvdysrOwpAQCAtMzQ3LDM0ICszNzgsODcgQEAKICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIGRpc3BsYXkoZmluYWwgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlPiByZXN1bHQpIHsKKyAgICB2b2lkIGRpc3BsYXkoTGlzdDxHcm91cEluZm8+IGxpc3QpIHsKICAgICAgIHdoaWxlICgxIDwgdGFibGUuZ2V0Um93Q291bnQoKSkKICAgICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKIAotICAgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlIGsgOiByZXN1bHQpIHsKKyAgICAgIGZvciAoZmluYWwgR3JvdXBJbmZvIGkgOiBsaXN0KSB7CiAgICAgICAgIGZpbmFsIGludCByb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgICB0YWJsZS5pbnNlcnRSb3cocm93KTsKICAgICAgICAgYXBwbHlEYXRhUm93U3R5bGUocm93KTsKLSAgICAgICAgcG9wdWxhdGUocm93LCBrKTsKKyAgICAgICAgcG9wdWxhdGUocm93LCBpKTsKICAgICAgIH0KICAgICB9CiAKLSAgICB2b2lkIHBvcHVsYXRlKGZpbmFsIGludCByb3csIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgaykgewotICAgICAgQWNjb3VudEdyb3VwLklkIGlkID0gay5nZXRJbmNsdWRlSWQoKTsKLSAgICAgIEdyb3VwSW5mbyBncm91cCA9IGdyb3Vwcy5nZXQoaWQpOworICAgIHZvaWQgaW5zZXJ0KEdyb3VwSW5mbyBpbmZvKSB7CisgICAgICBDb21wYXJhdG9yPEdyb3VwSW5mbz4gYyA9IG5ldyBDb21wYXJhdG9yPEdyb3VwSW5mbz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoR3JvdXBJbmZvIGEsIEdyb3VwSW5mbyBiKSB7CisgICAgICAgICAgaW50IGNtcCA9IG51bGxUb0VtcHR5KGEubmFtZSgpKS5jb21wYXJlVG8obnVsbFRvRW1wdHkoYi5uYW1lKCkpKTsKKyAgICAgICAgICBpZiAoY21wICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBhLmdldEdyb3VwVVVJRCgpLmNvbXBhcmVUbyhiLmdldEdyb3VwVVVJRCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG51bGxUb0VtcHR5KEBOdWxsYWJsZSBTdHJpbmcgc3RyKSB7CisgICAgICAgICAgcmV0dXJuIChzdHIgPT0gbnVsbCkgPyAiIiA6IHN0cjsKKyAgICAgICAgfQorICAgICAgfTsKKworICAgICAgaW50IGluc2VydFBvc2l0aW9uID0gdGFibGUuZ2V0Um93Q291bnQoKTsKKyAgICAgIGludCBsZWZ0ID0gMTsKKyAgICAgIGludCByaWdodCA9IHRhYmxlLmdldFJvd0NvdW50KCkgLSAxOworICAgICAgd2hpbGUgKGxlZnQgPD0gcmlnaHQpIHsKKyAgICAgICAgaW50IG1pZGRsZSA9IChsZWZ0ICsgcmlnaHQpID4+PiAxOyAvLyAobGVmdCtyaWdodCkvMgorICAgICAgICBHcm91cEluZm8gaSA9IGdldFJvd0l0ZW0obWlkZGxlKTsKKyAgICAgICAgaW50IGNtcCA9IGMuY29tcGFyZShpLCBpbmZvKTsKKworICAgICAgICBpZiAoY21wIDwgMCkgeworICAgICAgICAgIGxlZnQgPSBtaWRkbGUgKyAxOworICAgICAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHsKKyAgICAgICAgICByaWdodCA9IG1pZGRsZSAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gZ3JvdXAgaXMgYWxyZWFkeSBjb250YWluZWQgaW4gdGhlIHRhYmxlCisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBpbnNlcnRQb3NpdGlvbiA9IGxlZnQ7CisKKyAgICAgIHRhYmxlLmluc2VydFJvdyhpbnNlcnRQb3NpdGlvbik7CisgICAgICBhcHBseURhdGFSb3dTdHlsZShpbnNlcnRQb3NpdGlvbik7CisgICAgICBwb3B1bGF0ZShpbnNlcnRQb3NpdGlvbiwgaW5mbyk7CisgICAgfQorCisgICAgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBHcm91cEluZm8gaSkgeworICAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKKworICAgICAgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA9IGkuZ2V0R3JvdXBVVUlEKCk7CiAgICAgICBDaGVja0JveCBjaGVja0JveCA9IG5ldyBDaGVja0JveCgpOwogICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgMSwgY2hlY2tCb3gpOwogICAgICAgY2hlY2tCb3guc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsCi0gICAgICAgICAgbmV3IEh5cGVybGluayhncm91cC5nZXROYW1lKCksIERpc3BhdGNoZXIudG9Hcm91cChpZCkpKTsKLSAgICAgIHRhYmxlLnNldFRleHQocm93LCAzLCBncm91cHMuZ2V0KGlkKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgIGlmIChBY2NvdW50R3JvdXAuaXNJbnRlcm5hbEdyb3VwKHV1aWQpKSB7CisgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDIsCisgICAgICAgICAgICBuZXcgSHlwZXJsaW5rKGkubmFtZSgpLCBEaXNwYXRjaGVyLnRvR3JvdXAodXVpZCkpKTsKKyAgICAgICAgZm10LmdldEVsZW1lbnQocm93LCAyKS5zZXRUaXRsZShudWxsKTsKKyAgICAgICAgdGFibGUuc2V0VGV4dChyb3csIDMsIGkuZGVzY3JpcHRpb24oKSk7CisgICAgICB9IGVsc2UgaWYgKGkudXJsKCkgIT0gbnVsbCkgeworICAgICAgICBBbmNob3IgYSA9IG5ldyBBbmNob3IoKTsKKyAgICAgICAgYS5zZXRUZXh0KGkubmFtZSgpKTsKKyAgICAgICAgYS5zZXRIcmVmKGkudXJsKCkpOworICAgICAgICBhLnNldFRpdGxlKCJVVUlEICIgKyB1dWlkLmdldCgpKTsKKyAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgMiwgYSk7CisgICAgICAgIGZtdC5nZXRFbGVtZW50KHJvdywgMikuc2V0VGl0bGUobnVsbCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMiwgaS5uYW1lKCkpOworICAgICAgICBmbXQuZ2V0RWxlbWVudChyb3csIDIpLnNldFRpdGxlKCJVVUlEICIgKyB1dWlkLmdldCgpKTsKKyAgICAgIH0KIAotICAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsKCkpOwogICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMywgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKIAotICAgICAgc2V0Um93SXRlbShyb3csIGspOworICAgICAgc2V0Um93SXRlbShyb3csIGkpOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FjY291bnRHcm91cFNjcmVlbi5qYXZhCmluZGV4IDlhYzZjOWEuLmFkZTAwYjkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9BY2NvdW50R3JvdXBTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWNjb3VudEdyb3VwU2NyZWVuLmphdmEKQEAgLTE2LDQ4ICsxNiw2NSBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5EaXNwYXRjaGVyLnRvR3JvdXA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwQXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk1lbnVTY3JlZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFjY291bnRHcm91cFNjcmVlbiBleHRlbmRzIE1lbnVTY3JlZW4gewogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZPID0gImluZm8iOwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTID0gIm1lbWJlcnMiOwogCi0gIHByaXZhdGUgZmluYWwgR3JvdXBEZXRhaWwgZ3JvdXBEZXRhaWw7CisgIHByaXZhdGUgZmluYWwgR3JvdXBJbmZvIGdyb3VwOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZW1iZXJzVGFiVG9rZW47CiAKLSAgcHVibGljIEFjY291bnRHcm91cFNjcmVlbihmaW5hbCBHcm91cERldGFpbCB0b1Nob3csIGZpbmFsIFN0cmluZyB0b2tlbikgeworICBwdWJsaWMgQWNjb3VudEdyb3VwU2NyZWVuKGZpbmFsIEdyb3VwSW5mbyB0b1Nob3csIGZpbmFsIFN0cmluZyB0b2tlbikgewogICAgIHNldFJlcXVpcmVzU2lnbkluKHRydWUpOwogCi0gICAgdGhpcy5ncm91cERldGFpbCA9IHRvU2hvdzsKKyAgICB0aGlzLmdyb3VwID0gdG9TaG93OwogICAgIHRoaXMubWVtYmVyc1RhYlRva2VuID0gZ2V0VGFiVG9rZW4odG9rZW4sIE1FTUJFUlMpOwogCiAgICAgbGluayhVdGlsLkMuZ3JvdXBUYWJHZW5lcmFsKCksIGdldFRhYlRva2VuKHRva2VuLCBJTkZPKSk7CiAgICAgbGluayhVdGlsLkMuZ3JvdXBUYWJNZW1iZXJzKCksIG1lbWJlcnNUYWJUb2tlbiwKLSAgICAgICAgZ3JvdXBEZXRhaWwuZ3JvdXAuZ2V0VHlwZSgpID09IEFjY291bnRHcm91cC5UeXBlLklOVEVSTkFMKTsKKyAgICAgICAgQWNjb3VudEdyb3VwLmlzSW50ZXJuYWxHcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkKKyAgICAgICAgJiYgIUFjY291bnRHcm91cC5pc1N5c3RlbUdyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpKSk7CiAgIH0KIAogICBwcml2YXRlIFN0cmluZyBnZXRUYWJUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4sIGZpbmFsIFN0cmluZyB0YWIpIHsKICAgICBpZiAodG9rZW4uc3RhcnRzV2l0aCgiL2FkbWluL2dyb3Vwcy91dWlkLSIpKSB7Ci0gICAgICByZXR1cm4gdG9Hcm91cChncm91cERldGFpbC5ncm91cC5nZXRHcm91cFVVSUQoKSwgdGFiKTsKKyAgICAgIHJldHVybiB0b0dyb3VwKGdyb3VwLmdldEdyb3VwVVVJRCgpLCB0YWIpOwogICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdG9Hcm91cChncm91cERldGFpbC5ncm91cC5nZXRJZCgpLCB0YWIpOworICAgICAgcmV0dXJuIHRvR3JvdXAoZ3JvdXAuZ2V0R3JvdXBJZCgpLCB0YWIpOwogICAgIH0KICAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CiAgICAgc3VwZXIub25Mb2FkKCk7Ci0gICAgc2V0UGFnZVRpdGxlKFV0aWwuTS5ncm91cChncm91cERldGFpbC5ncm91cC5nZXROYW1lKCkpKTsKKyAgICBzZXRQYWdlVGl0bGUoVXRpbC5NLmdyb3VwKGdyb3VwLm5hbWUoKSkpOwogICAgIGRpc3BsYXkoKTsKLSAgICBkaXNwbGF5KGdyb3VwRGV0YWlsKTsKKyAgICBHcm91cEFwaS5pc0dyb3VwT3duZXIoZ3JvdXAubmFtZSgpLCBuZXcgR2Vycml0Q2FsbGJhY2s8Qm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhCb29sZWFuIHJlc3VsdCkgeworICAgICAgICBkaXNwbGF5KGdyb3VwLCByZXN1bHQpOworICAgICAgfQorICAgIH0pOwogICB9CiAKLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzcGxheShmaW5hbCBHcm91cERldGFpbCBncm91cERldGFpbCk7CisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc3BsYXkoZmluYWwgR3JvdXBJbmZvIGdyb3VwLCBmaW5hbCBib29sZWFuIGNhbk1vZGlmeSk7CiAKLSAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5JZCBnZXRHcm91cElkKCkgewotICAgIHJldHVybiBncm91cERldGFpbC5ncm91cC5nZXRJZCgpOworICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLlVVSUQgZ2V0R3JvdXBVVUlEKCkgeworICAgIHJldHVybiBncm91cC5nZXRHcm91cFVVSUQoKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZU93bmVyR3JvdXAoR3JvdXBJbmZvIG93bmVyR3JvdXApIHsKKyAgICBncm91cC5zZXRPd25lclVVSUQob3duZXJHcm91cC5nZXRHcm91cFVVSUQoKSk7CisgICAgZ3JvdXAub3duZXIob3duZXJHcm91cC5uYW1lKCkpOworICB9CisKKyAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5VVUlEIGdldE93bmVyR3JvdXBVVUlEKCkgeworICAgIHJldHVybiBncm91cC5nZXRPd25lclVVSUQoKTsKICAgfQogCiAgIHByb3RlY3RlZCB2b2lkIHNldE1lbWJlcnNUYWJWaXNpYmxlKGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FkbWluQ29uc3RhbnRzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMuamF2YQppbmRleCAwYzE4MTY5Li5mNGMwYjU1IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMuamF2YQpAQCAtNTUsNyArNTUsNiBAQAogICBTdHJpbmcgaGVhZGluZ093bmVyKCk7CiAgIFN0cmluZyBoZWFkaW5nRGVzY3JpcHRpb24oKTsKICAgU3RyaW5nIGhlYWRpbmdQcm9qZWN0T3B0aW9ucygpOwotICBTdHJpbmcgaGVhZGluZ0dyb3VwVHlwZSgpOwogICBTdHJpbmcgaGVhZGluZ01lbWJlcnMoKTsKICAgU3RyaW5nIGhlYWRpbmdJbmNsdWRlZEdyb3VwcygpOwogICBTdHJpbmcgbm9NZW1iZXJzSW5mbygpOwpAQCAtNjUsMTkgKzY0LDE4IEBACiAgIFN0cmluZyBjb2x1bW5Qcm9qZWN0TmFtZSgpOwogICBTdHJpbmcgaGVhZGluZ0FncmVlbWVudHMoKTsKIAorICBTdHJpbmcgaGVhZGluZ1Byb2plY3RTdWJtaXRUeXBlKCk7CiAgIFN0cmluZyBwcm9qZWN0U3VibWl0VHlwZV9GQVNUX0ZPUldBUkRfT05MWSgpOwogICBTdHJpbmcgcHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfQUxXQVlTKCk7CiAgIFN0cmluZyBwcm9qZWN0U3VibWl0VHlwZV9NRVJHRV9JRl9ORUNFU1NBUlkoKTsKKyAgU3RyaW5nIHByb2plY3RTdWJtaXRUeXBlX1JFQkFTRV9JRl9ORUNFU1NBUlkoKTsKICAgU3RyaW5nIHByb2plY3RTdWJtaXRUeXBlX0NIRVJSWV9QSUNLKCk7CiAKKyAgU3RyaW5nIGhlYWRpbmdQcm9qZWN0U3RhdGUoKTsKICAgU3RyaW5nIHByb2plY3RTdGF0ZV9BQ1RJVkUoKTsKICAgU3RyaW5nIHByb2plY3RTdGF0ZV9SRUFEX09OTFkoKTsKICAgU3RyaW5nIHByb2plY3RTdGF0ZV9ISURERU4oKTsKIAotICBTdHJpbmcgZ3JvdXBUeXBlX1NZU1RFTSgpOwotICBTdHJpbmcgZ3JvdXBUeXBlX0lOVEVSTkFMKCk7Ci0gIFN0cmluZyBncm91cFR5cGVfTERBUCgpOwotCiAgIFN0cmluZyBjb2x1bW5NZW1iZXIoKTsKICAgU3RyaW5nIGNvbHVtbkVtYWlsQWRkcmVzcygpOwogICBTdHJpbmcgY29sdW1uR3JvdXBOYW1lKCk7CkBAIC05MywyMSArOTEsMjAgQEAKICAgU3RyaW5nIGJ1dHRvbkRlbGV0ZUJyYW5jaCgpOwogICBTdHJpbmcgYnJhbmNoRGVsZXRpb25PcGVuQ2hhbmdlcygpOwogCi0gIFN0cmluZyBncm91cExpc3RQcmV2KCk7Ci0gIFN0cmluZyBncm91cExpc3ROZXh0KCk7Ci0gIFN0cmluZyBncm91cExpc3RPcGVuKCk7CisgIFN0cmluZyBncm91cEl0ZW1IZWxwKCk7CiAKICAgU3RyaW5nIGdyb3VwTGlzdFRpdGxlKCk7CisgIFN0cmluZyBncm91cEZpbHRlcigpOwogICBTdHJpbmcgY3JlYXRlR3JvdXBUaXRsZSgpOwogICBTdHJpbmcgZ3JvdXBUYWJHZW5lcmFsKCk7CiAgIFN0cmluZyBncm91cFRhYk1lbWJlcnMoKTsKICAgU3RyaW5nIHByb2plY3RMaXN0VGl0bGUoKTsKKyAgU3RyaW5nIHByb2plY3RGaWx0ZXIoKTsKICAgU3RyaW5nIGNyZWF0ZVByb2plY3RUaXRsZSgpOwotICBTdHJpbmcgcHJvamVjdEFkbWluVGFiR2VuZXJhbCgpOwotICBTdHJpbmcgcHJvamVjdEFkbWluVGFiQnJhbmNoZXMoKTsKLSAgU3RyaW5nIHByb2plY3RBZG1pblRhYkFjY2VzcygpOworICBTdHJpbmcgcHJvamVjdExpc3RRdWVyeUxpbmsoKTsKIAogICBTdHJpbmcgcGx1Z2lucygpOworICBTdHJpbmcgcGx1Z2luRW5hYmxlZCgpOwogICBTdHJpbmcgcGx1Z2luRGlzYWJsZWQoKTsKIAogICBTdHJpbmcgY29sdW1uUGx1Z2luTmFtZSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0FkbWluQ29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMucHJvcGVydGllcwppbmRleCAzZmYzZjQzLi4xNjM3OTE5IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQWRtaW5Db25zdGFudHMucHJvcGVydGllcwpAQCAtMjIsOCArMjIsOCBAQAogcHJvamVjdFJlcG9Ccm93c2VyID0gUmVwb3NpdG9yeSBCcm93c2VyCiB1c2VDb250ZW50TWVyZ2UgPSBBdXRvbWF0aWNhbGx5IHJlc29sdmUgY29uZmxpY3RzCiB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSBSZXF1aXJlIGEgdmFsaWQgY29udHJpYnV0b3IgYWdyZWVtZW50IHRvIHVwbG9hZAotdXNlU2lnbmVkT2ZmQnkgPSBSZXF1aXJlIDxhIGhyZWY9Imh0dHA6Ly9nZXJyaXQuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3VtZW50YXRpb24vMi4wL3VzZXItc2lnbmVkb2ZmYnkuaHRtbCNTaWduZWQtb2ZmLWJ5IiB0YXJnZXQ9Il9ibGFuayI+PGNvZGU+U2lnbmVkLW9mZi1ieTwvY29kZT48L2E+IGluIGNvbW1pdCBtZXNzYWdlCi1yZXF1aXJlQ2hhbmdlSUQgPSBSZXF1aXJlIDxhIGhyZWY9Imh0dHA6Ly9nZXJyaXQuZ29vZ2xlY29kZS5jb20vc3ZuL2RvY3VtZW50YXRpb24vMi4wL3VzZXItY2hhbmdlaWQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPjxjb2RlPkNoYW5nZS1JZDwvY29kZT48L2E+IGluIGNvbW1pdCBtZXNzYWdlCit1c2VTaWduZWRPZmZCeSA9IFJlcXVpcmUgPGEgaHJlZj0iaHR0cDovL2dlcnJpdC1kb2N1bWVudGF0aW9uLmdvb2dsZWNvZGUuY29tL3N2bi9Eb2N1bWVudGF0aW9uLzIuNS91c2VyLXNpZ25lZG9mZmJ5Lmh0bWwjU2lnbmVkLW9mZi1ieSIgdGFyZ2V0PSJfYmxhbmsiPjxjb2RlPlNpZ25lZC1vZmYtYnk8L2NvZGU+PC9hPiBpbiBjb21taXQgbWVzc2FnZQorcmVxdWlyZUNoYW5nZUlEID0gUmVxdWlyZSA8YSBocmVmPSJodHRwOi8vZ2Vycml0LWRvY3VtZW50YXRpb24uZ29vZ2xlY29kZS5jb20vc3ZuL0RvY3VtZW50YXRpb24vMi41L3VzZXItY2hhbmdlaWQuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPjxjb2RlPkNoYW5nZS1JZDwvY29kZT48L2E+IGluIGNvbW1pdCBtZXNzYWdlCiBoZWFkaW5nR3JvdXBPcHRpb25zID0gR3JvdXAgT3B0aW9ucwogaXNWaXNpYmxlVG9BbGwgPSBNYWtlIGdyb3VwIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMuCiBidXR0b25TYXZlR3JvdXBPcHRpb25zID0gU2F2ZSBHcm91cCBPcHRpb25zCkBAIC0zNiw3ICszNiw2IEBACiBoZWFkaW5nT3duZXIgPSBPd25lcnMKIGhlYWRpbmdEZXNjcmlwdGlvbiA9IERlc2NyaXB0aW9uCiBoZWFkaW5nUHJvamVjdE9wdGlvbnMgPSBQcm9qZWN0IE9wdGlvbnMKLWhlYWRpbmdHcm91cFR5cGUgPSBHcm91cCBUeXBlCiBoZWFkaW5nTWVtYmVycyA9IE1lbWJlcnMKIGhlYWRpbmdJbmNsdWRlZEdyb3VwcyA9IEluY2x1ZGVkIEdyb3Vwcwogbm9NZW1iZXJzSW5mbyA9IEdyb3VwIE1lbWJlcnMgY2FuIG9ubHkgYmUgdmlld2VkIGZvciBHZXJyaXQgaW50ZXJuYWwgZ3JvdXBzLiBGb3IgZXh0ZXJuYWwgZ3JvdXBzIGFuZCBHZXJyaXQgc3lzdGVtIGdyb3VwcyB0aGUgbWVtYmVycyBjYW5ub3QgYmUgZGlzcGxheWVkLgpAQCAtNDQsMTkgKzQzLDE4IEBACiBoZWFkaW5nQ3JlYXRlR3JvdXAgPSBDcmVhdGUgTmV3IEdyb3VwCiBoZWFkaW5nQWdyZWVtZW50cyA9IENvbnRyaWJ1dG9yIEFncmVlbWVudHMKIAoraGVhZGluZ1Byb2plY3RTdWJtaXRUeXBlID0gU3VibWl0IFR5cGUKIHByb2plY3RTdWJtaXRUeXBlX0ZBU1RfRk9SV0FSRF9PTkxZID0gRmFzdCBGb3J3YXJkIE9ubHkKLXByb2plY3RTdWJtaXRUeXBlX01FUkdFX0lGX05FQ0VTU0FSWSA9IE1lcmdlIElmIE5lY2Vzc2FyeQorcHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfSUZfTkVDRVNTQVJZID0gTWVyZ2UgaWYgTmVjZXNzYXJ5Citwcm9qZWN0U3VibWl0VHlwZV9SRUJBU0VfSUZfTkVDRVNTQVJZID0gUmViYXNlIGlmIE5lY2Vzc2FyeQogcHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfQUxXQVlTID0gQWx3YXlzIE1lcmdlCiBwcm9qZWN0U3VibWl0VHlwZV9DSEVSUllfUElDSyA9IENoZXJyeSBQaWNrCiAKK2hlYWRpbmdQcm9qZWN0U3RhdGUgPSBTdGF0ZQogcHJvamVjdFN0YXRlX0FDVElWRSA9IEFjdGl2ZQogcHJvamVjdFN0YXRlX1JFQURfT05MWSA9IFJlYWQgT25seQogcHJvamVjdFN0YXRlX0hJRERFTiA9IEhpZGRlbgogCi1ncm91cFR5cGVfU1lTVEVNID0gU3lzdGVtIEdyb3VwCi1ncm91cFR5cGVfSU5URVJOQUwgPSBJbnRlcm5hbCBHcm91cAotZ3JvdXBUeXBlX0xEQVAgPSBMREFQIEdyb3VwCi0KIGNvbHVtbk1lbWJlciA9IE1lbWJlcgogY29sdW1uRW1haWxBZGRyZXNzID0gRW1haWwgQWRkcmVzcwogY29sdW1uR3JvdXBOYW1lID0gR3JvdXAgTmFtZQpAQCAtNzMsMjEgKzcxLDIwIEBACiBicmFuY2hEZWxldGlvbk9wZW5DaGFuZ2VzID0gVGhlIGZvbGxvd2luZyBicmFuY2hlcyB3ZXJlIG5vdCBkZWxldGVkIFwKIGJlY2F1c2UgdGhleSBoYXZlIG9wZW4gY2hhbmdlczoKIAotZ3JvdXBMaXN0UHJldiA9IFByZXZpb3VzIGdyb3VwCi1ncm91cExpc3ROZXh0ID0gTmV4dCBncm91cAotZ3JvdXBMaXN0T3BlbiA9IE9wZW4gZ3JvdXAKK2dyb3VwSXRlbUhlbHAgPSBncm91cAogCiBncm91cExpc3RUaXRsZSA9IEdyb3VwcworZ3JvdXBGaWx0ZXIgPSBGaWx0ZXIKIGNyZWF0ZUdyb3VwVGl0bGUgPSBDcmVhdGUgR3JvdXAKIGdyb3VwVGFiR2VuZXJhbCA9IEdlbmVyYWwKIGdyb3VwVGFiTWVtYmVycyA9IE1lbWJlcnMKIHByb2plY3RMaXN0VGl0bGUgPSBQcm9qZWN0cworcHJvamVjdEZpbHRlciA9IEZpbHRlcgogY3JlYXRlUHJvamVjdFRpdGxlID0gQ3JlYXRlIFByb2plY3QKLXByb2plY3RBZG1pblRhYkdlbmVyYWwgPSBHZW5lcmFsCi1wcm9qZWN0QWRtaW5UYWJCcmFuY2hlcyA9IEJyYW5jaGVzCi1wcm9qZWN0QWRtaW5UYWJBY2Nlc3MgPSBBY2Nlc3MKK3Byb2plY3RMaXN0UXVlcnlMaW5rID0gU2VhcmNoIGZvciBjaGFuZ2VzIG9uIHRoaXMgcHJvamVjdAogCiBwbHVnaW5zID0gUGx1Z2lucworcGx1Z2luRW5hYmxlZCA9IEVuYWJsZWQKIHBsdWdpbkRpc2FibGVkID0gRGlzYWJsZWQKIGNvbHVtblBsdWdpbk5hbWUgPSBQbHVnaW4gTmFtZQogY29sdW1uUGx1Z2luVmVyc2lvbiA9IFZlcnNpb24KQEAgLTEwNCwyOCArMTAxLDQxIEBACiBwZXJtaXNzaW9uTmFtZXMgPSBcCiAJYWJhbmRvbiwgXAogCWNyZWF0ZSwgXAorCWRlbGV0ZURyYWZ0cywgXAorCWVkaXRUb3BpY05hbWUsIFwKIAlmb3JnZUF1dGhvciwgXAogCWZvcmdlQ29tbWl0dGVyLCBcCiAJZm9yZ2VTZXJ2ZXJBc0NvbW1pdHRlciwgXAogCW93bmVyLCBcCisJcHVibGlzaERyYWZ0cywgXAogCXB1c2gsIFwKIAlwdXNoTWVyZ2UsIFwKIAlwdXNoVGFnLCBcCisJcHVzaFNpZ25lZFRhZywgXAogCXJlYWQsIFwKIAlyZWJhc2UsIFwKLQlzdWJtaXQKKwlyZW1vdmVSZXZpZXdlciwgXAorCXN1Ym1pdCwgXAorCXZpZXdEcmFmdHMKKwogYWJhbmRvbiA9IEFiYW5kb24KIGNyZWF0ZSA9IENyZWF0ZSBSZWZlcmVuY2UKK2RlbGV0ZURyYWZ0cyA9IERlbGV0ZSBEcmFmdHMKK2VkaXRUb3BpY05hbWUgPSBFZGl0IFRvcGljIE5hbWUKIGZvcmdlQXV0aG9yID0gRm9yZ2UgQXV0aG9yIElkZW50aXR5CiBmb3JnZUNvbW1pdHRlciA9IEZvcmdlIENvbW1pdHRlciBJZGVudGl0eQogZm9yZ2VTZXJ2ZXJBc0NvbW1pdHRlciA9IEZvcmdlIFNlcnZlciBJZGVudGl0eQogb3duZXIgPSBPd25lcgorcHVibGlzaERyYWZ0cyA9IFB1Ymxpc2ggRHJhZnRzCiBwdXNoID0gUHVzaAogcHVzaE1lcmdlID0gUHVzaCBNZXJnZSBDb21taXQKIHB1c2hUYWcgPSBQdXNoIEFubm90YXRlZCBUYWcKK3B1c2hTaWduZWRUYWcgPSBQdXNoIFNpZ25lZCBUYWcKIHJlYWQgPSBSZWFkCiByZWJhc2UgPSBSZWJhc2UKK3JlbW92ZVJldmlld2VyID0gUmVtb3ZlIFJldmlld2VyCiBzdWJtaXQgPSBTdWJtaXQKK3ZpZXdEcmFmdHMgPSBWaWV3IERyYWZ0cwogCiByZWZFcnJvckVtcHR5ID0gUmVmZXJlbmNlIG11c3QgYmUgc3VwcGxpZWQKIHJlZkVycm9yQmVnaW5TbGFzaCA9IFJlZmVyZW5jZSBtdXN0IG5vdCBzdGFydCB3aXRoICcvJwpAQCAtMTM2LDYgKzE0Niw3IEBACiAKICMgQ2FwYWJpbGl0eSBOYW1lcwogY2FwYWJpbGl0eU5hbWVzID0gXAorICBhY2Nlc3NEYXRhYmFzZSwgXAogICBhZG1pbmlzdHJhdGVTZXJ2ZXIsIFwKICAgY3JlYXRlQWNjb3VudCwgXAogICBjcmVhdGVHcm91cCwgXApAQCAtMTQ1LDExICsxNTYsMTMgQEAKICAga2lsbFRhc2ssIFwKICAgcHJpb3JpdHksIFwKICAgcXVlcnlMaW1pdCwgXAorICBydW5HQywgXAogICBzdGFydFJlcGxpY2F0aW9uLCBcCiAgIHZpZXdDYWNoZXMsIFwKICAgdmlld0Nvbm5lY3Rpb25zLCBcCiAgIHZpZXdRdWV1ZQotYWRtaW5pc3RyYXRlU2VydmVyID0gQWRtaW5pc3RyYXRlIFNlcnZlciAKK2FjY2Vzc0RhdGFiYXNlID0gQWNjZXNzIERhdGFiYXNlCithZG1pbmlzdHJhdGVTZXJ2ZXIgPSBBZG1pbmlzdHJhdGUgU2VydmVyCiBjcmVhdGVBY2NvdW50ID0gQ3JlYXRlIEFjY291bnQKIGNyZWF0ZUdyb3VwID0gQ3JlYXRlIEdyb3VwCiBjcmVhdGVQcm9qZWN0ID0gQ3JlYXRlIFByb2plY3QKQEAgLTE1OCw2ICsxNzEsNyBAQAoga2lsbFRhc2sgPSBLaWxsIFRhc2sKIHByaW9yaXR5ID0gUHJpb3JpdHkKIHF1ZXJ5TGltaXQgPSBRdWVyeSBMaW1pdAorcnVuR0MgPSBSdW4gR2FyYmFnZSBDb2xsZWN0aW9uCiBzdGFydFJlcGxpY2F0aW9uID0gU3RhcnQgUmVwbGljYXRpb24KIHZpZXdDYWNoZXMgPSBWaWV3IENhY2hlcwogdmlld0Nvbm5lY3Rpb25zID0gVmlldyBDb25uZWN0aW9ucwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0NyZWF0ZUdyb3VwU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlR3JvdXBTY3JlZW4uamF2YQppbmRleCA0NTc0YzZkLi42OWRmZjVjIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlR3JvdXBTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlR3JvdXBTY3JlZW4uamF2YQpAQCAtMjAsMTcgKzIwLDIxIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuTm90Rm91bmRTY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuQWNjb3VudENhcGFiaWxpdGllczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwQXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHMuR3JvdXBJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk9uRWRpdEVuYWJsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU21hbGxIZWFkaW5nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyLlNjaGVkdWxlZENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50Lkhpc3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlZlcnRpY2FsUGFuZWw7CkBAIC03Myw3ICs3NywyNCBAQAogICAgIGFkZFBhbmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmFkZFNzaEtleVBhbmVsKCkpOwogICAgIGFkZFBhbmVsLmFkZChuZXcgU21hbGxIZWFkaW5nKFV0aWwuQy5oZWFkaW5nQ3JlYXRlR3JvdXAoKSkpOwogCi0gICAgYWRkVHh0ID0gbmV3IE5wVGV4dEJveCgpOworICAgIGFkZFR4dCA9IG5ldyBOcFRleHRCb3goKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQnJvd3NlckV2ZW50KEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1cGVyLm9uQnJvd3NlckV2ZW50KGV2ZW50KTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFR5cGVJbnQoKSA9PSBFdmVudC5PTlBBU1RFKSB7CisgICAgICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICAgIGlmIChhZGRUeHQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGFkZE5ldy5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9OworICAgIGFkZFR4dC5zaW5rRXZlbnRzKEV2ZW50Lk9OUEFTVEUpOworCiAgICAgYWRkVHh0LnNldFZpc2libGVMZW5ndGgoNjApOwogICAgIGFkZFR4dC5hZGRLZXlQcmVzc0hhbmRsZXIobmV3IEtleVByZXNzSGFuZGxlcigpIHsKICAgICAgIEBPdmVycmlkZQpAQCAtMTA2LDkgKzEyNywxMCBAQAogICAgIH0KIAogICAgIGFkZE5ldy5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBVdGlsLkdST1VQX1NWQy5jcmVhdGVHcm91cChuZXdOYW1lLCBuZXcgR2Vycml0Q2FsbGJhY2s8QWNjb3VudEdyb3VwLklkPigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBBY2NvdW50R3JvdXAuSWQgcmVzdWx0KSB7Ci0gICAgICAgIEhpc3RvcnkubmV3SXRlbShEaXNwYXRjaGVyLnRvR3JvdXAocmVzdWx0LCBBY2NvdW50R3JvdXBTY3JlZW4uTUVNQkVSUykpOworICAgIEdyb3VwQXBpLmNyZWF0ZUdyb3VwKG5ld05hbWUsIG5ldyBHZXJyaXRDYWxsYmFjazxHcm91cEluZm8+KCkgeworICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEdyb3VwSW5mbyByZXN1bHQpIHsKKyAgICAgICAgSGlzdG9yeS5uZXdJdGVtKERpc3BhdGNoZXIudG9Hcm91cChyZXN1bHQuZ2V0R3JvdXBJZCgpLAorICAgICAgICAgICAgQWNjb3VudEdyb3VwU2NyZWVuLk1FTUJFUlMpKTsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlUHJvamVjdFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0NyZWF0ZVByb2plY3RTY3JlZW4uamF2YQppbmRleCBiNDk1MGQ4Li43NzQ5ZTljIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vQ3JlYXRlUHJvamVjdFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9DcmVhdGVQcm9qZWN0U2NyZWVuLmphdmEKQEAgLTIwLDIzICsyMCwzMSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5FcnJvckRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Ob3RGb3VuZFNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuVm9pZFJlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50Q2FwYWJpbGl0aWVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0QXBpOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucHJvamVjdHMuUHJvamVjdE1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IaW50VGV4dEJveDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuT25FZGl0RW5hYmxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdExpc3RQb3B1cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdE5hbWVTdWdnZXN0T3JhY2xlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Qcm9qZWN0c1RhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUHJvamVjdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlci5TY2hlZHVsZWRDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5IaXN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ2hlY2tCb3g7CkBAIC00NCw3ICs1Miw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU3VnZ2VzdEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogCiBwdWJsaWMgY2xhc3MgQ3JlYXRlUHJvamVjdFNjcmVlbiBleHRlbmRzIFNjcmVlbiB7CiAgIHByaXZhdGUgR3JpZCBncmlkOwpAQCAtNTIsNyArNTksNyBAQAogICBwcml2YXRlIEJ1dHRvbiBjcmVhdGU7CiAgIHByaXZhdGUgQnV0dG9uIGJyb3dzZTsKICAgcHJpdmF0ZSBIaW50VGV4dEJveCBwYXJlbnQ7Ci0gIHByaXZhdGUgU3VnZ2VzdEJveCBzdWdlc3RQYXJlbnQ7CisgIHByaXZhdGUgU3VnZ2VzdEJveCBzdWdnZXN0UGFyZW50OwogICBwcml2YXRlIENoZWNrQm94IGVtcHR5Q29tbWl0OwogICBwcml2YXRlIENoZWNrQm94IHBlcm1pc3Npb25zT25seTsKICAgcHJpdmF0ZSBQcm9qZWN0c1RhYmxlIHN1Z2dlc3RlZFBhcmVudHNUYWI7CkBAIC05NSw4ICsxMDIsOCBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1vdmVQb2ludGVyVG8oU3RyaW5nIHByb2plY3ROYW1lKSB7CiAgICAgICAgIC8vIHByZXZlbnQgdXNlciBpbnB1dCBmcm9tIGJlaW5nIG92ZXJ3cml0dGVuIGJ5IHNpbXBseSBwb3BpbmcgdXAKLSAgICAgICAgaWYgKCFwcm9qZWN0c1BvcHVwLmlzUG9waW5nVXAoKSB8fCAiIi5lcXVhbHMoc3VnZXN0UGFyZW50LmdldFRleHQoKSkpIHsKLSAgICAgICAgICBzdWdlc3RQYXJlbnQuc2V0VGV4dChwcm9qZWN0TmFtZSk7CisgICAgICAgIGlmICghcHJvamVjdHNQb3B1cC5pc1BvcHBpbmdVcCgpIHx8ICIiLmVxdWFscyhzdWdnZXN0UGFyZW50LmdldFRleHQoKSkpIHsKKyAgICAgICAgICBzdWdnZXN0UGFyZW50LnNldFRleHQocHJvamVjdE5hbWUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfTsKQEAgLTEwNyw4ICsxMTQsOCBAQAogICAgIGZpbmFsIFZlcnRpY2FsUGFuZWwgZnAgPSBuZXcgVmVydGljYWxQYW5lbCgpOwogICAgIGZwLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNyZWF0ZVByb2plY3RQYW5lbCgpKTsKIAotICAgIGluaXRDcmVhdGVUeHQoKTsKICAgICBpbml0Q3JlYXRlQnV0dG9uKCk7CisgICAgaW5pdENyZWF0ZVR4dCgpOwogICAgIGluaXRQYXJlbnRCb3goKTsKIAogICAgIGFkZEdyaWQoZnApOwpAQCAtMTI2LDIwICsxMzMsMzggQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCBpbml0Q3JlYXRlVHh0KCkgewotICAgIHByb2plY3QgPSBuZXcgTnBUZXh0Qm94KCk7CisgICAgcHJvamVjdCA9IG5ldyBOcFRleHRCb3goKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQnJvd3NlckV2ZW50KEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1cGVyLm9uQnJvd3NlckV2ZW50KGV2ZW50KTsKKyAgICAgICAgaWYgKGV2ZW50LmdldFR5cGVJbnQoKSA9PSBFdmVudC5PTlBBU1RFKSB7CisgICAgICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICAgIGlmIChwcm9qZWN0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjcmVhdGUuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgICBwcm9qZWN0LnNpbmtFdmVudHMoRXZlbnQuT05QQVNURSk7CiAgICAgcHJvamVjdC5zZXRWaXNpYmxlTGVuZ3RoKDUwKTsKICAgICBwcm9qZWN0LmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldENoYXJDb2RlKCkgPT0gS2V5Q29kZXMuS0VZX0VOVEVSKSB7CisgICAgICAgIGlmIChldmVudC5nZXROYXRpdmVFdmVudCgpLmdldEtleUNvZGUoKSA9PSBLZXlDb2Rlcy5LRVlfRU5URVIpIHsKICAgICAgICAgICBkb0NyZWF0ZVByb2plY3QoKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0pOworICAgIG5ldyBPbkVkaXRFbmFibGVyKGNyZWF0ZSwgcHJvamVjdCk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgaW5pdENyZWF0ZUJ1dHRvbigpIHsKICAgICBjcmVhdGUgPSBuZXcgQnV0dG9uKFV0aWwuQy5idXR0b25DcmVhdGVQcm9qZWN0KCkpOworICAgIGNyZWF0ZS5zZXRFbmFibGVkKGZhbHNlKTsKICAgICBjcmVhdGUuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgewpAQCAtMTY3LDcgKzE5Miw3IEBACiAKICAgcHJpdmF0ZSB2b2lkIGluaXRQYXJlbnRCb3goKSB7CiAgICAgcGFyZW50ID0gbmV3IEhpbnRUZXh0Qm94KCk7Ci0gICAgc3VnZXN0UGFyZW50ID0KKyAgICBzdWdnZXN0UGFyZW50ID0KICAgICAgICAgbmV3IFN1Z2dlc3RCb3gobmV3IFByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZSgpLCBwYXJlbnQpOwogICAgIHBhcmVudC5zZXRWaXNpYmxlTGVuZ3RoKDUwKTsKICAgfQpAQCAtMTg1LDcgKzIxMCw3IEBACiAKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIHN1Z2VzdFBhcmVudC5zZXRUZXh0KGdldFJvd0l0ZW0ocm93KS5uYW1lKCkpOworICAgICAgICAgICAgc3VnZ2VzdFBhcmVudC5zZXRUZXh0KGdldFJvd0l0ZW0ocm93KS5uYW1lKCkpOwogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKQEAgLTIxNSwxNCArMjQwLDE0IEBACiAgICAgZ3JpZC5zZXRUZXh0KDAsIDAsIFV0aWwuQy5jb2x1bW5Qcm9qZWN0TmFtZSgpICsgIjoiKTsKICAgICBncmlkLnNldFdpZGdldCgwLCAxLCBwcm9qZWN0KTsKICAgICBncmlkLnNldFRleHQoMSwgMCwgVXRpbC5DLmhlYWRpbmdQYXJlbnRQcm9qZWN0TmFtZSgpICsgIjoiKTsKLSAgICBncmlkLnNldFdpZGdldCgxLCAxLCBzdWdlc3RQYXJlbnQpOworICAgIGdyaWQuc2V0V2lkZ2V0KDEsIDEsIHN1Z2dlc3RQYXJlbnQpOwogICAgIGdyaWQuc2V0V2lkZ2V0KDEsIDIsIGJyb3dzZSk7CiAgICAgZnAuYWRkKGdyaWQpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvQ3JlYXRlUHJvamVjdCgpIHsKICAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldFRleHQoKS50cmltKCk7Ci0gICAgZmluYWwgU3RyaW5nIHBhcmVudE5hbWUgPSBzdWdlc3RQYXJlbnQuZ2V0VGV4dCgpLnRyaW0oKTsKKyAgICBmaW5hbCBTdHJpbmcgcGFyZW50TmFtZSA9IHN1Z2dlc3RQYXJlbnQuZ2V0VGV4dCgpLnRyaW0oKTsKIAogICAgIGlmICgiIi5lcXVhbHMocHJvamVjdE5hbWUpKSB7CiAgICAgICBwcm9qZWN0LnNldEZvY3VzKHRydWUpOwpAQCAtMjMwLDEzICsyNTUsMTMgQEAKICAgICB9CiAKICAgICBlbmFibGVGb3JtKGZhbHNlKTsKLSAgICBVdGlsLlBST0pFQ1RfU1ZDLmNyZWF0ZU5ld1Byb2plY3QocHJvamVjdE5hbWUsIHBhcmVudE5hbWUsCi0gICAgICAgIGVtcHR5Q29tbWl0LmdldFZhbHVlKCksIHBlcm1pc3Npb25zT25seS5nZXRWYWx1ZSgpLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CisgICAgUHJvamVjdEFwaS5jcmVhdGVQcm9qZWN0KHByb2plY3ROYW1lLCBwYXJlbnROYW1lLCBlbXB0eUNvbW1pdC5nZXRWYWx1ZSgpLAorICAgICAgICBwZXJtaXNzaW9uc09ubHkuZ2V0VmFsdWUoKSwgbmV3IEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CiAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFZvaWRSZXN1bHQgcmVzdWx0KSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZVdpdGhvdXRTdWZmaXggPSBQcm9qZWN0VXRpbC5zdHJpcEdpdFN1ZmZpeChwcm9qZWN0TmFtZSk7CiAgICAgICAgICAgICBIaXN0b3J5Lm5ld0l0ZW0oRGlzcGF0Y2hlci50b1Byb2plY3RBZG1pbihuZXcgUHJvamVjdC5OYW1lS2V5KAotICAgICAgICAgICAgICAgIHByb2plY3ROYW1lKSwgUHJvamVjdFNjcmVlbi5JTkZPKSk7CisgICAgICAgICAgICAgICAgbmFtZVdpdGhvdXRTdWZmaXgpLCBQcm9qZWN0U2NyZWVuLklORk8pKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cExpc3RTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cExpc3RTY3JlZW4uamF2YQppbmRleCAzMTU3ZDk3Li5kYWMwYjZhIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vR3JvdXBMaXN0U2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0dyb3VwTGlzdFNjcmVlbi5qYXZhCkBAIC0xNCwzNiArMTQsMTA3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRTY3JlZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cExpc3Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3MuQURNSU5fR1JPVVBTOwogCi1wdWJsaWMgY2xhc3MgR3JvdXBMaXN0U2NyZWVuIGV4dGVuZHMgQWNjb3VudFNjcmVlbiB7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzLkdyb3VwTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRTY3JlZW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZpbHRlcmVkVXNlckludGVyZmFjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSWdub3JlT3V0ZGF0ZWRGaWx0ZXJSZXN1bHRzQ2FsbGJhY2tXcmFwcGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlVcEV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5VXBIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Ib3Jpem9udGFsUGFuZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGFiZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lk5wVGV4dEJveDsKKworcHVibGljIGNsYXNzIEdyb3VwTGlzdFNjcmVlbiBleHRlbmRzIEFjY291bnRTY3JlZW4gaW1wbGVtZW50cyBGaWx0ZXJlZFVzZXJJbnRlcmZhY2UgewogICBwcml2YXRlIEdyb3VwVGFibGUgZ3JvdXBzOworICBwcml2YXRlIE5wVGV4dEJveCBmaWx0ZXJUeHQ7CisgIHByaXZhdGUgU3RyaW5nIHN1Ym5hbWU7CisKKyAgcHVibGljIEdyb3VwTGlzdFNjcmVlbigpIHsKKyAgfQorCisgIHB1YmxpYyBHcm91cExpc3RTY3JlZW4oU3RyaW5nIHBhcmFtcykgeworICAgIGZvciAoU3RyaW5nIGt2UGFpciA6IHBhcmFtcy5zcGxpdCgiWyw7Jl0iKSkgeworICAgICAgU3RyaW5nW10ga3YgPSBrdlBhaXIuc3BsaXQoIj0iLCAyKTsKKyAgICAgIGlmIChrdi5sZW5ndGggIT0gMiB8fCBrdlswXS5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmICgiZmlsdGVyIi5lcXVhbHMoa3ZbMF0pKSB7CisgICAgICAgIHN1Ym5hbWUgPSBVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMV0pOworICAgICAgfQorICAgIH0KKyAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CiAgICAgc3VwZXIub25Mb2FkKCk7Ci0gICAgVXRpbC5HUk9VUF9TVkMKLSAgICAgICAgLnZpc2libGVHcm91cHMobmV3IFNjcmVlbkxvYWRDYWxsYmFjazxHcm91cExpc3Q+KHRoaXMpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KEdyb3VwTGlzdCByZXN1bHQpIHsKLSAgICAgICAgICAgIGdyb3Vwcy5kaXNwbGF5KHJlc3VsdC5nZXRHcm91cHMoKSk7Ci0gICAgICAgICAgICBncm91cHMuZmluaXNoRGlzcGxheSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgZGlzcGxheSgpOworICAgIHJlZnJlc2goKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWZyZXNoKCkgeworICAgIHNldFRva2VuKHN1Ym5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHMoc3VibmFtZSkgPyBBRE1JTl9HUk9VUFMKKyAgICAgICAgOiBBRE1JTl9HUk9VUFMgKyAiP2ZpbHRlcj0iICsgVVJMLmVuY29kZVF1ZXJ5U3RyaW5nKHN1Ym5hbWUpKTsKKyAgICBHcm91cE1hcC5tYXRjaChzdWJuYW1lLAorICAgICAgICBuZXcgSWdub3JlT3V0ZGF0ZWRGaWx0ZXJSZXN1bHRzQ2FsbGJhY2tXcmFwcGVyPEdyb3VwTWFwPih0aGlzLAorICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEdyb3VwTWFwPigpIHsKKyAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhHcm91cE1hcCByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBncm91cHMuZGlzcGxheShyZXN1bHQsIHN1Ym5hbWUpOworICAgICAgICAgICAgICAgIGdyb3Vwcy5maW5pc2hEaXNwbGF5KCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRGaWx0ZXIoKSB7CisgICAgcmV0dXJuIHN1Ym5hbWU7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Jbml0VUkoKSB7CiAgICAgc3VwZXIub25Jbml0VUkoKTsKICAgICBzZXRQYWdlVGl0bGUoVXRpbC5DLmdyb3VwTGlzdFRpdGxlKCkpOworICAgIGluaXRQYWdlSGVhZGVyKCk7CiAKLSAgICBncm91cHMgPSBuZXcgR3JvdXBUYWJsZSh0cnVlIC8qIGh5cGVybGluayB0byBhZG1pbiAqLywgUGFnZUxpbmtzLkFETUlOX0dST1VQUyk7CisgICAgZ3JvdXBzID0gbmV3IEdyb3VwVGFibGUoUGFnZUxpbmtzLkFETUlOX0dST1VQUyk7CiAgICAgYWRkKGdyb3Vwcyk7CiAgIH0KIAorICBwcml2YXRlIHZvaWQgaW5pdFBhZ2VIZWFkZXIoKSB7CisgICAgZmluYWwgSG9yaXpvbnRhbFBhbmVsIGhwID0gbmV3IEhvcml6b250YWxQYW5lbCgpOworICAgIGhwLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnByb2plY3RGaWx0ZXJQYW5lbCgpKTsKKyAgICBmaW5hbCBMYWJlbCBmaWx0ZXJMYWJlbCA9IG5ldyBMYWJlbChVdGlsLkMucHJvamVjdEZpbHRlcigpKTsKKyAgICBmaWx0ZXJMYWJlbC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wcm9qZWN0RmlsdGVyTGFiZWwoKSk7CisgICAgaHAuYWRkKGZpbHRlckxhYmVsKTsKKyAgICBmaWx0ZXJUeHQgPSBuZXcgTnBUZXh0Qm94KCk7CisgICAgZmlsdGVyVHh0LnNldFZhbHVlKHN1Ym5hbWUpOworICAgIGZpbHRlclR4dC5hZGRLZXlVcEhhbmRsZXIobmV3IEtleVVwSGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25LZXlVcChLZXlVcEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1Ym5hbWUgPSBmaWx0ZXJUeHQuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmVmcmVzaCgpOworICAgICAgfQorICAgIH0pOworICAgIGhwLmFkZChmaWx0ZXJUeHQpOworICAgIGFkZChocCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TaG93VmlldygpIHsKKyAgICBzdXBlci5vblNob3dWaWV3KCk7CisgICAgaWYgKHN1Ym5hbWUgIT0gbnVsbCkgeworICAgICAgZmlsdGVyVHh0LnNldEN1cnNvclBvcyhzdWJuYW1lLmxlbmd0aCgpKTsKKyAgICB9CisgICAgZmlsdGVyVHh0LnNldEZvY3VzKHRydWUpOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyS2V5cygpIHsKICAgICBzdXBlci5yZWdpc3RlcktleXMoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cFRhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vR3JvdXBUYWJsZS5qYXZhCmluZGV4IDY4MTg4NDEuLjc2YTBjZmIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Hcm91cFRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL0dyb3VwVGFibGUuamF2YQpAQCAtMTQsNDQgKzE0LDQ1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5VdGlsLkM7CisKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRGlzcGF0Y2hlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cExpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3Vwcy5Hcm91cE1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuTmF2aWdhdGlvblRhYmxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5IaXN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbGV4VGFibGUuRmxleENlbGxGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIAotcHVibGljIGNsYXNzIEdyb3VwVGFibGUgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8QWNjb3VudEdyb3VwPiB7CitwdWJsaWMgY2xhc3MgR3JvdXBUYWJsZSBleHRlbmRzIE5hdmlnYXRpb25UYWJsZTxHcm91cEluZm8+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9DT0xTID0gMzsKIAotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZW5hYmxlTGluazsKLQotICBwdWJsaWMgR3JvdXBUYWJsZShmaW5hbCBib29sZWFuIGVuYWJsZUxpbmspIHsKLSAgICB0aGlzKGVuYWJsZUxpbmssIG51bGwpOworICBwdWJsaWMgR3JvdXBUYWJsZSgpIHsKKyAgICB0aGlzKG51bGwpOwogICB9CiAKLSAgcHVibGljIEdyb3VwVGFibGUoZmluYWwgYm9vbGVhbiBlbmFibGVMaW5rLCBmaW5hbCBTdHJpbmcgcG9pbnRlcklkKSB7Ci0gICAgdGhpcy5lbmFibGVMaW5rID0gZW5hYmxlTGluazsKLQorICBwdWJsaWMgR3JvdXBUYWJsZShmaW5hbCBTdHJpbmcgcG9pbnRlcklkKSB7CisgICAgc3VwZXIoQy5ncm91cEl0ZW1IZWxwKCkpOwogICAgIHNldFNhdmVQb2ludGVySWQocG9pbnRlcklkKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IFByZXZLZXlDb21tYW5kKDAsICdrJywgVXRpbC5DLmdyb3VwTGlzdFByZXYoKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgTmV4dEtleUNvbW1hbmQoMCwgJ2onLCBVdGlsLkMuZ3JvdXBMaXN0TmV4dCgpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBPcGVuS2V5Q29tbWFuZCgwLCAnbycsIFV0aWwuQy5ncm91cExpc3RPcGVuKCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsIEtleUNvZGVzLktFWV9FTlRFUiwgVXRpbC5DCi0gICAgICAgIC5ncm91cExpc3RPcGVuKCkpKTsKIAotICAgIHRhYmxlLnNldFRleHQoMCwgMSwgVXRpbC5DLmNvbHVtbkdyb3VwTmFtZSgpKTsKLSAgICB0YWJsZS5zZXRUZXh0KDAsIDIsIFV0aWwuQy5jb2x1bW5Hcm91cERlc2NyaXB0aW9uKCkpOwotICAgIHRhYmxlLnNldFRleHQoMCwgMywgVXRpbC5DLmNvbHVtbkdyb3VwVmlzaWJsZVRvQWxsKCkpOworICAgIHRhYmxlLnNldFRleHQoMCwgMSwgQy5jb2x1bW5Hcm91cE5hbWUoKSk7CisgICAgdGFibGUuc2V0VGV4dCgwLCAyLCBDLmNvbHVtbkdyb3VwRGVzY3JpcHRpb24oKSk7CisgICAgdGFibGUuc2V0VGV4dCgwLCAzLCBDLmNvbHVtbkdyb3VwVmlzaWJsZVRvQWxsKCkpOwogICAgIHRhYmxlLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKQEAgLTcwLDM2ICs3MSw1NyBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBPYmplY3QgZ2V0Um93SXRlbUtleShmaW5hbCBBY2NvdW50R3JvdXAgaXRlbSkgewotICAgIHJldHVybiBpdGVtLmdldElkKCk7CisgIHByb3RlY3RlZCBPYmplY3QgZ2V0Um93SXRlbUtleShmaW5hbCBHcm91cEluZm8gaXRlbSkgeworICAgIHJldHVybiBpdGVtLmdldEdyb3VwSWQoKTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbk9wZW5Sb3coZmluYWwgaW50IHJvdykgewotICAgIEhpc3RvcnkubmV3SXRlbShEaXNwYXRjaGVyLnRvR3JvdXAoZ2V0Um93SXRlbShyb3cpLmdldElkKCkpKTsKKyAgICBIaXN0b3J5Lm5ld0l0ZW0oRGlzcGF0Y2hlci50b0dyb3VwKGdldFJvd0l0ZW0ocm93KS5nZXRHcm91cElkKCkpKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgTGlzdDxBY2NvdW50R3JvdXA+IHJlc3VsdCkgeworICBwdWJsaWMgdm9pZCBkaXNwbGF5KEdyb3VwTWFwIGdyb3VwcywgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CisgICAgZGlzcGxheShOYXRpdmVzLmFzTGlzdChncm91cHMudmFsdWVzKCkpLCB0b0hpZ2hsaWdodCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBkaXNwbGF5KEdyb3VwTGlzdCBncm91cHMpIHsKKyAgICBkaXNwbGF5KE5hdGl2ZXMuYXNMaXN0KGdyb3VwcyksIG51bGwpOworICB9CisKKyAgcHVibGljIHZvaWQgZGlzcGxheShMaXN0PEdyb3VwSW5mbz4gbGlzdCwgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CiAgICAgd2hpbGUgKDEgPCB0YWJsZS5nZXRSb3dDb3VudCgpKQogICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKIAotICAgIGZvcihBY2NvdW50R3JvdXAgZ3JvdXAgOiByZXN1bHQpIHsKKyAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yPEdyb3VwSW5mbz4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShHcm91cEluZm8gYSwgR3JvdXBJbmZvIGIpIHsKKyAgICAgICAgcmV0dXJuIGEubmFtZSgpLmNvbXBhcmVUbyhiLm5hbWUoKSk7CisgICAgICB9CisgICAgfSk7CisgICAgZm9yKEdyb3VwSW5mbyBncm91cCA6IGxpc3QpIHsKICAgICAgIGZpbmFsIGludCByb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgdGFibGUuaW5zZXJ0Um93KHJvdyk7CiAgICAgICBhcHBseURhdGFSb3dTdHlsZShyb3cpOwotICAgICAgcG9wdWxhdGUocm93LCBncm91cCk7CisgICAgICBwb3B1bGF0ZShyb3csIGdyb3VwLCB0b0hpZ2hsaWdodCk7CiAgICAgfQogICB9CiAKLSAgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBBY2NvdW50R3JvdXAgaykgewotICAgIGlmIChlbmFibGVMaW5rKSB7Ci0gICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAxLCBuZXcgSHlwZXJsaW5rKGsuZ2V0TmFtZSgpLAotICAgICAgICAgIERpc3BhdGNoZXIudG9Hcm91cChrLmdldElkKCkpKSk7CisgIHZvaWQgcG9wdWxhdGUoZmluYWwgaW50IHJvdywgZmluYWwgR3JvdXBJbmZvIGssIGZpbmFsIFN0cmluZyB0b0hpZ2hsaWdodCkgeworICAgIGlmIChrLnVybCgpICE9IG51bGwpIHsKKyAgICAgIGlmIChrLnVybCgpLnN0YXJ0c1dpdGgoIiMiICsgUGFnZUxpbmtzLkFETUlOX0dST1VQUykpIHsKKyAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgMSwgbmV3IEhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluayhrLm5hbWUoKSwKKyAgICAgICAgICAgIERpc3BhdGNoZXIudG9Hcm91cChrLmdldEdyb3VwSWQoKSksIHRvSGlnaGxpZ2h0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBbmNob3IgbGluayA9IG5ldyBBbmNob3IoKTsKKyAgICAgICAgbGluay5zZXRIVE1MKFV0aWwuaGlnaGxpZ2h0KGsubmFtZSgpLCB0b0hpZ2hsaWdodCkpOworICAgICAgICBsaW5rLnNldEhyZWYoay51cmwoKSk7CisgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsIGxpbmspOworICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMSwgay5nZXROYW1lKCkpOworICAgICAgdGFibGUuc2V0SFRNTChyb3csIDEsIFV0aWwuaGlnaGxpZ2h0KGsubmFtZSgpLCB0b0hpZ2hsaWdodCkpOwogICAgIH0KLSAgICB0YWJsZS5zZXRUZXh0KHJvdywgMiwgay5nZXREZXNjcmlwdGlvbigpKTsKLSAgICBpZiAoay5pc1Zpc2libGVUb0FsbCgpKSB7CisgICAgdGFibGUuc2V0VGV4dChyb3csIDIsIGsuZGVzY3JpcHRpb24oKSk7CisgICAgaWYgKGsub3B0aW9ucygpLmlzVmlzaWJsZVRvQWxsKCkpIHsKICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDMsIG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmdyZWVuQ2hlY2soKSkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Blcm1pc3Npb25FZGl0b3IuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9QZXJtaXNzaW9uRWRpdG9yLmphdmEKaW5kZXggMmM0MzIzMy4uOTg0OGMxOCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Blcm1pc3Npb25FZGl0b3IuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvbkVkaXRvci5qYXZhCkBAIC0xNCwxMyArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW47CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlN1Z2dlc3RVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7CkBAIC0xMDIsMTYgKzEwMiwxOSBAQAogICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZTsKICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlYWRPbmx5OwogICBwcml2YXRlIGZpbmFsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXM7CiAgIHByaXZhdGUgUGVybWlzc2lvbiB2YWx1ZTsKICAgcHJpdmF0ZSBQZXJtaXNzaW9uUmFuZ2UuV2l0aERlZmF1bHRzIHZhbGlkUmFuZ2U7CiAgIHByaXZhdGUgYm9vbGVhbiBpc0RlbGV0ZWQ7CiAKICAgcHVibGljIFBlcm1pc3Npb25FZGl0b3IoUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lLAogICAgICAgYm9vbGVhbiByZWFkT25seSwKLSAgICAgIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICAgICAgQWNjZXNzU2VjdGlvbiBzZWN0aW9uLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB7CiAgICAgdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OwogICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247CiAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOworICAgIHRoaXMubGFiZWxUeXBlcyA9IGxhYmVsVHlwZXM7CiAKICAgICBub3JtYWxOYW1lID0gbmV3IFZhbHVlTGFiZWw8U3RyaW5nPihQZXJtaXNzaW9uTmFtZVJlbmRlcmVyLklOU1RBTkNFKTsKICAgICBkZWxldGVkTmFtZSA9IG5ldyBWYWx1ZUxhYmVsPFN0cmluZz4oUGVybWlzc2lvbk5hbWVSZW5kZXJlci5JTlNUQU5DRSk7CkBAIC0yNjAsMTIgKzI2MywxMiBAQAogICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKIAogICAgIGlmICh2YWx1ZS5pc0xhYmVsKCkpIHsKLSAgICAgIEFwcHJvdmFsVHlwZSBhdCA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRBcHByb3ZhbFR5cGVzKCkuYnlMYWJlbCh2YWx1ZS5nZXRMYWJlbCgpKTsKLSAgICAgIGlmIChhdCAhPSBudWxsKSB7CisgICAgICBMYWJlbFR5cGUgbHQgPSBsYWJlbFR5cGVzLmJ5TGFiZWwodmFsdWUuZ2V0TGFiZWwoKSk7CisgICAgICBpZiAobHQgIT0gbnVsbCkgewogICAgICAgICB2YWxpZFJhbmdlID0gbmV3IFBlcm1pc3Npb25SYW5nZS5XaXRoRGVmYXVsdHMoCiAgICAgICAgICAgICB2YWx1ZS5nZXROYW1lKCksCi0gICAgICAgICAgICBhdC5nZXRNaW4oKS5nZXRWYWx1ZSgpLCBhdC5nZXRNYXgoKS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgYXQuZ2V0TWluKCkuZ2V0VmFsdWUoKSwgYXQuZ2V0TWF4KCkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBsdC5nZXRNaW4oKS5nZXRWYWx1ZSgpLCBsdC5nZXRNYXgoKS5nZXRWYWx1ZSgpLAorICAgICAgICAgICAgbHQuZ2V0TWluKCkuZ2V0VmFsdWUoKSwgbHQuZ2V0TWF4KCkuZ2V0VmFsdWUoKSk7CiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChHbG9iYWxDYXBhYmlsaXR5LmlzQ2FwYWJpbGl0eSh2YWx1ZS5nZXROYW1lKCkpKSB7CiAgICAgICB2YWxpZFJhbmdlID0gR2xvYmFsQ2FwYWJpbGl0eS5nZXRSYW5nZSh2YWx1ZS5nZXROYW1lKCkpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Blcm1pc3Npb25SdWxlRWRpdG9yLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvblJ1bGVFZGl0b3IuamF2YQppbmRleCA1ZGQ4YjNjLi4wYzI2MjljIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvblJ1bGVFZGl0b3IuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGVybWlzc2lvblJ1bGVFZGl0b3IuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbjsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLkVESVRfVE9QSUNfTkFNRTsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbi5QVVNIOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLlBVU0hfVEFHOwogCkBAIC0xMzcsOCArMTM4LDExIEBACiAgICAgaWYgKGNhbkZvcmNlKSB7CiAgICAgICBTdHJpbmcgcmVmID0gc2VjdGlvbi5nZXROYW1lKCk7CiAgICAgICBjYW5Gb3JjZSA9ICFyZWYuc3RhcnRzV2l0aCgicmVmcy9mb3IvIikgJiYgIXJlZi5zdGFydHNXaXRoKCJecmVmcy9mb3IvIik7CisgICAgICBmb3JjZS5zZXRUZXh0KFBlcm1pc3Npb25SdWxlLkZPUkNFX1BVU0gpOworICAgIH0gZWxzZSB7CisgICAgICBjYW5Gb3JjZSA9IEVESVRfVE9QSUNfTkFNRS5lcXVhbHMobmFtZSk7CisgICAgICBmb3JjZS5zZXRUZXh0KFBlcm1pc3Npb25SdWxlLkZPUkNFX0VESVQpOwogICAgIH0KLSAgICBmb3JjZS5zZXRUZXh0KFBlcm1pc3Npb25SdWxlLkZPUkNFX1BVU0gpOwogICAgIGZvcmNlLnNldFZpc2libGUoY2FuRm9yY2UpOwogICAgIGZvcmNlLnNldEVuYWJsZWQoIXJlYWRPbmx5KTsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1BsdWdpbkxpc3RTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9QbHVnaW5MaXN0U2NyZWVuLmphdmEKaW5kZXggMzk0OGIzNS4uOWU0YjgxYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1BsdWdpbkxpc3RTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUGx1Z2luTGlzdFNjcmVlbi5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGx1Z2lucy5QbHVnaW5JbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wbHVnaW5zLlBsdWdpbk1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkZhbmN5RmxleFRhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKQEAgLTczLDcgKzc0LDcgQEAKICAgICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKICAgICAgIH0KIAotICAgICAgZm9yIChmaW5hbCBQbHVnaW5JbmZvIHAgOiBwbHVnaW5zLnZhbHVlcygpLmFzTGlzdCgpKSB7CisgICAgICBmb3IgKGZpbmFsIFBsdWdpbkluZm8gcCA6IE5hdGl2ZXMuYXNMaXN0KHBsdWdpbnMudmFsdWVzKCkpKSB7CiAgICAgICAgIGZpbmFsIGludCByb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgICB0YWJsZS5pbnNlcnRSb3cocm93KTsKICAgICAgICAgYXBwbHlEYXRhUm93U3R5bGUocm93KTsKQEAgLTkyLDkgKzkzLDggQEAKICAgICAgICAgICAgICAgICArIHBsdWdpbi5uYW1lKCkgKyAiLyIpKSk7CiAgICAgICB9CiAgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMiwgcGx1Z2luLnZlcnNpb24oKSk7Ci0gICAgICBpZiAocGx1Z2luLmlzRGlzYWJsZWQoKSkgewotICAgICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMywgVXRpbC5DLnBsdWdpbkRpc2FibGVkKCkpOwotICAgICAgfQorICAgICAgdGFibGUuc2V0VGV4dChyb3csIDMsIHBsdWdpbi5pc0Rpc2FibGVkKCkgPyBVdGlsLkMucGx1Z2luRGlzYWJsZWQoKQorICAgICAgICAgIDogVXRpbC5DLnBsdWdpbkVuYWJsZWQoKSk7CiAKICAgICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QWNjZXNzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEFjY2Vzc1NjcmVlbi5qYXZhCmluZGV4IDQ0MDNjZTYuLjk2ODI0ZjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QWNjZXNzU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RBY2Nlc3NTY3JlZW4uamF2YQpAQCAtMTQsNiArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbjsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUHJvamVjdEFjY2Vzc1V0aWwubWVyZ2VTZWN0aW9uczsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlByb2plY3RBY2Nlc3NVdGlsLnJlbW92ZUVtcHR5UGVybWlzc2lvbnNBbmRTZWN0aW9uczsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlNjcmVlbkxvYWRDYWxsYmFjazsKQEAgLTM5LDYgKzQyLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgUHJvamVjdEFjY2Vzc1NjcmVlbiBleHRlbmRzIFByb2plY3RTY3JlZW4gewpAQCAtMTEwLDYgKzExNCw3IEBACiAgICAgICAgICAgICBkaXNwbGF5UmVhZE9ubHkoYWNjZXNzKTsKICAgICAgICAgICB9CiAgICAgICAgIH0pOworICAgIHNhdmVkUGFuZWwgPSBBQ0NFU1M7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZGlzcGxheVJlYWRPbmx5KFByb2plY3RBY2Nlc3MgYWNjZXNzKSB7CkBAIC0xOTQsMTIgKzE5OSwxNCBAQAogCiAgICAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBnZXREaWZmcyhQcm9qZWN0QWNjZXNzIHdhbnRlZEFjY2VzcywKICAgICAgICAgICAgICAgUHJvamVjdEFjY2VzcyBuZXdBY2Nlc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QWNjZXNzU2VjdGlvbj4gd2FudGVkU2VjdGlvbnMgPQorICAgICAgICAgICAgICAgIG1lcmdlU2VjdGlvbnMocmVtb3ZlRW1wdHlQZXJtaXNzaW9uc0FuZFNlY3Rpb25zKHdhbnRlZEFjY2Vzcy5nZXRMb2NhbCgpKSk7CiAgICAgICAgICAgICBmaW5hbCBIYXNoU2V0PEFjY2Vzc1NlY3Rpb24+IHNhbWUgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PEFjY2Vzc1NlY3Rpb24+KHdhbnRlZEFjY2Vzcy5nZXRMb2NhbCgpKTsKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxBY2Nlc3NTZWN0aW9uPih3YW50ZWRTZWN0aW9ucyk7CiAgICAgICAgICAgICBmaW5hbCBIYXNoU2V0PEFjY2Vzc1NlY3Rpb24+IGRpZmZlcmVudCA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjZXNzU2VjdGlvbj4od2FudGVkQWNjZXNzLmdldExvY2FsKCkuc2l6ZSgpCisgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8QWNjZXNzU2VjdGlvbj4od2FudGVkU2VjdGlvbnMuc2l6ZSgpCiAgICAgICAgICAgICAgICAgICAgICsgbmV3QWNjZXNzLmdldExvY2FsKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGRpZmZlcmVudC5hZGRBbGwod2FudGVkQWNjZXNzLmdldExvY2FsKCkpOworICAgICAgICAgICAgZGlmZmVyZW50LmFkZEFsbCh3YW50ZWRTZWN0aW9ucyk7CiAgICAgICAgICAgICBkaWZmZXJlbnQuYWRkQWxsKG5ld0FjY2Vzcy5nZXRMb2NhbCgpKTsKICAgICAgICAgICAgIHNhbWUucmV0YWluQWxsKG5ld0FjY2Vzcy5nZXRMb2NhbCgpKTsKICAgICAgICAgICAgIGRpZmZlcmVudC5yZW1vdmVBbGwoc2FtZSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEFjY2Vzc1NjcmVlbi51aS54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEFjY2Vzc1NjcmVlbi51aS54bWwKaW5kZXggYTY2NDE5MS4uYWIyNmJhOCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RBY2Nlc3NTY3JlZW4udWkueG1sCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QWNjZXNzU2NyZWVuLnVpLnhtbApAQCAtODMsNiArODMsNSBAQAogICAgICAgPHVpOmF0dHJpYnV0ZSBuYW1lPSd0ZXh0Jy8+CiAgICAgPC9nOkJ1dHRvbj4KICAgPC9kaXY+Ci0gIDxkaXYgc3R5bGU9J3dpZHRoOiAzNWVtOyB2aXNpYmlsaXR5OiBoaWRkZW47JyAvPgogPC9nOkhUTUxQYW5lbD4KIDwvdWk6VWlCaW5kZXI+CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEJyYW5jaGVzU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdEJyYW5jaGVzU2NyZWVuLmphdmEKaW5kZXggNTZkOTQxNy4uYTdjNmEyMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RCcmFuY2hlc1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0QnJhbmNoZXNTY3JlZW4uamF2YQpAQCAtMjQsOSArMjQsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5CcmFuY2hMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5GYW5jeUZsZXhUYWJsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSGludFRleHRCb3g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWRkQnJhbmNoUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxpc3RCcmFuY2hlc1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkludmFsaWROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuSW52YWxpZFJldmlzaW9uRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKQEAgLTQ0LDkgKzQzLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5UZXh0Qm94OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlZlcnRpY2FsUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWxCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuUmVtb3RlSnNvbkV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtODcsNiArODYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfSk7CisgICAgc2F2ZWRQYW5lbCA9IEJSQU5DSDsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBkaXNwbGF5KGZpbmFsIExpc3Q8QnJhbmNoPiBsaXN0QnJhbmNoZXMpIHsKQEAgLTEwNiwxMiArMTA2LDEzIEBACiAgICAgc3VwZXIub25Jbml0VUkoKTsKIAogICAgIGFkZFBhbmVsID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGFkZFBhbmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmFkZFNzaEtleVBhbmVsKCkpOwogCiAgICAgZmluYWwgR3JpZCBhZGRHcmlkID0gbmV3IEdyaWQoMiwgMik7CisgICAgYWRkR3JpZC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hZGRCcmFuY2goKSk7CisgICAgZmluYWwgaW50IHRleEJveExlbmd0aCA9IDUwOwogCiAgICAgbmFtZVR4dEJveCA9IG5ldyBIaW50VGV4dEJveCgpOwotICAgIG5hbWVUeHRCb3guc2V0VmlzaWJsZUxlbmd0aCg1MCk7CisgICAgbmFtZVR4dEJveC5zZXRWaXNpYmxlTGVuZ3RoKHRleEJveExlbmd0aCk7CiAgICAgbmFtZVR4dEJveC5zZXRIaW50VGV4dChVdGlsLkMuZGVmYXVsdEJyYW5jaE5hbWUoKSk7CiAgICAgbmFtZVR4dEJveC5hZGRLZXlQcmVzc0hhbmRsZXIobmV3IEtleVByZXNzSGFuZGxlcigpIHsKICAgICAgIEBPdmVycmlkZQpAQCAtMTI1LDcgKzEyNiw3IEBACiAgICAgYWRkR3JpZC5zZXRXaWRnZXQoMCwgMSwgbmFtZVR4dEJveCk7CiAKICAgICBpcmV2VHh0Qm94ID0gbmV3IEhpbnRUZXh0Qm94KCk7Ci0gICAgaXJldlR4dEJveC5zZXRWaXNpYmxlTGVuZ3RoKDUwKTsKKyAgICBpcmV2VHh0Qm94LnNldFZpc2libGVMZW5ndGgodGV4Qm94TGVuZ3RoKTsKICAgICBpcmV2VHh0Qm94LnNldEhpbnRUZXh0KFV0aWwuQy5kZWZhdWx0UmV2aXNpb25TcGVjKCkpOwogICAgIGlyZXZUeHRCb3guYWRkS2V5UHJlc3NIYW5kbGVyKG5ldyBLZXlQcmVzc0hhbmRsZXIoKSB7CiAgICAgICBAT3ZlcnJpZGUKQEAgLTE2NCwxMyArMTY1LDEzIEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9BZGROZXdCcmFuY2goKSB7Ci0gICAgU3RyaW5nIGJyYW5jaE5hbWUgPSBuYW1lVHh0Qm94LmdldFRleHQoKTsKKyAgICBmaW5hbCBTdHJpbmcgYnJhbmNoTmFtZSA9IG5hbWVUeHRCb3guZ2V0VGV4dCgpOwogICAgIGlmICgiIi5lcXVhbHMoYnJhbmNoTmFtZSkpIHsKICAgICAgIG5hbWVUeHRCb3guc2V0Rm9jdXModHJ1ZSk7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgU3RyaW5nIHJldiA9IGlyZXZUeHRCb3guZ2V0VGV4dCgpOworICAgIGZpbmFsIFN0cmluZyByZXYgPSBpcmV2VHh0Qm94LmdldFRleHQoKTsKICAgICBpZiAoIiIuZXF1YWxzKHJldikpIHsKICAgICAgIGlyZXZUeHRCb3guc2V0VGV4dCgiSEVBRCIpOwogICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CkBAIC0xODMsNDEgKzE4NCw3MCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmICghYnJhbmNoTmFtZS5zdGFydHNXaXRoKEJyYW5jaC5SX1JFRlMpKSB7Ci0gICAgICBicmFuY2hOYW1lID0gQnJhbmNoLlJfSEVBRFMgKyBicmFuY2hOYW1lOwotICAgIH0KLQogICAgIGFkZEJyYW5jaC5zZXRFbmFibGVkKGZhbHNlKTsKICAgICBVdGlsLlBST0pFQ1RfU1ZDLmFkZEJyYW5jaChnZXRQcm9qZWN0S2V5KCksIGJyYW5jaE5hbWUsIHJldiwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPExpc3RCcmFuY2hlc1Jlc3VsdD4oKSB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIExpc3RCcmFuY2hlc1Jlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEFkZEJyYW5jaFJlc3VsdD4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIEFkZEJyYW5jaFJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgICAgIGFkZEJyYW5jaC5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbmFtZVR4dEJveC5zZXRUZXh0KCIiKTsKLSAgICAgICAgICAgIGlyZXZUeHRCb3guc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICBkaXNwbGF5KHJlc3VsdC5nZXRCcmFuY2hlcygpKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0Lmhhc0Vycm9yKCkpIHsKKyAgICAgICAgICAgICAgbmFtZVR4dEJveC5zZXRUZXh0KCIiKTsKKyAgICAgICAgICAgICAgaXJldlR4dEJveC5zZXRUZXh0KCIiKTsKKyAgICAgICAgICAgICAgZGlzcGxheShyZXN1bHQuZ2V0TGlzdEJyYW5jaGVzUmVzdWx0KCkuZ2V0QnJhbmNoZXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmaW5hbCBBZGRCcmFuY2hSZXN1bHQuRXJyb3IgZXJyb3IgPSByZXN1bHQuZ2V0RXJyb3IoKTsKKyAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZzsKKyAgICAgICAgICAgICAgc3dpdGNoIChlcnJvci5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOVkFMSURfTkFNRToKKyAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEFuZEZvY3VzKG5hbWVUeHRCb3gpOworICAgICAgICAgICAgICAgICAgbXNnID0gR2Vycml0Lk0uaW52YWxpZEJyYW5jaE5hbWUoYnJhbmNoTmFtZSk7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgSU5WQUxJRF9SRVZJU0lPTjoKKyAgICAgICAgICAgICAgICAgIHNlbGVjdEFsbEFuZEZvY3VzKGlyZXZUeHRCb3gpOworICAgICAgICAgICAgICAgICAgbXNnID0gR2Vycml0Lk0uaW52YWxpZFJldmlzaW9uKHJldik7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgQlJBTkNIX0NSRUFUSU9OX05PVF9BTExPV0VEX1VOREVSX1JFRk5BTUVfUFJFRklYOgorICAgICAgICAgICAgICAgICAgc2VsZWN0QWxsQW5kRm9jdXMobmFtZVR4dEJveCk7CisgICAgICAgICAgICAgICAgICBtc2cgPQorICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5NLmJyYW5jaENyZWF0aW9uTm90QWxsb3dlZFVuZGVyUmVmbmFtZVByZWZpeChlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVmbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCUkFOQ0hfQUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxBbmRGb2N1cyhuYW1lVHh0Qm94KTsKKyAgICAgICAgICAgICAgICAgIG1zZyA9IEdlcnJpdC5NLmJyYW5jaEFscmVhZHlFeGlzdHMoZXJyb3IuZ2V0UmVmbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBCUkFOQ0hfQ1JFQVRJT05fQ09ORkxJQ1Q6CisgICAgICAgICAgICAgICAgICBzZWxlY3RBbGxBbmRGb2N1cyhuYW1lVHh0Qm94KTsKKyAgICAgICAgICAgICAgICAgIG1zZyA9CisgICAgICAgICAgICAgICAgICAgICAgR2Vycml0Lk0uYnJhbmNoQ3JlYXRpb25Db25mbGljdChicmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci5nZXRSZWZuYW1lKCkpOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgbXNnID0KKyAgICAgICAgICAgICAgICAgICAgICBHZXJyaXQuTS5icmFuY2hDcmVhdGlvbkZhaWxlZChicmFuY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBuZXcgRXJyb3JEaWFsb2cobXNnKS5jZW50ZXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgaWYgKGNhdWdodCBpbnN0YW5jZW9mIEludmFsaWROYW1lRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgfHwgY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuZXF1YWxzKEludmFsaWROYW1lRXhjZXB0aW9uLk1FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgIG5hbWVUeHRCb3guc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgICAgIG5hbWVUeHRCb3guc2V0Rm9jdXModHJ1ZSk7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1Z2h0IGluc3RhbmNlb2YgSW52YWxpZFJldmlzaW9uRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgfHwgY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICYmIGNhdWdodC5nZXRNZXNzYWdlKCkuZXF1YWxzKEludmFsaWRSZXZpc2lvbkV4Y2VwdGlvbi5NRVNTQUdFKSkgewotICAgICAgICAgICAgICBpcmV2VHh0Qm94LnNlbGVjdEFsbCgpOwotICAgICAgICAgICAgICBpcmV2VHh0Qm94LnNldEZvY3VzKHRydWUpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBhZGRCcmFuY2guc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOwogICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlbGVjdEFsbEFuZEZvY3VzKGZpbmFsIFRleHRCb3ggdGV4dEJveCkgeworICAgIHRleHRCb3guc2VsZWN0QWxsKCk7CisgICAgdGV4dEJveC5zZXRGb2N1cyh0cnVlKTsKKyAgfQorCiAgIHByaXZhdGUgY2xhc3MgQnJhbmNoZXNUYWJsZSBleHRlbmRzIEZhbmN5RmxleFRhYmxlPEJyYW5jaD4gewogICAgIGJvb2xlYW4gY2FuRGVsZXRlOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdERhc2hib2FyZHNTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0RGFzaGJvYXJkc1NjcmVlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Nzk4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdERhc2hib2FyZHNTY3JlZW4uamF2YQpAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHMuRGFzaGJvYXJkTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZGFzaGJvYXJkcy5EYXNoYm9hcmRzVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0RGFzaGJvYXJkc1NjcmVlbiBleHRlbmRzIFByb2plY3RTY3JlZW4geworICBwcml2YXRlIERhc2hib2FyZHNUYWJsZSBkYXNoZXM7CisgIFByb2plY3QuTmFtZUtleSBwcm9qZWN0OworCisgIHB1YmxpYyBQcm9qZWN0RGFzaGJvYXJkc1NjcmVlbihmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCkgeworICAgIHN1cGVyKHByb2plY3QpOworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgeworICAgIHN1cGVyLm9uTG9hZCgpOworICAgIERhc2hib2FyZExpc3QuYWxsKGdldFByb2plY3RLZXkoKSwKKyAgICAgICAgbmV3IFNjcmVlbkxvYWRDYWxsYmFjazxKc0FycmF5PERhc2hib2FyZExpc3Q+Pih0aGlzKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIHByZURpc3BsYXkoSnNBcnJheTxEYXNoYm9hcmRMaXN0PiByZXN1bHQpIHsKKyAgICAgICAgZGFzaGVzLmRpc3BsYXkocmVzdWx0KTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBzYXZlZFBhbmVsID0gREFTSEJPQVJEUzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBvbkluaXRVSSgpIHsKKyAgICBzdXBlci5vbkluaXRVSSgpOworICAgIGRhc2hlcyA9IG5ldyBEYXNoYm9hcmRzVGFibGUocHJvamVjdCk7CisgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgIGZwLmFkZChkYXNoZXMpOworICAgIGFkZChmcCk7CisgICAgZGFzaGVzLnNldFNhdmVQb2ludGVySWQoImRhc2hib2FyZHMvcHJvamVjdC8iICsgZ2V0UHJvamVjdEtleSgpLmdldCgpKTsKKyAgICBkaXNwbGF5KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVnaXN0ZXJLZXlzKCkgeworICAgIHN1cGVyLnJlZ2lzdGVyS2V5cygpOworICAgIGRhc2hlcy5zZXRSZWdpc3RlcktleXModHJ1ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0SW5mb1NjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RJbmZvU2NyZWVuLmphdmEKaW5kZXggOTQ0YTE2OS4uNDA5MjEzMDkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0SW5mb1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0SW5mb1NjcmVlbi5qYXZhCkBAIC0xNSwzNiArMTUsNDMgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZG93bmxvYWQuRG93bmxvYWRQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuU2NyZWVuTG9hZENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5PbkVkaXRFbmFibGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TbWFsbEhlYWRpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdERldGFpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkluaGVyaXRlZEJvb2xlYW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DaGFuZ2VFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkJ1dHRvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5DaGVja0JveDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbGV4VGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGlzdEJveDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuTnBUZXh0QXJlYTsKIAogcHVibGljIGNsYXNzIFByb2plY3RJbmZvU2NyZWVuIGV4dGVuZHMgUHJvamVjdFNjcmVlbiB7CisgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwogICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKIAotICBwcml2YXRlIFBhbmVsIHByb2plY3RPcHRpb25zUGFuZWw7Ci0gIHByaXZhdGUgQ2hlY2tCb3ggcmVxdWlyZUNoYW5nZUlEOworICBwcml2YXRlIExhYmVsZWRXaWRnZXRzR3JpZCBncmlkOworCisgIC8vIFNlY3Rpb246IFByb2plY3QgT3B0aW9ucworICBwcml2YXRlIExpc3RCb3ggcmVxdWlyZUNoYW5nZUlEOwogICBwcml2YXRlIExpc3RCb3ggc3VibWl0VHlwZTsKICAgcHJpdmF0ZSBMaXN0Qm94IHN0YXRlOwotICBwcml2YXRlIENoZWNrQm94IHVzZUNvbnRlbnRNZXJnZTsKKyAgcHJpdmF0ZSBMaXN0Qm94IGNvbnRlbnRNZXJnZTsKIAotICBwcml2YXRlIFBhbmVsIGFncmVlbWVudHNQYW5lbDsKLSAgcHJpdmF0ZSBDaGVja0JveCB1c2VDb250cmlidXRvckFncmVlbWVudHM7Ci0gIHByaXZhdGUgQ2hlY2tCb3ggdXNlU2lnbmVkT2ZmQnk7CisgIC8vIFNlY3Rpb246IENvbnRyaWJ1dG9yIEFncmVlbWVudHMKKyAgcHJpdmF0ZSBMaXN0Qm94IGNvbnRyaWJ1dG9yQWdyZWVtZW50czsKKyAgcHJpdmF0ZSBMaXN0Qm94IHNpZ25lZE9mZkJ5OwogCiAgIHByaXZhdGUgTnBUZXh0QXJlYSBkZXNjVHh0OwogICBwcml2YXRlIEJ1dHRvbiBzYXZlUHJvamVjdDsKQEAgLTUzLDYgKzYwLDcgQEAKIAogICBwdWJsaWMgUHJvamVjdEluZm9TY3JlZW4oZmluYWwgUHJvamVjdC5OYW1lS2V5IHRvU2hvdykgewogICAgIHN1cGVyKHRvU2hvdyk7CisgICAgcHJvamVjdE5hbWUgPSB0b1Nob3cuZ2V0KCk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTY3LDkgKzc1LDEzIEBACiAgICAgICB9CiAgICAgfSk7CiAKKyAgICBhZGQobmV3IFByb2plY3REb3dubG9hZFBhbmVsKHByb2plY3ROYW1lLCB0cnVlKSk7CisKICAgICBpbml0RGVzY3JpcHRpb24oKTsKKyAgICBncmlkID0gbmV3IExhYmVsZWRXaWRnZXRzR3JpZCgpOwogICAgIGluaXRQcm9qZWN0T3B0aW9ucygpOwogICAgIGluaXRBZ3JlZW1lbnRzKCk7CisgICAgYWRkKGdyaWQpOwogICAgIGFkZChzYXZlUHJvamVjdCk7CiAgIH0KIApAQCAtODksNiArMTAxLDcgQEAKICAgICAgICAgICAgIGRpc3BsYXkocmVzdWx0KTsKICAgICAgICAgICB9CiAgICAgICAgIH0pOworICAgIHNhdmVkUGFuZWwgPSBJTkZPOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGVuYWJsZUZvcm0oZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnlBZ3JlZW1lbnRzLApAQCAtOTYsMTAgKzEwOSwxMCBAQAogICAgICAgZmluYWwgYm9vbGVhbiBjYW5Nb2RpZnlTdGF0ZSkgewogICAgIHN1Ym1pdFR5cGUuc2V0RW5hYmxlZChjYW5Nb2RpZnlNZXJnZVR5cGUpOwogICAgIHN0YXRlLnNldEVuYWJsZWQoY2FuTW9kaWZ5U3RhdGUpOwotICAgIHVzZUNvbnRlbnRNZXJnZS5zZXRFbmFibGVkKGNhbk1vZGlmeU1lcmdlVHlwZSk7CisgICAgY29udGVudE1lcmdlLnNldEVuYWJsZWQoY2FuTW9kaWZ5TWVyZ2VUeXBlKTsKICAgICBkZXNjVHh0LnNldEVuYWJsZWQoY2FuTW9kaWZ5RGVzY3JpcHRpb24pOwotICAgIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cy5zZXRFbmFibGVkKGNhbk1vZGlmeUFncmVlbWVudHMpOwotICAgIHVzZVNpZ25lZE9mZkJ5LnNldEVuYWJsZWQoY2FuTW9kaWZ5QWdyZWVtZW50cyk7CisgICAgY29udHJpYnV0b3JBZ3JlZW1lbnRzLnNldEVuYWJsZWQoY2FuTW9kaWZ5QWdyZWVtZW50cyk7CisgICAgc2lnbmVkT2ZmQnkuc2V0RW5hYmxlZChjYW5Nb2RpZnlBZ3JlZW1lbnRzKTsKICAgICByZXF1aXJlQ2hhbmdlSUQuc2V0RW5hYmxlZChjYW5Nb2RpZnlNZXJnZVR5cGUpOwogICB9CiAKQEAgLTExOCw4ICsxMzEsNyBAQAogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGluaXRQcm9qZWN0T3B0aW9ucygpIHsKLSAgICBwcm9qZWN0T3B0aW9uc1BhbmVsID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKLSAgICBwcm9qZWN0T3B0aW9uc1BhbmVsLmFkZChuZXcgU21hbGxIZWFkaW5nKFV0aWwuQy5oZWFkaW5nUHJvamVjdE9wdGlvbnMoKSkpOworICAgIGdyaWQuYWRkSGVhZGVyKG5ldyBTbWFsbEhlYWRpbmcoVXRpbC5DLmhlYWRpbmdQcm9qZWN0T3B0aW9ucygpKSk7CiAKICAgICBzdWJtaXRUeXBlID0gbmV3IExpc3RCb3goKTsKICAgICBmb3IgKGZpbmFsIFByb2plY3QuU3VibWl0VHlwZSB0eXBlIDogUHJvamVjdC5TdWJtaXRUeXBlLnZhbHVlcygpKSB7CkBAIC0xMzIsMjkgKzE0NCwzNCBAQAogICAgICAgfQogICAgIH0pOwogICAgIHNhdmVFbmFibGVyLmxpc3RlblRvKHN1Ym1pdFR5cGUpOwotICAgIHByb2plY3RPcHRpb25zUGFuZWwuYWRkKHN1Ym1pdFR5cGUpOworICAgIGdyaWQuYWRkKFV0aWwuQy5oZWFkaW5nUHJvamVjdFN1Ym1pdFR5cGUoKSwgc3VibWl0VHlwZSk7CiAKICAgICBzdGF0ZSA9IG5ldyBMaXN0Qm94KCk7CiAgICAgZm9yIChmaW5hbCBQcm9qZWN0LlN0YXRlIHN0YXRlVmFsdWUgOiBQcm9qZWN0LlN0YXRlLnZhbHVlcygpKSB7CiAgICAgICBzdGF0ZS5hZGRJdGVtKFV0aWwudG9Mb25nU3RyaW5nKHN0YXRlVmFsdWUpLCBzdGF0ZVZhbHVlLm5hbWUoKSk7CiAgICAgfQotCiAgICAgc2F2ZUVuYWJsZXIubGlzdGVuVG8oc3RhdGUpOwotICAgIHByb2plY3RPcHRpb25zUGFuZWwuYWRkKHN0YXRlKTsKKyAgICBncmlkLmFkZChVdGlsLkMuaGVhZGluZ1Byb2plY3RTdGF0ZSgpLCBzdGF0ZSk7CiAKLSAgICB1c2VDb250ZW50TWVyZ2UgPSBuZXcgQ2hlY2tCb3goVXRpbC5DLnVzZUNvbnRlbnRNZXJnZSgpLCB0cnVlKTsKLSAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyh1c2VDb250ZW50TWVyZ2UpOwotICAgIHByb2plY3RPcHRpb25zUGFuZWwuYWRkKHVzZUNvbnRlbnRNZXJnZSk7CisgICAgY29udGVudE1lcmdlID0gbmV3SW5oZXJpdGVkQm9vbGVhbkJveCgpOworICAgIHNhdmVFbmFibGVyLmxpc3RlblRvKGNvbnRlbnRNZXJnZSk7CisgICAgZ3JpZC5hZGQoVXRpbC5DLnVzZUNvbnRlbnRNZXJnZSgpLCBjb250ZW50TWVyZ2UpOwogCi0gICAgcmVxdWlyZUNoYW5nZUlEID0gbmV3IENoZWNrQm94KFV0aWwuQy5yZXF1aXJlQ2hhbmdlSUQoKSwgdHJ1ZSk7CisgICAgcmVxdWlyZUNoYW5nZUlEID0gbmV3SW5oZXJpdGVkQm9vbGVhbkJveCgpOwogICAgIHNhdmVFbmFibGVyLmxpc3RlblRvKHJlcXVpcmVDaGFuZ2VJRCk7Ci0gICAgcHJvamVjdE9wdGlvbnNQYW5lbC5hZGQocmVxdWlyZUNoYW5nZUlEKTsKKyAgICBncmlkLmFkZEh0bWwoVXRpbC5DLnJlcXVpcmVDaGFuZ2VJRCgpLCByZXF1aXJlQ2hhbmdlSUQpOworICB9CiAKLSAgICBhZGQocHJvamVjdE9wdGlvbnNQYW5lbCk7CisgIHByaXZhdGUgc3RhdGljIExpc3RCb3ggbmV3SW5oZXJpdGVkQm9vbGVhbkJveCgpIHsKKyAgICBMaXN0Qm94IGJveCA9IG5ldyBMaXN0Qm94KCk7CisgICAgZm9yIChJbmhlcml0YWJsZUJvb2xlYW4gYiA6IEluaGVyaXRhYmxlQm9vbGVhbi52YWx1ZXMoKSkgeworICAgICAgYm94LmFkZEl0ZW0oYi5uYW1lKCksIGIubmFtZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGJveDsKICAgfQogCiAgIC8qKgotICAgKiBFbmFibGVzIHRoZSB7QGxpbmsgI3VzZUNvbnRlbnRNZXJnZX0gY2hlY2tib3ggaWYgdGhlIHNlbGVjdGVkIHN1Ym1pdCB0eXBlCisgICAqIEVuYWJsZXMgdGhlIHtAbGluayAjY29udGVudE1lcmdlfSBjaGVja2JveCBpZiB0aGUgc2VsZWN0ZWQgc3VibWl0IHR5cGUKICAgICogYWxsb3dzIHRoZSB1c2FnZSBvZiBjb250ZW50IG1lcmdlLgogICAgKiBJZiB0aGUgc3VibWl0IHR5cGUgKGN1cnJlbnRseSBvbmx5ICdGYXN0IEZvcndhcmQgT25seScpIGRvZXMgbm90IGFsbG93CiAgICAqIGNvbnRlbnQgbWVyZ2UgdGhlIHVzZUNvbnRlbnRNZXJnZSBjaGVja2JveCBnZXRzIGRpc2FibGVkLgpAQCAtMTYyLDI2ICsxNzksMjcgQEAKICAgcHJpdmF0ZSB2b2lkIHNldEVuYWJsZWRGb3JVc2VDb250ZW50TWVyZ2UoKSB7CiAgICAgaWYgKFN1Ym1pdFR5cGUuRkFTVF9GT1JXQVJEX09OTFkuZXF1YWxzKFByb2plY3QuU3VibWl0VHlwZQogICAgICAgICAudmFsdWVPZihzdWJtaXRUeXBlLmdldFZhbHVlKHN1Ym1pdFR5cGUuZ2V0U2VsZWN0ZWRJbmRleCgpKSkpKSB7Ci0gICAgICB1c2VDb250ZW50TWVyZ2Uuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICB1c2VDb250ZW50TWVyZ2Uuc2V0VmFsdWUoZmFsc2UpOworICAgICAgY29udGVudE1lcmdlLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgZmluYWwgSW5oZXJpdGVkQm9vbGVhbiBpbmhlcml0ZWRCb29sZWFuID0gbmV3IEluaGVyaXRlZEJvb2xlYW4oKTsKKyAgICAgIGluaGVyaXRlZEJvb2xlYW4uc2V0VmFsdWUoSW5oZXJpdGFibGVCb29sZWFuLkZBTFNFKTsKKyAgICAgIHNldEJvb2woY29udGVudE1lcmdlLCBpbmhlcml0ZWRCb29sZWFuKTsKICAgICB9IGVsc2UgewotICAgICAgdXNlQ29udGVudE1lcmdlLnNldEVuYWJsZWQoc3VibWl0VHlwZS5pc0VuYWJsZWQoKSk7CisgICAgICBjb250ZW50TWVyZ2Uuc2V0RW5hYmxlZChzdWJtaXRUeXBlLmlzRW5hYmxlZCgpKTsKICAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgaW5pdEFncmVlbWVudHMoKSB7Ci0gICAgYWdyZWVtZW50c1BhbmVsID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKLSAgICBhZ3JlZW1lbnRzUGFuZWwuYWRkKG5ldyBTbWFsbEhlYWRpbmcoVXRpbC5DLmhlYWRpbmdBZ3JlZW1lbnRzKCkpKTsKKyAgICBncmlkLmFkZEhlYWRlcihuZXcgU21hbGxIZWFkaW5nKFV0aWwuQy5oZWFkaW5nQWdyZWVtZW50cygpKSk7CiAKLSAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSBuZXcgQ2hlY2tCb3goVXRpbC5DLnVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKTsKLSAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyh1c2VDb250cmlidXRvckFncmVlbWVudHMpOwotICAgIGFncmVlbWVudHNQYW5lbC5hZGQodXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKTsKKyAgICBjb250cmlidXRvckFncmVlbWVudHMgPSBuZXdJbmhlcml0ZWRCb29sZWFuQm94KCk7CisgICAgaWYgKEdlcnJpdC5nZXRDb25maWcoKS5pc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKSB7CisgICAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyhjb250cmlidXRvckFncmVlbWVudHMpOworICAgICAgZ3JpZC5hZGQoVXRpbC5DLnVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpLCBjb250cmlidXRvckFncmVlbWVudHMpOworICAgIH0KIAotICAgIHVzZVNpZ25lZE9mZkJ5ID0gbmV3IENoZWNrQm94KFV0aWwuQy51c2VTaWduZWRPZmZCeSgpLCB0cnVlKTsKLSAgICBzYXZlRW5hYmxlci5saXN0ZW5Ubyh1c2VTaWduZWRPZmZCeSk7Ci0gICAgYWdyZWVtZW50c1BhbmVsLmFkZCh1c2VTaWduZWRPZmZCeSk7Ci0KLSAgICBhZGQoYWdyZWVtZW50c1BhbmVsKTsKKyAgICBzaWduZWRPZmZCeSA9IG5ld0luaGVyaXRlZEJvb2xlYW5Cb3goKTsKKyAgICBzYXZlRW5hYmxlci5saXN0ZW5UbyhzaWduZWRPZmZCeSk7CisgICAgZ3JpZC5hZGRIdG1sKFV0aWwuQy51c2VTaWduZWRPZmZCeSgpLCBzaWduZWRPZmZCeSk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgc2V0U3VibWl0VHlwZShmaW5hbCBQcm9qZWN0LlN1Ym1pdFR5cGUgbmV3U3VibWl0VHlwZSkgewpAQCAtMjA5LDIxICsyMjcsNTQgQEAKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHZvaWQgc2V0Qm9vbChMaXN0Qm94IGJveCwgSW5oZXJpdGVkQm9vbGVhbiBpbmhlcml0ZWRCb29sZWFuKSB7CisgICAgaW50IGluaGVyaXRlZEluZGV4ID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBib3guZ2V0SXRlbUNvdW50KCk7IGkrKykgeworICAgICAgaWYgKGJveC5nZXRWYWx1ZShpKS5zdGFydHNXaXRoKEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklULm5hbWUoKSkpIHsKKyAgICAgICAgaW5oZXJpdGVkSW5kZXggPSBpOworICAgICAgfQorICAgICAgaWYgKGJveC5nZXRWYWx1ZShpKS5zdGFydHNXaXRoKGluaGVyaXRlZEJvb2xlYW4udmFsdWUubmFtZSgpKSkgeworICAgICAgICBib3guc2V0U2VsZWN0ZWRJbmRleChpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGluaGVyaXRlZEluZGV4ID49IDApIHsKKyAgICAgIGlmIChwcm9qZWN0LmdldFBhcmVudChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0V2lsZFByb2plY3QoKSkgPT0gbnVsbCkgeworICAgICAgICBpZiAoYm94LmdldFNlbGVjdGVkSW5kZXgoKSA9PSBpbmhlcml0ZWRJbmRleCkgeworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm94LmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChib3guZ2V0VmFsdWUoaSkuZXF1YWxzKEluaGVyaXRhYmxlQm9vbGVhbi5GQUxTRS5uYW1lKCkpKSB7CisgICAgICAgICAgICAgIGJveC5zZXRTZWxlY3RlZEluZGV4KGkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm94LnJlbW92ZUl0ZW0oaW5oZXJpdGVkSW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm94LnNldEl0ZW1UZXh0KGluaGVyaXRlZEluZGV4LCBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVC5uYW1lKCkgKyAiICgiCisgICAgICAgICAgICArIGluaGVyaXRlZEJvb2xlYW4uaW5oZXJpdGVkVmFsdWUgKyAiKSIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEluaGVyaXRhYmxlQm9vbGVhbiBnZXRCb29sKExpc3RCb3ggYm94KSB7CisgICAgaW50IGkgPSBib3guZ2V0U2VsZWN0ZWRJbmRleCgpOworICAgIGlmIChpID49IDApIHsKKyAgICAgIGZpbmFsIFN0cmluZyBzZWxlY3RlZFZhbHVlID0gYm94LmdldFZhbHVlKGkpOworICAgICAgaWYgKHNlbGVjdGVkVmFsdWUuc3RhcnRzV2l0aChJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVC5uYW1lKCkpKSB7CisgICAgICAgIHJldHVybiBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBJbmhlcml0YWJsZUJvb2xlYW4udmFsdWVPZihzZWxlY3RlZFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICB9CisKICAgdm9pZCBkaXNwbGF5KGZpbmFsIFByb2plY3REZXRhaWwgcmVzdWx0KSB7CiAgICAgcHJvamVjdCA9IHJlc3VsdC5wcm9qZWN0OwogCi0gICAgZmluYWwgYm9vbGVhbiBpc2FsbCA9Ci0gICAgICAgIEdlcnJpdC5nZXRDb25maWcoKS5nZXRXaWxkUHJvamVjdCgpLmVxdWFscyhwcm9qZWN0LmdldE5hbWVLZXkoKSk7Ci0gICAgcHJvamVjdE9wdGlvbnNQYW5lbC5zZXRWaXNpYmxlKCFpc2FsbCk7Ci0gICAgYWdyZWVtZW50c1BhbmVsLnNldFZpc2libGUoIWlzYWxsKTsKLSAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMuc2V0VmlzaWJsZShHZXJyaXQuZ2V0Q29uZmlnKCkKLSAgICAgICAgLmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpOwotCiAgICAgZGVzY1R4dC5zZXRUZXh0KHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzLnNldFZhbHVlKHByb2plY3QuaXNVc2VDb250cmlidXRvckFncmVlbWVudHMoKSk7Ci0gICAgdXNlU2lnbmVkT2ZmQnkuc2V0VmFsdWUocHJvamVjdC5pc1VzZVNpZ25lZE9mZkJ5KCkpOwotICAgIHVzZUNvbnRlbnRNZXJnZS5zZXRWYWx1ZShwcm9qZWN0LmlzVXNlQ29udGVudE1lcmdlKCkpOwotICAgIHJlcXVpcmVDaGFuZ2VJRC5zZXRWYWx1ZShwcm9qZWN0LmlzUmVxdWlyZUNoYW5nZUlEKCkpOworICAgIHNldEJvb2woY29udHJpYnV0b3JBZ3JlZW1lbnRzLCByZXN1bHQudXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKTsKKyAgICBzZXRCb29sKHNpZ25lZE9mZkJ5LCByZXN1bHQudXNlU2lnbmVkT2ZmQnkpOworICAgIHNldEJvb2woY29udGVudE1lcmdlLCByZXN1bHQudXNlQ29udGVudE1lcmdlKTsKKyAgICBzZXRCb29sKHJlcXVpcmVDaGFuZ2VJRCwgcmVzdWx0LnJlcXVpcmVDaGFuZ2VJRCk7CiAgICAgc2V0U3VibWl0VHlwZShwcm9qZWN0LmdldFN1Ym1pdFR5cGUoKSk7CiAgICAgc2V0U3RhdGUocHJvamVjdC5nZXRTdGF0ZSgpKTsKIApAQCAtMjMyLDEwICsyODMsMTAgQEAKIAogICBwcml2YXRlIHZvaWQgZG9TYXZlKCkgewogICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY1R4dC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyh1c2VDb250cmlidXRvckFncmVlbWVudHMuZ2V0VmFsdWUoKSk7Ci0gICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeSh1c2VTaWduZWRPZmZCeS5nZXRWYWx1ZSgpKTsKLSAgICBwcm9qZWN0LnNldFVzZUNvbnRlbnRNZXJnZSh1c2VDb250ZW50TWVyZ2UuZ2V0VmFsdWUoKSk7Ci0gICAgcHJvamVjdC5zZXRSZXF1aXJlQ2hhbmdlSUQocmVxdWlyZUNoYW5nZUlELmdldFZhbHVlKCkpOworICAgIHByb2plY3Quc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGdldEJvb2woY29udHJpYnV0b3JBZ3JlZW1lbnRzKSk7CisgICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeShnZXRCb29sKHNpZ25lZE9mZkJ5KSk7CisgICAgcHJvamVjdC5zZXRVc2VDb250ZW50TWVyZ2UoZ2V0Qm9vbChjb250ZW50TWVyZ2UpKTsKKyAgICBwcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChnZXRCb29sKHJlcXVpcmVDaGFuZ2VJRCkpOwogICAgIGlmIChzdWJtaXRUeXBlLmdldFNlbGVjdGVkSW5kZXgoKSA+PSAwKSB7CiAgICAgICBwcm9qZWN0LnNldFN1Ym1pdFR5cGUoUHJvamVjdC5TdWJtaXRUeXBlLnZhbHVlT2Yoc3VibWl0VHlwZQogICAgICAgICAgIC5nZXRWYWx1ZShzdWJtaXRUeXBlLmdldFNlbGVjdGVkSW5kZXgoKSkpKTsKQEAgLTI1Niw0ICszMDcsNTggQEAKICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICB9CisKKyAgcHVibGljIGNsYXNzIFByb2plY3REb3dubG9hZFBhbmVsIGV4dGVuZHMgRG93bmxvYWRQYW5lbCB7CisgICAgcHVibGljIFByb2plY3REb3dubG9hZFBhbmVsKFN0cmluZyBwcm9qZWN0LCBib29sZWFuIGlzQWxsb3dzQW5vbnltb3VzKSB7CisgICAgICBzdXBlcihwcm9qZWN0LCBudWxsLCBpc0FsbG93c0Fub255bW91cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9wdWxhdGVEb3dubG9hZENvbW1hbmRMaW5rcygpIHsKKyAgICAgIGlmICghdXJscy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuQ0hFQ0tPVVQpCisgICAgICAgICAgICB8fCBhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkRFRkFVTFRfRE9XTkxPQURTKSkgeworICAgICAgICAgIGNvbW1hbmRzLmFkZChjbWRMaW5rZmFjdG9yeS5uZXcgQ2xvbmVDb21tYW5kTGluaygpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY2xhc3MgTGFiZWxlZFdpZGdldHNHcmlkIGV4dGVuZHMgRmxleFRhYmxlIHsKKyAgICBwcml2YXRlIFN0cmluZyBsYWJlbFN1ZmZpeDsKKworICAgIHB1YmxpYyBMYWJlbGVkV2lkZ2V0c0dyaWQoKSB7CisgICAgICBzdXBlcigpOworICAgICAgbGFiZWxTdWZmaXggPSAiOiI7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEhlYWRlcihXaWRnZXQgd2lkZ2V0KSB7CisgICAgICBpbnQgcm93ID0gZ2V0Um93Q291bnQoKTsKKyAgICAgIGluc2VydFJvdyhyb3cpOworICAgICAgc2V0V2lkZ2V0KHJvdywgMCwgd2lkZ2V0KTsKKyAgICAgIGdldENlbGxGb3JtYXR0ZXIoKS5nZXRFbGVtZW50KHJvdywgMCkuc2V0QXR0cmlidXRlKCJjb2xTcGFuIiwgIjIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkKFN0cmluZyBsYWJlbCwgYm9vbGVhbiBsYWJlbElzSHRtbCwgV2lkZ2V0IHdpZGdldCkgeworICAgICAgaW50IHJvdyA9IGdldFJvd0NvdW50KCk7CisgICAgICBpbnNlcnRSb3cocm93KTsKKyAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgIGlmIChsYWJlbElzSHRtbCkgeworICAgICAgICAgIHNldEhUTUwocm93LCAwLCBsYWJlbCArIGxhYmVsU3VmZml4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRUZXh0KHJvdywgMCwgbGFiZWwgKyBsYWJlbFN1ZmZpeCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNldFdpZGdldChyb3csIDEsIHdpZGdldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBsYWJlbCwgV2lkZ2V0IHdpZGdldCkgeworICAgICAgYWRkKGxhYmVsLCBmYWxzZSwgd2lkZ2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRIdG1sKFN0cmluZyBsYWJlbCwgV2lkZ2V0IHdpZGdldCkgeworICAgICAgYWRkKGxhYmVsLCB0cnVlLCB3aWRnZXQpOworICAgIH0KKworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdExpc3RTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0TGlzdFNjcmVlbi5qYXZhCmluZGV4IDkxMjU2MjIuLmVlNTg0MjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0TGlzdFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0TGlzdFNjcmVlbi5qYXZhCkBAIC0xNCwzOCArMTQsODIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW47CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rcy5BRE1JTl9QUk9KRUNUUzsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5EaXNwYXRjaGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdpdHdlYkxpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnByb2plY3RzLlByb2plY3RJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0TWFwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuU2NyZWVuTG9hZENhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuRmlsdGVyZWRVc2VySW50ZXJmYWNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5IaWdobGlnaHRpbmdJbmxpbmVIeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLklnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdFNlYXJjaExpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlByb2plY3RzVGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5VXBFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVVwSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BbmNob3I7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhvcml6b250YWxQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5MYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuTnBUZXh0Qm94OwogCi1wdWJsaWMgY2xhc3MgUHJvamVjdExpc3RTY3JlZW4gZXh0ZW5kcyBTY3JlZW4geworcHVibGljIGNsYXNzIFByb2plY3RMaXN0U2NyZWVuIGV4dGVuZHMgU2NyZWVuIGltcGxlbWVudHMgRmlsdGVyZWRVc2VySW50ZXJmYWNlIHsKICAgcHJpdmF0ZSBQcm9qZWN0c1RhYmxlIHByb2plY3RzOworICBwcml2YXRlIE5wVGV4dEJveCBmaWx0ZXJUeHQ7CisgIHByaXZhdGUgU3RyaW5nIHN1Ym5hbWU7CisKKyAgcHVibGljIFByb2plY3RMaXN0U2NyZWVuKCkgeworICB9CisKKyAgcHVibGljIFByb2plY3RMaXN0U2NyZWVuKFN0cmluZyBwYXJhbXMpIHsKKyAgICBmb3IgKFN0cmluZyBrdlBhaXIgOiBwYXJhbXMuc3BsaXQoIlssOyZdIikpIHsKKyAgICAgIFN0cmluZ1tdIGt2ID0ga3ZQYWlyLnNwbGl0KCI9IiwgMik7CisgICAgICBpZiAoa3YubGVuZ3RoICE9IDIgfHwga3ZbMF0uaXNFbXB0eSgpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoImZpbHRlciIuZXF1YWxzKGt2WzBdKSkgeworICAgICAgICBzdWJuYW1lID0gVVJMLmRlY29kZVF1ZXJ5U3RyaW5nKGt2WzFdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgewogICAgIHN1cGVyLm9uTG9hZCgpOwotICAgIFByb2plY3RNYXAuYWxsKG5ldyBTY3JlZW5Mb2FkQ2FsbGJhY2s8UHJvamVjdE1hcD4odGhpcykgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KGZpbmFsIFByb2plY3RNYXAgcmVzdWx0KSB7Ci0gICAgICAgIHByb2plY3RzLmRpc3BsYXkocmVzdWx0KTsKLSAgICAgICAgcHJvamVjdHMuZmluaXNoRGlzcGxheSgpOwotICAgICAgfQotICAgIH0pOworICAgIGRpc3BsYXkoKTsKKyAgICByZWZyZXNoKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVmcmVzaCgpIHsKKyAgICBzZXRUb2tlbihzdWJuYW1lID09IG51bGwgfHwgIiIuZXF1YWxzKHN1Ym5hbWUpID8gQURNSU5fUFJPSkVDVFMKKyAgICAgICAgOiBBRE1JTl9QUk9KRUNUUyArICI/ZmlsdGVyPSIgKyBVUkwuZW5jb2RlUXVlcnlTdHJpbmcoc3VibmFtZSkpOworICAgIFByb2plY3RNYXAubWF0Y2goc3VibmFtZSwKKyAgICAgICAgbmV3IElnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlcjxQcm9qZWN0TWFwPih0aGlzLAorICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFByb2plY3RNYXA+KCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFByb2plY3RNYXAgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcHJvamVjdHMuZGlzcGxheShyZXN1bHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50RmlsdGVyKCkgeworICAgIHJldHVybiBzdWJuYW1lOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgewogICAgIHN1cGVyLm9uSW5pdFVJKCk7CiAgICAgc2V0UGFnZVRpdGxlKFV0aWwuQy5wcm9qZWN0TGlzdFRpdGxlKCkpOworICAgIGluaXRQYWdlSGVhZGVyKCk7CiAKICAgICBwcm9qZWN0cyA9IG5ldyBQcm9qZWN0c1RhYmxlKCkgewogICAgICAgQE92ZXJyaWRlCkBAIC02NCw3ICsxMDgsNyBAQAogICAgICAgfQogCiAgICAgICBwcml2YXRlIFN0cmluZyBsaW5rKGZpbmFsIFByb2plY3RJbmZvIGl0ZW0pIHsKLSAgICAgICAgcmV0dXJuIERpc3BhdGNoZXIudG9Qcm9qZWN0QWRtaW4oaXRlbS5uYW1lX2tleSgpLCBQcm9qZWN0U2NyZWVuLklORk8pOworICAgICAgICByZXR1cm4gRGlzcGF0Y2hlci50b1Byb2plY3QoaXRlbS5uYW1lX2tleSgpKTsKICAgICAgIH0KIAogICAgICAgQE92ZXJyaWRlCkBAIC03OCw3ICsxMjIsMTAgQEAKIAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZShmaW5hbCBpbnQgcm93LCBmaW5hbCBQcm9qZWN0SW5mbyBrKSB7Ci0gICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsIG5ldyBIeXBlcmxpbmsoay5uYW1lKCksIGxpbmsoaykpKTsKKyAgICAgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgICAgICBmcC5hZGQobmV3IFByb2plY3RTZWFyY2hMaW5rKGsubmFtZV9rZXkoKSkpOworICAgICAgICBmcC5hZGQobmV3IEhpZ2hsaWdodGluZ0lubGluZUh5cGVybGluayhrLm5hbWUoKSwgbGluayhrKSwgc3VibmFtZSkpOworICAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAxLCBmcCk7CiAgICAgICAgIHRhYmxlLnNldFRleHQocm93LCAyLCBrLmRlc2NyaXB0aW9uKCkpOwogICAgICAgICBHaXR3ZWJMaW5rIGwgPSBHZXJyaXQuZ2V0R2l0d2ViTGluaygpOwogICAgICAgICBpZiAobCAhPSBudWxsKSB7CkBAIC05NCw2ICsxNDEsMzQgQEAKICAgICBhZGQocHJvamVjdHMpOwogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIGluaXRQYWdlSGVhZGVyKCkgeworICAgIGZpbmFsIEhvcml6b250YWxQYW5lbCBocCA9IG5ldyBIb3Jpem9udGFsUGFuZWwoKTsKKyAgICBocC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wcm9qZWN0RmlsdGVyUGFuZWwoKSk7CisgICAgZmluYWwgTGFiZWwgZmlsdGVyTGFiZWwgPSBuZXcgTGFiZWwoVXRpbC5DLnByb2plY3RGaWx0ZXIoKSk7CisgICAgZmlsdGVyTGFiZWwuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucHJvamVjdEZpbHRlckxhYmVsKCkpOworICAgIGhwLmFkZChmaWx0ZXJMYWJlbCk7CisgICAgZmlsdGVyVHh0ID0gbmV3IE5wVGV4dEJveCgpOworICAgIGZpbHRlclR4dC5zZXRWYWx1ZShzdWJuYW1lKTsKKyAgICBmaWx0ZXJUeHQuYWRkS2V5VXBIYW5kbGVyKG5ldyBLZXlVcEhhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uS2V5VXAoS2V5VXBFdmVudCBldmVudCkgeworICAgICAgICBzdWJuYW1lID0gZmlsdGVyVHh0LmdldFZhbHVlKCk7CisgICAgICAgIHJlZnJlc2goKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBocC5hZGQoZmlsdGVyVHh0KTsKKyAgICBhZGQoaHApOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uU2hvd1ZpZXcoKSB7CisgICAgc3VwZXIub25TaG93VmlldygpOworICAgIGlmIChzdWJuYW1lICE9IG51bGwpIHsKKyAgICAgIGZpbHRlclR4dC5zZXRDdXJzb3JQb3Moc3VibmFtZS5sZW5ndGgoKSk7CisgICAgfQorICAgIGZpbHRlclR4dC5zZXRGb2N1cyh0cnVlKTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCByZWdpc3RlcktleXMoKSB7CiAgICAgc3VwZXIucmVnaXN0ZXJLZXlzKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1Byb2plY3RTY3JlZW4uamF2YQppbmRleCBkZDViMDcwLi5mZGYzYWI4IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vUHJvamVjdFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9Qcm9qZWN0U2NyZWVuLmphdmEKQEAgLTE0LDI3ICsxNCwzMyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbjsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRGlzcGF0Y2hlci50b1Byb2plY3RBZG1pbjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5NZW51U2NyZWVuOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiAKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0U2NyZWVuIGV4dGVuZHMgTWVudVNjcmVlbiB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdFNjcmVlbiBleHRlbmRzIFNjcmVlbiB7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORk8gPSAiaW5mbyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQU5DSCA9ICJicmFuY2hlcyI7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTUyA9ICJhY2Nlc3MiOworICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVNIQk9BUkRTID0gImRhc2hib2FyZHMiOworCisgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHNhdmVkUGFuZWw7CisgIHByb3RlY3RlZCBzdGF0aWMgUHJvamVjdC5OYW1lS2V5IHNhdmVkS2V5OworCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNhdmVkUGFuZWwoKSB7CisgICAgcmV0dXJuIHNhdmVkUGFuZWw7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFByb2plY3QuTmFtZUtleSBnZXRTYXZlZEtleSgpIHsKKyAgICByZXR1cm4gc2F2ZWRLZXk7CisgIH0KIAogICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBuYW1lOwogCiAgIHB1YmxpYyBQcm9qZWN0U2NyZWVuKGZpbmFsIFByb2plY3QuTmFtZUtleSB0b1Nob3cpIHsKICAgICBuYW1lID0gdG9TaG93OwotCi0gICAgbGluayhVdGlsLkMucHJvamVjdEFkbWluVGFiR2VuZXJhbCgpLCB0b1Byb2plY3RBZG1pbihuYW1lLCBJTkZPKSk7Ci0gICAgbGluayhVdGlsLkMucHJvamVjdEFkbWluVGFiQnJhbmNoZXMoKSwgdG9Qcm9qZWN0QWRtaW4obmFtZSwgQlJBTkNIKSk7Ci0gICAgbGluayhVdGlsLkMucHJvamVjdEFkbWluVGFiQWNjZXNzKCksIHRvUHJvamVjdEFkbWluKG5hbWUsIEFDQ0VTUykpOwogICB9CiAKLSAgcHJvdGVjdGVkIFByb2plY3QuTmFtZUtleSBnZXRQcm9qZWN0S2V5KCkgeworICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGdldFByb2plY3RLZXkoKSB7CiAgICAgcmV0dXJuIG5hbWU7CiAgIH0KIApAQCAtNDMsNCArNDksMTAgQEAKICAgICBzdXBlci5vbkluaXRVSSgpOwogICAgIHNldFBhZ2VUaXRsZShVdGlsLk0ucHJvamVjdChuYW1lLmdldCgpKSk7CiAgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgeworICAgIHN1cGVyLm9uTG9hZCgpOworICAgIHNhdmVkS2V5ID0gbmFtZTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1V0aWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hZG1pbi9VdGlsLmphdmEKaW5kZXggYWE1YjdiNi4uMTY5NmM0MyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2FkbWluL1V0aWwuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYWRtaW4vVXRpbC5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBBZG1pblNlcnZpY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdEFkbWluU2VydmljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CkBAIC0yMywxMyArMjIsOSBAQAogcHVibGljIGNsYXNzIFV0aWwgewogICBwdWJsaWMgc3RhdGljIGZpbmFsIEFkbWluQ29uc3RhbnRzIEMgPSBHV1QuY3JlYXRlKEFkbWluQ29uc3RhbnRzLmNsYXNzKTsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZG1pbk1lc3NhZ2VzIE0gPSBHV1QuY3JlYXRlKEFkbWluTWVzc2FnZXMuY2xhc3MpOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEdyb3VwQWRtaW5TZXJ2aWNlIEdST1VQX1NWQzsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcm9qZWN0QWRtaW5TZXJ2aWNlIFBST0pFQ1RfU1ZDOwogCiAgIHN0YXRpYyB7Ci0gICAgR1JPVVBfU1ZDID0gR1dULmNyZWF0ZShHcm91cEFkbWluU2VydmljZS5jbGFzcyk7Ci0gICAgSnNvblV0aWwuYmluZChHUk9VUF9TVkMsICJycGMvR3JvdXBBZG1pblNlcnZpY2UiKTsKLQogICAgIFBST0pFQ1RfU1ZDID0gR1dULmNyZWF0ZShQcm9qZWN0QWRtaW5TZXJ2aWNlLmNsYXNzKTsKICAgICBKc29uVXRpbC5iaW5kKFBST0pFQ1RfU1ZDLCAicnBjL1Byb2plY3RBZG1pblNlcnZpY2UiKTsKIApAQCAtNDUsNiArNDAsOCBAQAogICAgICAgICByZXR1cm4gQy5wcm9qZWN0U3VibWl0VHlwZV9GQVNUX0ZPUldBUkRfT05MWSgpOwogICAgICAgY2FzZSBNRVJHRV9JRl9ORUNFU1NBUlk6CiAgICAgICAgIHJldHVybiBDLnByb2plY3RTdWJtaXRUeXBlX01FUkdFX0lGX05FQ0VTU0FSWSgpOworICAgICAgY2FzZSBSRUJBU0VfSUZfTkVDRVNTQVJZOgorICAgICAgICByZXR1cm4gQy5wcm9qZWN0U3VibWl0VHlwZV9SRUJBU0VfSUZfTkVDRVNTQVJZKCk7CiAgICAgICBjYXNlIE1FUkdFX0FMV0FZUzoKICAgICAgICAgcmV0dXJuIEMucHJvamVjdFN1Ym1pdFR5cGVfTUVSR0VfQUxXQVlTKCk7CiAgICAgICBjYXNlIENIRVJSWV9QSUNLOgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5qYXZhCmluZGV4IGE5YjkyYzIuLjVkNzU2YTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRDb25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkQ29uc3RhbnRzLmphdmEKQEAgLTE3LDE4ICsxNyw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuaTE4bi5jbGllbnQuQ29uc3RhbnRzOwogCiBwdWJsaWMgaW50ZXJmYWNlIE9wZW5JZENvbnN0YW50cyBleHRlbmRzIENvbnN0YW50cyB7Ci0gIFN0cmluZyBidXR0b25TaWduSW4oKTsKLSAgU3RyaW5nIGJ1dHRvblJlZ2lzdGVyKCk7Ci0gIFN0cmluZyBidXR0b25MaW5rSWQoKTsKLQotICBTdHJpbmcgcmVtZW1iZXJNZSgpOwotCi0gIFN0cmluZyBub3RBbGxvd2VkKCk7Ci0gIFN0cmluZyBub1Byb3ZpZGVyKCk7Ci0gIFN0cmluZyBlcnJvcigpOwotCiAgIFN0cmluZyBuYW1lR29vZ2xlKCk7CiAgIFN0cmluZyBuYW1lWWFob28oKTsKLQotICBTdHJpbmcgd2hhdElzT3BlbklESHRtbCgpOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENvbnN0YW50cy5wcm9wZXJ0aWVzCmluZGV4IGFmOWE2M2QuLjFhOGFjYzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRDb25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkQ29uc3RhbnRzLnByb3BlcnRpZXMKQEAgLTEsMjAgKzEsMiBAQAotYnV0dG9uU2lnbkluID0gU2lnbiBJbgotYnV0dG9uUmVnaXN0ZXIgPSBSZWdpc3RlcgotYnV0dG9uTGlua0lkID0gTGluayBJZGVudGl0eQotCi1yZW1lbWJlck1lID0gUmVtZW1iZXIgTWUKLQotbm90QWxsb3dlZCA9IFByb3ZpZGVyIGlzIG5vdCBhbGxvd2VkLgotbm9Qcm92aWRlciA9IFByb3ZpZGVyIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHdhcyBpbmNvcnJlY3RseSBlbnRlcmVkLgotZXJyb3IgPSBVbmFibGUgdG8gY29ubmVjdCB3aXRoIE9wZW5JRCBwcm92aWRlci4KLQogbmFtZUdvb2dsZSA9IEdvb2dsZSBBY2NvdW50CiBuYW1lWWFob28gPSBZYWhvbyEgSUQKLQotd2hhdElzT3BlbklESHRtbCA9IFwKLSAgPGgyIGNsYXNzPSJzbWFsbEhlYWRpbmciIHN0eWxlPSJtYXJnaW4tdG9wOiAyNXB4OyI+V2hhdCBpcyBPcGVuSUQ/PC9oMj5cCi0gIDxwPk9wZW5JRCBwcm92aWRlcyBzZWN1cmUgc2luZ2xlLXNpZ24tb24sIHdpdGhvdXQgXAotICByZXZlYWxpbmcgeW91ciBwYXNzd29yZHMgdG8gdGhpcyB3ZWJzaXRlLjwvcD5cCi0gIDxwPlRoZXJlIGFyZSBtYW55IE9wZW5JRCBwcm92aWRlcnMgYXZhaWxhYmxlLiAgWW91IG1heSBhbHJlYWR5IFwKLSAgYmUgbWVtYmVyIG9mIG9uZSE8L3A+XAotICA8cD48YSBocmVmPSJodHRwOi8vb3BlbmlkLm5ldC9nZXQvIiB0YXJnZXQ9Il9ibGFuayI+R2V0IE9wZW5JRDwvYT48L3A+XApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENzcy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZENzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjQwY2JiLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRDc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC5vcGVuaWQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNzc1Jlc291cmNlOwotCi1pbnRlcmZhY2UgT3BlbklkQ3NzIGV4dGVuZHMgQ3NzUmVzb3VyY2UgewotICBTdHJpbmcgbG9naW5Gb3JtKCk7Ci0gIFN0cmluZyBsb2dvKCk7Ci0gIFN0cmluZyBsb2dpbkxpbmUoKTsKLSAgU3RyaW5nIGlkZW50aWZpZXIoKTsKLSAgU3RyaW5nIGRpcmVjdExpbmsoKTsKLSAgU3RyaW5nIGVycm9yKCk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkTWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRmYzVmLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50Lk1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9wZW5JZE1lc3NhZ2VzIGV4dGVuZHMgTWVzc2FnZXMgewotICBTdHJpbmcgc2lnbkluQXQoU3RyaW5nIGhvc3RuYW1lKTsKLSAgU3RyaW5nIHJlZ2lzdGVyQXQoU3RyaW5nIGhvc3RuYW1lKTsKLSAgU3RyaW5nIGxpbmtBdChTdHJpbmcgaG9zdG5hbWUpOwotCi0gIFN0cmluZyBzaWduSW5XaXRoKFN0cmluZyB3aG8pOwotICBTdHJpbmcgcmVnaXN0ZXJXaXRoKFN0cmluZyB3aG8pOwotICBTdHJpbmcgbGlua1dpdGgoU3RyaW5nIHdobyk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkTWVzc2FnZXMucHJvcGVydGllcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg2NmNjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zaWduSW5BdCA9IFNpZ24gSW4gdG8gR2Vycml0IENvZGUgUmV2aWV3IGF0IHswfQotcmVnaXN0ZXJBdCA9IFJlZ2lzdGVyIHdpdGggR2Vycml0IENvZGUgUmV2aWV3IGF0IHswfQotbGlua0F0ID0gTGluayBBbm90aGVyIElkZW50aXR5IHRvIEdlcnJpdCBDb2RlIFJldmlldyBhdCB7MH0KLQotc2lnbkluV2l0aCA9IFNpZ24gaW4gd2l0aCBhIHswfQotcmVnaXN0ZXJXaXRoID0gUmVnaXN0ZXIgd2l0aCBhIHswfQotbGlua1dpdGggPSBMaW5rIGEgezB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkUmVzb3VyY2VzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MmVkMGIuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNsaWVudEJ1bmRsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkRhdGFSZXNvdXJjZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkltYWdlUmVzb3VyY2U7Ci0KLWludGVyZmFjZSBPcGVuSWRSZXNvdXJjZXMgZXh0ZW5kcyBDbGllbnRCdW5kbGUgewotICBzdGF0aWMgZmluYWwgT3BlbklkUmVzb3VyY2VzIEkgPSBHV1QuY3JlYXRlKE9wZW5JZFJlc291cmNlcy5jbGFzcyk7Ci0KLSAgQFNvdXJjZSgib3BlbmlkLmNzcyIpCi0gIE9wZW5JZENzcyBjc3MoKTsKLQotICBAU291cmNlKCJpZGVudGlmaWVyQmFja2dyb3VuZC5naWYiKQotICBEYXRhUmVzb3VyY2UgaWRlbnRpZmllckJhY2tncm91bmQoKTsKLQotICBAU291cmNlKCJvcGVuaWRMb2dvLnBuZyIpCi0gIEltYWdlUmVzb3VyY2Ugb3BlbmlkTG9nbygpOwotCi0gIEBTb3VyY2UoImljb25Hb29nbGUuZ2lmIikKLSAgSW1hZ2VSZXNvdXJjZSBpY29uR29vZ2xlKCk7Ci0KLSAgQFNvdXJjZSgiaWNvbllhaG9vLmdpZiIpCi0gIEltYWdlUmVzb3VyY2UgaWNvbllhaG9vKCk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkU2lnbkluRGlhbG9nLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkU2lnbkluRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMmM0OTMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFNpZ25JbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC5vcGVuaWQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5TaWduSW5EaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuU21hbGxIZWFkaW5nOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLkRpc2NvdmVyeVJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5vcGVuaWQuT3BlbklkUHJvdmlkZXJQYXR0ZXJuOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5PcGVuSWRVcmxzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXIuU2NoZWR1bGVkQ29tbWFuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkZvcm1FbGVtZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkltYWdlUmVzb3VyY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuQ29va2llczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ2hlY2tCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZvcm1QYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb3JtUGFuZWwuU3VibWl0RXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRm9ybVN1Ym1pdENvbXBsZXRlRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IaWRkZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lk5wVGV4dEJveDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBPcGVuSWRTaWduSW5EaWFsb2cgZXh0ZW5kcyBTaWduSW5EaWFsb2cgaW1wbGVtZW50cwotICAgIEZvcm1QYW5lbC5TdWJtaXRIYW5kbGVyIHsKLSAgc3RhdGljIHsKLSAgICBPcGVuSWRSZXNvdXJjZXMuSS5jc3MoKS5lbnN1cmVJbmplY3RlZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBGbG93UGFuZWwgcGFuZWxXaWRnZXQ7Ci0gIHByaXZhdGUgZmluYWwgRm9ybVBhbmVsIGZvcm07Ci0gIHByaXZhdGUgZmluYWwgRmxvd1BhbmVsIGZvcm1Cb2R5OwotICBwcml2YXRlIGZpbmFsIEZvcm1QYW5lbCByZWRpcmVjdEZvcm07Ci0gIHByaXZhdGUgZmluYWwgRmxvd1BhbmVsIHJlZGlyZWN0Qm9keTsKLQotICBwcml2YXRlIEZsb3dQYW5lbCBlcnJvckxpbmU7Ci0gIHByaXZhdGUgSW5saW5lTGFiZWwgZXJyb3JNc2c7Ci0KLSAgcHJpdmF0ZSBCdXR0b24gbG9naW47Ci0gIHByaXZhdGUgTnBUZXh0Qm94IHByb3ZpZGVySWQ7Ci0gIHByaXZhdGUgQ2hlY2tCb3ggcmVtZW1iZXJJZDsKLSAgcHJpdmF0ZSBib29sZWFuIGRpc2NvdmVyaW5nOwotCi0gIHB1YmxpYyBPcGVuSWRTaWduSW5EaWFsb2coZmluYWwgU2lnbkluTW9kZSByZXF1ZXN0ZWRNb2RlLCBmaW5hbCBTdHJpbmcgdG9rZW4sCi0gICAgICBmaW5hbCBTdHJpbmcgaW5pdGlhbEVycm9yTXNnKSB7Ci0gICAgc3VwZXIocmVxdWVzdGVkTW9kZSwgdG9rZW4pOwotCi0gICAgZm9ybUJvZHkgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgZm9ybUJvZHkuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmxvZ2luRm9ybSgpKTsKLQotICAgIGZvcm0gPSBuZXcgRm9ybVBhbmVsKCk7Ci0gICAgZm9ybS5zZXRNZXRob2QoRm9ybVBhbmVsLk1FVEhPRF9HRVQpOwotICAgIGZvcm0uYWRkU3VibWl0SGFuZGxlcih0aGlzKTsKLSAgICBmb3JtLmFkZChmb3JtQm9keSk7Ci0KLSAgICByZWRpcmVjdEJvZHkgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgcmVkaXJlY3RCb2R5LnNldFZpc2libGUoZmFsc2UpOwotICAgIHJlZGlyZWN0Rm9ybSA9IG5ldyBGb3JtUGFuZWwoKTsKLSAgICByZWRpcmVjdEZvcm0uYWRkKHJlZGlyZWN0Qm9keSk7Ci0KLSAgICBwYW5lbFdpZGdldCA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBwYW5lbFdpZGdldC5hZGQoZm9ybSk7Ci0gICAgcGFuZWxXaWRnZXQuYWRkKHJlZGlyZWN0Rm9ybSk7Ci0gICAgYWRkKHBhbmVsV2lkZ2V0KTsKLQotICAgIGNyZWF0ZUhlYWRlckxvZ28oKTsKLSAgICBjcmVhdGVIZWFkZXJUZXh0KCk7Ci0gICAgY3JlYXRlRXJyb3JCb3goKTsKLSAgICBjcmVhdGVJZGVudEJveCgpOwotCi0gICAgbGluayhPcGVuSWRVcmxzLlVSTF9HT09HTEUsIE9wZW5JZFV0aWwuQy5uYW1lR29vZ2xlKCksIE9wZW5JZFJlc291cmNlcy5JCi0gICAgICAgIC5pY29uR29vZ2xlKCkpOwotICAgIGxpbmsoT3BlbklkVXJscy5VUkxfWUFIT08sIE9wZW5JZFV0aWwuQy5uYW1lWWFob28oKSwgT3BlbklkUmVzb3VyY2VzLkkKLSAgICAgICAgLmljb25ZYWhvbygpKTsKLQotICAgIGlmIChpbml0aWFsRXJyb3JNc2cgIT0gbnVsbCkgewotICAgICAgc2hvd0Vycm9yKGluaXRpYWxFcnJvck1zZyk7Ci0gICAgfQotICAgIGZvcm1Cb2R5LmFkZChuZXcgSFRNTChPcGVuSWRVdGlsLkMud2hhdElzT3BlbklESHRtbCgpKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICBzdXBlci5zaG93KCk7Ci0gICAgcHJvdmlkZXJJZC5zZWxlY3RBbGwoKTsKLSAgICBTY2hlZHVsZXIuZ2V0KCkuc2NoZWR1bGVEZWZlcnJlZChuZXcgU2NoZWR1bGVkQ29tbWFuZCgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgcHJvdmlkZXJJZC5zZXRGb2N1cyh0cnVlKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVIZWFkZXJMb2dvKCkgewotICAgIGZpbmFsIEZsb3dQYW5lbCBoZWFkZXJMb2dvID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGhlYWRlckxvZ28uc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmxvZ28oKSk7Ci0gICAgaGVhZGVyTG9nby5hZGQobmV3IEltYWdlKE9wZW5JZFJlc291cmNlcy5JLm9wZW5pZExvZ28oKSkpOwotICAgIGZvcm1Cb2R5LmFkZChoZWFkZXJMb2dvKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVIZWFkZXJUZXh0KCkgewotICAgIGZpbmFsIEZsb3dQYW5lbCBoZWFkZXJUZXh0ID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGZpbmFsIFN0cmluZyBtZSA9IFdpbmRvdy5Mb2NhdGlvbi5nZXRIb3N0TmFtZSgpOwotICAgIGZpbmFsIFNtYWxsSGVhZGluZyBoZWFkZXJMYWJlbCA9IG5ldyBTbWFsbEhlYWRpbmcoKTsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgIGNhc2UgTElOS19JREVOVElZOgotICAgICAgICBoZWFkZXJMYWJlbC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5saW5rQXQobWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJFR0lTVEVSOgotICAgICAgICBoZWFkZXJMYWJlbC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5yZWdpc3RlckF0KG1lKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTSUdOX0lOOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaGVhZGVyTGFiZWwuc2V0VGV4dChPcGVuSWRVdGlsLk0uc2lnbkluQXQobWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGhlYWRlclRleHQuYWRkKGhlYWRlckxhYmVsKTsKLSAgICBmb3JtQm9keS5hZGQoaGVhZGVyVGV4dCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JCb3goKSB7Ci0gICAgZXJyb3JMaW5lID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShlcnJvckxpbmUuZ2V0RWxlbWVudCgpLCAidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKLSAgICBlcnJvckxpbmUuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmVycm9yKCkpOwotCi0gICAgZXJyb3JNc2cgPSBuZXcgSW5saW5lTGFiZWwoKTsKLSAgICBlcnJvckxpbmUuYWRkKGVycm9yTXNnKTsKLSAgICBmb3JtQm9keS5hZGQoZXJyb3JMaW5lKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIG1zZ1RleHQpIHsKLSAgICBlcnJvck1zZy5zZXRUZXh0KG1zZ1RleHQpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShlcnJvckxpbmUuZ2V0RWxlbWVudCgpLCAidmlzaWJpbGl0eSIsICIiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoaWRlRXJyb3IoKSB7Ci0gICAgRE9NLnNldFN0eWxlQXR0cmlidXRlKGVycm9yTGluZS5nZXRFbGVtZW50KCksICJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUlkZW50Qm94KCkgewotICAgIGJvb2xlYW4gcmVtZW1iZXIgPSBtb2RlID09IFNpZ25Jbk1vZGUuU0lHTl9JTiB8fCBtb2RlID09IFNpZ25Jbk1vZGUuUkVHSVNURVI7Ci0KLSAgICBmaW5hbCBGbG93UGFuZWwgZ3JvdXAgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgZ3JvdXAuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmxvZ2luTGluZSgpKTsKLQotICAgIGZpbmFsIEZsb3dQYW5lbCBsaW5lMSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBncm91cC5hZGQobGluZTEpOwotCi0gICAgcHJvdmlkZXJJZCA9IG5ldyBOcFRleHRCb3goKTsKLSAgICBwcm92aWRlcklkLnNldFZpc2libGVMZW5ndGgoNjApOwotICAgIHByb3ZpZGVySWQuc2V0U3R5bGVOYW1lKE9wZW5JZFJlc291cmNlcy5JLmNzcygpLmlkZW50aWZpZXIoKSk7Ci0gICAgcHJvdmlkZXJJZC5zZXRUYWJJbmRleCgwKTsKLSAgICBwcm92aWRlcklkLmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKGZpbmFsIEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldE5hdGl2ZUV2ZW50KCkuZ2V0S2V5Q29kZSgpID09IEtleUNvZGVzLktFWV9FTlRFUikgewotICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGxpbmUxLmFkZChwcm92aWRlcklkKTsKLQotICAgIGxvZ2luID0gbmV3IEJ1dHRvbigpOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgY2FzZSBMSU5LX0lERU5USVk6Ci0gICAgICAgIGxvZ2luLnNldFRleHQoT3BlbklkVXRpbC5DLmJ1dHRvbkxpbmtJZCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJFR0lTVEVSOgotICAgICAgICBsb2dpbi5zZXRUZXh0KE9wZW5JZFV0aWwuQy5idXR0b25SZWdpc3RlcigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNJR05fSU46Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBsb2dpbi5zZXRUZXh0KE9wZW5JZFV0aWwuQy5idXR0b25TaWduSW4oKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBsb2dpbi5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25DbGljayhmaW5hbCBDbGlja0V2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGZvcm0uc3VibWl0KCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgbG9naW4uc2V0VGFiSW5kZXgocmVtZW1iZXIgPyAyIDogMSk7Ci0gICAgbGluZTEuYWRkKGxvZ2luKTsKLQotICAgIEJ1dHRvbiBjbG9zZSA9IG5ldyBCdXR0b24oR2Vycml0LkMuc2lnbkluRGlhbG9nQ2xvc2UoKSk7Ci0gICAgY2xvc2UuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBoaWRlKCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgY2xvc2Uuc2V0VGFiSW5kZXgocmVtZW1iZXIgPyAzIDogMik7Ci0gICAgbGluZTEuYWRkKGNsb3NlKTsKLQotICAgIGlmIChyZW1lbWJlcikgewotICAgICAgcmVtZW1iZXJJZCA9IG5ldyBDaGVja0JveChPcGVuSWRVdGlsLkMucmVtZW1iZXJNZSgpKTsKLSAgICAgIHJlbWVtYmVySWQuc2V0VGFiSW5kZXgoMSk7Ci0gICAgICBncm91cC5hZGQocmVtZW1iZXJJZCk7Ci0KLSAgICAgIFN0cmluZyBsYXN0ID0gQ29va2llcy5nZXRDb29raWUoT3BlbklkVXJscy5MQVNUSURfQ09PS0lFKTsKLSAgICAgIGlmIChsYXN0ICE9IG51bGwgJiYgISIiLmVxdWFscyhsYXN0KSkgewotICAgICAgICBpZiAobGFzdC5zdGFydHNXaXRoKCJcIiIpICYmIGxhc3QuZW5kc1dpdGgoIlwiIikpIHsKLSAgICAgICAgICAvLyBEZXF1b3RlIHRoZSB2YWx1ZS4gV2Ugc2hvdWxkbid0IGhhdmUgdG8gZG8gdGhpcywgYnV0Ci0gICAgICAgICAgLy8gc29tZXRoaW5nIGlzIGNhdXNpbmcgc29tZSBHb29nbGUgQWNjb3VudCB0b2tlbnMgdG8gZ2V0Ci0gICAgICAgICAgLy8gd3JhcHBlZCB1cCBpbiBkb3VibGUgcXVvdGVzIHdoZW4gb2J0YWluZWQgZnJvbSB0aGUgY29va2llLgotICAgICAgICAgIC8vCi0gICAgICAgICAgbGFzdCA9IGxhc3Quc3Vic3RyaW5nKDEsIGxhc3QubGVuZ3RoKCkgLSAyKTsKLSAgICAgICAgfQotICAgICAgICBwcm92aWRlcklkLnNldFRleHQobGFzdCk7Ci0gICAgICAgIHJlbWVtYmVySWQuc2V0VmFsdWUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9ybUJvZHkuYWRkKGdyb3VwKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBsaW5rKGZpbmFsIFN0cmluZyBpZGVudFVybCwgZmluYWwgU3RyaW5nIHdobywKLSAgICAgIGZpbmFsIEltYWdlUmVzb3VyY2UgaWNvbikgewotICAgIGlmICghaXNBbGxvd2VkUHJvdmlkZXIoaWRlbnRVcmwpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmluYWwgQ2xpY2tIYW5kbGVyIGkgPSBuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgaWYgKCFkaXNjb3ZlcmluZykgewotICAgICAgICAgIHByb3ZpZGVySWQuc2V0VGV4dChpZGVudFVybCk7Ci0gICAgICAgICAgZm9ybS5zdWJtaXQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH07Ci0KLSAgICBmaW5hbCBGbG93UGFuZWwgbGluZSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBsaW5lLmFkZFN0eWxlTmFtZShPcGVuSWRSZXNvdXJjZXMuSS5jc3MoKS5kaXJlY3RMaW5rKCkpOwotCi0gICAgZmluYWwgSW1hZ2UgaW1nID0gbmV3IEltYWdlKGljb24pOwotICAgIGltZy5hZGRDbGlja0hhbmRsZXIoaSk7Ci0gICAgbGluZS5hZGQoaW1nKTsKLQotICAgIGZpbmFsIEFuY2hvciB0ZXh0ID0gbmV3IEFuY2hvcigpOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgY2FzZSBMSU5LX0lERU5USVk6Ci0gICAgICAgIHRleHQuc2V0VGV4dChPcGVuSWRVdGlsLk0ubGlua1dpdGgod2hvKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSRUdJU1RFUjoKLSAgICAgICAgdGV4dC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5yZWdpc3RlcldpdGgod2hvKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTSUdOX0lOOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGV4dC5zZXRUZXh0KE9wZW5JZFV0aWwuTS5zaWduSW5XaXRoKHdobykpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgdGV4dC5zZXRIcmVmKGlkZW50VXJsKTsKLSAgICB0ZXh0LmFkZENsaWNrSGFuZGxlcihpKTsKLSAgICBsaW5lLmFkZCh0ZXh0KTsKLQotICAgIGZvcm1Cb2R5LmFkZChsaW5lKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBbGxvd2VkUHJvdmlkZXIoZmluYWwgU3RyaW5nIGlkZW50VXJsKSB7Ci0gICAgZm9yIChPcGVuSWRQcm92aWRlclBhdHRlcm4gcCA6IEdlcnJpdC5nZXRDb25maWcoKS5nZXRBbGxvd2VkT3BlbklEcygpKSB7Ci0gICAgICBpZiAocC5tYXRjaGVzKGlkZW50VXJsKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVuYWJsZShmaW5hbCBib29sZWFuIG9uKSB7Ci0gICAgcHJvdmlkZXJJZC5zZXRFbmFibGVkKG9uKTsKLSAgICBsb2dpbi5zZXRFbmFibGVkKG9uKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBvbkRpc2NvdmVyeShmaW5hbCBEaXNjb3ZlcnlSZXN1bHQgcmVzdWx0KSB7Ci0gICAgZGlzY292ZXJpbmcgPSBmYWxzZTsKLQotICAgIHN3aXRjaCAocmVzdWx0LnN0YXR1cykgewotICAgICAgY2FzZSBWQUxJRDoKLSAgICAgICAgLy8gVGhlIHByb3ZpZGVyIHdvbid0IHN1cHBvcnQgb3BlcmF0aW9uIGluc2lkZSBhbiBJRlJBTUUsCi0gICAgICAgIC8vIHNvIHdlIHJlcGxhY2Ugb3VyIGVudGlyZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgLy8KLSAgICAgICAgcmVkaXJlY3RGb3JtLnNldE1ldGhvZChGb3JtUGFuZWwuTUVUSE9EX1BPU1QpOwotICAgICAgICByZWRpcmVjdEZvcm0uc2V0QWN0aW9uKHJlc3VsdC5wcm92aWRlclVybCk7Ci0gICAgICAgIHJlZGlyZWN0Qm9keS5jbGVhcigpOwotICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHJlc3VsdC5wcm92aWRlckFyZ3MuZW50cnlTZXQoKSkgewotICAgICAgICAgIHJlZGlyZWN0Qm9keS5hZGQobmV3IEhpZGRlbihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpKTsKLSAgICAgICAgfQotICAgICAgICBGb3JtRWxlbWVudC5hcyhyZWRpcmVjdEZvcm0uZ2V0RWxlbWVudCgpKS5zZXRUYXJnZXQoIl90b3AiKTsKLSAgICAgICAgcmVkaXJlY3RGb3JtLnN1Ym1pdCgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBOT1RfQUxMT1dFRDoKLSAgICAgICAgc2hvd0Vycm9yKE9wZW5JZFV0aWwuQy5ub3RBbGxvd2VkKCkpOwotICAgICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBOT19QUk9WSURFUjoKLSAgICAgICAgc2hvd0Vycm9yKE9wZW5JZFV0aWwuQy5ub1Byb3ZpZGVyKCkpOwotICAgICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBFUlJPUjoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHNob3dFcnJvcihPcGVuSWRVdGlsLkMuZXJyb3IoKSk7Ci0gICAgICAgIGVuYWJsZVJldHJ5RGlzY292ZXJ5KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGVSZXRyeURpc2NvdmVyeSgpIHsKLSAgICBlbmFibGUodHJ1ZSk7Ci0gICAgcHJvdmlkZXJJZC5zZWxlY3RBbGwoKTsKLSAgICBwcm92aWRlcklkLnNldEZvY3VzKHRydWUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uU3VibWl0KGZpbmFsIFN1Ym1pdEV2ZW50IGV2ZW50KSB7Ci0gICAgZXZlbnQuY2FuY2VsKCk7Ci0KLSAgICBTdHJpbmcgb3BlbmlkSWRlbnRpZmllciA9IHByb3ZpZGVySWQuZ2V0VGV4dCgpOwotICAgIGlmIChvcGVuaWRJZGVudGlmaWVyID09IG51bGwgfHwgb3BlbmlkSWRlbnRpZmllci5lcXVhbHMoIiIpKSB7Ci0gICAgICBlbmFibGUodHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFvcGVuaWRJZGVudGlmaWVyLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKQotICAgICAgICAmJiAhb3BlbmlkSWRlbnRpZmllci5zdGFydHNXaXRoKCJodHRwczovLyIpKSB7Ci0gICAgICBvcGVuaWRJZGVudGlmaWVyID0gImh0dHA6Ly8iICsgb3BlbmlkSWRlbnRpZmllcjsKLSAgICB9Ci0KLSAgICBpZiAoIWlzQWxsb3dlZFByb3ZpZGVyKG9wZW5pZElkZW50aWZpZXIpKSB7Ci0gICAgICBzaG93RXJyb3IoT3BlbklkVXRpbC5DLm5vdEFsbG93ZWQoKSk7Ci0gICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRpc2NvdmVyaW5nID0gdHJ1ZTsKLSAgICBlbmFibGUoZmFsc2UpOwotICAgIGhpZGVFcnJvcigpOwotCi0gICAgZmluYWwgYm9vbGVhbiByZW1lbWJlciA9IHJlbWVtYmVySWQgIT0gbnVsbCAmJiByZW1lbWJlcklkLmdldFZhbHVlKCk7Ci0gICAgT3BlbklkVXRpbC5TVkMuZGlzY292ZXIob3BlbmlkSWRlbnRpZmllciwgbW9kZSwgcmVtZW1iZXIsIHRva2VuLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8RGlzY292ZXJ5UmVzdWx0PigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgRGlzY292ZXJ5UmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgb25EaXNjb3ZlcnkocmVzdWx0KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7Ci0gICAgICAgICAgICBlbmFibGVSZXRyeURpc2NvdmVyeSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBvblN1Ym1pdENvbXBsZXRlKGZpbmFsIEZvcm1TdWJtaXRDb21wbGV0ZUV2ZW50IGV2ZW50KSB7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRTc29QYW5lbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFNzb1BhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGQ3OTQuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFNzb1BhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmF1dGgub3BlbmlkOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLkRpc2NvdmVyeVJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkZvcm1FbGVtZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb3JtUGFuZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSGlkZGVuOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIE9wZW5JZFNzb1BhbmVsIGV4dGVuZHMgRmxvd1BhbmVsIHsKLSAgcHJpdmF0ZSBmaW5hbCBGb3JtUGFuZWwgcmVkaXJlY3RGb3JtOwotICBwcml2YXRlIGZpbmFsIEZsb3dQYW5lbCByZWRpcmVjdEJvZHk7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHNzb1VybDsKLQotICBwdWJsaWMgT3BlbklkU3NvUGFuZWwoKSB7Ci0gICAgc3VwZXIoKTsKLSAgICByZWRpcmVjdEJvZHkgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgcmVkaXJlY3RCb2R5LnNldFZpc2libGUoZmFsc2UpOwotICAgIHJlZGlyZWN0Rm9ybSA9IG5ldyBGb3JtUGFuZWwoKTsKLSAgICByZWRpcmVjdEZvcm0uYWRkKHJlZGlyZWN0Qm9keSk7Ci0KLSAgICBhZGQocmVkaXJlY3RGb3JtKTsKLQotICAgIHNzb1VybCA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRPcGVuSWRTc29VcmwoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGF1dGhlbnRpY2F0ZShTaWduSW5Nb2RlIHJlcXVlc3RlZE1vZGUsIGZpbmFsIFN0cmluZyB0b2tlbikgewotICAgIE9wZW5JZFV0aWwuU1ZDLmRpc2NvdmVyKHNzb1VybCwgcmVxdWVzdGVkTW9kZSwgLyogcmVtZW1iZXIgKi8gZmFsc2UsIHRva2VuLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8RGlzY292ZXJ5UmVzdWx0PigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgRGlzY292ZXJ5UmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgb25EaXNjb3ZlcnkocmVzdWx0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9uRGlzY292ZXJ5KGZpbmFsIERpc2NvdmVyeVJlc3VsdCByZXN1bHQpIHsKLSAgICBzd2l0Y2ggKHJlc3VsdC5zdGF0dXMpIHsKLSAgICAgIGNhc2UgVkFMSUQ6Ci0gICAgICAgIHJlZGlyZWN0Rm9ybS5zZXRNZXRob2QoRm9ybVBhbmVsLk1FVEhPRF9QT1NUKTsKLSAgICAgICAgcmVkaXJlY3RGb3JtLnNldEFjdGlvbihyZXN1bHQucHJvdmlkZXJVcmwpOwotICAgICAgICByZWRpcmVjdEJvZHkuY2xlYXIoKTsKLSAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiByZXN1bHQucHJvdmlkZXJBcmdzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICByZWRpcmVjdEJvZHkuYWRkKG5ldyBIaWRkZW4oZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgRm9ybUVsZW1lbnQuYXMocmVkaXJlY3RGb3JtLmdldEVsZW1lbnQoKSkuc2V0VGFyZ2V0KCJfdG9wIik7Ci0gICAgICAgIHJlZGlyZWN0Rm9ybS5zdWJtaXQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkVXRpbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL09wZW5JZFV0aWwuamF2YQppbmRleCAxNWFlYjM0Li5kNWI3Njg0IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvT3BlbklkVXRpbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9PcGVuSWRVdGlsLmphdmEKQEAgLTE0LDE5ICsxNCwxMiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLm9wZW5pZDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5PcGVuSWRTZXJ2aWNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50Lkpzb25VdGlsOwogCiBwdWJsaWMgY2xhc3MgT3BlbklkVXRpbCB7CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3BlbklkQ29uc3RhbnRzIEM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgT3BlbklkTWVzc2FnZXMgTTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBPcGVuSWRTZXJ2aWNlIFNWQzsKIAogICBzdGF0aWMgewogICAgIEMgPSBHV1QuY3JlYXRlKE9wZW5JZENvbnN0YW50cy5jbGFzcyk7Ci0gICAgTSA9IEdXVC5jcmVhdGUoT3BlbklkTWVzc2FnZXMuY2xhc3MpOwotICAgIFNWQyA9IEdXVC5jcmVhdGUoT3BlbklkU2VydmljZS5jbGFzcyk7Ci0gICAgSnNvblV0aWwuYmluZChTVkMsICJycGMvT3BlbklkU2VydmljZSIpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbkdvb2dsZS5naWYgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbkdvb2dsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OGZkMjAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL2ljb25Hb29nbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvb3BlbmlkL2ljb25ZYWhvby5naWYgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbllhaG9vLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyMDQ1NS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWNvbllhaG9vLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9pZGVudGlmaWVyQmFja2dyb3VuZC5naWYgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvaWRlbnRpZmllckJhY2tncm91bmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU4MzZjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9pZGVudGlmaWVyQmFja2dyb3VuZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvb3BlbmlkLmNzcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWQuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTQ3NWVlLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWQuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLUBleHRlcm5hbCAuZ3d0LUJ1dHRvbjsKLQotQHVybCBpZGVudGlmaWVyQmFja2dyb3VuZCBpZGVudGlmaWVyQmFja2dyb3VuZDsKLQotLmxvZ2luRm9ybSB7Ci0gIG1hcmdpbi1sZWZ0OiAxMHB4OwotICBtYXJnaW4tcmlnaHQ6IDEwcHg7Ci19Ci0KLS5sb2dvIHsKLSAgdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLS5sb2dpbkxpbmUgewotICBtYXJnaW4tYm90dG9tOiAxMHB4OwotfQotLmxvZ2luTGluZSBkaXYgewotICB3aGl0ZS1zcGFjZTogbm93cmFwOwotfQotLmxvZ2luTGluZSAuZ3d0LUJ1dHRvbiB7Ci0gIG1hcmdpbi1sZWZ0OiAycHg7Ci19Ci0KLS5pZGVudGlmaWVyIHsKLSAgYmFja2dyb3VuZDogI2ZmZmZmZiBpZGVudGlmaWVyQmFja2dyb3VuZCBuby1yZXBlYXQgc2Nyb2xsIDVweCA1MCU7Ci0gIHBhZGRpbmctbGVmdDogMjVweDsKLSAgYm9yZGVyOiAxcHggc29saWQgIzk5OTk5OTsKLX0KLQotLmRpcmVjdExpbmsgewotICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwotICBtYXJnaW4tcmlnaHQ6IDVweDsKLSAgY29sb3I6IGJsdWU7Ci0gIGN1cnNvcjogcG9pbnRlcjsKLX0KLS5kaXJlY3RMaW5rOmhvdmVyIHsKLSAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0uZGlyZWN0TGluayBpbWcgewotICBtYXJnaW4tcmlnaHQ6IDNweDsKLSAgYm9yZGVyOiAwIG5vbmU7Ci19Ci0KLS5lcnJvciB7Ci0gIHBhZGRpbmctdG9wOiA1cHg7Ci0gIHBhZGRpbmctYm90dG9tOiA1cHg7Ci19Ci0uZXJyb3Igc3BhbiB7Ci0gIHBhZGRpbmctdG9wOiA0cHg7Ci0gIHBhZGRpbmctYm90dG9tOiA0cHg7Ci0gIHBhZGRpbmctbGVmdDogMTBweDsKLSAgcGFkZGluZy1yaWdodDogMTBweDsKLSAgYmFja2dyb3VuZDogI2ZmZjFhODsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWRMb2dvLnBuZyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL29wZW5pZC9vcGVuaWRMb2dvLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4ZmE3My4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC9vcGVuaWQvb3BlbmlkTG9nby5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNjM2OS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nd3QuaTE4bi5jbGllbnQuQ29uc3RhbnRzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJQYXNzQ29uc3RhbnRzIGV4dGVuZHMgQ29uc3RhbnRzIHsKLSAgU3RyaW5nIGJ1dHRvblNpZ25JbigpOwotICBTdHJpbmcgdXNlcm5hbWUoKTsKLSAgU3RyaW5nIHBhc3N3b3JkKCk7Ci0gIFN0cmluZyBpbnZhbGlkTG9naW4oKTsKLSAgU3RyaW5nIHVzZXJuYW1lUmVxdWlyZWQoKTsKLSAgU3RyaW5nIHBhc3N3b3JkUmVxdWlyZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzQ29uc3RhbnRzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTIwNGY3Yi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0NvbnN0YW50cy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1idXR0b25TaWduSW4gPSBTaWduIEluCi11c2VybmFtZSA9IFVzZXJuYW1lCi1wYXNzd29yZCA9IFBhc3N3b3JkCi1pbnZhbGlkTG9naW4gPSBJbmNvcnJlY3QgdXNlcm5hbWUgb3IgcGFzc3dvcmQuCi11c2VybmFtZVJlcXVpcmVkID0gUGxlYXNlIGVudGVyIGEgdXNlcm5hbWUuCi1wYXNzd29yZFJlcXVpcmVkID0gUGxlYXNlIGVudGVyIGEgcGFzc3dvcmQuCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc0Nzcy5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NDc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5N2NjYTEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NDc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC51c2VycGFzczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnJlc291cmNlcy5jbGllbnQuQ3NzUmVzb3VyY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVXNlclBhc3NDc3MgZXh0ZW5kcyBDc3NSZXNvdXJjZSB7Ci0gIFN0cmluZyBsb2dpbkZvcm0oKTsKLSAgU3RyaW5nIGVycm9yKCk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZGQxZWMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmkxOG4uY2xpZW50Lk1lc3NhZ2VzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVzZXJQYXNzTWVzc2FnZXMgZXh0ZW5kcyBNZXNzYWdlcyB7Ci0gIFN0cmluZyBzaWduSW5BdChTdHJpbmcgaG9zdG5hbWUpOwotICBTdHJpbmcgYXV0aGVudGljYXRpb25VbmF2YWlsYWJsZShBdXRoVHlwZSBhdXRoVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWFiMzUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1zaWduSW5BdCA9IFNpZ24gSW4gdG8gR2Vycml0IENvZGUgUmV2aWV3IGF0IHswfQotYXV0aGVudGljYXRpb25VbmF2YWlsYWJsZSA9IHswfSBhdXRoZW50aWNhdGlvbiB1bmF2YWlsYWJsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NSZXNvdXJjZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzUmVzb3VyY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDc0Y2QuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXNlclBhc3NSZXNvdXJjZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC51c2VycGFzczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5yZXNvdXJjZXMuY2xpZW50LkNsaWVudEJ1bmRsZTsKLQotaW50ZXJmYWNlIFVzZXJQYXNzUmVzb3VyY2VzIGV4dGVuZHMgQ2xpZW50QnVuZGxlIHsKLSAgc3RhdGljIGZpbmFsIFVzZXJQYXNzUmVzb3VyY2VzIEkgPSBHV1QuY3JlYXRlKFVzZXJQYXNzUmVzb3VyY2VzLmNsYXNzKTsKLQotICBAU291cmNlKCJ1c2VycGFzcy5jc3MiKQotICBVc2VyUGFzc0NzcyBjc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzU2lnbkluRGlhbG9nLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy9Vc2VyUGFzc1NpZ25JbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDYzNjQwLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1VzZXJQYXNzU2lnbkluRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hdXRoLnVzZXJwYXNzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuU2lnbkluRGlhbG9nOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgudXNlcnBhc3MuTG9naW5SZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlci5TY2hlZHVsZWRDb21tYW5kOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93LkxvY2F0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkJ1dHRvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYXNzd29yZFRleHRCb3g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuVGV4dEJveDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuR2xvYmFsS2V5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRCb3g7Ci0KLXB1YmxpYyBjbGFzcyBVc2VyUGFzc1NpZ25JbkRpYWxvZyBleHRlbmRzIFNpZ25JbkRpYWxvZyB7Ci0gIHN0YXRpYyB7Ci0gICAgVXNlclBhc3NSZXNvdXJjZXMuSS5jc3MoKS5lbnN1cmVJbmplY3RlZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBGbG93UGFuZWwgZm9ybUJvZHk7Ci0KLSAgcHJpdmF0ZSBGbG93UGFuZWwgZXJyb3JMaW5lOwotICBwcml2YXRlIElubGluZUxhYmVsIGVycm9yTXNnOwotCi0gIHByaXZhdGUgQnV0dG9uIGxvZ2luOwotICBwcml2YXRlIEJ1dHRvbiBjbG9zZTsKLSAgcHJpdmF0ZSBUZXh0Qm94IHVzZXJuYW1lOwotICBwcml2YXRlIFRleHRCb3ggcGFzc3dvcmQ7Ci0KLSAgcHVibGljIFVzZXJQYXNzU2lnbkluRGlhbG9nKGZpbmFsIFN0cmluZyB0b2tlbiwgZmluYWwgU3RyaW5nIGluaXRpYWxFcnJvck1zZykgewotICAgIHN1cGVyKFNpZ25Jbk1vZGUuU0lHTl9JTiwgdG9rZW4pOwotICAgIHNldEF1dG9IaWRlRW5hYmxlZChmYWxzZSk7Ci0KLSAgICBmb3JtQm9keSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBmb3JtQm9keS5zZXRTdHlsZU5hbWUoVXNlclBhc3NSZXNvdXJjZXMuSS5jc3MoKS5sb2dpbkZvcm0oKSk7Ci0gICAgYWRkKGZvcm1Cb2R5KTsKLQotICAgIGNyZWF0ZUhlYWRlclRleHQoKTsKLSAgICBjcmVhdGVFcnJvckJveCgpOwotICAgIGNyZWF0ZVVzZXJuYW1lQm94KCk7Ci0gICAgaWYgKGluaXRpYWxFcnJvck1zZyAhPSBudWxsKSB7Ci0gICAgICBzaG93RXJyb3IoaW5pdGlhbEVycm9yTXNnKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2hvdygpIHsKLSAgICBzdXBlci5zaG93KCk7Ci0gICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIHVzZXJuYW1lLnNldEZvY3VzKHRydWUpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUhlYWRlclRleHQoKSB7Ci0gICAgZmluYWwgRmxvd1BhbmVsIGhlYWRlclRleHQgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgZmluYWwgU21hbGxIZWFkaW5nIGhlYWRlckxhYmVsID0gbmV3IFNtYWxsSGVhZGluZygpOwotICAgIGhlYWRlckxhYmVsLnNldFRleHQoVXRpbC5NLnNpZ25JbkF0KExvY2F0aW9uLmdldEhvc3ROYW1lKCkpKTsKLSAgICBoZWFkZXJUZXh0LmFkZChoZWFkZXJMYWJlbCk7Ci0gICAgZm9ybUJvZHkuYWRkKGhlYWRlclRleHQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVycm9yQm94KCkgewotICAgIGVycm9yTGluZSA9IG5ldyBGbG93UGFuZWwoKTsKLSAgICBET00uc2V0U3R5bGVBdHRyaWJ1dGUoZXJyb3JMaW5lLmdldEVsZW1lbnQoKSwgInZpc2liaWxpdHkiLCAiaGlkZGVuIik7Ci0gICAgZXJyb3JMaW5lLnNldFN0eWxlTmFtZShVc2VyUGFzc1Jlc291cmNlcy5JLmNzcygpLmVycm9yKCkpOwotCi0gICAgZXJyb3JNc2cgPSBuZXcgSW5saW5lTGFiZWwoKTsKLSAgICBlcnJvckxpbmUuYWRkKGVycm9yTXNnKTsKLSAgICBmb3JtQm9keS5hZGQoZXJyb3JMaW5lKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzaG93RXJyb3IoZmluYWwgU3RyaW5nIG1zZ1RleHQpIHsKLSAgICBlcnJvck1zZy5zZXRUZXh0KG1zZ1RleHQpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShlcnJvckxpbmUuZ2V0RWxlbWVudCgpLCAidmlzaWJpbGl0eSIsICIiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBoaWRlRXJyb3IoKSB7Ci0gICAgRE9NLnNldFN0eWxlQXR0cmlidXRlKGVycm9yTGluZS5nZXRFbGVtZW50KCksICJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVVzZXJuYW1lQm94KCkgewotICAgIHVzZXJuYW1lID0gbmV3IE5wVGV4dEJveCgpOwotICAgIHVzZXJuYW1lLnNldFZpc2libGVMZW5ndGgoMjUpOwotICAgIHVzZXJuYW1lLmFkZEtleVByZXNzSGFuZGxlcihuZXcgS2V5UHJlc3NIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKGZpbmFsIEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGV2ZW50LmdldE5hdGl2ZUV2ZW50KCkuZ2V0S2V5Q29kZSgpID09IEtleUNvZGVzLktFWV9FTlRFUikgewotICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgICAgICAgcGFzc3dvcmQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgcGFzc3dvcmQuc2V0Rm9jdXModHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHBhc3N3b3JkID0gbmV3IFBhc3N3b3JkVGV4dEJveCgpOwotICAgIHBhc3N3b3JkLnNldFZpc2libGVMZW5ndGgoMjUpOwotICAgIHBhc3N3b3JkLmFkZEtleVByZXNzSGFuZGxlcihHbG9iYWxLZXkuU1RPUF9QUk9QQUdBVElPTik7Ci0gICAgcGFzc3dvcmQuYWRkS2V5UHJlc3NIYW5kbGVyKG5ldyBLZXlQcmVzc0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uS2V5UHJlc3MoZmluYWwgS2V5UHJlc3NFdmVudCBldmVudCkgewotICAgICAgICBpZiAoZXZlbnQuZ2V0TmF0aXZlRXZlbnQoKS5nZXRLZXlDb2RlKCkgPT0gS2V5Q29kZXMuS0VZX0VOVEVSKSB7Ci0gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKLSAgICAgICAgICBvbkxvZ2luKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLQotICAgIGZpbmFsIEZsb3dQYW5lbCBidXR0b25zID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGJ1dHRvbnMuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZXJyb3JEaWFsb2dCdXR0b25zKCkpOwotCi0gICAgbG9naW4gPSBuZXcgQnV0dG9uKCk7Ci0gICAgbG9naW4uc2V0VGV4dChVdGlsLkMuYnV0dG9uU2lnbkluKCkpOwotICAgIGxvZ2luLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgb25Mb2dpbigpOwotICAgICAgfQotICAgIH0pOwotICAgIGJ1dHRvbnMuYWRkKGxvZ2luKTsKLQotICAgIGNsb3NlID0gbmV3IEJ1dHRvbigpOwotICAgIERPTS5zZXRTdHlsZUF0dHJpYnV0ZShjbG9zZS5nZXRFbGVtZW50KCksICJtYXJnaW5MZWZ0IiwgIjQ1cHgiKTsKLSAgICBjbG9zZS5zZXRUZXh0KEdlcnJpdC5DLnNpZ25JbkRpYWxvZ0Nsb3NlKCkpOwotICAgIGNsb3NlLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaGlkZSgpOwotICAgICAgfQotICAgIH0pOwotICAgIGJ1dHRvbnMuYWRkKGNsb3NlKTsKLQotICAgIGZpbmFsIEdyaWQgZm9ybUdyaWQgPSBuZXcgR3JpZCgzLCAyKTsKLSAgICBmb3JtR3JpZC5zZXRUZXh0KDAsIDAsIFV0aWwuQy51c2VybmFtZSgpKTsKLSAgICBmb3JtR3JpZC5zZXRUZXh0KDEsIDAsIFV0aWwuQy5wYXNzd29yZCgpKTsKLSAgICBmb3JtR3JpZC5zZXRXaWRnZXQoMCwgMSwgdXNlcm5hbWUpOwotICAgIGZvcm1HcmlkLnNldFdpZGdldCgxLCAxLCBwYXNzd29yZCk7Ci0gICAgZm9ybUdyaWQuc2V0V2lkZ2V0KDIsIDEsIGJ1dHRvbnMpOwotICAgIGZvcm1Cb2R5LmFkZChmb3JtR3JpZCk7Ci0KLSAgICB1c2VybmFtZS5zZXRUYWJJbmRleCgxKTsKLSAgICBwYXNzd29yZC5zZXRUYWJJbmRleCgyKTsKLSAgICBsb2dpbi5zZXRUYWJJbmRleCgzKTsKLSAgICBjbG9zZS5zZXRUYWJJbmRleCg0KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBlbmFibGUoZmluYWwgYm9vbGVhbiBvbikgewotICAgIHVzZXJuYW1lLnNldEVuYWJsZWQob24pOwotICAgIHBhc3N3b3JkLnNldEVuYWJsZWQob24pOwotICAgIGxvZ2luLnNldEVuYWJsZWQob24pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9uTG9naW4oKSB7Ci0gICAgaGlkZUVycm9yKCk7Ci0KLSAgICBmaW5hbCBTdHJpbmcgdXNlciA9IHVzZXJuYW1lLmdldFRleHQoKTsKLSAgICBpZiAodXNlciA9PSBudWxsIHx8IHVzZXIuZXF1YWxzKCIiKSkgewotICAgICAgc2hvd0Vycm9yKFV0aWwuQy51c2VybmFtZVJlcXVpcmVkKCkpOwotICAgICAgdXNlcm5hbWUuc2V0Rm9jdXModHJ1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIHBhc3MgPSBwYXNzd29yZC5nZXRUZXh0KCk7Ci0gICAgaWYgKHBhc3MgPT0gbnVsbCB8fCBwYXNzLmVxdWFscygiIikpIHsKLSAgICAgIHNob3dFcnJvcihVdGlsLkMucGFzc3dvcmRSZXF1aXJlZCgpKTsKLSAgICAgIHBhc3N3b3JkLnNldEZvY3VzKHRydWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGVuYWJsZShmYWxzZSk7Ci0gICAgVXRpbC5TVkMuYXV0aGVudGljYXRlKHVzZXIsIHBhc3MsIG5ldyBHZXJyaXRDYWxsYmFjazxMb2dpblJlc3VsdD4oKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgTG9naW5SZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgewotICAgICAgICAgIFN0cmluZyB0byA9IHRva2VuOwotICAgICAgICAgIGlmICghdG8uc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICB0byA9ICIvIiArIHRvOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocmVzdWx0LmlzTmV3ICYmICF0b2tlbi5zdGFydHNXaXRoKFBhZ2VMaW5rcy5SRUdJU1RFUiArICIvIikpIHsKLSAgICAgICAgICAgIHRvID0gUGFnZUxpbmtzLlJFR0lTVEVSICsgdG87Ci0gICAgICAgICAgfQotICAgICAgICAgIExvY2F0aW9uLnJlcGxhY2UoTG9jYXRpb24uZ2V0UGF0aCgpICsgImxvZ2luIiArIHRvKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5nZXRFcnJvcigpKSB7Ci0gICAgICAgICAgICBjYXNlIEFVVEhFTlRJQ0FUSU9OX1VOQVZBSUxBQkxFOgotICAgICAgICAgICAgICBtZXNzYWdlID0gVXRpbC5NLmF1dGhlbnRpY2F0aW9uVW5hdmFpbGFibGUocmVzdWx0LmdldEF1dGhUeXBlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5WQUxJRF9MT0dJTjoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIG1lc3NhZ2UgPSBVdGlsLkMuaW52YWxpZExvZ2luKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHNob3dFcnJvcihtZXNzYWdlKTsKLSAgICAgICAgICBlbmFibGUodHJ1ZSk7Ci0gICAgICAgICAgcGFzc3dvcmQuc2VsZWN0QWxsKCk7Ci0gICAgICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgICAgICAgIHBhc3N3b3JkLnNldEZvY3VzKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKLSAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7Ci0gICAgICAgIGVuYWJsZSh0cnVlKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXRpbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZjZTA0Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9hdXRoL3VzZXJwYXNzL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYXV0aC51c2VycGFzczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLnVzZXJwYXNzLlVzZXJQYXNzQXV0aFNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuSnNvblV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBVc2VyUGFzc0NvbnN0YW50cyBDID0gR1dULmNyZWF0ZShVc2VyUGFzc0NvbnN0YW50cy5jbGFzcyk7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVXNlclBhc3NNZXNzYWdlcyBNID0gR1dULmNyZWF0ZShVc2VyUGFzc01lc3NhZ2VzLmNsYXNzKTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBVc2VyUGFzc0F1dGhTZXJ2aWNlIFNWQzsKLQotICBzdGF0aWMgewotICAgIFNWQyA9IEdXVC5jcmVhdGUoVXNlclBhc3NBdXRoU2VydmljZS5jbGFzcyk7Ci0gICAgSnNvblV0aWwuYmluZChTVkMsICJycGMvVXNlclBhc3NBdXRoU2VydmljZSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy91c2VycGFzcy5jc3MgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvYXV0aC91c2VycGFzcy91c2VycGFzcy5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YTMyYzkuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2F1dGgvdXNlcnBhc3MvdXNlcnBhc3MuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS5sb2dpbkZvcm0gewotICBtYXJnaW4tbGVmdDogMTBweDsKLSAgbWFyZ2luLXJpZ2h0OiAxMHB4OwotfQotCi0uZXJyb3IgewotICBwYWRkaW5nLXRvcDogNXB4OwotICBwYWRkaW5nLWJvdHRvbTogNXB4OwotfQotCi0uZXJyb3Igc3BhbiB7Ci0gIHBhZGRpbmctdG9wOiA0cHg7Ci0gIHBhZGRpbmctYm90dG9tOiA0cHg7Ci0gIHBhZGRpbmctbGVmdDogMTBweDsKLSAgcGFkZGluZy1yaWdodDogMTBweDsKLSAgYmFja2dyb3VuZDogI2ZmZjFhODsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0FjY291bnREYXNoYm9hcmRTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0FjY291bnREYXNoYm9hcmRTY3JlZW4uamF2YQppbmRleCAwNWRkNWQ5Li4yNTgwNTQyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9BY2NvdW50RGFzaGJvYXJkU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQWNjb3VudERhc2hib2FyZFNjcmVlbi5qYXZhCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lk5vdEZvdW5kU2NyZWVuOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwpAQCAtNjQsMTUgKzY1LDE1IEBACiAgICAgc3VwZXIub25Mb2FkKCk7CiAgICAgU3RyaW5nIHdobyA9IG1pbmUgPyAic2VsZiIgOiBvd25lcklkLnRvU3RyaW5nKCk7CiAgICAgQ2hhbmdlTGlzdC5xdWVyeSgKLSAgICAgICAgbmV3IFNjcmVlbkxvYWRDYWxsYmFjazxOYXRpdmVMaXN0PENoYW5nZUxpc3Q+Pih0aGlzKSB7CisgICAgICAgIG5ldyBTY3JlZW5Mb2FkQ2FsbGJhY2s8SnNBcnJheTxDaGFuZ2VMaXN0Pj4odGhpcykgewogICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByZURpc3BsYXkoTmF0aXZlTGlzdDxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KEpzQXJyYXk8Q2hhbmdlTGlzdD4gcmVzdWx0KSB7CiAgICAgICAgICAgICBkaXNwbGF5KHJlc3VsdCk7CiAgICAgICAgICAgfQogICAgICAgICB9LAogICAgICAgICAiaXM6b3BlbiBvd25lcjoiICsgd2hvLAogICAgICAgICAiaXM6b3BlbiByZXZpZXdlcjoiICsgd2hvICsgIiAtb3duZXI6IiArIHdobywKLSAgICAgICAgImlzOmNsb3NlZCBvd25lcjoiICsgd2hvICsgIiAtYWdlOjF3IGxpbWl0OjEwIik7CisgICAgICAgICJpczpjbG9zZWQgb3duZXI6IiArIHdobyArICIgLWFnZTo0dyBsaW1pdDoxMCIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC04MSw3ICs4Miw3IEBACiAgICAgdGFibGUuc2V0UmVnaXN0ZXJLZXlzKHRydWUpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXkoTmF0aXZlTGlzdDxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgcHJpdmF0ZSB2b2lkIGRpc3BsYXkoSnNBcnJheTxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKICAgICBpZiAoIW1pbmUgJiYgIWhhc0NoYW5nZXMocmVzdWx0KSkgewogICAgICAgLy8gV2hlbiBubyByZXN1bHRzIGFyZSByZXR1cm5lZCBhbmQgdGhlIGRhdGEgaXMgbm90IGZvciB0aGUKICAgICAgIC8vIGN1cnJlbnQgdXNlciwgdGhlIHRhcmdldCB1c2VyIGlzIHByZXN1bWVkIHRvIG5vdCBleGlzdC4KQEAgLTExMiw3ICsxMTMsNyBAQAogICAgICAgfQogICAgIH0KIAotICAgIENvbGxlY3Rpb25zLnNvcnQob3V0LmFzTGlzdCgpLCBvdXRDb21wYXJhdG9yKCkpOworICAgIENvbGxlY3Rpb25zLnNvcnQoTmF0aXZlcy5hc0xpc3Qob3V0KSwgb3V0Q29tcGFyYXRvcigpKTsKIAogICAgIHRhYmxlLnVwZGF0ZUNvbHVtbnNGb3JMYWJlbHMob3V0LCBpbiwgZG9uZSk7CiAgICAgb3V0Z29pbmcuZGlzcGxheShvdXQpOwpAQCAtMTMyLDkgKzEzMyw5IEBACiAgICAgfTsKICAgfQogCi0gIHByaXZhdGUgYm9vbGVhbiBoYXNDaGFuZ2VzKE5hdGl2ZUxpc3Q8Q2hhbmdlTGlzdD4gcmVzdWx0KSB7Ci0gICAgZm9yIChDaGFuZ2VMaXN0IGxpc3QgOiByZXN1bHQuYXNMaXN0KCkpIHsKLSAgICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHsKKyAgcHJpdmF0ZSBib29sZWFuIGhhc0NoYW5nZXMoSnNBcnJheTxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgICBmb3IgKENoYW5nZUxpc3QgbGlzdCA6IE5hdGl2ZXMuYXNMaXN0KHJlc3VsdCkpIHsKKyAgICAgIGlmIChsaXN0Lmxlbmd0aCgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgfQpAQCAtMTQyLDcgKzE0Myw3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3Vlc3NOYW1lKENoYW5nZUxpc3QgbGlzdCkgewotICAgIGZvciAoQ2hhbmdlSW5mbyBjaGFuZ2UgOiBsaXN0LmFzTGlzdCgpKSB7CisgICAgZm9yIChDaGFuZ2VJbmZvIGNoYW5nZSA6IE5hdGl2ZXMuYXNMaXN0KGxpc3QpKSB7CiAgICAgICBpZiAoY2hhbmdlLm93bmVyKCkgIT0gbnVsbCAmJiBjaGFuZ2Uub3duZXIoKS5uYW1lKCkgIT0gbnVsbCkgewogICAgICAgICByZXR1cm4gY2hhbmdlLm93bmVyKCkubmFtZSgpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQXBwcm92YWxUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQXBwcm92YWxUYWJsZS5qYXZhCmluZGV4IDczMDM2ZmYuLmRlYjg2N2MgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0FwcHJvdmFsVGFibGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9BcHByb3ZhbFRhYmxlLmphdmEKQEAgLTE0LDI3ICsxNCwyOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWUuZm9ybWF0VmFsdWU7CisKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuQ29uZmlybWF0aW9uQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkNvbmZpcm1hdGlvbkRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkZvcm1hdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5QYXRjaFV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mby5BcHByb3ZhbEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mby5MYWJlbEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZVN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BZGRNZW1iZXJCb3g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlJldmlld2VyU3VnZ2VzdE9yYWNsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldFB1Ymxpc2hEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3ZXJSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CkBAIC01MCwyNSArNTEsMjYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKiBEaXNwbGF5cyBhIHRhYmxlIG9mIHtAbGluayBBcHByb3ZhbERldGFpbH0gb2JqZWN0cyBmb3IgYSBjaGFuZ2UgcmVjb3JkLiAqLwogcHVibGljIGNsYXNzIEFwcHJvdmFsVGFibGUgZXh0ZW5kcyBDb21wb3NpdGUgewotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgdHlwZXM7CiAgIHByaXZhdGUgZmluYWwgR3JpZCB0YWJsZTsKICAgcHJpdmF0ZSBmaW5hbCBXaWRnZXQgbWlzc2luZzsKICAgcHJpdmF0ZSBmaW5hbCBQYW5lbCBhZGRSZXZpZXdlcjsKICAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdlclN1Z2dlc3RPcmFjbGUgcmV2aWV3ZXJTdWdnZXN0T3JhY2xlOwogICBwcml2YXRlIGZpbmFsIEFkZE1lbWJlckJveCBhZGRNZW1iZXJCb3g7Ci0gIHByaXZhdGUgQ2hhbmdlLklkIGNoYW5nZUlkOwotICBwcml2YXRlIEFjY291bnRJbmZvQ2FjaGUgYWNjb3VudENhY2hlID0gQWNjb3VudEluZm9DYWNoZS5lbXB0eSgpOworICBwcml2YXRlIENoYW5nZUluZm8gbGFzdENoYW5nZTsKKyAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgSW50ZWdlcj4gcm93czsKIAogICBwdWJsaWMgQXBwcm92YWxUYWJsZSgpIHsKLSAgICB0eXBlcyA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRBcHByb3ZhbFR5cGVzKCk7CisgICAgcm93cyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CiAgICAgdGFibGUgPSBuZXcgR3JpZCgxLCAzKTsKICAgICB0YWJsZS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pbmZvVGFibGUoKSk7CiAKQEAgLTEwMyw3ICsxMDUsNyBAQAogICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmFwcHJvdmFsVGFibGUoKSk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgZGlzcGxheUhlYWRlcihMaXN0PFN0cmluZz4gbGFiZWxzKSB7CisgIHByaXZhdGUgdm9pZCBkaXNwbGF5SGVhZGVyKENvbGxlY3Rpb248U3RyaW5nPiBsYWJlbHMpIHsKICAgICB0YWJsZS5yZXNpemVDb2x1bW5zKDIgKyBsYWJlbHMuc2l6ZSgpKTsKIAogICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOwpAQCAtMTI1LDI2NCArMTI3LDIxOCBAQAogICAgIGZtdC5hZGRTdHlsZU5hbWUoMCwgY29sIC0gMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5yaWdodG1vc3QoKSk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRBY2NvdW50SW5mb0NhY2hlKGZpbmFsIEFjY291bnRJbmZvQ2FjaGUgYWljKSB7Ci0gICAgYXNzZXJ0IGFpYyAhPSBudWxsOwotICAgIGFjY291bnRDYWNoZSA9IGFpYzsKLSAgfQorICB2b2lkIGRpc3BsYXkoQ2hhbmdlSW5mbyBjaGFuZ2UpIHsKKyAgICBsYXN0Q2hhbmdlID0gY2hhbmdlOworICAgIHJldmlld2VyU3VnZ2VzdE9yYWNsZS5zZXRDaGFuZ2UoY2hhbmdlLmxlZ2FjeV9pZCgpKTsKKyAgICBNYXA8SW50ZWdlciwgQXBwcm92YWxEZXRhaWw+IGJ5VXNlciA9CisgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPEludGVnZXIsIEFwcHJvdmFsRGV0YWlsPigpOworICAgIE1hcDxJbnRlZ2VyLCBBY2NvdW50SW5mbz4gYWNjb3VudHMgPQorICAgICAgICBuZXcgTGlua2VkSGFzaE1hcDxJbnRlZ2VyLCBBY2NvdW50SW5mbz4oKTsKKyAgICBMaXN0PFN0cmluZz4gbWlzc2luZ0xhYmVscyA9IGluaXRMYWJlbHMoY2hhbmdlLCBhY2NvdW50cywgYnlVc2VyKTsKIAotICBwcml2YXRlIEFjY291bnRMaW5rIGxpbmsoZmluYWwgQWNjb3VudC5JZCBpZCkgewotICAgIHJldHVybiBBY2NvdW50TGluay5saW5rKGFjY291bnRDYWNoZSwgaWQpOwotICB9Ci0KLSAgdm9pZCBkaXNwbGF5KFBhdGNoU2V0UHVibGlzaERldGFpbCBkZXRhaWwpIHsKLSAgICBkb0Rpc3BsYXkoZGV0YWlsLmdldENoYW5nZSgpLCBkZXRhaWwuZ2V0QXBwcm92YWxzKCksCi0gICAgICAgIGRldGFpbC5nZXRTdWJtaXRSZWNvcmRzKCkpOwotICB9Ci0KLSAgdm9pZCBkaXNwbGF5KENoYW5nZURldGFpbCBkZXRhaWwpIHsKLSAgICBkb0Rpc3BsYXkoZGV0YWlsLmdldENoYW5nZSgpLCBkZXRhaWwuZ2V0QXBwcm92YWxzKCksCi0gICAgICAgIGRldGFpbC5nZXRTdWJtaXRSZWNvcmRzKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRvRGlzcGxheShDaGFuZ2UgY2hhbmdlLCBMaXN0PEFwcHJvdmFsRGV0YWlsPiBhcHByb3ZhbHMsCi0gICAgICBMaXN0PFN1Ym1pdFJlY29yZD4gc3VibWl0UmVjb3JkcykgewotICAgIGNoYW5nZUlkID0gY2hhbmdlLmdldElkKCk7Ci0gICAgcmV2aWV3ZXJTdWdnZXN0T3JhY2xlLnNldENoYW5nZShjaGFuZ2VJZCk7Ci0KLSAgICBMaXN0PFN0cmluZz4gY29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgZmluYWwgRWxlbWVudCBtaXNzaW5nTGlzdCA9IG1pc3NpbmcuZ2V0RWxlbWVudCgpOwotICAgIHdoaWxlIChET00uZ2V0Q2hpbGRDb3VudChtaXNzaW5nTGlzdCkgPiAwKSB7Ci0gICAgICBET00ucmVtb3ZlQ2hpbGQobWlzc2luZ0xpc3QsIERPTS5nZXRDaGlsZChtaXNzaW5nTGlzdCwgMCkpOwotICAgIH0KLSAgICBtaXNzaW5nLnNldFZpc2libGUoZmFsc2UpOwotCi0gICAgaWYgKHN1Ym1pdFJlY29yZHMgIT0gbnVsbCkgewotICAgICAgSGFzaFNldDxTdHJpbmc+IHJlcG9ydGVkTWlzc2luZyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotICAgICAgSGFzaE1hcDxBY2NvdW50LklkLCBBcHByb3ZhbERldGFpbD4gYnlVc2VyID0KLSAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LklkLCBBcHByb3ZhbERldGFpbD4oKTsKLSAgICAgIGZvciAoQXBwcm92YWxEZXRhaWwgYWQgOiBhcHByb3ZhbHMpIHsKLSAgICAgICAgYnlVc2VyLnB1dChhZC5nZXRBY2NvdW50KCksIGFkKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChTdWJtaXRSZWNvcmQgcmVjIDogc3VibWl0UmVjb3JkcykgewotICAgICAgICBpZiAocmVjLmxhYmVscyA9PSBudWxsKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKFN1Ym1pdFJlY29yZC5MYWJlbCBsYmwgOiByZWMubGFiZWxzKSB7Ci0gICAgICAgICAgaWYgKCFjb2x1bW5zLmNvbnRhaW5zKGxibC5sYWJlbCkpIHsKLSAgICAgICAgICAgIGNvbHVtbnMuYWRkKGxibC5sYWJlbCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3dpdGNoIChsYmwuc3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIE9LOiB7Ci0gICAgICAgICAgICAgIEFwcHJvdmFsRGV0YWlsIGFkID0gYnlVc2VyLmdldChsYmwuYXBwbGllZEJ5KTsKLSAgICAgICAgICAgICAgaWYgKGFkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhZC5hcHByb3ZlZChsYmwubGFiZWwpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIFJFSkVDVDogewotICAgICAgICAgICAgICBBcHByb3ZhbERldGFpbCBhZCA9IGJ5VXNlci5nZXQobGJsLmFwcGxpZWRCeSk7Ci0gICAgICAgICAgICAgIGlmIChhZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWQucmVqZWN0ZWQobGJsLmxhYmVsKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBNQVk6Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE5FRUQ6Ci0gICAgICAgICAgICBjYXNlIElNUE9TU0lCTEU6Ci0gICAgICAgICAgICAgIGlmIChyZXBvcnRlZE1pc3NpbmcuYWRkKGxibC5sYWJlbCkpIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGxpID0gRE9NLmNyZWF0ZUVsZW1lbnQoImxpIik7Ci0gICAgICAgICAgICAgICAgbGkuc2V0Q2xhc3NOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubWlzc2luZ0FwcHJvdmFsKCkpOwotICAgICAgICAgICAgICAgIERPTS5zZXRJbm5lclRleHQobGksIFV0aWwuTS5uZWVkQXBwcm92YWwobGJsLmxhYmVsKSk7Ci0gICAgICAgICAgICAgICAgRE9NLmFwcGVuZENoaWxkKG1pc3NpbmdMaXN0LCBsaSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtaXNzaW5nLnNldFZpc2libGUoIXJlcG9ydGVkTWlzc2luZy5pc0VtcHR5KCkpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoQXBwcm92YWxEZXRhaWwgYWQgOiBhcHByb3ZhbHMpIHsKLSAgICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBzYSA6IGFkLmdldFBhdGNoU2V0QXBwcm92YWxzKCkpIHsKLSAgICAgICAgICBBcHByb3ZhbFR5cGUgbGVnYWN5VHlwZSA9IHR5cGVzLmJ5SWQocHNhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICAgICAgaWYgKGxlZ2FjeVR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIFN0cmluZyBsYWJlbE5hbWUgPSBsZWdhY3lUeXBlLmdldENhdGVnb3J5KCkuZ2V0TGFiZWxOYW1lKCk7Ci0gICAgICAgICAgaWYgKHBzYS5nZXRWYWx1ZSgpICE9IDAgKSB7Ci0gICAgICAgICAgICBpZiAocHNhLmdldFZhbHVlKCkgPT0gbGVnYWN5VHlwZS5nZXRNYXgoKS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICAgIGFkLmFwcHJvdmVkKGxhYmVsTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBzYS5nZXRWYWx1ZSgpID09IGxlZ2FjeVR5cGUuZ2V0TWluKCkuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgICBhZC5yZWplY3RlZChsYWJlbE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIWNvbHVtbnMuY29udGFpbnMobGFiZWxOYW1lKSkgewotICAgICAgICAgICAgY29sdW1ucy5hZGQobGFiZWxOYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChjb2x1bW5zLCBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgbzEsIFN0cmluZyBvMikgewotICAgICAgICAgICAgQXBwcm92YWxUeXBlIGEgPSB0eXBlcy5ieUxhYmVsKG8xKTsKLSAgICAgICAgICAgIEFwcHJvdmFsVHlwZSBiID0gdHlwZXMuYnlMYWJlbChvMik7Ci0gICAgICAgICAgICBpbnQgY21wID0gMDsKLSAgICAgICAgICAgIGlmIChhICE9IG51bGwgJiYgYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGNtcCA9IGEuZ2V0Q2F0ZWdvcnkoKS5nZXRQb3NpdGlvbigpIC0gYi5nZXRDYXRlZ29yeSgpLmdldFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY21wID09IDApIHsKLSAgICAgICAgICAgICAgY21wID0gbzEuY29tcGFyZVRvKG8yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjbXA7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KKyAgICByZW1vdmVBbGxDaGlsZHJlbihtaXNzaW5nLmdldEVsZW1lbnQoKSk7CisgICAgZm9yIChTdHJpbmcgbGFiZWwgOiBtaXNzaW5nTGFiZWxzKSB7CisgICAgICBhZGRNaXNzaW5nTGFiZWwoVXRpbC5NLm5lZWRBcHByb3ZhbChsYWJlbCkpOwogICAgIH0KIAotICAgIGlmIChhcHByb3ZhbHMuaXNFbXB0eSgpKSB7CisgICAgaWYgKGJ5VXNlci5pc0VtcHR5KCkpIHsKICAgICAgIHRhYmxlLnNldFZpc2libGUoZmFsc2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICBkaXNwbGF5SGVhZGVyKGNvbHVtbnMpOwotICAgICAgdGFibGUucmVzaXplUm93cygxICsgYXBwcm92YWxzLnNpemUoKSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcHJvdmFscy5zaXplKCk7IGkrKykgewotICAgICAgICBkaXNwbGF5Um93KGkgKyAxLCBhcHByb3ZhbHMuZ2V0KGkpLCBjaGFuZ2UsIGNvbHVtbnMpOworICAgICAgZGlzcGxheUhlYWRlcihjaGFuZ2UubGFiZWxzKCkpOworICAgICAgdGFibGUucmVzaXplUm93cygxICsgYnlVc2VyLnNpemUoKSk7CisgICAgICBpbnQgaSA9IDE7CisgICAgICBmb3IgKEFwcHJvdmFsRGV0YWlsIGFkIDogQXBwcm92YWxEZXRhaWwuc29ydCgKKyAgICAgICAgICBieVVzZXIudmFsdWVzKCksIGNoYW5nZS5vd25lcigpLl9hY2NvdW50X2lkKCkpKSB7CisgICAgICAgIGRpc3BsYXlSb3coaSsrLCBhZCwgY2hhbmdlLCBhY2NvdW50cy5nZXQoYWQuZ2V0QWNjb3VudCgpLmdldCgpKSk7CiAgICAgICB9CiAgICAgICB0YWJsZS5zZXRWaXNpYmxlKHRydWUpOwogICAgIH0KIAotICAgIGFkZFJldmlld2VyLnNldFZpc2libGUoR2Vycml0LmlzU2lnbmVkSW4oKSk7Ci0KICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLnRlc3RDaGFuZ2VNZXJnZSgpCi0gICAgICAgICYmICFjaGFuZ2UuaXNNZXJnZWFibGUoKSkgewotICAgICAgRWxlbWVudCBsaSA9IERPTS5jcmVhdGVFbGVtZW50KCJsaSIpOwotICAgICAgbGkuc2V0Q2xhc3NOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubWlzc2luZ0FwcHJvdmFsKCkpOwotICAgICAgRE9NLnNldElubmVyVGV4dChsaSwgVXRpbC5DLm1lc3NhZ2VOZWVkc1JlYmFzZU9ySGFzRGVwZW5kZW5jeSgpKTsKLSAgICAgIERPTS5hcHBlbmRDaGlsZChtaXNzaW5nTGlzdCwgbGkpOwotICAgICAgbWlzc2luZy5zZXRWaXNpYmxlKHRydWUpOworICAgICAgICAmJiBjaGFuZ2Uuc3RhdHVzKCkgIT0gQ2hhbmdlLlN0YXR1cy5NRVJHRUQKKyAgICAgICAgJiYgIWNoYW5nZS5tZXJnZWFibGUoKSkgeworICAgICAgYWRkTWlzc2luZ0xhYmVsKFV0aWwuQy5tZXNzYWdlTmVlZHNSZWJhc2VPckhhc0RlcGVuZGVuY3koKSk7CiAgICAgfQorICAgIG1pc3Npbmcuc2V0VmlzaWJsZShET00uZ2V0Q2hpbGRDb3VudChtaXNzaW5nLmdldEVsZW1lbnQoKSkgPiAwKTsKKyAgICBhZGRSZXZpZXdlci5zZXRWaXNpYmxlKEdlcnJpdC5pc1NpZ25lZEluKCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbENoaWxkcmVuKEVsZW1lbnQgZWwpIHsKKyAgICBmb3IgKGludCBpID0gRE9NLmdldENoaWxkQ291bnQoZWwpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIERPTS5yZW1vdmVDaGlsZChlbCwgRE9NLmdldENoaWxkKGVsLCBpKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZE1pc3NpbmdMYWJlbChTdHJpbmcgdGV4dCkgeworICAgIEVsZW1lbnQgbGkgPSBET00uY3JlYXRlRWxlbWVudCgibGkiKTsKKyAgICBsaS5zZXRDbGFzc05hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5taXNzaW5nQXBwcm92YWwoKSk7CisgICAgRE9NLnNldElubmVyVGV4dChsaSwgdGV4dCk7CisgICAgRE9NLmFwcGVuZENoaWxkKG1pc3NpbmcuZ2V0RWxlbWVudCgpLCBsaSk7CisgIH0KKworICBwcml2YXRlIFNldDxJbnRlZ2VyPiByZW1vdmFibGVSZXZpZXdlcnMoQ2hhbmdlSW5mbyBjaGFuZ2UpIHsKKyAgICBTZXQ8SW50ZWdlcj4gcmVzdWx0ID0KKyAgICAgICAgbmV3IEhhc2hTZXQ8SW50ZWdlcj4oY2hhbmdlLnJlbW92YWJsZV9yZXZpZXdlcnMoKS5sZW5ndGgoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2UucmVtb3ZhYmxlX3Jldmlld2VycygpLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgIHJlc3VsdC5hZGQoY2hhbmdlLnJlbW92YWJsZV9yZXZpZXdlcnMoKS5nZXQoaSkuX2FjY291bnRfaWQoKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBpbml0TGFiZWxzKENoYW5nZUluZm8gY2hhbmdlLAorICAgICAgTWFwPEludGVnZXIsIEFjY291bnRJbmZvPiBhY2NvdW50cywKKyAgICAgIE1hcDxJbnRlZ2VyLCBBcHByb3ZhbERldGFpbD4gYnlVc2VyKSB7CisgICAgU2V0PEludGVnZXI+IHJlbW92YWJsZVJldmlld2VycyA9IHJlbW92YWJsZVJldmlld2VycyhjaGFuZ2UpOworICAgIExpc3Q8U3RyaW5nPiBtaXNzaW5nID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNoYW5nZS5sYWJlbHMoKSkgeworICAgICAgTGFiZWxJbmZvIGxhYmVsID0gY2hhbmdlLmxhYmVsKG5hbWUpOworCisgICAgICBTdHJpbmcgbWluID0gbnVsbDsKKyAgICAgIFN0cmluZyBtYXggPSBudWxsOworICAgICAgZm9yIChTdHJpbmcgdiA6IGxhYmVsLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChtaW4gPT0gbnVsbCkgeworICAgICAgICAgIG1pbiA9IHY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHYuc3RhcnRzV2l0aCgiKyIpKSB7CisgICAgICAgICAgbWF4ID0gdjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAobGFiZWwuc3RhdHVzKCkgPT0gU3VibWl0UmVjb3JkLkxhYmVsLlN0YXR1cy5ORUVEKSB7CisgICAgICAgIG1pc3NpbmcuYWRkKG5hbWUpOworICAgICAgfQorCisgICAgICBpZiAobGFiZWwuYWxsKCkgIT0gbnVsbCkgeworICAgICAgICBmb3IgKEFwcHJvdmFsSW5mbyBhaSA6IE5hdGl2ZXMuYXNMaXN0KGxhYmVsLmFsbCgpKSkgeworICAgICAgICAgIGlmICghYWNjb3VudHMuY29udGFpbnNLZXkoYWkuX2FjY291bnRfaWQoKSkpIHsKKyAgICAgICAgICAgIGFjY291bnRzLnB1dChhaS5fYWNjb3VudF9pZCgpLCBhaSk7CisgICAgICAgICAgfQorICAgICAgICAgIGludCBpZCA9IGFpLl9hY2NvdW50X2lkKCk7CisgICAgICAgICAgQXBwcm92YWxEZXRhaWwgYWQgPSBieVVzZXIuZ2V0KGlkKTsKKyAgICAgICAgICBpZiAoYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgYWQgPSBuZXcgQXBwcm92YWxEZXRhaWwobmV3IEFjY291bnQuSWQoaWQpKTsKKyAgICAgICAgICAgIGFkLnNldENhblJlbW92ZShyZW1vdmFibGVSZXZpZXdlcnMuY29udGFpbnMoaWQpKTsKKyAgICAgICAgICAgIGJ5VXNlci5wdXQoaWQsIGFkKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGFpLmhhc192YWx1ZSgpKSB7CisgICAgICAgICAgICBhZC52b3RhYmxlKG5hbWUpOworICAgICAgICAgICAgYWQudmFsdWUobmFtZSwgYWkudmFsdWUoKSk7CisgICAgICAgICAgICBTdHJpbmcgZnYgPSBmb3JtYXRWYWx1ZShhaS52YWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChmdi5lcXVhbHMobWF4KSkgeworICAgICAgICAgICAgICBhZC5hcHByb3ZlZChuYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYWkudmFsdWUoKSA8IDAgJiYgZnYuZXF1YWxzKG1pbikpIHsKKyAgICAgICAgICAgICAgYWQucmVqZWN0ZWQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtaXNzaW5nOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvQWRkUmV2aWV3ZXIoKSB7Ci0gICAgZmluYWwgU3RyaW5nIHJldmlld2VyID0gYWRkTWVtYmVyQm94LmdldFRleHQoKTsKLSAgICBpZiAocmV2aWV3ZXIubGVuZ3RoKCkgPT0gMCkgewotICAgICAgcmV0dXJuOworICAgIFN0cmluZyByZXZpZXdlciA9IGFkZE1lbWJlckJveC5nZXRUZXh0KCk7CisgICAgaWYgKCFyZXZpZXdlci5pc0VtcHR5KCkpIHsKKyAgICAgIGFkZE1lbWJlckJveC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgIGFkZFJldmlld2VyKHJldmlld2VyLCBmYWxzZSk7CiAgICAgfQotCi0gICAgYWRkTWVtYmVyQm94LnNldEVuYWJsZWQoZmFsc2UpOwotICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXZpZXdlcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICByZXZpZXdlcnMuYWRkKHJldmlld2VyKTsKLQotICAgIGFkZFJldmlld2VycyhyZXZpZXdlcnMsIGZhbHNlKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBhZGRSZXZpZXdlcnMoZmluYWwgTGlzdDxTdHJpbmc+IHJldmlld2VycywKLSAgICAgIGZpbmFsIGJvb2xlYW4gY29uZmlybWVkKSB7Ci0gICAgUGF0Y2hVdGlsLkRFVEFJTF9TVkMuYWRkUmV2aWV3ZXJzKGNoYW5nZUlkLCByZXZpZXdlcnMsIGNvbmZpcm1lZCwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFJldmlld2VyUmVzdWx0PigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgUmV2aWV3ZXJSZXN1bHQgcmVzdWx0KSB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBvc3RJbnB1dCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIHN0YXRpYyBQb3N0SW5wdXQgY3JlYXRlKFN0cmluZyByZXZpZXdlciwgYm9vbGVhbiBjb25maXJtZWQpIHsKKyAgICAgIFBvc3RJbnB1dCBpbnB1dCA9IGNyZWF0ZU9iamVjdCgpLmNhc3QoKTsKKyAgICAgIGlucHV0LmluaXQocmV2aWV3ZXIsIGNvbmZpcm1lZCk7CisgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBuYXRpdmUgdm9pZCBpbml0KFN0cmluZyByZXZpZXdlciwgYm9vbGVhbiBjb25maXJtZWQpIC8qLXsKKyAgICAgIHRoaXMucmV2aWV3ZXIgPSByZXZpZXdlcjsKKyAgICAgIGlmIChjb25maXJtZWQpIHsKKyAgICAgICAgdGhpcy5jb25maXJtZWQgPSB0cnVlOworICAgICAgfQorICAgIH0tKi87CisKKyAgICBwcm90ZWN0ZWQgUG9zdElucHV0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJldmlld2VySW5mbyBleHRlbmRzIEFjY291bnRJbmZvIHsKKyAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhcHByb3ZhbHMoKSB7CisgICAgICByZXR1cm4gTmF0aXZlcy5rZXlzKF9hcHByb3ZhbHMoKSk7CisgICAgfQorICAgIGZpbmFsIG5hdGl2ZSBTdHJpbmcgYXBwcm92YWwoU3RyaW5nIGwpIC8qLXsgcmV0dXJuIHRoaXMuYXBwcm92YWxzW2xdOyB9LSovOworICAgIHByaXZhdGUgZmluYWwgbmF0aXZlIE5hdGl2ZU1hcDxOYXRpdmVTdHJpbmc+IF9hcHByb3ZhbHMoKSAvKi17IHJldHVybiB0aGlzLmFwcHJvdmFsczsgfS0qLzsKKworICAgIHByb3RlY3RlZCBSZXZpZXdlckluZm8oKSB7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUG9zdFJlc3VsdCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIGZpbmFsIG5hdGl2ZSBKc0FycmF5PFJldmlld2VySW5mbz4gcmV2aWV3ZXJzKCkgLyoteyByZXR1cm4gdGhpcy5yZXZpZXdlcnM7IH0tKi87CisgICAgZmluYWwgbmF0aXZlIGJvb2xlYW4gY29uZmlybSgpIC8qLXsgcmV0dXJuIHRoaXMuY29uZmlybSB8fCBmYWxzZTsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgU3RyaW5nIGVycm9yKCkgLyoteyByZXR1cm4gdGhpcy5lcnJvcjsgfS0qLzsKKworICAgIHByb3RlY3RlZCBQb3N0UmVzdWx0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGRSZXZpZXdlcihmaW5hbCBTdHJpbmcgcmV2aWV3ZXIsIGJvb2xlYW4gY29uZmlybWVkKSB7CisgICAgQ2hhbmdlQXBpLnJldmlld2VycyhsYXN0Q2hhbmdlLmxlZ2FjeV9pZCgpLmdldCgpKS5wb3N0KAorICAgICAgICBQb3N0SW5wdXQuY3JlYXRlKHJldmlld2VyLCBjb25maXJtZWQpLAorICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8UG9zdFJlc3VsdD4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFBvc3RSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgICAgICBhZGRNZW1iZXJCb3guc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgIGFkZE1lbWJlckJveC5zZXRUZXh0KCIiKTsKLQotICAgICAgICAgICAgZmluYWwgQ2hhbmdlRGV0YWlsIGNoYW5nZURldGFpbCA9IHJlc3VsdC5nZXRDaGFuZ2UoKTsKLSAgICAgICAgICAgIGlmIChjaGFuZ2VEZXRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICBzZXRBY2NvdW50SW5mb0NhY2hlKGNoYW5nZURldGFpbC5nZXRBY2NvdW50cygpKTsKLSAgICAgICAgICAgICAgZGlzcGxheShjaGFuZ2VEZXRhaWwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJlc3VsdC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgZmluYWwgU2FmZUh0bWxCdWlsZGVyIHIgPSBuZXcgU2FmZUh0bWxCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgIGZvciAoZmluYWwgUmV2aWV3ZXJSZXN1bHQuRXJyb3IgZSA6IHJlc3VsdC5nZXRFcnJvcnMoKSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgUkVWSUVXRVJfTk9UX0ZPVU5EOgotICAgICAgICAgICAgICAgICAgICByLmFwcGVuZChVdGlsLk0ucmV2aWV3ZXJOb3RGb3VuZChlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSBBQ0NPVU5UX0lOQUNUSVZFOgotICAgICAgICAgICAgICAgICAgICByLmFwcGVuZChVdGlsLk0uYWNjb3VudEluYWN0aXZlKGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBjYXNlIENIQU5HRV9OT1RfVklTSUJMRToKLSAgICAgICAgICAgICAgICAgICAgci5hcHBlbmQoVXRpbC5NLmNoYW5nZU5vdFZpc2libGVUbyhlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9FTVBUWToKLSAgICAgICAgICAgICAgICAgICAgci5hcHBlbmQoVXRpbC5NLmdyb3VwSXNFbXB0eShlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgY2FzZSBHUk9VUF9IQVNfVE9PX01BTllfTUVNQkVSUzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5hc2tGb3JDb25maXJtYXRpb24oKSAmJiAhY29uZmlybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgYXNrRm9yQ29uZmlybWF0aW9uKGUuZ2V0TmFtZSgpLCByZXN1bHQuZ2V0TWVtYmVyQ291bnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIHIuYXBwZW5kKFV0aWwuTS5ncm91cEhhc1Rvb01hbnlNZW1iZXJzKGUuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgR1JPVVBfTk9UX0FMTE9XRUQ6Ci0gICAgICAgICAgICAgICAgICAgIHIuYXBwZW5kKFV0aWwuTS5ncm91cElzTm90QWxsb3dlZChlLmdldE5hbWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgci5hcHBlbmQoZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICByLmFwcGVuZCgiIC0gIik7Ci0gICAgICAgICAgICAgICAgICAgIHIuYXBwZW5kKGUuZ2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgci5icigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKHIpLmNlbnRlcigpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5lcnJvcigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgcmVsb2FkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5jb25maXJtKCkpIHsKKyAgICAgICAgICAgICAgYXNrRm9yQ29uZmlybWF0aW9uKHJlc3VsdC5lcnJvcigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5ldyBFcnJvckRpYWxvZyhuZXcgU2FmZUh0bWxCdWlsZGVyKCkuYXBwZW5kKHJlc3VsdC5lcnJvcigpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogCi0gICAgICAgICAgcHJpdmF0ZSB2b2lkIGFza0ZvckNvbmZpcm1hdGlvbihmaW5hbCBTdHJpbmcgZ3JvdXBOYW1lLAotICAgICAgICAgICAgICBmaW5hbCBpbnQgbWVtYmVyQ291bnQpIHsKLSAgICAgICAgICAgIGZpbmFsIFNhZmVIdG1sQnVpbGRlciBiID0gbmV3IFNhZmVIdG1sQnVpbGRlcigpOwotICAgICAgICAgICAgYi5vcGVuRWxlbWVudCgiYiIpOwotICAgICAgICAgICAgYi5hcHBlbmQoVXRpbC5NCi0gICAgICAgICAgICAgICAgLmdyb3VwTWFueU1lbWJlcnNDb25maXJtYXRpb24oZ3JvdXBOYW1lLCBtZW1iZXJDb3VudCkpOwotICAgICAgICAgICAgYi5jbG9zZUVsZW1lbnQoImIiKTsKLSAgICAgICAgICAgIGZpbmFsIENvbmZpcm1hdGlvbkRpYWxvZyBjb25maXJtYXRpb25EaWFsb2cgPQotICAgICAgICAgICAgICAgIG5ldyBDb25maXJtYXRpb25EaWFsb2coVXRpbC5DCi0gICAgICAgICAgICAgICAgICAgIC5hcHByb3ZhbFRhYmxlQWRkTWFueVJldmlld2Vyc0NvbmZpcm1hdGlvbkRpYWxvZ1RpdGxlKCksCi0gICAgICAgICAgICAgICAgICAgIGIudG9TYWZlSHRtbCgpLCBuZXcgQ29uZmlybWF0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25PaygpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJldmlld2VycyhyZXZpZXdlcnMsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFza0ZvckNvbmZpcm1hdGlvbihTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgU3RyaW5nIHRpdGxlID0gVXRpbC5DCisgICAgICAgICAgICAgICAgLmFwcHJvdmFsVGFibGVBZGRNYW55UmV2aWV3ZXJzQ29uZmlybWF0aW9uRGlhbG9nVGl0bGUoKTsKKyAgICAgICAgICAgIENvbmZpcm1hdGlvbkRpYWxvZyBjb25maXJtYXRpb25EaWFsb2cgPSBuZXcgQ29uZmlybWF0aW9uRGlhbG9nKAorICAgICAgICAgICAgICAgIHRpdGxlLCBuZXcgU2FmZUh0bWxCdWlsZGVyKCkuYXBwZW5kKHRleHQpLAorICAgICAgICAgICAgICAgIG5ldyBDb25maXJtYXRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25PaygpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkUmV2aWV3ZXIocmV2aWV3ZXIsIHRydWUpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgY29uZmlybWF0aW9uRGlhbG9nLmNlbnRlcigpOwogICAgICAgICAgIH0KIAogICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CiAgICAgICAgICAgICBhZGRNZW1iZXJCb3guc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgaWYgKGlzTm9TdWNoRW50aXR5KGNhdWdodCkpIHsKKyAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKFV0aWwuTS5yZXZpZXdlck5vdEZvdW5kKHJldmlld2VyKSkuY2VudGVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzdXBlci5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0pOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlSb3coZmluYWwgaW50IHJvdywgZmluYWwgQXBwcm92YWxEZXRhaWwgYWQsCi0gICAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlLCBMaXN0PFN0cmluZz4gY29sdW1ucykgeworICBwcml2YXRlIHZvaWQgZGlzcGxheVJvdyhpbnQgcm93LCBmaW5hbCBBcHByb3ZhbERldGFpbCBhZCwgQ2hhbmdlSW5mbyBjaGFuZ2UsCisgICAgICBBY2NvdW50SW5mbyBhY2NvdW50KSB7CiAgICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7CiAgICAgaW50IGNvbCA9IDA7CiAKLSAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBjb2wrKywgbGluayhhZC5nZXRBY2NvdW50KCkpKTsKKyAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBjb2wrKywgbmV3IEFjY291bnRMaW5rKGFjY291bnQpKTsKKyAgICByb3dzLnB1dChhY2NvdW50Ll9hY2NvdW50X2lkKCksIHJvdyk7CiAKICAgICBpZiAoYWQuY2FuUmVtb3ZlKCkpIHsKICAgICAgIGZpbmFsIFB1c2hCdXR0b24gcmVtb3ZlID0gbmV3IFB1c2hCdXR0b24oIC8vCiAgICAgICAgICAgbmV3IEltYWdlKFV0aWwuUi5yZW1vdmVSZXZpZXdlck5vcm1hbCgpKSwgLy8KICAgICAgICAgICBuZXcgSW1hZ2UoVXRpbC5SLnJlbW92ZVJldmlld2VyUHJlc3NlZCgpKSk7Ci0gICAgICByZW1vdmUuc2V0VGl0bGUoVXRpbC5NLnJlbW92ZVJldmlld2VyKCAvLwotICAgICAgICAgIEZvcm1hdFV0aWwubmFtZShhY2NvdW50Q2FjaGUuZ2V0KGFkLmdldEFjY291bnQoKSkpKSk7CisgICAgICByZW1vdmUuc2V0VGl0bGUoVXRpbC5NLnJlbW92ZVJldmlld2VyKGFjY291bnQubmFtZSgpKSk7CiAgICAgICByZW1vdmUuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmVtb3ZlUmV2aWV3ZXIoKSk7CisgICAgICByZW1vdmUuYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluaygpKTsKICAgICAgIHJlbW92ZS5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewpAQCAtMzk1LDggKzM1MSwxMiBAQAogICAgIH0KICAgICBmbXQuc2V0U3R5bGVOYW1lKHJvdywgY29sKyssIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmVtb3ZlUmV2aWV3ZXJDZWxsKCkpOwogCi0gICAgZm9yIChTdHJpbmcgbGFiZWxOYW1lIDogY29sdW1ucykgeworICAgIGZvciAoU3RyaW5nIGxhYmVsTmFtZSA6IGNoYW5nZS5sYWJlbHMoKSkgewogICAgICAgZm10LnNldFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hcHByb3ZhbHNjb3JlKCkpOworICAgICAgaWYgKCFhZC5jYW5Wb3RlKGxhYmVsTmFtZSkpIHsKKyAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5ub3RWb3RhYmxlKCkpOworICAgICAgICBmbXQuZ2V0RWxlbWVudChyb3csIGNvbCkuc2V0VGl0bGUoR2Vycml0LkMudXNlckNhbm5vdFZvdGVUb29sVGlwKCkpOworICAgICAgfQogCiAgICAgICBpZiAoYWQuaXNSZWplY3RlZChsYWJlbE5hbWUpKSB7CiAgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIGNvbCwgbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMucmVkTm90KCkpKTsKQEAgLTQwNSwyMiArMzY1LDE0IEBACiAgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIGNvbCwgbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMuZ3JlZW5DaGVjaygpKSk7CiAKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFwcHJvdmFsVHlwZSBsZWdhY3lUeXBlID0gdHlwZXMuYnlMYWJlbChsYWJlbE5hbWUpOwotICAgICAgICBpZiAobGVnYWN5VHlwZSA9PSBudWxsKSB7CisgICAgICAgIGludCB2ID0gYWQuZ2V0VmFsdWUobGFiZWxOYW1lKTsKKyAgICAgICAgaWYgKHYgPT0gMCkgewogICAgICAgICAgIHRhYmxlLmNsZWFyQ2VsbChyb3csIGNvbCk7CiAgICAgICAgICAgY29sKys7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLQotICAgICAgICBQYXRjaFNldEFwcHJvdmFsIGNhID0gYWQuZ2V0UGF0Y2hTZXRBcHByb3ZhbChsZWdhY3lUeXBlLmdldENhdGVnb3J5KCkuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChjYSA9PSBudWxsIHx8IGNhLmdldFZhbHVlKCkgPT0gMCkgewotICAgICAgICAgIHRhYmxlLmNsZWFyQ2VsbChyb3csIGNvbCk7Ci0gICAgICAgICAgY29sKys7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdnN0ciA9IFN0cmluZy52YWx1ZU9mKGNhLmdldFZhbHVlKCkpOwotICAgICAgICBpZiAoY2EuZ2V0VmFsdWUoKSA+IDApIHsKKyAgICAgICAgU3RyaW5nIHZzdHIgPSBTdHJpbmcudmFsdWVPZihhZC5nZXRWYWx1ZShsYWJlbE5hbWUpKTsKKyAgICAgICAgaWYgKHYgPiAwKSB7CiAgICAgICAgICAgdnN0ciA9ICIrIiArIHZzdHI7CiAgICAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wb3NzY29yZSgpKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQzNSwyOSArMzg3LDIzIEBACiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCAtIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmlnaHRtb3N0KCkpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRvUmVtb3ZlKGZpbmFsIEFwcHJvdmFsRGV0YWlsIGFkLCBmaW5hbCBQdXNoQnV0dG9uIHJlbW92ZSkgewotICAgIHJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICBQYXRjaFV0aWwuREVUQUlMX1NWQy5yZW1vdmVSZXZpZXdlcihjaGFuZ2VJZCwgYWQuZ2V0QWNjb3VudCgpLAotICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8UmV2aWV3ZXJSZXN1bHQ+KCkgeworICBwcml2YXRlIHZvaWQgcmVsb2FkKCkgeworICAgIENoYW5nZUFwaS5kZXRhaWwobGFzdENoYW5nZS5sZWdhY3lfaWQoKS5nZXQoKSwKKyAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPENoYW5nZUluZm8+KCkgewogICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhSZXZpZXdlclJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIENoYW5nZURldGFpbCByID0gcmVzdWx0LmdldENoYW5nZSgpOwotICAgICAgICAgICAgICBkaXNwbGF5KHIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZmluYWwgUmV2aWV3ZXJSZXN1bHQuRXJyb3IgcmVzdWx0RXJyb3IgPQotICAgICAgICAgICAgICAgICAgcmVzdWx0LmdldEVycm9ycygpLmdldCgwKTsKLSAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgICAgICAgICAgIHN3aXRjaCAocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSRU1PVkVfTk9UX1BFUk1JVFRFRDoKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBVdGlsLkMuYXBwcm92YWxUYWJsZVJlbW92ZU5vdFBlcm1pdHRlZCgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDT1VMRF9OT1RfUkVNT1ZFOgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICBtZXNzYWdlID0gVXRpbC5DLmFwcHJvdmFsVGFibGVDb3VsZE5vdFJlbW92ZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG5ldyBFcnJvckRpYWxvZyhtZXNzYWdlICsgIiAiICsgcmVzdWx0RXJyb3IuZ2V0TmFtZSgpKS5jZW50ZXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgIGRpc3BsYXkocmVzdWx0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRvUmVtb3ZlKEFwcHJvdmFsRGV0YWlsIGFkLCBmaW5hbCBQdXNoQnV0dG9uIHJlbW92ZSkgeworICAgIHJlbW92ZS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICBDaGFuZ2VBcGkucmV2aWV3ZXIobGFzdENoYW5nZS5sZWdhY3lfaWQoKS5nZXQoKSwgYWQuZ2V0QWNjb3VudCgpLmdldCgpKQorICAgICAgLmRlbGV0ZShuZXcgR2Vycml0Q2FsbGJhY2s8SmF2YVNjcmlwdE9iamVjdD4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKEphdmFTY3JpcHRPYmplY3QgcmVzdWx0KSB7CisgICAgICAgICAgICByZWxvYWQoKTsKICAgICAgICAgICB9CiAKICAgICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUFwaS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlQXBpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkOTRjOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUFwaS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZVN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIHN0YXRpYyBtZXRob2RzIHdoaWNoIHdvcmsgb24gdGhlIEdlcnJpdCBSRVNUIEFQSSBmb3Igc3BlY2lmaWMKKyAqIGNoYW5nZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFuZ2VBcGkgeworICAvKiogQWJhbmRvbiB0aGUgY2hhbmdlLCBlbmRpbmcgaXRzIHJldmlldy4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIGFiYW5kb24oaW50IGlkLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgSW5wdXQgaW5wdXQgPSBJbnB1dC5jcmVhdGUoKTsKKyAgICBpbnB1dC5tZXNzYWdlKGVtcHR5VG9OdWxsKG1zZykpOworICAgIGNhbGwoaWQsICJhYmFuZG9uIikucG9zdChpbnB1dCwgY2IpOworICB9CisKKyAgLyoqIFJlc3RvcmUgYSBwcmV2aW91c2x5IGFiYW5kb25lZCBjaGFuZ2UgdG8gYmUgb3BlbiBhZ2Fpbi4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHJlc3RvcmUoaW50IGlkLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgSW5wdXQgaW5wdXQgPSBJbnB1dC5jcmVhdGUoKTsKKyAgICBpbnB1dC5tZXNzYWdlKGVtcHR5VG9OdWxsKG1zZykpOworICAgIGNhbGwoaWQsICJyZXN0b3JlIikucG9zdChpbnB1dCwgY2IpOworICB9CisKKyAgLyoqIENyZWF0ZSBhIG5ldyBjaGFuZ2UgdGhhdCByZXZlcnRzIHRoZSBkZWx0YSBjYXVzZWQgYnkgdGhpcyBjaGFuZ2UuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXZlcnQoaW50IGlkLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgSW5wdXQgaW5wdXQgPSBJbnB1dC5jcmVhdGUoKTsKKyAgICBpbnB1dC5tZXNzYWdlKGVtcHR5VG9OdWxsKG1zZykpOworICAgIGNhbGwoaWQsICJyZXZlcnQiKS5wb3N0KGlucHV0LCBjYik7CisgIH0KKworICAvKiogVXBkYXRlIHRoZSB0b3BpYyBvZiBhIGNoYW5nZS4gKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHRvcGljKGludCBpZCwgU3RyaW5nIHRvcGljLCBTdHJpbmcgbXNnLCBBc3luY0NhbGxiYWNrPFN0cmluZz4gY2IpIHsKKyAgICBSZXN0QXBpIGNhbGwgPSBjYWxsKGlkLCAidG9waWMiKTsKKyAgICB0b3BpYyA9IGVtcHR5VG9OdWxsKHRvcGljKTsKKyAgICBtc2cgPSBlbXB0eVRvTnVsbChtc2cpOworICAgIGlmICh0b3BpYyAhPSBudWxsIHx8IG1zZyAhPSBudWxsKSB7CisgICAgICBJbnB1dCBpbnB1dCA9IElucHV0LmNyZWF0ZSgpOworICAgICAgaW5wdXQudG9waWModG9waWMpOworICAgICAgaW5wdXQubWVzc2FnZShtc2cpOworICAgICAgY2FsbC5wdXQoaW5wdXQsIE5hdGl2ZVN0cmluZy51bndyYXAoY2IpKTsKKyAgICB9IGVsc2UgeworICAgICAgY2FsbC5kZWxldGUoTmF0aXZlU3RyaW5nLnVud3JhcChjYikpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZXRhaWwoaW50IGlkLCBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+IGNiKSB7CisgICAgY2FsbChpZCwgImRldGFpbCIpLmdldChjYik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJlc3RBcGkgcmV2aXNpb24oUGF0Y2hTZXQuSWQgaWQpIHsKKyAgICByZXR1cm4gY2hhbmdlKGlkLmdldFBhcmVudEtleSgpLmdldCgpKS52aWV3KCJyZXZpc2lvbnMiKS5pZChpZC5nZXQoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFJlc3RBcGkgcmV2aWV3ZXJzKGludCBpZCkgeworICAgIHJldHVybiBjaGFuZ2UoaWQpLnZpZXcoInJldmlld2VycyIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXN0QXBpIHJldmlld2VyKGludCBpZCwgaW50IHJldmlld2VyKSB7CisgICAgcmV0dXJuIGNoYW5nZShpZCkudmlldygicmV2aWV3ZXJzIikuaWQocmV2aWV3ZXIpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBSZXN0QXBpIHJldmlld2VyKGludCBpZCwgU3RyaW5nIHJldmlld2VyKSB7CisgICAgcmV0dXJuIGNoYW5nZShpZCkudmlldygicmV2aWV3ZXJzIikuaWQocmV2aWV3ZXIpOworICB9CisKKyAgLyoqIFN1Ym1pdCBhIHNwZWNpZmljIHJldmlzaW9uIG9mIGEgY2hhbmdlLiAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgc3VibWl0KGludCBpZCwgU3RyaW5nIGNvbW1pdCwgQXN5bmNDYWxsYmFjazxTdWJtaXRJbmZvPiBjYikgeworICAgIFN1Ym1pdElucHV0IGluID0gU3VibWl0SW5wdXQuY3JlYXRlKCk7CisgICAgaW4ud2FpdF9mb3JfbWVyZ2UodHJ1ZSk7CisgICAgY2FsbChpZCwgY29tbWl0LCAic3VibWl0IikucG9zdChpbiwgY2IpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5wdXQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCB0b3BpYyhTdHJpbmcgdCkgLyoteyBpZih0KXRoaXMudG9waWM9dDsgfS0qLzsKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBtZXNzYWdlKFN0cmluZyBtKSAvKi17IGlmKG0pdGhpcy5tZXNzYWdlPW07IH0tKi87CisKKyAgICBzdGF0aWMgSW5wdXQgY3JlYXRlKCkgeworICAgICAgcmV0dXJuIChJbnB1dCkgY3JlYXRlT2JqZWN0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIElucHV0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN1Ym1pdElucHV0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgICAgZmluYWwgbmF0aXZlIHZvaWQgd2FpdF9mb3JfbWVyZ2UoYm9vbGVhbiBiKSAvKi17IHRoaXMud2FpdF9mb3JfbWVyZ2U9YjsgfS0qLzsKKworICAgIHN0YXRpYyBTdWJtaXRJbnB1dCBjcmVhdGUoKSB7CisgICAgICByZXR1cm4gKFN1Ym1pdElucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3VibWl0SW5wdXQoKSB7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBjYWxsKGludCBpZCwgU3RyaW5nIGFjdGlvbikgeworICAgIHJldHVybiBjaGFuZ2UoaWQpLnZpZXcoYWN0aW9uKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJlc3RBcGkgY2FsbChpbnQgaWQsIFN0cmluZyBjb21taXQsIFN0cmluZyBhY3Rpb24pIHsKKyAgICByZXR1cm4gY2hhbmdlKGlkKS52aWV3KCJyZXZpc2lvbnMiKS5pZChjb21taXQpLnZpZXcoYWN0aW9uKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJlc3RBcGkgY2hhbmdlKGludCBpZCkgeworICAgIC8vIFRPRE8gU3dpdGNoIHRvIHRyaXBsZXQgcHJvamVjdH5icmFuY2h+aWQgZm9ybWF0IGluIFVSSS4KKyAgICByZXR1cm4gbmV3IFJlc3RBcGkoIi9jaGFuZ2VzLyIpLmlkKFN0cmluZy52YWx1ZU9mKGlkKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eVRvTnVsbChTdHJpbmcgc3RyKSB7CisgICAgcmV0dXJuIHN0ciA9PSBudWxsIHx8IHN0ci5pc0VtcHR5KCkgPyBudWxsIDogc3RyOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VDb25zdGFudHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5qYXZhCmluZGV4IGQ0Mjk5MmYuLjUwMGYwNmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5qYXZhCkBAIC0zNiw3ICszNiw2IEBACiAgIFN0cmluZyBhbGxBYmFuZG9uZWRDaGFuZ2VzKCk7CiAgIFN0cmluZyBhbGxNZXJnZWRDaGFuZ2VzKCk7CiAKLSAgU3RyaW5nIGNoYW5nZVRhYmxlQ29sdW1uSUQoKTsKICAgU3RyaW5nIGNoYW5nZVRhYmxlQ29sdW1uU3ViamVjdCgpOwogICBTdHJpbmcgY2hhbmdlVGFibGVDb2x1bW5Pd25lcigpOwogICBTdHJpbmcgY2hhbmdlVGFibGVDb2x1bW5SZXZpZXdlcnMoKTsKQEAgLTQ1LDkgKzQ0LDcgQEAKICAgU3RyaW5nIGNoYW5nZVRhYmxlQ29sdW1uTGFzdFVwZGF0ZSgpOwogICBTdHJpbmcgY2hhbmdlVGFibGVOb25lKCk7CiAKLSAgU3RyaW5nIGNoYW5nZVRhYmxlUHJldigpOwotICBTdHJpbmcgY2hhbmdlVGFibGVOZXh0KCk7Ci0gIFN0cmluZyBjaGFuZ2VUYWJsZU9wZW4oKTsKKyAgU3RyaW5nIGNoYW5nZUl0ZW1IZWxwKCk7CiAgIFN0cmluZyBjaGFuZ2VUYWJsZVN0YXIoKTsKICAgU3RyaW5nIGNoYW5nZVRhYmxlUGFnZVByZXYoKTsKICAgU3RyaW5nIGNoYW5nZVRhYmxlUGFnZU5leHQoKTsKQEAgLTY2LDYgKzYzLDcgQEAKICAgU3RyaW5nIHBhdGNoVGFibGVEb3dubG9hZFByZUltYWdlKCk7CiAgIFN0cmluZyBwYXRjaFRhYmxlRG93bmxvYWRQb3N0SW1hZ2UoKTsKICAgU3RyaW5nIGNvbW1pdE1lc3NhZ2UoKTsKKyAgU3RyaW5nIGZpbGVDb21tZW50SGVhZGVyKCk7CiAKICAgU3RyaW5nIHBhdGNoVGFibGVQcmV2KCk7CiAgIFN0cmluZyBwYXRjaFRhYmxlTmV4dCgpOwpAQCAtODAsNiArNzgsNyBAQAogICBTdHJpbmcgY2hhbmdlU2NyZWVuRGVwZW5kc09uKCk7CiAgIFN0cmluZyBjaGFuZ2VTY3JlZW5OZWVkZWRCeSgpOwogICBTdHJpbmcgY2hhbmdlU2NyZWVuQ29tbWVudHMoKTsKKyAgU3RyaW5nIGNoYW5nZVNjcmVlbkFkZENvbW1lbnQoKTsKIAogICBTdHJpbmcgYXBwcm92YWxUYWJsZVJldmlld2VyKCk7CiAgIFN0cmluZyBhcHByb3ZhbFRhYmxlQWRkUmV2aWV3ZXIoKTsKQEAgLTkyLDE0ICs5MSwyNCBAQAogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrUHJvamVjdCgpOwogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrQnJhbmNoKCk7CiAgIFN0cmluZyBjaGFuZ2VJbmZvQmxvY2tUb3BpYygpOworICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrVG9waWNBbHRlclRvcGljVG9vbFRpcCgpOwogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrVXBsb2FkZWQoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9ja1VwZGF0ZWQoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9ja1N0YXR1cygpOworICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrU3VibWl0VHlwZSgpOwogICBTdHJpbmcgY2hhbmdlUGVybWFsaW5rKCk7CiAgIFN0cmluZyBjaGFuZ2VJbmZvQmxvY2tDYW5NZXJnZSgpOwogICBTdHJpbmcgY2hhbmdlSW5mb0Jsb2NrQ2FuTWVyZ2VZZXMoKTsKICAgU3RyaW5nIGNoYW5nZUluZm9CbG9ja0Nhbk1lcmdlTm8oKTsKIAorICBTdHJpbmcgYnV0dG9uQWx0ZXJUb3BpYygpOworICBTdHJpbmcgYnV0dG9uQWx0ZXJUb3BpY0JlZ2luKCk7CisgIFN0cmluZyBidXR0b25BbHRlclRvcGljU2VuZCgpOworICBTdHJpbmcgYnV0dG9uQWx0ZXJUb3BpY0NhbmNlbCgpOworICBTdHJpbmcgaGVhZGluZ0FsdGVyVG9waWNNZXNzYWdlKCk7CisgIFN0cmluZyBhbHRlclRvcGljVGl0bGUoKTsKKyAgU3RyaW5nIGFsdGVyVG9waWNMYWJlbCgpOworCiAgIFN0cmluZyBpbmNsdWRlZEluVGFibGVCcmFuY2goKTsKICAgU3RyaW5nIGluY2x1ZGVkSW5UYWJsZVRhZygpOwogCkBAIC0xMjIsMTEgKzEzMSwxNSBAQAogICBTdHJpbmcgaGVhZGluZ1JldmVydE1lc3NhZ2UoKTsKICAgU3RyaW5nIHJldmVydENoYW5nZVRpdGxlKCk7CiAKKyAgU3RyaW5nIGhlYWRpbmdFZGl0Q29tbWl0TWVzc2FnZSgpOworICBTdHJpbmcgZWRpdENvbW1pdE1lc3NhZ2VUb29sVGlwKCk7CisgIFN0cmluZyB0aXRsZUVkaXRDb21taXRNZXNzYWdlKCk7CisKICAgU3RyaW5nIGJ1dHRvbkFiYW5kb25DaGFuZ2VCZWdpbigpOwogICBTdHJpbmcgYnV0dG9uQWJhbmRvbkNoYW5nZVNlbmQoKTsKICAgU3RyaW5nIGhlYWRpbmdBYmFuZG9uTWVzc2FnZSgpOwogICBTdHJpbmcgYWJhbmRvbkNoYW5nZVRpdGxlKCk7Ci0gIFN0cmluZyBvbGRWZXJzaW9uSGlzdG9yeSgpOworICBTdHJpbmcgcmVmZXJlbmNlVmVyc2lvbigpOwogICBTdHJpbmcgYmFzZURpZmZJdGVtKCk7CiAgIFN0cmluZyBhdXRvTWVyZ2UoKTsKIApAQCAtMTU2LDYgKzE2OSw2IEBACiAgIFN0cmluZyBzdWJtaXRGYWlsZWQoKTsKICAgU3RyaW5nIGJ1dHRvbkNsb3NlKCk7CiAKLSAgU3RyaW5nIGJ1dHRvbkRpZmZBbGxTaWRlQnlTaWRlKCk7Ci0gIFN0cmluZyBidXR0b25EaWZmQWxsVW5pZmllZCgpOworICBTdHJpbmcgZGlmZkFsbFNpZGVCeVNpZGUoKTsKKyAgU3RyaW5nIGRpZmZBbGxVbmlmaWVkKCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VDb25zdGFudHMucHJvcGVydGllcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5wcm9wZXJ0aWVzCmluZGV4IDhjZWI3NGMuLjA2YmQ2NGQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5wcm9wZXJ0aWVzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUNvbnN0YW50cy5wcm9wZXJ0aWVzCkBAIC0xNiw3ICsxNiw2IEBACiBhbGxBYmFuZG9uZWRDaGFuZ2VzID0gQWxsIGFiYW5kb25lZCBjaGFuZ2VzCiBhbGxNZXJnZWRDaGFuZ2VzID0gQWxsIG1lcmdlZCBjaGFuZ2VzCiAKLWNoYW5nZVRhYmxlQ29sdW1uSUQgPSBJRAogY2hhbmdlVGFibGVDb2x1bW5TdWJqZWN0ID0gU3ViamVjdAogY2hhbmdlVGFibGVDb2x1bW5Pd25lciA9IE93bmVyCiBjaGFuZ2VUYWJsZUNvbHVtblJldmlld2VycyA9IFJldmlld2VycwpAQCAtMjUsOSArMjQsNyBAQAogY2hhbmdlVGFibGVDb2x1bW5MYXN0VXBkYXRlID0gVXBkYXRlZAogY2hhbmdlVGFibGVOb25lID0gKE5vbmUpCiAKLWNoYW5nZVRhYmxlUHJldiA9IFByZXZpb3VzIGNoYW5nZQotY2hhbmdlVGFibGVOZXh0ID0gTmV4dCBjaGFuZ2UKLWNoYW5nZVRhYmxlT3BlbiA9IE9wZW4gY2hhbmdlCitjaGFuZ2VJdGVtSGVscCA9IGNoYW5nZQogY2hhbmdlVGFibGVTdGFyID0gU3RhciAob3IgdW5zdGFyKSBjaGFuZ2UKIGNoYW5nZVRhYmxlUGFnZVByZXYgPSBQcmV2aW91cyBwYWdlIG9mIGNoYW5nZXMKIGNoYW5nZVRhYmxlUGFnZU5leHQgPSBOZXh0IHBhZ2Ugb2YgY2hhbmdlcwpAQCAtNDYsNiArNDMsNyBAQAogcGF0Y2hUYWJsZURvd25sb2FkUHJlSW1hZ2UgPSBvbGQKIHBhdGNoVGFibGVEb3dubG9hZFBvc3RJbWFnZSA9IG5ldwogY29tbWl0TWVzc2FnZSA9IENvbW1pdCBNZXNzYWdlCitmaWxlQ29tbWVudEhlYWRlciA9IEZpbGUgQ29tbWVudDoKIAogcGF0Y2hUYWJsZVByZXYgPSBQcmV2aW91cyBmaWxlCiBwYXRjaFRhYmxlTmV4dCA9IE5leHQgZmlsZQpAQCAtNTcsNiArNTUsNyBAQAogY2hhbmdlU2NyZWVuRGVwZW5kc09uID0gRGVwZW5kcyBPbgogY2hhbmdlU2NyZWVuTmVlZGVkQnkgPSBOZWVkZWQgQnkKIGNoYW5nZVNjcmVlbkNvbW1lbnRzID0gQ29tbWVudHMKK2NoYW5nZVNjcmVlbkFkZENvbW1lbnQgPSBBZGQgQ29tbWVudAogCiBhcHByb3ZhbFRhYmxlUmV2aWV3ZXIgPSBSZXZpZXdlcgogYXBwcm92YWxUYWJsZUFkZFJldmlld2VyID0gQWRkIFJldmlld2VyCkBAIC02OSwxNCArNjgsMjQgQEAKIGNoYW5nZUluZm9CbG9ja1Byb2plY3QgPSBQcm9qZWN0CiBjaGFuZ2VJbmZvQmxvY2tCcmFuY2ggPSBCcmFuY2gKIGNoYW5nZUluZm9CbG9ja1RvcGljID0gVG9waWMKK2NoYW5nZUluZm9CbG9ja1RvcGljQWx0ZXJUb3BpY1Rvb2xUaXAgPSBFZGl0IFRvcGljCiBjaGFuZ2VJbmZvQmxvY2tVcGxvYWRlZCA9IFVwbG9hZGVkCiBjaGFuZ2VJbmZvQmxvY2tVcGRhdGVkID0gVXBkYXRlZAogY2hhbmdlSW5mb0Jsb2NrU3RhdHVzID0gU3RhdHVzCitjaGFuZ2VJbmZvQmxvY2tTdWJtaXRUeXBlID0gU3VibWl0IFR5cGUKIGNoYW5nZVBlcm1hbGluayA9IFBlcm1hbGluawogY2hhbmdlSW5mb0Jsb2NrQ2FuTWVyZ2UgPSBDYW4gTWVyZ2UKIGNoYW5nZUluZm9CbG9ja0Nhbk1lcmdlWWVzID0gWWVzCiBjaGFuZ2VJbmZvQmxvY2tDYW5NZXJnZU5vID0gTm8KIAorYnV0dG9uQWx0ZXJUb3BpYyA9IEVkaXQgVG9waWMKK2J1dHRvbkFsdGVyVG9waWNCZWdpbiA9IEVkaXQgVG9waWMKK2J1dHRvbkFsdGVyVG9waWNTZW5kID0gVXBkYXRlIFRvcGljCitidXR0b25BbHRlclRvcGljQ2FuY2VsID0gQ2FuY2VsCitoZWFkaW5nQWx0ZXJUb3BpY01lc3NhZ2UgPSBFZGl0IFRvcGljIE1lc3NhZ2U6CithbHRlclRvcGljVGl0bGUgPSBDb2RlIFJldmlldyAtIEVkaXQgVG9waWMKK2FsdGVyVG9waWNMYWJlbCA9IE5ldyBUb3BpYyBOYW1lOgorCiBpbmNsdWRlZEluVGFibGVCcmFuY2ggPSBCcmFuY2ggTmFtZQogaW5jbHVkZWRJblRhYmxlVGFnID0gVGFnIE5hbWUKIApAQCAtOTYsNyArMTA1LDcgQEAKIGJ1dHRvbkFiYW5kb25DaGFuZ2VTZW5kID0gQWJhbmRvbiBDaGFuZ2UKIGhlYWRpbmdBYmFuZG9uTWVzc2FnZSA9IEFiYW5kb24gTWVzc2FnZToKIGFiYW5kb25DaGFuZ2VUaXRsZSA9IENvZGUgUmV2aWV3IC0gQWJhbmRvbiBDaGFuZ2UKLW9sZFZlcnNpb25IaXN0b3J5ID0gT2xkIFZlcnNpb24gSGlzdG9yeToKK3JlZmVyZW5jZVZlcnNpb24gPSBSZWZlcmVuY2UgVmVyc2lvbjoKIGJhc2VEaWZmSXRlbSA9IEJhc2UKIGF1dG9NZXJnZSA9IEF1dG8gTWVyZ2UKIApAQCAtMTA3LDYgKzExNiwxMCBAQAogaGVhZGluZ1JldmVydE1lc3NhZ2UgPSBSZXZlcnQgQ29tbWl0IE1lc3NhZ2U6CiByZXZlcnRDaGFuZ2VUaXRsZSA9IENvZGUgUmV2aWV3IC0gUmV2ZXJ0IE1lcmdlZCBDaGFuZ2UKIAoraGVhZGluZ0VkaXRDb21taXRNZXNzYWdlID0gQ29tbWl0IE1lc3NhZ2UKK2VkaXRDb21taXRNZXNzYWdlVG9vbFRpcCA9IEVkaXQgQ29tbWl0IE1lc3NhZ2UKK3RpdGxlRWRpdENvbW1pdE1lc3NhZ2UgPSBDcmVhdGUgTmV3IFBhdGNoIFNldAorCiBidXR0b25SZXN0b3JlQ2hhbmdlQmVnaW4gPSBSZXN0b3JlIENoYW5nZQogcmVzdG9yZUNoYW5nZVRpdGxlID0gQ29kZSBSZXZpZXcgLSBSZXN0b3JlIENoYW5nZQogaGVhZGluZ1Jlc3RvcmVNZXNzYWdlID0gUmVzdG9yZSBNZXNzYWdlOgpAQCAtMTM3LDUgKzE1MCw1IEBACiBzdWJtaXRGYWlsZWQgPSBTdWJtaXQgRmFpbGVkCiBidXR0b25DbG9zZSA9IENsb3NlCiAKLWJ1dHRvbkRpZmZBbGxTaWRlQnlTaWRlID0gRGlmZiBBbGwgU2lkZS1ieS1TaWRlCi1idXR0b25EaWZmQWxsVW5pZmllZCA9IERpZmYgQWxsIFVuaWZpZWQKK2RpZmZBbGxTaWRlQnlTaWRlID0gQWxsIFNpZGUtYnktU2lkZQorZGlmZkFsbFVuaWZpZWQgPSBBbGwgVW5pZmllZApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlRGVzY3JpcHRpb25CbG9jay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlRGVzY3JpcHRpb25CbG9jay5qYXZhCmluZGV4IGM4YjJhNjYuLjVjZDZjZGIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZURlc2NyaXB0aW9uQmxvY2suamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VEZXNjcmlwdGlvbkJsb2NrLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFR5cGVSZWNvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKQEAgLTM1LDkgKzM2LDExIEBACiAgICAgaW5pdFdpZGdldChocCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBkaXNwbGF5KENoYW5nZSBjaGcsIEJvb2xlYW4gc3RhcnJlZCwgUGF0Y2hTZXRJbmZvIGluZm8sCi0gICAgICBmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFjYykgewotICAgIGluZm9CbG9jay5kaXNwbGF5KGNoZywgYWNjKTsKLSAgICBtZXNzYWdlQmxvY2suZGlzcGxheShjaGcuZ2V0SWQoKSwgc3RhcnJlZCwgaW5mby5nZXRNZXNzYWdlKCkpOworICBwdWJsaWMgdm9pZCBkaXNwbGF5KENoYW5nZSBjaGcsIEJvb2xlYW4gc3RhcnJlZCwgQm9vbGVhbiBjYW5FZGl0Q29tbWl0TWVzc2FnZSwKKyAgICAgIFBhdGNoU2V0SW5mbyBpbmZvLAorICAgICAgZmluYWwgQWNjb3VudEluZm9DYWNoZSBhY2MsIFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZCkgeworICAgIGluZm9CbG9jay5kaXNwbGF5KGNoZywgYWNjLCBzdWJtaXRUeXBlUmVjb3JkKTsKKyAgICBtZXNzYWdlQmxvY2suZGlzcGxheShjaGcuY3VycmVudFBhdGNoU2V0SWQoKSwgc3RhcnJlZCwKKyAgICAgIGNhbkVkaXRDb21taXRNZXNzYWdlLCAgaW5mby5nZXRNZXNzYWdlKCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VJbmZvLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VJbmZvLmphdmEKaW5kZXggMGM4ZTAzZS4uMDA2OTNkOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mby5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUluZm8uamF2YQpAQCAtMTQsMTcgKzE0LDI4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZVN0cmluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXlTdHJpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNsaWVudC5pbXBsLnNlci5KYXZhU3FsVGltZXN0YW1wX0pzb25TZXJpYWxpemVyOwogCiBpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBDaGFuZ2VJbmZvIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgIHB1YmxpYyBmaW5hbCB2b2lkIGluaXQoKSB7CisgICAgaWYgKGxhYmVsczAoKSAhPSBudWxsKSB7CisgICAgICBsYWJlbHMwKCkuY29weUtleXNJbnRvQ2hpbGRyZW4oIl9uYW1lIik7CisgICAgfQorICB9CisKICAgcHVibGljIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0X25hbWVfa2V5KCkgewogICAgIHJldHVybiBuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3QoKSk7CiAgIH0KQEAgLTUwLDcgKzYxLDcgQEAKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaWRfYWJicmV2aWF0ZWQoKSB7Ci0gICAgcmV0dXJuIG5ldyBDaGFuZ2UuS2V5KGlkKCkpLmFiYnJldmlhdGUoKTsKKyAgICByZXR1cm4gbmV3IENoYW5nZS5LZXkoY2hhbmdlX2lkKCkpLmFiYnJldmlhdGUoKTsKICAgfQogCiAgIHB1YmxpYyBmaW5hbCBDaGFuZ2UuU3RhdHVzIHN0YXR1cygpIHsKQEAgLTU4LDEzICs2OSwxNSBAQAogICB9CiAKICAgcHVibGljIGZpbmFsIFNldDxTdHJpbmc+IGxhYmVscygpIHsKLSAgICByZXR1cm4gTmF0aXZlcy5rZXlzKGxhYmVsczAoKSk7CisgICAgcmV0dXJuIGxhYmVsczAoKS5rZXlTZXQoKTsKICAgfQogCisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGlkKCkgLyoteyByZXR1cm4gdGhpcy5pZDsgfS0qLzsKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgcHJvamVjdCgpIC8qLXsgcmV0dXJuIHRoaXMucHJvamVjdDsgfS0qLzsKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgYnJhbmNoKCkgLyoteyByZXR1cm4gdGhpcy5icmFuY2g7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIHRvcGljKCkgLyoteyByZXR1cm4gdGhpcy50b3BpYzsgfS0qLzsKLSAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgaWQoKSAvKi17IHJldHVybiB0aGlzLmlkOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBjaGFuZ2VfaWQoKSAvKi17IHJldHVybiB0aGlzLmNoYW5nZV9pZDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIG1lcmdlYWJsZSgpIC8qLXsgcmV0dXJuIHRoaXMubWVyZ2VhYmxlOyB9LSovOwogICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBTdHJpbmcgc3RhdHVzUmF3KCkgLyoteyByZXR1cm4gdGhpcy5zdGF0dXM7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIHN1YmplY3QoKSAvKi17IHJldHVybiB0aGlzLnN1YmplY3Q7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgQWNjb3VudEluZm8gb3duZXIoKSAvKi17IHJldHVybiB0aGlzLm93bmVyOyB9LSovOwpAQCAtNzMsOCArODYsMjIgQEAKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIHN0YXJyZWQoKSAvKi17IHJldHVybiB0aGlzLnN0YXJyZWQgPyB0cnVlIDogZmFsc2U7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiByZXZpZXdlZCgpIC8qLXsgcmV0dXJuIHRoaXMucmV2aWV3ZWQgPyB0cnVlIDogZmFsc2U7IH0tKi87CiAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIF9zb3J0a2V5KCkgLyoteyByZXR1cm4gdGhpcy5fc29ydGtleTsgfS0qLzsKLSAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgSmF2YVNjcmlwdE9iamVjdCBsYWJlbHMwKCkgLyoteyByZXR1cm4gdGhpcy5sYWJlbHM7IH0tKi87CisgIHByaXZhdGUgZmluYWwgbmF0aXZlIE5hdGl2ZU1hcDxMYWJlbEluZm8+IGxhYmVsczAoKSAvKi17IHJldHVybiB0aGlzLmxhYmVsczsgfS0qLzsKICAgcHVibGljIGZpbmFsIG5hdGl2ZSBMYWJlbEluZm8gbGFiZWwoU3RyaW5nIG4pIC8qLXsgcmV0dXJuIHRoaXMubGFiZWxzW25dOyB9LSovOworCisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBoYXNfcGVybWl0dGVkX2xhYmVscygpCisgIC8qLXsgcmV0dXJuIHRoaXMuaGFzT3duUHJvcGVydHkoJ3Blcm1pdHRlZF9sYWJlbHMnKSB9LSovOworICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBOYXRpdmVNYXA8SmF2YVNjcmlwdE9iamVjdD4gX3Blcm1pdHRlZF9sYWJlbHMoKQorICAvKi17IHJldHVybiB0aGlzLnBlcm1pdHRlZF9sYWJlbHM7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBTZXQ8U3RyaW5nPiBwZXJtaXR0ZWRfbGFiZWxzKCkgeworICAgIHJldHVybiBOYXRpdmVzLmtleXMoX3Blcm1pdHRlZF9sYWJlbHMoKSk7CisgIH0KKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBKc0FycmF5U3RyaW5nIHBlcm1pdHRlZF92YWx1ZXMoU3RyaW5nIG4pCisgIC8qLXsgcmV0dXJuIHRoaXMucGVybWl0dGVkX2xhYmVsc1tuXTsgfS0qLzsKKworICBwdWJsaWMgZmluYWwgbmF0aXZlIEpzQXJyYXk8QWNjb3VudEluZm8+IHJlbW92YWJsZV9yZXZpZXdlcnMoKQorICAvKi17IHJldHVybiB0aGlzLnJlbW92YWJsZV9yZXZpZXdlcnM7IH0tKi87CisKICAgZmluYWwgbmF0aXZlIGludCBfbnVtYmVyKCkgLyoteyByZXR1cm4gdGhpcy5fbnVtYmVyOyB9LSovOwogICBmaW5hbCBuYXRpdmUgYm9vbGVhbiBfbW9yZV9jaGFuZ2VzKCkKICAgLyoteyByZXR1cm4gdGhpcy5fbW9yZV9jaGFuZ2VzID8gdHJ1ZSA6IGZhbHNlOyB9LSovOwpAQCAtODIsMTMgKzEwOSw2IEBACiAgIHByb3RlY3RlZCBDaGFuZ2VJbmZvKCkgewogICB9CiAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBBY2NvdW50SW5mbyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgewotICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIG5hbWUoKSAvKi17IHJldHVybiB0aGlzLm5hbWU7IH0tKi87Ci0KLSAgICBwcm90ZWN0ZWQgQWNjb3VudEluZm8oKSB7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYWJlbEluZm8gZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKICAgICBwdWJsaWMgZmluYWwgU3VibWl0UmVjb3JkLkxhYmVsLlN0YXR1cyBzdGF0dXMoKSB7CiAgICAgICBpZiAoYXBwcm92ZWQoKSAhPSBudWxsKSB7CkBAIC0xMDgsNiArMTI4LDE2IEBACiAKICAgICBwdWJsaWMgZmluYWwgbmF0aXZlIEFjY291bnRJbmZvIHJlY29tbWVuZGVkKCkgLyoteyByZXR1cm4gdGhpcy5yZWNvbW1lbmRlZDsgfS0qLzsKICAgICBwdWJsaWMgZmluYWwgbmF0aXZlIEFjY291bnRJbmZvIGRpc2xpa2VkKCkgLyoteyByZXR1cm4gdGhpcy5kaXNsaWtlZDsgfS0qLzsKKworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgSnNBcnJheTxBcHByb3ZhbEluZm8+IGFsbCgpIC8qLXsgcmV0dXJuIHRoaXMuYWxsOyB9LSovOworCisgICAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgTmF0aXZlTWFwPE5hdGl2ZVN0cmluZz4gX3ZhbHVlcygpIC8qLXsgcmV0dXJuIHRoaXMudmFsdWVzOyB9LSovOworCisgICAgcHVibGljIGZpbmFsIFNldDxTdHJpbmc+IHZhbHVlcygpIHsKKyAgICAgIHJldHVybiBOYXRpdmVzLmtleXMoX3ZhbHVlcygpKTsKKyAgICB9CisgICAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgdmFsdWVfdGV4dChTdHJpbmcgbikgLyoteyByZXR1cm4gdGhpcy52YWx1ZXNbbl07IH0tKi87CisKICAgICBwdWJsaWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gb3B0aW9uYWwoKSAvKi17IHJldHVybiB0aGlzLm9wdGlvbmFsID8gdHJ1ZSA6IGZhbHNlOyB9LSovOwogICAgIGZpbmFsIG5hdGl2ZSBzaG9ydCBfdmFsdWUoKQogICAgIC8qLXsKQEAgLTEyMCw0ICsxNTAsMTIgQEAKICAgICBwcm90ZWN0ZWQgTGFiZWxJbmZvKCkgewogICAgIH0KICAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwcm92YWxJbmZvIGV4dGVuZHMgQWNjb3VudEluZm8geworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgYm9vbGVhbiBoYXNfdmFsdWUoKSAvKi17IHJldHVybiB0aGlzLmhhc093blByb3BlcnR5KCd2YWx1ZScpOyB9LSovOworICAgIHB1YmxpYyBmaW5hbCBuYXRpdmUgc2hvcnQgdmFsdWUoKSAvKi17IHJldHVybiB0aGlzLnZhbHVlOyB9LSovOworCisgICAgcHJvdGVjdGVkIEFwcHJvdmFsSW5mbygpIHsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUluZm9CbG9jay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mb0Jsb2NrLmphdmEKaW5kZXggM2ZmYWNjMy4uZTRkYmMzMiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mb0Jsb2NrLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlSW5mb0Jsb2NrLmphdmEKQEAgLTE3LDE1ICsxNywzMSBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbC5tZWRpdW1Gb3JtYXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5CcmFuY2hMaW5rOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Qcm9qZWN0TGluazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudGVkQWN0aW9uRGlhbG9nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5JbmxpbmVIeXBlcmxpbms7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlByb2plY3RTZWFyY2hMaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm9DYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0VHlwZVJlY29yZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuR3JpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5UZXh0Qm94OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmNsaXBweS5jbGllbnQuQ29weWFibGVMYWJlbDsKIAogcHVibGljIGNsYXNzIENoYW5nZUluZm9CbG9jayBleHRlbmRzIENvbXBvc2l0ZSB7CkBAIC0zNiw5ICs1MiwxMCBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9UT1BJQyA9IDQ7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX1VQTE9BREVEID0gNTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJfVVBEQVRFRCA9IDY7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX1NUQVRVUyA9IDc7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX01FUkdFX1RFU1QgPSA4OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9DTlQgPSA5OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9TVUJNSVRfVFlQRSA9IDc7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX1NUQVRVUyA9IDg7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSX01FUkdFX1RFU1QgPSA5OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUl9DTlQgPSAxMDsKIAogICBwcml2YXRlIGZpbmFsIEdyaWQgdGFibGU7CiAKQEAgLTU5LDYgKzc2LDcgQEAKICAgICBpbml0Um93KFJfVVBMT0FERUQsIFV0aWwuQy5jaGFuZ2VJbmZvQmxvY2tVcGxvYWRlZCgpKTsKICAgICBpbml0Um93KFJfVVBEQVRFRCwgVXRpbC5DLmNoYW5nZUluZm9CbG9ja1VwZGF0ZWQoKSk7CiAgICAgaW5pdFJvdyhSX1NUQVRVUywgVXRpbC5DLmNoYW5nZUluZm9CbG9ja1N0YXR1cygpKTsKKyAgICBpbml0Um93KFJfU1VCTUlUX1RZUEUsIFV0aWwuQy5jaGFuZ2VJbmZvQmxvY2tTdWJtaXRUeXBlKCkpOwogICAgIGlmIChHZXJyaXQuZ2V0Q29uZmlnKCkudGVzdENoYW5nZU1lcmdlKCkpIHsKICAgICAgIGluaXRSb3coUl9NRVJHRV9URVNULCBVdGlsLkMuY2hhbmdlSW5mb0Jsb2NrQ2FuTWVyZ2UoKSk7CiAgICAgfQpAQCAtNzcsNyArOTUsOCBAQAogICAgIHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKS5hZGRTdHlsZU5hbWUocm93LCAwLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmhlYWRlcigpKTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgQ2hhbmdlIGNoZywgZmluYWwgQWNjb3VudEluZm9DYWNoZSBhY2MpIHsKKyAgcHVibGljIHZvaWQgZGlzcGxheShmaW5hbCBDaGFuZ2UgY2hnLCBmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFjYywKKyAgICAgIFN1Ym1pdFR5cGVSZWNvcmQgc3VibWl0VHlwZVJlY29yZCkgewogICAgIGZpbmFsIEJyYW5jaC5OYW1lS2V5IGRzdCA9IGNoZy5nZXREZXN0KCk7CiAKICAgICBDb3B5YWJsZUxhYmVsIGNoYW5nZUlkTGFiZWwgPQpAQCAtODYsMTQgKzEwNSwyNyBAQAogICAgIHRhYmxlLnNldFdpZGdldChSX0NIQU5HRV9JRCwgMSwgY2hhbmdlSWRMYWJlbCk7CiAKICAgICB0YWJsZS5zZXRXaWRnZXQoUl9PV05FUiwgMSwgQWNjb3VudExpbmsubGluayhhY2MsIGNoZy5nZXRPd25lcigpKSk7Ci0gICAgdGFibGUuc2V0V2lkZ2V0KFJfUFJPSkVDVCwgMSwgbmV3IFByb2plY3RMaW5rKGNoZy5nZXRQcm9qZWN0KCksIGNoZy5nZXRTdGF0dXMoKSkpOworCisgICAgZmluYWwgRmxvd1BhbmVsIHAgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgcC5hZGQobmV3IFByb2plY3RTZWFyY2hMaW5rKGNoZy5nZXRQcm9qZWN0KCkpKTsKKyAgICBwLmFkZChuZXcgSW5saW5lSHlwZXJsaW5rKGNoZy5nZXRQcm9qZWN0KCkuZ2V0KCksCisgICAgICAgIFBhZ2VMaW5rcy50b1Byb2plY3QoY2hnLmdldFByb2plY3QoKSkpKTsKKyAgICB0YWJsZS5zZXRXaWRnZXQoUl9QUk9KRUNULCAxLCBwKTsKKwogICAgIHRhYmxlLnNldFdpZGdldChSX0JSQU5DSCwgMSwgbmV3IEJyYW5jaExpbmsoZHN0LmdldFNob3J0TmFtZSgpLCBjaGcKICAgICAgICAgLmdldFByb2plY3QoKSwgY2hnLmdldFN0YXR1cygpLCBkc3QuZ2V0KCksIG51bGwpKTsKLSAgICB0YWJsZS5zZXRXaWRnZXQoUl9UT1BJQywgMSwgbmV3IEJyYW5jaExpbmsoY2hnLmdldFRvcGljKCksCi0gICAgICAgIGNoZy5nZXRQcm9qZWN0KCksIGNoZy5nZXRTdGF0dXMoKSwgZHN0LmdldCgpLCBjaGcuZ2V0VG9waWMoKSkpOworICAgIHRhYmxlLnNldFdpZGdldChSX1RPUElDLCAxLCB0b3BpYyhjaGcpKTsKICAgICB0YWJsZS5zZXRUZXh0KFJfVVBMT0FERUQsIDEsIG1lZGl1bUZvcm1hdChjaGcuZ2V0Q3JlYXRlZE9uKCkpKTsKICAgICB0YWJsZS5zZXRUZXh0KFJfVVBEQVRFRCwgMSwgbWVkaXVtRm9ybWF0KGNoZy5nZXRMYXN0VXBkYXRlZE9uKCkpKTsKICAgICB0YWJsZS5zZXRUZXh0KFJfU1RBVFVTLCAxLCBVdGlsLnRvTG9uZ1N0cmluZyhjaGcuZ2V0U3RhdHVzKCkpKTsKKyAgICBTdHJpbmcgc3VibWl0VHlwZTsKKyAgICBpZiAoc3VibWl0VHlwZVJlY29yZC5zdGF0dXMgPT0gU3VibWl0VHlwZVJlY29yZC5TdGF0dXMuT0spIHsKKyAgICAgIHN1Ym1pdFR5cGUgPSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uVXRpbAorICAgICAgICAgICAgICAudG9Mb25nU3RyaW5nKHN1Ym1pdFR5cGVSZWNvcmQudHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN1Ym1pdFR5cGUgPSBzdWJtaXRUeXBlUmVjb3JkLnN0YXR1cy5uYW1lKCk7CisgICAgfQorICAgIHRhYmxlLnNldFRleHQoUl9TVUJNSVRfVFlQRSwgMSwgc3VibWl0VHlwZSk7CiAgICAgZmluYWwgQ2hhbmdlLlN0YXR1cyBzdGF0dXMgPSBjaGcuZ2V0U3RhdHVzKCk7CiAgICAgaWYgKEdlcnJpdC5nZXRDb25maWcoKS50ZXN0Q2hhbmdlTWVyZ2UoKSkgewogICAgICAgaWYgKHN0YXR1cy5lcXVhbHMoQ2hhbmdlLlN0YXR1cy5ORVcpIHx8IHN0YXR1cy5lcXVhbHMoQ2hhbmdlLlN0YXR1cy5EUkFGVCkpIHsKQEAgLTEwNyw4ICsxMzksOTIgQEAKIAogICAgIGlmIChzdGF0dXMuaXNDbG9zZWQoKSkgewogICAgICAgdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpLmFkZFN0eWxlTmFtZShSX1NUQVRVUywgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jbG9zZWRzdGF0ZSgpKTsKKyAgICAgIHRhYmxlLmdldFJvd0Zvcm1hdHRlcigpLnNldFZpc2libGUoUl9TVUJNSVRfVFlQRSwgZmFsc2UpOwogICAgIH0gZWxzZSB7CiAgICAgICB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCkucmVtb3ZlU3R5bGVOYW1lKFJfU1RBVFVTLCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNsb3NlZHN0YXRlKCkpOworICAgICAgdGFibGUuZ2V0Um93Rm9ybWF0dGVyKCkuc2V0VmlzaWJsZShSX1NVQk1JVF9UWVBFLCB0cnVlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgV2lkZ2V0IHRvcGljKGZpbmFsIENoYW5nZSBjaGcpIHsKKyAgICBmaW5hbCBCcmFuY2guTmFtZUtleSBkc3QgPSBjaGcuZ2V0RGVzdCgpOworCisgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgIGZwLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNoYW5nZUluZm9Ub3BpY1BhbmVsKCkpOworICAgIGZwLmFkZChuZXcgQnJhbmNoTGluayhjaGcuZ2V0VG9waWMoKSwgY2hnLmdldFByb2plY3QoKSwgY2hnLmdldFN0YXR1cygpLAorICAgICAgICAgICBkc3QuZ2V0KCksIGNoZy5nZXRUb3BpYygpKSk7CisKKyAgICBDaGFuZ2VEZXRhaWxDYWNoZSBkZXRhaWxDYWNoZSA9IENoYW5nZUNhY2hlLmdldChjaGcuZ2V0SWQoKSkuZ2V0Q2hhbmdlRGV0YWlsQ2FjaGUoKTsKKyAgICBDaGFuZ2VEZXRhaWwgY2hhbmdlRGV0YWlsID0gZGV0YWlsQ2FjaGUuZ2V0KCk7CisKKyAgICBpZiAoY2hhbmdlRGV0YWlsLmNhbkVkaXRUb3BpY05hbWUoKSkgeworICAgICAgZmluYWwgSW1hZ2UgZWRpdCA9IG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmVkaXQoKSk7CisgICAgICBlZGl0LmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmsoKSk7CisgICAgICBlZGl0LnNldFRpdGxlKFV0aWwuQy5jaGFuZ2VJbmZvQmxvY2tUb3BpY0FsdGVyVG9waWNUb29sVGlwKCkpOworICAgICAgZWRpdC5hZGRDbGlja0hhbmRsZXIobmV3ICBDbGlja0hhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICBuZXcgQWx0ZXJUb3BpY0RpYWxvZyhjaGcpLmNlbnRlcigpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGZwLmFkZChlZGl0KTsKKyAgICB9CisKKyAgICByZXR1cm4gZnA7CisgIH0KKworICBwcml2YXRlIGNsYXNzIEFsdGVyVG9waWNEaWFsb2cgZXh0ZW5kcyBDb21tZW50ZWRBY3Rpb25EaWFsb2c8Q2hhbmdlRGV0YWlsPgorICAgICAgaW1wbGVtZW50cyBLZXlQcmVzc0hhbmRsZXIgeworICAgIFRleHRCb3ggbmV3VG9waWM7CisgICAgQ2hhbmdlIGNoYW5nZTsKKworICAgIEFsdGVyVG9waWNEaWFsb2coQ2hhbmdlIGNoZykgeworICAgICAgc3VwZXIoVXRpbC5DLmFsdGVyVG9waWNUaXRsZSgpLCBVdGlsLkMuaGVhZGluZ0FsdGVyVG9waWNNZXNzYWdlKCksCisgICAgICAgICAgbmV3IENoYW5nZURldGFpbENhY2hlLklnbm9yZUVycm9yQ2FsbGJhY2soKSk7CisgICAgICBjaGFuZ2UgPSBjaGc7CisKKyAgICAgIG5ld1RvcGljID0gbmV3IFRleHRCb3goKTsKKyAgICAgIG5ld1RvcGljLmFkZEtleVByZXNzSGFuZGxlcih0aGlzKTsKKyAgICAgIHNldEZvY3VzT24obmV3VG9waWMpOworICAgICAgcGFuZWwuaW5zZXJ0KG5ld1RvcGljLCAwKTsKKyAgICAgIHBhbmVsLmluc2VydChuZXcgSW5saW5lTGFiZWwoVXRpbC5DLmFsdGVyVG9waWNMYWJlbCgpKSwgMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgeworICAgICAgc3VwZXIub25Mb2FkKCk7CisgICAgICBuZXdUb3BpYy5zZXRUZXh0KGNoYW5nZS5nZXRUb3BpYygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9Ub3BpY0VkaXQoKSB7CisgICAgICBTdHJpbmcgdG9waWMgPSBuZXdUb3BpYy5nZXRUZXh0KCk7CisgICAgICBDaGFuZ2VBcGkudG9waWMoY2hhbmdlLmdldElkKCkuZ2V0KCksIHRvcGljLCBnZXRNZXNzYWdlVGV4dCgpLAorICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8U3RyaW5nPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhTdHJpbmcgcmVzdWx0KSB7CisgICAgICAgICAgc2VudCA9IHRydWU7CisgICAgICAgICAgR2Vycml0LmRpc3BsYXkoUGFnZUxpbmtzLnRvQ2hhbmdlKGNoYW5nZS5nZXRJZCgpKSk7CisgICAgICAgICAgaGlkZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgICAgZW5hYmxlQnV0dG9ucyh0cnVlKTsKKyAgICAgICAgICBzdXBlci5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgICAgfX0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2VuZCgpIHsKKyAgICAgIGRvVG9waWNFZGl0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25LZXlQcmVzcyhLZXlQcmVzc0V2ZW50IGV2ZW50KSB7CisgICAgICBpZiAoZXZlbnQuZ2V0U291cmNlKCkgPT0gbmV3VG9waWMKKyAgICAgICAgICAmJiBldmVudC5nZXROYXRpdmVFdmVudCgpLmdldEtleUNvZGUoKSA9PSBLZXlDb2Rlcy5LRVlfRU5URVIpIHsKKyAgICAgICAgZG9Ub3BpY0VkaXQoKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUxpc3QuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZUxpc3QuamF2YQppbmRleCA1NjBlNmIzLi43YzQxZWExIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VMaXN0LmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTGlzdC5qYXZhCkBAIC0xNCwyOCArMTQsMjggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlczsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiAKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIAogLyoqIExpc3Qgb2YgY2hhbmdlcyBhdmFpbGFibGUgZnJvbSB7QGNvZGUgL2NoYW5nZXMvfS4gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VMaXN0IGV4dGVuZHMgTmF0aXZlTGlzdDxDaGFuZ2VJbmZvPiB7CitwdWJsaWMgY2xhc3MgQ2hhbmdlTGlzdCBleHRlbmRzIEpzQXJyYXk8Q2hhbmdlSW5mbz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJID0gIi9jaGFuZ2VzLyI7CiAKICAgLyoqIFJ1biAyIG9yIG1vcmUgcXVlcmllcyBpbiBhIHNpbmdsZSByZW1vdGUgaW52b2NhdGlvbi4gKi8KICAgcHVibGljIHN0YXRpYyB2b2lkIHF1ZXJ5KAotICAgICAgQXN5bmNDYWxsYmFjazxOYXRpdmVMaXN0PENoYW5nZUxpc3Q+PiBjYWxsYmFjaywgU3RyaW5nLi4uIHF1ZXJpZXMpIHsKKyAgICAgIEFzeW5jQ2FsbGJhY2s8SnNBcnJheTxDaGFuZ2VMaXN0Pj4gY2FsbGJhY2ssIFN0cmluZy4uLiBxdWVyaWVzKSB7CiAgICAgYXNzZXJ0IHF1ZXJpZXMubGVuZ3RoID49IDI7IC8vIEF0IGxlYXN0IDIgaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgcmVzdWx0LgogICAgIFJlc3RBcGkgY2FsbCA9IG5ldyBSZXN0QXBpKFVSSSk7CiAgICAgZm9yIChTdHJpbmcgcSA6IHF1ZXJpZXMpIHsKICAgICAgIGNhbGwuYWRkUGFyYW1ldGVyUmF3KCJxIiwgS2V5VXRpbC5lbmNvZGUocSkpOwogICAgIH0KICAgICBhZGRPcHRpb25zKGNhbGwsIExpc3RDaGFuZ2VzT3B0aW9uLkxBQkVMUyk7Ci0gICAgY2FsbC5zZW5kKGNhbGxiYWNrKTsKKyAgICBjYWxsLmdldChjYWxsYmFjayk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIHZvaWQgcHJldihTdHJpbmcgcXVlcnksCkBAIC00OSw3ICs0OSw3IEBACiAgICAgaWYgKCFQYWdlZFNpbmdsZUxpc3RTY3JlZW4uTUlOX1NPUlRLRVkuZXF1YWxzKHNvcnRrZXkpKSB7CiAgICAgICBjYWxsLmFkZFBhcmFtZXRlcigiUCIsIHNvcnRrZXkpOwogICAgIH0KLSAgICBjYWxsLnNlbmQoY2FsbGJhY2spOworICAgIGNhbGwuZ2V0KGNhbGxiYWNrKTsKICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBuZXh0KFN0cmluZyBxdWVyeSwKQEAgLTYzLDcgKzYzLDcgQEAKICAgICBpZiAoIVBhZ2VkU2luZ2xlTGlzdFNjcmVlbi5NQVhfU09SVEtFWS5lcXVhbHMoc29ydGtleSkpIHsKICAgICAgIGNhbGwuYWRkUGFyYW1ldGVyKCJOIiwgc29ydGtleSk7CiAgICAgfQotICAgIGNhbGwuc2VuZChjYWxsYmFjayk7CisgICAgY2FsbC5nZXQoY2FsbGJhY2spOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRPcHRpb25zKApkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZU1lc3NhZ2VzLmphdmEKaW5kZXggNGJkMDgyOC4uYmE0NjcwMiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTWVzc2FnZXMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VNZXNzYWdlcy5qYXZhCkBAIC01Niw2ICs1Niw0IEBACiAgIFN0cmluZyBncm91cElzTm90QWxsb3dlZChTdHJpbmcgZ3JvdXApOwogICBTdHJpbmcgZ3JvdXBIYXNUb29NYW55TWVtYmVycyhTdHJpbmcgZ3JvdXApOwogICBTdHJpbmcgZ3JvdXBNYW55TWVtYmVyc0NvbmZpcm1hdGlvbihTdHJpbmcgZ3JvdXAsIGludCBtZW1iZXJDb3VudCk7Ci0KLSAgU3RyaW5nIGFub255bW91c0Rvd25sb2FkKFN0cmluZyBwcm90b2NvbCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlTWVzc2FnZXMucHJvcGVydGllcwppbmRleCAyNDQ5NjEzLi5jYWFmM2JmIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZU1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTEsOSArMSwxMSBAQAorIyBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBzaG91bGQgYWxzbyBiZSBtYWRlIGluCisjIGdlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlTWVzc2FnZXMucHJvcGVydGllcwogYWNjb3VudERhc2hib2FyZFRpdGxlID0gQ29kZSBSZXZpZXcgRGFzaGJvYXJkIGZvciB7MH0KIGNoYW5nZXNPcGVuSW5Qcm9qZWN0ID0gT3BlbiBDaGFuZ2VzIEluIHswfQogY2hhbmdlc01lcmdlZEluUHJvamVjdCA9IE1lcmdlZCBDaGFuZ2VzIEluIHswfQogY2hhbmdlc0FiYW5kb25lZEluUHJvamVjdCA9IEFiYW5kb25lZCBDaGFuZ2VzIEluIHswfQogCi1yZXZlcnRDaGFuZ2VEZWZhdWx0TWVzc2FnZSA9IFJldmVydCBcInswfVwiXG5cblRoaXMgcmV2ZXJ0cyBjb21taXQgezF9CityZXZlcnRDaGFuZ2VEZWZhdWx0TWVzc2FnZSA9IFJldmVydCBcInswfVwiXG5cblRoaXMgcmV2ZXJ0cyBjb21taXQgezF9LgogCiBjaGFuZ2VTY3JlZW5UaXRsZUlkID0gQ2hhbmdlIHswfQogb3V0ZGF0ZWRIZWFkZXIgPSBDaGFuZ2UgZGVwZW5kcyBvbiB7MH0gb3V0ZGF0ZWQgY2hhbmdlKHMpIGFuZCBzaG91bGQgYmUgcmViYXNlZCBvbiB0aGUgbGF0ZXN0IHBhdGNoIHNldHMuCkBAIC0zNyw1ICszOSwzIEBACiBncm91cElzTm90QWxsb3dlZCA9ICBUaGUgZ3JvdXAgezB9IGNhbm5vdCBiZSBhZGRlZCBhcyByZXZpZXdlci4KIGdyb3VwSGFzVG9vTWFueU1lbWJlcnMgPSBUaGUgZ3JvdXAgezB9IGhhcyB0b28gbWFueSBtZW1iZXJzIHRvIGFkZCB0aGVtIGFsbCBhcyByZXZpZXdlcnMuCiBncm91cE1hbnlNZW1iZXJzQ29uZmlybWF0aW9uID0gVGhlIGdyb3VwIHswfSBoYXMgezF9IG1lbWJlcnMuIERvIHlvdSB3YW50IHRvIGFkZCB0aGVtIGFsbCBhcyByZXZpZXdlcnM/Ci0KLWFub255bW91c0Rvd25sb2FkID0gQW5vbnltb3VzIHswfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YQppbmRleCA0ZGQ2YjAzLi43OTgzNTEyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VTY3JlZW4uamF2YQpAQCAtMTUsMjkgKzE1LDMzIEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkRpc3BhdGNoZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkZvcm1hdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Db21tZW50UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkNvbXBsZXhEaXNjbG9zdXJlUGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkV4cGFuZEFsbENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkxpbmtNZW51QmFyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5OZWVkc1NpZ25JbktleUNvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZS5TdGF0dXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2hhbmdlRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DaGFuZ2VIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkhhbmRsZXJSZWdpc3RyYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuaTE4bi5jbGllbnQuTG9jYWxlSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5CdXR0b247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRGlzY2xvc3VyZVBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5HcmlkOwpAQCAtNTksNiArNjMsNyBAQAogICBwcml2YXRlIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZDsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBvcGVuUGF0Y2hTZXRJZDsKICAgcHJpdmF0ZSBDaGFuZ2VEZXRhaWxDYWNoZSBkZXRhaWxDYWNoZTsKKyAgcHJpdmF0ZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5DaGFuZ2VJbmZvIGNoYW5nZUluZm87CiAKICAgcHJpdmF0ZSBDaGFuZ2VEZXNjcmlwdGlvbkJsb2NrIGRlc2NyaXB0aW9uQmxvY2s7CiAgIHByaXZhdGUgQXBwcm92YWxUYWJsZSBhcHByb3ZhbHM7CkBAIC03OCw2ICs4Myw3IEBACiAgIHByaXZhdGUgS2V5Q29tbWFuZFNldCBrZXlzQWN0aW9uOwogICBwcml2YXRlIEhhbmRsZXJSZWdpc3RyYXRpb24gcmVnTmF2aWdhdGlvbjsKICAgcHJpdmF0ZSBIYW5kbGVyUmVnaXN0cmF0aW9uIHJlZ0FjdGlvbjsKKyAgcHJpdmF0ZSBIYW5kbGVyUmVnaXN0cmF0aW9uIHJlZ0RldGFpbENhY2hlOwogCiAgIHByaXZhdGUgR3JpZCBwYXRjaGVzR3JpZDsKICAgcHJpdmF0ZSBMaXN0Qm94IHBhdGNoZXNMaXN0OwpAQCAtOTUsMTQgKzEwMSw2IEBACiAgIHB1YmxpYyBDaGFuZ2VTY3JlZW4oZmluYWwgQ2hhbmdlLklkIHRvU2hvdykgewogICAgIGNoYW5nZUlkID0gdG9TaG93OwogICAgIG9wZW5QYXRjaFNldElkID0gbnVsbDsKLQotICAgIC8vIElmIHdlIGhhdmUgYW55IGRpZmYgc3RvcmVkLCBtYWtlIHN1cmUgdGhleSBhcmUgYXBwbGljYWJsZSB0byB0aGUKLSAgICAvLyBjdXJyZW50IGNoYW5nZSwgZGlzY2FyZCB0aGVtIG90aGVyd2lzZS4KLSAgICAvLwotICAgIGlmIChjdXJyZW50Q2hhbmdlSWQgIT0gbnVsbCAmJiAhY3VycmVudENoYW5nZUlkLmVxdWFscyh0b1Nob3cpKSB7Ci0gICAgICBkaWZmQmFzZUlkID0gbnVsbDsKLSAgICB9Ci0gICAgY3VycmVudENoYW5nZUlkID0gdG9TaG93OwogICB9CiAKICAgcHVibGljIENoYW5nZVNjcmVlbihmaW5hbCBQYXRjaFNldC5JZCB0b1Nob3cpIHsKQEAgLTEzMCw2ICsxMjgsMTAgQEAKICAgICAgIHJlZ0FjdGlvbi5yZW1vdmVIYW5kbGVyKCk7CiAgICAgICByZWdBY3Rpb24gPSBudWxsOwogICAgIH0KKyAgICBpZiAocmVnRGV0YWlsQ2FjaGUgIT0gbnVsbCkgeworICAgICAgcmVnRGV0YWlsQ2FjaGUucmVtb3ZlSGFuZGxlcigpOworICAgICAgcmVnRGV0YWlsQ2FjaGUgPSBudWxsOworICAgIH0KICAgICBzdXBlci5vblVubG9hZCgpOwogICB9CiAKQEAgLTE1MCw3ICsxNTIsNyBAQAogICAgIENoYW5nZUNhY2hlIGNhY2hlID0gQ2hhbmdlQ2FjaGUuZ2V0KGNoYW5nZUlkKTsKIAogICAgIGRldGFpbENhY2hlID0gY2FjaGUuZ2V0Q2hhbmdlRGV0YWlsQ2FjaGUoKTsKLSAgICBkZXRhaWxDYWNoZS5hZGRWYWx1ZUNoYW5nZUhhbmRsZXIodGhpcyk7CisgICAgcmVnRGV0YWlsQ2FjaGUgPSBkZXRhaWxDYWNoZS5hZGRWYWx1ZUNoYW5nZUhhbmRsZXIodGhpcyk7CiAKICAgICBhZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jaGFuZ2VTY3JlZW4oKSk7CiAgICAgYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2NyZWVuTm9IZWFkZXIoKSk7CkBAIC0yMjgsNyArMjMwLDcgQEAKIAogICAgIHBhdGNoZXNHcmlkID0gbmV3IEdyaWQoMSwgMik7CiAgICAgcGF0Y2hlc0dyaWQuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2VsZWN0UGF0Y2hTZXRPbGRWZXJzaW9uKCkpOwotICAgIHBhdGNoZXNHcmlkLnNldFRleHQoMCwgMCwgVXRpbC5DLm9sZFZlcnNpb25IaXN0b3J5KCkpOworICAgIHBhdGNoZXNHcmlkLnNldFRleHQoMCwgMCwgVXRpbC5DLnJlZmVyZW5jZVZlcnNpb24oKSk7CiAgICAgcGF0Y2hlc0dyaWQuc2V0V2lkZ2V0KDAsIDEsIHBhdGNoZXNMaXN0KTsKICAgICBhZGQocGF0Y2hlc0dyaWQpOwogCkBAIC0yNjAsMTQgKzI2MiwzNSBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uVmFsdWVDaGFuZ2UoVmFsdWVDaGFuZ2VFdmVudDxDaGFuZ2VEZXRhaWw+IGV2ZW50KSB7Ci0gICAgaWYgKGlzQXR0YWNoZWQoKSkgewotICAgICAgZGlzcGxheShldmVudC5nZXRWYWx1ZSgpKTsKKyAgcHVibGljIHZvaWQgb25WYWx1ZUNoYW5nZShmaW5hbCBWYWx1ZUNoYW5nZUV2ZW50PENoYW5nZURldGFpbD4gZXZlbnQpIHsKKyAgICBpZiAoaXNBdHRhY2hlZCgpICYmIGlzTGFzdFZhbHVlQ2hhbmdlSGFuZGxlcigpKSB7CisgICAgICAvLyBVbnRpbCB0aGlzIHNjcmVlbiBpcyBmdWxseSBtaWdyYXRlZCB0byB0aGUgbmV3IEFQSSwgdGhpcyBjYWxsIG11c3QgYmUKKyAgICAgIC8vIHNlcXVlbnRpYWwsIGJlY2F1c2Ugd2UgY2FuJ3Qgc3RhcnQgYW4gYXN5bmMgZ2V0IGF0IHRoZSBzb3VyY2Ugb2YgZXZlcnkKKyAgICAgIC8vIGNhbGwgdGhhdCBtaWdodCB0cmlnZ2VyIGEgdmFsdWUgY2hhbmdlLgorICAgICAgQ2hhbmdlQXBpLmRldGFpbChldmVudC5nZXRWYWx1ZSgpLmdldENoYW5nZSgpLmdldElkKCkuZ2V0KCksCisgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUluZm8+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoCisgICAgICAgICAgICAgICAgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuQ2hhbmdlSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgY2hhbmdlSW5mbyA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgZGlzcGxheShldmVudC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKICAgICB9CiAgIH0KIAorICAvLyBGaW5kIHRoZSBsYXN0IGF0dGFjaGVkIHNjcmVlbi4KKyAgLy8gV2hlbiBEaWFsb2dCb3ggaXMgdXNlZCAoaS4gZS4gQ29tbWVudGVkQWN0aW9uRGlhbG9nKSB0aGVuIHRoZSBvcmlnaW5hbAorICAvLyBDaGFuZ2VTY3JlZW4gaXMgc3RpbGwgaW4gYXR0YWNoZWQgc3RhdGUuCisgIC8vIFVzZSBoZXJlIHRoZSBmYWN0LCB0aGF0IHRoZSBoYW5kbGVycyAoQ2hhbmdlU2NyZWVuKSBhcmUgc29ydGVkLgorICBwcml2YXRlIGJvb2xlYW4gaXNMYXN0VmFsdWVDaGFuZ2VIYW5kbGVyKCkgeworICAgIGludCBjb3VudCA9IGRldGFpbENhY2hlLmdldEhhbmRsZXJDb3VudCgpOworICAgIHJldHVybiBjb3VudCA+IDAgJiYgZGV0YWlsQ2FjaGUuZ2V0SGFuZGxlcihjb3VudCAtIDEpID09IHRoaXM7CisgIH0KKwogICBwcml2YXRlIHZvaWQgZGlzcGxheShmaW5hbCBDaGFuZ2VEZXRhaWwgZGV0YWlsKSB7CiAgICAgZGlzcGxheVRpdGxlKGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRLZXkoKSwgZGV0YWlsLmdldENoYW5nZSgpLmdldFN1YmplY3QoKSk7CisgICAgZGlzY2FyZERpZmZCYXNlSWZOb3RBcHBsaWNhYmxlKGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRJZCgpKTsKIAogICAgIGlmIChTdGF0dXMuTUVSR0VEID09IGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRTdGF0dXMoKSkgewogICAgICAgaW5jbHVkZWRJblBhbmVsLnNldFZpc2libGUodHJ1ZSk7CkBAIC0yNzcsMTYgKzMwMCwxNyBAQAogICAgIH0KIAogICAgIGRlcGVuZGVuY2llcy5zZXRBY2NvdW50SW5mb0NhY2hlKGRldGFpbC5nZXRBY2NvdW50cygpKTsKLSAgICBhcHByb3ZhbHMuc2V0QWNjb3VudEluZm9DYWNoZShkZXRhaWwuZ2V0QWNjb3VudHMoKSk7CiAKICAgICBkZXNjcmlwdGlvbkJsb2NrLmRpc3BsYXkoZGV0YWlsLmdldENoYW5nZSgpLAogICAgICAgICBkZXRhaWwuaXNTdGFycmVkKCksCisgICAgICAgIGRldGFpbC5jYW5FZGl0Q29tbWl0TWVzc2FnZSgpLAogICAgICAgICBkZXRhaWwuZ2V0Q3VycmVudFBhdGNoU2V0RGV0YWlsKCkuZ2V0SW5mbygpLAotICAgICAgICBkZXRhaWwuZ2V0QWNjb3VudHMoKSk7CisgICAgICAgIGRldGFpbC5nZXRBY2NvdW50cygpLCBkZXRhaWwuZ2V0U3VibWl0VHlwZVJlY29yZCgpKTsKICAgICBkZXBlbmRzT24uZGlzcGxheShkZXRhaWwuZ2V0RGVwZW5kc09uKCkpOwogICAgIG5lZWRlZEJ5LmRpc3BsYXkoZGV0YWlsLmdldE5lZWRlZEJ5KCkpOwotICAgIGFwcHJvdmFscy5kaXNwbGF5KGRldGFpbCk7CisgICAgYXBwcm92YWxzLmRpc3BsYXkoY2hhbmdlSW5mbyk7CiAKKyAgICBwYXRjaGVzTGlzdC5jbGVhcigpOwogICAgIGlmIChkZXRhaWwuZ2V0Q3VycmVudFBhdGNoU2V0RGV0YWlsKCkuZ2V0SW5mbygpLmdldFBhcmVudHMoKS5zaXplKCkgPiAxKSB7CiAgICAgICBwYXRjaGVzTGlzdC5hZGRJdGVtKFV0aWwuQy5hdXRvTWVyZ2UoKSk7CiAgICAgfSBlbHNlIHsKQEAgLTMxMyw4ICszMzcsOSBAQAogICAgIGJvb2xlYW4gZGVwc09wZW4gPSBmYWxzZTsKICAgICBpbnQgb3V0ZGF0ZWQgPSAwOwogICAgIGlmICghZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzQ2xvc2VkKCkpIHsKLSAgICAgIGlmIChkZXRhaWwuZ2V0RGVwZW5kc09uKCkgIT0gbnVsbCkgewotICAgICAgICBmb3IgKGZpbmFsIENoYW5nZUluZm8gY2kgOiBkZXRhaWwuZ2V0RGVwZW5kc09uKCkpIHsKKyAgICAgIGZpbmFsIExpc3Q8Q2hhbmdlSW5mbz4gZGVwZW5kc09uID0gZGV0YWlsLmdldERlcGVuZHNPbigpOworICAgICAgaWYgKGRlcGVuZHNPbiAhPSBudWxsKSB7CisgICAgICAgIGZvciAoZmluYWwgQ2hhbmdlSW5mbyBjaSA6IGRlcGVuZHNPbikgewogICAgICAgICAgIGlmICghY2kuaXNMYXRlc3QoKSkgewogICAgICAgICAgICAgZGVwc09wZW4gPSB0cnVlOwogICAgICAgICAgICAgb3V0ZGF0ZWQrKzsKQEAgLTMyNCw4ICszNDksOSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotICAgIGlmIChkZXRhaWwuZ2V0TmVlZGVkQnkoKSAhPSBudWxsKSB7Ci0gICAgICBmb3IgKGZpbmFsIENoYW5nZUluZm8gY2kgOiBkZXRhaWwuZ2V0TmVlZGVkQnkoKSkgeworICAgIGZpbmFsIExpc3Q8Q2hhbmdlSW5mbz4gbmVlZGVkQnkgPSBkZXRhaWwuZ2V0TmVlZGVkQnkoKTsKKyAgICBpZiAobmVlZGVkQnkgIT0gbnVsbCkgeworICAgICAgZm9yIChmaW5hbCBDaGFuZ2VJbmZvIGNpIDogbmVlZGVkQnkpIHsKICAgICAgICAgaWYgKChjaS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk5FVykgfHwKICAgICAgICAgICAgIChjaS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLlNVQk1JVFRFRCkgfHwKICAgICAgICAgICAgIChjaS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkRSQUZUKSkgewpAQCAtMzQ4LDYgKzM3NCwxMyBAQAogICAgIHBhdGNoU2V0c0Jsb2NrLnNldFJlZ2lzdGVyS2V5cyh0cnVlKTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIHZvaWQgZGlzY2FyZERpZmZCYXNlSWZOb3RBcHBsaWNhYmxlKGZpbmFsIENoYW5nZS5JZCB0b1Nob3cpIHsKKyAgICBpZiAoY3VycmVudENoYW5nZUlkICE9IG51bGwgJiYgIWN1cnJlbnRDaGFuZ2VJZC5lcXVhbHModG9TaG93KSkgeworICAgICAgZGlmZkJhc2VJZCA9IG51bGw7CisgICAgfQorICAgIGN1cnJlbnRDaGFuZ2VJZCA9IHRvU2hvdzsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCBhZGRDb21tZW50cyhmaW5hbCBDaGFuZ2VEZXRhaWwgZGV0YWlsKSB7CiAgICAgY29tbWVudHMuY2xlYXIoKTsKIApAQCAtMzY5LDEzICs0MDIsMTEgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1zZ0xpc3Quc2l6ZSgpOyBpKyspIHsKICAgICAgIGZpbmFsIENoYW5nZU1lc3NhZ2UgbXNnID0gbXNnTGlzdC5nZXQoaSk7CiAKLSAgICAgIGZpbmFsIEFjY291bnRJbmZvIGF1dGhvcjsKKyAgICAgIEFjY291bnRJbmZvIGF1dGhvcjsKICAgICAgIGlmIChtc2cuZ2V0QXV0aG9yKCkgIT0gbnVsbCkgewotICAgICAgICBhdXRob3IgPSBhY2N0cy5nZXQobXNnLmdldEF1dGhvcigpKTsKKyAgICAgICAgYXV0aG9yID0gRm9ybWF0VXRpbC5hc0luZm8oYWNjdHMuZ2V0KG1zZy5nZXRBdXRob3IoKSkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmluYWwgQWNjb3VudCBnZXJyaXQgPSBuZXcgQWNjb3VudChudWxsKTsKLSAgICAgICAgZ2Vycml0LnNldEZ1bGxOYW1lKFV0aWwuQy5tZXNzYWdlTm9BdXRob3IoKSk7Ci0gICAgICAgIGF1dGhvciA9IG5ldyBBY2NvdW50SW5mbyhnZXJyaXQpOworICAgICAgICBhdXRob3IgPSBBY2NvdW50SW5mby5jcmVhdGUoMCwgVXRpbC5DLm1lc3NhZ2VOb0F1dGhvcigpLCBudWxsKTsKICAgICAgIH0KIAogICAgICAgYm9vbGVhbiBpc1JlY2VudDsKQEAgLTM5Nyw2ICs0MjgsMTUgQEAKICAgICAgIGNvbW1lbnRzLmFkZChjcCk7CiAgICAgfQogCisgICAgZmluYWwgQnV0dG9uIGIgPSBuZXcgQnV0dG9uKFV0aWwuQy5jaGFuZ2VTY3JlZW5BZGRDb21tZW50KCkpOworICAgIGIuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIFBhdGNoU2V0LklkIGN1cnJlbnRQYXRjaFNldElkID0gcGF0Y2hTZXRzQmxvY2suZ2V0Q3VycmVudFBhdGNoU2V0KCkuZ2V0SWQoKTsKKyAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KERpc3BhdGNoZXIudG9QdWJsaXNoKGN1cnJlbnRQYXRjaFNldElkKSk7CisgICAgICAgIH0KKyAgICB9KTsKKyAgICBjb21tZW50cy5hZGQoYik7CiAgICAgY29tbWVudHMuc2V0VmlzaWJsZShtc2dMaXN0LnNpemUoKSA+IDApOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VUYWJsZS5qYXZhCmluZGV4IGVmNGVmNTIuLjk3YTVhMDkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ2hhbmdlVGFibGUuamF2YQpAQCAtMTYsMTAgKzE2LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbC5zaG9ydEZvcm1hdDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Gb3JtYXRVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuUGF0Y2hVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5CcmFuY2hMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5DaGFuZ2VMaW5rOwpAQCAtMjcsNzAgKzI0LDM2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk5lZWRzU2lnbkluS2V5Q29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdExpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mb0NhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsU3VtbWFyeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFN1bW1hcnlTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZUluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuRWxlbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRE9NOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsZXhUYWJsZS5GbGV4Q2VsbEZvcm1hdHRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGxGb3JtYXR0ZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuVUlPYmplY3Q7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGNsYXNzIENoYW5nZVRhYmxlIGV4dGVuZHMgTmF2aWdhdGlvblRhYmxlPENoYW5nZUluZm8+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfU1RBUiA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0lEID0gMjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfU1VCSkVDVCA9IDM7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX09XTkVSID0gNDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfUFJPSkVDVCA9IDU7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0JSQU5DSCA9IDY7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0xBU1RfVVBEQVRFID0gNzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfQ09MVU1OUyA9IDg7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX1NVQkpFQ1QgPSAyOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19PV05FUiA9IDM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX1BST0pFQ1QgPSA0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19CUkFOQ0ggPSA1OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19MQVNUX1VQREFURSA9IDY7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5TID0gNzsKIAogICBwcml2YXRlIGZpbmFsIExpc3Q8U2VjdGlvbj4gc2VjdGlvbnM7CiAgIHByaXZhdGUgQWNjb3VudEluZm9DYWNoZSBhY2NvdW50Q2FjaGUgPSBBY2NvdW50SW5mb0NhY2hlLmVtcHR5KCk7Ci0gIHByaXZhdGUgZmluYWwgTGlzdDxBcHByb3ZhbFR5cGU+IGFwcHJvdmFsVHlwZXM7Ci0gIHByaXZhdGUgZmluYWwgaW50IGNvbHVtbnM7CiAKICAgcHVibGljIENoYW5nZVRhYmxlKCkgewotICAgIHRoaXMoZmFsc2UpOwotICB9Ci0KLSAgcHVibGljIENoYW5nZVRhYmxlKGJvb2xlYW4gc2hvd0FwcHJvdmFscykgewotICAgIGFwcHJvdmFsVHlwZXMgPSBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0QXBwcm92YWxUeXBlcygpLmdldEFwcHJvdmFsVHlwZXMoKTsKLSAgICBpZiAoc2hvd0FwcHJvdmFscykgewotICAgICAgY29sdW1ucyA9IEJBU0VfQ09MVU1OUyArIGFwcHJvdmFsVHlwZXMuc2l6ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb2x1bW5zID0gQkFTRV9DT0xVTU5TOwotICAgIH0KLQotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgUHJldktleUNvbW1hbmQoMCwgJ2snLCBVdGlsLkMuY2hhbmdlVGFibGVQcmV2KCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE5leHRLZXlDb21tYW5kKDAsICdqJywgVXRpbC5DLmNoYW5nZVRhYmxlTmV4dCgpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBPcGVuS2V5Q29tbWFuZCgwLCAnbycsIFV0aWwuQy5jaGFuZ2VUYWJsZU9wZW4oKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgT3BlbktleUNvbW1hbmQoMCwgS2V5Q29kZXMuS0VZX0VOVEVSLCBVdGlsLkMKLSAgICAgICAgLmNoYW5nZVRhYmxlT3BlbigpKSk7CisgICAgc3VwZXIoVXRpbC5DLmNoYW5nZUl0ZW1IZWxwKCkpOwogCiAgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkpIHsKICAgICAgIGtleXNBY3Rpb24uYWRkKG5ldyBTdGFyS2V5Q29tbWFuZCgwLCAncycsIFV0aWwuQy5jaGFuZ2VUYWJsZVN0YXIoKSkpOwpAQCAtOTgsMjkgKzYxLDE1IEBACiAKICAgICBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VjdGlvbj4oKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfU1RBUiwgIiIpOwotICAgIHRhYmxlLnNldFRleHQoMCwgQ19JRCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uSUQoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX1NVQkpFQ1QsIFV0aWwuQy5jaGFuZ2VUYWJsZUNvbHVtblN1YmplY3QoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX09XTkVSLCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5Pd25lcigpKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfUFJPSkVDVCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uUHJvamVjdCgpKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfQlJBTkNILCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5CcmFuY2goKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX0xBU1RfVVBEQVRFLCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5MYXN0VXBkYXRlKCkpOwotICAgIGZvciAoaW50IGkgPSBCQVNFX0NPTFVNTlM7IGkgPCBjb2x1bW5zOyBpKyspIHsKLSAgICAgIGZpbmFsIEFwcHJvdmFsVHlwZSB0eXBlID0gYXBwcm92YWxUeXBlcy5nZXQoaSAtIEJBU0VfQ09MVU1OUyk7Ci0gICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdCA9IHR5cGUuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgIFN0cmluZyB0ZXh0ID0gY2F0LmdldEFiYnJldmlhdGVkTmFtZSgpOwotICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICB0ZXh0ID0gY2F0LmdldE5hbWUoKTsKLSAgICAgIH0KLSAgICAgIHRhYmxlLnNldFRleHQoMCwgaSwgdGV4dCk7Ci0gICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgIHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKS5nZXRFbGVtZW50KDAsIGkpLnNldFRpdGxlKGNhdC5nZXROYW1lKCkpOwotICAgICAgfQotICAgIH0KIAogICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBDX1NUQVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkhlYWRlcigpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIENfSUQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0lEKCkpOwotICAgIGZvciAoaW50IGkgPSBDX0lEOyBpIDwgY29sdW1uczsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IENfU1VCSkVDVDsgaSA8IENPTFVNTlM7IGkrKykgewogICAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgfQogCkBAIC0xNjQsNyArMTEzLDcgQEAKICAgICBpbnNlcnRSb3cocm93KTsKICAgICB0YWJsZS5zZXRUZXh0KHJvdywgMCwgVXRpbC5DLmNoYW5nZVRhYmxlTm9uZSgpKTsKICAgICBmaW5hbCBGbGV4Q2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpOwotICAgIGZtdC5zZXRDb2xTcGFuKHJvdywgMCwgY29sdW1ucyk7CisgICAgZm10LnNldENvbFNwYW4ocm93LCAwLCBDT0xVTU5TKTsKICAgICBmbXQuc2V0U3R5bGVOYW1lKHJvdywgMCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5lbXB0eVNlY3Rpb24oKSk7CiAgIH0KIApAQCAtMTc4LDE3ICsxMjcsMTIgQEAKICAgICBzdXBlci5hcHBseURhdGFSb3dTdHlsZShyb3cpOwogICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX1NUQVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkNlbGwoKSk7Ci0gICAgZm9yIChpbnQgaSA9IENfSUQ7IGkgPCBjb2x1bW5zOyBpKyspIHsKKyAgICBmb3IgKGludCBpID0gQ19TVUJKRUNUOyBpIDwgQ09MVU1OUzsgaSsrKSB7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgaSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kYXRhQ2VsbCgpKTsKICAgICB9Ci0gICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfSUQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0lEKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX1NVQkpFQ1QsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY1NVQkpFQ1QoKSk7Ci0gICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfUFJPSkVDVCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jUFJPSkVDVCgpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19CUkFOQ0gsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY1BST0pFQ1QoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfT1dORVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY09XTkVSKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX0xBU1RfVVBEQVRFLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNMYXN0VXBkYXRlKCkpOwotICAgIGZvciAoaW50IGkgPSBCQVNFX0NPTFVNTlM7IGkgPCBjb2x1bW5zOyBpKyspIHsKLSAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNBUFBST1ZBTCgpKTsKLSAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgcG9wdWxhdGVDaGFuZ2VSb3coZmluYWwgaW50IHJvdywgZmluYWwgQ2hhbmdlSW5mbyBjLApAQCAtMTk2LDEyICsxNDAsMTAgQEAKICAgICBDaGFuZ2VDYWNoZSBjYWNoZSA9IENoYW5nZUNhY2hlLmdldChjLmdldElkKCkpOwogICAgIGNhY2hlLmdldENoYW5nZUluZm9DYWNoZSgpLnNldChjKTsKIAotICAgIGZpbmFsIFN0cmluZyBpZHN0ciA9IGMuZ2V0S2V5KCkuYWJicmV2aWF0ZSgpOwogICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfQVJST1csIG51bGwpOwogICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CiAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX1NUQVIsIFN0YXJyZWRDaGFuZ2VzLmNyZWF0ZUljb24oYy5nZXRJZCgpLCBjLmlzU3RhcnJlZCgpKSk7CiAgICAgfQotICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfSUQsIG5ldyBUYWJsZUNoYW5nZUxpbmsoaWRzdHIsIGMpKTsKIAogICAgIFN0cmluZyBzID0gVXRpbC5jcm9wU3ViamVjdChjLmdldFN1YmplY3QoKSk7CiAgICAgaWYgKGMuZ2V0U3RhdHVzKCkgIT0gbnVsbCAmJiBjLmdldFN0YXR1cygpICE9IENoYW5nZS5TdGF0dXMuTkVXKSB7CkBAIC0yNTEsNyArMTkzLDcgQEAKICAgICAgIHMudGl0bGVSb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwogICAgICAgdGFibGUuc2V0VGV4dChzLnRpdGxlUm93LCAwLCBzLnRpdGxlVGV4dCk7CiAgICAgICBmaW5hbCBGbGV4Q2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpOwotICAgICAgZm10LnNldENvbFNwYW4ocy50aXRsZVJvdywgMCwgY29sdW1ucyk7CisgICAgICBmbXQuc2V0Q29sU3BhbihzLnRpdGxlUm93LCAwLCBDT0xVTU5TKTsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocy50aXRsZVJvdywgMCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5zZWN0aW9uSGVhZGVyKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICBzLnRpdGxlUm93ID0gLTE7CkBAIC0yOTIsMTEwICsyMzQsNiBAQAogICAgIHRhYmxlLnJlbW92ZVJvdyhyb3cpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlBcHByb3ZhbHMoZmluYWwgaW50IHJvdywgZmluYWwgQXBwcm92YWxTdW1tYXJ5IHN1bW1hcnksCi0gICAgICBmaW5hbCBBY2NvdW50SW5mb0NhY2hlIGFpYywgZmluYWwgYm9vbGVhbiBoaWdobGlnaHRVbnJldmlld2VkKSB7Ci0gICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7Ci0gICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscyA9Ci0gICAgICAgIHN1bW1hcnkuZ2V0QXBwcm92YWxNYXAoKTsKLSAgICBpbnQgY29sID0gQkFTRV9DT0xVTU5TOwotICAgIGJvb2xlYW4gaGF2ZVJldmlldyA9IGZhbHNlOwotCi0gICAgYm9vbGVhbiBzaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5ID0gZmFsc2U7Ci0KLSAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgewotICAgICAgQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcyBwcmVmcyA9IEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldEdlbmVyYWxQcmVmZXJlbmNlcygpOwotCi0gICAgICBpZiAocHJlZnMuaXNTaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5KCkpIHsKLSAgICAgICAgc2hvd1VzZXJuYW1lSW5SZXZpZXdDYXRlZ29yeSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgdHlwZSA6IGFwcHJvdmFsVHlwZXMpIHsKLSAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2EgPSBhcHByb3ZhbHMuZ2V0KHR5cGUuZ2V0Q2F0ZWdvcnkoKS5nZXRJZCgpKTsKLQotICAgICAgZm10LnJlbW92ZVN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5uZWdzY29yZSgpKTsKLSAgICAgIGZtdC5yZW1vdmVTdHlsZU5hbWUocm93LCBjb2wsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucG9zc2NvcmUoKSk7Ci0gICAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgY29sLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnNpbmdsZUxpbmUoKSk7Ci0KLSAgICAgIGlmIChjYSA9PSBudWxsIHx8IGNhLmdldFZhbHVlKCkgPT0gMCkgewotICAgICAgICB0YWJsZS5jbGVhckNlbGwocm93LCBjb2wpOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICBoYXZlUmV2aWV3ID0gdHJ1ZTsKLQotICAgICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUgYWN2ID0gdHlwZS5nZXRWYWx1ZShjYSk7Ci0gICAgICAgIGZpbmFsIEFjY291bnRJbmZvIGFpID0gYWljLmdldChjYS5nZXRBY2NvdW50SWQoKSk7Ci0KLSAgICAgICAgaWYgKHR5cGUuaXNNYXhOZWdhdGl2ZShjYSkpIHsKLQotICAgICAgICAgIGlmIChzaG93VXNlcm5hbWVJblJldmlld0NhdGVnb3J5KSB7Ci0gICAgICAgICAgICBGbG93UGFuZWwgZnAgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgICAgICAgICBmcC5hZGQobmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMucmVkTm90KCkpKTsKLSAgICAgICAgICAgIGZwLmFkZChuZXcgSW5saW5lTGFiZWwoRm9ybWF0VXRpbC5uYW1lKGFpKSkpOwotICAgICAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgY29sLCBmcCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIGNvbCwgbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMucmVkTm90KCkpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzTWF4UG9zaXRpdmUoY2EpKSB7Ci0KLSAgICAgICAgICBpZiAoc2hvd1VzZXJuYW1lSW5SZXZpZXdDYXRlZ29yeSkgewotICAgICAgICAgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOwotICAgICAgICAgICAgZnAuYWRkKG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmdyZWVuQ2hlY2soKSkpOwotICAgICAgICAgICAgZnAuYWRkKG5ldyBJbmxpbmVMYWJlbChGb3JtYXRVdGlsLm5hbWUoYWkpKSk7Ci0gICAgICAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBjb2wsIGZwKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgY29sLCBuZXcgSW1hZ2UoR2Vycml0LlJFU09VUkNFUy5ncmVlbkNoZWNrKCkpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBTdHJpbmcgdnN0ciA9IFN0cmluZy52YWx1ZU9mKGNhLmdldFZhbHVlKCkpOwotCi0gICAgICAgICAgaWYgKHNob3dVc2VybmFtZUluUmV2aWV3Q2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIHZzdHIgPSB2c3RyICsgIiAiICsgRm9ybWF0VXRpbC5uYW1lKGFpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoY2EuZ2V0VmFsdWUoKSA+IDApIHsKLSAgICAgICAgICAgIHZzdHIgPSAiKyIgKyB2c3RyOwotICAgICAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wb3NzY29yZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5uZWdzY29yZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGFibGUuc2V0VGV4dChyb3csIGNvbCwgdnN0cik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTb21lIHdlYiBicm93c2VycyBpZ25vcmUgdGhlIGVtYmVkZGVkIG5ld2xpbmU7IHNvbWUgbGlrZSBpdDsKLSAgICAgICAgLy8gc28gd2UgaW5jbHVkZSBhIHNwYWNlIGJlZm9yZSB0aGUgbmV3bGluZSB0byBhY2NvbW1vZGF0ZSBib3RoLgotICAgICAgICAvLwotICAgICAgICBmbXQuZ2V0RWxlbWVudChyb3csIGNvbCkuc2V0VGl0bGUoCi0gICAgICAgICAgICBhY3YuZ2V0TmFtZSgpICsgIiBcbmJ5ICIgKyBGb3JtYXRVdGlsLm5hbWVFbWFpbChhaSkpOwotICAgICAgfQotCi0gICAgICBjb2wrKzsKLSAgICB9Ci0KLSAgICBmaW5hbCBFbGVtZW50IHRyID0gRE9NLmdldFBhcmVudChmbXQuZ2V0RWxlbWVudChyb3csIDApKTsKLSAgICBVSU9iamVjdC5zZXRTdHlsZU5hbWUodHIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubmVlZHNSZXZpZXcoKSwgIWhhdmVSZXZpZXcKLSAgICAgICAgJiYgaGlnaGxpZ2h0VW5yZXZpZXdlZCk7Ci0gIH0KLQotICBHZXJyaXRDYWxsYmFjazxBcHByb3ZhbFN1bW1hcnlTZXQ+IGFwcHJvdmFsRm9ybWF0dGVyKGZpbmFsIGludCBkYXRhQmVnaW4sCi0gICAgICBmaW5hbCBpbnQgcm93cywgZmluYWwgYm9vbGVhbiBoaWdobGlnaHRVbnJldmlld2VkKSB7Ci0gICAgcmV0dXJuIG5ldyBHZXJyaXRDYWxsYmFjazxBcHByb3ZhbFN1bW1hcnlTZXQ+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgQXBwcm92YWxTdW1tYXJ5U2V0IGFzKSB7Ci0gICAgICAgIE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4gaWRzID0gYXMuZ2V0U3VtbWFyeU1hcCgpOwotICAgICAgICBBY2NvdW50SW5mb0NhY2hlIGFpYyA9IGFzLmdldEFjY291bnRJbmZvQ2FjaGUoKTsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gZGF0YUJlZ2luOyByb3cgPCBkYXRhQmVnaW4gKyByb3dzOyByb3crKykgewotICAgICAgICAgIGZpbmFsIENoYW5nZUluZm8gYyA9IGdldFJvd0l0ZW0ocm93KTsKLSAgICAgICAgICBpZiAoaWRzLmNvbnRhaW5zS2V5KGMuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgIGRpc3BsYXlBcHByb3ZhbHMocm93LCBpZHMuZ2V0KGMuZ2V0SWQoKSksIGFpYywgaGlnaGxpZ2h0VW5yZXZpZXdlZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCiAgIHB1YmxpYyBjbGFzcyBTdGFyS2V5Q29tbWFuZCBleHRlbmRzIE5lZWRzU2lnbkluS2V5Q29tbWFuZCB7CiAgICAgcHVibGljIFN0YXJLZXlDb21tYW5kKGludCBtYXNrLCBjaGFyIGtleSwgU3RyaW5nIGhlbHApIHsKICAgICAgIHN1cGVyKG1hc2ssIGtleSwgaGVscCk7CkBAIC00MTksMTUgKzI1NywxMCBAQAogICAgIH0KICAgfQogCi0gIHB1YmxpYyBlbnVtIEFwcHJvdmFsVmlld1R5cGUgewotICAgIE5PTkUsIFVTRVIsIFNUUk9OR0VTVAotICB9Ci0KICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWN0aW9uIHsKICAgICBTdHJpbmcgdGl0bGVUZXh0OwogCiAgICAgQ2hhbmdlVGFibGUgcGFyZW50OwotICAgIGZpbmFsIEFwcHJvdmFsVmlld1R5cGUgdmlld1R5cGU7CiAgICAgZmluYWwgQWNjb3VudC5JZCBvd25lcklkOwogICAgIGludCB0aXRsZVJvdyA9IC0xOwogICAgIGludCBkYXRhQmVnaW47CkBAIC00MzYsMTcgKzI2OSwxNSBAQAogICAgIHByaXZhdGUgQ2hhbmdlUm93Rm9ybWF0dGVyIGNoYW5nZVJvd0Zvcm1hdHRlcjsKIAogICAgIHB1YmxpYyBTZWN0aW9uKCkgewotICAgICAgdGhpcyhudWxsLCBBcHByb3ZhbFZpZXdUeXBlLk5PTkUsIG51bGwpOworICAgICAgdGhpcyhudWxsLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgU2VjdGlvbihmaW5hbCBTdHJpbmcgdGl0bGVUZXh0KSB7Ci0gICAgICB0aGlzKHRpdGxlVGV4dCwgQXBwcm92YWxWaWV3VHlwZS5OT05FLCBudWxsKTsKKyAgICAgIHRoaXModGl0bGVUZXh0LCBudWxsKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU2VjdGlvbihmaW5hbCBTdHJpbmcgdGl0bGVUZXh0LCBmaW5hbCBBcHByb3ZhbFZpZXdUeXBlIHZpZXcsCi0gICAgICAgIGZpbmFsIEFjY291bnQuSWQgb3duZXIpIHsKKyAgICBwdWJsaWMgU2VjdGlvbihmaW5hbCBTdHJpbmcgdGl0bGVUZXh0LCBmaW5hbCBBY2NvdW50LklkIG93bmVyKSB7CiAgICAgICBzZXRUaXRsZVRleHQodGl0bGVUZXh0KTsKLSAgICAgIHZpZXdUeXBlID0gdmlldzsKICAgICAgIG93bmVySWQgPSBvd25lcjsKICAgICB9CiAKQEAgLTQ5MywxOSArMzI0LDYgQEAKICAgICAgICAgICBwYXJlbnQucG9wdWxhdGVDaGFuZ2VSb3coZGF0YUJlZ2luICsgaSwgYywgY2hhbmdlUm93Rm9ybWF0dGVyKTsKICAgICAgICAgICBjaWRzLmFkZChjLmdldElkKCkpOwogICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoICh2aWV3VHlwZSkgewotICAgICAgICAgIGNhc2UgTk9ORToKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVVNFUjoKLSAgICAgICAgICAgIFBhdGNoVXRpbC5ERVRBSUxfU1ZDLnVzZXJBcHByb3ZhbHMoY2lkcywgb3duZXJJZCwgcGFyZW50Ci0gICAgICAgICAgICAgICAgLmFwcHJvdmFsRm9ybWF0dGVyKGRhdGFCZWdpbiwgcm93cywgdHJ1ZSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBTVFJPTkdFU1Q6Ci0gICAgICAgICAgICBQYXRjaFV0aWwuREVUQUlMX1NWQy5zdHJvbmdlc3RBcHByb3ZhbHMoY2lkcywgcGFyZW50Ci0gICAgICAgICAgICAgICAgLmFwcHJvdmFsRm9ybWF0dGVyKGRhdGFCZWdpbiwgcm93cywgZmFsc2UpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9DaGFuZ2VUYWJsZTIuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlMi5qYXZhCmluZGV4IDIwZGQ4MGYuLjAzY2MxMWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlMi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZVRhYmxlMi5qYXZhCkBAIC0xOCw5ICsxOCw5IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUluZm8uTGFiZWxJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BY2NvdW50TGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQnJhbmNoTGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ2hhbmdlTGluazsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5OYXZpZ2F0aW9uVGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLk5lZWRzU2lnbkluS2V5Q29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuUHJvamVjdExpbms7CkBAIC0yOSw3ICsyOSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5FbGVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxleFRhYmxlLkZsZXhDZWxsRm9ybWF0dGVyOwpAQCAtMzksNiArMzgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLklubGluZUxhYmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlVJT2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtNDYsMzUgKzQ2LDI4IEBACiAKIHB1YmxpYyBjbGFzcyBDaGFuZ2VUYWJsZTIgZXh0ZW5kcyBOYXZpZ2F0aW9uVGFibGU8Q2hhbmdlSW5mbz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19TVEFSID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfSUQgPSAyOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19TVUJKRUNUID0gMzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfT1dORVIgPSA0OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ19QUk9KRUNUID0gNTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfQlJBTkNIID0gNjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfTEFTVF9VUERBVEUgPSA3OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9DT0xVTU5TID0gODsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfU1VCSkVDVCA9IDI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX09XTkVSID0gMzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfUFJPSkVDVCA9IDQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0JSQU5DSCA9IDU7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDX0xBU1RfVVBEQVRFID0gNjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0VfQ09MVU1OUyA9IDc7CiAKICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNlY3Rpb24+IHNlY3Rpb25zOwogICBwcml2YXRlIGludCBjb2x1bW5zOwogICBwcml2YXRlIExpc3Q8U3RyaW5nPiBsYWJlbE5hbWVzOwogCiAgIHB1YmxpYyBDaGFuZ2VUYWJsZTIoKSB7CisgICAgc3VwZXIoVXRpbC5DLmNoYW5nZUl0ZW1IZWxwKCkpOwogICAgIGNvbHVtbnMgPSBCQVNFX0NPTFVNTlM7CiAgICAgbGFiZWxOYW1lcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCi0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBQcmV2S2V5Q29tbWFuZCgwLCAnaycsIFV0aWwuQy5jaGFuZ2VUYWJsZVByZXYoKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgTmV4dEtleUNvbW1hbmQoMCwgJ2onLCBVdGlsLkMuY2hhbmdlVGFibGVOZXh0KCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsICdvJywgVXRpbC5DLmNoYW5nZVRhYmxlT3BlbigpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKAotICAgICAgICBuZXcgT3BlbktleUNvbW1hbmQoMCwgS2V5Q29kZXMuS0VZX0VOVEVSLCBVdGlsLkMuY2hhbmdlVGFibGVPcGVuKCkpKTsKLQogICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CiAgICAgICBrZXlzQWN0aW9uLmFkZChuZXcgU3RhcktleUNvbW1hbmQoMCwgJ3MnLCBVdGlsLkMuY2hhbmdlVGFibGVTdGFyKCkpKTsKICAgICB9CiAKICAgICBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U2VjdGlvbj4oKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfU1RBUiwgIiIpOwotICAgIHRhYmxlLnNldFRleHQoMCwgQ19JRCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uSUQoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX1NVQkpFQ1QsIFV0aWwuQy5jaGFuZ2VUYWJsZUNvbHVtblN1YmplY3QoKSk7CiAgICAgdGFibGUuc2V0VGV4dCgwLCBDX09XTkVSLCBVdGlsLkMuY2hhbmdlVGFibGVDb2x1bW5Pd25lcigpKTsKICAgICB0YWJsZS5zZXRUZXh0KDAsIENfUFJPSkVDVCwgVXRpbC5DLmNoYW5nZVRhYmxlQ29sdW1uUHJvamVjdCgpKTsKQEAgLTgzLDggKzc2LDcgQEAKIAogICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBDX1NUQVIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkhlYWRlcigpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKDAsIENfSUQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0lEKCkpOwotICAgIGZvciAoaW50IGkgPSBDX0lEOyBpIDwgY29sdW1uczsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IENfU1VCSkVDVDsgaSA8IGNvbHVtbnM7IGkrKykgewogICAgICAgZm10LmFkZFN0eWxlTmFtZSgwLCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CiAgICAgfQogCkBAIC0xMzYsMTMgKzEyOCwxMSBAQAogICAgIHN1cGVyLmFwcGx5RGF0YVJvd1N0eWxlKHJvdyk7CiAgICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfU1RBUiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbCgpKTsKLSAgICBmb3IgKGludCBpID0gQ19JRDsgaSA8IGNvbHVtbnM7IGkrKykgeworICAgIGZvciAoaW50IGkgPSBDX1NVQkpFQ1Q7IGkgPCBjb2x1bW5zOyBpKyspIHsKICAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwogICAgIH0KLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19JRCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jSUQoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfU1VCSkVDVCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jU1VCSkVDVCgpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19QUk9KRUNULCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNQUk9KRUNUKCkpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX0JSQU5DSCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jUFJPSkVDVCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19PV05FUiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jT1dORVIoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfTEFTVF9VUERBVEUsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0xhc3RVcGRhdGUoKSk7CiAgICAgZm9yIChpbnQgaSA9IEJBU0VfQ09MVU1OUzsgaSA8IGNvbHVtbnM7IGkrKykgewogICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIGksIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY0FQUFJPVkFMKCkpOwpAQCAtMTUyLDcgKzE0Miw3IEBACiAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbHVtbnNGb3JMYWJlbHMoQ2hhbmdlTGlzdC4uLiBsaXN0cykgewogICAgIGxhYmVsTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKICAgICBmb3IgKENoYW5nZUxpc3QgbGlzdCA6IGxpc3RzKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBsaXN0LmdldChpKS5sYWJlbHMoKSkgewogICAgICAgICAgIGlmICghbGFiZWxOYW1lcy5jb250YWlucyhuYW1lKSkgewogICAgICAgICAgICAgbGFiZWxOYW1lcy5hZGQobmFtZSk7CkBAIC0xOTgsNyArMTg4LDYgQEAKICAgICAgICAgICBjLmxlZ2FjeV9pZCgpLAogICAgICAgICAgIGMuc3RhcnJlZCgpKSk7CiAgICAgfQotICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfSUQsIG5ldyBUYWJsZUNoYW5nZUxpbmsoYy5pZF9hYmJyZXZpYXRlZCgpLCBjKSk7CiAKICAgICBTdHJpbmcgc3ViamVjdCA9IFV0aWwuY3JvcFN1YmplY3QoYy5zdWJqZWN0KCkpOwogICAgIENoYW5nZS5TdGF0dXMgc3RhdHVzID0gYy5zdGF0dXMoKTsKQEAgLTIwNywxNCArMTk2LDEyIEBACiAgICAgfQogICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfU1VCSkVDVCwgbmV3IFRhYmxlQ2hhbmdlTGluayhzdWJqZWN0LCBjKSk7CiAKLSAgICBTdHJpbmcgb3duZXIgPSAiIjsKLSAgICBpZiAoYy5vd25lcigpICE9IG51bGwgJiYgYy5vd25lcigpLm5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICBvd25lciA9IGMub3duZXIoKS5uYW1lKCk7CisgICAgaWYgKGMub3duZXIoKSAhPSBudWxsKSB7CisgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX09XTkVSLCBuZXcgQWNjb3VudExpbmsoYy5vd25lcigpLCBzdGF0dXMpKTsKKyAgICB9IGVsc2UgeworICAgICAgdGFibGUuc2V0VGV4dChyb3csIENfT1dORVIsICIiKTsKICAgICB9CiAKLSAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX09XTkVSLCBuZXcgSW5saW5lSHlwZXJsaW5rKG93bmVyLAotICAgICAgICBQYWdlTGlua3MudG9BY2NvdW50UXVlcnkob3duZXIsIGMuc3RhdHVzKCkpKSk7Ci0KICAgICB0YWJsZS5zZXRXaWRnZXQoCiAgICAgICAgIHJvdywgQ19QUk9KRUNULCBuZXcgUHJvamVjdExpbmsoYy5wcm9qZWN0X25hbWVfa2V5KCksIGMuc3RhdHVzKCkpKTsKICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX0JSQU5DSCwgbmV3IEJyYW5jaExpbmsoYy5wcm9qZWN0X25hbWVfa2V5KCksIGMKQEAgLTI5OSw5ICsyODYsOSBAQAogICBwdWJsaWMgdm9pZCBhZGRTZWN0aW9uKGZpbmFsIFNlY3Rpb24gcykgewogICAgIGFzc2VydCBzLnBhcmVudCA9PSBudWxsOwogCi0gICAgaWYgKHMudGl0bGVUZXh0ICE9IG51bGwpIHsKLSAgICAgIHMudGl0bGVSb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOwotICAgICAgdGFibGUuc2V0VGV4dChzLnRpdGxlUm93LCAwLCBzLnRpdGxlVGV4dCk7CisgICAgcy5wYXJlbnQgPSB0aGlzOworICAgIHMudGl0bGVSb3cgPSB0YWJsZS5nZXRSb3dDb3VudCgpOworICAgIGlmIChzLmRpc3BsYXlUaXRsZSgpKSB7CiAgICAgICBmaW5hbCBGbGV4Q2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpOwogICAgICAgZm10LnNldENvbFNwYW4ocy50aXRsZVJvdywgMCwgY29sdW1ucyk7CiAgICAgICBmbXQuYWRkU3R5bGVOYW1lKHMudGl0bGVSb3csIDAsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2VjdGlvbkhlYWRlcigpKTsKQEAgLTMwOSw3ICsyOTYsNiBAQAogICAgICAgcy50aXRsZVJvdyA9IC0xOwogICAgIH0KIAotICAgIHMucGFyZW50ID0gdGhpczsKICAgICBzLmRhdGFCZWdpbiA9IHRhYmxlLmdldFJvd0NvdW50KCk7CiAgICAgaW5zZXJ0Tm9uZVJvdyhzLmRhdGFCZWdpbik7CiAgICAgc2VjdGlvbnMuYWRkKHMpOwpAQCAtMzY5LDYgKzM1NSw3IEBACiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VjdGlvbiB7CiAgICAgQ2hhbmdlVGFibGUyIHBhcmVudDsKICAgICBTdHJpbmcgdGl0bGVUZXh0OworICAgIFdpZGdldCB0aXRsZVdpZGdldDsKICAgICBpbnQgdGl0bGVSb3cgPSAtMTsKICAgICBpbnQgZGF0YUJlZ2luOwogICAgIGludCByb3dzOwpAQCAtMzgwLDEzICszNjcsMzMgQEAKIAogICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgewogICAgICAgdGl0bGVUZXh0ID0gdGV4dDsKKyAgICAgIHRpdGxlV2lkZ2V0ID0gbnVsbDsKICAgICAgIGlmICh0aXRsZVJvdyA+PSAwKSB7CiAgICAgICAgIHBhcmVudC50YWJsZS5zZXRUZXh0KHRpdGxlUm93LCAwLCB0aXRsZVRleHQpOwogICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlV2lkZ2V0KGZpbmFsIFdpZGdldCB0aXRsZSkgeworICAgICAgdGl0bGVXaWRnZXQgPSB0aXRsZTsKKyAgICAgIHRpdGxlVGV4dCA9IG51bGw7CisgICAgICBpZiAodGl0bGVSb3cgPj0gMCkgeworICAgICAgICBwYXJlbnQudGFibGUuc2V0V2lkZ2V0KHRpdGxlUm93LCAwLCB0aXRsZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZGlzcGxheVRpdGxlKCkgeworICAgICAgaWYgKHRpdGxlVGV4dCAhPSBudWxsKSB7CisgICAgICAgIHNldFRpdGxlVGV4dCh0aXRsZVRleHQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZih0aXRsZVdpZGdldCAhPSBudWxsKSB7CisgICAgICAgIHNldFRpdGxlV2lkZ2V0KHRpdGxlV2lkZ2V0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGlzcGxheShDaGFuZ2VMaXN0IGNoYW5nZUxpc3QpIHsKLSAgICAgIGZpbmFsIGludCBzeiA9IGNoYW5nZUxpc3QgIT0gbnVsbCA/IGNoYW5nZUxpc3Quc2l6ZSgpIDogMDsKKyAgICAgIGZpbmFsIGludCBzeiA9IGNoYW5nZUxpc3QgIT0gbnVsbCA/IGNoYW5nZUxpc3QubGVuZ3RoKCkgOiAwOwogICAgICAgZmluYWwgYm9vbGVhbiBoYWREYXRhID0gcm93cyA+IDA7CiAKICAgICAgIGlmIChoYWREYXRhKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Db21taXRNZXNzYWdlQmxvY2suamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NvbW1pdE1lc3NhZ2VCbG9jay5qYXZhCmluZGV4IGVmZjNjZDUuLmVhMTg0ZGYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NvbW1pdE1lc3NhZ2VCbG9jay5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NvbW1pdE1lc3NhZ2VCbG9jay5qYXZhCkBAIC0xNCwyNCArMTQsMzMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlczsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5FcnJvckRpYWxvZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5DaGFuZ2VMaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Db21tZW50TGlua1Byb2Nlc3NvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudGVkQWN0aW9uRGlhbG9nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5UZXh0Qm94Q2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Db21wb3NpdGU7Ci0KK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmRvbS5jbGllbnQuUHJlRWxlbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LlN0eWxlLkRpc3BsYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUJpbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQuVWlGaWVsZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Db21wb3NpdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkhUTUxQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TaW1wbGVQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmNsaXBweS5jbGllbnQuQ29weWFibGVMYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuS2V5Q29tbWFuZFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwogCiBwdWJsaWMgY2xhc3MgQ29tbWl0TWVzc2FnZUJsb2NrIGV4dGVuZHMgQ29tcG9zaXRlIHsKICAgaW50ZXJmYWNlIEJpbmRlciBleHRlbmRzIFVpQmluZGVyPEhUTUxQYW5lbCwgQ29tbWl0TWVzc2FnZUJsb2NrPiB7CkBAIC02MCwxMyArNjksNDQgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgU3RyaW5nIGNvbW1pdE1lc3NhZ2UpIHsKLSAgICBkaXNwbGF5KG51bGwsIG51bGwsIGNvbW1pdE1lc3NhZ2UpOworICAgIGRpc3BsYXkobnVsbCwgbnVsbCwgZmFsc2UsIGNvbW1pdE1lc3NhZ2UpOwogICB9CiAKLSAgcHVibGljIHZvaWQgZGlzcGxheShDaGFuZ2UuSWQgY2hhbmdlSWQsIEJvb2xlYW4gc3RhcnJlZCwgU3RyaW5nIGNvbW1pdE1lc3NhZ2UpIHsKLSAgICBzdGFyUGFuZWwuY2xlYXIoKTsKKyAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBDb21taXRNZXNzYWdlRWRpdERpYWxvZyBleHRlbmRzIENvbW1lbnRlZEFjdGlvbkRpYWxvZzxDaGFuZ2VEZXRhaWw+IHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBvcmlnaW5hbE1lc3NhZ2U7CisgICAgcHVibGljIENvbW1pdE1lc3NhZ2VFZGl0RGlhbG9nKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGhlYWRpbmcsCisgICAgICAgIGZpbmFsIFN0cmluZyBjb21taXRNZXNzYWdlLCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spIHsKKyAgICAgIHN1cGVyKHRpdGxlLCBoZWFkaW5nLCBjYWxsYmFjayk7CisgICAgICBvcmlnaW5hbE1lc3NhZ2UgPSBjb21taXRNZXNzYWdlLnRyaW0oKTsKKyAgICAgIG1lc3NhZ2Uuc2V0Q2hhcmFjdGVyV2lkdGgoNzIpOworICAgICAgbWVzc2FnZS5zZXRWaXNpYmxlTGluZXMoMjApOworICAgICAgbWVzc2FnZS5zZXRUZXh0KG9yaWdpbmFsTWVzc2FnZSk7CisgICAgICBtZXNzYWdlLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNoYW5nZVNjcmVlbkRlc2NyaXB0aW9uKCkpOworICAgICAgc2VuZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKIAotICAgIGlmIChjaGFuZ2VJZCAhPSBudWxsICYmIHN0YXJyZWQgIT0gbnVsbCAmJiBHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICBuZXcgVGV4dEJveENoYW5nZUxpc3RlbmVyKG1lc3NhZ2UpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChTdHJpbmcgbmV3VGV4dCkgeworICAgICAgICAgIC8vIFRyaW0gdGhlIG5ldyB0ZXh0IHNvIHdlIGRvbid0IGNvbnNpZGVyIHRyYWlsaW5nCisgICAgICAgICAgLy8gbmV3bGluZXMgYXMgY2hhbmdlcworICAgICAgICAgIHNlbmRCdXR0b24uc2V0RW5hYmxlZCghbmV3VGV4dC50cmltKCkuZXF1YWxzKG9yaWdpbmFsTWVzc2FnZSkpOworICAgICAgICB9CisgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVRleHQoKSB7CisgICAgICAvLyBBcyB3ZSByZWx5IG9uIGNvbW1pdCBtZXNzYWdlIGxpbmVzIGVuZGluZyBpbiBMRiwgd2UgY29udmVydCBDUkxGIHRvCisgICAgICAvLyBMRi4gQWRkaXRpb25hbGx5LCB0aGUgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGJlIHRyaW1tZWQgdG8gcmVtb3ZlIGFueQorICAgICAgLy8gZXhjZXNzIG5ld2xpbmVzIGF0IHRoZSBlbmQsIGJ1dCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBzdGlsbCBoYXMgYXQKKyAgICAgIC8vIGxlYXN0IG9uZSB0cmFpbGluZyBuZXdsaW5lLgorICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0VGV4dCgpLnJlcGxhY2VBbGwoIlxyXG4iLCAiXG4iKS50cmltKCkgKyAnXG4nOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKKyAgICAgIEJvb2xlYW4gc3RhcnJlZCwgQm9vbGVhbiBjYW5FZGl0Q29tbWl0TWVzc2FnZSwgZmluYWwgU3RyaW5nIGNvbW1pdE1lc3NhZ2UpIHsKKyAgICBzdGFyUGFuZWwuY2xlYXIoKTsKKyAgICBpZiAocGF0Y2hTZXRJZCAhPSBudWxsICYmIHN0YXJyZWQgIT0gbnVsbCAmJiBHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwogICAgICAgU3RhcnJlZENoYW5nZXMuSWNvbiBzdGFyID0gU3RhcnJlZENoYW5nZXMuY3JlYXRlSWNvbihjaGFuZ2VJZCwgc3RhcnJlZCk7CiAgICAgICBzdGFyLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNoYW5nZVNjcmVlblN0YXJJY29uKCkpOwogICAgICAgc3RhclBhbmVsLmFkZChzdGFyKTsKQEAgLTc3LDkgKzExNyw0NiBAQAogICAgIH0KIAogICAgIHBlcm1hbGlua1BhbmVsLmNsZWFyKCk7Ci0gICAgaWYgKGNoYW5nZUlkICE9IG51bGwpIHsKKyAgICBpZiAocGF0Y2hTZXRJZCAhPSBudWxsKSB7CisgICAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwogICAgICAgcGVybWFsaW5rUGFuZWwuYWRkKG5ldyBDaGFuZ2VMaW5rKFV0aWwuQy5jaGFuZ2VQZXJtYWxpbmsoKSwgY2hhbmdlSWQpKTsKLSAgICAgIHBlcm1hbGlua1BhbmVsLmFkZChuZXcgQ29weWFibGVMYWJlbChDaGFuZ2VMaW5rLnBlcm1hbGluayhjaGFuZ2VJZCksIGZhbHNlKSk7CisgICAgICBwZXJtYWxpbmtQYW5lbC5hZGQobmV3IENvcHlhYmxlTGFiZWwoQ2hhbmdlTGluay5wZXJtYWxpbmsoY2hhbmdlSWQpLAorICAgICAgICAgIGZhbHNlKSk7CisgICAgICBpZiAoY2FuRWRpdENvbW1pdE1lc3NhZ2UpIHsKKyAgICAgICAgZmluYWwgSW1hZ2UgZWRpdCA9IG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmVkaXQoKSk7CisgICAgICAgIGVkaXQuc2V0VGl0bGUoVXRpbC5DLmVkaXRDb21taXRNZXNzYWdlVG9vbFRpcCgpKTsKKyAgICAgICAgZWRpdC5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5rKCkpOworICAgICAgICBlZGl0LmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soZmluYWwgQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICAgICAgbmV3IENvbW1pdE1lc3NhZ2VFZGl0RGlhbG9nKFV0aWwuQy50aXRsZUVkaXRDb21taXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgVXRpbC5DLmhlYWRpbmdFZGl0Q29tbWl0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgIGNvbW1pdE1lc3NhZ2UsCisgICAgICAgICAgICAgICAgbmV3IENoYW5nZURldGFpbENhY2hlLklnbm9yZUVycm9yQ2FsbGJhY2soKSB7fSkgeworCisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlbmQoKSB7CisgICAgICAgICAgICAgICAgVXRpbC5NQU5BR0VfU1ZDLmNyZWF0ZU5ld1BhdGNoU2V0KHBhdGNoU2V0SWQsIGdldE1lc3NhZ2VUZXh0KCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlRGV0YWlsIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZShjaGFuZ2VJZCkpOworICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yRGlhbG9nKGNhdWdodC5nZXRNZXNzYWdlKCkpLmNlbnRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0uY2VudGVyKCk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBwZXJtYWxpbmtQYW5lbC5hZGQoZWRpdCk7CisgICAgICB9CiAgICAgfQogCiAgICAgU3RyaW5nW10gc3BsaXRDb21taXRNZXNzYWdlID0gY29tbWl0TWVzc2FnZS5zcGxpdCgiXG4iLCAyKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0N1c3RvbURhc2hib2FyZFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ3VzdG9tRGFzaGJvYXJkU2NyZWVuLmphdmEKaW5kZXggYzlmMWRjNi4uODQwZWJhYSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ3VzdG9tRGFzaGJvYXJkU2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvQ3VzdG9tRGFzaGJvYXJkU2NyZWVuLmphdmEKQEAgLTE0LDk3ICsxNCw0MyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZUxpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgQ3VzdG9tRGFzaGJvYXJkU2NyZWVuIGV4dGVuZHMgU2NyZWVuIGltcGxlbWVudHMgQ2hhbmdlTGlzdFNjcmVlbiB7Ci0gIHByaXZhdGUgU3RyaW5nIHRpdGxlOwotICBwcml2YXRlIExpc3Q8U3RyaW5nPiB0aXRsZXM7Ci0gIHByaXZhdGUgTGlzdDxTdHJpbmc+IHF1ZXJpZXM7Ci0gIHByaXZhdGUgQ2hhbmdlVGFibGUyIHRhYmxlOwotICBwcml2YXRlIExpc3Q8Q2hhbmdlVGFibGUyLlNlY3Rpb24+IHNlY3Rpb25zOworICBwcml2YXRlIERhc2hib2FyZFRhYmxlIHRhYmxlOworICBwcml2YXRlIFN0cmluZyBwYXJhbXM7CiAKICAgcHVibGljIEN1c3RvbURhc2hib2FyZFNjcmVlbihTdHJpbmcgcGFyYW1zKSB7Ci0gICAgdGl0bGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgcXVlcmllcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGZvciAoU3RyaW5nIGt2UGFpciA6IHBhcmFtcy5zcGxpdCgiWyw7Jl0iKSkgewotICAgICAgU3RyaW5nW10ga3YgPSBrdlBhaXIuc3BsaXQoIj0iLCAyKTsKLSAgICAgIGlmIChrdi5sZW5ndGggIT0gMiB8fCBrdlswXS5pc0VtcHR5KCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgidGl0bGUiLmVxdWFscyhrdlswXSkpIHsKLSAgICAgICAgdGl0bGUgPSBVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMV0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGl0bGVzLmFkZChVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMF0pKTsKLSAgICAgICAgcXVlcmllcy5hZGQoVVJMLmRlY29kZVF1ZXJ5U3RyaW5nKGt2WzFdKSk7Ci0gICAgICB9Ci0gICAgfQorICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgeworICAgIHRhYmxlID0gbmV3IERhc2hib2FyZFRhYmxlKHBhcmFtcykgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CisgICAgICAgIHN1cGVyLm9uTG9hZCgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaERpc3BsYXkoKSB7CisgICAgICAgIHN1cGVyLmZpbmlzaERpc3BsYXkoKTsKKyAgICAgICAgZGlzcGxheSgpOworICAgICAgfQorICAgIH07CisKICAgICBzdXBlci5vbkluaXRVSSgpOwogCisgICAgU3RyaW5nIHRpdGxlID0gdGFibGUuZ2V0VGl0bGUoKTsKICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewogICAgICAgc2V0V2luZG93VGl0bGUodGl0bGUpOwogICAgICAgc2V0UGFnZVRpdGxlKHRpdGxlKTsKICAgICB9CiAKLSAgICB0YWJsZSA9IG5ldyBDaGFuZ2VUYWJsZTIoKTsKLSAgICB0YWJsZS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hY2NvdW50RGFzaGJvYXJkKCkpOwotCi0gICAgc2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PENoYW5nZVRhYmxlMi5TZWN0aW9uPigpOwotICAgIGZvciAoU3RyaW5nIHRpdGxlIDogdGl0bGVzKSB7Ci0gICAgICBDaGFuZ2VUYWJsZTIuU2VjdGlvbiBzID0gbmV3IENoYW5nZVRhYmxlMi5TZWN0aW9uKCk7Ci0gICAgICBzLnNldFRpdGxlVGV4dCh0aXRsZSk7Ci0gICAgICB0YWJsZS5hZGRTZWN0aW9uKHMpOwotICAgICAgc2VjdGlvbnMuYWRkKHMpOwotICAgIH0KICAgICBhZGQodGFibGUpOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIG9uTG9hZCgpIHsKLSAgICBzdXBlci5vbkxvYWQoKTsKLQotICAgIGlmIChxdWVyaWVzLmlzRW1wdHkoKSkgewotICAgICAgZGlzcGxheSgpOwotICAgIH0gZWxzZSBpZiAocXVlcmllcy5zaXplKCkgPT0gMSkgewotICAgICAgQ2hhbmdlTGlzdC5uZXh0KHF1ZXJpZXMuZ2V0KDApLAotICAgICAgICAgIDAsIFBhZ2VkU2luZ2xlTGlzdFNjcmVlbi5NQVhfU09SVEtFWSwKLSAgICAgICAgICBuZXcgU2NyZWVuTG9hZENhbGxiYWNrPENoYW5nZUxpc3Q+KHRoaXMpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJlRGlzcGxheShDaGFuZ2VMaXN0IHJlc3VsdCkgewotICAgICAgICAgICAgICB0YWJsZS51cGRhdGVDb2x1bW5zRm9yTGFiZWxzKHJlc3VsdCk7Ci0gICAgICAgICAgICAgIHNlY3Rpb25zLmdldCgwKS5kaXNwbGF5KHJlc3VsdCk7Ci0gICAgICAgICAgICAgIHRhYmxlLmZpbmlzaERpc3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENoYW5nZUxpc3QucXVlcnkoCi0gICAgICAgICAgbmV3IFNjcmVlbkxvYWRDYWxsYmFjazxOYXRpdmVMaXN0PENoYW5nZUxpc3Q+Pih0aGlzKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHByZURpc3BsYXkoTmF0aXZlTGlzdDxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgdGFibGUudXBkYXRlQ29sdW1uc0ZvckxhYmVscygKLSAgICAgICAgICAgICAgICAgIHJlc3VsdC5hc0xpc3QoKS50b0FycmF5KG5ldyBDaGFuZ2VMaXN0W3Jlc3VsdC5zaXplKCldKSk7Ci0gICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2VjdGlvbnMuZ2V0KGkpLmRpc3BsYXkocmVzdWx0LmdldChpKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdGFibGUuZmluaXNoRGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0sCi0gICAgICAgICAgcXVlcmllcy50b0FycmF5KG5ldyBTdHJpbmdbcXVlcmllcy5zaXplKCldKSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyS2V5cygpIHsKICAgICBzdXBlci5yZWdpc3RlcktleXMoKTsKICAgICB0YWJsZS5zZXRSZWdpc3RlcktleXModHJ1ZSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9EYXNoYm9hcmRUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvRGFzaGJvYXJkVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjM4N2FiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvRGFzaGJvYXJkVGFibGUuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKK3B1YmxpYyBjbGFzcyBEYXNoYm9hcmRUYWJsZSBleHRlbmRzIENoYW5nZVRhYmxlMiB7CisgIHByaXZhdGUgTGlzdDxTZWN0aW9uPiBzZWN0aW9uczsKKyAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHRpdGxlczsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcXVlcmllczsKKworICBwdWJsaWMgRGFzaGJvYXJkVGFibGUoU3RyaW5nIHBhcmFtcykgeworICAgIHRpdGxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHF1ZXJpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBTdHJpbmcgZm9yZWFjaCA9IG51bGw7CisgICAgZm9yIChTdHJpbmcga3ZQYWlyIDogcGFyYW1zLnNwbGl0KCJbLDsmXSIpKSB7CisgICAgICBTdHJpbmdbXSBrdiA9IGt2UGFpci5zcGxpdCgiPSIsIDIpOworICAgICAgaWYgKGt2Lmxlbmd0aCAhPSAyIHx8IGt2WzBdLmlzRW1wdHkoKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCJ0aXRsZSIuZXF1YWxzKGt2WzBdKSkgeworICAgICAgICB0aXRsZSA9IFVSTC5kZWNvZGVRdWVyeVN0cmluZyhrdlsxXSk7CisgICAgICB9IGVsc2UgaWYgKCJmb3JlYWNoIi5lcXVhbHMoa3ZbMF0pKSB7CisgICAgICAgIGZvcmVhY2ggPSBVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGl0bGVzLmFkZChVUkwuZGVjb2RlUXVlcnlTdHJpbmcoa3ZbMF0pKTsKKyAgICAgICAgcXVlcmllcy5hZGQoVVJMLmRlY29kZVF1ZXJ5U3RyaW5nKGt2WzFdKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvcmVhY2ggIT0gbnVsbCkgeworICAgICAgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBxdWVyaWVzLmxpc3RJdGVyYXRvcigpOworICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgeworICAgICAgICBpdC5zZXQoaXQubmV4dCgpICsgIiAiICsgZm9yZWFjaCk7CisgICAgICB9CisgICAgfQorCisgICAgYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuYWNjb3VudERhc2hib2FyZCgpKTsKKworICAgIHNlY3Rpb25zID0gbmV3IEFycmF5TGlzdDxDaGFuZ2VUYWJsZTIuU2VjdGlvbj4oKTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChTdHJpbmcgdGl0bGUgOiB0aXRsZXMpIHsKKyAgICAgIFNlY3Rpb24gcyA9IG5ldyBTZWN0aW9uKCk7CisgICAgICBzLnNldFRpdGxlV2lkZ2V0KG5ldyBJbmxpbmVIeXBlcmxpbmsodGl0bGUsIFBhZ2VMaW5rcy50b0NoYW5nZVF1ZXJ5KHF1ZXJpZXMuZ2V0KGkrKykpKSk7CisgICAgICBhZGRTZWN0aW9uKHMpOworICAgICAgc2VjdGlvbnMuYWRkKHMpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisgICAgcmV0dXJuIHRpdGxlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIG9uTG9hZCgpIHsKKyAgICBzdXBlci5vbkxvYWQoKTsKKworICAgIGlmIChxdWVyaWVzLnNpemUoKSA9PSAxKSB7CisgICAgICBDaGFuZ2VMaXN0Lm5leHQocXVlcmllcy5nZXQoMCksCisgICAgICAgICAgMCwgUGFnZWRTaW5nbGVMaXN0U2NyZWVuLk1BWF9TT1JUS0VZLAorICAgICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxDaGFuZ2VMaXN0PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKENoYW5nZUxpc3QgcmVzdWx0KSB7CisgICAgICAgICAgICAgIHVwZGF0ZUNvbHVtbnNGb3JMYWJlbHMocmVzdWx0KTsKKyAgICAgICAgICAgICAgc2VjdGlvbnMuZ2V0KDApLmRpc3BsYXkocmVzdWx0KTsKKyAgICAgICAgICAgICAgZmluaXNoRGlzcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKCEgcXVlcmllcy5pc0VtcHR5KCkpIHsKKyAgICAgIENoYW5nZUxpc3QucXVlcnkoCisgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPEpzQXJyYXk8Q2hhbmdlTGlzdD4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoSnNBcnJheTxDaGFuZ2VMaXN0PiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgTGlzdDxDaGFuZ2VMaXN0PiBjbHMgPSBOYXRpdmVzLmFzTGlzdChyZXN1bHQpOworICAgICAgICAgICAgICB1cGRhdGVDb2x1bW5zRm9yTGFiZWxzKGNscy50b0FycmF5KG5ldyBDaGFuZ2VMaXN0W2Nscy5zaXplKCldKSk7CisgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2VjdGlvbnMuZ2V0KGkpLmRpc3BsYXkoY2xzLmdldChpKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZmluaXNoRGlzcGxheSgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0sCisgICAgICAgICAgcXVlcmllcy50b0FycmF5KG5ldyBTdHJpbmdbcXVlcmllcy5zaXplKCldKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZENvbW1hbmRMaW5rLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZENvbW1hbmRMaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOTVkNGQuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvRG93bmxvYWRDb21tYW5kTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7Ci0KLWFic3RyYWN0IGNsYXNzIERvd25sb2FkQ29tbWFuZExpbmsgZXh0ZW5kcyBBbmNob3IgaW1wbGVtZW50cyBDbGlja0hhbmRsZXIgewotICBmaW5hbCBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkQ29tbWFuZCBjbWRUeXBlOwotCi0gIERvd25sb2FkQ29tbWFuZExpbmsoQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQgY21kVHlwZSwKLSAgICAgIFN0cmluZyB0ZXh0KSB7Ci0gICAgc3VwZXIodGV4dCk7Ci0gICAgdGhpcy5jbWRUeXBlID0gY21kVHlwZTsKLSAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmsoKSk7Ci0gICAgQWNjZXNzaWJpbGl0eS5zZXRSb2xlKGdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX1RBQik7Ci0gICAgYWRkQ2xpY2tIYW5kbGVyKHRoaXMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ci0KLSAgICBzZWxlY3QoKTsKLQotICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7Ci0gICAgICAvLyBJZiB0aGUgdXNlciBpcyBzaWduZWQtaW4sIHJlbWVtYmVyIHRoaXMgY2hvaWNlIGZvciBmdXR1cmUgcGFuZWxzLgotICAgICAgLy8KLSAgICAgIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMgcHJlZiA9Ci0gICAgICAgICAgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7Ci0gICAgICBwcmVmLnNldERvd25sb2FkQ29tbWFuZChjbWRUeXBlKTsKLSAgICAgIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LlV0aWwuQUNDT1VOVF9TVkMuY2hhbmdlUHJlZmVyZW5jZXMocHJlZiwKLSAgICAgICAgICBuZXcgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoVm9pZFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9KTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQgZ2V0Q21kVHlwZSgpIHsKLSAgICByZXR1cm4gY21kVHlwZTsKLSAgfQotCi0gIHZvaWQgc2VsZWN0KCkgewotICAgIERvd25sb2FkQ29tbWFuZFBhbmVsIHBhcmVudCA9IChEb3dubG9hZENvbW1hbmRQYW5lbCkgZ2V0UGFyZW50KCk7Ci0gICAgZm9yIChXaWRnZXQgdyA6IHBhcmVudCkgewotICAgICAgaWYgKHcgIT0gdGhpcyAmJiB3IGluc3RhbmNlb2YgRG93bmxvYWRDb21tYW5kTGluaykgewotICAgICAgICB3LnJlbW92ZVN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHBhcmVudC5zZXRDdXJyZW50Q29tbWFuZCh0aGlzKTsKLSAgICBhZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtfQWN0aXZlKCkpOwotICB9Ci0KLSAgYWJzdHJhY3Qgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkQ29tbWFuZFBhbmVsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZENvbW1hbmRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTE2ZGExLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkQ29tbWFuZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkQ29tbWFuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BY2Nlc3NpYmlsaXR5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7Ci0KLWNsYXNzIERvd25sb2FkQ29tbWFuZFBhbmVsIGV4dGVuZHMgRmxvd1BhbmVsIHsKLSAgcHJpdmF0ZSBEb3dubG9hZENvbW1hbmRMaW5rIGN1cnJlbnRDb21tYW5kOwotICBwcml2YXRlIERvd25sb2FkVXJsTGluayBjdXJyZW50VXJsOwotCi0gIERvd25sb2FkQ29tbWFuZFBhbmVsKCkgewotICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0xpc3QoKSk7Ci0gICAgQWNjZXNzaWJpbGl0eS5zZXRSb2xlKGdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX1RBQkxJU1QpOwotICB9Ci0KLSAgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiBnZXRXaWRnZXRDb3VudCgpID09IDA7Ci0gIH0KLQotICB2b2lkIHNlbGVjdChBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkQ29tbWFuZCBjbWRUeXBlKSB7Ci0gICAgRG93bmxvYWRDb21tYW5kTGluayBmaXJzdCA9IG51bGw7Ci0KLSAgICBmb3IgKFdpZGdldCB3IDogdGhpcykgewotICAgICAgaWYgKHcgaW5zdGFuY2VvZiBEb3dubG9hZENvbW1hbmRMaW5rKSB7Ci0gICAgICAgIGZpbmFsIERvd25sb2FkQ29tbWFuZExpbmsgZCA9IChEb3dubG9hZENvbW1hbmRMaW5rKSB3OwotICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewotICAgICAgICAgIGZpcnN0ID0gZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZC5jbWRUeXBlID09IGNtZFR5cGUpIHsKLSAgICAgICAgICBkLnNlbGVjdCgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIG5vbmUgbWF0Y2hlZCB0aGUgcmVxdWVzdGVkIHR5cGUsIHNlbGVjdCB0aGUgZmlyc3QgaW4gdGhlCi0gICAgLy8gZ3JvdXAgYXMgdGhhdCB3aWxsIGF0IGxlYXN0IGdpdmUgdXMgYW4gaW5pdGlhbCBiYXNlbGluZS4KLSAgICBpZiAoZmlyc3QgIT0gbnVsbCkgewotICAgICAgZmlyc3Quc2VsZWN0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7Ci0gICAgY3VycmVudFVybCA9IGxpbms7Ci0gICAgdXBkYXRlKCk7Ci0gIH0KLQotICB2b2lkIHNldEN1cnJlbnRDb21tYW5kKERvd25sb2FkQ29tbWFuZExpbmsgY21kKSB7Ci0gICAgY3VycmVudENvbW1hbmQgPSBjbWQ7Ci0gICAgdXBkYXRlKCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlKCkgewotICAgIGlmIChjdXJyZW50Q29tbWFuZCAhPSBudWxsICYmIGN1cnJlbnRVcmwgIT0gbnVsbCkgewotICAgICAgY3VycmVudENvbW1hbmQuc2V0Q3VycmVudFVybChjdXJyZW50VXJsKTsKLSAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb21tYW5kICE9IG51bGwgJiYKLSAgICAgICAgY3VycmVudENvbW1hbmQuZ2V0Q21kVHlwZSgpLmVxdWFscyhEb3dubG9hZENvbW1hbmQuUkVQT19ET1dOTE9BRCkpIHsKLSAgICAgIGN1cnJlbnRDb21tYW5kLnNldEN1cnJlbnRVcmwobnVsbCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZFVybExpbmsuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWZhZmFhLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsTGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7Ci0KLWNsYXNzIERvd25sb2FkVXJsTGluayBleHRlbmRzIEFuY2hvciBpbXBsZW1lbnRzIENsaWNrSGFuZGxlciB7Ci0gIGZpbmFsIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWUgdXJsVHlwZTsKLSAgZmluYWwgU3RyaW5nIHVybERhdGE7Ci0KLSAgRG93bmxvYWRVcmxMaW5rKEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWUgdXJsVHlwZSwgU3RyaW5nIHRleHQsCi0gICAgICBTdHJpbmcgdXJsRGF0YSkgewotICAgIHN1cGVyKHRleHQpOwotICAgIHRoaXMudXJsVHlwZSA9IHVybFR5cGU7Ci0gICAgdGhpcy51cmxEYXRhID0gdXJsRGF0YTsKLSAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmsoKSk7Ci0gICAgQWNjZXNzaWJpbGl0eS5zZXRSb2xlKGdldEVsZW1lbnQoKSwgQWNjZXNzaWJpbGl0eS5ST0xFX1RBQik7Ci0gICAgYWRkQ2xpY2tIYW5kbGVyKHRoaXMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Ci0gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Ci0KLSAgICBzZWxlY3QoKTsKLQotICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7Ci0gICAgICAvLyBJZiB0aGUgdXNlciBpcyBzaWduZWQtaW4sIHJlbWVtYmVyIHRoaXMgY2hvaWNlIGZvciBmdXR1cmUgcGFuZWxzLgotICAgICAgLy8KLSAgICAgIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMgcHJlZiA9Ci0gICAgICAgICAgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7Ci0gICAgICBwcmVmLnNldERvd25sb2FkVXJsKHVybFR5cGUpOwotICAgICAgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuVXRpbC5BQ0NPVU5UX1NWQy5jaGFuZ2VQcmVmZXJlbmNlcyhwcmVmLAotICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkUmVzdWx0IHJlc3VsdCkgewotICAgICAgICAgICAgfQotICAgICAgICAgIH0pOwotICAgIH0KLSAgfQotCi0gIHZvaWQgc2VsZWN0KCkgewotICAgIERvd25sb2FkVXJsUGFuZWwgcGFyZW50ID0gKERvd25sb2FkVXJsUGFuZWwpIGdldFBhcmVudCgpOwotICAgIGZvciAoV2lkZ2V0IHcgOiBwYXJlbnQpIHsKLSAgICAgIGlmICh3ICE9IHRoaXMgJiYgdyBpbnN0YW5jZW9mIERvd25sb2FkVXJsTGluaykgewotICAgICAgICB3LnJlbW92ZVN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHBhcmVudC5zZXRDdXJyZW50VXJsKHRoaXMpOwotICAgIGFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0Rvd25sb2FkVXJsUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjOWViYy4uMDAwMDAwMAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Eb3dubG9hZFVybFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKLQotY2xhc3MgRG93bmxvYWRVcmxQYW5lbCBleHRlbmRzIEZsb3dQYW5lbCB7Ci0gIHByaXZhdGUgZmluYWwgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZFBhbmVsOwotCi0gIERvd25sb2FkVXJsUGFuZWwoZmluYWwgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZFBhbmVsKSB7Ci0gICAgdGhpcy5jb21tYW5kUGFuZWwgPSBjb21tYW5kUGFuZWw7Ci0gICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rTGlzdCgpKTsKLSAgICBBY2Nlc3NpYmlsaXR5LnNldFJvbGUoZ2V0RWxlbWVudCgpLCBBY2Nlc3NpYmlsaXR5LlJPTEVfVEFCTElTVCk7Ci0gIH0KLQotICBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgcmV0dXJuIGdldFdpZGdldENvdW50KCkgPT0gMDsKLSAgfQotCi0gIHZvaWQgc2VsZWN0KEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWUgdXJsVHlwZSkgewotICAgIERvd25sb2FkVXJsTGluayBmaXJzdCA9IG51bGw7Ci0KLSAgICBmb3IgKFdpZGdldCB3IDogdGhpcykgewotICAgICAgaWYgKHcgaW5zdGFuY2VvZiBEb3dubG9hZFVybExpbmspIHsKLSAgICAgICAgZmluYWwgRG93bmxvYWRVcmxMaW5rIGQgPSAoRG93bmxvYWRVcmxMaW5rKSB3OwotICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkgewotICAgICAgICAgIGZpcnN0ID0gZDsKLSAgICAgICAgfQotICAgICAgICBpZiAoZC51cmxUeXBlID09IHVybFR5cGUpIHsKLSAgICAgICAgICBkLnNlbGVjdCgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIElmIG5vbmUgbWF0Y2hlZCB0aGUgcmVxdWVzdGVkIHR5cGUsIHNlbGVjdCB0aGUgZmlyc3QgaW4gdGhlCi0gICAgLy8gZ3JvdXAgYXMgdGhhdCB3aWxsIGF0IGxlYXN0IGdpdmUgdXMgYW4gaW5pdGlhbCBiYXNlbGluZS4KLSAgICBpZiAoZmlyc3QgIT0gbnVsbCkgewotICAgICAgZmlyc3Quc2VsZWN0KCk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7Ci0gICAgY29tbWFuZFBhbmVsLnNldEN1cnJlbnRVcmwobGluayk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhZ2VkU2luZ2xlTGlzdFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGFnZWRTaW5nbGVMaXN0U2NyZWVuLmphdmEKaW5kZXggMjNjZTE3OC4uYzIxYzY4ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGFnZWRTaW5nbGVMaXN0U2NyZWVuLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGFnZWRTaW5nbGVMaXN0U2NyZWVuLmphdmEKQEAgLTIxLDcgKzIxLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuSGlzdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSG9yaXpvbnRhbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5LZXlDb21tYW5kOwogCkBAIC0xMTYsOSArMTE2LDkgQEAKIAogICBwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5KGZpbmFsIENoYW5nZUxpc3QgcmVzdWx0KSB7CiAgICAgY2hhbmdlcyA9IHJlc3VsdDsKLSAgICBpZiAoIWNoYW5nZXMuaXNFbXB0eSgpKSB7CisgICAgaWYgKGNoYW5nZXMubGVuZ3RoKCkgIT0gMCkgewogICAgICAgZmluYWwgQ2hhbmdlSW5mbyBmID0gY2hhbmdlcy5nZXQoMCk7Ci0gICAgICBmaW5hbCBDaGFuZ2VJbmZvIGwgPSBjaGFuZ2VzLmdldChjaGFuZ2VzLnNpemUoKSAtIDEpOworICAgICAgZmluYWwgQ2hhbmdlSW5mbyBsID0gY2hhbmdlcy5nZXQoY2hhbmdlcy5sZW5ndGgoKSAtIDEpOwogCiAgICAgICBwcmV2LnNldFRhcmdldEhpc3RvcnlUb2tlbihhbmNob3JQcmVmaXggKyAiLHAsIiArIGYuX3NvcnRrZXkoKSk7CiAgICAgICBuZXh0LnNldFRhcmdldEhpc3RvcnlUb2tlbihhbmNob3JQcmVmaXggKyAiLG4sIiArIGwuX3NvcnRrZXkoKSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFNldENvbXBsZXhEaXNjbG9zdXJlUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0Q29tcGxleERpc2Nsb3N1cmVQYW5lbC5qYXZhCmluZGV4IDdlMzE0Y2MuLjc2Zjc3YTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0Q29tcGxleERpc2Nsb3N1cmVQYW5lbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0Q29tcGxleERpc2Nsb3N1cmVQYW5lbC5qYXZhCkBAIC0xOCwzMyArMTgsMjcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuRm9ybWF0VXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HaXR3ZWJMaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZC5Eb3dubG9hZFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlBhdGNoVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5BY2NvdW50TGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ29tbWVudGVkQWN0aW9uRGlhbG9nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5Db21wbGV4RGlzY2xvc3VyZVBhbmVsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5JbmxpbmVIeXBlcmxpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkxpc3RlbmFibGVBY2NvdW50RGlmZlByZWZlcmVuY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnREaWZmUHJlZmVyZW5jZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXV0aFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlVzZXJJZGVudGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlVzZXJJZGVudGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuT3BlbkV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLk9wZW5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LldpbmRvdzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BbmNob3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkRpc2Nsb3N1cmVQYW5lbDsKQEAgLTU0LDcgKzQ4LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5QYW5lbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmNsaXBweS5jbGllbnQuQ29weWFibGVMYWJlbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTE4Myw3ICsxNzYsNiBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgcG9wdWxhdGVEaWZmQWxsQWN0aW9ucyhkZXRhaWwpOwogICAgICAgYm9keS5hZGQoYWN0aW9uc1BhbmVsKTsKICAgICB9CiAgIH0KQEAgLTIwMiwyMTIgKzE5NCw1MCBAQAogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBkaXNwbGF5RG93bmxvYWQoKSB7Ci0gICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3RLZXkgPSBjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0UHJvamVjdCgpOwotICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0TmFtZSA9IHByb2plY3RLZXkuZ2V0KCk7Ci0gICAgZmluYWwgQ29weWFibGVMYWJlbCBjb3B5TGFiZWwgPSBuZXcgQ29weWFibGVMYWJlbCgiIik7Ci0gICAgZmluYWwgRG93bmxvYWRDb21tYW5kUGFuZWwgY29tbWFuZHMgPSBuZXcgRG93bmxvYWRDb21tYW5kUGFuZWwoKTsKLSAgICBmaW5hbCBEb3dubG9hZFVybFBhbmVsIHVybHMgPSBuZXcgRG93bmxvYWRVcmxQYW5lbChjb21tYW5kcyk7Ci0gICAgZmluYWwgU2V0PERvd25sb2FkU2NoZW1lPiBhbGxvd2VkU2NoZW1lcyA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXREb3dubG9hZFNjaGVtZXMoKTsKLSAgICBmaW5hbCBTZXQ8RG93bmxvYWRDb21tYW5kPiBhbGxvd2VkQ29tbWFuZHMgPSBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0RG93bmxvYWRDb21tYW5kcygpOwotCi0gICAgY29weUxhYmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0NvcHlMYWJlbCgpKTsKLQotICAgIGlmIChjaGFuZ2VEZXRhaWwuaXNBbGxvd3NBbm9ueW1vdXMoKQotICAgICAgICAmJiBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0R2l0RGFlbW9uVXJsKCkgIT0gbnVsbAotICAgICAgICAmJiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuQU5PTl9HSVQpIHx8Ci0gICAgICAgICAgICBhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5ERUZBVUxUX0RPV05MT0FEUykpKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgci5hcHBlbmQoR2Vycml0LmdldENvbmZpZygpLmdldEdpdERhZW1vblVybCgpKTsKLSAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKLSAgICAgIHIuYXBwZW5kKCIgIik7Ci0gICAgICByLmFwcGVuZChwYXRjaFNldC5nZXRSZWZOYW1lKCkpOwotICAgICAgdXJscy5hZGQobmV3IERvd25sb2FkVXJsTGluayhEb3dubG9hZFNjaGVtZS5BTk9OX0dJVCwgVXRpbC5NCi0gICAgICAgICAgLmFub255bW91c0Rvd25sb2FkKCJHaXQiKSwgci50b1N0cmluZygpKSk7CisgIHB1YmxpYyBjbGFzcyBDaGFuZ2VEb3dubG9hZFBhbmVsIGV4dGVuZHMgRG93bmxvYWRQYW5lbCB7CisgICAgcHVibGljIENoYW5nZURvd25sb2FkUGFuZWwoU3RyaW5nIHByb2plY3QsIFN0cmluZyByZWYsIGJvb2xlYW4gYWxsb3dBbm9ueW1vdXMpIHsKKyAgICAgIHN1cGVyKHByb2plY3QsIHJlZiwgYWxsb3dBbm9ueW1vdXMpOwogICAgIH0KIAotICAgIFN0cmluZyBob3N0UGFnZVVybCA9IEdXVC5nZXRIb3N0UGFnZUJhc2VVUkwoKTsKLSAgICBpZiAoIWhvc3RQYWdlVXJsLmVuZHNXaXRoKCIvIikpIHsKLSAgICAgIGhvc3RQYWdlVXJsICs9ICIvIjsKLSAgICB9Ci0KLSAgICBpZiAoY2hhbmdlRGV0YWlsLmlzQWxsb3dzQW5vbnltb3VzKCkKLSAgICAgICAgJiYgKGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkFOT05fSFRUUCkgfHwKLSAgICAgICAgICAgIGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkRFRkFVTFRfRE9XTkxPQURTKSkpIHsKLSAgICAgIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsKSB7Ci0gICAgICAgIHIuYXBwZW5kKEdlcnJpdC5nZXRDb25maWcoKS5nZXRHaXRIdHRwVXJsKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgci5hcHBlbmQoaG9zdFBhZ2VVcmwpOwotICAgICAgfQotICAgICAgci5hcHBlbmQocHJvamVjdE5hbWUpOwotICAgICAgci5hcHBlbmQoIiAiKTsKLSAgICAgIHIuYXBwZW5kKHBhdGNoU2V0LmdldFJlZk5hbWUoKSk7Ci0gICAgICB1cmxzLmFkZChuZXcgRG93bmxvYWRVcmxMaW5rKERvd25sb2FkU2NoZW1lLkFOT05fSFRUUCwgVXRpbC5NCi0gICAgICAgICAgLmFub255bW91c0Rvd25sb2FkKCJIVFRQIiksIHIudG9TdHJpbmcoKSkpOwotICAgIH0KLQotICAgIGlmIChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0U3NoZEFkZHJlc3MoKSAhPSBudWxsCi0gICAgICAgICYmIGhhc1VzZXJOYW1lKCkKLSAgICAgICAgJiYgKGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLlNTSCkgfHwKLSAgICAgICAgICAgIGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkRFRkFVTFRfRE9XTkxPQURTKSkpIHsKLSAgICAgIFN0cmluZyBzc2hBZGRyID0gR2Vycml0LmdldENvbmZpZygpLmdldFNzaGRBZGRyZXNzKCk7Ci0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgci5hcHBlbmQoInNzaDovLyIpOwotICAgICAgci5hcHBlbmQoR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSk7Ci0gICAgICByLmFwcGVuZCgiQCIpOwotICAgICAgaWYgKHNzaEFkZHIuc3RhcnRzV2l0aCgiKjoiKSB8fCAiIi5lcXVhbHMoc3NoQWRkcikpIHsKLSAgICAgICAgci5hcHBlbmQoV2luZG93LkxvY2F0aW9uLmdldEhvc3ROYW1lKCkpOwotICAgICAgfQotICAgICAgaWYgKHNzaEFkZHIuc3RhcnRzV2l0aCgiKiIpKSB7Ci0gICAgICAgIHNzaEFkZHIgPSBzc2hBZGRyLnN1YnN0cmluZygxKTsKLSAgICAgIH0KLSAgICAgIHIuYXBwZW5kKHNzaEFkZHIpOwotICAgICAgci5hcHBlbmQoIi8iKTsKLSAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKLSAgICAgIHIuYXBwZW5kKCIgIik7Ci0gICAgICByLmFwcGVuZChwYXRjaFNldC5nZXRSZWZOYW1lKCkpOwotICAgICAgdXJscy5hZGQobmV3IERvd25sb2FkVXJsTGluayhEb3dubG9hZFNjaGVtZS5TU0gsICJTU0giLCByLnRvU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBpZiAoKGhhc1VzZXJOYW1lKCkgfHwgc2l0ZVJlbGllc09uSHR0cCgpKQotICAgICAgICAmJiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuSFRUUCkKLSAgICAgICAgICAgIHx8IGFsbG93ZWRTY2hlbWVzLmNvbnRhaW5zKERvd25sb2FkU2NoZW1lLkRFRkFVTFRfRE9XTkxPQURTKSkpIHsKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsCi0gICAgICAgICAgJiYgKGNoYW5nZURldGFpbC5pc0FsbG93c0Fub255bW91cygpIHx8IHNpdGVSZWxpZXNPbkh0dHAoKSkpIHsKLSAgICAgICAgci5hcHBlbmQoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTdHJpbmcgYmFzZSA9IGhvc3RQYWdlVXJsOwotICAgICAgICBpbnQgcCA9IGJhc2UuaW5kZXhPZigiOi8vIik7Ci0gICAgICAgIGludCBzID0gYmFzZS5pbmRleE9mKCcvJywgcCArIDMpOwotICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICBzID0gYmFzZS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgaG9zdCA9IGJhc2Uuc3Vic3RyaW5nKHAgKyAzLCBzKTsKLSAgICAgICAgaWYgKGhvc3QuY29udGFpbnMoIkAiKSkgewotICAgICAgICAgIGhvc3QgPSBob3N0LnN1YnN0cmluZyhob3N0LmluZGV4T2YoJ0AnKSArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgci5hcHBlbmQoYmFzZS5zdWJzdHJpbmcoMCwgcCArIDMpKTsKLSAgICAgICAgci5hcHBlbmQoR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSk7Ci0gICAgICAgIHIuYXBwZW5kKCdAJyk7Ci0gICAgICAgIHIuYXBwZW5kKGhvc3QpOwotICAgICAgICByLmFwcGVuZChiYXNlLnN1YnN0cmluZyhzKSk7Ci0gICAgICB9Ci0gICAgICByLmFwcGVuZChwcm9qZWN0TmFtZSk7Ci0gICAgICByLmFwcGVuZCgiICIpOwotICAgICAgci5hcHBlbmQocGF0Y2hTZXQuZ2V0UmVmTmFtZSgpKTsKLSAgICAgIHVybHMuYWRkKG5ldyBEb3dubG9hZFVybExpbmsoRG93bmxvYWRTY2hlbWUuSFRUUCwgIkhUVFAiLCByLnRvU3RyaW5nKCkpKTsKLSAgICB9Ci0KLSAgICBpZiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuUkVQT19ET1dOTE9BRCkpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZURvd25sb2FkQ29tbWFuZExpbmtzKCkgewogICAgICAgLy8gVGhpcyBzaXRlIHByZWZlcnMgdXNhZ2Ugb2YgdGhlICdyZXBvJyB0b29sLCBzbyBzdWdnZXN0CiAgICAgICAvLyB0aGF0IGZvciBlYXN5IGZldGNoLgogICAgICAgLy8KLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICByLmFwcGVuZCgicmVwbyBkb3dubG9hZCAiKTsKLSAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKLSAgICAgIHIuYXBwZW5kKCIgIik7Ci0gICAgICByLmFwcGVuZChjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSk7Ci0gICAgICByLmFwcGVuZCgiLyIpOwotICAgICAgci5hcHBlbmQocGF0Y2hTZXQuZ2V0UGF0Y2hTZXRJZCgpKTsKLSAgICAgIGZpbmFsIFN0cmluZyBjbWQgPSByLnRvU3RyaW5nKCk7Ci0gICAgICBjb21tYW5kcy5hZGQobmV3IERvd25sb2FkQ29tbWFuZExpbmsoRG93bmxvYWRDb21tYW5kLlJFUE9fRE9XTkxPQUQsCi0gICAgICAgICAgInJlcG8gZG93bmxvYWQiKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKLSAgICAgICAgICB1cmxzLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICAgIGNvcHlMYWJlbC5zZXRUZXh0KGNtZCk7CisgICAgICBpZiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuUkVQT19ET1dOTE9BRCkpIHsKKyAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBSZXBvQ29tbWFuZExpbmsocHJvamVjdE5hbWUsCisgICAgICAgICAgICBjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSArICIvIgorICAgICAgICAgICAgKyBwYXRjaFNldC5nZXRQYXRjaFNldElkKCkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCF1cmxzLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5DSEVDS09VVCkKKyAgICAgICAgICAgIHx8IGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuREVGQVVMVF9ET1dOTE9BRFMpKSB7CisgICAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBDaGVja291dENvbW1hbmRMaW5rKCkpOwogICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9Ci0KLSAgICBpZiAoIXVybHMuaXNFbXB0eSgpKSB7Ci0gICAgICBpZiAoYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5DSEVDS09VVCkKLSAgICAgICAgICB8fCBhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkRFRkFVTFRfRE9XTkxPQURTKSkgewotICAgICAgICBjb21tYW5kcy5hZGQobmV3IERvd25sb2FkQ29tbWFuZExpbmsoRG93bmxvYWRDb21tYW5kLkNIRUNLT1VULAotICAgICAgICAgICAgImNoZWNrb3V0IikgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgewotICAgICAgICAgICAgdXJscy5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICAgICAgY29weUxhYmVsLnNldFRleHQoImdpdCBmZXRjaCAiICsgbGluay51cmxEYXRhCi0gICAgICAgICAgICAgICAgKyAiICYmIGdpdCBjaGVja291dCBGRVRDSF9IRUFEIik7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0KLSAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLlBVTEwpCi0gICAgICAgICAgfHwgYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5ERUZBVUxUX0RPV05MT0FEUykpIHsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBEb3dubG9hZENvbW1hbmRMaW5rKERvd25sb2FkQ29tbWFuZC5QVUxMLCAicHVsbCIpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKLSAgICAgICAgICAgIHVybHMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGNvcHlMYWJlbC5zZXRUZXh0KCJnaXQgcHVsbCAiICsgbGluay51cmxEYXRhKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuQ0hFUlJZX1BJQ0spCi0gICAgICAgICAgfHwgYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5ERUZBVUxUX0RPV05MT0FEUykpIHsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBEb3dubG9hZENvbW1hbmRMaW5rKERvd25sb2FkQ29tbWFuZC5DSEVSUllfUElDSywKLSAgICAgICAgICAgICJjaGVycnktcGljayIpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKLSAgICAgICAgICAgIHVybHMuc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIGNvcHlMYWJlbC5zZXRUZXh0KCJnaXQgZmV0Y2ggIiArIGxpbmsudXJsRGF0YQotICAgICAgICAgICAgICAgICsgIiAmJiBnaXQgY2hlcnJ5LXBpY2sgRkVUQ0hfSEVBRCIpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgICBpZiAoYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5GT1JNQVRfUEFUQ0gpCi0gICAgICAgICAgfHwgYWxsb3dlZENvbW1hbmRzLmNvbnRhaW5zKERvd25sb2FkQ29tbWFuZC5ERUZBVUxUX0RPV05MT0FEUykpIHsKLSAgICAgICAgY29tbWFuZHMuYWRkKG5ldyBEb3dubG9hZENvbW1hbmRMaW5rKERvd25sb2FkQ29tbWFuZC5GT1JNQVRfUEFUQ0gsCi0gICAgICAgICAgICAicGF0Y2giKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7Ci0gICAgICAgICAgICB1cmxzLnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBjb3B5TGFiZWwuc2V0VGV4dCgiZ2l0IGZldGNoICIgKyBsaW5rLnVybERhdGEKLSAgICAgICAgICAgICAgICArICIgJiYgZ2l0IGZvcm1hdC1wYXRjaCAtMSAtLXN0ZG91dCBGRVRDSF9IRUFEIik7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKKyAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuUFVMTCkKKyAgICAgICAgICAgIHx8IGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuREVGQVVMVF9ET1dOTE9BRFMpKSB7CisgICAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBQdWxsQ29tbWFuZExpbmsoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuQ0hFUlJZX1BJQ0spCisgICAgICAgICAgICB8fCBhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkRFRkFVTFRfRE9XTkxPQURTKSkgeworICAgICAgICAgIGNvbW1hbmRzLmFkZChjbWRMaW5rZmFjdG9yeS5uZXcgQ2hlcnJ5UGlja0NvbW1hbmRMaW5rKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMuY29udGFpbnMoRG93bmxvYWRDb21tYW5kLkZPUk1BVF9QQVRDSCkKKyAgICAgICAgICAgIHx8IGFsbG93ZWRDb21tYW5kcy5jb250YWlucyhEb3dubG9hZENvbW1hbmQuREVGQVVMVF9ET1dOTE9BRFMpKSB7CisgICAgICAgICAgY29tbWFuZHMuYWRkKGNtZExpbmtmYWN0b3J5Lm5ldyBGb3JtYXRQYXRjaENvbW1hbmRMaW5rKCkpOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQotCi0gICAgZmluYWwgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOwotICAgIGlmICghY29tbWFuZHMuaXNFbXB0eSgpKSB7Ci0gICAgICBmaW5hbCBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzIHByZWY7Ci0gICAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgewotICAgICAgICBwcmVmID0gR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmVmID0gbmV3IEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMoKTsKLSAgICAgICAgcHJlZi5yZXNldFRvRGVmYXVsdHMoKTsKLSAgICAgIH0KLSAgICAgIGNvbW1hbmRzLnNlbGVjdChwcmVmLmdldERvd25sb2FkQ29tbWFuZCgpKTsKLSAgICAgIHVybHMuc2VsZWN0KHByZWYuZ2V0RG93bmxvYWRVcmwoKSk7Ci0KLSAgICAgIEZsb3dQYW5lbCBwID0gbmV3IEZsb3dQYW5lbCgpOwotICAgICAgcC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtIZWFkZXIoKSk7Ci0gICAgICBwLmFkZChjb21tYW5kcyk7Ci0gICAgICBmaW5hbCBJbmxpbmVMYWJlbCBnbHVlID0gbmV3IElubGluZUxhYmVsKCk7Ci0gICAgICBnbHVlLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0hlYWRlckdhcCgpKTsKLSAgICAgIHAuYWRkKGdsdWUpOwotICAgICAgcC5hZGQodXJscyk7Ci0KLSAgICAgIGZwLmFkZChwKTsKLSAgICAgIGZwLmFkZChjb3B5TGFiZWwpOwotICAgIH0KLSAgICBpbmZvVGFibGUuc2V0V2lkZ2V0KFJfRE9XTkxPQUQsIDEsIGZwKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2l0ZVJlbGllc09uSHR0cCgpIHsKLSAgICByZXR1cm4gR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsCi0gICAgICAgICYmIEdlcnJpdC5nZXRDb25maWcoKS5nZXRBdXRoVHlwZSgpID09IEF1dGhUeXBlLkNVU1RPTV9FWFRFTlNJT04KLSAgICAgICAgJiYgIUdlcnJpdC5nZXRDb25maWcoKS5zaXRlSGFzVXNlcm5hbWVzKCk7Ci0gIH0KKyAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlEb3dubG9hZCgpIHsKKyAgICBDaGFuZ2VEb3dubG9hZFBhbmVsIGRwID0gbmV3IENoYW5nZURvd25sb2FkUGFuZWwoCisgICAgICBjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0UHJvamVjdCgpLmdldCgpLAorICAgICAgcGF0Y2hTZXQuZ2V0UmVmTmFtZSgpLAorICAgICAgY2hhbmdlRGV0YWlsLmlzQWxsb3dzQW5vbnltb3VzKCkpOwogCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzVXNlck5hbWUoKSB7Ci0gICAgcmV0dXJuIEdlcnJpdC5pc1NpZ25lZEluKCkKLSAgICAgICAgJiYgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKSAhPSBudWxsCi0gICAgICAgICYmIEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldFVzZXJOYW1lKCkubGVuZ3RoKCkgPiAwOworICAgIGluZm9UYWJsZS5zZXRXaWRnZXQoUl9ET1dOTE9BRCwgMSwgZHApOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlVc2VySWRlbnRpdHkoZmluYWwgaW50IHJvdywgZmluYWwgVXNlcklkZW50aXR5IHdobykgewpAQCAtNDIwLDggKzI1MCw3IEBACiAgICAgZnAuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucGF0Y2hTZXRVc2VySWRlbnRpdHkoKSk7CiAgICAgaWYgKHdoby5nZXROYW1lKCkgIT0gbnVsbCkgewogICAgICAgaWYgKHdoby5nZXRBY2NvdW50KCkgIT0gbnVsbCkgewotICAgICAgICBmcC5hZGQobmV3IElubGluZUh5cGVybGluayh3aG8uZ2V0TmFtZSgpLAotICAgICAgICAgICAgUGFnZUxpbmtzLnRvQWNjb3VudFF1ZXJ5KHdoby5nZXROYW1lKCkpKSk7CisgICAgICAgIGZwLmFkZChuZXcgQWNjb3VudExpbmsod2hvKSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBmaW5hbCBJbmxpbmVMYWJlbCBsYmwgPSBuZXcgSW5saW5lTGFiZWwod2hvLmdldE5hbWUoKSk7CiAgICAgICAgIGxibC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hY2NvdW50TmFtZSgpKTsKQEAgLTQ3NSwxMSArMzA0LDI5IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKGZpbmFsIENsaWNrRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICBiLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgIFV0aWwuTUFOQUdFX1NWQy5zdWJtaXQocGF0Y2hTZXQuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgbmV3IENoYW5nZURldGFpbENhY2hlLkdlcnJpdFdpZGdldENhbGxiYWNrKGIpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlRGV0YWlsIHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgb25TdWJtaXRSZXN1bHQocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgQ2hhbmdlQXBpLnN1Ym1pdCgKKyAgICAgICAgICAgICAgcGF0Y2hTZXQuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKS5nZXQoKSwKKyAgICAgICAgICAgICAgcGF0Y2hTZXQuZ2V0UmV2aXNpb24oKS5nZXQoKSwKKyAgICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFN1Ym1pdEluZm8+KCkgeworICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFN1Ym1pdEluZm8gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlZGlzcGxheSgpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGVycikgeworICAgICAgICAgICAgICAgICAgICBpZiAoU3VibWl0RmFpbHVyZURpYWxvZy5pc0NvbmZsaWN0KGVycikpIHsKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgU3VibWl0RmFpbHVyZURpYWxvZyhlcnIuZ2V0TWVzc2FnZSgpKS5jZW50ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICByZWRpc3BsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICBiLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGVycik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHJlZGlzcGxheSgpIHsKKyAgICAgICAgICAgICAgICAgICAgR2Vycml0LmRpc3BsYXkoCisgICAgICAgICAgICAgICAgICAgICAgICBQYWdlTGlua3MudG9DaGFuZ2UocGF0Y2hTZXQuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2hhbmdlU2NyZWVuKHBhdGNoU2V0LmdldElkKCkuZ2V0UGFyZW50S2V5KCkpKTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICAgIH0pOwpAQCAtNTA0LDggKzM1MSwyMiBAQAogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2VuZCgpIHsKLSAgICAgICAgICAgICAgVXRpbC5NQU5BR0VfU1ZDLnJldmVydENoYW5nZShwYXRjaFNldC5nZXRJZCgpLCBnZXRNZXNzYWdlVGV4dCgpLAotICAgICAgICAgICAgICAgICBjcmVhdGVDYWxsYmFjaygpKTsKKyAgICAgICAgICAgICAgQ2hhbmdlQXBpLnJldmVydChjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSwKKyAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VUZXh0KCksIG5ldyBHZXJyaXRDYWxsYmFjazxDaGFuZ2VJbmZvPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhDaGFuZ2VJbmZvIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIHNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZShuZXcgQ2hhbmdlLklkKHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAuX251bWJlcigpKSkpOworICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0uY2VudGVyKCk7CiAgICAgICAgIH0KQEAgLTUyNyw4ICszODgsMjUgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlbmQoKSB7Ci0gICAgICAgICAgICAgIFV0aWwuTUFOQUdFX1NWQy5hYmFuZG9uQ2hhbmdlKHBhdGNoU2V0LmdldElkKCksIGdldE1lc3NhZ2VUZXh0KCksCi0gICAgICAgICAgICAgICAgICBjcmVhdGVDYWxsYmFjaygpKTsKKyAgICAgICAgICAgICAgLy8gVE9ETzogb25jZSB0aGUgb3RoZXIgdXNlcnMgb2YgQWN0aW9uRGlhbG9nIGhhdmUgY29udmVydGVkIHRvCisgICAgICAgICAgICAgIC8vIFJFU1QgQVBJcywgd2UgY2FuIHVzZSBjcmVhdGVDYWxsYmFjaygpIHJhdGhlciB0aGFuIHByb3ZpZGluZworICAgICAgICAgICAgICAvLyB0aGVtIGRpcmVjdGx5LgorICAgICAgICAgICAgICBDaGFuZ2VBcGkuYWJhbmRvbihjaGFuZ2VEZXRhaWwuZ2V0Q2hhbmdlKCkuZ2V0Q2hhbmdlSWQoKSwKKyAgICAgICAgICAgICAgICAgIGdldE1lc3NhZ2VUZXh0KCksIG5ldyBHZXJyaXRDYWxsYmFjazxDaGFuZ2VJbmZvPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhDaGFuZ2VJbmZvIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgIHNlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZShuZXcgQ2hhbmdlLklkKHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAuX251bWJlcigpKSkpOworICAgICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1dHRvbnModHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0uY2VudGVyKCk7CiAgICAgICAgIH0KQEAgLTU3NCw4ICs0NTIsMjIgQEAKIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNlbmQoKSB7Ci0gICAgICAgICAgICAgIFV0aWwuTUFOQUdFX1NWQy5yZXN0b3JlQ2hhbmdlKHBhdGNoU2V0LmdldElkKCksIGdldE1lc3NhZ2VUZXh0KCksCi0gICAgICAgICAgICAgICAgICBjcmVhdGVDYWxsYmFjaygpKTsKKyAgICAgICAgICAgICAgQ2hhbmdlQXBpLnJlc3RvcmUoY2hhbmdlRGV0YWlsLmdldENoYW5nZSgpLmdldENoYW5nZUlkKCksCisgICAgICAgICAgICAgICAgICBnZXRNZXNzYWdlVGV4dCgpLCBuZXcgR2Vycml0Q2FsbGJhY2s8Q2hhbmdlSW5mbz4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoQ2hhbmdlSW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICBHZXJyaXQuZGlzcGxheShQYWdlTGlua3MudG9DaGFuZ2UobmV3IENoYW5nZS5JZChyZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLl9udW1iZXIoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICBoaWRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdXR0b25zKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9LmNlbnRlcigpOwogICAgICAgICB9CkBAIC01OTcsMzUgKzQ4OSw2IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRGlmZkFsbEFjdGlvbnMoZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7Ci0gICAgZmluYWwgQnV0dG9uIGRpZmZBbGxTaWRlQnlTaWRlID0gbmV3IEJ1dHRvbihVdGlsLkMuYnV0dG9uRGlmZkFsbFNpZGVCeVNpZGUoKSk7Ci0gICAgZGlmZkFsbFNpZGVCeVNpZGUuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBmb3IgKFBhdGNoIHAgOiBkZXRhaWwuZ2V0UGF0Y2hlcygpKSB7Ci0gICAgICAgICAgb3BlbldpbmRvdyhEaXNwYXRjaGVyLnRvUGF0Y2hTaWRlQnlTaWRlKGRpZmZCYXNlSWQsIHAuZ2V0S2V5KCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGFjdGlvbnNQYW5lbC5hZGQoZGlmZkFsbFNpZGVCeVNpZGUpOwotCi0gICAgZmluYWwgQnV0dG9uIGRpZmZBbGxVbmlmaWVkID0gbmV3IEJ1dHRvbihVdGlsLkMuYnV0dG9uRGlmZkFsbFVuaWZpZWQoKSk7Ci0gICAgZGlmZkFsbFVuaWZpZWQuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgewotICAgICAgICBmb3IgKFBhdGNoIHAgOiBkZXRhaWwuZ2V0UGF0Y2hlcygpKSB7Ci0gICAgICAgICAgb3BlbldpbmRvdyhEaXNwYXRjaGVyLnRvUGF0Y2hVbmlmaWVkKGRpZmZCYXNlSWQsIHAuZ2V0S2V5KCkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOwotICAgIGFjdGlvbnNQYW5lbC5hZGQoZGlmZkFsbFVuaWZpZWQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coU3RyaW5nIHRva2VuKSB7Ci0gICAgU3RyaW5nIHVybCA9IFdpbmRvdy5Mb2NhdGlvbi5nZXRQYXRoKCkgKyAiIyIgKyB0b2tlbjsKLSAgICBXaW5kb3cub3Blbih1cmwsICJfYmxhbmsiLCBudWxsKTsKLSAgfQotCiAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVJldmlld0FjdGlvbigpIHsKICAgICBmaW5hbCBCdXR0b24gYiA9IG5ldyBCdXR0b24oVXRpbC5DLmJ1dHRvblJldmlldygpKTsKICAgICBiLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewpAQCAtNzM5LDI4ICs2MDIsNiBAQAogICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmhlYWRlcigpKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBvblN1Ym1pdFJlc3VsdChmaW5hbCBDaGFuZ2VEZXRhaWwgcmVzdWx0KSB7Ci0gICAgaWYgKHJlc3VsdC5nZXRDaGFuZ2UoKS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk5FVykgewotICAgICAgLy8gVGhlIHN1Ym1pdCBmYWlsZWQuIFRyeSB0byBsb2NhdGUgdGhlIG1lc3NhZ2UgYW5kIGRpc3BsYXkKLSAgICAgIC8vIGl0IHRvIHRoZSB1c2VyLCBpdCBzaG91bGQgYmUgdGhlIGxhc3Qgb25lIGNyZWF0ZWQgYnkgR2Vycml0LgotICAgICAgLy8KLSAgICAgIENoYW5nZU1lc3NhZ2UgbXNnID0gbnVsbDsKLSAgICAgIGlmIChyZXN1bHQuZ2V0TWVzc2FnZXMoKSAhPSBudWxsICYmIHJlc3VsdC5nZXRNZXNzYWdlcygpLnNpemUoKSA+IDApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IHJlc3VsdC5nZXRNZXNzYWdlcygpLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgaWYgKHJlc3VsdC5nZXRNZXNzYWdlcygpLmdldChpKS5nZXRBdXRob3IoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtc2cgPSByZXN1bHQuZ2V0TWVzc2FnZXMoKS5nZXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKG1zZyAhPSBudWxsKSB7Ci0gICAgICAgIG5ldyBTdWJtaXRGYWlsdXJlRGlhbG9nKHJlc3VsdCwgbXNnKS5jZW50ZXIoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZGV0YWlsQ2FjaGUuc2V0KHJlc3VsdCk7Ci0gIH0KLQogICBwdWJsaWMgUGF0Y2hTZXQgZ2V0UGF0Y2hTZXQoKSB7CiAgICAgcmV0dXJuIHBhdGNoU2V0OwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFNldHNCbG9jay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGF0Y2hTZXRzQmxvY2suamF2YQppbmRleCBiOWVkNGU3Li41YTZlNDI3IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFNldHNCbG9jay5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoU2V0c0Jsb2NrLmphdmEKQEAgLTE3Niw2ICsxNzYsNyBAQAogICAgICAgICBQYXRjaFNldENvbXBsZXhEaXNjbG9zdXJlUGFuZWwgcGF0Y2hTZXRQYW5lbCA9CiAgICAgICAgICAgICBwYXRjaFNldFBhbmVscy5nZXQocGF0Y2hTZXRJZCk7CiAgICAgICAgIHBhdGNoU2V0UGFuZWwuc2V0QWN0aXZlKHRydWUpOworICAgICAgICBwYXRjaFNldFBhbmVsLnNldE9wZW4odHJ1ZSk7CiAgICAgICAgIGFjdGl2ZVBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwogICAgICAgfQogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFRhYmxlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QYXRjaFRhYmxlLmphdmEKaW5kZXggYjhhY2Q1Ni4uNTBmYzg5MiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUGF0Y2hUYWJsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1BhdGNoVGFibGUuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkRpc3BhdGNoZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5QYXRjaFNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOwpAQCAtMjIsMTEgKzIzLDEwIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlBhdGNoTGluazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldERldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaC5DaGFuZ2VUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaC5LZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoLlBhdGNoVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXIuUmVwZWF0aW5nQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CkBAIC0zNCw2ICszNCw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3c7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGw7CkBAIC00NCw3ICs0Niw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5wcm9ncmVzcy5jbGllbnQuUHJvZ3Jlc3NCYXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWxCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXlVdGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTE1OCw3ICsxNTksOSBAQAogICB9CiAKICAgcHVibGljIHZvaWQgbW92ZVBvaW50ZXJUbyhmaW5hbCBQYXRjaC5LZXkgaykgewotICAgIG15VGFibGUubW92ZVBvaW50ZXJUbyhrKTsKKyAgICBpZiAobXlUYWJsZSAhPSBudWxsKSB7CisgICAgICBteVRhYmxlLm1vdmVQb2ludGVyVG8oayk7CisgICAgfQogICB9CiAKICAgcHVibGljIHZvaWQgc2V0QWN0aXZlKGJvb2xlYW4gYWN0aXZlKSB7CkBAIC0yNDMsOCArMjQ2LDcgQEAKIAogICAgIEtleSB0aGlzS2V5ID0gcGF0Y2guZ2V0S2V5KCk7CiAgICAgUGF0Y2hMaW5rIGxpbms7Ci0gICAgaWYgKHBhdGNoVHlwZSA9PSBQYXRjaFNjcmVlbi5UeXBlLlNJREVfQllfU0lERQotICAgICAgICAmJiBwYXRjaC5nZXRQYXRjaFR5cGUoKSA9PSBQYXRjaC5QYXRjaFR5cGUuVU5JRklFRCkgeworICAgIGlmIChwYXRjaFR5cGUgPT0gUGF0Y2hTY3JlZW4uVHlwZS5TSURFX0JZX1NJREUpIHsKICAgICAgIGxpbmsgPSBuZXcgUGF0Y2hMaW5rLlNpZGVCeVNpZGUoIiIsIGJhc2UsIHRoaXNLZXksIGluZGV4LCBkZXRhaWwsIHRoaXMpOwogICAgIH0gZWxzZSB7CiAgICAgICBsaW5rID0gbmV3IFBhdGNoTGluay5VbmlmaWVkKCIiLCBiYXNlLCB0aGlzS2V5LCBpbmRleCwgZGV0YWlsLCB0aGlzKTsKQEAgLTI5MywxMCArMjk1LDYgQEAKICAgICByZXR1cm4gbGlzdGVuYWJsZVByZWZzOwogICB9CiAKLSAgcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZXMoTGlzdGVuYWJsZUFjY291bnREaWZmUHJlZmVyZW5jZSBwcmVmcykgewotICAgIGxpc3RlbmFibGVQcmVmcyA9IHByZWZzOwotICB9Ci0KICAgcHJpdmF0ZSBjbGFzcyBNeVRhYmxlIGV4dGVuZHMgTmF2aWdhdGlvblRhYmxlPFBhdGNoPiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfUEFUSCA9IDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENfRFJBRlQgPSAzOwpAQCAtMzk0LDEzICszOTIsOSBAQAogICAgICAgc2V0Um93SXRlbShyb3csIHBhdGNoKTsKIAogICAgICAgV2lkZ2V0IG5hbWVDb2w7Ci0gICAgICBpZiAocGF0Y2guZ2V0UGF0Y2hUeXBlKCkgPT0gUGF0Y2guUGF0Y2hUeXBlLlVOSUZJRUQpIHsKLSAgICAgICAgbmFtZUNvbCA9IG5ldyBQYXRjaExpbmsuU2lkZUJ5U2lkZShnZXREaXNwbGF5RmlsZU5hbWUocGF0Y2gpLCBiYXNlLAotICAgICAgICAgICAgcGF0Y2guZ2V0S2V5KCksIHJvdyAtIDEsIGRldGFpbCwgUGF0Y2hUYWJsZS50aGlzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG5hbWVDb2wgPSBuZXcgUGF0Y2hMaW5rLlVuaWZpZWQoZ2V0RGlzcGxheUZpbGVOYW1lKHBhdGNoKSwgYmFzZSwKLSAgICAgICAgICAgIHBhdGNoLmdldEtleSgpLCByb3cgLSAxLCBkZXRhaWwsIFBhdGNoVGFibGUudGhpcyk7Ci0gICAgICB9CisgICAgICBuYW1lQ29sID0gbmV3IFBhdGNoTGluay5TaWRlQnlTaWRlKGdldERpc3BsYXlGaWxlTmFtZShwYXRjaCksIGJhc2UsCisgICAgICAgICAgcGF0Y2guZ2V0S2V5KCksIHJvdyAtIDEsIGRldGFpbCwgUGF0Y2hUYWJsZS50aGlzKTsKKwogICAgICAgaWYgKHBhdGNoLmdldFNvdXJjZUZpbGVOYW1lKCkgIT0gbnVsbCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dDsKICAgICAgICAgaWYgKHBhdGNoLmdldENoYW5nZVR5cGUoKSA9PSBQYXRjaC5DaGFuZ2VUeXBlLlJFTkFNRUQpIHsKQEAgLTQyMCwxOCArNDE0LDQzIEBACiAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX1BBVEgsIG5hbWVDb2wpOwogCiAgICAgICBpbnQgQ19VTklGSUVEID0gQ19TSURFQllTSURFICsgMTsKLSAgICAgIGlmIChwYXRjaC5nZXRQYXRjaFR5cGUoKSA9PSBQYXRjaC5QYXRjaFR5cGUuVU5JRklFRCkgewotICAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX1NJREVCWVNJREUsIG5ldyBQYXRjaExpbmsuU2lkZUJ5U2lkZSgKLSAgICAgICAgICAgIFV0aWwuQy5wYXRjaFRhYmxlRGlmZlNpZGVCeVNpZGUoKSwgYmFzZSwgcGF0Y2guZ2V0S2V5KCksIHJvdyAtIDEsCi0gICAgICAgICAgICBkZXRhaWwsIFBhdGNoVGFibGUudGhpcykpOwotICAgICAgfSBlbHNlIGlmIChwYXRjaC5nZXRQYXRjaFR5cGUoKSA9PSBQYXRjaC5QYXRjaFR5cGUuQklOQVJZKSB7Ci0gICAgICAgIENfVU5JRklFRCA9IENfU0lERUJZU0lERSArIDI7Ci0gICAgICB9CisgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX1NJREVCWVNJREUsIG5ldyBQYXRjaExpbmsuU2lkZUJ5U2lkZSgKKyAgICAgICAgICBVdGlsLkMucGF0Y2hUYWJsZURpZmZTaWRlQnlTaWRlKCksIGJhc2UsIHBhdGNoLmdldEtleSgpLCByb3cgLSAxLAorICAgICAgICAgIGRldGFpbCwgUGF0Y2hUYWJsZS50aGlzKSk7CiAgICAgICB0YWJsZS5zZXRXaWRnZXQocm93LCBDX1VOSUZJRUQsIG5ldyBQYXRjaExpbmsuVW5pZmllZCgKICAgICAgICAgICBVdGlsLkMucGF0Y2hUYWJsZURpZmZVbmlmaWVkKCksIGJhc2UsIHBhdGNoLmdldEtleSgpLCByb3cgLSAxLAogICAgICAgICAgIGRldGFpbCwgUGF0Y2hUYWJsZS50aGlzKSk7CiAgICAgfQogCisgICAgdm9pZCBpbml0aWFsaXplTGFzdFJvdyhpbnQgcm93KSB7CisgICAgICBBbmNob3Igc2lkZUJ5U2lkZSA9IG5ldyBBbmNob3IoVXRpbC5DLmRpZmZBbGxTaWRlQnlTaWRlKCkpOworICAgICAgc2lkZUJ5U2lkZS5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICAgIGZvciAoUGF0Y2ggcCA6IGRldGFpbC5nZXRQYXRjaGVzKCkpIHsKKyAgICAgICAgICAgIG9wZW5XaW5kb3coRGlzcGF0Y2hlci50b1BhdGNoU2lkZUJ5U2lkZShiYXNlLCBwLmdldEtleSgpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfU0lERUJZU0lERSAtIDIsIHNpZGVCeVNpZGUpOworCisgICAgICBpbnQgQ19VTklGSUVEID0gQ19TSURFQllTSURFIC0gMiArIDE7CisgICAgICBBbmNob3IgdW5pZmllZCA9IG5ldyBBbmNob3IoVXRpbC5DLmRpZmZBbGxVbmlmaWVkKCkpOworICAgICAgdW5pZmllZC5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgICAgICAgZm9yIChQYXRjaCBwIDogZGV0YWlsLmdldFBhdGNoZXMoKSkgeworICAgICAgICAgICAgb3BlbldpbmRvdyhEaXNwYXRjaGVyLnRvUGF0Y2hVbmlmaWVkKGJhc2UsIHAuZ2V0S2V5KCkpKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9KTsKKyAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIENfVU5JRklFRCwgdW5pZmllZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coU3RyaW5nIHRva2VuKSB7CisgICAgICBTdHJpbmcgdXJsID0gV2luZG93LkxvY2F0aW9uLmdldFBhdGgoKSArICIjIiArIHRva2VuOworICAgICAgV2luZG93Lm9wZW4odXJsLCAiX2JsYW5rIiwgbnVsbCk7CisgICAgfQorCiAgICAgdm9pZCBhcHBlbmRIZWFkZXIoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0pIHsKICAgICAgIG0ub3BlblRyKCk7CiAKQEAgLTUzMCw0OSArNTQ5LDkgQEAKICAgICAgIGFwcGVuZFNpemUobSwgcCk7CiAgICAgICBtLmNsb3NlVGQoKTsKIAotICAgICAgc3dpdGNoIChwLmdldFBhdGNoVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgVU5JRklFRDoKLSAgICAgICAgICBvcGVubGluayhtLCAyKTsKLSAgICAgICAgICBtLmNsb3NlVGQoKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJJTkFSWTogewotICAgICAgICAgIFN0cmluZyBiYXNlID0gR1dULmdldEhvc3RQYWdlQmFzZVVSTCgpOwotICAgICAgICAgIGJhc2UgKz0gImNhdC8iICsgS2V5VXRpbC5lbmNvZGUocC5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICBzd2l0Y2ggKHAuZ2V0Q2hhbmdlVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIERFTEVURUQ6Ci0gICAgICAgICAgICBjYXNlIE1PRElGSUVEOgotICAgICAgICAgICAgICBvcGVubGluayhtLCAxKTsKLSAgICAgICAgICAgICAgbS5vcGVuQW5jaG9yKCk7Ci0gICAgICAgICAgICAgIG0uc2V0QXR0cmlidXRlKCJocmVmIiwgYmFzZSArICJeMSIpOwotICAgICAgICAgICAgICBtLmFwcGVuZChVdGlsLkMucGF0Y2hUYWJsZURvd25sb2FkUHJlSW1hZ2UoKSk7Ci0gICAgICAgICAgICAgIGNsb3NlbGluayhtKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBlbXB0eWNlbGwobSwgMSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBzd2l0Y2ggKHAuZ2V0Q2hhbmdlVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIE1PRElGSUVEOgotICAgICAgICAgICAgY2FzZSBBRERFRDoKLSAgICAgICAgICAgICAgb3BlbmxpbmsobSwgMSk7Ci0gICAgICAgICAgICAgIG0ub3BlbkFuY2hvcigpOwotICAgICAgICAgICAgICBtLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGJhc2UgKyAiXjAiKTsKLSAgICAgICAgICAgICAgbS5hcHBlbmQoVXRpbC5DLnBhdGNoVGFibGVEb3dubG9hZFBvc3RJbWFnZSgpKTsKLSAgICAgICAgICAgICAgY2xvc2VsaW5rKG0pOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGVtcHR5Y2VsbChtLCAxKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBlbXB0eWNlbGwobSwgMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KKyAgICAgIC8vIERpZmYKKyAgICAgIG9wZW5saW5rKG0sIDIpOworICAgICAgbS5jbG9zZVRkKCk7CiAgICAgICBvcGVubGluayhtLCAxKTsKICAgICAgIG0uY2xvc2VUZCgpOwogCkBAIC01OTEsNyArNTcwLDcgQEAKICAgICAgIG0uY2xvc2VUcigpOwogICAgIH0KIAotICAgIHZvaWQgYXBwZW5kVG90YWxzKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtLCBpbnQgaW5zLCBpbnQgZGVscywKKyAgICB2b2lkIGFwcGVuZExhc3RSb3coZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0sIGludCBpbnMsIGludCBkZWxzLAogICAgICAgICBmaW5hbCBib29sZWFuIGlzUmV2ZXJzZURpZmYpIHsKICAgICAgIG0ub3BlblRyKCk7CiAKQEAgLTYxNyw2ICs1OTYsMTIgQEAKICAgICAgIG0uYXBwZW5kKFV0aWwuTS5wYXRjaFRhYmxlU2l6ZV9Nb2RpZnkoaW5zLCBkZWxzKSk7CiAgICAgICBtLmNsb3NlVGQoKTsKIAorICAgICAgb3BlbmxpbmsobSwgMik7CisgICAgICBtLmNsb3NlVGQoKTsKKworICAgICAgb3BlbmxpbmsobSwgMSk7CisgICAgICBtLmNsb3NlVGQoKTsKKwogICAgICAgbS5jbG9zZVRyKCk7CiAgICAgfQogCkBAIC02NDksMTQgKzYzNCwxOSBAQAogICAgICAgICAgIGNhc2UgQURERUQ6CiAgICAgICAgICAgICBtLmFwcGVuZChVdGlsLk0ucGF0Y2hUYWJsZVNpemVfTGluZXMoaW5zKSk7CiAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgIGNhc2UgREVMRVRFRDoKICAgICAgICAgICAgIG0ubmJzcCgpOwogICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICBjYXNlIE1PRElGSUVEOgogICAgICAgICAgIGNhc2UgQ09QSUVEOgogICAgICAgICAgIGNhc2UgUkVOQU1FRDoKICAgICAgICAgICAgIG0uYXBwZW5kKFV0aWwuTS5wYXRjaFRhYmxlU2l6ZV9Nb2RpZnkoaW5zLCBkZWxzKSk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgUkVXUklURToKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICBtLm5ic3AoKTsKQEAgLTY3MCwyMCArNjYwLDYgQEAKICAgICAgIG0uc2V0QXR0cmlidXRlKCJjb2xzcGFuIiwgY29sc3Bhbik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNsb3NlbGluayhmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgewotICAgICAgbS5jbG9zZUFuY2hvcigpOwotICAgICAgbS5jbG9zZVRkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVtcHR5Y2VsbChmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSwgZmluYWwgaW50IGNvbHNwYW4pIHsKLSAgICAgIG0ub3BlblRkKCk7Ci0gICAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFDZWxsKCkpOwotICAgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmTGlua0NlbGwoKSk7Ci0gICAgICBtLnNldEF0dHJpYnV0ZSgiY29sc3BhbiIsIGNvbHNwYW4pOwotICAgICAgbS5uYnNwKCk7Ci0gICAgICBtLmNsb3NlVGQoKTsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJvd0l0ZW1LZXkoZmluYWwgUGF0Y2ggaXRlbSkgewogICAgICAgcmV0dXJuIGl0ZW0uZ2V0S2V5KCk7CkBAIC03ODcsOCArNzYzLDkgQEAKICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIHRhYmxlLmFwcGVuZFRvdGFscyhuYywgaW5zZXJ0aW9ucywgZGVsZXRpb25zLCBpc1JldmVyc2VEaWZmKTsKKyAgICAgICAgICB0YWJsZS5hcHBlbmRMYXN0Um93KG5jLCBpbnNlcnRpb25zLCBkZWxldGlvbnMsIGlzUmV2ZXJzZURpZmYpOwogICAgICAgICAgIHRhYmxlLnJlc2V0SHRtbChuYyk7CisgICAgICAgICAgdGFibGUuaW5pdGlhbGl6ZUxhc3RSb3cocm93ICsgMSk7CiAgICAgICAgICAgbmMgPSBudWxsOwogICAgICAgICAgIHN0YWdlID0gMTsKICAgICAgICAgICByb3cgPSAwOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUHJvamVjdERhc2hib2FyZFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUHJvamVjdERhc2hib2FyZFNjcmVlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OWU4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9Qcm9qZWN0RGFzaGJvYXJkU2NyZWVuLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWRtaW4uUHJvamVjdFNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxvd1BhbmVsOworCitwdWJsaWMgY2xhc3MgUHJvamVjdERhc2hib2FyZFNjcmVlbiBleHRlbmRzIFByb2plY3RTY3JlZW4gaW1wbGVtZW50cyBDaGFuZ2VMaXN0U2NyZWVuIHsKKyAgcHJpdmF0ZSBEYXNoYm9hcmRUYWJsZSB0YWJsZTsKKyAgcHJpdmF0ZSBTdHJpbmcgcGFyYW1zOworCisgIHB1YmxpYyBQcm9qZWN0RGFzaGJvYXJkU2NyZWVuKGZpbmFsIFByb2plY3QuTmFtZUtleSB0b1Nob3csIFN0cmluZyBwYXJhbXMpIHsKKyAgICBzdXBlcih0b1Nob3cpOworICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIG9uSW5pdFVJKCkgeworICAgIHRhYmxlID0gbmV3IERhc2hib2FyZFRhYmxlKHBhcmFtcykgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxvYWQoKSB7CisgICAgICAgIHN1cGVyLm9uTG9hZCgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGZpbmlzaERpc3BsYXkoKSB7CisgICAgICAgIHN1cGVyLmZpbmlzaERpc3BsYXkoKTsKKyAgICAgICAgZGlzcGxheSgpOworICAgICAgfQorICAgIH07CisKKyAgICBzdXBlci5vbkluaXRVSSgpOworCisgICAgU3RyaW5nIHRpdGxlID0gdGFibGUuZ2V0VGl0bGUoKTsKKyAgICBpZiAodGl0bGUgIT0gbnVsbCkgeworICAgICAgRmxvd1BhbmVsIGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgICAgZnAuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuc2NyZWVuSGVhZGVyKCkpOworICAgICAgZnAuYWRkKG5ldyBJbmxpbmVIeXBlcmxpbmsodGl0bGUsIFBhZ2VMaW5rcy50b0N1c3RvbURhc2hib2FyZChwYXJhbXMpKSk7CisgICAgICBhZGQoZnApOworICAgIH0KKworICAgIGFkZCh0YWJsZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgcmVnaXN0ZXJLZXlzKCkgeworICAgIHN1cGVyLnJlZ2lzdGVyS2V5cygpOworICAgIHRhYmxlLnNldFJlZ2lzdGVyS2V5cyh0cnVlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUHVibGlzaENvbW1lbnRTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1B1Ymxpc2hDb21tZW50U2NyZWVuLmphdmEKaW5kZXggNDcwNWFhZC4uOTc5NDllMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUHVibGlzaENvbW1lbnRTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9QdWJsaXNoQ29tbWVudFNjcmVlbi5qYXZhCkBAIC0xNSwyOSArMTUsMzEgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUluZm8uQXBwcm92YWxJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLkNoYW5nZUluZm8uTGFiZWxJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLkFic3RyYWN0UGF0Y2hDb250ZW50VGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuQ29tbWVudEVkaXRvckNvbnRhaW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlcy5Db21tZW50RWRpdG9yUGFuZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuUGF0Y2hVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuQ2FsbGJhY2tHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5TY3JlZW5Mb2FkQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkFjY291bnRTY3JlZW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkNvbW1lbnRMaW5rUHJvY2Vzc29yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5QYXRjaExpbms7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNtYWxsSGVhZGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaFNldFB1Ymxpc2hEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheVN0cmluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Gb3JtUGFuZWw7CkBAIC00NywxMyArNDksMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WZXJ0aWNhbFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLldpZGdldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuTnBUZXh0QXJlYTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtNjIsNiArNjUsNyBAQAogICBwcml2YXRlIHN0YXRpYyBTYXZlZFN0YXRlIGxhc3RTdGF0ZTsKIAogICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7CisgIHByaXZhdGUgU3RyaW5nIHJldmlzaW9uOwogICBwcml2YXRlIENvbGxlY3Rpb248VmFsdWVSYWRpb0J1dHRvbj4gYXBwcm92YWxCdXR0b25zOwogICBwcml2YXRlIENoYW5nZURlc2NyaXB0aW9uQmxvY2sgZGVzY0Jsb2NrOwogICBwcml2YXRlIEFwcHJvdmFsVGFibGUgYXBwcm92YWxzOwpAQCAtNzMsNiArNzcsNyBAQAogICBwcml2YXRlIEJ1dHRvbiBjYW5jZWw7CiAgIHByaXZhdGUgYm9vbGVhbiBzYXZlU3RhdGVPblVubG9hZCA9IHRydWU7CiAgIHByaXZhdGUgTGlzdDxDb21tZW50RWRpdG9yUGFuZWw+IGNvbW1lbnRFZGl0b3JzOworICBwcml2YXRlIENoYW5nZUluZm8gY2hhbmdlOwogCiAgIHB1YmxpYyBQdWJsaXNoQ29tbWVudFNjcmVlbihmaW5hbCBQYXRjaFNldC5JZCBwc2kpIHsKICAgICBwYXRjaFNldElkID0gcHNpOwpAQCAtMTQxLDcgKzE0NiwyMiBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25Mb2FkKCkgewogICAgIHN1cGVyLm9uTG9hZCgpOwotICAgIFV0aWwuREVUQUlMX1NWQy5wYXRjaFNldFB1Ymxpc2hEZXRhaWwocGF0Y2hTZXRJZCwKKworICAgIENhbGxiYWNrR3JvdXAgY2JzID0gbmV3IENhbGxiYWNrR3JvdXAoKTsKKyAgICBDaGFuZ2VBcGkucmV2aXNpb24ocGF0Y2hTZXRJZCkudmlldygicmV2aWV3IikuZ2V0KGNicy5hZGQoCisgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPENoYW5nZUluZm8+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhDaGFuZ2VJbmZvIHJlc3VsdCkgeworICAgICAgICAgICAgcmVzdWx0LmluaXQoKTsKKyAgICAgICAgICAgIGNoYW5nZSA9IHJlc3VsdDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgLy8gSGFuZGxlZCBieSBTY3JlZW5Mb2FkQ2FsbGJhY2sub25GYWlsdXJlKCkuCisgICAgICAgICAgfQorICAgICAgICB9KSk7CisgICAgVXRpbC5ERVRBSUxfU1ZDLnBhdGNoU2V0UHVibGlzaERldGFpbChwYXRjaFNldElkLCBjYnMuYWRkR3d0anNvbnJwYygKICAgICAgICAgbmV3IFNjcmVlbkxvYWRDYWxsYmFjazxQYXRjaFNldFB1Ymxpc2hEZXRhaWw+KHRoaXMpIHsKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcmVEaXNwbGF5KGZpbmFsIFBhdGNoU2V0UHVibGlzaERldGFpbCByZXN1bHQpIHsKQEAgLTE1Myw3ICsxNzMsNyBAQAogICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHBvc3REaXNwbGF5KCkgewogICAgICAgICAgICAgbWVzc2FnZS5zZXRGb2N1cyh0cnVlKTsKICAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICB9KSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTIyMiw0NyArMjQyLDUzIEBACiAgICAgbXdyYXAuYWRkKG1lc3NhZ2UpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGluaXRBcHByb3ZhbHMoZmluYWwgUGF0Y2hTZXRQdWJsaXNoRGV0YWlsIHIsIGZpbmFsIFBhbmVsIGJvZHkpIHsKLSAgICBBcHByb3ZhbFR5cGVzIHR5cGVzID0gR2Vycml0LmdldENvbmZpZygpLmdldEFwcHJvdmFsVHlwZXMoKTsKLSAgICBmb3IgKFBlcm1pc3Npb25SYW5nZSByYW5nZSA6IHIuZ2V0TGFiZWxzKCkpIHsKLSAgICAgIEFwcHJvdmFsVHlwZSB0eXBlID0gdHlwZXMuYnlMYWJlbChyYW5nZS5nZXRMYWJlbCgpKTsKLSAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgLy8gTGVnYWN5IHR5cGUsIHVzZSByYWRpbyBidXR0b25zLgotICAgICAgICBpbml0QXBwcm92YWxUeXBlKHIsIGJvZHksIHR5cGUsIHJhbmdlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRPRE8gTmV3ZXIgc3R5bGUgbGFiZWwuCi0gICAgICB9CisgIHByaXZhdGUgdm9pZCBpbml0QXBwcm92YWxzKFBhbmVsIGJvZHkpIHsKKyAgICBmb3IgKFN0cmluZyBsYWJlbE5hbWUgOiBjaGFuZ2UubGFiZWxzKCkpIHsKKyAgICAgIGluaXRMYWJlbChsYWJlbE5hbWUsIGJvZHkpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBpbml0QXBwcm92YWxUeXBlKGZpbmFsIFBhdGNoU2V0UHVibGlzaERldGFpbCByLAotICAgICAgZmluYWwgUGFuZWwgYm9keSwgZmluYWwgQXBwcm92YWxUeXBlIGN0LCBmaW5hbCBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UpIHsKLSAgICBib2R5LmFkZChuZXcgU21hbGxIZWFkaW5nKGN0LmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpICsgIjoiKSk7CisgIHByaXZhdGUgdm9pZCBpbml0TGFiZWwoU3RyaW5nIGxhYmVsTmFtZSwgUGFuZWwgYm9keSkgeworICAgIGlmICghY2hhbmdlLmhhc19wZXJtaXR0ZWRfbGFiZWxzKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgSnNBcnJheVN0cmluZyBuYXRpdmVWYWx1ZXMgPSBjaGFuZ2UucGVybWl0dGVkX3ZhbHVlcyhsYWJlbE5hbWUpOworICAgIGlmIChuYXRpdmVWYWx1ZXMgPT0gbnVsbCB8fCBuYXRpdmVWYWx1ZXMubGVuZ3RoKCkgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KG5hdGl2ZVZhbHVlcy5sZW5ndGgoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYXRpdmVWYWx1ZXMubGVuZ3RoKCk7IGkrKykgeworICAgICAgdmFsdWVzLmFkZChuYXRpdmVWYWx1ZXMuZ2V0KGkpKTsKKyAgICB9CisgICAgQ29sbGVjdGlvbnMucmV2ZXJzZSh2YWx1ZXMpOworICAgIExhYmVsSW5mbyBsYWJlbCA9IGNoYW5nZS5sYWJlbChsYWJlbE5hbWUpOwogCi0gICAgZmluYWwgVmVydGljYWxQYW5lbCB2cCA9IG5ldyBWZXJ0aWNhbFBhbmVsKCk7Ci0gICAgdnAuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuYXBwcm92YWxDYXRlZ29yeUxpc3QoKSk7Ci0gICAgZmluYWwgTGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+IGxzdCA9Ci0gICAgICAgIG5ldyBBcnJheUxpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPihjdC5nZXRWYWx1ZXMoKSk7Ci0gICAgQ29sbGVjdGlvbnMucmV2ZXJzZShsc3QpOwotICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0SWQgPSBjdC5nZXRDYXRlZ29yeSgpLmdldElkKCk7Ci0gICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBwcmlvciA9IHIuZ2V0Q2hhbmdlQXBwcm92YWwoY2F0SWQpOworICAgIGJvZHkuYWRkKG5ldyBTbWFsbEhlYWRpbmcobGFiZWwubmFtZSgpICsgIjoiKSk7CiAKLSAgICBmb3IgKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSBidXR0b25WYWx1ZSA6IGxzdCkgewotICAgICAgaWYgKCFyYW5nZS5jb250YWlucyhidXR0b25WYWx1ZS5nZXRWYWx1ZSgpKSkgewotICAgICAgICBjb250aW51ZTsKKyAgICBWZXJ0aWNhbFBhbmVsIHZwID0gbmV3IFZlcnRpY2FsUGFuZWwoKTsKKyAgICB2cC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5sYWJlbExpc3QoKSk7CisKKyAgICBTaG9ydCBwcmlvciA9IG51bGw7CisgICAgaWYgKGxhYmVsLmFsbCgpICE9IG51bGwpIHsKKyAgICAgIGZvciAoQXBwcm92YWxJbmZvIGFwcCA6IE5hdGl2ZXMuYXNMaXN0KGxhYmVsLmFsbCgpKSkgeworICAgICAgICBpZiAoYXBwLl9hY2NvdW50X2lkKCkgPT0gR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0SWQoKS5nZXQoKSkgeworICAgICAgICAgIHByaW9yID0gYXBwLnZhbHVlKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KKyAgICB9CiAKLSAgICAgIGZpbmFsIFZhbHVlUmFkaW9CdXR0b24gYiA9Ci0gICAgICAgICAgbmV3IFZhbHVlUmFkaW9CdXR0b24oYnV0dG9uVmFsdWUsIGN0LmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpKTsKLSAgICAgIGIuc2V0VGV4dChidXR0b25WYWx1ZS5mb3JtYXQoKSk7CisgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgIFZhbHVlUmFkaW9CdXR0b24gYiA9IG5ldyBWYWx1ZVJhZGlvQnV0dG9uKGxhYmVsLCB2YWx1ZSk7CisgICAgICBTYWZlSHRtbCBidWYgPSBuZXcgU2FmZUh0bWxCdWlsZGVyKCkuYXBwZW5kKGIuZm9ybWF0KCkpOworICAgICAgYnVmID0gQ29tbWVudExpbmtQcm9jZXNzb3IuYXBwbHkoYnVmKTsKKyAgICAgIFNhZmVIdG1sLnNldChiLCBidWYpOwogCiAgICAgICBpZiAobGFzdFN0YXRlICE9IG51bGwgJiYgcGF0Y2hTZXRJZC5lcXVhbHMobGFzdFN0YXRlLnBhdGNoU2V0SWQpCi0gICAgICAgICAgJiYgbGFzdFN0YXRlLmFwcHJvdmFscy5jb250YWluc0tleShidXR0b25WYWx1ZS5nZXRDYXRlZ29yeUlkKCkpKSB7Ci0gICAgICAgIGIuc2V0VmFsdWUobGFzdFN0YXRlLmFwcHJvdmFscy5nZXQoYnV0dG9uVmFsdWUuZ2V0Q2F0ZWdvcnlJZCgpKS5lcXVhbHMoCi0gICAgICAgICAgICBidXR0b25WYWx1ZSkpOworICAgICAgICAgICYmIGxhc3RTdGF0ZS5hcHByb3ZhbHMuY29udGFpbnNLZXkobGFiZWwubmFtZSgpKSkgeworICAgICAgICBiLnNldFZhbHVlKGxhc3RTdGF0ZS5hcHByb3ZhbHMuZ2V0KGxhYmVsLm5hbWUoKSkgPT0gdmFsdWUpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgYi5zZXRWYWx1ZShwcmlvciAhPSBudWxsID8gYnV0dG9uVmFsdWUuZ2V0VmFsdWUoKSA9PSBwcmlvci5nZXRWYWx1ZSgpCi0gICAgICAgICAgICA6IGJ1dHRvblZhbHVlLmdldFZhbHVlKCkgPT0gMCk7CisgICAgICAgIGIuc2V0VmFsdWUoYi5wYXJzZVZhbHVlKCkgPT0gKHByaW9yICE9IG51bGwgPyBwcmlvciA6IDApKTsKICAgICAgIH0KIAogICAgICAgYXBwcm92YWxCdXR0b25zLmFkZChiKTsKQEAgLTI3NCwxMyArMzAwLDEyIEBACiAgIHByaXZhdGUgdm9pZCBkaXNwbGF5KGZpbmFsIFBhdGNoU2V0UHVibGlzaERldGFpbCByKSB7CiAgICAgc2V0UGFnZVRpdGxlKFV0aWwuTS5wdWJsaXNoQ29tbWVudHMoci5nZXRDaGFuZ2UoKS5nZXRLZXkoKS5hYmJyZXZpYXRlKCksCiAgICAgICAgIHBhdGNoU2V0SWQuZ2V0KCkpKTsKLSAgICBkZXNjQmxvY2suZGlzcGxheShyLmdldENoYW5nZSgpLCBudWxsLCByLmdldFBhdGNoU2V0SW5mbygpLCByLmdldEFjY291bnRzKCkpOworICAgIGRlc2NCbG9jay5kaXNwbGF5KHIuZ2V0Q2hhbmdlKCksIG51bGwsIGZhbHNlLCByLmdldFBhdGNoU2V0SW5mbygpLCByLmdldEFjY291bnRzKCksCisgICAgICAgIHIuZ2V0U3VibWl0VHlwZVJlY29yZCgpKTsKIAogICAgIGlmIChyLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpKSB7Ci0gICAgICBpbml0QXBwcm92YWxzKHIsIGFwcHJvdmFsUGFuZWwpOwotCi0gICAgICBhcHByb3ZhbHMuc2V0QWNjb3VudEluZm9DYWNoZShyLmdldEFjY291bnRzKCkpOwotICAgICAgYXBwcm92YWxzLmRpc3BsYXkocik7CisgICAgICBpbml0QXBwcm92YWxzKGFwcHJvdmFsUGFuZWwpOworICAgICAgYXBwcm92YWxzLmRpc3BsYXkoY2hhbmdlKTsKICAgICB9IGVsc2UgewogICAgICAgYXBwcm92YWxzLnNldFZpc2libGUoZmFsc2UpOwogICAgIH0KQEAgLTI5MSw2ICszMTYsNyBAQAogCiAgICAgZHJhZnRzUGFuZWwuY2xlYXIoKTsKICAgICBjb21tZW50RWRpdG9ycyA9IG5ldyBBcnJheUxpc3Q8Q29tbWVudEVkaXRvclBhbmVsPigpOworICAgIHJldmlzaW9uID0gci5nZXRQYXRjaFNldEluZm8oKS5nZXRSZXZJZCgpOwogCiAgICAgaWYgKCFyLmdldERyYWZ0cygpLmlzRW1wdHkoKSkgewogICAgICAgZHJhZnRzUGFuZWwuYWRkKG5ldyBTbWFsbEhlYWRpbmcoVXRpbC5DLmhlYWRpbmdQYXRjaENvbW1lbnRzKCkpKTsKQEAgLTMxMiw3ICszMzgsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIENvbW1lbnRFZGl0b3JQYW5lbCBlZGl0b3IgPSBuZXcgQ29tbWVudEVkaXRvclBhbmVsKGMpOwotICAgICAgICBlZGl0b3Iuc2V0QXV0aG9yTmFtZVRleHQoVXRpbC5NLmxpbmVIZWFkZXIoYy5nZXRMaW5lKCkpKTsKKyAgICAgICAgaWYgKGMuZ2V0TGluZSgpID09IEFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuUl9IRUFEKSB7CisgICAgICAgICAgZWRpdG9yLnNldEF1dGhvck5hbWVUZXh0KFV0aWwuQy5maWxlQ29tbWVudEhlYWRlcigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlZGl0b3Iuc2V0QXV0aG9yTmFtZVRleHQoVXRpbC5NLmxpbmVIZWFkZXIoYy5nZXRMaW5lKCkpKTsKKyAgICAgICAgfQogICAgICAgICBlZGl0b3Iuc2V0T3Blbih0cnVlKTsKICAgICAgICAgY29tbWVudEVkaXRvcnMuYWRkKGVkaXRvcik7CiAgICAgICAgIHBhbmVsLmFkZChlZGl0b3IpOwpAQCAtMzQ3LDIwICszNzcsMjMgQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCBvblNlbmQyKGZpbmFsIGJvb2xlYW4gc3VibWl0KSB7Ci0gICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gdmFsdWVzID0KLSAgICAgICAgbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPigpOworICAgIFJldmlld0lucHV0IGRhdGEgPSBSZXZpZXdJbnB1dC5jcmVhdGUoKTsKKyAgICBkYXRhLm1lc3NhZ2UoQ2hhbmdlQXBpLmVtcHR5VG9OdWxsKG1lc3NhZ2UuZ2V0VGV4dCgpLnRyaW0oKSkpOworICAgIGRhdGEuaW5pdCgpOwogICAgIGZvciAoZmluYWwgVmFsdWVSYWRpb0J1dHRvbiBiIDogYXBwcm92YWxCdXR0b25zKSB7CiAgICAgICBpZiAoYi5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgIHZhbHVlcy5wdXQoYi52YWx1ZS5nZXRDYXRlZ29yeUlkKCksIGIudmFsdWUuZ2V0SWQoKSk7CisgICAgICAgIGRhdGEubGFiZWwoYi5sYWJlbC5uYW1lKCksIGIucGFyc2VWYWx1ZSgpKTsKICAgICAgIH0KICAgICB9CiAKICAgICBlbmFibGVGb3JtKGZhbHNlKTsKLSAgICBQYXRjaFV0aWwuREVUQUlMX1NWQy5wdWJsaXNoQ29tbWVudHMocGF0Y2hTZXRJZCwgbWVzc2FnZS5nZXRUZXh0KCkudHJpbSgpLAotICAgICAgICBuZXcgSGFzaFNldDxBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+KHZhbHVlcy52YWx1ZXMoKSksCi0gICAgICAgIG5ldyBHZXJyaXRDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKLSAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgVm9pZFJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgICAgIGlmKHN1Ym1pdCkgeworICAgIG5ldyBSZXN0QXBpKCIvY2hhbmdlcy8iKQorICAgICAgLmlkKFN0cmluZy52YWx1ZU9mKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkuZ2V0KCkpKQorICAgICAgLnZpZXcoInJldmlzaW9ucyIpLmlkKHJldmlzaW9uKS52aWV3KCJyZXZpZXciKQorICAgICAgLnBvc3QoZGF0YSwgbmV3IEdlcnJpdENhbGxiYWNrPFJldmlld0lucHV0PigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoUmV2aWV3SW5wdXQgcmVzdWx0KSB7CisgICAgICAgICAgICBpZiAoc3VibWl0KSB7CiAgICAgICAgICAgICAgIHN1Ym1pdCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgc2F2ZVN0YXRlT25VbmxvYWQgPSBmYWxzZTsKQEAgLTM3NiwxOCArNDA5LDM5IEBACiAgICAgICAgIH0pOwogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmV2aWV3SW5wdXQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgICBzdGF0aWMgUmV2aWV3SW5wdXQgY3JlYXRlKCkgeworICAgICAgcmV0dXJuIChSZXZpZXdJbnB1dCkgY3JlYXRlT2JqZWN0KCk7CisgICAgfQorCisgICAgZmluYWwgbmF0aXZlIHZvaWQgbWVzc2FnZShTdHJpbmcgbSkgLyoteyBpZihtKXRoaXMubWVzc2FnZT1tOyB9LSovOworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIGxhYmVsKFN0cmluZyBuLCBzaG9ydCB2KSAvKi17IHRoaXMubGFiZWxzW25dPXY7IH0tKi87CisgICAgZmluYWwgbmF0aXZlIHZvaWQgaW5pdCgpIC8qLXsKKyAgICAgIHRoaXMubGFiZWxzID0ge307CisgICAgICB0aGlzLnN0cmljdF9sYWJlbHMgPSB0cnVlOworICAgICAgdGhpcy5kcmFmdHMgPSAnUFVCTElTSCc7CisgICAgfS0qLzsKKworICAgIHByb3RlY3RlZCBSZXZpZXdJbnB1dCgpIHsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHZvaWQgc3VibWl0KCkgewotICAgIFV0aWwuTUFOQUdFX1NWQy5zdWJtaXQocGF0Y2hTZXRJZCwKLSAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPENoYW5nZURldGFpbD4oKSB7Ci0gICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKENoYW5nZURldGFpbCByZXN1bHQpIHsKKyAgICBDaGFuZ2VBcGkuc3VibWl0KHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkuZ2V0KCksIHJldmlzaW9uLAorICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFN1Ym1pdEluZm8+KCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhTdWJtaXRJbmZvIHJlc3VsdCkgewogICAgICAgICAgICAgc2F2ZVN0YXRlT25VbmxvYWQgPSBmYWxzZTsKICAgICAgICAgICAgIGdvQ2hhbmdlKCk7CiAgICAgICAgICAgfQogCiAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGVycikgeworICAgICAgICAgICAgaWYgKFN1Ym1pdEZhaWx1cmVEaWFsb2cuaXNDb25mbGljdChlcnIpKSB7CisgICAgICAgICAgICAgIG5ldyBTdWJtaXRGYWlsdXJlRGlhbG9nKGVyci5nZXRNZXNzYWdlKCkpLmNlbnRlcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGVycik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBnb0NoYW5nZSgpOwotICAgICAgICAgICAgc3VwZXIub25GYWlsdXJlKGNhdWdodCk7CiAgICAgICAgICAgfQogICAgICAgICB9KTsKICAgfQpAQCAtMzk4LDI2ICs0NTIsNDEgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbHVlUmFkaW9CdXR0b24gZXh0ZW5kcyBSYWRpb0J1dHRvbiB7Ci0gICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIHZhbHVlOworICAgIGZpbmFsIExhYmVsSW5mbyBsYWJlbDsKKyAgICBmaW5hbCBTdHJpbmcgdmFsdWU7CiAKLSAgICBWYWx1ZVJhZGlvQnV0dG9uKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB2LCBmaW5hbCBTdHJpbmcgbGFiZWwpIHsKLSAgICAgIHN1cGVyKGxhYmVsKTsKLSAgICAgIHZhbHVlID0gdjsKKyAgICBWYWx1ZVJhZGlvQnV0dG9uKExhYmVsSW5mbyBsYWJlbCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICBzdXBlcihsYWJlbC5uYW1lKCkpOworICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIFN0cmluZyBmb3JtYXQoKSB7CisgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQodmFsdWUpLmFwcGVuZCgnICcpCisgICAgICAgICAgLmFwcGVuZChsYWJlbC52YWx1ZV90ZXh0KHZhbHVlKSkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBzaG9ydCBwYXJzZVZhbHVlKCkgeworICAgICAgU3RyaW5nIHZhbHVlID0gdGhpcy52YWx1ZTsKKyAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCIgIikgfHwgdmFsdWUuc3RhcnRzV2l0aCgiKyIpKSB7CisgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpOworICAgICAgfQorICAgICAgcmV0dXJuIFNob3J0LnBhcnNlU2hvcnQodmFsdWUpOwogICAgIH0KICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNhdmVkU3RhdGUgewogICAgIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7CiAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gYXBwcm92YWxzOworICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXBwcm92YWxzOwogCiAgICAgU2F2ZWRTdGF0ZShmaW5hbCBQdWJsaXNoQ29tbWVudFNjcmVlbiBwKSB7CiAgICAgICBwYXRjaFNldElkID0gcC5wYXRjaFNldElkOwogICAgICAgbWVzc2FnZSA9IHAubWVzc2FnZS5nZXRUZXh0KCk7Ci0gICAgICBhcHByb3ZhbHMgPSBuZXcgSGFzaE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbENhdGVnb3J5VmFsdWU+KCk7CisgICAgICBhcHByb3ZhbHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKICAgICAgIGZvciAoZmluYWwgVmFsdWVSYWRpb0J1dHRvbiBiIDogcC5hcHByb3ZhbEJ1dHRvbnMpIHsKICAgICAgICAgaWYgKGIuZ2V0VmFsdWUoKSkgewotICAgICAgICAgIGFwcHJvdmFscy5wdXQoYi52YWx1ZS5nZXRDYXRlZ29yeUlkKCksIGIudmFsdWUpOworICAgICAgICAgIGFwcHJvdmFscy5wdXQoYi5sYWJlbC5uYW1lKCksIGIudmFsdWUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUXVlcnlTY3JlZW4uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1F1ZXJ5U2NyZWVuLmphdmEKaW5kZXggYjk0ZmNhZS4uMDFlMjk0ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvUXVlcnlTY3JlZW4uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9RdWVyeVNjcmVlbi5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiAKIHB1YmxpYyBjbGFzcyBRdWVyeVNjcmVlbiBleHRlbmRzIFBhZ2VkU2luZ2xlTGlzdFNjcmVlbiBpbXBsZW1lbnRzCkBAIC01MiwxMiArNTIsMTEgQEAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIGZpbmFsIHZvaWQgb25TdWNjZXNzKENoYW5nZUxpc3QgcmVzdWx0KSB7CiAgICAgICAgIGlmIChpc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICBpZiAocmVzdWx0LnNpemUoKSA9PSAxICYmIGlzU2luZ2xlUXVlcnkocXVlcnkpKSB7CisgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAxICYmIGlzU2luZ2xlUXVlcnkocXVlcnkpKSB7CiAgICAgICAgICAgICBDaGFuZ2VJbmZvIGMgPSByZXN1bHQuZ2V0KDApOwogICAgICAgICAgICAgQ2hhbmdlLklkIGlkID0gYy5sZWdhY3lfaWQoKTsKICAgICAgICAgICAgIEdlcnJpdC5kaXNwbGF5KFBhZ2VMaW5rcy50b0NoYW5nZShpZCksIG5ldyBDaGFuZ2VTY3JlZW4oaWQpKTsKICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR2Vycml0LnNldFF1ZXJ5U3RyaW5nKHF1ZXJ5KTsKICAgICAgICAgICAgIGRpc3BsYXkocmVzdWx0KTsKICAgICAgICAgICAgIFF1ZXJ5U2NyZWVuLnRoaXMuZGlzcGxheSgpOwogICAgICAgICAgIH0KQEAgLTY3LDYgKzY2LDEyIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TaG93VmlldygpIHsKKyAgICBzdXBlci5vblNob3dWaWV3KCk7CisgICAgR2Vycml0LnNldFF1ZXJ5U3RyaW5nKHF1ZXJ5KTsKKyAgfQorCisgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBsb2FkUHJldigpIHsKICAgICBDaGFuZ2VMaXN0LnByZXYocXVlcnksIHBhZ2VTaXplLCBwb3MsIGxvYWRDYWxsYmFjaygpKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3RhcnJlZENoYW5nZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N0YXJyZWRDaGFuZ2VzLmphdmEKaW5kZXggOGI1YWExYy4uN2QyMDg0YSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3RhcnJlZENoYW5nZXMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdGFycmVkQ2hhbmdlcy5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRCdXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLlNpbXBsZUV2ZW50QnVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnJlc291cmNlcy5jbGllbnQuSW1hZ2VSZXNvdXJjZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuS2V5Q29tbWFuZDsKQEAgLTMyLDcgKzMwLDYgQEAKIAogLyoqIFN1cHBvcnRzIHRoZSBzdGFyIGljb24gZGlzcGxheWVkIG9uIGNoYW5nZXMgYW5kIHRyYWNraW5nIHRoZSBzdGF0dXMuICovCiBwdWJsaWMgY2xhc3MgU3RhcnJlZENoYW5nZXMgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFdmVudEJ1cyBldmVudEJ1cyA9IG5ldyBTaW1wbGVFdmVudEJ1cygpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFdmVudC5UeXBlPENoYW5nZVN0YXJIYW5kbGVyPiBUWVBFID0KICAgICAgIG5ldyBFdmVudC5UeXBlPENoYW5nZVN0YXJIYW5kbGVyPigpOwogCkBAIC04Nyw3ICs4NCw3IEBACiAgIHB1YmxpYyBzdGF0aWMgSGFuZGxlclJlZ2lzdHJhdGlvbiBhZGRIYW5kbGVyKAogICAgICAgQ2hhbmdlLklkIHNvdXJjZSwKICAgICAgIENoYW5nZVN0YXJIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICByZXR1cm4gZXZlbnRCdXMuYWRkSGFuZGxlclRvU291cmNlKFRZUEUsIHNvdXJjZSwgaGFuZGxlcik7CisgICAgcmV0dXJuIEdlcnJpdC5FVkVOVF9CVVMuYWRkSGFuZGxlclRvU291cmNlKFRZUEUsIHNvdXJjZSwgaGFuZGxlcik7CiAgIH0KIAogICAvKioKQEAgLTk1LDcgKzkyLDcgQEAKICAgICogbm90IFJQQyB0byB0aGUgc2VydmVyIGFuZCBkb2VzIG5vdCBhbHRlciB0aGUgc3RhcnJlZCBzdGF0dXMgb2YgYSBjaGFuZ2UuCiAgICAqLwogICBwdWJsaWMgc3RhdGljIHZvaWQgZmlyZUNoYW5nZVN0YXJFdmVudChDaGFuZ2UuSWQgaWQsIGJvb2xlYW4gc3RhcnJlZCkgewotICAgIGV2ZW50QnVzLmZpcmVFdmVudEZyb21Tb3VyY2UoCisgICAgR2Vycml0LkVWRU5UX0JVUy5maXJlRXZlbnRGcm9tU291cmNlKAogICAgICAgICBuZXcgQ2hhbmdlU3RhckV2ZW50KGlkLCBzdGFycmVkKSwKICAgICAgICAgaWQpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdWJtaXRGYWlsdXJlRGlhbG9nLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdWJtaXRGYWlsdXJlRGlhbG9nLmphdmEKaW5kZXggYmVkZmI3NC4uNzBiZjRiNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3VibWl0RmFpbHVyZURpYWxvZy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL1N1Ym1pdEZhaWx1cmVEaWFsb2cuamF2YQpAQCAtMTUsMTMgKzE1LDE3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkVycm9yRGlhbG9nOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNsaWVudC5SZW1vdGVKc29uRXhjZXB0aW9uOwogCiBjbGFzcyBTdWJtaXRGYWlsdXJlRGlhbG9nIGV4dGVuZHMgRXJyb3JEaWFsb2cgewotICBTdWJtaXRGYWlsdXJlRGlhbG9nKGZpbmFsIENoYW5nZURldGFpbCByZXN1bHQsIGZpbmFsIENoYW5nZU1lc3NhZ2UgbXNnKSB7Ci0gICAgc3VwZXIobmV3IFNhZmVIdG1sQnVpbGRlcigpLmFwcGVuZChtc2cuZ2V0TWVzc2FnZSgpLnRyaW0oKSkud2lraWZ5KCkpOworICBzdGF0aWMgYm9vbGVhbiBpc0NvbmZsaWN0KFRocm93YWJsZSBlcnIpIHsKKyAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgorICAgICAgICAmJiA0MDkgPT0gKChSZW1vdGVKc29uRXhjZXB0aW9uKSBlcnIpLmdldENvZGUoKTsKKyAgfQorCisgIFN1Ym1pdEZhaWx1cmVEaWFsb2coU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG5ldyBTYWZlSHRtbEJ1aWxkZXIoKS5hcHBlbmQobXNnLnRyaW0oKSkud2lraWZ5KCkpOwogICAgIHNldFRleHQoVXRpbC5DLnN1Ym1pdEZhaWxlZCgpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3VibWl0SW5mby5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2NoYW5nZXMvU3VibWl0SW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MjA2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvY2hhbmdlcy9TdWJtaXRJbmZvLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworCitjbGFzcyBTdWJtaXRJbmZvIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgIGZpbmFsIENoYW5nZS5TdGF0dXMgc3RhdHVzKCkgeworICAgIHJldHVybiBDaGFuZ2UuU3RhdHVzLnZhbHVlT2Yoc3RhdHVzUmF3KCkpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBuYXRpdmUgU3RyaW5nIHN0YXR1c1JhdygpIC8qLXsgcmV0dXJuIHRoaXMuc3RhdHVzOyB9LSovOworCisgIHByb3RlY3RlZCBTdWJtaXRJbmZvKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRDb25zdGFudHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZENvbnN0YW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMmYwNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkQ29uc3RhbnRzLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kYXNoYm9hcmRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuaTE4bi5jbGllbnQuQ29uc3RhbnRzOworCitwdWJsaWMgaW50ZXJmYWNlIERhc2hib2FyZENvbnN0YW50cyBleHRlbmRzIENvbnN0YW50cyB7CisgIFN0cmluZyBkYXNoYm9hcmROYW1lKCk7CisgIFN0cmluZyBkYXNoYm9hcmRUaXRsZSgpOworICBTdHJpbmcgZGFzaGJvYXJkRGVzY3JpcHRpb24oKTsKKyAgU3RyaW5nIGRhc2hib2FyZEluaGVyaXRlZCgpOworICBTdHJpbmcgZGFzaGJvYXJkSXRlbSgpOworICBTdHJpbmcgZGFzaGJvYXJkRGVmYXVsdFRvb2xUaXAoKTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZENvbnN0YW50cy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkQ29uc3RhbnRzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0ZGU3YwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZENvbnN0YW50cy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNiBAQAorZGFzaGJvYXJkTmFtZSA9IERhc2hib2FyZCBOYW1lCitkYXNoYm9hcmRUaXRsZSA9IERhc2hib2FyZCBUaXRsZQorZGFzaGJvYXJkRGVzY3JpcHRpb24gPSBEYXNoYm9hcmQgRGVzY3JpcHRpb24KK2Rhc2hib2FyZEluaGVyaXRlZCA9IEluaGVyaXRlZCBGcm9tCitkYXNoYm9hcmRJdGVtID0gZGFzaGJvYXJkCitkYXNoYm9hcmREZWZhdWx0VG9vbFRpcCA9IFByb2plY3QgRGVmYXVsdCBEYXNoYm9hcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRJbmZvLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkNzRhYgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZEluZm8uamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OworCitwdWJsaWMgY2xhc3MgRGFzaGJvYXJkSW5mbyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBpZCgpIC8qLXsgcmV0dXJuIHRoaXMuaWQ7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIHRpdGxlKCkgLyoteyByZXR1cm4gdGhpcy50aXRsZTsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgcHJvamVjdCgpIC8qLXsgcmV0dXJuIHRoaXMucHJvamVjdDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgZGVmaW5pbmdQcm9qZWN0KCkgLyoteyByZXR1cm4gdGhpcy5kZWZpbmluZ19wcm9qZWN0OyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyByZWYoKSAvKi17IHJldHVybiB0aGlzLnJlZjsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgcGF0aCgpIC8qLXsgcmV0dXJuIHRoaXMucGF0aDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgZGVzY3JpcHRpb24oKSAvKi17IHJldHVybiB0aGlzLmRlc2NyaXB0aW9uOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyBmb3JlYWNoKCkgLyoteyByZXR1cm4gdGhpcy5mb3JlYWNoOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIFN0cmluZyB1cmwoKSAvKi17IHJldHVybiB0aGlzLnVybDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBib29sZWFuIGlzRGVmYXVsdCgpIC8qLXsgcmV0dXJuIHRoaXNbJ2RlZmF1bHQnXSA/IHRydWUgOiBmYWxzZTsgfS0qLzsKKworICBwcm90ZWN0ZWQgRGFzaGJvYXJkSW5mbygpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkTGlzdC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTBmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9EYXNoYm9hcmRMaXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kYXNoYm9hcmRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuVVJMOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOworCisvKiogUHJvamVjdCBkYXNoYm9hcmRzIGZyb20ge0Bjb2RlIC9wcm9qZWN0cy88bmFtZT4vZGFzaGJvYXJkcy99LiAqLworcHVibGljIGNsYXNzIERhc2hib2FyZExpc3QgZXh0ZW5kcyBKc0FycmF5PERhc2hib2FyZEluZm8+IHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIGFsbChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8SnNBcnJheTxEYXNoYm9hcmRMaXN0Pj4gY2FsbGJhY2spIHsKKyAgICBiYXNlKHByb2plY3QpLmFkZFBhcmFtZXRlclRydWUoImluaGVyaXRlZCIpLmdldChjYWxsYmFjayk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0RGVmYXVsdChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8RGFzaGJvYXJkSW5mbz4gY2FsbGJhY2spIHsKKyAgICBiYXNlKHByb2plY3QpLnZpZXcoImRlZmF1bHQiKS5hZGRQYXJhbWV0ZXJUcnVlKCJpbmhlcml0ZWQiKS5nZXQoY2FsbGJhY2spOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGdldChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgU3RyaW5nIGlkLAorICAgICAgQXN5bmNDYWxsYmFjazxEYXNoYm9hcmRJbmZvPiBjYWxsYmFjaykgeworICAgIGJhc2UocHJvamVjdCkuaWRSYXcoZW5jb2RlRGFzaGJvYXJkSWQoaWQpKS5nZXQoY2FsbGJhY2spOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBiYXNlKFByb2plY3QuTmFtZUtleSBwcm9qZWN0KSB7CisgICAgcmV0dXJuIG5ldyBSZXN0QXBpKCIvcHJvamVjdHMvIikuaWQocHJvamVjdC5nZXQoKSkudmlldygiZGFzaGJvYXJkcyIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZURhc2hib2FyZElkKFN0cmluZyBpZCkgeworICAgIGludCBjID0gaWQuaW5kZXhPZignOicpOworICAgIGlmICgwIDw9IGMpIHsKKyAgICAgIFN0cmluZyByZWYgPSBVUkwuZW5jb2RlUXVlcnlTdHJpbmcoaWQuc3Vic3RyaW5nKDAsIGMpKTsKKyAgICAgIFN0cmluZyBwYXRoID0gVVJMLmVuY29kZVF1ZXJ5U3RyaW5nKGlkLnN1YnN0cmluZyhjICsgMSkpOworICAgICAgcmV0dXJuIHJlZiArICc6JyArIHBhdGg7CisgICAgfQorICAgIHJldHVybiBVUkwuZW5jb2RlUXVlcnlTdHJpbmcoaWQpOworICB9CisKKyAgcHJvdGVjdGVkIERhc2hib2FyZExpc3QoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZHNUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvRGFzaGJvYXJkc1RhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MjFiNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kYXNoYm9hcmRzL0Rhc2hib2FyZHNUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmRhc2hib2FyZHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuTmF2aWdhdGlvblRhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSnNBcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5IaXN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbGV4VGFibGUuRmxleENlbGxGb3JtYXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgRGFzaGJvYXJkc1RhYmxlIGV4dGVuZHMgTmF2aWdhdGlvblRhYmxlPERhc2hib2FyZEluZm8+IHsKKyAgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CisKKyAgcHVibGljIERhc2hib2FyZHNUYWJsZShmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCkgeworICAgIHN1cGVyKFV0aWwuQy5kYXNoYm9hcmRJdGVtKCkpOworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgaW5pdENvbHVtbkhlYWRlcnMoKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIGluaXRDb2x1bW5IZWFkZXJzKCkgeworICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CisgICAgZm10LnNldENvbFNwYW4oMCwgMCwgMik7CisgICAgZm10LmFkZFN0eWxlTmFtZSgwLCAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZSgwLCAyLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZSgwLCAzLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZSgwLCA0LCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRhdGFIZWFkZXIoKSk7CisKKyAgICB0YWJsZS5zZXRUZXh0KDAsIDEsIFV0aWwuQy5kYXNoYm9hcmROYW1lKCkpOworICAgIHRhYmxlLnNldFRleHQoMCwgMiwgVXRpbC5DLmRhc2hib2FyZFRpdGxlKCkpOworICAgIHRhYmxlLnNldFRleHQoMCwgMywgVXRpbC5DLmRhc2hib2FyZERlc2NyaXB0aW9uKCkpOworICAgIHRhYmxlLnNldFRleHQoMCwgNCwgVXRpbC5DLmRhc2hib2FyZEluaGVyaXRlZCgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGRpc3BsYXkoRGFzaGJvYXJkTGlzdCBkYXNoZXMpIHsKKyAgICBkaXNwbGF5KE5hdGl2ZXMuYXNMaXN0KGRhc2hlcykpOworICB9CisKKyAgcHVibGljIHZvaWQgZGlzcGxheShKc0FycmF5PERhc2hib2FyZExpc3Q+IGluKSB7CisgICAgTWFwPFN0cmluZywgRGFzaGJvYXJkSW5mbz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXNoYm9hcmRJbmZvPigpOworICAgIGZvciAoRGFzaGJvYXJkTGlzdCBsaXN0IDogTmF0aXZlcy5hc0xpc3QoaW4pKSB7CisgICAgICBmb3IgKERhc2hib2FyZEluZm8gZCA6IE5hdGl2ZXMuYXNMaXN0KGxpc3QpKSB7CisgICAgICAgIGlmICghbWFwLmNvbnRhaW5zS2V5KGQuaWQoKSkpIHsKKyAgICAgICAgICBtYXAucHV0KGQuaWQoKSwgZCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZGlzcGxheShuZXcgQXJyYXlMaXN0PERhc2hib2FyZEluZm8+KG1hcC52YWx1ZXMoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgZGlzcGxheShMaXN0PERhc2hib2FyZEluZm8+IGxpc3QpIHsKKyAgICB3aGlsZSAoMSA8IHRhYmxlLmdldFJvd0NvdW50KCkpIHsKKyAgICAgIHRhYmxlLnJlbW92ZVJvdyh0YWJsZS5nZXRSb3dDb3VudCgpIC0gMSk7CisgICAgfQorCisgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgQ29tcGFyYXRvcjxEYXNoYm9hcmRJbmZvPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBjb21wYXJlKERhc2hib2FyZEluZm8gYSwgRGFzaGJvYXJkSW5mbyBiKSB7CisgICAgICAgIHJldHVybiBhLmlkKCkuY29tcGFyZVRvKGIuaWQoKSk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBTdHJpbmcgcmVmID0gbnVsbDsKKyAgICBmb3IoRGFzaGJvYXJkSW5mbyBkIDogbGlzdCkgeworICAgICAgaWYgKCFkLnJlZigpLmVxdWFscyhyZWYpKSB7CisgICAgICAgIHJlZiA9IGQucmVmKCk7CisgICAgICAgIGluc2VydFRpdGxlUm93KHRhYmxlLmdldFJvd0NvdW50KCksIHJlZik7CisgICAgICB9CisgICAgICBpbnNlcnQodGFibGUuZ2V0Um93Q291bnQoKSwgZCk7CisgICAgfQorCisgICAgZmluaXNoRGlzcGxheSgpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VGl0bGVSb3coZmluYWwgaW50IHJvdywgU3RyaW5nIHNlY3Rpb24pIHsKKyAgICB0YWJsZS5pbnNlcnRSb3cocm93KTsKKworICAgIHRhYmxlLnNldFRleHQocm93LCAwLCBzZWN0aW9uKTsKKworICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CisgICAgZm10LnNldENvbFNwYW4ocm93LCAwLCA2KTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgMCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5zZWN0aW9uSGVhZGVyKCkpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0KGZpbmFsIGludCByb3csIGZpbmFsIERhc2hib2FyZEluZm8gaykgeworICAgIHRhYmxlLmluc2VydFJvdyhyb3cpOworCisgICAgYXBwbHlEYXRhUm93U3R5bGUocm93KTsKKworICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDMsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDQsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDUsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CisKKyAgICBwb3B1bGF0ZShyb3csIGspOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGUoZmluYWwgaW50IHJvdywgZmluYWwgRGFzaGJvYXJkSW5mbyBrKSB7CisgICAgaWYgKGsuaXNEZWZhdWx0KCkpIHsKKyAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDEsIG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmdyZWVuQ2hlY2soKSkpOworICAgICAgZmluYWwgRmxleENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKTsKKyAgICAgIGZtdC5nZXRFbGVtZW50KHJvdywgMSkuc2V0VGl0bGUoVXRpbC5DLmRhc2hib2FyZERlZmF1bHRUb29sVGlwKCkpOworICAgIH0KKyAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAyLCBuZXcgQW5jaG9yKGsucGF0aCgpLCAiIyIKKyAgICAgICAgICAgICsgUGFnZUxpbmtzLnRvUHJvamVjdERhc2hib2FyZChuZXcgUHJvamVjdC5OYW1lS2V5KGsucHJvamVjdCgpKSwgay5pZCgpKSkpOworICAgIHRhYmxlLnNldFRleHQocm93LCAzLCBrLnRpdGxlKCkgIT0gbnVsbCA/IGsudGl0bGUoKSA6IGsucGF0aCgpKTsKKyAgICB0YWJsZS5zZXRUZXh0KHJvdywgNCwgay5kZXNjcmlwdGlvbigpKTsKKyAgICBpZiAoay5kZWZpbmluZ1Byb2plY3QoKSAhPSBudWxsICYmICFrLmRlZmluaW5nUHJvamVjdCgpLmVxdWFscyhrLnByb2plY3QoKSkpIHsKKyAgICAgIHRhYmxlLnNldFdpZGdldChyb3csIDUsIG5ldyBBbmNob3Ioay5kZWZpbmluZ1Byb2plY3QoKSwgIiMiCisgICAgICAgICAgKyBQYWdlTGlua3MudG9Qcm9qZWN0RGFzaGJvYXJkcyhuZXcgUHJvamVjdC5OYW1lS2V5KGsuZGVmaW5pbmdQcm9qZWN0KCkpKSkpOworICAgIH0KKyAgICBzZXRSb3dJdGVtKHJvdywgayk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIE9iamVjdCBnZXRSb3dJdGVtS2V5KGZpbmFsIERhc2hib2FyZEluZm8gaXRlbSkgeworICAgIHJldHVybiBpdGVtLmlkKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgb25PcGVuUm93KGZpbmFsIGludCByb3cpIHsKKyAgICBpZiAocm93ID4gMCkgeworICAgICAgbW92ZVBvaW50ZXJUbyhyb3cpOworICAgIH0KKyAgICBIaXN0b3J5Lm5ld0l0ZW0oZ2V0Um93SXRlbShyb3cpLnVybCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvVXRpbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rhc2hib2FyZHMvVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWJmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZGFzaGJvYXJkcy9VdGlsLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kYXNoYm9hcmRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuR1dUOworCitwdWJsaWMgY2xhc3MgVXRpbCB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGFzaGJvYXJkQ29uc3RhbnRzIEMgPSBHV1QuY3JlYXRlKERhc2hib2FyZENvbnN0YW50cy5jbGFzcyk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRDb21tYW5kTGluay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkQ29tbWFuZExpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWM2OGRiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkQ29tbWFuZExpbmsuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5BbmNob3I7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuV2lkZ2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuY2xpcHB5LmNsaWVudC5Db3B5YWJsZUxhYmVsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEb3dubG9hZENvbW1hbmRMaW5rIGV4dGVuZHMgQW5jaG9yIGltcGxlbWVudHMgQ2xpY2tIYW5kbGVyIHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDb3B5YWJsZUNvbW1hbmRMaW5rRmFjdG9yeSB7CisgICAgcHJvdGVjdGVkIENvcHlhYmxlTGFiZWwgY29weUxhYmVsID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgV2lkZ2V0IHdpZGdldDsKKworICAgIHB1YmxpYyBjbGFzcyBDaGVja291dENvbW1hbmRMaW5rIGV4dGVuZHMgRG93bmxvYWRDb21tYW5kTGluayB7CisgICAgICBwdWJsaWMgQ2hlY2tvdXRDb21tYW5kTGluayAoKSB7CisgICAgICAgIHN1cGVyKERvd25sb2FkQ29tbWFuZC5DSEVDS09VVCwgImNoZWNrb3V0Iik7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgeworICAgICAgICB3aWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgY29weUxhYmVsLnNldFRleHQoImdpdCBmZXRjaCAiICsgbGluay5nZXRVcmxEYXRhKCkKKyAgICAgICAgICAgICsgIiAmJiBnaXQgY2hlY2tvdXQgRkVUQ0hfSEVBRCIpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBQdWxsQ29tbWFuZExpbmsgZXh0ZW5kcyBEb3dubG9hZENvbW1hbmRMaW5rIHsKKyAgICAgIHB1YmxpYyBQdWxsQ29tbWFuZExpbmsoKSB7CisgICAgICAgIHN1cGVyKERvd25sb2FkQ29tbWFuZC5QVUxMLCAicHVsbCIpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKKyAgICAgICAgd2lkZ2V0LnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgIGNvcHlMYWJlbC5zZXRUZXh0KCJnaXQgcHVsbCAiICsgbGluay5nZXRVcmxEYXRhKCkpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDaGVycnlQaWNrQ29tbWFuZExpbmsgZXh0ZW5kcyBEb3dubG9hZENvbW1hbmRMaW5rIHsKKyAgICAgIHB1YmxpYyBDaGVycnlQaWNrQ29tbWFuZExpbmsoKSB7CisgICAgICAgIHN1cGVyKERvd25sb2FkQ29tbWFuZC5DSEVSUllfUElDSywgImNoZXJyeS1waWNrIik7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgeworICAgICAgICB3aWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgY29weUxhYmVsLnNldFRleHQoImdpdCBmZXRjaCAiICsgbGluay5nZXRVcmxEYXRhKCkKKyAgICAgICAgICAgICsgIiAmJiBnaXQgY2hlcnJ5LXBpY2sgRkVUQ0hfSEVBRCIpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBGb3JtYXRQYXRjaENvbW1hbmRMaW5rIGV4dGVuZHMgRG93bmxvYWRDb21tYW5kTGluayB7CisgICAgICBwdWJsaWMgRm9ybWF0UGF0Y2hDb21tYW5kTGluaygpIHsKKyAgICAgICAgc3VwZXIoRG93bmxvYWRDb21tYW5kLkZPUk1BVF9QQVRDSCwgInBhdGNoIik7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgeworICAgICAgICB3aWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgY29weUxhYmVsLnNldFRleHQoImdpdCBmZXRjaCAiICsgbGluay5nZXRVcmxEYXRhKCkKKyAgICAgICAgICAgICsgIiAmJiBnaXQgZm9ybWF0LXBhdGNoIC0xIC0tc3Rkb3V0IEZFVENIX0hFQUQiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgUmVwb0NvbW1hbmRMaW5rIGV4dGVuZHMgRG93bmxvYWRDb21tYW5kTGluayB7CisgICAgICBTdHJpbmcgcHJvamVjdE5hbWU7CisgICAgICBTdHJpbmcgcmVmOworICAgICAgcHVibGljIFJlcG9Db21tYW5kTGluayhTdHJpbmcgcHJvamVjdCwgU3RyaW5nIHJlZikgeworICAgICAgICBzdXBlcihEb3dubG9hZENvbW1hbmQuUkVQT19ET1dOTE9BRCwgImNoZWNrb3V0Iik7CisgICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0OworICAgICAgICB0aGlzLnJlZiA9IHJlZjsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDdXJyZW50VXJsKERvd25sb2FkVXJsTGluayBsaW5rKSB7CisgICAgICAgIHdpZGdldC5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgci5hcHBlbmQoInJlcG8gZG93bmxvYWQgIik7CisgICAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKKyAgICAgICAgci5hcHBlbmQoIiAiKTsKKyAgICAgICAgci5hcHBlbmQocmVmKTsKKyAgICAgICAgY29weUxhYmVsLnNldFRleHQoci50b1N0cmluZygpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ2xvbmVDb21tYW5kTGluayBleHRlbmRzIERvd25sb2FkQ29tbWFuZExpbmsgeworICAgICAgcHVibGljIENsb25lQ29tbWFuZExpbmsoKSB7CisgICAgICAgIHN1cGVyKERvd25sb2FkQ29tbWFuZC5DSEVDS09VVCwgImNsb25lIik7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycmVudFVybChEb3dubG9hZFVybExpbmsgbGluaykgeworICAgICAgICB3aWRnZXQuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgY29weUxhYmVsLnNldFRleHQoImdpdCBjbG9uZSAiICsgbGluay5nZXRVcmxEYXRhKCkpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDb3B5YWJsZUNvbW1hbmRMaW5rRmFjdG9yeShDb3B5YWJsZUxhYmVsIGxhYmVsLCBXaWRnZXQgd2lkZ2V0KSB7CisgICAgICBjb3B5TGFiZWwgPSBsYWJlbDsKKyAgICAgIHRoaXMud2lkZ2V0ID0gd2lkZ2V0OworICAgIH0KKyAgfQorCisgIGZpbmFsIERvd25sb2FkQ29tbWFuZCBjbWRUeXBlOworCisgIHB1YmxpYyBEb3dubG9hZENvbW1hbmRMaW5rKERvd25sb2FkQ29tbWFuZCBjbWRUeXBlLAorICAgICAgU3RyaW5nIHRleHQpIHsKKyAgICBzdXBlcih0ZXh0KTsKKyAgICB0aGlzLmNtZFR5cGUgPSBjbWRUeXBlOworICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGluaygpKTsKKyAgICBSb2xlcy5nZXRUYWJSb2xlKCkuc2V0KGdldEVsZW1lbnQoKSk7CisgICAgYWRkQ2xpY2tIYW5kbGVyKHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisKKyAgICBzZWxlY3QoKTsKKworICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICAvLyBJZiB0aGUgdXNlciBpcyBzaWduZWQtaW4sIHJlbWVtYmVyIHRoaXMgY2hvaWNlIGZvciBmdXR1cmUgcGFuZWxzLgorICAgICAgLy8KKyAgICAgIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMgcHJlZiA9CisgICAgICAgICAgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7CisgICAgICBwcmVmLnNldERvd25sb2FkQ29tbWFuZChjbWRUeXBlKTsKKyAgICAgIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LlV0aWwuQUNDT1VOVF9TVkMuY2hhbmdlUHJlZmVyZW5jZXMocHJlZiwKKyAgICAgICAgICBuZXcgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoVm9pZFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgRG93bmxvYWRDb21tYW5kIGdldENtZFR5cGUoKSB7CisgICAgcmV0dXJuIGNtZFR5cGU7CisgIH0KKworICB2b2lkIHNlbGVjdCgpIHsKKyAgICBEb3dubG9hZENvbW1hbmRQYW5lbCBwYXJlbnQgPSAoRG93bmxvYWRDb21tYW5kUGFuZWwpIGdldFBhcmVudCgpOworICAgIGZvciAoV2lkZ2V0IHcgOiBwYXJlbnQpIHsKKyAgICAgIGlmICh3ICE9IHRoaXMgJiYgdyBpbnN0YW5jZW9mIERvd25sb2FkQ29tbWFuZExpbmspIHsKKyAgICAgICAgdy5yZW1vdmVTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtfQWN0aXZlKCkpOworICAgICAgfQorICAgIH0KKyAgICBwYXJlbnQuc2V0Q3VycmVudENvbW1hbmQodGhpcyk7CisgICAgYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rX0FjdGl2ZSgpKTsKKyAgfQorCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkQ29tbWFuZFBhbmVsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRDb21tYW5kUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdkNmMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkQ29tbWFuZFBhbmVsLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CisKK3B1YmxpYyBjbGFzcyBEb3dubG9hZENvbW1hbmRQYW5lbCBleHRlbmRzIEZsb3dQYW5lbCB7CisgIHByaXZhdGUgRG93bmxvYWRDb21tYW5kTGluayBjdXJyZW50Q29tbWFuZDsKKyAgcHJpdmF0ZSBEb3dubG9hZFVybExpbmsgY3VycmVudFVybDsKKworICBwdWJsaWMgRG93bmxvYWRDb21tYW5kUGFuZWwoKSB7CisgICAgc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rTGlzdCgpKTsKKyAgICBSb2xlcy5nZXRUYWJsaXN0Um9sZSgpLnNldChnZXRFbGVtZW50KCkpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICByZXR1cm4gZ2V0V2lkZ2V0Q291bnQoKSA9PSAwOworICB9CisKKyAgcHVibGljIHZvaWQgc2VsZWN0KEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRDb21tYW5kIGNtZFR5cGUpIHsKKyAgICBEb3dubG9hZENvbW1hbmRMaW5rIGZpcnN0ID0gbnVsbDsKKworICAgIGZvciAoV2lkZ2V0IHcgOiB0aGlzKSB7CisgICAgICBpZiAodyBpbnN0YW5jZW9mIERvd25sb2FkQ29tbWFuZExpbmspIHsKKyAgICAgICAgZmluYWwgRG93bmxvYWRDb21tYW5kTGluayBkID0gKERvd25sb2FkQ29tbWFuZExpbmspIHc7CisgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CisgICAgICAgICAgZmlyc3QgPSBkOworICAgICAgICB9CisgICAgICAgIGlmIChkLmNtZFR5cGUgPT0gY21kVHlwZSkgeworICAgICAgICAgIGQuc2VsZWN0KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgbm9uZSBtYXRjaGVkIHRoZSByZXF1ZXN0ZWQgdHlwZSwgc2VsZWN0IHRoZSBmaXJzdCBpbiB0aGUKKyAgICAvLyBncm91cCBhcyB0aGF0IHdpbGwgYXQgbGVhc3QgZ2l2ZSB1cyBhbiBpbml0aWFsIGJhc2VsaW5lLgorICAgIGlmIChmaXJzdCAhPSBudWxsKSB7CisgICAgICBmaXJzdC5zZWxlY3QoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKKyAgICBjdXJyZW50VXJsID0gbGluazsKKyAgICB1cGRhdGUoKTsKKyAgfQorCisgIHZvaWQgc2V0Q3VycmVudENvbW1hbmQoRG93bmxvYWRDb21tYW5kTGluayBjbWQpIHsKKyAgICBjdXJyZW50Q29tbWFuZCA9IGNtZDsKKyAgICB1cGRhdGUoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB1cGRhdGUoKSB7CisgICAgaWYgKGN1cnJlbnRDb21tYW5kICE9IG51bGwgJiYgY3VycmVudFVybCAhPSBudWxsKSB7CisgICAgICBjdXJyZW50Q29tbWFuZC5zZXRDdXJyZW50VXJsKGN1cnJlbnRVcmwpOworICAgIH0gZWxzZSBpZiAoY3VycmVudENvbW1hbmQgIT0gbnVsbCAmJgorICAgICAgICBjdXJyZW50Q29tbWFuZC5nZXRDbWRUeXBlKCkuZXF1YWxzKERvd25sb2FkQ29tbWFuZC5SRVBPX0RPV05MT0FEKSkgeworICAgICAgY3VycmVudENvbW1hbmQuc2V0Q3VycmVudFVybChudWxsKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZE1lc3NhZ2VzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzEzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZG93bmxvYWQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5pMThuLmNsaWVudC5NZXNzYWdlczsKKworcHVibGljIGludGVyZmFjZSBEb3dubG9hZE1lc3NhZ2VzIGV4dGVuZHMgTWVzc2FnZXMgeworICBTdHJpbmcgYW5vbnltb3VzRG93bmxvYWQoU3RyaW5nIHByb3RvY29sKTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZE1lc3NhZ2VzLnByb3BlcnRpZXMgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRNZXNzYWdlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzRkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEgQEAKK2Fub255bW91c0Rvd25sb2FkID0gQW5vbnltb3VzIHswfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL0Rvd25sb2FkUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFBhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwZGJlZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFBhbmVsLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzLkRvd25sb2FkU2NoZW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbmxpbmVMYWJlbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmNsaXBweS5jbGllbnQuQ29weWFibGVMYWJlbDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEb3dubG9hZFBhbmVsIGV4dGVuZHMgRmxvd1BhbmVsIHsKKyAgcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZTsKKworICBwcm90ZWN0ZWQgU2V0PERvd25sb2FkU2NoZW1lPiBhbGxvd2VkU2NoZW1lcyA9CisgICAgICBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0RG93bmxvYWRTY2hlbWVzKCk7CisgIHByb3RlY3RlZCBTZXQ8RG93bmxvYWRDb21tYW5kPiBhbGxvd2VkQ29tbWFuZHMgPQorICAgICAgR2Vycml0LmdldENvbmZpZygpLmdldERvd25sb2FkQ29tbWFuZHMoKTsKKyAgcHJvdGVjdGVkIERvd25sb2FkQ29tbWFuZExpbmsuQ29weWFibGVDb21tYW5kTGlua0ZhY3RvcnkgY21kTGlua2ZhY3Rvcnk7CisKKyAgcHJvdGVjdGVkIERvd25sb2FkQ29tbWFuZFBhbmVsIGNvbW1hbmRzID0gbmV3IERvd25sb2FkQ29tbWFuZFBhbmVsKCk7CisgIHByb3RlY3RlZCBEb3dubG9hZFVybFBhbmVsIHVybHMgPSBuZXcgRG93bmxvYWRVcmxQYW5lbChjb21tYW5kcyk7CisgIHByb3RlY3RlZCBDb3B5YWJsZUxhYmVsIGNvcHlMYWJlbCA9IG5ldyBDb3B5YWJsZUxhYmVsKCIiKTsKKworICBwdWJsaWMgRG93bmxvYWRQYW5lbChTdHJpbmcgcHJvamVjdCwgU3RyaW5nIHJlZiwgYm9vbGVhbiBhbGxvd0Fub255bW91cykgeworICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0OworCisgICAgY29weUxhYmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua0NvcHlMYWJlbCgpKTsKKyAgICB1cmxzLmFkZChEb3dubG9hZFVybExpbmsuY3JlYXRlRG93bmxvYWRVcmxMaW5rcyhwcm9qZWN0LCByZWYsIGFsbG93QW5vbnltb3VzKSk7CisgICAgY21kTGlua2ZhY3RvcnkgPSBuZXcgRG93bmxvYWRDb21tYW5kTGluay5Db3B5YWJsZUNvbW1hbmRMaW5rRmFjdG9yeSgKKyAgICAgICAgY29weUxhYmVsLCB1cmxzKTsKKworICAgIHBvcHVsYXRlRG93bmxvYWRDb21tYW5kTGlua3MoKTsKKyAgICBzZXR1cFdpZGdldHMoKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHNldHVwV2lkZ2V0cygpIHsKKyAgICBpZiAoIWNvbW1hbmRzLmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcyBwcmVmOworICAgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkpIHsKKyAgICAgICAgcHJlZiA9IEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldEdlbmVyYWxQcmVmZXJlbmNlcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJlZiA9IG5ldyBBY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzKCk7CisgICAgICAgIHByZWYucmVzZXRUb0RlZmF1bHRzKCk7CisgICAgICB9CisgICAgICBjb21tYW5kcy5zZWxlY3QocHJlZi5nZXREb3dubG9hZENvbW1hbmQoKSk7CisgICAgICB1cmxzLnNlbGVjdChwcmVmLmdldERvd25sb2FkVXJsKCkpOworCisgICAgICBGbG93UGFuZWwgcCA9IG5ldyBGbG93UGFuZWwoKTsKKyAgICAgIHAuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZG93bmxvYWRMaW5rSGVhZGVyKCkpOworICAgICAgcC5hZGQoY29tbWFuZHMpOworICAgICAgZmluYWwgSW5saW5lTGFiZWwgZ2x1ZSA9IG5ldyBJbmxpbmVMYWJlbCgpOworICAgICAgZ2x1ZS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtIZWFkZXJHYXAoKSk7CisgICAgICBwLmFkZChnbHVlKTsKKyAgICAgIHAuYWRkKHVybHMpOworCisgICAgICBhZGQocCk7CisgICAgICBhZGQoY29weUxhYmVsKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwb3B1bGF0ZURvd25sb2FkQ29tbWFuZExpbmtzKCk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRVcmxMaW5rLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRVcmxMaW5rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjODk3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFVybExpbmsuamF2YQpAQCAtMCwwICsxLDI2NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMuRG93bmxvYWRTY2hlbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuV2luZG93OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIERvd25sb2FkVXJsTGluayBleHRlbmRzIEFuY2hvciBpbXBsZW1lbnRzIENsaWNrSGFuZGxlciB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG93bmxvYWRSZWZVcmxMaW5rIGV4dGVuZHMgRG93bmxvYWRVcmxMaW5rIHsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2plY3ROYW1lOworICAgIHByb3RlY3RlZCBTdHJpbmcgcmVmOworCisgICAgcHJvdGVjdGVkIERvd25sb2FkUmVmVXJsTGluayhEb3dubG9hZFNjaGVtZSB1cmxUeXBlLAorICAgICAgICBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb2plY3QsIFN0cmluZyByZWYpIHsKKyAgICAgIHN1cGVyKHVybFR5cGUsIHRleHQpOworICAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3Q7CisgICAgICB0aGlzLnJlZiA9IHJlZjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRSZWYoU3RyaW5nQnVpbGRlciByKSB7CisgICAgICBpZiAocmVmICE9IG51bGwpIHsKKyAgICAgICAgci5hcHBlbmQoIiAiKTsKKyAgICAgICAgci5hcHBlbmQocmVmKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFub25HaXRMaW5rIGV4dGVuZHMgRG93bmxvYWRSZWZVcmxMaW5rIHsKKyAgICBwdWJsaWMgQW5vbkdpdExpbmsoU3RyaW5nIHByb2plY3QsIFN0cmluZyByZWYpIHsKKyAgICAgIHN1cGVyKERvd25sb2FkU2NoZW1lLkFOT05fR0lULCBVdGlsLk0uYW5vbnltb3VzRG93bmxvYWQoIkdpdCIpLCBwcm9qZWN0LCByZWYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsRGF0YSgpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICByLmFwcGVuZChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0R2l0RGFlbW9uVXJsKCkpOworICAgICAgci5hcHBlbmQocHJvamVjdE5hbWUpOworICAgICAgYXBwZW5kUmVmKHIpOworICAgICAgcmV0dXJuIHIudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFub25IdHRwTGluayBleHRlbmRzIERvd25sb2FkUmVmVXJsTGluayB7CisgICAgcHVibGljIEFub25IdHRwTGluayhTdHJpbmcgcHJvamVjdCwgU3RyaW5nIHJlZikgeworICAgICAgc3VwZXIoRG93bmxvYWRTY2hlbWUuQU5PTl9IVFRQLCBVdGlsLk0uYW5vbnltb3VzRG93bmxvYWQoIkhUVFAiKSwgcHJvamVjdCwgcmVmKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVybERhdGEoKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgaWYgKEdlcnJpdC5nZXRDb25maWcoKS5nZXRHaXRIdHRwVXJsKCkgIT0gbnVsbCkgeworICAgICAgICByLmFwcGVuZChHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0R2l0SHR0cFVybCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHIuYXBwZW5kKGhvc3RQYWdlVXJsKTsKKyAgICAgIH0KKyAgICAgIHIuYXBwZW5kKHByb2plY3ROYW1lKTsKKyAgICAgIGFwcGVuZFJlZihyKTsKKyAgICAgIHJldHVybiByLnRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2hMaW5rIGV4dGVuZHMgRG93bmxvYWRSZWZVcmxMaW5rIHsKKyAgICBwdWJsaWMgU3NoTGluayhTdHJpbmcgcHJvamVjdCwgU3RyaW5nIHJlZikgeworICAgICAgc3VwZXIoRG93bmxvYWRTY2hlbWUuU1NILCAiU1NIIiwgcHJvamVjdCwgcmVmKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVybERhdGEoKSB7CisgICAgICBTdHJpbmcgc3NoQWRkciA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRTc2hkQWRkcmVzcygpOworICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIHIuYXBwZW5kKCJzc2g6Ly8iKTsKKyAgICAgIHIuYXBwZW5kKEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldFVzZXJOYW1lKCkpOworICAgICAgci5hcHBlbmQoIkAiKTsKKyAgICAgIGlmIChzc2hBZGRyLnN0YXJ0c1dpdGgoIio6IikgfHwgIiIuZXF1YWxzKHNzaEFkZHIpKSB7CisgICAgICAgIHIuYXBwZW5kKFdpbmRvdy5Mb2NhdGlvbi5nZXRIb3N0TmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChzc2hBZGRyLnN0YXJ0c1dpdGgoIioiKSkgeworICAgICAgICBzc2hBZGRyID0gc3NoQWRkci5zdWJzdHJpbmcoMSk7CisgICAgICB9CisgICAgICByLmFwcGVuZChzc2hBZGRyKTsKKyAgICAgIHIuYXBwZW5kKCIvIik7CisgICAgICByLmFwcGVuZChwcm9qZWN0TmFtZSk7CisgICAgICBhcHBlbmRSZWYocik7CisgICAgICByZXR1cm4gci50b1N0cmluZygpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHR0cExpbmsgZXh0ZW5kcyBEb3dubG9hZFJlZlVybExpbmsgeworICAgIHByb3RlY3RlZCBib29sZWFuIGFub255bW91czsKKworICAgIHB1YmxpYyBIdHRwTGluayhTdHJpbmcgcHJvamVjdCwgU3RyaW5nIHJlZiwgYm9vbGVhbiBhbm9ueW1vdXMpIHsKKyAgICAgIHN1cGVyKERvd25sb2FkU2NoZW1lLkhUVFAsICJIVFRQIiwgcHJvamVjdCwgcmVmKTsKKyAgICAgIHRoaXMuYW5vbnltb3VzID0gYW5vbnltb3VzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsRGF0YSgpIHsKKyAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBpZiAoR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsCisgICAgICAgICAgJiYgKGFub255bW91cyB8fCBzaXRlUmVsaWVzT25IdHRwKCkpKSB7CisgICAgICAgIHIuYXBwZW5kKEdlcnJpdC5nZXRDb25maWcoKS5nZXRHaXRIdHRwVXJsKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU3RyaW5nIGJhc2UgPSBob3N0UGFnZVVybDsKKyAgICAgICAgaW50IHAgPSBiYXNlLmluZGV4T2YoIjovLyIpOworICAgICAgICBpbnQgcyA9IGJhc2UuaW5kZXhPZignLycsIHAgKyAzKTsKKyAgICAgICAgaWYgKHMgPCAwKSB7CisgICAgICAgICAgcyA9IGJhc2UubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGhvc3QgPSBiYXNlLnN1YnN0cmluZyhwICsgMywgcyk7CisgICAgICAgIGlmIChob3N0LmNvbnRhaW5zKCJAIikpIHsKKyAgICAgICAgICBob3N0ID0gaG9zdC5zdWJzdHJpbmcoaG9zdC5pbmRleE9mKCdAJykgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHIuYXBwZW5kKGJhc2Uuc3Vic3RyaW5nKDAsIHAgKyAzKSk7CisgICAgICAgIHIuYXBwZW5kKEdlcnJpdC5nZXRVc2VyQWNjb3VudCgpLmdldFVzZXJOYW1lKCkpOworICAgICAgICByLmFwcGVuZCgnQCcpOworICAgICAgICByLmFwcGVuZChob3N0KTsKKyAgICAgICAgci5hcHBlbmQoYmFzZS5zdWJzdHJpbmcocykpOworICAgICAgfQorICAgICAgci5hcHBlbmQocHJvamVjdE5hbWUpOworICAgICAgYXBwZW5kUmVmKHIpOworICAgICAgcmV0dXJuIHIudG9TdHJpbmcoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2l0ZVJlbGllc09uSHR0cCgpIHsKKyAgICByZXR1cm4gR2Vycml0LmdldENvbmZpZygpLmdldEdpdEh0dHBVcmwoKSAhPSBudWxsCisgICAgICAgICYmIEdlcnJpdC5nZXRDb25maWcoKS5nZXRBdXRoVHlwZSgpID09IEF1dGhUeXBlLkNVU1RPTV9FWFRFTlNJT04KKyAgICAgICAgJiYgIUdlcnJpdC5nZXRDb25maWcoKS5zaXRlSGFzVXNlcm5hbWVzKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIExpc3Q8RG93bmxvYWRVcmxMaW5rPiBjcmVhdGVEb3dubG9hZFVybExpbmtzKFN0cmluZyBwcm9qZWN0LAorICAgICAgU3RyaW5nIHJlZiwgYm9vbGVhbiBhbGxvd0Fub255bW91cykgeworICAgIExpc3Q8RG93bmxvYWRVcmxMaW5rPiB1cmxzID0gbmV3IEFycmF5TGlzdDxEb3dubG9hZFVybExpbms+KCk7CisgICAgU2V0PERvd25sb2FkU2NoZW1lPiBhbGxvd2VkU2NoZW1lcyA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXREb3dubG9hZFNjaGVtZXMoKTsKKworICAgIGlmIChhbGxvd0Fub255bW91cworICAgICAgICAmJiBHZXJyaXQuZ2V0Q29uZmlnKCkuZ2V0R2l0RGFlbW9uVXJsKCkgIT0gbnVsbAorICAgICAgICAmJiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuQU5PTl9HSVQpIHx8CisgICAgICAgICAgICBhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5ERUZBVUxUX0RPV05MT0FEUykpKSB7CisgICAgICB1cmxzLmFkZChuZXcgRG93bmxvYWRVcmxMaW5rLkFub25HaXRMaW5rKHByb2plY3QsIHJlZikpOworICAgIH0KKworICAgIGlmIChhbGxvd0Fub255bW91cworICAgICAgICAmJiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuQU5PTl9IVFRQKSB8fAorICAgICAgICAgICAgYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuREVGQVVMVF9ET1dOTE9BRFMpKSkgeworICAgICAgdXJscy5hZGQobmV3IERvd25sb2FkVXJsTGluay5Bbm9uSHR0cExpbmsocHJvamVjdCwgcmVmKSk7CisgICAgfQorCisgICAgaWYgKEdlcnJpdC5nZXRDb25maWcoKS5nZXRTc2hkQWRkcmVzcygpICE9IG51bGwKKyAgICAgICAgJiYgaGFzVXNlck5hbWUoKQorICAgICAgICAmJiAoYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuU1NIKSB8fAorICAgICAgICAgICAgYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuREVGQVVMVF9ET1dOTE9BRFMpKSkgeworICAgICAgdXJscy5hZGQobmV3IERvd25sb2FkVXJsTGluay5Tc2hMaW5rKHByb2plY3QsIHJlZikpOworICAgIH0KKworICAgIGlmICgoaGFzVXNlck5hbWUoKSB8fCBzaXRlUmVsaWVzT25IdHRwKCkpCisgICAgICAgICYmIChhbGxvd2VkU2NoZW1lcy5jb250YWlucyhEb3dubG9hZFNjaGVtZS5IVFRQKQorICAgICAgICAgICAgfHwgYWxsb3dlZFNjaGVtZXMuY29udGFpbnMoRG93bmxvYWRTY2hlbWUuREVGQVVMVF9ET1dOTE9BRFMpKSkgeworICAgICAgdXJscy5hZGQobmV3IERvd25sb2FkVXJsTGluay5IdHRwTGluayhwcm9qZWN0LCByZWYsIGFsbG93QW5vbnltb3VzKSk7CisgICAgfQorICAgIHJldHVybiB1cmxzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNVc2VyTmFtZSgpIHsKKyAgICByZXR1cm4gR2Vycml0LmlzU2lnbmVkSW4oKQorICAgICAgICAmJiBHZXJyaXQuZ2V0VXNlckFjY291bnQoKS5nZXRVc2VyTmFtZSgpICE9IG51bGwKKyAgICAgICAgJiYgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0VXNlck5hbWUoKS5sZW5ndGgoKSA+IDA7CisgIH0KKworICBwcm90ZWN0ZWQgRG93bmxvYWRTY2hlbWUgdXJsVHlwZTsKKyAgcHJvdGVjdGVkIFN0cmluZyB1cmxEYXRhOworICBwcm90ZWN0ZWQgU3RyaW5nIGhvc3RQYWdlVXJsID0gR1dULmdldEhvc3RQYWdlQmFzZVVSTCgpOworCisgIHB1YmxpYyBEb3dubG9hZFVybExpbmsoRG93bmxvYWRTY2hlbWUgdXJsVHlwZSwgU3RyaW5nIHRleHQsIFN0cmluZyB1cmxEYXRhKSB7CisgICAgdGhpcyh0ZXh0KTsKKyAgICB0aGlzLnVybFR5cGUgPSB1cmxUeXBlOworICAgIHRoaXMudXJsRGF0YSA9IHVybERhdGE7CisgIH0KKworICBwdWJsaWMgRG93bmxvYWRVcmxMaW5rKERvd25sb2FkU2NoZW1lIHVybFR5cGUsIFN0cmluZyB0ZXh0KSB7CisgICAgdGhpcyh0ZXh0KTsKKyAgICB0aGlzLnVybFR5cGUgPSB1cmxUeXBlOworICB9CisKKyAgcHVibGljIERvd25sb2FkVXJsTGluayhTdHJpbmcgdGV4dCkgeworICAgIHN1cGVyKHRleHQpOworICAgIHNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGluaygpKTsKKyAgICBSb2xlcy5nZXRUYWJSb2xlKCkuc2V0KGdldEVsZW1lbnQoKSk7CisgICAgYWRkQ2xpY2tIYW5kbGVyKHRoaXMpOworCisgICAgaWYgKCFob3N0UGFnZVVybC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICBob3N0UGFnZVVybCArPSAiLyI7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRVcmxEYXRhKCkgeworICAgIHJldHVybiB1cmxEYXRhOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CisgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisKKyAgICBzZWxlY3QoKTsKKworICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7CisgICAgICAvLyBJZiB0aGUgdXNlciBpcyBzaWduZWQtaW4sIHJlbWVtYmVyIHRoaXMgY2hvaWNlIGZvciBmdXR1cmUgcGFuZWxzLgorICAgICAgLy8KKyAgICAgIEFjY291bnRHZW5lcmFsUHJlZmVyZW5jZXMgcHJlZiA9CisgICAgICAgICAgR2Vycml0LmdldFVzZXJBY2NvdW50KCkuZ2V0R2VuZXJhbFByZWZlcmVuY2VzKCk7CisgICAgICBwcmVmLnNldERvd25sb2FkVXJsKHVybFR5cGUpOworICAgICAgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuVXRpbC5BQ0NPVU5UX1NWQy5jaGFuZ2VQcmVmZXJlbmNlcyhwcmVmLAorICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhWb2lkUmVzdWx0IHJlc3VsdCkgeworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgIH0KKyAgfQorCisgIHZvaWQgc2VsZWN0KCkgeworICAgIERvd25sb2FkVXJsUGFuZWwgcGFyZW50ID0gKERvd25sb2FkVXJsUGFuZWwpIGdldFBhcmVudCgpOworICAgIGZvciAoV2lkZ2V0IHcgOiBwYXJlbnQpIHsKKyAgICAgIGlmICh3ICE9IHRoaXMgJiYgdyBpbnN0YW5jZW9mIERvd25sb2FkVXJsTGluaykgeworICAgICAgICB3LnJlbW92ZVN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7CisgICAgICB9CisgICAgfQorICAgIHBhcmVudC5zZXRDdXJyZW50VXJsKHRoaXMpOworICAgIGFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRvd25sb2FkTGlua19BY3RpdmUoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9Eb3dubG9hZFVybFBhbmVsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRVcmxQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDc0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZG93bmxvYWQvRG93bmxvYWRVcmxQYW5lbC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZG93bmxvYWQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R2VuZXJhbFByZWZlcmVuY2VzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworcHVibGljIGNsYXNzIERvd25sb2FkVXJsUGFuZWwgZXh0ZW5kcyBGbG93UGFuZWwgeworICBwcml2YXRlIGZpbmFsIERvd25sb2FkQ29tbWFuZFBhbmVsIGNvbW1hbmRQYW5lbDsKKworICBwdWJsaWMgRG93bmxvYWRVcmxQYW5lbChmaW5hbCBEb3dubG9hZENvbW1hbmRQYW5lbCBjb21tYW5kUGFuZWwpIHsKKyAgICB0aGlzLmNvbW1hbmRQYW5lbCA9IGNvbW1hbmRQYW5lbDsKKyAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kb3dubG9hZExpbmtMaXN0KCkpOworICAgIFJvbGVzLmdldFRhYmxpc3RSb2xlKCkuc2V0KGdldEVsZW1lbnQoKSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgIHJldHVybiBnZXRXaWRnZXRDb3VudCgpID09IDA7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZWxlY3QoQWNjb3VudEdlbmVyYWxQcmVmZXJlbmNlcy5Eb3dubG9hZFNjaGVtZSB1cmxUeXBlKSB7CisgICAgRG93bmxvYWRVcmxMaW5rIGZpcnN0ID0gbnVsbDsKKworICAgIGZvciAoV2lkZ2V0IHcgOiB0aGlzKSB7CisgICAgICBpZiAodyBpbnN0YW5jZW9mIERvd25sb2FkVXJsTGluaykgeworICAgICAgICBmaW5hbCBEb3dubG9hZFVybExpbmsgZCA9IChEb3dubG9hZFVybExpbmspIHc7CisgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CisgICAgICAgICAgZmlyc3QgPSBkOworICAgICAgICB9CisgICAgICAgIGlmIChkLnVybFR5cGUgPT0gdXJsVHlwZSkgeworICAgICAgICAgIGQuc2VsZWN0KCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgbm9uZSBtYXRjaGVkIHRoZSByZXF1ZXN0ZWQgdHlwZSwgc2VsZWN0IHRoZSBmaXJzdCBpbiB0aGUKKyAgICAvLyBncm91cCBhcyB0aGF0IHdpbGwgYXQgbGVhc3QgZ2l2ZSB1cyBhbiBpbml0aWFsIGJhc2VsaW5lLgorICAgIGlmIChmaXJzdCAhPSBudWxsKSB7CisgICAgICBmaXJzdC5zZWxlY3QoKTsKKyAgICB9CisgIH0KKworICB2b2lkIHNldEN1cnJlbnRVcmwoRG93bmxvYWRVcmxMaW5rIGxpbmspIHsKKyAgICBjb21tYW5kUGFuZWwuc2V0Q3VycmVudFVybChsaW5rKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZChDb2xsZWN0aW9uPERvd25sb2FkVXJsTGluaz4gbGlua3MpIHsKKyAgICBmb3IgKFdpZGdldCBsaW5rOiBsaW5rcykgeworICAgICAgYWRkKGxpbmspOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2Rvd25sb2FkL1V0aWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9VdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwMzYxYgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9kb3dubG9hZC9VdGlsLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5kb3dubG9hZDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKKworcHVibGljIGNsYXNzIFV0aWwgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIERvd25sb2FkTWVzc2FnZXMgTSA9IEdXVC5jcmVhdGUoRG93bmxvYWRNZXNzYWdlcy5jbGFzcyk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZWRpdFRleHQucG5nIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2VkaXRUZXh0LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODhlMWMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2VkaXRUZXh0LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ2Vycml0LmNzcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nZXJyaXQuY3NzCmluZGV4IDc1MTJkOGMuLjk0MjU0NDMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nZXJyaXQuY3NzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nZXJyaXQuY3NzCkBAIC0xMywzMSArMTMsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLUBleHRlcm5hbCAuZ3d0LUJ1dHRvbjsKLUBleHRlcm5hbCAuZ3d0LVRhYkJhcjsKLUBleHRlcm5hbCAuZ3d0LVRhYkJhckZpcnN0OwotQGV4dGVybmFsIC5nd3QtVGFiQmFySXRlbTsKLUBleHRlcm5hbCAuZ3d0LVRhYkJhckl0ZW0tc2VsZWN0ZWQ7Ci1AZXh0ZXJuYWwgLmd3dC1UYWJCYXJSZXN0OwotQGV4dGVybmFsIC5nd3QtVGFiUGFuZWxCb3R0b207Ci1AZXh0ZXJuYWwgLmd3dC1UZXh0Qm94OwotQGV4dGVybmFsIC5nd3QtSHlwZXJsaW5rOwotQGV4dGVybmFsIC5nd3QtQ2hlY2tCb3g7Ci1AZXh0ZXJuYWwgLmd3dC1EaXNjbG9zdXJlUGFuZWwsIC5oZWFkZXIsIC5jb250ZW50OwotQGV4dGVybmFsIC5nd3QtSW5saW5lTGFiZWw7Ci1AZXh0ZXJuYWwgLmd3dC1JbmxpbmVIeXBlcmxpbms7Ci1AZXh0ZXJuYWwgLmd3dC1SYWRpb0J1dHRvbjsKLQotQGV4dGVybmFsIC5zZWFyY2hQYW5lbDsKLUBleHRlcm5hbCAuc21hbGxIZWFkaW5nOwotQGV4dGVybmFsIC53ZGk7Ci1AZXh0ZXJuYWwgLndkZDsKLUBleHRlcm5hbCAud2RjOworLyoqCisgKiBNYWtlIGV2ZXJ5IHNpbmdsZSBjbGFzcyBleHRlcm5hbCBzbyB1c2VycyBjYW4gcmVseSBvbiB0aGVpciBuYW1lcworICovCitAZXh0ZXJuYWwgLio7CiAKIEBkZWYgYmxhY2sgIzAwMDAwMDsKIEBkZWYgd2hpdGUgI2ZmZmZmZjsKIEBkZWYgbm9ybS1mb250ICBBcmlhbCBVbmljb2RlIE1TLCBBcmlhbCwgc2Fucy1zZXJpZjsKLUBkZWYgbW9uby1mb250ICdMdWNpZGEgQ29uc29sZScsICdMdWNpZGEgU2FucyBUeXBld3JpdGVyJywgTW9uYWNvLCBtb25vc3BhY2U7CitAZGVmIG1vbm8tZm9udCAgbW9ub3NwYWNlOwogCiBAZXZhbCBiYWNrZ3JvdW5kQ29sb3IgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdC5nZXRUaGVtZSgpLmJhY2tncm91bmRDb2xvcjsKIEBldmFsIHRvcE1lbnVDb2xvciBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0LmdldFRoZW1lKCkudG9wTWVudUNvbG9yOwpAQCAtNTIsMjggKzM2LDMyIEBACiAgIGd3dC1pbWFnZTogImdyZWVuQ2hlY2siOwogfQogCisvKiogT3ZlcnJpZGUgdmFyaW91cyBHV1QgZGVmYXVsdHMgKi8KIC5nZXJyaXRUb3BNZW51IHsKICAgZm9udC1zaXplOiA5cHQ7CiAgIHBhZGRpbmctdG9wOiA1cHg7CiAgIHBhZGRpbmctbGVmdDogNXB4OwogICBwYWRkaW5nLXJpZ2h0OiA1cHg7Ci0gIGJhY2tncm91bmQ6IHRvcE1lbnVDb2xvcjsKLX0KLS5nZXJyaXRUb3BNZW51IC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbSwKLS5nZXJyaXRUb3BNZW51IC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFyUmVzdCwKLS5nZXJyaXRUb3BNZW51IC5nd3QtVGFiQmFyIC5nd3QtVGFiUGFuZWxCb3R0b20gewotICBiYWNrZ3JvdW5kOiB0b3BNZW51Q29sb3I7Ci19Ci0uZ2Vycml0VG9wTWVudSAuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhckl0ZW0tc2VsZWN0ZWQgewotICBiYWNrZ3JvdW5kOiBzZWxlY3Rpb25Db2xvcjsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiB9CiAKIC5nZXJyaXRCb2R5IHsKLSAgZm9udC1zaXplOiAxMXB0OworICBmb250LXNpemU6IHNtYWxsOwogICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgcGFkZGluZy1yaWdodDogNXB4OwogfQogCithLAorYTp2aXNpdGVkIHsKKyAgY29sb3I6ICMwNjU0YWM7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKK30KKworYTpob3ZlciB7CisgIGNvbG9yOiAjMDY1NGFjOworICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKwogLnZlcnNpb24sCiAua2V5aGVscCB7CiAgIGNvbG9yOiAjYTBhZGNjOwpAQCAtMTE4LDYgKzEwNiw5IEBACiAgIHBhZGRpbmc6IDAuMmVtIDAuMmVtIDAuMmVtIDAuNWVtOwogfQogCisubGluayB7CisgIGN1cnNvcjogcG9pbnRlcjsKK30KIAogLyoqIE1lbnVTY3JlZW4gKiovCiAubWVudVNjcmVlbk1lbnVCYXIgewpAQCAtMTQxLDYgKzEzMiw5IEBACiAgIGJhY2tncm91bmQ6IHNlbGVjdGlvbkNvbG9yOwogfQogCisubWVudUl0ZW0uYWN0aXZlUm93IHsKKyAgYmFja2dyb3VuZDogc2VsZWN0aW9uQ29sb3I7Cit9CiAKIC8qKiBDb21tZW50UGFuZWwgKiovCiAuY29tbWVudFBhbmVsQm9yZGVyIHsKQEAgLTIzNSw2ICsyMjksNyBAQAogICBmb250LXNpemU6IDlwdDsKICAgZGlzcGxheTogaW5saW5lOwogICB3aGl0ZS1zcGFjZTogbm93cmFwOworICBwYWRkaW5nLWxlZnQ6IDZweDsKIH0KIC5tZW51SXRlbSB7CiAgIHBhZGRpbmctbGVmdDogNXB4OwpAQCAtMjUzLDMzICsyNDgsNDYgQEAKIC50b3BtZW51VERnbHVlIHsKICAgd2lkdGg6IDEwMCU7CiB9CisKIC50b3BtZW51TWVudUxlZnQgewogICB3aWR0aDogMzAwcHg7Ci0gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgdG9wTWVudUNvbG9yOwotICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB0b3BNZW51Q29sb3I7Ci0gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB0b3BNZW51Q29sb3I7CisgIGZvbnQtc2l6ZTogOXB0OworICBwYWRkaW5nLXRvcDogNXB4OworICBwYWRkaW5nLWxlZnQ6IDVweDsKKyAgcGFkZGluZy1yaWdodDogNXB4OworICBiYWNrZ3JvdW5kOiBub25lOworICBwb3NpdGlvbjogcmVsYXRpdmU7CisgIHRvcDogMDsKK30KKy50b3BtZW51TWVudUxlZnQgdGJvZHkgdHIgdGQgdGFibGUgeworICBib3JkZXI6IDA7Cit9CisudG9wbWVudU1lbnVMZWZ0IHRib2R5IHRyIHRkIHRhYmxlLmd3dC1UYWJCYXIgeworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI0RERDsKK30KKy50b3BtZW51TWVudUxlZnQgLmd3dC1UZXh0Qm94IHsKKyAgd2lkdGg6IDI1MHB4OworfQorLnRvcG1lbnVNZW51TGVmdCAuZ3d0LUJ1dHRvbiB7CisgIHBhZGRpbmc6IDNweCA2cHg7CiB9CiAudG9wbWVudU1lbnVMZWZ0IC5nd3QtVGFiQmFyRmlyc3QgewogICBkaXNwbGF5OiBub25lOwogfQogLnRvcG1lbnVNZW51TGVmdCAuZ3d0LVRhYkJhckl0ZW0gewogICBtYXJnaW46IDBweDsKLSAgYmFja2dyb3VuZDogdG9wTWVudUNvbG9yOworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgcGFkZGluZy10b3A6IDBweDsKICAgcGFkZGluZy1ib3R0b206IDFweDsKICAgcGFkZGluZy1sZWZ0OiAxZW07CiAgIHBhZGRpbmctcmlnaHQ6IDFlbTsKLSAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgYmxhY2s7Ci19Ci0udG9wbWVudU1lbnVMZWZ0IC5nd3QtVGFiQmFySXRlbS1zZWxlY3RlZCB7Ci0gIGJhY2tncm91bmQ6IHNlbGVjdGlvbkNvbG9yOwogfQogLnRvcG1lbnVNZW51TGVmdCAuZ3d0LVRhYkJhclJlc3QgewotICBiYWNrZ3JvdW5kOiB0b3BNZW51Q29sb3I7CisgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICBwYWRkaW5nLXRvcDogMHB4OwogfQogLnRvcG1lbnVNZW51TGVmdCAuZ3d0LVRhYlBhbmVsQm90dG9tIHsKLSAgYmFja2dyb3VuZDogdG9wTWVudUNvbG9yOworICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgYm9yZGVyLXRvcDogbm9uZTsKICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgIGJvcmRlci1yaWdodDogbm9uZTsKQEAgLTI5NywyMSArMzA1LDM3IEBACiAgIHRleHQtYWxpZ246IHJpZ2h0OwogfQogLm1lbnVCYXJVc2VyTmFtZSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwogICBwYWRkaW5nLWxlZnQ6IDVweDsKICAgcGFkZGluZy1yaWdodDogNXB4OwogICB3aGl0ZS1zcGFjZTogbm93cmFwOwogfQorLm1lbnVCYXJVc2VyTmFtZUF2YXRhciB7CisgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cit9CisubWVudUJhclVzZXJOYW1lRm9jdXNQYW5lbCB7CisgIGRpc3BsYXk6IGlubGluZTsKK30KKy5tZW51QmFyVXNlck5hbWVQYW5lbCB7CisgIGRpc3BsYXk6IGlubGluZTsKKyAgY3Vyc29yOiBwb2ludGVyOworICBmb250LXdlaWdodDogYm9sZDsKK30KKy51c2VySW5mb1BvcHVwIHsKKyAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CisgIGJhY2tncm91bmQ6IHdoaXRlOworICBib3gtc2hhZG93OiAzcHggM3B4IDVweCAjODg4OworfQogLnNlYXJjaFBhbmVsIHsKICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgZGlzcGxheTogaW5saW5lOwogfQogLnNlYXJjaFBhbmVsIC5nd3QtVGV4dEJveCB7Ci0gIGZvbnQtc2l6ZTogN3B0OworICBmb250LXNpemU6IDlwdDsKIH0KIC5zZWFyY2hQYW5lbCAuZ3d0LUJ1dHRvbiB7Ci0gIGZvbnQtc2l6ZTogN3B0OworICBmb250LXNpemU6IDlwdDsKICAgbWFyZ2luLWxlZnQ6IDJweDsKLSAgcGFkZGluZzogMXB4OworICBwYWRkaW5nOiAzcHggNnB4OwogfQogCiAvKiogUlBDIFN0YXR1cyAqKi8KQEAgLTMyMyw2ICszNDcsNyBAQAogfQogCiAucnBjU3RhdHVzIHsKKyAgcG9zaXRpb246IGZpeGVkOwogICBwYWRkaW5nLXRvcDogNHB4OwogICBwYWRkaW5nLWJvdHRvbTogNHB4OwogICBwYWRkaW5nLWxlZnQ6IDEwcHg7CkBAIC00ODksNiArNTE0LDEyIEBACiAgIHBhZGRpbmctcmlnaHQ6IDVweDsKICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdHJpbUNvbG9yOwogICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJpbUNvbG9yOworICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworICBoZWlnaHQ6IDIwcHg7Cit9CisKKy5jaGFuZ2VUYWJsZSBhLmd3dC1JbmxpbmVIeXBlcmxpbmsgeworICBjb2xvcjogIzIyMiAhaW1wb3J0YW50OwogfQogCiAuYWNjb3VudERhc2hib2FyZC5jaGFuZ2VUYWJsZSB0ciB7CkBAIC01MTAsMjAgKzU0MSwxMyBAQAogICBiYWNrZ3JvdW5kOiBzZWxlY3Rpb25Db2xvciAhaW1wb3J0YW50OwogfQogCi0uY2hhbmdlVGFibGUgLmNJRCB7Ci0gIHdpZHRoOiAzLjVlbTsKLX0KLS5jaGFuZ2VUYWJsZSAuZGF0YUNlbGwuY0lEIHsKLSAgZm9udC1mYW1pbHk6IG1vbm8tZm9udDsKLX0KLQogLmNoYW5nZVRhYmxlIC5jU1VCSkVDVCBkaXYgewogICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKIH0KIAotLmNoYW5nZVRhYmxlIC5jUFJPSkVDVCB7CisuY2hhbmdlVGFibGUgLmNPV05FUiB7CiAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiB9CiAKQEAgLTYwMSw2ICs2MjUsMTEgQEAKICAgbWFyZ2luLXJpZ2h0OiAxZW07CiB9CiAKKy5yZXZpZXdlZFBhbmVsQm90dG9tIHsKKyAgZmxvYXQ6IHJpZ2h0OworICBmb250LXNpemU6IHNtYWxsOworfQorCiAKIC8qKiBQYXRjaENvbnRlbnRUYWJsZSAqKi8KIC5wYXRjaENvbnRlbnRUYWJsZSB7CkBAIC02MjYsNiArNjU1LDExIEBACiAucGF0Y2hDb250ZW50VGFibGUgLmRpZmZUZXh0IHsKICAgd2hpdGUtc3BhY2U6IHByZTsKICAgcGFkZGluZy1sZWZ0OiAwLjJlbTsKKyAgYm9yZGVyLWxlZnQ6IHRoaW4gc29saWQgI2IwYmRjYzsKK30KKworLnBhdGNoQ29udGVudFRhYmxlIC5kaWZmVGV4dEZvckJpbmFyeUluU2lkZUJ5U2lkZSB7Cisgd2lkdGg6IDUwJTsKIH0KIAogLnBhdGNoQ29udGVudFRhYmxlIC5kaWZmVGV4dEZpbGVIZWFkZXIgewpAQCAtNjU1LDEzICs2ODksMTggQEAKIC5wYXRjaENvbnRlbnRUYWJsZSB0ci5jb21tZW50SG9sZGVyIC5pY29uQ2VsbCB7CiAgIGJhY2tncm91bmQ6IHdoaXRlOwogfQorLnBhdGNoQ29udGVudFRhYmxlIHRyLmNvbW1lbnRIb2xkZXIgLmljb25DZWxsT2ZGaWxlQ29tbWVudFJvdyB7CisgIGJhY2tncm91bmQ6IHRyaW1Db2xvcjsKK30KIC5wYXRjaENvbnRlbnRUYWJsZSB0ZC5jb21tZW50SG9sZGVyIHsKICAgcGFkZGluZy1sZWZ0OiAwOwogICBwYWRkaW5nLXJpZ2h0OiAwOwogICBib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7Ci0gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgYmxhY2s7CiAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIGJsYWNrOwogfQorLnBhdGNoQ29udGVudFRhYmxlIHRkLmNvbW1lbnRIb2xkZXJMZWZ0bW9zdCB7CisgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgYmxhY2s7Cit9CiAucGF0Y2hDb250ZW50VGFibGUgdGQuY29tbWVudEhvbGRlci5jb21tZW50UGFuZWxMYXN0IHsKICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOwogfQpAQCAtNjg0LDggKzcyMyw4IEBACiAubGluZU51bWJlciB7CiAgIHBhZGRpbmctbGVmdDogMC4yZW07CiAgIHdoaXRlLXNwYWNlOiBwcmU7Ci0gIHdpZHRoOiAzLjVlbTsKLSAgdGV4dC1hbGlnbjogcmlnaHQ7CisgIHdpZHRoOiAxLjVlbTsKKyAgdGV4dC1hbGlnbjogY2VudGVyOwogICBwYWRkaW5nLXJpZ2h0OiAwLjJlbTsKICAgYmFja2dyb3VuZDogd2hpdGU7CiAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB3aGl0ZTsKQEAgLTY5Myw2ICs3MzIsOSBAQAogLmxpbmVOdW1iZXIucmlnaHRtb3N0IHsKICAgYm9yZGVyLWxlZnQ6IHRoaW4gc29saWQgI2IwYmRjYzsKIH0KKy5saW5lTnVtYmVyLnJpZ2h0Qm9yZGVyIHsKKyAgYm9yZGVyLXJpZ2h0OiB0aGluIHNvbGlkICNiMGJkY2M7Cit9CiAubGluZU51bWJlciBhIHsKICAgY29sb3I6ICM4ODg7CiAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKQEAgLTcwMyw2ICs3NDUsOSBAQAogICBmb250LXdlaWdodDogYm9sZDsKICAgdGV4dC1hbGlnbjogY2VudGVyOwogfQorLnBhdGNoQ29udGVudFRhYmxlIHRkLmZpbGVDb2x1bW5IZWFkZXIudW5pZmllZFRhYmxlSGVhZGVyIHsKKyAgdGV4dC1hbGlnbjogbGVmdDsKK30KIC5saW5lTnVtYmVyLmZpbGVDb2x1bW5IZWFkZXIgewogICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdHJpbUNvbG9yOwogfQpAQCAtNzcwLDYgKzgxNSwxMSBAQAogICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKIH0KIAorLnBhdGNoQ29udGVudFRhYmxlIHRkLmNlbGxzTmV4dFRvRmlsZUNvbW1lbnQgeworICBiYWNrZ3JvdW5kOiB0cmltQ29sb3I7CisgIGJvcmRlci10b3A6IHRyaW1Db2xvcjsKKyAgYm9yZGVyLWJvdHRvbTogdHJpbUNvbG9yOworfQogLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgLmljb25DZWxsLAogLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgLmxpbmVOdW1iZXIgewogICBiYWNrZ3JvdW5kOiBzZWxlY3Rpb25Db2xvcjsKQEAgLTc3OCwxMyArODI4LDIyIEBACiAucGF0Y2hDb250ZW50VGFibGUgLmFjdGl2ZVJvdyAubGluZU51bWJlciwKIC5wYXRjaENvbnRlbnRUYWJsZSAuYWN0aXZlUm93IC5maWxlTGluZSwKIC5wYXRjaENvbnRlbnRUYWJsZSAuYWN0aXZlUm93IC5kaWZmVGV4dCwKKy5wYXRjaENvbnRlbnRUYWJsZSAuYWN0aXZlUm93IHRkLmNvbW1lbnRIb2xkZXIsCiAucGF0Y2hDb250ZW50VGFibGUgLmFjdGl2ZVJvdyAud2RjLAogLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgLndkZCwKIC5wYXRjaENvbnRlbnRUYWJsZSAuYWN0aXZlUm93IC53ZGksCisucGF0Y2hDb250ZW50VGFibGUgLmFjdGl2ZVJvdyAuaWNvbkNlbGxPZkZpbGVDb21tZW50Um93LAogLnBhdGNoQ29udGVudFRhYmxlIC5hY3RpdmVSb3cgdGQuY29tbWVudEhvbGRlci5jb21tZW50UGFuZWxMYXN0ICB7CiAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibHVlOwogfQogCisucGF0Y2hDb250ZW50VGFibGUgLmZpbGVDb21tZW50Qm9yZGVyIC5pY29uQ2VsbE9mRmlsZUNvbW1lbnRSb3csCisucGF0Y2hDb250ZW50VGFibGUgLmZpbGVDb21tZW50Qm9yZGVyIC5saW5lTnVtYmVyLAorLnBhdGNoQ29udGVudFRhYmxlIC5maWxlQ29tbWVudEJvcmRlciAuZGlmZlRleHQgeworICBoZWlnaHQ6IDIwcHg7CisgIGJhY2tncm91bmQ6IHRyaW1Db2xvcjsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHRyaW1Db2xvcjsKK30KIAogLyoqIENoYW5nZSAqKi8KIC5jaGFuZ2VTY3JlZW5TdGFySWNvbiB7CkBAIC04MjEsMTAgKzg4MCwxMSBAQAogICBtYXJnaW4tbGVmdDogMTBweDsKIH0KIAotLmNoYW5nZVNjcmVlbkRlc2NyaXB0aW9uIHsKKy5jaGFuZ2VTY3JlZW5EZXNjcmlwdGlvbiwKKy5jaGFuZ2VTY3JlZW5EZXNjcmlwdGlvbiB0ZXh0YXJlYSB7CiAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgIGZvbnQtZmFtaWx5OiBtb25vLWZvbnQ7Ci0gIGZvbnQtc2l6ZTogOHB0OworICBmb250LXNpemU6IDlwdDsKIH0KIC5jaGFuZ2VTY3JlZW5EZXNjcmlwdGlvbiBwIHsKICAgbWFyZ2luLXRvcDogMHB4OwpAQCAtODYxLDYgKzkyMSwxNCBAQAogICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB0cmltQ29sb3I7CiB9CiAKKy5zaWRlQnlTaWRlVGFibGVCaW5hcnlIZWFkZXIgeworICBib3JkZXItcmlnaHQ6IHRoaW4gc29saWQgI2IwYmRjYzsKKyAgYm9yZGVyLWxlZnQ6ICB0aGluIHNvbGlkICNiMGJkY2M7CisgIHdpZHRoOiAxMDAlOworICBjb2xvcjogZ3JleTsKKyAgZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKIC5pbmZvVGFibGUgdGQuYXBwcm92YWxyb2xlIHsKICAgd2lkdGg6IDVlbTsKICAgYm9yZGVyLWxlZnQ6IG5vbmU7CkBAIC04NzEsNiArOTM5LDkgQEAKIC5pbmZvVGFibGUgdGQuYXBwcm92YWxzY29yZSB7CiAgIHRleHQtYWxpZ246IGNlbnRlcjsKIH0KKy5pbmZvVGFibGUgdGQubm90Vm90YWJsZSB7CisgIGJhY2tncm91bmQ6ICNGNUY1RjU7Cit9CiAuaW5mb1RhYmxlIHRkLm5lZ3Njb3JlIHsKICAgY29sb3I6IHJlZDsKIH0KQEAgLTg4OCw2ICs5NTksMTQgQEAKICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogfQogCisuY2hhbmdlSW5mb1RvcGljUGFuZWwgaW1nIHsKKyAgZmxvYXQ6IHJpZ2h0OworfQorCisuY2hhbmdlSW5mb1RvcGljUGFuZWwgYSB7CisgIGZsb2F0OiBsZWZ0OworfQorCiAuaW5mb0Jsb2NrIHsKICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgYm9yZGVyLXNwYWNpbmc6IDA7CkBAIC05MDEsNiArOTgwLDExIEBACiAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiB9CiAKKy5pbmZvQmxvY2sgdGQgdGQgeworICBwYWRkaW5nLWxlZnQ6IDBweDsKKyAgYm9yZGVyLXJpZ2h0OiAwcHg7Cit9CisKIC5pbmZvQmxvY2sgdGQudG9wbW9zdCB7CiAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmltQ29sb3I7CiB9CkBAIC0xMDQ0LDYgKzExMjgsMTMgQEAKICAgcGFkZGluZy1sZWZ0OiAwcHg7CiB9CiAKKy8qKiBVbmlmaWVkU2NyZWVuICoqLworLnVuaWZpZWRUYWJsZSB7CisgIHdpZHRoOiAxMDAlOworICBib3JkZXI6IDFweCBzb2xpZCAjQjBCRENDOworICBkaXNwbGF5OiB0YWJsZTsKK30KKwogLyoqIFNpZGVCeVNpZGVTY3JlZW4gKiovCiAuc2lkZUJ5U2lkZVNjcmVlblNpZGVCeVNpZGVUYWJsZSB7CiAgIHdpZHRoOiAxMDAlOwpAQCAtMTA2OCw2ICsxMTU5LDggQEAKICAgbWFyZ2luLWxlZnQ6IDFlbTsKICAgbWFyZ2luLXJpZ2h0OiA1ZW07CiAgIGZvbnQtd2VpZ2h0OiBib2xkOworICBmb250LXNpemU6IG1lZGl1bTsKKyAgZm9udC1mYW1pbHk6IEFyaWFsIFVuaWNvZGU7CiB9CiAKIC8qKiBQYXRjaCBIaXN0b3J5IFRhYmxlICoqLwpAQCAtMTE0MywxMiArMTIzNiwyNyBAQAogICBjb2xvcjogZ3JleTsKIH0KIAorLmFkZEJyYW5jaCB7CisgIG1hcmdpbi10b3A6IDEwcHg7CisgIGJhY2tncm91bmQtY29sb3I6IHRyaW1Db2xvcjsKKyAgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OworfQorCiAuYWRkU3NoS2V5UGFuZWwgewogICBtYXJnaW4tdG9wOiAxMHB4OwogICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmltQ29sb3I7CiAgIHBhZGRpbmc6IDVweCA1cHggNXB4IDVweDsKIH0KIAorLmFkZFNzaEtleVBhbmVsIG9sIHsKKyAgbWFyZ2luLXRvcDogMHB4OworICBtYXJnaW4tYm90dG9tOiA1cHg7Cit9CisKKy5hZGRTc2hLZXlQYW5lbCB0ZCB7CisgIHdpZHRoOiAxMDAlOworfQorCiAuY3JlYXRlR3JvdXBMaW5rIHsKICAgbWFyZ2luLWJvdHRvbTogMTBweDsKIH0KQEAgLTEyMzgsMTAgKzEzNDYsMTAgQEAKICAgd2lkdGg6IDQ1ZW07CiB9CiAKLS5wcm9qZWN0QWRtaW5BcHByb3ZhbENhdGVnb3J5UmFuZ2VMaW5lIHsKKy5wcm9qZWN0QWRtaW5MYWJlbFJhbmdlTGluZSB7CiAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiB9Ci0ucHJvamVjdEFkbWluQXBwcm92YWxDYXRlZ29yeVZhbHVlIHsKKy5wcm9qZWN0QWRtaW5MYWJlbFZhbHVlIHsKICAgZm9udC1mYW1pbHk6IG1vbm8tZm9udDsKICAgZm9udC1zaXplOiBzbWFsbDsKIH0KQEAgLTEyNTMsNyArMTM2MSw3IEBACiAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICB3aGl0ZS1zcGFjZTogbm93cmFwOwogfQotLnB1Ymxpc2hDb21tZW50c1NjcmVlbiAuYXBwcm92YWxDYXRlZ29yeUxpc3QgeworLnB1Ymxpc2hDb21tZW50c1NjcmVlbiAubGFiZWxMaXN0IHsKICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgIGJhY2tncm91bmQ6IHRyaW1Db2xvcjsKQEAgLTEyNjksNyArMTM3Nyw3IEBACiAucHVibGlzaENvbW1lbnRzU2NyZWVuIC5jb3Zlck1lc3NhZ2UgdGV4dGFyZWEgewogICBmb250LXNpemU6IHNtYWxsOwogfQotLnB1Ymxpc2hDb21tZW50c1NjcmVlbiAuYXBwcm92YWxDYXRlZ29yeUxpc3QgLmd3dC1SYWRpb0J1dHRvbiB7CisucHVibGlzaENvbW1lbnRzU2NyZWVuIC5sYWJlbExpc3QgLmd3dC1SYWRpb0J1dHRvbiB7CiAgIGZvbnQtc2l6ZTogc21hbGxlcjsKIH0KIC5wdWJsaXNoQ29tbWVudHNTY3JlZW4gLnBhdGNoQ29tbWVudHMgewpAQCAtMTM1Nyw5ICsxNDY1LDYgQEAKIC5ncm91cE93bmVyVGV4dEJveCB7CiAgIG1hcmdpbi1ib3R0b206IDJweDsKIH0KLS5ncm91cFR5cGVQYW5lbCB7Ci0gIG1hcmdpbi1ib3R0b206IDNweDsKLX0KIC5ncm91cFR5cGVTZWxlY3RMaXN0Qm94IHsKICAgbWFyZ2luLWJvdHRvbTogMnB4OwogfQpAQCAtMTM5NywzICsxNTAyLDE0IEBACiAvKiogUGx1Z2luTGlzdFNjcmVlbiAqKi8KIC5wbHVnaW5zVGFibGUgewogfQorCisvKiogUHJvamVjdExpc3RTY3JlZW4gKiovCisucHJvamVjdEZpbHRlclBhbmVsIHsKKyAgbWFyZ2luLWJvdHRvbTogMTBweDsKK30KKy5wcm9qZWN0RmlsdGVyUGFuZWwgaW5wdXQgeworICB3aWR0aDogMjAwcHg7Cit9CisucHJvamVjdEZpbHRlckxhYmVsIHsKKyAgbWFyZ2luLXJpZ2h0OiA1cHg7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwQXBpLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwQXBpLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIxNzhmMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvR3JvdXBBcGkuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ncm91cHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuVm9pZFJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZVN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2Ygc3RhdGljIG1ldGhvZHMgd2hpY2ggd29yayBvbiB0aGUgR2Vycml0IFJFU1QgQVBJIGZvciBzcGVjaWZpYworICogZ3JvdXBzLgorICovCitwdWJsaWMgY2xhc3MgR3JvdXBBcGkgeworICAvKiogQ3JlYXRlIGEgbmV3IGdyb3VwICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVHcm91cChTdHJpbmcgZ3JvdXBOYW1lLCBBc3luY0NhbGxiYWNrPEdyb3VwSW5mbz4gY2IpIHsKKyAgICBKYXZhU2NyaXB0T2JqZWN0IGluID0gSmF2YVNjcmlwdE9iamVjdC5jcmVhdGVPYmplY3QoKTsKKyAgICBuZXcgUmVzdEFwaSgiL2dyb3Vwcy8iKS5pZChncm91cE5hbWUpLmlmTm9uZU1hdGNoKCkucHV0KGluLCBjYik7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0R3JvdXBEZXRhaWwoU3RyaW5nIGdyb3VwLCBBc3luY0NhbGxiYWNrPEdyb3VwSW5mbz4gY2IpIHsKKyAgICBncm91cChncm91cCkudmlldygiZGV0YWlsIikuZ2V0KGNiKTsKKyAgfQorCisgIC8qKiBHZXQgdGhlIG5hbWUgb2YgYSBncm91cCAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgZ2V0R3JvdXBOYW1lKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgQXN5bmNDYWxsYmFjazxOYXRpdmVTdHJpbmc+IGNiKSB7CisgICAgZ3JvdXAoZ3JvdXApLnZpZXcoIm5hbWUiKS5nZXQoY2IpOworICB9CisKKyAgLyoqIENoZWNrIGlmIHRoZSBjdXJyZW50IHVzZXIgaXMgb3duZXIgb2YgYSBncm91cCAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgaXNHcm91cE93bmVyKFN0cmluZyBncm91cE5hbWUsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Qm9vbGVhbj4gY2IpIHsKKyAgICBHcm91cE1hcC5teU93bmVkKGdyb3VwTmFtZSwgbmV3IEFzeW5jQ2FsbGJhY2s8R3JvdXBNYXA+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoR3JvdXBNYXAgcmVzdWx0KSB7CisgICAgICAgIGNiLm9uU3VjY2VzcyghcmVzdWx0LmlzRW1wdHkoKSk7CisgICAgICB9CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgIGNiLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgLyoqIFJlbmFtZSBhIGdyb3VwICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWVHcm91cChBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIFN0cmluZyBuZXdOYW1lLCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNiKSB7CisgICAgR3JvdXBJbnB1dCBpbiA9IEdyb3VwSW5wdXQuY3JlYXRlKCk7CisgICAgaW4ubmFtZShuZXdOYW1lKTsKKyAgICBncm91cChncm91cCkudmlldygibmFtZSIpLnB1dChpbiwgY2IpOworICB9CisKKyAgLyoqIFNldCBkZXNjcmlwdGlvbiBmb3IgYSBncm91cCAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0R3JvdXBEZXNjcmlwdGlvbihBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYikgeworICAgIFJlc3RBcGkgY2FsbCA9IGdyb3VwKGdyb3VwKS52aWV3KCJkZXNjcmlwdGlvbiIpOworICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFkZXNjcmlwdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgIEdyb3VwSW5wdXQgaW4gPSBHcm91cElucHV0LmNyZWF0ZSgpOworICAgICAgaW4uZGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworICAgICAgY2FsbC5wdXQoaW4sIGNiKTsKKyAgICB9IGVsc2UgeworICAgICAgY2FsbC5kZWxldGUoY2IpOworICAgIH0KKyAgfQorCisgIC8qKiBTZXQgb3duZXIgZm9yIGEgZ3JvdXAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldEdyb3VwT3duZXIoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXAsCisgICAgICBTdHJpbmcgb3duZXIsIEFzeW5jQ2FsbGJhY2s8R3JvdXBJbmZvPiBjYikgeworICAgIEdyb3VwSW5wdXQgaW4gPSBHcm91cElucHV0LmNyZWF0ZSgpOworICAgIGluLm93bmVyKG93bmVyKTsKKyAgICBncm91cChncm91cCkudmlldygib3duZXIiKS5wdXQoaW4sIGNiKTsKKyAgfQorCisgIC8qKiBTZXQgdGhlIG9wdGlvbnMgZm9yIGEgZ3JvdXAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIHNldEdyb3VwT3B0aW9ucyhBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIGJvb2xlYW4gaXNWaXNpYmxlVG9BbGwsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2IpIHsKKyAgICBHcm91cE9wdGlvbnNJbnB1dCBpbiA9IEdyb3VwT3B0aW9uc0lucHV0LmNyZWF0ZSgpOworICAgIGluLnZpc2libGVUb0FsbChpc1Zpc2libGVUb0FsbCk7CisgICAgZ3JvdXAoZ3JvdXApLnZpZXcoIm9wdGlvbnMiKS5wdXQoaW4sIGNiKTsKKyAgfQorCisgIC8qKiBBZGQgbWVtYmVyIHRvIGEgZ3JvdXAuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRNZW1iZXIoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXAsIFN0cmluZyBtZW1iZXIsCisgICAgICBBc3luY0NhbGxiYWNrPEFjY291bnRJbmZvPiBjYikgeworICAgIG1lbWJlcnMoZ3JvdXApLmlkKG1lbWJlcikucHV0KGNiKTsKKyAgfQorCisgIC8qKiBBZGQgbWVtYmVycyB0byBhIGdyb3VwLiAqLworICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkTWVtYmVycyhBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIFNldDxTdHJpbmc+IG1lbWJlcnMsCisgICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPEpzQXJyYXk8QWNjb3VudEluZm8+PiBjYikgeworICAgIGlmIChtZW1iZXJzLnNpemUoKSA9PSAxKSB7CisgICAgICBhZGRNZW1iZXIoZ3JvdXAsCisgICAgICAgICAgbWVtYmVycy5pdGVyYXRvcigpLm5leHQoKSwKKyAgICAgICAgICBuZXcgQXN5bmNDYWxsYmFjazxBY2NvdW50SW5mbz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhBY2NvdW50SW5mbyByZXN1bHQpIHsKKyAgICAgICAgICAgICAgY2Iub25TdWNjZXNzKE5hdGl2ZXMuYXJyYXlPZihyZXN1bHQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoVGhyb3dhYmxlIGNhdWdodCkgeworICAgICAgICAgICAgICBjYi5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgTWVtYmVySW5wdXQgaW5wdXQgPSBNZW1iZXJJbnB1dC5jcmVhdGUoKTsKKyAgICAgIGZvciAoU3RyaW5nIG1lbWJlciA6IG1lbWJlcnMpIHsKKyAgICAgICAgaW5wdXQuYWRkX21lbWJlcihtZW1iZXIpOworICAgICAgfQorICAgICAgbWVtYmVycyhncm91cCkucG9zdChpbnB1dCwgY2IpOworICAgIH0KKyAgfQorCisgIC8qKiBSZW1vdmUgbWVtYmVycyBmcm9tIGEgZ3JvdXAuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVNZW1iZXJzKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgU2V0PEludGVnZXI+IGlkcywgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYikgeworICAgIGlmIChpZHMuc2l6ZSgpID09IDEpIHsKKyAgICAgIG1lbWJlcnMoZ3JvdXApLmlkKGlkcy5pdGVyYXRvcigpLm5leHQoKS50b1N0cmluZygpKS5kZWxldGUoY2IpOworICAgIH0gZWxzZSB7CisgICAgICBNZW1iZXJJbnB1dCBpbiA9IE1lbWJlcklucHV0LmNyZWF0ZSgpOworICAgICAgZm9yIChJbnRlZ2VyIGlkIDogaWRzKSB7CisgICAgICAgIGluLmFkZF9tZW1iZXIoaWQudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgICBncm91cChncm91cCkudmlldygibWVtYmVycy5kZWxldGUiKS5wb3N0KGluLCBjYik7CisgICAgfQorICB9CisKKyAgLyoqIEluY2x1ZGUgYSBncm91cCBpbnRvIGEgZ3JvdXAuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbmNsdWRlZEdyb3VwKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLCBTdHJpbmcgaW5jbHVkZSwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8R3JvdXBJbmZvPiBjYikgeworICAgIGdyb3Vwcyhncm91cCkuaWQoaW5jbHVkZSkucHV0KGNiKTsKKyAgfQorCisgIC8qKiBJbmNsdWRlIGdyb3VwcyBpbnRvIGEgZ3JvdXAuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbmNsdWRlZEdyb3VwcyhBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIFNldDxTdHJpbmc+IGluY2x1ZGVkR3JvdXBzLAorICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxKc0FycmF5PEdyb3VwSW5mbz4+IGNiKSB7CisgICAgaWYgKGluY2x1ZGVkR3JvdXBzLnNpemUoKSA9PSAxKSB7CisgICAgICBhZGRJbmNsdWRlZEdyb3VwKGdyb3VwLAorICAgICAgICAgIGluY2x1ZGVkR3JvdXBzLml0ZXJhdG9yKCkubmV4dCgpLAorICAgICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPEdyb3VwSW5mbz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhHcm91cEluZm8gcmVzdWx0KSB7CisgICAgICAgICAgICAgIGNiLm9uU3VjY2VzcyhOYXRpdmVzLmFycmF5T2YocmVzdWx0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgICAgICAgY2Iub25GYWlsdXJlKGNhdWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEluY2x1ZGVkR3JvdXBJbnB1dCBpbnB1dCA9IEluY2x1ZGVkR3JvdXBJbnB1dC5jcmVhdGUoKTsKKyAgICAgIGZvciAoU3RyaW5nIGluY2x1ZGVkR3JvdXAgOiBpbmNsdWRlZEdyb3VwcykgeworICAgICAgICBpbnB1dC5hZGRfZ3JvdXAoaW5jbHVkZWRHcm91cCk7CisgICAgICB9CisgICAgICBncm91cHMoZ3JvdXApLnBvc3QoaW5wdXQsIGNiKTsKKyAgICB9CisgIH0KKworICAvKiogUmVtb3ZlIGluY2x1ZGVkIGdyb3VwcyBmcm9tIGEgZ3JvdXAuICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVJbmNsdWRlZEdyb3VwcyhBY2NvdW50R3JvdXAuVVVJRCBncm91cCwKKyAgICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gaWRzLCBmaW5hbCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNiKSB7CisgICAgaWYgKGlkcy5zaXplKCkgPT0gMSkgeworICAgICAgQWNjb3VudEdyb3VwLlVVSUQgZyA9IGlkcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgIGdyb3Vwcyhncm91cCkuaWQoZy5nZXQoKSkuZGVsZXRlKGNiKTsKKyAgICB9IGVsc2UgeworICAgICAgSW5jbHVkZWRHcm91cElucHV0IGluID0gSW5jbHVkZWRHcm91cElucHV0LmNyZWF0ZSgpOworICAgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBnIDogaWRzKSB7CisgICAgICAgIGluLmFkZF9ncm91cChnLmdldCgpKTsKKyAgICAgIH0KKyAgICAgIGdyb3VwKGdyb3VwKS52aWV3KCJncm91cHMuZGVsZXRlIikucG9zdChpbiwgY2IpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFJlc3RBcGkgbWVtYmVycyhBY2NvdW50R3JvdXAuVVVJRCBncm91cCkgeworICAgIHJldHVybiBncm91cChncm91cCkudmlldygibWVtYmVycyIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBncm91cHMoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXApIHsKKyAgICByZXR1cm4gZ3JvdXAoZ3JvdXApLnZpZXcoImdyb3VwcyIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBncm91cChBY2NvdW50R3JvdXAuVVVJRCBncm91cCkgeworICAgIHJldHVybiBncm91cChncm91cC5nZXQoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBSZXN0QXBpIGdyb3VwKFN0cmluZyBncm91cCkgeworICAgIHJldHVybiBuZXcgUmVzdEFwaSgiL2dyb3Vwcy8iKS5pZChncm91cCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcm91cElucHV0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgICAgZmluYWwgbmF0aXZlIHZvaWQgZGVzY3JpcHRpb24oU3RyaW5nIGQpIC8qLXsgaWYoZCl0aGlzLmRlc2NyaXB0aW9uPWQ7IH0tKi87CisgICAgZmluYWwgbmF0aXZlIHZvaWQgbmFtZShTdHJpbmcgbikgLyoteyBpZihuKXRoaXMubmFtZT1uOyB9LSovOworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIG93bmVyKFN0cmluZyBvKSAvKi17IGlmKG8pdGhpcy5vd25lcj1vOyB9LSovOworCisgICAgc3RhdGljIEdyb3VwSW5wdXQgY3JlYXRlKCkgeworICAgICAgcmV0dXJuIChHcm91cElucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgR3JvdXBJbnB1dCgpIHsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcm91cE9wdGlvbnNJbnB1dCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIHZpc2libGVUb0FsbChib29sZWFuIHYpIC8qLXsgaWYodil0aGlzLnZpc2libGVfdG9fYWxsPXY7IH0tKi87CisKKyAgICBzdGF0aWMgR3JvdXBPcHRpb25zSW5wdXQgY3JlYXRlKCkgeworICAgICAgcmV0dXJuIChHcm91cE9wdGlvbnNJbnB1dCkgY3JlYXRlT2JqZWN0KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEdyb3VwT3B0aW9uc0lucHV0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lbWJlcklucHV0IGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdCB7CisgICAgZmluYWwgbmF0aXZlIHZvaWQgaW5pdCgpIC8qLXsgdGhpcy5tZW1iZXJzID0gW107IH0tKi87CisgICAgZmluYWwgbmF0aXZlIHZvaWQgYWRkX21lbWJlcihTdHJpbmcgbikgLyoteyB0aGlzLm1lbWJlcnMucHVzaChuKTsgfS0qLzsKKworICAgIHN0YXRpYyBNZW1iZXJJbnB1dCBjcmVhdGUoKSB7CisgICAgICBNZW1iZXJJbnB1dCBtID0gKE1lbWJlcklucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICAgIG0uaW5pdCgpOworICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgcHJvdGVjdGVkIE1lbWJlcklucHV0KCkgeworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluY2x1ZGVkR3JvdXBJbnB1dCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIGluaXQoKSAvKi17IHRoaXMuZ3JvdXBzID0gW107IH0tKi87CisgICAgZmluYWwgbmF0aXZlIHZvaWQgYWRkX2dyb3VwKFN0cmluZyBuKSAvKi17IHRoaXMuZ3JvdXBzLnB1c2gobik7IH0tKi87CisKKyAgICBzdGF0aWMgSW5jbHVkZWRHcm91cElucHV0IGNyZWF0ZSgpIHsKKyAgICAgIEluY2x1ZGVkR3JvdXBJbnB1dCBnID0gKEluY2x1ZGVkR3JvdXBJbnB1dCkgY3JlYXRlT2JqZWN0KCk7CisgICAgICBnLmluaXQoKTsKKyAgICAgIHJldHVybiBnOworICAgIH0KKworICAgIHByb3RlY3RlZCBJbmNsdWRlZEdyb3VwSW5wdXQoKSB7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwSW5mby5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRhYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cEluZm8uamF2YQpAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3VwczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKKworcHVibGljIGNsYXNzIEdyb3VwSW5mbyBleHRlbmRzIEphdmFTY3JpcHRPYmplY3QgeworICBwdWJsaWMgZmluYWwgQWNjb3VudEdyb3VwLklkIGdldEdyb3VwSWQoKSB7CisgICAgcmV0dXJuIG5ldyBBY2NvdW50R3JvdXAuSWQoZ3JvdXBfaWQoKSk7CisgIH0KKworICBwdWJsaWMgZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgZ2V0R3JvdXBVVUlEKCkgeworICAgIHJldHVybiBuZXcgQWNjb3VudEdyb3VwLlVVSUQoVVJMLmRlY29kZVBhdGhTZWdtZW50KGlkKCkpKTsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGlkKCkgLyoteyByZXR1cm4gdGhpcy5pZDsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgbmFtZSgpIC8qLXsgcmV0dXJuIHRoaXMubmFtZTsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBHcm91cE9wdGlvbnNJbmZvIG9wdGlvbnMoKSAvKi17IHJldHVybiB0aGlzLm9wdGlvbnM7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIGRlc2NyaXB0aW9uKCkgLyoteyByZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgdXJsKCkgLyoteyByZXR1cm4gdGhpcy51cmw7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgU3RyaW5nIG93bmVyKCkgLyoteyByZXR1cm4gdGhpcy5vd25lcjsgfS0qLzsKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSB2b2lkIG93bmVyKFN0cmluZyBvKSAvKi17IGlmKG8pdGhpcy5vd25lcj1vOyB9LSovOworICBwdWJsaWMgZmluYWwgbmF0aXZlIEpzQXJyYXk8QWNjb3VudEluZm8+IG1lbWJlcnMoKSAvKi17IHJldHVybiB0aGlzLm1lbWJlcnM7IH0tKi87CisgIHB1YmxpYyBmaW5hbCBuYXRpdmUgSnNBcnJheTxHcm91cEluZm8+IGluY2x1ZGVzKCkgLyoteyByZXR1cm4gdGhpcy5pbmNsdWRlczsgfS0qLzsKKworICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBpbnQgZ3JvdXBfaWQoKSAvKi17IHJldHVybiB0aGlzLmdyb3VwX2lkOyB9LSovOworICBwcml2YXRlIGZpbmFsIG5hdGl2ZSBTdHJpbmcgb3duZXJfaWQoKSAvKi17IHJldHVybiB0aGlzLm93bmVyX2lkOyB9LSovOworICBwcml2YXRlIGZpbmFsIG5hdGl2ZSB2b2lkIG93bmVyX2lkKFN0cmluZyBvKSAvKi17IGlmKG8pdGhpcy5vd25lcl9pZD1vOyB9LSovOworCisgIHB1YmxpYyBmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBnZXRPd25lclVVSUQoKSB7CisgICAgU3RyaW5nIG93bmVyID0gb3duZXJfaWQoKTsKKyAgICBpZiAob3duZXIgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbmV3IEFjY291bnRHcm91cC5VVUlEKFVSTC5kZWNvZGVQYXRoU2VnbWVudChvd25lcikpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE93bmVyVVVJRChBY2NvdW50R3JvdXAuVVVJRCB1dWlkKSB7CisgICAgb3duZXJfaWQoVVJMLmVuY29kZVBhdGhTZWdtZW50KHV1aWQuZ2V0KCkpKTsKKyAgfQorCisgIHByb3RlY3RlZCBHcm91cEluZm8oKSB7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyb3VwT3B0aW9uc0luZm8gZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgICBwdWJsaWMgZmluYWwgbmF0aXZlIGJvb2xlYW4gaXNWaXNpYmxlVG9BbGwoKSAvKi17IHJldHVybiB0aGlzWyd2aXNpYmxlX3RvX2FsbCddID8gdHJ1ZSA6IGZhbHNlOyB9LSovOworCisgICAgcHJvdGVjdGVkIEdyb3VwT3B0aW9uc0luZm8oKSB7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL0dyb3VwTGlzdC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGU1ZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cExpc3QuamF2YQpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3VwczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKKy8qKiBHcm91cHMgYXZhaWxhYmxlIGZyb20ge0Bjb2RlIC9ncm91cHMvfSBvciB7QGNvZGUgL2FjY291bnRzL3tpZH0vZ3JvdXBzfS4gKi8KK3B1YmxpYyBjbGFzcyBHcm91cExpc3QgZXh0ZW5kcyBKc0FycmF5PEdyb3VwSW5mbz4geworICBwdWJsaWMgc3RhdGljIHZvaWQgbXkoQXN5bmNDYWxsYmFjazxHcm91cExpc3Q+IGNhbGxiYWNrKSB7CisgICAgbmV3IFJlc3RBcGkoIi9hY2NvdW50cy9zZWxmL2dyb3VwcyIpLmdldChjYWxsYmFjayk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5jbHVkZWQoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXAsCisgICAgICBBc3luY0NhbGxiYWNrPEdyb3VwTGlzdD4gY2FsbGJhY2spIHsKKyAgICBuZXcgUmVzdEFwaSgiL2dyb3Vwcy8iKS5pZChncm91cC5nZXQoKSkudmlldygiZ3JvdXBzIikuZ2V0KGNhbGxiYWNrKTsKKyAgfQorCisgIHByb3RlY3RlZCBHcm91cExpc3QoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvR3JvdXBNYXAuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvR3JvdXBNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmEwMGFlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L2dyb3Vwcy9Hcm91cE1hcC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuZ3JvdXBzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5OYXRpdmVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOworCisvKiogR3JvdXBzIGF2YWlsYWJsZSBmcm9tIHtAY29kZSAvZ3JvdXBzL30uICovCitwdWJsaWMgY2xhc3MgR3JvdXBNYXAgZXh0ZW5kcyBOYXRpdmVNYXA8R3JvdXBJbmZvPiB7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBhbGwoQXN5bmNDYWxsYmFjazxHcm91cE1hcD4gY2FsbGJhY2spIHsKKyAgICBncm91cHMoKS5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWF0Y2goU3RyaW5nIG1hdGNoLCBBc3luY0NhbGxiYWNrPEdyb3VwTWFwPiBjYikgeworICAgIGlmIChtYXRjaCA9PSBudWxsIHx8ICIiLmVxdWFscyhtYXRjaCkpIHsKKyAgICAgIGFsbChjYik7CisgICAgfSBlbHNlIHsKKyAgICAgIGdyb3VwcygpLmFkZFBhcmFtZXRlcigibSIsIG1hdGNoKS5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNiKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG15T3duZWQoQXN5bmNDYWxsYmFjazxHcm91cE1hcD4gY2IpIHsKKyAgICBteU93bmVkR3JvdXBzKCkuZ2V0KE5hdGl2ZU1hcC5jb3B5S2V5c0ludG9DaGlsZHJlbihjYikpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG15T3duZWQoU3RyaW5nIGdyb3VwTmFtZSwgQXN5bmNDYWxsYmFjazxHcm91cE1hcD4gY2IpIHsKKyAgICBteU93bmVkR3JvdXBzKCkuYWRkUGFyYW1ldGVyKCJxIiwgZ3JvdXBOYW1lKS5nZXQoCisgICAgICAgIE5hdGl2ZU1hcC5jb3B5S2V5c0ludG9DaGlsZHJlbihjYikpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBteU93bmVkR3JvdXBzKCkgeworICAgIHJldHVybiBncm91cHMoKS5hZGRQYXJhbWV0ZXJUcnVlKCJvd25lZCIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgUmVzdEFwaSBncm91cHMoKSB7CisgICAgcmV0dXJuIG5ldyBSZXN0QXBpKCIvZ3JvdXBzLyIpOworICB9CisKKyAgcHJvdGVjdGVkIEdyb3VwTWFwKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL01lbWJlckxpc3QuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ncm91cHMvTWVtYmVyTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODhhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3JvdXBzL01lbWJlckxpc3QuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50Lmdyb3VwczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkpzQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKK3B1YmxpYyBjbGFzcyBNZW1iZXJMaXN0IGV4dGVuZHMgSnNBcnJheTxBY2NvdW50SW5mbz4geworICBwdWJsaWMgc3RhdGljIHZvaWQgYWxsKEFjY291bnRHcm91cC5VVUlEIGdyb3VwLAorICAgICAgQXN5bmNDYWxsYmFjazxNZW1iZXJMaXN0PiBjYWxsYmFjaykgeworICAgIG5ldyBSZXN0QXBpKCIvZ3JvdXBzLyIpLmlkKGdyb3VwLmdldCgpKS52aWV3KCJtZW1iZXJzIikuZ2V0KGNhbGxiYWNrKTsKKyAgfQorCisgIHByb3RlY3RlZCBNZW1iZXJMaXN0KCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvZ3d0X292ZXJyaWRlLmNzcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nd3Rfb3ZlcnJpZGUuY3NzCmluZGV4IGVkMGIzMmMuLmY5YThjYzAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nd3Rfb3ZlcnJpZGUuY3NzCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9nd3Rfb3ZlcnJpZGUuY3NzCkBAIC00Miw2ICs0MiwxMiBAQAogICB3aGl0ZS1zcGFjZTogbm93cmFwOwogfQogCisuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhckl0ZW0sCisuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhclJlc3QsCisuZ3d0LVRhYlBhbmVsQm90dG9tIHsKKyAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Cit9CisKIC5nd3QtVGFiQmFyIHsKICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOwogfQpAQCAtNDksMTYgKzU1LDIwIEBACiAgIGRpc3BsYXk6IG5vbmU7CiB9CiAuZ3d0LVRhYkJhciAuZ3d0LVRhYkJhckl0ZW0gewotICBtYXJnaW46IDBweDsKKyAgY29sb3I6ICMzNTM1MzU7CisgIG1hcmdpbjogMDsKICAgYmFja2dyb3VuZDogdHJpbUNvbG9yOwogICBwYWRkaW5nLXRvcDogMC41ZW07CiAgIHBhZGRpbmctYm90dG9tOiAxcHg7CiAgIHBhZGRpbmctbGVmdDogMWVtOwogICBwYWRkaW5nLXJpZ2h0OiAxZW07Ci0gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIGJsYWNrOworICBib3JkZXItYm90dG9tOiAzcHggc29saWQgdHJhbnNwYXJlbnQ7CisgIGJvcmRlci1yaWdodDogMDsKIH0KIC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFySXRlbS1zZWxlY3RlZCB7CisgIGNvbG9yOiAjOTkwMDAwOwogICBiYWNrZ3JvdW5kOiBzZWxlY3Rpb25Db2xvcjsKKyAgYm9yZGVyLWJvdHRvbS1jb2xvcjogIzk5MDAwMDsKIH0KIC5nd3QtVGFiQmFyIC5nd3QtVGFiQmFyUmVzdCB7CiAgIGJhY2tncm91bmQ6IHRyaW1Db2xvcjsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL0Fic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL0Fic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuamF2YQppbmRleCAyNGEyYWU1Li44ZGUzMjUxIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9BYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZS5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIC8vCiAvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIC8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE1LDE3ICsxNSwxOSBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucGF0Y2hlczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5EaXNwYXRjaGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Gb3JtYXRVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuQWNjb3VudEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuUGF0Y2hUYWJsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLkNvbW1lbnRQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuTmF2aWdhdGlvblRhYmxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5OZWVkc1NpZ25JbktleUNvbW1hbmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm9DYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Db21tZW50RGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2NyaXB0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2V0RGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnByZXR0aWZ5LmNsaWVudC5DbGllbnRTaWRlRm9ybWF0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnByZXR0aWZ5LmNvbW1vbi5QcmV0dHlGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLlNwYXJzZUZpbGVDb250ZW50OwpAQCAtMzgsNiArNDAsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQmx1ckhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuRG91YmxlQ2xpY2tFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkRvdWJsZUNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkZvY3VzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5Gb2N1c0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKQEAgLTQ1LDMzICs0OSw0NCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5IYW5kbGVyUmVnaXN0cmF0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkRPTTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FbGVtZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50Lkhpc3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZvY3VzYWJsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5VSU9iamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lkdsb2JhbEtleTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuS2V5Q29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuS2V5Q29tbWFuZFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRWRpdDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlIGV4dGVuZHMgTmF2aWdhdGlvblRhYmxlPE9iamVjdD4KICAgICBpbXBsZW1lbnRzIENvbW1lbnRFZGl0b3JDb250YWluZXIsIEZvY3VzSGFuZGxlciwgQmx1ckhhbmRsZXIgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSX0hFQUQgPSAwOworICBzdGF0aWMgZmluYWwgc2hvcnQgRklMRV9TSURFX0EgPSAoc2hvcnQpIDA7CisgIHN0YXRpYyBmaW5hbCBzaG9ydCBGSUxFX1NJREVfQiA9IChzaG9ydCkgMTsKICAgcHJvdGVjdGVkIFBhdGNoVGFibGUgZmlsZUxpc3Q7CiAgIHByb3RlY3RlZCBBY2NvdW50SW5mb0NhY2hlIGFjY291bnRDYWNoZSA9IEFjY291bnRJbmZvQ2FjaGUuZW1wdHkoKTsKICAgcHJvdGVjdGVkIFBhdGNoLktleSBwYXRjaEtleTsKICAgcHJvdGVjdGVkIFBhdGNoU2V0LklkIGlkU2lkZUE7CiAgIHByb3RlY3RlZCBQYXRjaFNldC5JZCBpZFNpZGVCOwogICBwcm90ZWN0ZWQgYm9vbGVhbiBvbmx5T25lSHVuazsKKyAgcHJvdGVjdGVkIFBhdGNoU2V0U2VsZWN0Qm94IGhlYWRlclNpZGVBOworICBwcm90ZWN0ZWQgUGF0Y2hTZXRTZWxlY3RCb3ggaGVhZGVyU2lkZUI7CisgIHByb3RlY3RlZCBJbWFnZSBpY29uQTsKKyAgcHJvdGVjdGVkIEltYWdlIGljb25COwogCiAgIHByaXZhdGUgZmluYWwgS2V5Q29tbWFuZFNldCBrZXlzQ29tbWVudDsKICAgcHJpdmF0ZSBIYW5kbGVyUmVnaXN0cmF0aW9uIHJlZ0NvbW1lbnQ7CiAgIHByaXZhdGUgZmluYWwgS2V5Q29tbWFuZFNldCBrZXlzT3BlbkJ5RW50ZXI7CiAgIHByaXZhdGUgSGFuZGxlclJlZ2lzdHJhdGlvbiByZWdPcGVuQnlFbnRlcjsKKyAgYm9vbGVhbiBpc0Rpc3BsYXlCaW5hcnk7CiAKICAgcHJvdGVjdGVkIEFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUoKSB7CiAgICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBQcmV2S2V5Q29tbWFuZCgwLCAnaycsIFBhdGNoVXRpbC5DLmxpbmVQcmV2KCkpKTsKQEAgLTEwNSw2ICsxMjAsNTcgQEAKICAgICB0YWJsZS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wYXRjaENvbnRlbnRUYWJsZSgpKTsKICAgfQogCisgIGFic3RyYWN0IHZvaWQgY3JlYXRlRmlsZUNvbW1lbnRFZGl0b3JPblNpZGVBKCk7CisKKyAgYWJzdHJhY3Qgdm9pZCBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUIoKTsKKworICBhYnN0cmFjdCBQYXRjaFNjcmVlbi5UeXBlIGdldFBhdGNoU2NyZWVuVHlwZSgpOworCisgIHByb3RlY3RlZCB2b2lkIGluaXRIZWFkZXJzKFBhdGNoU2NyaXB0IHNjcmlwdCwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7CisgICAgUGF0Y2hTY3JlZW4uVHlwZSB0eXBlID0gZ2V0UGF0Y2hTY3JlZW5UeXBlKCk7CisgICAgaGVhZGVyU2lkZUEgPSBuZXcgUGF0Y2hTZXRTZWxlY3RCb3goUGF0Y2hTZXRTZWxlY3RCb3guU2lkZS5BLCB0eXBlKTsKKyAgICBoZWFkZXJTaWRlQS5kaXNwbGF5KGRldGFpbCwgc2NyaXB0LCBwYXRjaEtleSwgaWRTaWRlQSwgaWRTaWRlQik7CisgICAgaGVhZGVyU2lkZUEuYWRkRG91YmxlQ2xpY2tIYW5kbGVyKG5ldyBEb3VibGVDbGlja0hhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICBpZiAoaGVhZGVyU2lkZUEuaXNGaWxlT3JDb21taXRNZXNzYWdlKCkpIHsKKyAgICAgICAgICBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUEoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIGhlYWRlclNpZGVCID0gbmV3IFBhdGNoU2V0U2VsZWN0Qm94KFBhdGNoU2V0U2VsZWN0Qm94LlNpZGUuQiwgdHlwZSk7CisgICAgaGVhZGVyU2lkZUIuZGlzcGxheShkZXRhaWwsIHNjcmlwdCwgcGF0Y2hLZXksIGlkU2lkZUEsIGlkU2lkZUIpOworICAgIGhlYWRlclNpZGVCLmFkZERvdWJsZUNsaWNrSGFuZGxlcihuZXcgRG91YmxlQ2xpY2tIYW5kbGVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvbkRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGhlYWRlclNpZGVCLmlzRmlsZU9yQ29tbWl0TWVzc2FnZSgpKSB7CisgICAgICAgICAgY3JlYXRlRmlsZUNvbW1lbnRFZGl0b3JPblNpZGVCKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9KTsKKworICAgIC8vIFByZXBhcmUgaWNvbnMuCisgICAgaWNvbkEgPSBuZXcgSW1hZ2UoR2Vycml0LlJFU09VUkNFUy5hZGRGaWxlQ29tbWVudCgpKTsKKyAgICBpY29uQS5zZXRUaXRsZShQYXRjaFV0aWwuQy5hZGRGaWxlQ29tbWVudFRvb2xUaXAoKSk7CisgICAgaWNvbkEuYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluaygpKTsKKyAgICBpY29uQS5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQSgpOworICAgICAgfQorICAgIH0pOworICAgIGljb25CID0gbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMuYWRkRmlsZUNvbW1lbnQoKSk7CisgICAgaWNvbkIuc2V0VGl0bGUoUGF0Y2hVdGlsLkMuYWRkRmlsZUNvbW1lbnRUb29sVGlwKCkpOworICAgIGljb25CLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmsoKSk7CisgICAgaWNvbkIuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUIoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBub3RpZnlEcmFmdERlbHRhKGZpbmFsIGludCBkZWx0YSkgewogICAgIGlmIChmaWxlTGlzdCAhPSBudWxsKSB7CiAgICAgICBmaWxlTGlzdC5ub3RpZnlEcmFmdERlbHRhKHBhdGNoS2V5LCBkZWx0YSk7CkBAIC0xMzcsOCArMjAzLDggQEAKICAgICAgICAgICAgIHAgPSBwLmdldFBhcmVudCgpOwogICAgICAgICAgIH0KIAotICAgICAgICAgIGlmIChHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNvbW1lbnRIb2xkZXIoKS5lcXVhbHMoCi0gICAgICAgICAgICAgIHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKS5nZXRTdHlsZU5hbWUocm93IC0gMSwgY2VsbCkpKSB7CisgICAgICAgICAgaWYgKHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKS5nZXRTdHlsZU5hbWUocm93IC0gMSwgY2VsbCkKKyAgICAgICAgICAgICAgLmNvbnRhaW5zKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY29tbWVudEhvbGRlcigpKSkgewogICAgICAgICAgICAgdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpLmFkZFN0eWxlTmFtZShyb3cgLSAxLCBjZWxsLAogICAgICAgICAgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY29tbWVudFBhbmVsTGFzdCgpKTsKICAgICAgICAgICB9CkBAIC0xNjcsMTIgKzIzMyw0NyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgZGlzcGxheShmaW5hbCBQYXRjaC5LZXkgaywgZmluYWwgUGF0Y2hTZXQuSWQgYSwKLSAgICAgIGZpbmFsIFBhdGNoU2V0LklkIGIsIGZpbmFsIFBhdGNoU2NyaXB0IHMpIHsKKyAgICAgIGZpbmFsIFBhdGNoU2V0LklkIGIsIGZpbmFsIFBhdGNoU2NyaXB0IHMsIGZpbmFsIFBhdGNoU2V0RGV0YWlsIGQpIHsKICAgICBwYXRjaEtleSA9IGs7CiAgICAgaWRTaWRlQSA9IGE7CiAgICAgaWRTaWRlQiA9IGI7CiAKLSAgICByZW5kZXIocyk7CisgICAgcmVuZGVyKHMsIGQpOworICB9CisKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzRGlmZmVyZW5jZXMoUGF0Y2hTY3JpcHQgc2NyaXB0KSB7CisgICAgcmV0dXJuIGhhc0VkaXRzKHNjcmlwdCkgfHwgaGFzTWV0YShzY3JpcHQpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNQdXJlTWV0YUNoYW5nZShQYXRjaFNjcmlwdCBzY3JpcHQpIHsKKyAgICByZXR1cm4gIWhhc0VkaXRzKHNjcmlwdCkgJiYgaGFzTWV0YShzY3JpcHQpOworICB9CisKKyAgLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHBhdGNoIHNldHMKKyAgcHJpdmF0ZSBib29sZWFuIGhhc0VkaXRzKFBhdGNoU2NyaXB0IHNjcmlwdCkgeworICAgIGZvciAoRWRpdCBlIDogc2NyaXB0LmdldEVkaXRzKCkpIHsKKyAgICAgIGlmIChlLmdldFR5cGUoKSAhPSBFZGl0LlR5cGUuRU1QVFkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFRydWUgaWYgdGhpcyBjaGFuZ2UgaXMgYSBtb2RlIGNoYW5nZSBvciBhIHB1cmUgcmVuYW1lL2NvcHkKKyAgcHJpdmF0ZSBib29sZWFuIGhhc01ldGEoUGF0Y2hTY3JpcHQgc2NyaXB0KSB7CisgICAgcmV0dXJuICFzY3JpcHQuZ2V0UGF0Y2hIZWFkZXIoKS5pc0VtcHR5KCk7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmROb0RpZmZlcmVuY2VzKFNhZmVIdG1sQnVpbGRlciBtKSB7CisgICAgbS5vcGVuVHIoKTsKKyAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0QXR0cmlidXRlKCJjb2xzcGFuIiwgNSk7CisgICAgbS5vcGVuRGl2KCk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wYXRjaE5vRGlmZmVyZW5jZSgpKTsKKyAgICBtLmFwcGVuZChQYXRjaFV0aWwuQy5ub0RpZmZlcmVuY2UoKSk7CisgICAgbS5jbG9zZURpdigpOworICAgIG0uY2xvc2VUZCgpOworICAgIG0uY2xvc2VUcigpOwogICB9CiAKICAgcHJvdGVjdGVkIFNwYXJzZUh0bWxGaWxlIGdldFNwYXJzZUh0bWxGaWxlQShQYXRjaFNjcmlwdCBzKSB7CkBAIC0xOTEsMzIgKzI5MiwyNyBAQAogICBwcm90ZWN0ZWQgU3BhcnNlSHRtbEZpbGUgZ2V0U3BhcnNlSHRtbEZpbGVCKFBhdGNoU2NyaXB0IHMpIHsKICAgICBBY2NvdW50RGlmZlByZWZlcmVuY2UgZHAgPSBuZXcgQWNjb3VudERpZmZQcmVmZXJlbmNlKHMuZ2V0RGlmZlByZWZzKCkpOwogCisgICAgU3BhcnNlRmlsZUNvbnRlbnQgYiA9IHMuZ2V0QigpOwogICAgIFByZXR0eUZvcm1hdHRlciBmID0gQ2xpZW50U2lkZUZvcm1hdHRlci5GQUNUT1JZLmdldCgpOwogICAgIGYuc2V0RGlmZlByZWZzKGRwKTsKLSAgICBmLnNldEZpbGVOYW1lKHMuZ2V0QigpLmdldFBhdGgoKSk7CisgICAgZi5zZXRGaWxlTmFtZShiLmdldFBhdGgoKSk7CiAgICAgZi5zZXRFZGl0RmlsdGVyKFByZXR0eUZvcm1hdHRlci5CKTsKICAgICBmLnNldEVkaXRMaXN0KHMuZ2V0RWRpdHMoKSk7CiAKLSAgICBpZiAoZHAuaXNTeW50YXhIaWdobGlnaHRpbmcoKSAmJiBzLmdldEEoKS5pc1dob2xlRmlsZSgpICYmICFzLmdldEIoKS5pc1dob2xlRmlsZSgpKSB7Ci0gICAgICBmLmZvcm1hdChzLmdldEIoKS5hcHBseShzLmdldEEoKSwgcy5nZXRFZGl0cygpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGYuZm9ybWF0KHMuZ2V0QigpKTsKKyAgICBpZiAocy5nZXRBKCkuaXNXaG9sZUZpbGUoKSAmJiAhYi5pc1dob2xlRmlsZSgpKSB7CisgICAgICBiID0gYi5hcHBseShzLmdldEEoKSwgcy5nZXRFZGl0cygpKTsKICAgICB9CisgICAgZi5mb3JtYXQoYik7CiAgICAgcmV0dXJuIGY7CiAgIH0KIAotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW5kZXIoUGF0Y2hTY3JpcHQgc2NyaXB0KTsKKyAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVuZGVyKFBhdGNoU2NyaXB0IHNjcmlwdCwgZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKTsKIAogICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkluc2VydENvbW1lbnQoUGF0Y2hMaW5lIHBsKTsKIAogICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBkaXNwbGF5KENvbW1lbnREZXRhaWwgY29tbWVudHMsIGJvb2xlYW4gZXhwYW5kQ29tbWVudHMpOwogCiAgIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgTXlGbGV4VGFibGUgY3JlYXRlRmxleFRhYmxlKCkgewotICAgIHJldHVybiBuZXcgRG91YmxlQ2xpY2tGbGV4VGFibGUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgT2JqZWN0IGdldFJvd0l0ZW1LZXkoZmluYWwgT2JqZWN0IGl0ZW0pIHsKICAgICByZXR1cm4gbnVsbDsKICAgfQpAQCAtMjQwLDYgKzMzNiw4IEBACiAgICAgICAgIGNhc2UgSU5TRVJUOgogICAgICAgICBjYXNlIFJFUExBQ0U6CiAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgQ09OVEVYVDoKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBDb21tZW50TGlzdCkgewogICAgICAgcmV0dXJuIHRydWU7CkBAIC0zNjUsMTIgKzQ2Myw2IEBACiAgICAgcmV0dXJuIGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIENvbW1lbnRMaXN0OwogICB9CiAKLSAgLyoqIEludm9rZWQgd2hlbiB0aGUgdXNlciBkb3VibGUgY2xpY2tzIG9uIGEgdGFibGUgY2VsbC4gKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25DZWxsRG91YmxlQ2xpY2soaW50IHJvdywgaW50IGNvbHVtbik7Ci0KLSAgLyoqIEludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSB0YWJsZSBjZWxsLiAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkNlbGxTaW5nbGVDbGljayhpbnQgcm93LCBpbnQgY29sdW1uKTsKLQogICAvKioKICAgICogSW52b2tlcyBjcmVhdGVDb21tZW50RWRpdG9yKCkgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYXMgdmFsdWUgZm9yIHRoZSBjb21tZW50CiAgICAqIHBhcmVudCBVVUlELiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IGNhbGxlcnMgdGhhdCB3YW50IHRvIGNyZWF0ZSBhbgpAQCAtMzc5LDcgKzQ3MSw3IEBACiAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbW1lbnRFZGl0b3IoZmluYWwgaW50IHN1Z2dlc3RSb3csIGZpbmFsIGludCBjb2x1bW4sCiAgICAgICBmaW5hbCBpbnQgbGluZSwgZmluYWwgc2hvcnQgZmlsZSkgewogICAgIGlmIChHZXJyaXQuaXNTaWduZWRJbigpKSB7Ci0gICAgICBpZiAoMSA8PSBsaW5lKSB7CisgICAgICBpZiAoUl9IRUFEIDw9IGxpbmUpIHsKICAgICAgICAgZmluYWwgUGF0Y2guS2V5IHBhcmVudEtleTsKICAgICAgICAgZmluYWwgc2hvcnQgc2lkZTsKICAgICAgICAgc3dpdGNoIChmaWxlKSB7CkBAIC00MDYsMTUgKzQ5OCwyMSBAQAogICAgICAgICBuZXdDb21tZW50LnNldFNpZGUoc2lkZSk7CiAgICAgICAgIG5ld0NvbW1lbnQuc2V0TWVzc2FnZSgiIik7CiAKLSAgICAgICAgY3JlYXRlQ29tbWVudEVkaXRvcihzdWdnZXN0Um93LCBjb2x1bW4sIG5ld0NvbW1lbnQpLnNldEZvY3VzKHRydWUpOworICAgICAgICBmaW5kT3JDcmVhdGVDb21tZW50RWRpdG9yKHN1Z2dlc3RSb3csIGNvbHVtbiwgbmV3Q29tbWVudCwgdHJ1ZSkKKyAgICAgICAgICAgIC5zZXRGb2N1cyh0cnVlKTsKICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgR2Vycml0LmRvU2lnbkluKEhpc3RvcnkuZ2V0VG9rZW4oKSk7CiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBDb21tZW50RWRpdG9yUGFuZWwgY3JlYXRlQ29tbWVudEVkaXRvcihmaW5hbCBpbnQgc3VnZ2VzdFJvdywKLSAgICAgIGZpbmFsIGludCBjb2x1bW4sIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgbmV3Q29tbWVudCkgeworICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDdXJzb3IoZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBuZXdDb21tZW50KSB7CisgIH0KKworICBhYnN0cmFjdCB2b2lkIGluc2VydEZpbGVDb21tZW50Um93KGZpbmFsIGludCByb3cpOworCisgIHByaXZhdGUgQ29tbWVudEVkaXRvclBhbmVsIGZpbmRPckNyZWF0ZUNvbW1lbnRFZGl0b3IoZmluYWwgaW50IHN1Z2dlc3RSb3csCisgICAgICBmaW5hbCBpbnQgY29sdW1uLCBmaW5hbCBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQsIGZpbmFsIGJvb2xlYW4gY3JlYXRlKSB7CiAgICAgaW50IHJvdyA9IHN1Z2dlc3RSb3c7CiAgICAgaW50IHNwYW5zW10gPSBuZXcgaW50W2NvbHVtbiArIDFdOwogICAgIEZJTkRfUk9XOiB3aGlsZSAocm93IDwgdGFibGUuZ2V0Um93Q291bnQoKSkgewpAQCAtNDI3LDcgKzUyNSw5IEBACiAgICAgICAgIHNwYW5zW2NvbF0gPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpLmdldFJvd1NwYW4ocm93LCBjZWxsKTsKICAgICAgICAgaWYgKGNvbCA9PSBjb2x1bW4pIHsKICAgICAgICAgICBmaW5hbCBXaWRnZXQgdyA9IHRhYmxlLmdldFdpZGdldChyb3csIGNlbGwpOwotICAgICAgICAgIGlmICh3IGluc3RhbmNlb2YgQ29tbWVudEVkaXRvclBhbmVsKSB7CisgICAgICAgICAgaWYgKHcgaW5zdGFuY2VvZiBDb21tZW50RWRpdG9yUGFuZWwKKyAgICAgICAgICAgICAgJiYgKChDb21tZW50RWRpdG9yUGFuZWwpIHcpLmdldENvbW1lbnQoKS5nZXRLZXkoKS5nZXRQYXJlbnRLZXkoKQorICAgICAgICAgICAgICAgICAgLmVxdWFscyhuZXdDb21tZW50LmdldEtleSgpLmdldFBhcmVudEtleSgpKSkgewogICAgICAgICAgICAgLy8gRG9uJ3QgaW5zZXJ0IHR3byBlZGl0b3JzIG9uIHRoZSBzYW1lIHBvc2l0aW9uLCBpdCBkb2Vzbid0IG1ha2UKICAgICAgICAgICAgIC8vIGFueSBzZW5zZSB0byB0aGUgdXNlci4KICAgICAgICAgICAgIC8vCkBAIC00NDEsNiArNTQxLDcgQEAKICAgICAgICAgICAgICAgYnJlYWsgRklORF9ST1c7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByb3crKzsKKyAgICAgICAgICAgIGNlbGwtLTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnJlYWsgRklORF9ST1c7CiAgICAgICAgICAgfQpAQCAtNDQ4LDcgKzU0OSw3IEBACiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG5ld0NvbW1lbnQgPT0gbnVsbCkgeworICAgIGlmIChuZXdDb21tZW50ID09IG51bGwgfHwgIWNyZWF0ZSkgewogICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCkBAIC00NjksNyArNTcwLDExIEBACiAgICAgICB9CiAgICAgfQogICAgIGlmIChuZWVkSW5zZXJ0IHx8ICFpc0NvbW1lbnRSb3cpIHsKLSAgICAgIGluc2VydFJvdyhyb3cpOworICAgICAgaWYgKG5ld0NvbW1lbnQuZ2V0TGluZSgpID09IFJfSEVBRCkgeworICAgICAgICBpbnNlcnRGaWxlQ29tbWVudFJvdyhyb3cpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5zZXJ0Um93KHJvdyk7CisgICAgICB9CiAgICAgICBzdHlsZUNvbW1lbnRSb3cocm93KTsKICAgICB9CiAgICAgdGFibGUuc2V0V2lkZ2V0KHJvdywgY29sdW1uLCBlZCk7CkBAIC01MDcsNiArNjEyLDcgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICB1cGRhdGVDdXJzb3IobmV3Q29tbWVudCk7CiAgICAgcmV0dXJuIGVkOwogICB9CiAKQEAgLTU0MywyNCArNjQ5LDQwIEBACiAgICAgICB9CiAgICAgfQogICAgIGlmIChyZW1vdmVSb3cpIHsKLSAgICAgIGZvciAoaW50IHIgPSByb3cgLSAxOyAwIDw9IHI7IHItLSkgewotICAgICAgICBib29sZWFuIGRhdGEgPSBmYWxzZTsKLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCB0YWJsZS5nZXRDZWxsQ291bnQocik7IGMrKykgewotICAgICAgICAgIGRhdGEgfD0gdGFibGUuZ2V0V2lkZ2V0KHIsIGMpICE9IG51bGw7Ci0gICAgICAgICAgZmluYWwgaW50IHMgPSB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpLmdldFJvd1NwYW4ociwgYykgLSAxOwotICAgICAgICAgIGlmIChyICsgcyA9PSByb3cpIHsKLSAgICAgICAgICAgIHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuc2V0Um93U3BhbihyLCBjLCBzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkYXRhKSB7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICBkZXN0cm95Q29tbWVudFJvdyhyb3cpOworICAgIH0gZWxzZSB7CisgICAgICBkZXN0cm95Q29tbWVudChyb3csIGNvbCwgc3Bhbik7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveUNvbW1lbnRSb3coaW50IHJvdykgeworICAgIGZvciAoaW50IHIgPSByb3cgLSAxOyAwIDw9IHI7IHItLSkgeworICAgICAgYm9vbGVhbiBkYXRhID0gZmFsc2U7CisgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHRhYmxlLmdldENlbGxDb3VudChyKTsgYysrKSB7CisgICAgICAgIGRhdGEgfD0gdGFibGUuZ2V0V2lkZ2V0KHIsIGMpICE9IG51bGw7CisgICAgICAgIGZpbmFsIGludCBzID0gdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKS5nZXRSb3dTcGFuKHIsIGMpIC0gMTsKKyAgICAgICAgaWYgKHIgKyBzID09IHJvdykgeworICAgICAgICAgIHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuc2V0Um93U3BhbihyLCBjLCBzKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgdGFibGUucmVtb3ZlUm93KHJvdyk7Ci0gICAgfSBlbHNlIGlmIChzcGFuICE9IDEpIHsKKyAgICAgIGlmICghZGF0YSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgdGFibGUucmVtb3ZlUm93KHJvdyk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZGVzdHJveUNvbW1lbnQoaW50IHJvdywgaW50IGNvbCwgaW50IHNwYW4pIHsKKyAgICB0YWJsZS5nZXRGbGV4Q2VsbEZvcm1hdHRlcigpLnNldFN0eWxlTmFtZSgvLworICAgICAgICByb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKKworICAgIGlmIChzcGFuICE9IDEpIHsKICAgICAgIHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuc2V0Um93U3Bhbihyb3csIGNvbCwgMSk7CiAgICAgICBmb3IgKGludCByID0gcm93ICsgMTsgciA8IHJvdyArIHNwYW47IHIrKykgewotICAgICAgICB0YWJsZS5pbnNlcnRDZWxsKHIsIGNvbCArIDEpOworICAgICAgICB0YWJsZS5pbnNlcnRDZWxsKHIsIGNvbCk7CisKKyAgICAgICAgdGFibGUuZ2V0RmxleENlbGxGb3JtYXR0ZXIoKS5zZXRTdHlsZU5hbWUoLy8KKyAgICAgICAgICAgIHIsIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTU3NSw3ICs2OTcsNyBAQAogICAgICAgc3R5bGVMYXN0Q29tbWVudENlbGwocm93LCBjb2wpOwogCiAgICAgfSBlbHNlIHsKLSAgICAgIGZpbmFsIEFjY291bnRJbmZvIGF1dGhvciA9IGFjY291bnRDYWNoZS5nZXQobGluZS5nZXRBdXRob3IoKSk7CisgICAgICBmaW5hbCBBY2NvdW50SW5mbyBhdXRob3IgPSBGb3JtYXRVdGlsLmFzSW5mbyhhY2NvdW50Q2FjaGUuZ2V0KGxpbmUuZ2V0QXV0aG9yKCkpKTsKICAgICAgIGZpbmFsIFB1Ymxpc2hlZENvbW1lbnRQYW5lbCBwYW5lbCA9CiAgICAgICAgICAgbmV3IFB1Ymxpc2hlZENvbW1lbnRQYW5lbChhdXRob3IsIGxpbmUpOwogICAgICAgcGFuZWwuc2V0T3BlbihleHBhbmRDb21tZW50KTsKQEAgLTYzMiw2ICs3NTQsOSBAQAogICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNvbW1lbnRQYW5lbExhc3QoKSk7CiAgICAgZm10LnNldFN0eWxlTmFtZShyb3csIGNvbCwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jb21tZW50SG9sZGVyKCkpOwogICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBjb2wsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY29tbWVudFBhbmVsTGFzdCgpKTsKKyAgICBpZiAoIWZtdC5nZXRTdHlsZU5hbWUocm93LCBjb2wgLSAxKS5jb250YWlucyhHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNvbW1lbnRIb2xkZXIoKSkpIHsKKyAgICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBjb2wsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY29tbWVudEhvbGRlckxlZnRtb3N0KCkpOworICAgIH0KICAgfQogCiAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQ29tbWVudExpc3QgewpAQCAtNjQwLDQyICs3NjUsNiBAQAogICAgICAgICBuZXcgQXJyYXlMaXN0PFB1Ymxpc2hlZENvbW1lbnRQYW5lbD4oKTsKICAgfQogCi0gIHByb3RlY3RlZCBjbGFzcyBEb3VibGVDbGlja0ZsZXhUYWJsZSBleHRlbmRzIE15RmxleFRhYmxlIHsKLSAgICBwdWJsaWMgRG91YmxlQ2xpY2tGbGV4VGFibGUoKSB7Ci0gICAgICBzaW5rRXZlbnRzKEV2ZW50Lk9OREJMQ0xJQ0sgfCBFdmVudC5PTkNMSUNLKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkJyb3dzZXJFdmVudChmaW5hbCBFdmVudCBldmVudCkgewotICAgICAgc3dpdGNoIChET00uZXZlbnRHZXRUeXBlKGV2ZW50KSkgewotICAgICAgICBjYXNlIEV2ZW50Lk9OQ0xJQ0s6IHsKLSAgICAgICAgICAvLyBGaW5kIG91dCB3aGljaCBjZWxsIHdhcyBhY3R1YWxseSBjbGlja2VkLgotICAgICAgICAgIGZpbmFsIEVsZW1lbnQgdGQgPSBnZXRFdmVudFRhcmdldENlbGwoZXZlbnQpOwotICAgICAgICAgIGlmICh0ZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWwgaW50IHJvdyA9IHJvd09mKHRkKTsKLSAgICAgICAgICBpZiAoZ2V0Um93SXRlbShyb3cpICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1vdmVQb2ludGVyVG8ocm93KTsKLSAgICAgICAgICAgIG9uQ2VsbFNpbmdsZUNsaWNrKHJvd09mKHRkKSwgY29sdW1uT2YodGQpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBFdmVudC5PTkRCTENMSUNLOiB7Ci0gICAgICAgICAgLy8gRmluZCBvdXQgd2hpY2ggY2VsbCB3YXMgYWN0dWFsbHkgY2xpY2tlZC4KLSAgICAgICAgICBFbGVtZW50IHRkID0gZ2V0RXZlbnRUYXJnZXRDZWxsKGV2ZW50KTsKLSAgICAgICAgICBpZiAodGQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBvbkNlbGxEb3VibGVDbGljayhyb3dPZih0ZCksIGNvbHVtbk9mKHRkKSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzdXBlci5vbkJyb3dzZXJFdmVudChldmVudCk7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb09wS2V5Q29tbWFuZCBleHRlbmRzIE5lZWRzU2lnbkluS2V5Q29tbWFuZCB7CiAgICAgcHVibGljIE5vT3BLZXlDb21tYW5kKGludCBtYXNrLCBpbnQga2V5LCBTdHJpbmcgaGVscCkgewogICAgICAgc3VwZXIobWFzaywga2V5LCBoZWxwKTsKQEAgLTgwNCwyMiArODkzLDIyIEBACiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlcGx5RWRpdG9yKCkgewogICAgICAgZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBuZXdDb21tZW50ID0gbmV3Q29tbWVudCgpOwogICAgICAgbmV3Q29tbWVudC5zZXRNZXNzYWdlKCIiKTsKLSAgICAgIGNyZWF0ZUVkaXRvcihuZXdDb21tZW50KS5zZXRGb2N1cyh0cnVlKTsKKyAgICAgIGZpbmRPckNyZWF0ZUVkaXRvcihuZXdDb21tZW50LCB0cnVlKS5zZXRGb2N1cyh0cnVlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2FubmVkUmVwbHkoU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgIENvbW1lbnRFZGl0b3JQYW5lbCBwID0gY3JlYXRlRWRpdG9yKG51bGwpOworICAgICAgZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBuZXdDb21tZW50ID0gbmV3Q29tbWVudCgpOworICAgICAgbmV3Q29tbWVudC5zZXRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgQ29tbWVudEVkaXRvclBhbmVsIHAgPSBmaW5kT3JDcmVhdGVFZGl0b3IobmV3Q29tbWVudCwgZmFsc2UpOwogICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICBmaW5hbCBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQgPSBuZXdDb21tZW50KCk7Ci0gICAgICAgIG5ld0NvbW1lbnQuc2V0TWVzc2FnZShtZXNzYWdlKTsKLQogICAgICAgICBlbmFibGVCdXR0b25zKGZhbHNlKTsKICAgICAgICAgUGF0Y2hVdGlsLkRFVEFJTF9TVkMuc2F2ZURyYWZ0KG5ld0NvbW1lbnQsCiAgICAgICAgICAgICBuZXcgR2Vycml0Q2FsbGJhY2s8UGF0Y2hMaW5lQ29tbWVudD4oKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgUGF0Y2hMaW5lQ29tbWVudCByZXN1bHQpIHsKICAgICAgICAgICAgICAgICBlbmFibGVCdXR0b25zKHRydWUpOwogICAgICAgICAgICAgICAgIG5vdGlmeURyYWZ0RGVsdGEoMSk7Ci0gICAgICAgICAgICAgICAgY3JlYXRlRWRpdG9yKHJlc3VsdCkuc2V0T3BlbihmYWxzZSk7CisgICAgICAgICAgICAgICAgZmluZE9yQ3JlYXRlRWRpdG9yKHJlc3VsdCwgdHJ1ZSkuc2V0T3BlbihmYWxzZSk7CiAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTgzNiwxMCArOTI1LDExIEBACiAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBDb21tZW50RWRpdG9yUGFuZWwgY3JlYXRlRWRpdG9yKGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgbmV3Q29tbWVudCkgeworICAgIHByaXZhdGUgQ29tbWVudEVkaXRvclBhbmVsIGZpbmRPckNyZWF0ZUVkaXRvcigKKyAgICAgICAgUGF0Y2hMaW5lQ29tbWVudCBuZXdDb21tZW50LCBib29sZWFuIGNyZWF0ZSkgewogICAgICAgaW50IHJvdyA9IHJvd09mKGdldEVsZW1lbnQoKSk7CiAgICAgICBpbnQgY29sdW1uID0gY29sdW1uT2YoZ2V0RWxlbWVudCgpKTsKLSAgICAgIHJldHVybiBjcmVhdGVDb21tZW50RWRpdG9yKHJvdyArIDEsIGNvbHVtbiwgbmV3Q29tbWVudCk7CisgICAgICByZXR1cm4gZmluZE9yQ3JlYXRlQ29tbWVudEVkaXRvcihyb3cgKyAxLCBjb2x1bW4sIG5ld0NvbW1lbnQsIGNyZWF0ZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBQYXRjaExpbmVDb21tZW50IG5ld0NvbW1lbnQoKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9Db21tZW50RWRpdG9yUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL0NvbW1lbnRFZGl0b3JQYW5lbC5qYXZhCmluZGV4IGIwZDgyNWIuLmI2MDlmMTUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL0NvbW1lbnRFZGl0b3JQYW5lbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL0NvbW1lbnRFZGl0b3JQYW5lbC5qYXZhCkBAIC0xOTgsNiArMTk4LDEwIEBACiAgICAgcmV0dXJuIGNvbW1lbnQuZ2V0S2V5KCkuZ2V0KCkgPT0gbnVsbDsKICAgfQogCisgIHB1YmxpYyBQYXRjaExpbmVDb21tZW50IGdldENvbW1lbnQoKSB7CisgICAgcmV0dXJuIGNvbW1lbnQ7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgb25Eb3VibGVDbGljayhmaW5hbCBEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7CiAgICAgZWRpdCgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hDb25zdGFudHMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoQ29uc3RhbnRzLmphdmEKaW5kZXggNDgwMWU2NS4uOGM5YzU2YiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hDb25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaENvbnN0YW50cy5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAgIFN0cmluZyBwYXRjaEhpc3RvcnlUaXRsZSgpOwogICBTdHJpbmcgZGlzYWJsZWRPbkxhcmdlRmlsZXMoKTsKICAgU3RyaW5nIGludHJhbGluZUZhaWx1cmUoKTsKKyAgU3RyaW5nIGludHJhbGluZVRpbWVvdXQoKTsKICAgU3RyaW5nIGlsbGVnYWxOdW1iZXJPZkNvbHVtbnMoKTsKIAogICBTdHJpbmcgdXBUb0NoYW5nZSgpOwpAQCAtNjcsNiArNjgsOCBAQAogICBTdHJpbmcgcmV2aWV3ZWRBbmQoKTsKICAgU3RyaW5nIG5leHQoKTsKICAgU3RyaW5nIGRvd25sb2FkKCk7CisgIFN0cmluZyBhZGRGaWxlQ29tbWVudFRvb2xUaXAoKTsKKyAgU3RyaW5nIGFkZEZpbGVDb21tZW50QnlEb3VibGVDbGljaygpOwogCiAgIFN0cmluZyBidXR0b25SZXBseURvbmUoKTsKICAgU3RyaW5nIGNhbm5lZFJlcGx5RG9uZSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hDb25zdGFudHMucHJvcGVydGllcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoQ29uc3RhbnRzLnByb3BlcnRpZXMKaW5kZXggMTE4MjNhYy4uNWFjZGI1ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hDb25zdGFudHMucHJvcGVydGllcworKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaENvbnN0YW50cy5wcm9wZXJ0aWVzCkBAIC0xOCw2ICsxOCw3IEBACiBwYXRjaFNldCA9IFBhdGNoIFNldAogZGlzYWJsZWRPbkxhcmdlRmlsZXMgPSBEaXNhYmxlZCBvbiB2ZXJ5IGxhcmdlIHNvdXJjZSBmaWxlcy4KIGludHJhbGluZUZhaWx1cmUgPSBJbnRyYWxpbmUgZGlmZmVyZW5jZSBub3QgYXZhaWxhYmxlIGR1ZSB0byBzZXJ2ZXIgZXJyb3IuCitpbnRyYWxpbmVUaW1lb3V0ID0gSW50cmFsaW5lIGRpZmZlcmVuY2Ugbm90IGF2YWlsYWJsZSBkdWUgdG8gdGltZW91dC4KIGlsbGVnYWxOdW1iZXJPZkNvbHVtbnMgPSBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgY2Fubm90IGJlIHplcm8gb3IgbmVnYXRpdmUKIAogdXBUb0NoYW5nZSA9IFVwIHRvIGNoYW5nZQpAQCAtNDksNiArNTAsOCBAQAogcmV2aWV3ZWRBbmQgPSBSZXZpZXdlZCAmCiBuZXh0ID0gbmV4dAogZG93bmxvYWQgPSBEb3dubG9hZAorYWRkRmlsZUNvbW1lbnRUb29sVGlwID0gQ2xpY2sgdG8gYWRkIGZpbGUgY29tbWVudAorYWRkRmlsZUNvbW1lbnRCeURvdWJsZUNsaWNrID0gRG91YmxlIGNsaWNrIHRvIGFkZCBmaWxlIGNvbW1lbnQKIAogZmlsZVR5cGVTeW1saW5rID0gVHlwZTogU3ltYm9saWMgTGluawogZmlsZVR5cGVHaXRsaW5rID0gVHlwZTogR2l0IENvbW1pdCBpbiBTdWJwcm9qZWN0CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNjcmVlbi5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTY3JlZW4uamF2YQppbmRleCA0Zjg3MzFjLi5kOTE0MjgzIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2NyZWVuLmphdmEKQEAgLTIwLDEyICsyMCw5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LlJwY1N0YXR1czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5Db21taXRNZXNzYWdlQmxvY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuUGF0Y2hUYWJsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5QYXRjaFRhYmxlLlBhdGNoVmFsaWRhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5HZXJyaXRDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlNjcmVlbkxvYWRDYWxsYmFjazsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ2hhbmdlTGluazsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5MaXN0ZW5hYmxlQWNjb3VudERpZmZQcmVmZXJlbmNlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aS5TY3JlZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQ7CkBAIC0zNywyMyArMzQsMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuU2NoZWR1bGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlci5TY2hlZHVsZWRDb21tYW5kOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkhhbmRsZXJSZWdpc3RyYXRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5DaGVja0JveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGFiZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lkdsb2JhbEtleTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuS2V5Q29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuS2V5Q29tbWFuZFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGF0Y2hTY3JlZW4gZXh0ZW5kcyBTY3JlZW4gaW1wbGVtZW50cwogICAgIENvbW1lbnRFZGl0b3JDb250YWluZXIgewpAQCAtMTEwLDE0ICs5OCwxMCBAQAogICBwcm90ZWN0ZWQgUGF0Y2hTY3JpcHRTZXR0aW5nc1BhbmVsIHNldHRpbmdzUGFuZWw7CiAgIHByb3RlY3RlZCBUb3BWaWV3IHRvcFZpZXc7CiAKLSAgcHJpdmF0ZSBDaGVja0JveCByZXZpZXdlZENoZWNrQm94OwotICBwcml2YXRlIEZsb3dQYW5lbCByZXZpZXdlZFBhbmVsOwotICBwcml2YXRlIElubGluZUh5cGVybGluayByZXZpZXdlZExpbms7CisgIHByaXZhdGUgUmV2aWV3ZWRQYW5lbHMgcmV2aWV3ZWRQYW5lbHM7CiAgIHByaXZhdGUgSGlzdG9yeVRhYmxlIGhpc3RvcnlUYWJsZTsKICAgcHJpdmF0ZSBGbG93UGFuZWwgdG9wUGFuZWw7CiAgIHByaXZhdGUgRmxvd1BhbmVsIGNvbnRlbnRQYW5lbDsKLSAgcHJpdmF0ZSBQYXRjaFRhYmxlSGVhZGVyIGhlYWRlcjsKLSAgcHJpdmF0ZSBMYWJlbCBub0RpZmZlcmVuY2U7CiAgIHByaXZhdGUgQWJzdHJhY3RQYXRjaENvbnRlbnRUYWJsZSBjb250ZW50VGFibGU7CiAgIHByaXZhdGUgQ29tbWl0TWVzc2FnZUJsb2NrIGNvbW1pdE1lc3NhZ2VCbG9jazsKICAgcHJpdmF0ZSBOYXZMaW5rcyB0b3BOYXY7CkBAIC0xMjksNiArMTEzLDcgQEAKICAgLyoqIFRoZSBpbmRleCBvZiB0aGUgZmlsZSB3ZSBhcmUgY3VycmVudGx5IGxvb2tpbmcgYXQgYW1vbmcgdGhlIGZpbGVMaXN0ICovCiAgIHByaXZhdGUgaW50IHBhdGNoSW5kZXg7CiAgIHByaXZhdGUgTGlzdGVuYWJsZUFjY291bnREaWZmUHJlZmVyZW5jZSBwcmVmczsKKyAgcHJpdmF0ZSBIYW5kbGVyUmVnaXN0cmF0aW9uIHByZWZzSGFuZGxlcjsKIAogICAvKiogS2V5cyB0aGF0IGNhdXNlIGFuIGFjdGlvbiBvbiB0aGlzIHNjcmVlbiAqLwogICBwcml2YXRlIEtleUNvbW1hbmRTZXQga2V5c05hdmlnYXRpb247CkBAIC0xMzYsNiArMTIxLDcgQEAKICAgcHJpdmF0ZSBIYW5kbGVyUmVnaXN0cmF0aW9uIHJlZ05hdmlnYXRpb247CiAgIHByaXZhdGUgSGFuZGxlclJlZ2lzdHJhdGlvbiByZWdBY3Rpb247CiAgIHByaXZhdGUgYm9vbGVhbiBpbnRyYWxpbmVGYWlsdXJlOworICBwcml2YXRlIGJvb2xlYW4gaW50cmFsaW5lVGltZW91dDsKIAogICAvKioKICAgICogSG93IHRoaXMgcGF0Y2ggc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgcGF0Y2ggc2NyZWVuLgpAQCAtMTU2LDc2ICsxNDIsMTYgQEAKICAgICBpZFNpZGVCID0gaWQuZ2V0UGFyZW50S2V5KCk7CiAgICAgdGhpcy5wYXRjaEluZGV4ID0gcGF0Y2hJbmRleDsKIAotICAgIHByZWZzID0gZmlsZUxpc3QgIT0gbnVsbCA/IGZpbGVMaXN0LmdldFByZWZlcmVuY2VzKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaXN0ZW5hYmxlQWNjb3VudERpZmZQcmVmZXJlbmNlKCk7CisgICAgcHJlZnMgPSBmaWxlTGlzdCAhPSBudWxsCisgICAgICAgID8gZmlsZUxpc3QuZ2V0UHJlZmVyZW5jZXMoKQorICAgICAgICA6IG5ldyBMaXN0ZW5hYmxlQWNjb3VudERpZmZQcmVmZXJlbmNlKCk7CiAgICAgaWYgKEdlcnJpdC5pc1NpZ25lZEluKCkpIHsKICAgICAgIHByZWZzLnJlc2V0KCk7CiAgICAgfQotICAgIHByZWZzLmFkZFZhbHVlQ2hhbmdlSGFuZGxlcigKLSAgICAgICAgbmV3IFZhbHVlQ2hhbmdlSGFuZGxlcjxBY2NvdW50RGlmZlByZWZlcmVuY2U+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmFsdWVDaGFuZ2UoVmFsdWVDaGFuZ2VFdmVudDxBY2NvdW50RGlmZlByZWZlcmVuY2U+IGV2ZW50KSB7Ci0gICAgICAgICAgICB1cGRhdGUoZXZlbnQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgIHJldmlld2VkUGFuZWwgPSBuZXcgRmxvd1BhbmVsKCk7CisgICAgcmV2aWV3ZWRQYW5lbHMgPSBuZXcgUmV2aWV3ZWRQYW5lbHMoKTsKICAgICBzZXR0aW5nc1BhbmVsID0gbmV3IFBhdGNoU2NyaXB0U2V0dGluZ3NQYW5lbChwcmVmcyk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgcG9wdWxhdGVSZXZpZXdlZFBhbmVsKCl7Ci0gICAgcmV2aWV3ZWRQYW5lbC5jbGVhcigpOwotCi0gICAgcmV2aWV3ZWRDaGVja0JveCA9IG5ldyBDaGVja0JveChQYXRjaFV0aWwuQy5yZXZpZXdlZEFuZCgpICsgIiAiKTsKLSAgICByZXZpZXdlZENoZWNrQm94LmFkZFZhbHVlQ2hhbmdlSGFuZGxlcihuZXcgVmFsdWVDaGFuZ2VIYW5kbGVyPEJvb2xlYW4+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvblZhbHVlQ2hhbmdlKFZhbHVlQ2hhbmdlRXZlbnQ8Qm9vbGVhbj4gZXZlbnQpIHsKLSAgICAgICAgc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKGV2ZW50LmdldFZhbHVlKCkpOwotICAgICAgfQotICAgIH0pOwotCi0gICAgcmV2aWV3ZWRQYW5lbC5hZGQocmV2aWV3ZWRDaGVja0JveCk7Ci0gICAgcmV2aWV3ZWRQYW5lbC5hZGQoZ2V0UmV2aWV3ZWRBbmNob3IoKSk7Ci0gIH0KLQotICBwcml2YXRlIEFuY2hvciBnZXRSZXZpZXdlZEFuY2hvcigpIHsKLSAgICBTYWZlSHRtbEJ1aWxkZXIgdGV4dCA9IG5ldyBTYWZlSHRtbEJ1aWxkZXIoKTsKLSAgICB0ZXh0LmFwcGVuZChQYXRjaFV0aWwuQy5uZXh0KCkpOwotICAgIHRleHQuYXBwZW5kKFNhZmVIdG1sLmFzaXMoVXRpbC5DLm5leHRQYXRjaExpbmtJY29uKCkpKTsKLQotICAgIEFuY2hvciByZXZpZXdlZEFuY2hvciA9IG5ldyBBbmNob3IoIiIpOwotICAgIFNhZmVIdG1sLnNldChyZXZpZXdlZEFuY2hvciwgdGV4dCk7Ci0KLSAgICBmaW5hbCBQYXRjaFZhbGlkYXRvciB1bnJldmlld2VkVmFsaWRhdG9yID0gbmV3IFBhdGNoVmFsaWRhdG9yKCkgewotICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChQYXRjaCBwYXRjaCkgewotICAgICAgICByZXR1cm4gIXBhdGNoLmlzUmV2aWV3ZWRCeUN1cnJlbnRVc2VyKCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIGludCBuZXh0VW5yZXZpZXdlZFBhdGNoSW5kZXggPQotICAgICAgICBmaWxlTGlzdC5nZXROZXh0UGF0Y2gocGF0Y2hJbmRleCwgdHJ1ZSwgdW5yZXZpZXdlZFZhbGlkYXRvciwKLSAgICAgICAgICAgIGZpbGVMaXN0LlBSRUZFUkVOQ0VfVkFMSURBVE9SKTsKLQotICAgIGlmIChuZXh0VW5yZXZpZXdlZFBhdGNoSW5kZXggPiAtMSkgewotICAgICAgLy8gQ3JlYXRlIGludmlzaWJsZSBwYXRjaCBsaW5rIHRvIGNoYW5nZSBwYWdlCi0gICAgICByZXZpZXdlZExpbmsgPQotICAgICAgICAgIGZpbGVMaXN0LmNyZWF0ZUxpbmsobmV4dFVucmV2aWV3ZWRQYXRjaEluZGV4LCBnZXRQYXRjaFNjcmVlblR5cGUoKSwKLSAgICAgICAgICAgICAgbnVsbCwgbnVsbCk7Ci0gICAgICByZXZpZXdlZExpbmsuc2V0VGV4dCgiIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldmlld2VkTGluayA9IG5ldyBDaGFuZ2VMaW5rKCIiLCBwYXRjaEtleS5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgfQotICAgIHJldmlld2VkQW5jaG9yLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKHRydWUpOwotICAgICAgICByZXZpZXdlZExpbmsuZ28oKTsKLSAgICAgIH0KLSAgICB9KTsKLQotICAgIHJldHVybiByZXZpZXdlZEFuY2hvcjsKLSAgfQotCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBub3RpZnlEcmFmdERlbHRhKGludCBkZWx0YSkgewogICAgIGxhc3RTY3JpcHQgPSBudWxsOwpAQCAtMjM4LDEwICsxNjQsMTAgQEAKIAogICBwcml2YXRlIHZvaWQgdXBkYXRlKEFjY291bnREaWZmUHJlZmVyZW5jZSBkcCkgewogICAgIC8vIERpZCB0aGUgdXNlciBqdXN0IHR1cm4gb24gYXV0by1yZXZpZXc/Ci0gICAgaWYgKCFyZXZpZXdlZENoZWNrQm94LmdldFZhbHVlKCkgJiYgcHJlZnMuZ2V0T2xkKCkuaXNNYW51YWxSZXZpZXcoKQorICAgIGlmICghcmV2aWV3ZWRQYW5lbHMuZ2V0VmFsdWUoKSAmJiBwcmVmcy5nZXRPbGQoKS5pc01hbnVhbFJldmlldygpCiAgICAgICAgICYmICFkcC5pc01hbnVhbFJldmlldygpKSB7Ci0gICAgICByZXZpZXdlZENoZWNrQm94LnNldFZhbHVlKHRydWUpOwotICAgICAgc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKHRydWUpOworICAgICAgcmV2aWV3ZWRQYW5lbHMuc2V0VmFsdWUodHJ1ZSk7CisgICAgICByZXZpZXdlZFBhbmVscy5zZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIodHJ1ZSk7CiAgICAgfQogCiAgICAgaWYgKGxhc3RTY3JpcHQgIT0gbnVsbCAmJiBjYW5SZXVzZShkcCwgbGFzdFNjcmlwdCkpIHsKQEAgLTI5NCw3ICsyMjAsNyBAQAogICAgIHN1cGVyLm9uSW5pdFVJKCk7CiAKICAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgewotICAgICAgc2V0VGl0bGVGYXJFYXN0KHJldmlld2VkUGFuZWwpOworICAgICAgc2V0VGl0bGVGYXJFYXN0KHJldmlld2VkUGFuZWxzLnRvcCk7CiAgICAgfQogCiAgICAga2V5c05hdmlnYXRpb24gPSBuZXcgS2V5Q29tbWFuZFNldChHZXJyaXQuQy5zZWN0aW9uTmF2aWdhdGlvbigpKTsKQEAgLTMxNiwxMiArMjQyLDYgQEAKICAgICB0b3BQYW5lbCA9IG5ldyBGbG93UGFuZWwoKTsKICAgICBhZGQodG9wUGFuZWwpOwogCi0gICAgaGVhZGVyID0gbmV3IFBhdGNoVGFibGVIZWFkZXIoZ2V0UGF0Y2hTY3JlZW5UeXBlKCkpOwotCi0gICAgbm9EaWZmZXJlbmNlID0gbmV3IExhYmVsKFBhdGNoVXRpbC5DLm5vRGlmZmVyZW5jZSgpKTsKLSAgICBub0RpZmZlcmVuY2Uuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucGF0Y2hOb0RpZmZlcmVuY2UoKSk7Ci0gICAgbm9EaWZmZXJlbmNlLnNldFZpc2libGUoZmFsc2UpOwotCiAgICAgY29udGVudFRhYmxlID0gY3JlYXRlQ29udGVudFRhYmxlKCk7CiAgICAgY29udGVudFRhYmxlLmZpbGVMaXN0ID0gZmlsZUxpc3Q7CiAKQEAgLTMzMCwxMyArMjUwLDE5IEBACiAKICAgICBhZGQodG9wTmF2KTsKICAgICBjb250ZW50UGFuZWwgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgY29udGVudFBhbmVsLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpCi0gICAgICAgIC5zaWRlQnlTaWRlU2NyZWVuU2lkZUJ5U2lkZVRhYmxlKCkpOwotICAgIGNvbnRlbnRQYW5lbC5hZGQoaGVhZGVyKTsKLSAgICBjb250ZW50UGFuZWwuYWRkKG5vRGlmZmVyZW5jZSk7CisgICAgaWYgKGdldFBhdGNoU2NyZWVuVHlwZSgpID09IFBhdGNoU2NyZWVuLlR5cGUuU0lERV9CWV9TSURFKSB7CisgICAgICBjb250ZW50UGFuZWwuc2V0U3R5bGVOYW1lKC8vCisgICAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5zaWRlQnlTaWRlU2NyZWVuU2lkZUJ5U2lkZVRhYmxlKCkpOworICAgIH0gZWxzZSB7CisgICAgICBjb250ZW50UGFuZWwuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkudW5pZmllZFRhYmxlKCkpOworICAgIH0KKwogICAgIGNvbnRlbnRQYW5lbC5hZGQoY29udGVudFRhYmxlKTsKICAgICBhZGQoY29udGVudFBhbmVsKTsKICAgICBhZGQoYm90dG9tTmF2KTsKKyAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgeworICAgICAgYWRkKHJldmlld2VkUGFuZWxzLmJvdHRvbSk7CisgICAgfQogCiAgICAgaWYgKGZpbGVMaXN0ICE9IG51bGwpIHsKICAgICAgIHRvcE5hdi5kaXNwbGF5KHBhdGNoSW5kZXgsIGdldFBhdGNoU2NyZWVuVHlwZSgpLCBmaWxlTGlzdCk7CkBAIC0zNDQsMjUgKzI3MCw2IEBACiAgICAgfQogICB9CiAKLSAgdm9pZCBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoYm9vbGVhbiByZXZpZXdlZCkgewotICAgIGlmIChmaWxlTGlzdCAhPSBudWxsKSB7Ci0gICAgICBmaWxlTGlzdC51cGRhdGVSZXZpZXdlZFN0YXR1cyhwYXRjaEtleSwgcmV2aWV3ZWQpOwotICAgIH0KLQotICAgIFBhdGNoVXRpbC5ERVRBSUxfU1ZDLnNldFJldmlld2VkQnlDdXJyZW50VXNlcihwYXRjaEtleSwgcmV2aWV3ZWQsCi0gICAgICAgIG5ldyBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgYXJnMCkgewotICAgICAgICAgICAgLy8gbm9wCi0gICAgICAgICAgfQotCi0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFZvaWRSZXN1bHQgcmVzdWx0KSB7Ci0gICAgICAgICAgICAvLyBub3AKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICB9Ci0KICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uTG9hZCgpIHsKICAgICBzdXBlci5vbkxvYWQoKTsKQEAgLTM4OCw2ICsyOTUsMTAgQEAKIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25VbmxvYWQoKSB7CisgICAgaWYgKHByZWZzSGFuZGxlciAhPSBudWxsKSB7CisgICAgICBwcmVmc0hhbmRsZXIucmVtb3ZlSGFuZGxlcigpOworICAgICAgcHJlZnNIYW5kbGVyID0gbnVsbDsKKyAgICB9CiAgICAgaWYgKHJlZ05hdmlnYXRpb24gIT0gbnVsbCkgewogICAgICAgcmVnTmF2aWdhdGlvbi5yZW1vdmVIYW5kbGVyKCk7CiAgICAgICByZWdOYXZpZ2F0aW9uID0gbnVsbDsKQEAgLTQ0OSw4ICszNjAsOCBAQAogICAgIGZpbmFsIGludCBycGNzZXEgPSArK3JwY1NlcXVlbmNlOwogICAgIGxhc3RTY3JpcHQgPSBudWxsOwogICAgIHNldHRpbmdzUGFuZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgcG9wdWxhdGVSZXZpZXdlZFBhbmVsKCk7Ci0gICAgaWYgKGlzRmlyc3QgJiYgZmlsZUxpc3QgIT0gbnVsbCkgeworICAgIHJldmlld2VkUGFuZWxzLnBvcHVsYXRlKHBhdGNoS2V5LCBmaWxlTGlzdCwgcGF0Y2hJbmRleCwgZ2V0UGF0Y2hTY3JlZW5UeXBlKCkpOworICAgIGlmIChpc0ZpcnN0ICYmIGZpbGVMaXN0ICE9IG51bGwgJiYgZmlsZUxpc3QuaXNMb2FkZWQoKSkgewogICAgICAgZmlsZUxpc3QubW92ZVBvaW50ZXJUbyhwYXRjaEtleSk7CiAgICAgfQogICAgIFBhdGNoVXRpbC5ERVRBSUxfU1ZDLnBhdGNoU2NyaXB0KHBhdGNoS2V5LCBpZFNpZGVBLCBpZFNpZGVCLCAvLwpAQCAtNTAwLDE4ICs0MTEsMjIgQEAKIAogICAgIGhpc3RvcnlUYWJsZS5kaXNwbGF5KHNjcmlwdC5nZXRIaXN0b3J5KCkpOwogCi0gICAgLy8gVHJ1ZSBpZiB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHBhdGNoIHNldHMKLSAgICBib29sZWFuIGhhc0VkaXRzID0gIXNjcmlwdC5nZXRFZGl0cygpLmlzRW1wdHkoKTsKLSAgICAvLyBUcnVlIGlmIHRoaXMgY2hhbmdlIGlzIGEgbW9kZSBjaGFuZ2Ugb3IgYSBwdXJlIHJlbmFtZS9jb3B5Ci0gICAgYm9vbGVhbiBoYXNNZXRhID0gIXNjcmlwdC5nZXRQYXRjaEhlYWRlcigpLmlzRW1wdHkoKTsKKyAgICBmb3IgKFBhdGNoIHAgOiBwYXRjaFNldERldGFpbC5nZXRQYXRjaGVzKCkpIHsKKyAgICAgIGlmIChwLmdldEtleSgpLmVxdWFscyhwYXRjaEtleSkpIHsKKyAgICAgICAgaWYgKHAuZ2V0UGF0Y2hUeXBlKCkuZXF1YWxzKFBhdGNoLlBhdGNoVHlwZS5CSU5BUlkpKSB7CisgICAgICAgICAgY29udGVudFRhYmxlLmlzRGlzcGxheUJpbmFyeSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQogCi0gICAgYm9vbGVhbiBoYXNEaWZmZXJlbmNlcyA9IGhhc0VkaXRzIHx8IGhhc01ldGE7Ci0gICAgYm9vbGVhbiBwdXJlTWV0YUNoYW5nZSA9ICFoYXNFZGl0cyAmJiBoYXNNZXRhOwotCi0gICAgaWYgKGNvbnRlbnRUYWJsZSBpbnN0YW5jZW9mIFNpZGVCeVNpZGVUYWJsZSAmJiBwdXJlTWV0YUNoYW5nZSkgeworICAgIGlmIChjb250ZW50VGFibGUgaW5zdGFuY2VvZiBTaWRlQnlTaWRlVGFibGUKKyAgICAgICAgJiYgY29udGVudFRhYmxlLmlzUHVyZU1ldGFDaGFuZ2Uoc2NyaXB0KQorICAgICAgICAmJiAhY29udGVudFRhYmxlLmlzRGlzcGxheUJpbmFyeSkgewogICAgICAgLy8gVXNlciBhc2tlZCBmb3IgU2lkZUJ5U2lkZSAob3IgYSBsaW5rIGd1ZXNzZWQsIHdyb25nKSBhbmQgd2UgY2FuJ3QKLSAgICAgIC8vIHNob3cgYSBiaW5hcnkgb3IgcHVyZS1yZW5hbWUgY2hhbmdlIHRoZXJlIGFjY3VyYXRlbHkuIFN3aXRjaCB0bwotICAgICAgLy8gdGhlIHVuaWZpZWQgdmlldyBpbnN0ZWFkLgorICAgICAgLy8gc2hvdyBhIHB1cmUtcmVuYW1lIGNoYW5nZSB0aGVyZSBhY2N1cmF0ZWx5LiBTd2l0Y2ggdG8KKyAgICAgIC8vIHRoZSB1bmlmaWVkIHZpZXcgaW5zdGVhZC4gVXNlciBjYW4gc2V0IGZpbGUgY29tbWVudHMgb24gYmluYXJ5IGZpbGUKKyAgICAgIC8vIGluIFNpZGVCeVNpZGUgdmlldy4KICAgICAgIC8vCiAgICAgICBjb250ZW50VGFibGUucmVtb3ZlRnJvbVBhcmVudCgpOwogICAgICAgY29udGVudFRhYmxlID0gbmV3IFVuaWZpZWREaWZmVGFibGUoKTsKQEAgLTUyMCwxNCArNDM1LDExIEBACiAgICAgICBzZXRUb2tlbihEaXNwYXRjaGVyLnRvUGF0Y2hVbmlmaWVkKGlkU2lkZUEsIHBhdGNoS2V5KSk7CiAgICAgfQogCi0gICAgaGVhZGVyLmRpc3BsYXkocGF0Y2hTZXREZXRhaWwsIHNjcmlwdCwgcGF0Y2hLZXksIGlkU2lkZUEsIGlkU2lkZUIpOworICAgIGNvbnRlbnRUYWJsZS5kaXNwbGF5KHBhdGNoS2V5LCBpZFNpZGVBLCBpZFNpZGVCLCBzY3JpcHQsIHBhdGNoU2V0RGV0YWlsKTsKKyAgICBjb250ZW50VGFibGUuZGlzcGxheShzY3JpcHQuZ2V0Q29tbWVudERldGFpbCgpLCBzY3JpcHQuaXNFeHBhbmRBbGxDb21tZW50cygpKTsKKyAgICBjb250ZW50VGFibGUuZmluaXNoRGlzcGxheSgpOworICAgIGNvbnRlbnRUYWJsZS5zZXRSZWdpc3RlcktleXMoaXNDdXJyZW50VmlldygpKTsKIAotICAgIGlmIChoYXNEaWZmZXJlbmNlcykgewotICAgICAgY29udGVudFRhYmxlLmRpc3BsYXkocGF0Y2hLZXksIGlkU2lkZUEsIGlkU2lkZUIsIHNjcmlwdCk7Ci0gICAgICBjb250ZW50VGFibGUuZGlzcGxheShzY3JpcHQuZ2V0Q29tbWVudERldGFpbCgpLCBzY3JpcHQuaXNFeHBhbmRBbGxDb21tZW50cygpKTsKLSAgICAgIGNvbnRlbnRUYWJsZS5maW5pc2hEaXNwbGF5KCk7Ci0gICAgfQotICAgIHNob3dQYXRjaChoYXNEaWZmZXJlbmNlcyk7CiAgICAgc2V0dGluZ3NQYW5lbC5zZXRFbmFibGVTbWFsbEZpbGVGZWF0dXJlcyghc2NyaXB0LmlzSHVnZUZpbGUoKSk7CiAgICAgc2V0dGluZ3NQYW5lbC5zZXRFbmFibGVJbnRyYWxpbmVEaWZmZXJlbmNlKHNjcmlwdC5oYXNJbnRyYWxpbmVEaWZmZXJlbmNlKCkpOwogICAgIHNldHRpbmdzUGFuZWwuc2V0RW5hYmxlZCh0cnVlKTsKQEAgLTU0Miw3ICs0NTQsNyBAQAogICAgICAgYm9vbGVhbiBpc1Jldmlld2VkID0gZmFsc2U7CiAgICAgICBpZiAoaXNGaXJzdCAmJiAhcHJlZnMuZ2V0KCkuaXNNYW51YWxSZXZpZXcoKSkgewogICAgICAgICBpc1Jldmlld2VkID0gdHJ1ZTsKLSAgICAgICAgc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKGlzUmV2aWV3ZWQpOworICAgICAgICByZXZpZXdlZFBhbmVscy5zZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoaXNSZXZpZXdlZCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKFBhdGNoIHAgOiBwYXRjaFNldERldGFpbC5nZXRQYXRjaGVzKCkpIHsKICAgICAgICAgICBpZiAocC5nZXRLZXkoKS5lcXVhbHMocGF0Y2hLZXkpKSB7CkBAIC01NTEsMzAgKzQ2MywzNyBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgcmV2aWV3ZWRDaGVja0JveC5zZXRWYWx1ZShpc1Jldmlld2VkKTsKKyAgICAgIHJldmlld2VkUGFuZWxzLnNldFZhbHVlKGlzUmV2aWV3ZWQpOwogICAgIH0KIAogICAgIGludHJhbGluZUZhaWx1cmUgPSBpc0ZpcnN0ICYmIHNjcmlwdC5oYXNJbnRyYWxpbmVGYWlsdXJlKCk7CisgICAgaW50cmFsaW5lVGltZW91dCA9IGlzRmlyc3QgJiYgc2NyaXB0Lmhhc0ludHJhbGluZVRpbWVvdXQoKTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBvblNob3dWaWV3KCkgewogICAgIHN1cGVyLm9uU2hvd1ZpZXcoKTsKKyAgICBpZiAocHJlZnNIYW5kbGVyID09IG51bGwpIHsKKyAgICAgIHByZWZzSGFuZGxlciA9IHByZWZzLmFkZFZhbHVlQ2hhbmdlSGFuZGxlcigKKyAgICAgICAgICBuZXcgVmFsdWVDaGFuZ2VIYW5kbGVyPEFjY291bnREaWZmUHJlZmVyZW5jZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmFsdWVDaGFuZ2UoVmFsdWVDaGFuZ2VFdmVudDxBY2NvdW50RGlmZlByZWZlcmVuY2U+IGV2ZW50KSB7CisgICAgICAgICAgICAgIHVwZGF0ZShldmVudC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKyAgICB9CiAgICAgaWYgKGludHJhbGluZUZhaWx1cmUpIHsKICAgICAgIGludHJhbGluZUZhaWx1cmUgPSBmYWxzZTsKICAgICAgIG5ldyBFcnJvckRpYWxvZyhQYXRjaFV0aWwuQy5pbnRyYWxpbmVGYWlsdXJlKCkpLnNob3coKTsKKyAgICB9IGVsc2UgaWYgKGludHJhbGluZVRpbWVvdXQpIHsKKyAgICAgIGludHJhbGluZVRpbWVvdXQgPSBmYWxzZTsKKyAgICAgIG5ldyBFcnJvckRpYWxvZyhQYXRjaFV0aWwuQy5pbnRyYWxpbmVUaW1lb3V0KCkpLnNob3coKTsKICAgICB9CiAgICAgaWYgKHRvcFZpZXcgIT0gbnVsbCAmJiBwcmVmcy5nZXQoKS5pc1JldGFpbkhlYWRlcigpKSB7CiAgICAgICBzZXRUb3BWaWV3KHRvcFZpZXcpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBzaG93UGF0Y2goZmluYWwgYm9vbGVhbiBzaG93UGF0Y2gpIHsKLSAgICBub0RpZmZlcmVuY2Uuc2V0VmlzaWJsZSghc2hvd1BhdGNoKTsKLSAgICBjb250ZW50VGFibGUuc2V0VmlzaWJsZShzaG93UGF0Y2gpOwotICAgIGNvbnRlbnRUYWJsZS5zZXRSZWdpc3RlcktleXMoaXNDdXJyZW50VmlldygpICYmIHNob3dQYXRjaCk7Ci0gIH0KLQogICBwdWJsaWMgdm9pZCBzZXRUb3BWaWV3KFRvcFZpZXcgdHYpIHsKICAgICB0b3BWaWV3ID0gdHY7CiAgICAgdG9wUGFuZWwuY2xlYXIoKTsKQEAgLTU4Nyw2ICs1MDYsOCBAQAogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgRklMRVM6ICAgICAgIHRvcFBhbmVsLmFkZChmaWxlTGlzdCk7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNQUlOOgorICAgICAgICBicmVhazsKICAgICB9CiAgIH0KIApAQCAtNjIxLDkgKzU0Miw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbktleVByZXNzKGZpbmFsIEtleVByZXNzRXZlbnQgZXZlbnQpIHsKLSAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZXZpZXdlZCA9ICFyZXZpZXdlZENoZWNrQm94LmdldFZhbHVlKCk7Ci0gICAgICByZXZpZXdlZENoZWNrQm94LnNldFZhbHVlKGlzUmV2aWV3ZWQpOwotICAgICAgc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKGlzUmV2aWV3ZWQpOworICAgICAgZmluYWwgYm9vbGVhbiBpc1Jldmlld2VkID0gIXJldmlld2VkUGFuZWxzLmdldFZhbHVlKCk7CisgICAgICByZXZpZXdlZFBhbmVscy5zZXRWYWx1ZShpc1Jldmlld2VkKTsKKyAgICAgIHJldmlld2VkUGFuZWxzLnNldFJldmlld2VkQnlDdXJyZW50VXNlcihpc1Jldmlld2VkKTsKICAgICB9CiAgIH0KIApAQCAtNjM0LDEwICs1NTUsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25LZXlQcmVzcyhmaW5hbCBLZXlQcmVzc0V2ZW50IGV2ZW50KSB7Ci0gICAgICBpZiAocmV2aWV3ZWRMaW5rICE9IG51bGwpIHsKLSAgICAgICAgc2V0UmV2aWV3ZWRCeUN1cnJlbnRVc2VyKHRydWUpOwotICAgICAgICByZXZpZXdlZExpbmsuZ28oKTsKLSAgICAgIH0KKyAgICAgIHJldmlld2VkUGFuZWxzLmdvKCk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNjcmlwdFNldHRpbmdzUGFuZWwuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2NyaXB0U2V0dGluZ3NQYW5lbC5qYXZhCmluZGV4IGE2ODkyNTkuLjhlNzZlNDcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2NyaXB0U2V0dGluZ3NQYW5lbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2NyaXB0U2V0dGluZ3NQYW5lbC5qYXZhCkBAIC0yNywxMCArMjcsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5Q29kZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NIYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLkhhc1ZhbHVlQ2hhbmdlSGFuZGxlcnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VFdmVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5sb2dpY2FsLnNoYXJlZC5WYWx1ZUNoYW5nZUhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuc2hhcmVkLkhhbmRsZXJSZWdpc3RyYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpQmluZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUZpZWxkOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUhhbmRsZXI7CkBAIC00MywxNCArMzksMTMgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogCi1wdWJsaWMgY2xhc3MgUGF0Y2hTY3JpcHRTZXR0aW5nc1BhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMKLSAgICBIYXNWYWx1ZUNoYW5nZUhhbmRsZXJzPEFjY291bnREaWZmUHJlZmVyZW5jZT4geworcHVibGljIGNsYXNzIFBhdGNoU2NyaXB0U2V0dGluZ3NQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSB7CiAgIHByaXZhdGUgc3RhdGljIE15VWlCaW5kZXIgdWlCaW5kZXIgPSBHV1QuY3JlYXRlKE15VWlCaW5kZXIuY2xhc3MpOwogCiAgIGludGVyZmFjZSBNeVVpQmluZGVyIGV4dGVuZHMgVWlCaW5kZXI8V2lkZ2V0LCBQYXRjaFNjcmlwdFNldHRpbmdzUGFuZWw+IHsKICAgfQogCi0gIHByaXZhdGUgTGlzdGVuYWJsZUFjY291bnREaWZmUHJlZmVyZW5jZSBsaXN0ZW5hYmxlUHJlZnM7CisgIHByaXZhdGUgZmluYWwgTGlzdGVuYWJsZUFjY291bnREaWZmUHJlZmVyZW5jZSBsaXN0ZW5hYmxlUHJlZnM7CiAgIHByaXZhdGUgYm9vbGVhbiBlbmFibGVJbnRyYWxpbmVEaWZmZXJlbmNlID0gdHJ1ZTsKICAgcHJpdmF0ZSBib29sZWFuIGVuYWJsZVNtYWxsRmlsZUZlYXR1cmVzID0gdHJ1ZTsKIApAQCAtMTM5LDEyICsxMzQsNiBAQAogICAgIGRpc3BsYXkoKTsKICAgfQogCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSGFuZGxlclJlZ2lzdHJhdGlvbiBhZGRWYWx1ZUNoYW5nZUhhbmRsZXIoCi0gICAgICBWYWx1ZUNoYW5nZUhhbmRsZXI8QWNjb3VudERpZmZQcmVmZXJlbmNlPiBoYW5kbGVyKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmFkZEhhbmRsZXIoaGFuZGxlciwgVmFsdWVDaGFuZ2VFdmVudC5nZXRUeXBlKCkpOwotICB9Ci0KICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZChmaW5hbCBib29sZWFuIG9uKSB7CiAgICAgaWYgKG9uKSB7CiAgICAgICBzZXRFbmFibGVkQ291bnRlcisrOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTZXRTZWxlY3RCb3guamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2V0U2VsZWN0Qm94LmphdmEKaW5kZXggYWZhZjdmZC4uZGYxMmI3MCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTZXRTZWxlY3RCb3guamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNldFNlbGVjdEJveC5qYXZhCkBAIC0yMSwxOCArMjEsMjAgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkRpdkVsZW1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5TdHlsZS5EaXNwbGF5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkRvdWJsZUNsaWNrRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5Eb3VibGVDbGlja0hhbmRsZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QucmVzb3VyY2VzLmNsaWVudC5Dc3NSZXNvdXJjZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51aWJpbmRlci5jbGllbnQuVWlCaW5kZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpRmllbGQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRE9NOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Db21wb3NpdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFBhbmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkltYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkxhYmVsOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXlVdGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC00OSw3ICs1MSw5IEBACiAKICAgICBTdHJpbmcgaGlkZGVuKCk7CiAKLSAgICBTdHJpbmcgZG93bmxvYWRMaW5rKCk7CisgICAgU3RyaW5nIHNpZGVNYXJrZXIoKTsKKworICAgIFN0cmluZyBwYXRjaFNldExhYmVsKCk7CiAgIH0KIAogICBwdWJsaWMgZW51bSBTaWRlIHsKQEAgLTY0LDYgKzY4LDcgQEAKICAgU2lkZSBzaWRlOwogICBQYXRjaFNjcmVlbi5UeXBlIHNjcmVlblR5cGU7CiAgIE1hcDxJbnRlZ2VyLCBBbmNob3I+IGxpbmtzOworICBwcml2YXRlIExhYmVsIHBhdGNoU2V0OwogCiAgIEBVaUZpZWxkCiAgIEhUTUxQYW5lbCBsaW5rUGFuZWw7CkBAIC03MSw5ICs3Niw2IEBACiAgIEBVaUZpZWxkCiAgIEJveFN0eWxlIHN0eWxlOwogCi0gIEBVaUZpZWxkCi0gIERpdkVsZW1lbnQgc2lkZU1hcmtlcjsKLQogICBwdWJsaWMgUGF0Y2hTZXRTZWxlY3RCb3goU2lkZSBzaWRlLCBmaW5hbCBQYXRjaFNjcmVlbi5UeXBlIHR5cGUpIHsKICAgICB0aGlzLnNpZGUgPSBzaWRlOwogICAgIHRoaXMuc2NyZWVuVHlwZSA9IHR5cGU7CkBAIC04MSw4ICs4Myw4IEBACiAgICAgaW5pdFdpZGdldCh1aUJpbmRlci5jcmVhdGVBbmRCaW5kVWkodGhpcykpOwogICB9CiAKLSAgcHVibGljIHZvaWQgZGlzcGxheShmaW5hbCBQYXRjaFNldERldGFpbCBkZXRhaWwsIGZpbmFsIFBhdGNoU2NyaXB0IHNjcmlwdCwgUGF0Y2guS2V5IGtleSwKLSAgICAgIFBhdGNoU2V0LklkIGlkU2lkZUEsIFBhdGNoU2V0LklkIGlkU2lkZUIpIHsKKyAgcHVibGljIHZvaWQgZGlzcGxheShmaW5hbCBQYXRjaFNldERldGFpbCBkZXRhaWwsIGZpbmFsIFBhdGNoU2NyaXB0IHNjcmlwdCwKKyAgICAgIFBhdGNoLktleSBrZXksIFBhdGNoU2V0LklkIGlkU2lkZUEsIFBhdGNoU2V0LklkIGlkU2lkZUIpIHsKICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdDsKICAgICB0aGlzLnBhdGNoS2V5ID0ga2V5OwogICAgIHRoaXMuaWRTaWRlQSA9IGlkU2lkZUE7CkBAIC05MiwxMCArOTQsMTggQEAKIAogICAgIGxpbmtQYW5lbC5jbGVhcigpOwogCisgICAgaWYgKGlzRmlsZU9yQ29tbWl0TWVzc2FnZSgpKSB7CisgICAgICBsaW5rUGFuZWwuc2V0VGl0bGUoUGF0Y2hVdGlsLkMuYWRkRmlsZUNvbW1lbnRCeURvdWJsZUNsaWNrKCkpOworICAgIH0KKworICAgIHBhdGNoU2V0ID0gbmV3IExhYmVsKFBhdGNoVXRpbC5DLnBhdGNoU2V0KCkpOworICAgIHBhdGNoU2V0LmFkZFN0eWxlTmFtZShzdHlsZS5wYXRjaFNldExhYmVsKCkpOworICAgIGxpbmtQYW5lbC5hZGQocGF0Y2hTZXQpOworCiAgICAgaWYgKHNjcmVlblR5cGUgPT0gUGF0Y2hTY3JlZW4uVHlwZS5VTklGSUVEKSB7Ci0gICAgICBzaWRlTWFya2VyLnNldElubmVyVGV4dCgoc2lkZSA9PSBTaWRlLkEpID8gIigtKSIgOiAiKCspIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpZGVNYXJrZXIuZ2V0U3R5bGUoKS5zZXREaXNwbGF5KERpc3BsYXkuTk9ORSk7CisgICAgICBMYWJlbCBzaWRlTWFya2VyID0gbmV3IExhYmVsKChzaWRlID09IFNpZGUuQSkgPyAiKC0pIiA6ICIoKykiKTsKKyAgICAgIHNpZGVNYXJrZXIuYWRkU3R5bGVOYW1lKHN0eWxlLnNpZGVNYXJrZXIoKSk7CisgICAgICBsaW5rUGFuZWwuYWRkKHNpZGVNYXJrZXIpOwogICAgIH0KIAogICAgIEFuY2hvciBiYXNlTGluayA9IG51bGw7CkBAIC0xMzMsNiArMTQzLDEyIEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tIYW5kbGVyKERvdWJsZUNsaWNrSGFuZGxlciBoYW5kbGVyKSB7CisgICAgbGlua1BhbmVsLnNpbmtFdmVudHMoRXZlbnQuT05EQkxDTElDSyk7CisgICAgbGlua1BhbmVsLmFkZEhhbmRsZXIoaGFuZGxlciwgRG91YmxlQ2xpY2tFdmVudC5nZXRUeXBlKCkpOworICAgIHBhdGNoU2V0LmFkZERvdWJsZUNsaWNrSGFuZGxlcihoYW5kbGVyKTsKKyAgfQorCiAgIHByaXZhdGUgQW5jaG9yIGNyZWF0ZUxpbmsoU3RyaW5nIGxhYmVsLCBmaW5hbCBQYXRjaFNldC5JZCBpZCkgewogICAgIGZpbmFsIEFuY2hvciBhbmNob3IgPSBuZXcgQW5jaG9yKGxhYmVsKTsKICAgICBhbmNob3IuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CkBAIC0xNjEsMTggKzE3NywyMyBAQAogICAgIHJldHVybiBhbmNob3I7CiAgIH0KIAorICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVPckNvbW1pdE1lc3NhZ2UoKSB7CisgICAgcmV0dXJuICEoKHNpZGUgPT0gU2lkZS5BICYmIDAgPj0gc2NyaXB0LmdldEEoKS5zaXplKCkpIHx8IC8vCisgICAgKHNpZGUgPT0gU2lkZS5CICYmIDAgPj0gc2NyaXB0LmdldEIoKS5zaXplKCkpKTsKKyAgfQorCiAgIHByaXZhdGUgQW5jaG9yIGNyZWF0ZURvd25sb2FkTGluaygpIHsKICAgICBib29sZWFuIGlzQ29tbWl0TWVzc2FnZSA9IFBhdGNoLkNPTU1JVF9NU0cuZXF1YWxzKHNjcmlwdC5nZXROZXdOYW1lKCkpOwotCi0gICAgaWYgKGlzQ29tbWl0TWVzc2FnZSB8fCAoc2lkZSA9PSBTaWRlLkEgJiYgMCA+PSBzY3JpcHQuZ2V0QSgpLnNpemUoKSkKLSAgICAgICAgfHwgKHNpZGUgPT0gU2lkZS5CICYmIDAgPj0gc2NyaXB0LmdldEIoKS5zaXplKCkpKSB7CisgICAgaWYgKGlzQ29tbWl0TWVzc2FnZSB8fCAvLworICAgICAgICAoc2lkZSA9PSBTaWRlLkEgJiYgMCA+PSBzY3JpcHQuZ2V0QSgpLnNpemUoKSkgfHwgLy8KKyAgICAgICAgKHNpZGUgPT0gU2lkZS5CICYmIDAgPj0gc2NyaXB0LmdldEIoKS5zaXplKCkpKSB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBQYXRjaC5LZXkga2V5ID0KLSAgICAgICAgKGlkU2lkZUEgPT0gbnVsbCkgPyBwYXRjaEtleSA6IChuZXcgUGF0Y2guS2V5KGlkU2lkZUEsIHBhdGNoS2V5LmdldCgpKSk7CisgICAgUGF0Y2guS2V5IGtleSA9IChpZEFjdGl2ZSA9PSBudWxsKSA/IC8vCisgICAgICAgIHBhdGNoS2V5IDogKG5ldyBQYXRjaC5LZXkoaWRBY3RpdmUsIHBhdGNoS2V5LmdldCgpKSk7CiAKLSAgICBTdHJpbmcgc2lkZVVSTCA9IChzaWRlID09IFNpZGUuQSkgPyAiMSIgOiAiMCI7CisgICAgU3RyaW5nIHNpZGVVUkwgPSAoaWRBY3RpdmUgPT0gbnVsbCkgPyAiMSIgOiAiMCI7CiAgICAgZmluYWwgU3RyaW5nIGJhc2UgPSBHV1QuZ2V0SG9zdFBhZ2VCYXNlVVJMKCkgKyAiY2F0LyI7CiAKICAgICBJbWFnZSBpbWFnZSA9IG5ldyBJbWFnZShHZXJyaXQuUkVTT1VSQ0VTLmRvd25sb2FkSWNvbigpKTsKQEAgLTE4MCw3ICsyMDEsNiBAQAogICAgIGZpbmFsIEFuY2hvciBhbmNob3IgPSBuZXcgQW5jaG9yKCk7CiAgICAgYW5jaG9yLnNldEhyZWYoYmFzZSArIEtleVV0aWwuZW5jb2RlKGtleS50b1N0cmluZygpKSArICJeIiArIHNpZGVVUkwpOwogICAgIGFuY2hvci5zZXRUaXRsZShQYXRjaFV0aWwuQy5kb3dubG9hZCgpKTsKLSAgICBhbmNob3Iuc2V0U3R5bGVOYW1lKHN0eWxlLmRvd25sb2FkTGluaygpKTsKICAgICBET00uaW5zZXJ0QmVmb3JlKGFuY2hvci5nZXRFbGVtZW50KCksIGltYWdlLmdldEVsZW1lbnQoKSwKICAgICAgICAgRE9NLmdldEZpcnN0Q2hpbGQoYW5jaG9yLmdldEVsZW1lbnQoKSkpOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNldFNlbGVjdEJveC51aS54bWwgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFNldFNlbGVjdEJveC51aS54bWwKaW5kZXggMmZkMTgzYy4uMzM4ZTk1MCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hTZXRTZWxlY3RCb3gudWkueG1sCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoU2V0U2VsZWN0Qm94LnVpLnhtbApAQCAtMTcsNjAgKzE3LDM3IEBACiAKIDx1aTpVaUJpbmRlciB4bWxuczp1aT0ndXJuOnVpOmNvbS5nb29nbGUuZ3d0LnVpYmluZGVyJwogICAgIHhtbG5zOmc9J3VybjppbXBvcnQ6Y29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWknPgotCi0KICAgPHVpOndpdGggZmllbGQ9J3JlcycgdHlwZT0nY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdFJlc291cmNlcycvPgotICA8dWk6d2l0aCBmaWVsZD0nY29ucycgdHlwZT0nY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXMuUGF0Y2hDb25zdGFudHMnLz4KICAgPHVpOnN0eWxlIHR5cGU9J2NvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzLlBhdGNoU2V0U2VsZWN0Qm94LkJveFN0eWxlJz4KICAgICBAZXZhbCBzZWxlY3Rpb25Db2xvciBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0LmdldFRoZW1lKCkuc2VsZWN0aW9uQ29sb3I7Ci0gICAgQGV2YWwgdHJpbUNvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS50cmltQ29sb3I7CiAgICAgQGV2YWwgYmFja2dyb3VuZENvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS5iYWNrZ3JvdW5kQ29sb3I7CiAKLSAgICAud3JhcHBlciB7Ci0gICAgICB3aWR0aDogMTAwJTsKLSAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKLSAgICAgIGZvbnQtc2l6ZTogMDsgLyogaW5saW5lLWJsb2NrIHNwYWNpbmcgZml4ICovCi0gICAgfQotCiAgICAgLmxpbmtQYW5lbCB7Ci0gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CisgICAgICBmb250LXNpemU6IDEycHg7CisgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgIH0KIAogICAgIC5saW5rUGFuZWwgPiBkaXYgeworICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CisgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CisgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICAgICAgZmxvYXQ6IGxlZnQ7Ci0gICAgfQotCi0gICAgLmxpbmtQYW5lbCB7Ci0gICAgICBvdmVyZmxvdzogaGlkZGVuOyAvKiBkaXYgY2xlYXIgZml4ICovCi0gICAgICBmb250LXNpemU6IDEycHg7Ci0gICAgfQotCi0gICAgLmxpbmtQYW5lbCA+IGEgewotICAgICAgcGFkZGluZzogM3B4OwotICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwotICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwotICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgfQogCiAgICAgLnBhdGNoU2V0TGFiZWwgewogICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci0gICAgICBmbG9hdDogbGVmdDsKLSAgICAgIHBhZGRpbmc6IDNweDsKICAgICB9CiAKICAgICAuc2lkZU1hcmtlciB7Ci0gICAgICBwYWRkaW5nOiAzcHg7CisgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgIH0KIAotICAgIC5kb3dubG9hZExpbmsgewotICAgICAgZmxvYXQ6IGxlZnQ7Ci0gICAgICBwYWRkaW5nOiAxcHggIWltcG9ydGFudDsKLSAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7Ci0gICAgfQotCi0gICAgLmRvd25sb2FkTGluayA+IGEgewotICAgICAgdGV4dC1zaXplOiAwOworICAgIC5saW5rUGFuZWwgPiBhIHsKKyAgICAgIHBhZGRpbmctbGVmdDogM3B4OworICAgICAgcGFkZGluZy1yaWdodDogM3B4OworICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKKyAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICB9CiAKICAgICAuc2VsZWN0ZWQgewpAQCAtNzgsMjEgKzU1LDEzIEBACiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBzZWxlY3Rpb25Db2xvcjsKICAgICB9CiAKLSAgICAuc2lkZU1hcmtlciB7Ci0gICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwotICAgICAgZmxvYXQ6IGxlZnQ7Ci0gICAgfQotCiAgICAgLmhpZGRlbiB7CiAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgfQogICA8L3VpOnN0eWxlPgogCi0gIDxnOkhUTUxQYW5lbCBzdHlsZU5hbWU9J3dyYXBwZXInPgotICAgIDxnOkhUTUxQYW5lbCBzdHlsZU5hbWU9J3tzdHlsZS5saW5rUGFuZWx9JyB1aTpmaWVsZD0nbGlua1BhbmVsJz4KLSAgICAgIDxkaXYgY2xhc3M9J3tzdHlsZS5wYXRjaFNldExhYmVsfSc+PHVpOnRleHQgZnJvbT0ie2NvbnMucGF0Y2hTZXR9IiAvPjwvZGl2PgotICAgICAgPGRpdiBjbGFzcz0ne3N0eWxlLnNpZGVNYXJrZXJ9JyB1aTpmaWVsZD0nc2lkZU1hcmtlcic+PC9kaXY+Ci0gICAgPC9nOkhUTUxQYW5lbD4KKyAgPGc6SFRNTFBhbmVsPgorICAgIDxnOkhUTUxQYW5lbCBzdHlsZU5hbWU9J3tzdHlsZS5saW5rUGFuZWx9JyB1aTpmaWVsZD0nbGlua1BhbmVsJy8+CiAgIDwvZzpIVE1MUGFuZWw+CiA8L3VpOlVpQmluZGVyPgogCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFRhYmxlSGVhZGVyLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9QYXRjaFRhYmxlSGVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDg5MDguLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hUYWJsZUhlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wYXRjaGVzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXREZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudWliaW5kZXIuY2xpZW50LlVpQmluZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaUZpZWxkOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVpYmluZGVyLmNsaWVudC5VaVRlbXBsYXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkNvbXBvc2l0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MUGFuZWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuU2ltcGxlUGFuZWw7Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRhYmxlSGVhZGVyIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotICBAVWlUZW1wbGF0ZSgiUGF0Y2hUYWJsZUhlYWRlclNpZGVCeVNpZGUudWkueG1sIikKLSAgaW50ZXJmYWNlIFNpZGVCeVNpZGVCaW5kZXIgZXh0ZW5kcyBVaUJpbmRlcjxIVE1MUGFuZWwsIFBhdGNoVGFibGVIZWFkZXI+IHsKLSAgfQotCi0gIEBVaVRlbXBsYXRlKCJQYXRjaFRhYmxlSGVhZGVyVW5pZmllZC51aS54bWwiKQotICBpbnRlcmZhY2UgVW5pZmllZEJpbmRlciBleHRlbmRzIFVpQmluZGVyPEhUTUxQYW5lbCwgUGF0Y2hUYWJsZUhlYWRlcj4gewotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU2lkZUJ5U2lkZUJpbmRlciB1aUJpbmRlclMgPSBHV1QuY3JlYXRlKFNpZGVCeVNpZGVCaW5kZXIuY2xhc3MpOwotICBwcml2YXRlIHN0YXRpYyBVbmlmaWVkQmluZGVyIHVpQmluZGVyVSA9IEdXVC5jcmVhdGUoVW5pZmllZEJpbmRlci5jbGFzcyk7Ci0KLSAgQFVpRmllbGQKLSAgU2ltcGxlUGFuZWwgc2lkZUFQYW5lbDsKLQotICBAVWlGaWVsZAotICBTaW1wbGVQYW5lbCBzaWRlQlBhbmVsOwotCi0gIFBhdGNoU2V0U2VsZWN0Qm94IGxpc3RBOwotICBQYXRjaFNldFNlbGVjdEJveCBsaXN0QjsKLQotICBwdWJsaWMgUGF0Y2hUYWJsZUhlYWRlcihQYXRjaFNjcmVlbi5UeXBlIHR5cGUpIHsKLSAgICBsaXN0QSA9IG5ldyBQYXRjaFNldFNlbGVjdEJveChQYXRjaFNldFNlbGVjdEJveC5TaWRlLkEsIHR5cGUpOwotICAgIGxpc3RCID0gbmV3IFBhdGNoU2V0U2VsZWN0Qm94KFBhdGNoU2V0U2VsZWN0Qm94LlNpZGUuQiwgdHlwZSk7Ci0KLSAgICBpZiAodHlwZSA9PSBQYXRjaFNjcmVlbi5UeXBlLlNJREVfQllfU0lERSkgewotICAgICAgaW5pdFdpZGdldCh1aUJpbmRlclMuY3JlYXRlQW5kQmluZFVpKHRoaXMpKTsKLSAgICB9IGVsc2UgewotICAgICAgaW5pdFdpZGdldCh1aUJpbmRlclUuY3JlYXRlQW5kQmluZFVpKHRoaXMpKTsKLSAgICB9Ci0KLSAgICBzaWRlQVBhbmVsLmFkZChsaXN0QSk7Ci0gICAgc2lkZUJQYW5lbC5hZGQobGlzdEIpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBkaXNwbGF5KGZpbmFsIFBhdGNoU2V0RGV0YWlsIGRldGFpbCwgUGF0Y2hTY3JpcHQgc2NyaXB0LCBmaW5hbCBQYXRjaC5LZXkgcGF0Y2hLZXksCi0gICAgICBmaW5hbCBQYXRjaFNldC5JZCBpZFNpZGVBLCBmaW5hbCBQYXRjaFNldC5JZCBpZFNpZGVCKSB7Ci0gICAgbGlzdEEuZGlzcGxheShkZXRhaWwsIHNjcmlwdCwgcGF0Y2hLZXksIGlkU2lkZUEsIGlkU2lkZUIpOwotICAgIGxpc3RCLmRpc3BsYXkoZGV0YWlsLCBzY3JpcHQsIHBhdGNoS2V5LCBpZFNpZGVBLCBpZFNpZGVCKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hUYWJsZUhlYWRlclNpZGVCeVNpZGUudWkueG1sIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hUYWJsZUhlYWRlclNpZGVCeVNpZGUudWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZkNzE3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoVGFibGVIZWFkZXJTaWRlQnlTaWRlLnVpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1Db3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHVpOlVpQmluZGVyIHhtbG5zOnVpPSd1cm46dWk6Y29tLmdvb2dsZS5nd3QudWliaW5kZXInCi0gICAgeG1sbnM6Zz0ndXJuOmltcG9ydDpjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aSc+Ci0KLQotICA8dWk6c3R5bGU+Ci0gICAgQGV2YWwgdHJpbUNvbG9yIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQuZ2V0VGhlbWUoKS50cmltQ29sb3I7Ci0KLSAgICAud3JhcHBlciB7Ci0gICAgICB3aWR0aDogMTAwJTsKLSAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyaW1Db2xvcjsKLSAgICAgIG92ZXJmbG93OiBoaWRkZW47Ci0gICAgICBmb250LXNpemU6IDA7IC8qIGlubGluZS1ibG9jayBzcGFjaW5nIGZpeCAqLwotICAgIH0KLQotICAgIC53cmFwcGVyIC5ib3ggewotICAgICAgd2lkdGg6IDEwMCU7Ci0gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Ci0gICAgfQotCi0gICAgLmxlZnRXcmFwcGVyIHsKLSAgICAgIHdpZHRoOiA1MCU7Ci0gICAgICBmbG9hdDogbGVmdDsKLSAgICB9Ci0KLSAgICAucmlnaHRXcmFwcGVyIHsKLSAgICAgIHdpZHRoOiA1MCU7Ci0gICAgICBvdmVyZmxvdzogaGlkZGVuOwotICAgIH0KLQotICAgIC5sZWZ0Qm94IHsKLSAgICAgIGZsb2F0OmxlZnQ7Ci0gICAgfQotCi0gICAgLnJpZ2h0Qm94IHsKLSAgICAgIGZsb2F0OiByaWdodDsKLSAgICB9Ci0gIDwvdWk6c3R5bGU+Ci0KLSAgPGc6SFRNTFBhbmVsIHN0eWxlTmFtZT0ie3N0eWxlLndyYXBwZXJ9Ij4KLSAgICA8ZGl2IGNsYXNzPSd7c3R5bGUubGVmdFdyYXBwZXJ9Jz4KLSAgICAgIDxnOlNpbXBsZVBhbmVsIGFkZFN0eWxlTmFtZXM9J3tzdHlsZS5ib3h9IHtzdHlsZS5sZWZ0Qm94fScgdWk6ZmllbGQ9J3NpZGVBUGFuZWwnLz4KLSAgICA8L2Rpdj4KLSAgICA8ZGl2IGNsYXNzPSd7c3R5bGUucmlnaHRXcmFwcGVyfSc+Ci0gICAgICA8ZzpTaW1wbGVQYW5lbCBhZGRTdHlsZU5hbWVzPSd7c3R5bGUuYm94fSB7c3R5bGUucmlnaHRCb3h9JyB1aTpmaWVsZD0nc2lkZUJQYW5lbCcvPgotICAgIDwvZGl2PgotICA8L2c6SFRNTFBhbmVsPgotPC91aTpVaUJpbmRlcj4KLQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hUYWJsZUhlYWRlclVuaWZpZWQudWkueG1sIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvUGF0Y2hUYWJsZUhlYWRlclVuaWZpZWQudWkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFjZmEzLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1BhdGNoVGFibGVIZWFkZXJVbmlmaWVkLnVpLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1Db3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHVpOlVpQmluZGVyIHhtbG5zOnVpPSd1cm46dWk6Y29tLmdvb2dsZS5nd3QudWliaW5kZXInCi0gICAgeG1sbnM6Zz0ndXJuOmltcG9ydDpjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aSc+Ci0KLSAgPHVpOnN0eWxlPgotICAgIEBldmFsIHRyaW1Db2xvciBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0LmdldFRoZW1lKCkudHJpbUNvbG9yOwotCi0gICAgLndyYXBwZXIgewotICAgICAgd2lkdGg6IDEwMCU7Ci0gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmltQ29sb3I7Ci0gICAgICBmb250LXNpemU6IDA7IC8qIGlubGluZS1ibG9jayBzcGFjaW5nIGZpeCAqLwotICAgIH0KLQotICAgIC53cmFwcGVyIC5ib3ggewotICAgICAgd2lkdGg6IDEwMCU7Ci0gICAgICB0ZXh0LWFsaWduOiBsZWZ0OwotICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKLSAgICB9Ci0gIDwvdWk6c3R5bGU+Ci0KLSAgPGc6SFRNTFBhbmVsIHN0eWxlTmFtZT0ie3N0eWxlLndyYXBwZXJ9Ij4KLSAgICA8ZzpTaW1wbGVQYW5lbCBhZGRTdHlsZU5hbWVzPSd7c3R5bGUuYm94fScgdWk6ZmllbGQ9J3NpZGVBUGFuZWwnLz4KLSAgICA8ZzpTaW1wbGVQYW5lbCBhZGRTdHlsZU5hbWVzPSd7c3R5bGUuYm94fScgdWk6ZmllbGQ9J3NpZGVCUGFuZWwnLz4KLSAgPC9nOkhUTUxQYW5lbD4KLTwvdWk6VWlCaW5kZXI+Ci0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1Jldmlld2VkUGFuZWxzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9SZXZpZXdlZFBhbmVscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZGY0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9SZXZpZXdlZFBhbmVscy5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnBhdGNoZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Wb2lkUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5jaGFuZ2VzLlBhdGNoVGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmNoYW5nZXMuUGF0Y2hUYWJsZS5QYXRjaFZhbGlkYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuY2hhbmdlcy5VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuQ2hhbmdlTGluazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWkuSW5saW5lSHlwZXJsaW5rOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmxvZ2ljYWwuc2hhcmVkLlZhbHVlQ2hhbmdlRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQubG9naWNhbC5zaGFyZWQuVmFsdWVDaGFuZ2VIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5DaGVja0JveDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWxCdWlsZGVyOworCitwdWJsaWMgY2xhc3MgUmV2aWV3ZWRQYW5lbHMgeworCisgIHB1YmxpYyBmaW5hbCBGbG93UGFuZWwgdG9wOworICBwdWJsaWMgZmluYWwgRmxvd1BhbmVsIGJvdHRvbTsKKworICBwcml2YXRlIFBhdGNoLktleSBwYXRjaEtleTsKKyAgcHJpdmF0ZSBQYXRjaFRhYmxlIGZpbGVMaXN0OworICBwcml2YXRlIElubGluZUh5cGVybGluayByZXZpZXdlZExpbms7CisgIHByaXZhdGUgQ2hlY2tCb3ggY2hlY2tCb3hUb3A7CisgIHByaXZhdGUgQ2hlY2tCb3ggY2hlY2tCb3hCb3R0b207CisKKyAgcHVibGljIFJldmlld2VkUGFuZWxzKCkgeworICAgIHRoaXMudG9wID0gbmV3IEZsb3dQYW5lbCgpOworICAgIHRoaXMuYm90dG9tID0gbmV3IEZsb3dQYW5lbCgpOworICAgIHRoaXMuYm90dG9tLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnJldmlld2VkUGFuZWxCb3R0b20oKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwb3B1bGF0ZShQYXRjaC5LZXkgcGssIFBhdGNoVGFibGUgcHQsIGludCBwYXRjaEluZGV4LAorICAgICAgUGF0Y2hTY3JlZW4uVHlwZSBwYXRjaFNjcmVlblR5cGUpIHsKKyAgICBwYXRjaEtleSA9IHBrOworICAgIGZpbGVMaXN0ID0gcHQ7CisgICAgcmV2aWV3ZWRMaW5rID0gY3JlYXRlUmV2aWV3ZWRMaW5rKHBhdGNoSW5kZXgsIHBhdGNoU2NyZWVuVHlwZSk7CisKKyAgICB0b3AuY2xlYXIoKTsKKyAgICBjaGVja0JveFRvcCA9IGNyZWF0ZVJldmlld2VkQ2hlY2tib3goKTsKKyAgICB0b3AuYWRkKGNoZWNrQm94VG9wKTsKKyAgICB0b3AuYWRkKGNyZWF0ZVJldmlld2VkQW5jaG9yKCkpOworCisgICAgYm90dG9tLmNsZWFyKCk7CisgICAgY2hlY2tCb3hCb3R0b20gPSBjcmVhdGVSZXZpZXdlZENoZWNrYm94KCk7CisgICAgYm90dG9tLmFkZChjaGVja0JveEJvdHRvbSk7CisgICAgYm90dG9tLmFkZChjcmVhdGVSZXZpZXdlZEFuY2hvcigpKTsKKyAgfQorCisgIHByaXZhdGUgQ2hlY2tCb3ggY3JlYXRlUmV2aWV3ZWRDaGVja2JveCgpIHsKKyAgICBmaW5hbCBDaGVja0JveCBjaGVja0JveCA9IG5ldyBDaGVja0JveChQYXRjaFV0aWwuQy5yZXZpZXdlZEFuZCgpICsgIiAiKTsKKyAgICBjaGVja0JveC5hZGRWYWx1ZUNoYW5nZUhhbmRsZXIobmV3IFZhbHVlQ2hhbmdlSGFuZGxlcjxCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25WYWx1ZUNoYW5nZShWYWx1ZUNoYW5nZUV2ZW50PEJvb2xlYW4+IGV2ZW50KSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gdmFsdWUgPSBldmVudC5nZXRWYWx1ZSgpOworICAgICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIodmFsdWUpOworICAgICAgICBpZiAoY2hlY2tCb3hUb3AuZ2V0VmFsdWUoKSAhPSB2YWx1ZSkgeworICAgICAgICAgIGNoZWNrQm94VG9wLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hlY2tCb3hCb3R0b20uZ2V0VmFsdWUoKSAhPSB2YWx1ZSkgeworICAgICAgICAgIGNoZWNrQm94Qm90dG9tLnNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBjaGVja0JveDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgeworICAgIHJldHVybiBjaGVja0JveFRvcC5nZXRWYWx1ZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgYm9vbGVhbiB2YWx1ZSkgeworICAgIGNoZWNrQm94VG9wLnNldFZhbHVlKHZhbHVlKTsKKyAgICBjaGVja0JveEJvdHRvbS5zZXRWYWx1ZSh2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoYm9vbGVhbiByZXZpZXdlZCkgeworICAgIGlmIChmaWxlTGlzdCAhPSBudWxsKSB7CisgICAgICBmaWxlTGlzdC51cGRhdGVSZXZpZXdlZFN0YXR1cyhwYXRjaEtleSwgcmV2aWV3ZWQpOworICAgIH0KKworICAgIFBhdGNoU2V0LklkIHBzID0gcGF0Y2hLZXkuZ2V0UGFyZW50S2V5KCk7CisgICAgUmVzdEFwaSBhcGkgPSBuZXcgUmVzdEFwaSgiL2NoYW5nZXMvIikuaWQocHMuZ2V0UGFyZW50S2V5KCkuZ2V0KCkpCisgICAgICAgIC52aWV3KCJyZXZpc2lvbnMiKS5pZChwcy5nZXQoKSkKKyAgICAgICAgLnZpZXcoImZpbGVzIikuaWQocGF0Y2hLZXkuZ2V0RmlsZU5hbWUoKSkKKyAgICAgICAgLnZpZXcoInJldmlld2VkIik7CisKKyAgICBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNiID0gbmV3IEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgYXJnMCkgeworICAgICAgICAvLyBub3AKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoVm9pZFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgLy8gbm9wCisgICAgICB9CisgICAgfTsKKyAgICBpZiAocmV2aWV3ZWQpIHsKKyAgICAgIGFwaS5wdXQoY2IpOworICAgIH0gZWxzZSB7CisgICAgICBhcGkuZGVsZXRlKGNiKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBnbygpIHsKKyAgICBpZiAocmV2aWV3ZWRMaW5rICE9IG51bGwpIHsKKyAgICAgIHNldFJldmlld2VkQnlDdXJyZW50VXNlcih0cnVlKTsKKyAgICAgIHJldmlld2VkTGluay5nbygpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgSW5saW5lSHlwZXJsaW5rIGNyZWF0ZVJldmlld2VkTGluayhmaW5hbCBpbnQgcGF0Y2hJbmRleCwKKyAgICAgIGZpbmFsIFBhdGNoU2NyZWVuLlR5cGUgcGF0Y2hTY3JlZW5UeXBlKSB7CisgICAgZmluYWwgUGF0Y2hWYWxpZGF0b3IgdW5yZXZpZXdlZFZhbGlkYXRvciA9IG5ldyBQYXRjaFZhbGlkYXRvcigpIHsKKyAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoUGF0Y2ggcGF0Y2gpIHsKKyAgICAgICAgcmV0dXJuICFwYXRjaC5pc1Jldmlld2VkQnlDdXJyZW50VXNlcigpOworICAgICAgfQorICAgIH07CisKKyAgICBJbmxpbmVIeXBlcmxpbmsgcmV2aWV3ZWRMaW5rID0gbmV3IENoYW5nZUxpbmsoIiIsIHBhdGNoS2V5LmdldFBhcmVudEtleSgpKTsKKyAgICBpZiAoZmlsZUxpc3QgIT0gbnVsbCkgeworICAgICAgaW50IG5leHRVbnJldmlld2VkUGF0Y2hJbmRleCA9CisgICAgICAgICAgZmlsZUxpc3QuZ2V0TmV4dFBhdGNoKHBhdGNoSW5kZXgsIHRydWUsIHVucmV2aWV3ZWRWYWxpZGF0b3IsCisgICAgICAgICAgICAgIGZpbGVMaXN0LlBSRUZFUkVOQ0VfVkFMSURBVE9SKTsKKworICAgICAgaWYgKG5leHRVbnJldmlld2VkUGF0Y2hJbmRleCA+IC0xKSB7CisgICAgICAgIC8vIENyZWF0ZSBpbnZpc2libGUgcGF0Y2ggbGluayB0byBjaGFuZ2UgcGFnZQorICAgICAgICByZXZpZXdlZExpbmsgPQorICAgICAgICAgICAgZmlsZUxpc3QuY3JlYXRlTGluayhuZXh0VW5yZXZpZXdlZFBhdGNoSW5kZXgsIHBhdGNoU2NyZWVuVHlwZSwKKyAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgcmV2aWV3ZWRMaW5rLnNldFRleHQoIiIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV2aWV3ZWRMaW5rOworICB9CisKKyAgcHJpdmF0ZSBBbmNob3IgY3JlYXRlUmV2aWV3ZWRBbmNob3IoKSB7CisgICAgU2FmZUh0bWxCdWlsZGVyIHRleHQgPSBuZXcgU2FmZUh0bWxCdWlsZGVyKCk7CisgICAgdGV4dC5hcHBlbmQoUGF0Y2hVdGlsLkMubmV4dCgpKTsKKyAgICB0ZXh0LmFwcGVuZChTYWZlSHRtbC5hc2lzKFV0aWwuQy5uZXh0UGF0Y2hMaW5rSWNvbigpKSk7CisKKyAgICBBbmNob3IgcmV2aWV3ZWRBbmNob3IgPSBuZXcgQW5jaG9yKCIiKTsKKyAgICBTYWZlSHRtbC5zZXQocmV2aWV3ZWRBbmNob3IsIHRleHQpOworCisgICAgcmV2aWV3ZWRBbmNob3IuYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soQ2xpY2tFdmVudCBldmVudCkgeworICAgICAgICBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIodHJ1ZSk7CisgICAgICAgIHJldmlld2VkTGluay5nbygpOworICAgICAgfQorICAgIH0pOworCisgICAgcmV0dXJuIHJldmlld2VkQW5jaG9yOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9TaWRlQnlTaWRlVGFibGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1NpZGVCeVNpZGVUYWJsZS5qYXZhCmluZGV4IGVjNjNhODMuLjE1YWI5NTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1NpZGVCeVNpZGVUYWJsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1NpZGVCeVNpZGVUYWJsZS5qYXZhCkBAIC0yMywyMyArMjMsMjYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Db21tZW50RGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2NyaXB0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2NyaXB0LkZpbGVNb2RlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2V0RGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnByZXR0aWZ5LmNvbW1vbi5FZGl0TGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wcmV0dGlmeS5jb21tb24uU3BhcnNlSHRtbEZpbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0V2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tIYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LkRPTTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FbGVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFuY2hvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSFRNTFRhYmxlLkNlbGxGb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSGFzVmVydGljYWxBbGlnbm1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW5saW5lTGFiZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuVUlPYmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuU2FmZUh0bWxCdWlsZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlmZi5FZGl0OwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBTaWRlQnlTaWRlVGFibGUgZXh0ZW5kcyBBYnN0cmFjdFBhdGNoQ29udGVudFRhYmxlIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEEgPSAyOwpAQCAtNDgsMTAgKzUxLDIxIEBACiAKICAgcHJpdmF0ZSBTcGFyc2VIdG1sRmlsZSBhOwogICBwcml2YXRlIFNwYXJzZUh0bWxGaWxlIGI7CisgIHByb3RlY3RlZCBib29sZWFuIGlzRmlsZUNvbW1lbnRCb3JkZXJSb3dFeGlzdDsKKworICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUEoKSB7CisgICAgY3JlYXRlQ29tbWVudEVkaXRvcihSX0hFQUQgKyAxLCBBLCBSX0hFQUQsIEZJTEVfU0lERV9BKTsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUIoKSB7CisgICAgY3JlYXRlQ29tbWVudEVkaXRvcihSX0hFQUQgKyAxLCBCLCBSX0hFQUQsIEZJTEVfU0lERV9CKTsKKyAgICByZXR1cm47CisgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgb25DZWxsRG91YmxlQ2xpY2soZmluYWwgaW50IHJvdywgaW50IGNvbHVtbikgewotICAgIGlmIChjb2x1bW4gPiAwICYmIGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIFBhdGNoTGluZSkgeworICAgIGlmIChjb2x1bW4gPiBDX0FSUk9XICYmIGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIFBhdGNoTGluZSkgewogICAgICAgZmluYWwgUGF0Y2hMaW5lIGxpbmUgPSAoUGF0Y2hMaW5lKSBnZXRSb3dJdGVtKHJvdyk7CiAgICAgICBpZiAoY29sdW1uID09IDEgfHwgY29sdW1uID09IEEpIHsKICAgICAgICAgY3JlYXRlQ29tbWVudEVkaXRvcihyb3cgKyAxLCBBLCBsaW5lLmdldExpbmVBKCksIChzaG9ydCkgMCk7CkBAIC02Myw2ICs3Nyw3IEBACiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uQ2VsbFNpbmdsZUNsaWNrKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBzdXBlci5vbkNlbGxTaW5nbGVDbGljayhyb3csIGNvbHVtbik7CiAgICAgaWYgKGNvbHVtbiA9PSAxIHx8IGNvbHVtbiA9PSA0KSB7CiAgICAgICBvbkNlbGxEb3VibGVDbGljayhyb3csIGNvbHVtbik7CiAgICAgfQpAQCAtNzUsMTA2ICs5MCwxMzggQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCByZW5kZXIoZmluYWwgUGF0Y2hTY3JpcHQgc2NyaXB0KSB7Ci0gICAgYSA9IGdldFNwYXJzZUh0bWxGaWxlQShzY3JpcHQpOwotICAgIGIgPSBnZXRTcGFyc2VIdG1sRmlsZUIoc2NyaXB0KTsKKyAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyKGZpbmFsIFBhdGNoU2NyaXB0IHNjcmlwdCwgZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7CiAgICAgZmluYWwgQXJyYXlMaXN0PE9iamVjdD4gbGluZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKICAgICBmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbmMgPSBuZXcgU2FmZUh0bWxCdWlsZGVyKCk7Ci0gICAgZmluYWwgYm9vbGVhbiBpbnRyYWxpbmUgPQotICAgICAgICBzY3JpcHQuZ2V0RGlmZlByZWZzKCkuaXNJbnRyYWxpbmVEaWZmZXJlbmNlKCkKLSAgICAgICAgICAgICYmIHNjcmlwdC5oYXNJbnRyYWxpbmVEaWZmZXJlbmNlKCk7Ci0KLSAgICBpZiAoc2NyaXB0LmdldEZpbGVNb2RlQSgpICE9IEZpbGVNb2RlLkZJTEUKLSAgICAgICAgfHwgc2NyaXB0LmdldEZpbGVNb2RlQigpICE9IEZpbGVNb2RlLkZJTEUpIHsKLSAgICAgIG9wZW5MaW5lKG5jKTsKLSAgICAgIGFwcGVuZE1vZGVMaW5lKG5jLCBzY3JpcHQuZ2V0RmlsZU1vZGVBKCkpOwotICAgICAgYXBwZW5kTW9kZUxpbmUobmMsIHNjcmlwdC5nZXRGaWxlTW9kZUIoKSk7Ci0gICAgICBjbG9zZUxpbmUobmMpOwotICAgICAgbGluZXMuYWRkKG51bGwpOwotICAgIH0KLQotICAgIGludCBsYXN0QSA9IDA7Ci0gICAgaW50IGxhc3RCID0gMDsKLSAgICBmaW5hbCBib29sZWFuIGlnbm9yZVdTID0gc2NyaXB0LmlzSWdub3JlV2hpdGVzcGFjZSgpOwotICAgIGZvciAoZmluYWwgRWRpdExpc3QuSHVuayBodW5rIDogc2NyaXB0LmdldEh1bmtzKCkpIHsKLSAgICAgIGlmICghaHVuay5pc1N0YXJ0T2ZGaWxlKCkpIHsKLSAgICAgICAgYXBwZW5kU2tpcExpbmUobmMsIGh1bmsuZ2V0Q3VyQigpIC0gbGFzdEIpOwotICAgICAgICBsaW5lcy5hZGQobmV3IFNraXBwZWRMaW5lKGxhc3RBLCBsYXN0QiwgaHVuay5nZXRDdXJCKCkgLSBsYXN0QikpOworICAgIGFsbG9jYXRlVGFibGVIZWFkZXIoc2NyaXB0LCBuYyk7CisgICAgbGluZXMuYWRkKG51bGwpOworICAgIGlmICghaXNEaXNwbGF5QmluYXJ5KSB7CisgICAgICBpZiAoc2NyaXB0LmdldEZpbGVNb2RlQSgpICE9IEZpbGVNb2RlLkZJTEUKKyAgICAgICAgICB8fCBzY3JpcHQuZ2V0RmlsZU1vZGVCKCkgIT0gRmlsZU1vZGUuRklMRSkgeworICAgICAgICBvcGVuTGluZShuYyk7CisgICAgICAgIGFwcGVuZE1vZGVMaW5lKG5jLCBzY3JpcHQuZ2V0RmlsZU1vZGVBKCkpOworICAgICAgICBhcHBlbmRNb2RlTGluZShuYywgc2NyaXB0LmdldEZpbGVNb2RlQigpKTsKKyAgICAgICAgY2xvc2VMaW5lKG5jKTsKKyAgICAgICAgbGluZXMuYWRkKG51bGwpOwogICAgICAgfQogCi0gICAgICB3aGlsZSAoaHVuay5uZXh0KCkpIHsKLSAgICAgICAgaWYgKGh1bmsuaXNDb250ZXh0TGluZSgpKSB7Ci0gICAgICAgICAgb3BlbkxpbmUobmMpOwotICAgICAgICAgIGZpbmFsIFNhZmVIdG1sIGN0eCA9IGEuZ2V0U2FmZUh0bWxMaW5lKGh1bmsuZ2V0Q3VyQSgpKTsKLSAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckEoKSwgZmFsc2UpOwotICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBDT05URVhULCBjdHgsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgaWYgKGlnbm9yZVdTICYmIGIuY29udGFpbnMoaHVuay5nZXRDdXJCKCkpKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgQ09OVEVYVCwgYiwgaHVuay5nZXRDdXJCKCksIGZhbHNlKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIENPTlRFWFQsIGN0eCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJCKCksIHRydWUpOwotICAgICAgICAgIGNsb3NlTGluZShuYyk7Ci0gICAgICAgICAgaHVuay5pbmNCb3RoKCk7Ci0gICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoQ09OVEVYVCwgaHVuay5nZXRDdXJBKCksIGh1bmsuZ2V0Q3VyQigpKSk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChodW5rLmlzTW9kaWZpZWRMaW5lKCkpIHsKLSAgICAgICAgICBmaW5hbCBib29sZWFuIGRlbCA9IGh1bmsuaXNEZWxldGVkQSgpOwotICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5zID0gaHVuay5pc0luc2VydGVkQigpOwotICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZnVsbCA9Ci0gICAgICAgICAgICAgIGludHJhbGluZSAmJiBodW5rLmdldEN1ckVkaXQoKS5nZXRUeXBlKCkgIT0gRWRpdC5UeXBlLlJFUExBQ0U7Ci0gICAgICAgICAgb3BlbkxpbmUobmMpOwotCi0gICAgICAgICAgaWYgKGRlbCkgewotICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJBKCksIGZhbHNlKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBERUxFVEUsIGEsIGh1bmsuZ2V0Q3VyQSgpLCBmdWxsKTsKLSAgICAgICAgICAgIGh1bmsuaW5jQSgpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaHVuay5nZXRDdXJFZGl0KCkuZ2V0VHlwZSgpID09IEVkaXQuVHlwZS5SRVBMQUNFKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBmYWxzZSk7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgREVMRVRFKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgZmFsc2UpOwotICAgICAgICAgICAgYXBwZW5kTGluZU5vbmUobmMsIENPTlRFWFQpOworICAgICAgaWYgKGhhc0RpZmZlcmVuY2VzKHNjcmlwdCkpIHsKKyAgICAgICAgaW50IGxhc3RBID0gMDsKKyAgICAgICAgaW50IGxhc3RCID0gMDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpZ25vcmVXUyA9IHNjcmlwdC5pc0lnbm9yZVdoaXRlc3BhY2UoKTsKKyAgICAgICAgYSA9IGdldFNwYXJzZUh0bWxGaWxlQShzY3JpcHQpOworICAgICAgICBiID0gZ2V0U3BhcnNlSHRtbEZpbGVCKHNjcmlwdCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW50cmFsaW5lID0KKyAgICAgICAgICAgIHNjcmlwdC5nZXREaWZmUHJlZnMoKS5pc0ludHJhbGluZURpZmZlcmVuY2UoKQorICAgICAgICAgICAgICAgICYmIHNjcmlwdC5oYXNJbnRyYWxpbmVEaWZmZXJlbmNlKCk7CisgICAgICAgIGZvciAoZmluYWwgRWRpdExpc3QuSHVuayBodW5rIDogc2NyaXB0LmdldEh1bmtzKCkpIHsKKyAgICAgICAgICBpZiAoIWh1bmsuaXNTdGFydE9mRmlsZSgpKSB7CisgICAgICAgICAgICBhcHBlbmRTa2lwTGluZShuYywgaHVuay5nZXRDdXJCKCkgLSBsYXN0Qik7CisgICAgICAgICAgICBsaW5lcy5hZGQobmV3IFNraXBwZWRMaW5lKGxhc3RBLCBsYXN0QiwgaHVuay5nZXRDdXJCKCkgLSBsYXN0QikpOwogICAgICAgICAgIH0KIAotICAgICAgICAgIGlmIChpbnMpIHsKLSAgICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBJTlNFUlQsIGIsIGh1bmsuZ2V0Q3VyQigpLCBmdWxsKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGh1bmsuZ2V0Q3VyQigpLCB0cnVlKTsKLSAgICAgICAgICAgIGh1bmsuaW5jQigpOwotICAgICAgICAgIH0gZWxzZSBpZiAoaHVuay5nZXRDdXJFZGl0KCkuZ2V0VHlwZSgpID09IEVkaXQuVHlwZS5SRVBMQUNFKSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgSU5TRVJUKTsKLSAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIHRydWUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgQ09OVEVYVCk7Ci0gICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCB0cnVlKTsKKyAgICAgICAgICB3aGlsZSAoaHVuay5uZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChodW5rLmlzQ29udGV4dExpbmUoKSkgeworICAgICAgICAgICAgICBvcGVuTGluZShuYyk7CisgICAgICAgICAgICAgIGZpbmFsIFNhZmVIdG1sIGN0eCA9IGEuZ2V0U2FmZUh0bWxMaW5lKGh1bmsuZ2V0Q3VyQSgpKTsKKyAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJBKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIENPTlRFWFQsIGN0eCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgaWYgKGlnbm9yZVdTICYmIGIuY29udGFpbnMoaHVuay5nZXRDdXJCKCkpKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIENPTlRFWFQsIGIsIGh1bmsuZ2V0Q3VyQigpLCBmYWxzZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIENPTlRFWFQsIGN0eCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckIoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgIGNsb3NlTGluZShuYyk7CisgICAgICAgICAgICAgIGh1bmsuaW5jQm90aCgpOworICAgICAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShDT05URVhULCBodW5rLmdldEN1ckEoKSwgaHVuay5nZXRDdXJCKCkpKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChodW5rLmlzTW9kaWZpZWRMaW5lKCkpIHsKKyAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkZWwgPSBodW5rLmlzRGVsZXRlZEEoKTsKKyAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbnMgPSBodW5rLmlzSW5zZXJ0ZWRCKCk7CisgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZnVsbCA9CisgICAgICAgICAgICAgICAgICBpbnRyYWxpbmUgJiYgaHVuay5nZXRDdXJFZGl0KCkuZ2V0VHlwZSgpICE9IEVkaXQuVHlwZS5SRVBMQUNFOworICAgICAgICAgICAgICBvcGVuTGluZShuYyk7CisKKyAgICAgICAgICAgICAgaWYgKGRlbCkgeworICAgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGh1bmsuZ2V0Q3VyQSgpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIERFTEVURSwgYSwgaHVuay5nZXRDdXJBKCksIGZ1bGwpOworICAgICAgICAgICAgICAgIGh1bmsuaW5jQSgpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh1bmsuZ2V0Q3VyRWRpdCgpLmdldFR5cGUoKSA9PSBFZGl0LlR5cGUuUkVQTEFDRSkgeworICAgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTm9uZShuYywgREVMRVRFKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZU5vbmUobmMsIENPTlRFWFQpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKGlucykgeworICAgICAgICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBJTlNFUlQsIGIsIGh1bmsuZ2V0Q3VyQigpLCBmdWxsKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyKG5jLCBodW5rLmdldEN1ckIoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaHVuay5pbmNCKCk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHVuay5nZXRDdXJFZGl0KCkuZ2V0VHlwZSgpID09IEVkaXQuVHlwZS5SRVBMQUNFKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZU5vbmUobmMsIElOU0VSVCk7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgdHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTGluZU5vbmUobmMsIENPTlRFWFQpOworICAgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIHRydWUpOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgY2xvc2VMaW5lKG5jKTsKKworICAgICAgICAgICAgICBpZiAoZGVsICYmIGlucykgeworICAgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKFJFUExBQ0UsIGh1bmsuZ2V0Q3VyQSgpLCBodW5rLmdldEN1ckIoKSkpOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbCkgeworICAgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKERFTEVURSwgaHVuay5nZXRDdXJBKCksIC0xKSk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zKSB7CisgICAgICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoSU5TRVJULCAtMSwgaHVuay5nZXRDdXJCKCkpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgIH0KLQotICAgICAgICAgIGNsb3NlTGluZShuYyk7Ci0KLSAgICAgICAgICBpZiAoZGVsICYmIGlucykgewotICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoUkVQTEFDRSwgaHVuay5nZXRDdXJBKCksIGh1bmsuZ2V0Q3VyQigpKSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChkZWwpIHsKLSAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKERFTEVURSwgaHVuay5nZXRDdXJBKCksIDApKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGlucykgewotICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoSU5TRVJULCAwLCBodW5rLmdldEN1ckIoKSkpOworICAgICAgICAgIGxhc3RBID0gaHVuay5nZXRDdXJBKCk7CisgICAgICAgICAgbGFzdEIgPSBodW5rLmdldEN1ckIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdEIgIT0gYi5zaXplKCkpIHsKKyAgICAgICAgICBhcHBlbmRTa2lwTGluZShuYywgYi5zaXplKCkgLSBsYXN0Qik7CisgICAgICAgICAgbGluZXMuYWRkKG5ldyBTa2lwcGVkTGluZShsYXN0QSwgbGFzdEIsIGIuc2l6ZSgpIC0gbGFzdEIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH1lbHNleworICAgICAgLy8gRGlzcGxheSB0aGUgcGF0Y2ggaGVhZGVyIGZvciBiaW5hcnkKKyAgICAgIGZvciAoZmluYWwgU3RyaW5nIGxpbmUgOiBzY3JpcHQuZ2V0UGF0Y2hIZWFkZXIoKSkgeworICAgICAgICBhcHBlbmRGaWxlSGVhZGVyKG5jLCBsaW5lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFoYXNEaWZmZXJlbmNlcyhzY3JpcHQpKSB7CisgICAgICBhcHBlbmROb0RpZmZlcmVuY2VzKG5jKTsKKyAgICB9CisgICAgcmVzZXRIdG1sKG5jKTsKKyAgICBwb3B1bGF0ZVRhYmxlSGVhZGVyKHNjcmlwdCwgZGV0YWlsKTsKKyAgICBpZiAoaGFzRGlmZmVyZW5jZXMoc2NyaXB0KSkgeworICAgICAgaW5pdFNjcmlwdChzY3JpcHQpOworICAgICAgaWYgKCFpc0Rpc3BsYXlCaW5hcnkpIHsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbGluZXMuc2l6ZSgpOyByb3crKykgeworICAgICAgICAgIHNldFJvd0l0ZW0ocm93LCBsaW5lcy5nZXQocm93KSk7CisgICAgICAgICAgaWYgKGxpbmVzLmdldChyb3cpIGluc3RhbmNlb2YgU2tpcHBlZExpbmUpIHsKKyAgICAgICAgICAgIGNyZWF0ZVNraXBMaW5lKHJvdywgKFNraXBwZWRMaW5lKSBsaW5lcy5nZXQocm93KSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBsYXN0QSA9IGh1bmsuZ2V0Q3VyQSgpOwotICAgICAgbGFzdEIgPSBodW5rLmdldEN1ckIoKTsKICAgICB9Ci0gICAgaWYgKGxhc3RCICE9IGIuc2l6ZSgpKSB7Ci0gICAgICBhcHBlbmRTa2lwTGluZShuYywgYi5zaXplKCkgLSBsYXN0Qik7Ci0gICAgICBsaW5lcy5hZGQobmV3IFNraXBwZWRMaW5lKGxhc3RBLCBsYXN0QiwgYi5zaXplKCkgLSBsYXN0QikpOwotICAgIH0KLSAgICByZXNldEh0bWwobmMpOwotICAgIGluaXRTY3JpcHQoc2NyaXB0KTsKKyAgfQogCi0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbGluZXMuc2l6ZSgpOyByb3crKykgewotICAgICAgc2V0Um93SXRlbShyb3csIGxpbmVzLmdldChyb3cpKTsKLSAgICAgIGlmIChsaW5lcy5nZXQocm93KSBpbnN0YW5jZW9mIFNraXBwZWRMaW5lKSB7Ci0gICAgICAgIGNyZWF0ZVNraXBMaW5lKHJvdywgKFNraXBwZWRMaW5lKSBsaW5lcy5nZXQocm93KSk7Ci0gICAgICB9CisgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVRhYmxlSGVhZGVyKGZpbmFsIFBhdGNoU2NyaXB0IHNjcmlwdCwKKyAgICAgIGZpbmFsIFBhdGNoU2V0RGV0YWlsIGRldGFpbCkgeworICAgIGluaXRIZWFkZXJzKHNjcmlwdCwgZGV0YWlsKTsKKyAgICB0YWJsZS5zZXRXaWRnZXQoUl9IRUFELCBBLCBoZWFkZXJTaWRlQSk7CisgICAgdGFibGUuc2V0V2lkZ2V0KFJfSEVBRCwgQiwgaGVhZGVyU2lkZUIpOworCisgICAgLy8gUG9wdWxhdGUgaWNvbnMgdG8gbGluZU51bWJlciBjb2x1bW4gaGVhZGVyLgorICAgIGlmIChoZWFkZXJTaWRlQS5pc0ZpbGVPckNvbW1pdE1lc3NhZ2UoKSkgeworICAgICAgdGFibGUuc2V0V2lkZ2V0KFJfSEVBRCwgQSAtIDEsIGljb25BKTsKKyAgICB9CisgICAgaWYgKGhlYWRlclNpZGVCLmlzRmlsZU9yQ29tbWl0TWVzc2FnZSgpKSB7CisgICAgICB0YWJsZS5zZXRXaWRnZXQoUl9IRUFELCBCICsgMSwgaWNvbkIpOwogICAgIH0KICAgfQogCkBAIC0yMDIsNiArMjQ5LDExIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFBhdGNoU2NyZWVuLlR5cGUgZ2V0UGF0Y2hTY3JlZW5UeXBlKCkgeworICAgIHJldHVybiBQYXRjaFNjcmVlbi5UeXBlLlNJREVfQllfU0lERTsKKyAgfQorCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBkaXNwbGF5KGZpbmFsIENvbW1lbnREZXRhaWwgY2QsIGJvb2xlYW4gZXhwYW5kQ29tbWVudHMpIHsKICAgICBpZiAoY2QuaXNFbXB0eSgpKSB7CiAgICAgICByZXR1cm47CkBAIC0yMDksNTEgKzI2MSwxNjMgQEAKICAgICBzZXRBY2NvdW50SW5mb0NhY2hlKGNkLmdldEFjY291bnRzKCkpOwogCiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgdGFibGUuZ2V0Um93Q291bnQoKTspIHsKLSAgICAgIGlmIChnZXRSb3dJdGVtKHJvdykgaW5zdGFuY2VvZiBQYXRjaExpbmUpIHsKKyAgICAgIGZpbmFsIEl0ZXJhdG9yPFBhdGNoTGluZUNvbW1lbnQ+IGFpOworICAgICAgZmluYWwgSXRlcmF0b3I8UGF0Y2hMaW5lQ29tbWVudD4gYmk7CisKKyAgICAgIGlmIChyb3cgPT0gUl9IRUFEKSB7CisgICAgICAgIGFpID0gY2QuZ2V0Rm9yQShSX0hFQUQpLml0ZXJhdG9yKCk7CisgICAgICAgIGJpID0gY2QuZ2V0Rm9yQihSX0hFQUQpLml0ZXJhdG9yKCk7CisgICAgICB9IGVsc2UgaWYgKGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIFBhdGNoTGluZSkgewogICAgICAgICBmaW5hbCBQYXRjaExpbmUgcExpbmUgPSAoUGF0Y2hMaW5lKSBnZXRSb3dJdGVtKHJvdyk7Ci0gICAgICAgIGZpbmFsIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZm9yYSA9IGNkLmdldEZvckEocExpbmUuZ2V0TGluZUEoKSk7Ci0gICAgICAgIGZpbmFsIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZm9yYiA9IGNkLmdldEZvckIocExpbmUuZ2V0TGluZUIoKSk7Ci0gICAgICAgIHJvdysrOwotCi0gICAgICAgIGZpbmFsIEl0ZXJhdG9yPFBhdGNoTGluZUNvbW1lbnQ+IGFpID0gZm9yYS5pdGVyYXRvcigpOwotICAgICAgICBmaW5hbCBJdGVyYXRvcjxQYXRjaExpbmVDb21tZW50PiBiaSA9IGZvcmIuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGFpLmhhc05leHQoKSAmJiBiaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBmaW5hbCBQYXRjaExpbmVDb21tZW50IGFjID0gYWkubmV4dCgpOwotICAgICAgICAgIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgYmMgPSBiaS5uZXh0KCk7Ci0gICAgICAgICAgaW5zZXJ0Um93KHJvdyk7Ci0gICAgICAgICAgYmluZENvbW1lbnQocm93LCBBLCBhYywgIWFpLmhhc05leHQoKSwgZXhwYW5kQ29tbWVudHMpOwotICAgICAgICAgIGJpbmRDb21tZW50KHJvdywgQiwgYmMsICFiaS5oYXNOZXh0KCksIGV4cGFuZENvbW1lbnRzKTsKLSAgICAgICAgICByb3crKzsKLSAgICAgICAgfQotCi0gICAgICAgIHJvdyA9IGZpbmlzaChhaSwgcm93LCBBLCBleHBhbmRDb21tZW50cyk7Ci0gICAgICAgIHJvdyA9IGZpbmlzaChiaSwgcm93LCBCLCBleHBhbmRDb21tZW50cyk7CisgICAgICAgIGFpID0gY2QuZ2V0Rm9yQShwTGluZS5nZXRMaW5lQSgpKS5pdGVyYXRvcigpOworICAgICAgICBiaSA9IGNkLmdldEZvckIocExpbmUuZ2V0TGluZUIoKSkuaXRlcmF0b3IoKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJvdysrOworICAgICAgICBjb250aW51ZTsKICAgICAgIH0KKworICAgICAgcm93Kys7CisgICAgICB3aGlsZSAoYWkuaGFzTmV4dCgpICYmIGJpLmhhc05leHQoKSkgeworICAgICAgICBmaW5hbCBQYXRjaExpbmVDb21tZW50IGFjID0gYWkubmV4dCgpOworICAgICAgICBmaW5hbCBQYXRjaExpbmVDb21tZW50IGJjID0gYmkubmV4dCgpOworICAgICAgICBpZiAoYWMuZ2V0TGluZSgpID09IFJfSEVBRCkgeworICAgICAgICAgIGluc2VydEZpbGVDb21tZW50Um93KHJvdyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW5zZXJ0Um93KHJvdyk7CisgICAgICAgIH0KKyAgICAgICAgYmluZENvbW1lbnQocm93LCBBLCBhYywgIWFpLmhhc05leHQoKSwgZXhwYW5kQ29tbWVudHMpOworICAgICAgICBiaW5kQ29tbWVudChyb3csIEIsIGJjLCAhYmkuaGFzTmV4dCgpLCBleHBhbmRDb21tZW50cyk7CisgICAgICAgIHJvdysrOworICAgICAgfQorCisgICAgICByb3cgPSBmaW5pc2goYWksIHJvdywgQSwgZXhwYW5kQ29tbWVudHMpOworICAgICAgcm93ID0gZmluaXNoKGJpLCByb3csIEIsIGV4cGFuZENvbW1lbnRzKTsKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHZvaWQgZGVmYXVsdFN0eWxlKGZpbmFsIGludCByb3csIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10KSB7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEEgLSAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHQoKSk7CisgICAgaWYgKGlzRGlzcGxheUJpbmFyeSkgeworICAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHRGb3JCaW5hcnlJblNpZGVCeVNpZGUoKSk7CisgICAgfQorICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBCLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBCICsgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBCICsgMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5yaWdodG1vc3QoKSk7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgaW5zZXJ0Um93KGZpbmFsIGludCByb3cpIHsKICAgICBzdXBlci5pbnNlcnRSb3cocm93KTsKICAgICBmaW5hbCBDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQSAtIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQiArIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKKyAgICBkZWZhdWx0U3R5bGUocm93LCBmbXQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGluc2VydEZpbGVDb21tZW50Um93KGZpbmFsIGludCByb3cpIHsKKyAgICB0YWJsZS5pbnNlcnRSb3cocm93KTsKKyAgICBmaW5hbCBDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgQ19BUlJPVywgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbE9mRmlsZUNvbW1lbnRSb3coKSk7CisgICAgZGVmYXVsdFN0eWxlKHJvdywgZm10KTsKKworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX0FSUk9XLCAvLworICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNlbGxzTmV4dFRvRmlsZUNvbW1lbnQoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEEgLSAxLCAvLworICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNlbGxzTmV4dFRvRmlsZUNvbW1lbnQoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIEIgKyAxLCAvLworICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNlbGxzTmV4dFRvRmlsZUNvbW1lbnQoKSk7CisgICAgY3JlYXRlRmlsZUNvbW1lbnRCb3JkZXJSb3cocm93KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjcmVhdGVGaWxlQ29tbWVudEJvcmRlclJvdyhmaW5hbCBpbnQgcm93KSB7CisgICAgaWYgKHJvdyA9PSAxICYmICFpc0ZpbGVDb21tZW50Qm9yZGVyUm93RXhpc3QpIHsKKyAgICAgIGlzRmlsZUNvbW1lbnRCb3JkZXJSb3dFeGlzdCA9IHRydWU7CisgICAgICB0YWJsZS5pbnNlcnRSb3coUl9IRUFEICsgMik7CisKKyAgICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOworCisgICAgICBmbXQuYWRkU3R5bGVOYW1lKFJfSEVBRCArIDIsIENfQVJST1csIC8vCisgICAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbE9mRmlsZUNvbW1lbnRSb3coKSk7CisgICAgICBkZWZhdWx0U3R5bGUoUl9IRUFEICsgMiwgZm10KTsKKworICAgICAgZmluYWwgRWxlbWVudCBpY29uQ2VsbCA9IGZtdC5nZXRFbGVtZW50KFJfSEVBRCArIDIsIENfQVJST1cpOworICAgICAgVUlPYmplY3Quc2V0U3R5bGVOYW1lKERPTS5nZXRQYXJlbnQoaWNvbkNlbGwpLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpCisgICAgICAgICAgLmZpbGVDb21tZW50Qm9yZGVyKCksIHRydWUpOworICAgIH0KICAgfQogCiAgIHByaXZhdGUgaW50IGZpbmlzaChmaW5hbCBJdGVyYXRvcjxQYXRjaExpbmVDb21tZW50PiBpLCBpbnQgcm93LCBmaW5hbCBpbnQgY29sLCBib29sZWFuIGV4cGFuZENvbW1lbnQpIHsKICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKICAgICAgIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgYyA9IGkubmV4dCgpOwotICAgICAgaW5zZXJ0Um93KHJvdyk7CisgICAgICBpZiAoYy5nZXRMaW5lKCkgPT0gUl9IRUFEKSB7CisgICAgICAgIGluc2VydEZpbGVDb21tZW50Um93KHJvdyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnNlcnRSb3cocm93KTsKKyAgICAgIH0KICAgICAgIGJpbmRDb21tZW50KHJvdywgY29sLCBjLCAhaS5oYXNOZXh0KCksIGV4cGFuZENvbW1lbnQpOwogICAgICAgcm93Kys7CiAgICAgfQogICAgIHJldHVybiByb3c7CiAgIH0KIAorICBwcml2YXRlIHZvaWQgYWxsb2NhdGVUYWJsZUhlYWRlcihQYXRjaFNjcmlwdCBzY3JpcHQsIGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CisgICAgbS5vcGVuVHIoKTsKKworICAgIG0ub3BlblRkKCk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbCgpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVDb2x1bW5IZWFkZXIoKSk7CisgICAgbS5jbG9zZVRkKCk7CisKKyAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVDb2x1bW5IZWFkZXIoKSk7CisgICAgbS5uYnNwKCk7CisgICAgbS5jbG9zZVRkKCk7CisKKyAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUNvbHVtbkhlYWRlcigpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVMaW5lKCkpOworICAgIG0uY2xvc2VUZCgpOworCisgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVDb2x1bW5IZWFkZXIoKSk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlTGluZSgpKTsKKyAgICBtLmNsb3NlVGQoKTsKKworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUNvbHVtbkhlYWRlcigpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnJpZ2h0bW9zdCgpKTsKKyAgICBtLmNsb3NlVGQoKTsKKworICAgIG0uY2xvc2VUcigpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFwcGVuZEZpbGVIZWFkZXIoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0sIGZpbmFsIFN0cmluZyBsaW5lKSB7CisgICAgbS5vcGVuVHIoKTsKKworICAgIG0ub3BlblRkKCk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbCgpKTsKKyAgICBtLmNsb3NlVGQoKTsKKworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIG0ubmJzcCgpOworICAgIG0uY2xvc2VUZCgpOworCisgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnNpZGVCeVNpZGVUYWJsZUJpbmFyeUhlYWRlcigpKTsKKyAgICBtLnNldEF0dHJpYnV0ZSgiY29sc3BhbiIsIDIpOworICAgIG0uYXBwZW5kKGxpbmUpOworICAgIG0uY2xvc2VUZCgpOworCisgICAgbS5vcGVuVGQoKTsKKyAgICBtLm5ic3AoKTsKKyAgICBtLmNsb3NlVGQoKTsKKworICAgIG0uY2xvc2VUcigpOworICB9CisKICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFNraXBMaW5lKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtLCBmaW5hbCBpbnQgc2tpcENudCkgewogICAgIG0ub3BlblRyKCk7CiAKQEAgLTMxMCw5ICs0NzQsNyBAQAogCiAgICAgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm9yIChpbnQgaSA9IDAgKyBvZmZzZXQ7IGkgPCBsb29wVG8gKyBvZmZzZXQ7IGkrKykgewotICAgICAgLy8gVGhlIG92ZXJyaWRkZW4gdmVyc2lvbiBvZiBpbnNlcnRSb3cgYWRkcyBzb21lIGNzcyBjbGFzc2VzIHdlIGRvbid0Ci0gICAgICAvLyB3YW50LgotICAgICAgc3VwZXIuaW5zZXJ0Um93KHJvdyArIGkpOworICAgICAgaW5zZXJ0Um93KHJvdyArIGkpOwogICAgICAgdGFibGUuZ2V0Um93Rm9ybWF0dGVyKCkuc2V0VmVydGljYWxBbGlnbihyb3cgKyBpLAogICAgICAgICAgIEhhc1ZlcnRpY2FsQWxpZ25tZW50LkFMSUdOX1RPUCk7CiAgICAgICBpbnQgbGluZUEgPSBsaW5lLmdldFN0YXJ0QSgpICsgaTsKQEAgLTQzOCw2ICs2MDAsOCBAQAogICAgICAgICAgIG0uYWRkU3R5bGVOYW1lKCJ3ZGkiKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUkVQTEFDRToKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIG0uYXBwZW5kKGxpbmVIdG1sKTsKICAgICBtLmNsb3NlVGQoKTsKQEAgLTQ2Myw0ICs2MjcsMTMgQEAKICAgcHJpdmF0ZSB2b2lkIGNsb3NlTGluZShmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgewogICAgIG0uY2xvc2VUcigpOwogICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRlc3Ryb3lDb21tZW50Um93KGZpbmFsIGludCByb3cpIHsKKyAgICBzdXBlci5kZXN0cm95Q29tbWVudFJvdyhyb3cpOworICAgIGlmIChyb3cgPT0gUl9IRUFEICsgMSkgeworICAgICAgdGFibGUucmVtb3ZlUm93KHJvdyk7CisgICAgICBpc0ZpbGVDb21tZW50Qm9yZGVyUm93RXhpc3QgPSBmYWxzZTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1VuaWZpZWREaWZmVGFibGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wYXRjaGVzL1VuaWZpZWREaWZmVGFibGUuamF2YQppbmRleCBmMGY2MTllLi44MmRmNTRhIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGF0Y2hlcy9VbmlmaWVkRGlmZlRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3BhdGNoZXMvVW5pZmllZERpZmZUYWJsZS5qYXZhCkBAIC0yMiwxMiArMjIsMTcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Db21tZW50RGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2NyaXB0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBhdGNoU2NyaXB0LkRpc3BsYXlNZXRob2Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXREZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucHJldHRpZnkuY29tbW9uLkVkaXRMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnByZXR0aWZ5LmNvbW1vbi5FZGl0TGlzdC5IdW5rOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnByZXR0aWZ5LmNvbW1vbi5TcGFyc2VIdG1sRmlsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5VSU9iamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CkBAIC00OCw5ICs1MywxNCBAQAogICAgICAgICB9CiAgICAgICB9OwogCisgIHByb3RlY3RlZCBib29sZWFuIGlzRmlsZUNvbW1lbnRCb3JkZXJSb3dFeGlzdDsKKyAgLy8gQ3Vyc29ycy4KKyAgcHJvdGVjdGVkIGludCByb3dPZlRhYmxlSGVhZGVyQjsKKyAgcHJvdGVjdGVkIGludCBib3JkZXJSb3dPZkZpbGVDb21tZW50OworCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBvbkNlbGxEb3VibGVDbGljayhmaW5hbCBpbnQgcm93LCBmaW5hbCBpbnQgY29sdW1uKSB7Ci0gICAgaWYgKGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIFBhdGNoTGluZSkgeworICAgIGlmIChjb2x1bW4gPiBDX0FSUk9XICYmIGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIFBhdGNoTGluZSkgewogICAgICAgZmluYWwgUGF0Y2hMaW5lIHBsID0gKFBhdGNoTGluZSkgZ2V0Um93SXRlbShyb3cpOwogICAgICAgc3dpdGNoIChwbC5nZXRUeXBlKCkpIHsKICAgICAgICAgY2FzZSBERUxFVEU6CkBAIC02MCwxMiArNzAsNDIgQEAKICAgICAgICAgY2FzZSBJTlNFUlQ6CiAgICAgICAgICAgY3JlYXRlQ29tbWVudEVkaXRvcihyb3cgKyAxLCBQQywgcGwuZ2V0TGluZUIoKSwgKHNob3J0KSAxKTsKICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVBMQUNFOgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDdXJzb3IoZmluYWwgUGF0Y2hMaW5lQ29tbWVudCBuZXdDb21tZW50KSB7CisgICAgaWYgKG5ld0NvbW1lbnQuZ2V0TGluZSgpID09IFJfSEVBRCkgeworICAgICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNJZCA9CisgICAgICAgICAgbmV3Q29tbWVudC5nZXRLZXkoKS5nZXRQYXJlbnRLZXkoKS5nZXRQYXJlbnRLZXkoKTsKKyAgICAgIHN3aXRjaCAobmV3Q29tbWVudC5nZXRTaWRlKCkpIHsKKyAgICAgICAgY2FzZSBGSUxFX1NJREVfQToKKyAgICAgICAgICBpZiAoaWRTaWRlQSA9PSBudWxsICYmIGlkU2lkZUIuZXF1YWxzKHBzSWQpKSB7CisgICAgICAgICAgICByb3dPZlRhYmxlSGVhZGVyQisrOworICAgICAgICAgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudCsrOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGSUxFX1NJREVfQjoKKyAgICAgICAgICBpZiAoaWRTaWRlQSAhPSBudWxsICYmIGlkU2lkZUEuZXF1YWxzKHBzSWQpKSB7CisgICAgICAgICAgICByb3dPZlRhYmxlSGVhZGVyQisrOworICAgICAgICAgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudCsrOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaWRTaWRlQi5lcXVhbHMocHNJZCkpIHsKKyAgICAgICAgICAgIGJvcmRlclJvd09mRmlsZUNvbW1lbnQrKzsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uQ2VsbFNpbmdsZUNsaWNrKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBzdXBlci5vbkNlbGxTaW5nbGVDbGljayhyb3csIGNvbHVtbik7CiAgICAgaWYgKGNvbHVtbiA9PSAxIHx8IGNvbHVtbiA9PSAyKSB7CiAgICAgICBpZiAoISIiLmVxdWFscyh0YWJsZS5nZXRUZXh0KHJvdywgY29sdW1uKSkpIHsKICAgICAgICAgb25DZWxsRG91YmxlQ2xpY2socm93LCBjb2x1bW4pOwpAQCAtNzQsNiArMTE0LDQzIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZGVzdHJveUNvbW1lbnRSb3coZmluYWwgaW50IHJvdykgeworICAgIHN1cGVyLmRlc3Ryb3lDb21tZW50Um93KHJvdyk7CisgICAgaWYgKHRoaXMucm93T2ZUYWJsZUhlYWRlckIgKyAxID09IHJvdyAmJiByb3cgKyAxID09IGJvcmRlclJvd09mRmlsZUNvbW1lbnQpIHsKKyAgICAgIHRhYmxlLnJlbW92ZVJvdyhyb3cpOworICAgICAgaXNGaWxlQ29tbWVudEJvcmRlclJvd0V4aXN0ID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHJlbW92ZShDb21tZW50RWRpdG9yUGFuZWwgcGFuZWwpIHsKKyAgICBzdXBlci5yZW1vdmUocGFuZWwpOworICAgIGlmIChwYW5lbC5nZXRDb21tZW50KCkuZ2V0TGluZSgpID09IEFic3RyYWN0UGF0Y2hDb250ZW50VGFibGUuUl9IRUFEKSB7CisgICAgICBmaW5hbCBQYXRjaFNldC5JZCBwc0lkID0KKyAgICAgICAgICBwYW5lbC5nZXRDb21tZW50KCkuZ2V0S2V5KCkuZ2V0UGFyZW50S2V5KCkuZ2V0UGFyZW50S2V5KCk7CisgICAgICBzd2l0Y2ggKHBhbmVsLmdldENvbW1lbnQoKS5nZXRTaWRlKCkpIHsKKyAgICAgICAgY2FzZSBGSUxFX1NJREVfQToKKyAgICAgICAgICBpZiAoaWRTaWRlQSA9PSBudWxsICYmIGlkU2lkZUIuZXF1YWxzKHBzSWQpKSB7CisgICAgICAgICAgICByb3dPZlRhYmxlSGVhZGVyQi0tOworICAgICAgICAgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudC0tOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGSUxFX1NJREVfQjoKKyAgICAgICAgICBpZiAoaWRTaWRlQSAhPSBudWxsICYmIGlkU2lkZUEuZXF1YWxzKHBzSWQpKSB7CisgICAgICAgICAgICByb3dPZlRhYmxlSGVhZGVyQi0tOworICAgICAgICAgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudC0tOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaWRTaWRlQi5lcXVhbHMocHNJZCkpIHsKKyAgICAgICAgICAgIGJvcmRlclJvd09mRmlsZUNvbW1lbnQtLTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIG9uSW5zZXJ0Q29tbWVudChmaW5hbCBQYXRjaExpbmUgcGwpIHsKICAgICBmaW5hbCBpbnQgcm93ID0gZ2V0Q3VycmVudFJvdygpOwogICAgIHN3aXRjaCAocGwuZ2V0VHlwZSgpKSB7CkBAIC04NCw2ICsxNjEsOCBAQAogICAgICAgY2FzZSBJTlNFUlQ6CiAgICAgICAgIGNyZWF0ZUNvbW1lbnRFZGl0b3Iocm93ICsgMSwgUEMsIHBsLmdldExpbmVCKCksIChzaG9ydCkgMSk7CiAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBSRVBMQUNFOgorICAgICAgICBicmVhazsKICAgICB9CiAgIH0KIApAQCAtOTMsMTIzICsxNzIsMTc4IEBACiAgICAgbmMuY2xvc2VFbGVtZW50KCJpbWciKTsKICAgfQogCisgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVDb21tZW50RWRpdG9yT25TaWRlQSgpIHsKKyAgICBjcmVhdGVDb21tZW50RWRpdG9yKFJfSEVBRCArIDEsIFBDLCBSX0hFQUQsIEZJTEVfU0lERV9BKTsKKyAgICByZXR1cm47CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlQ29tbWVudEVkaXRvck9uU2lkZUIoKSB7CisgICAgY3JlYXRlQ29tbWVudEVkaXRvcihyb3dPZlRhYmxlSGVhZGVyQiArIDEsIFBDLCBSX0hFQUQsIEZJTEVfU0lERV9CKTsKKyAgICBjcmVhdGVGaWxlQ29tbWVudEJvcmRlclJvdygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlVGFibGVIZWFkZXIoZmluYWwgUGF0Y2hTY3JpcHQgc2NyaXB0LAorICAgICAgZmluYWwgUGF0Y2hTZXREZXRhaWwgZGV0YWlsKSB7CisgICAgaW5pdEhlYWRlcnMoc2NyaXB0LCBkZXRhaWwpOworICAgIHRhYmxlLnNldFdpZGdldChSX0hFQUQsIFBDLCBoZWFkZXJTaWRlQSk7CisgICAgdGFibGUuc2V0V2lkZ2V0KHJvd09mVGFibGVIZWFkZXJCLCBQQywgaGVhZGVyU2lkZUIpOworICAgIHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuYWRkU3R5bGVOYW1lKFJfSEVBRCwgUEMsCisgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkudW5pZmllZFRhYmxlSGVhZGVyKCkpOworICAgIHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCkuYWRkU3R5bGVOYW1lKHJvd09mVGFibGVIZWFkZXJCLCBQQywKKyAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS51bmlmaWVkVGFibGVIZWFkZXIoKSk7CisKKyAgICAvLyBBZGQgaWNvbnMgdG8gbGluZU51bWJlciBjb2x1bW4gaGVhZGVyCisgICAgaWYgKGhlYWRlclNpZGVBLmlzRmlsZU9yQ29tbWl0TWVzc2FnZSgpKSB7CisgICAgICB0YWJsZS5zZXRXaWRnZXQoUl9IRUFELCAxLCBpY29uQSk7CisgICAgfQorICAgIGlmIChoZWFkZXJTaWRlQi5pc0ZpbGVPckNvbW1pdE1lc3NhZ2UoKSkgeworICAgICAgdGFibGUuc2V0V2lkZ2V0KHJvd09mVGFibGVIZWFkZXJCLCAyLCBpY29uQik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFsbG9jYXRlVGFibGVIZWFkZXIoU2FmZUh0bWxCdWlsZGVyIG5jKSB7CisgICAgcm93T2ZUYWJsZUhlYWRlckIgPSAxOworICAgIGJvcmRlclJvd09mRmlsZUNvbW1lbnQgPSAyOworICAgIGZvciAoaW50IGkgPSBSX0hFQUQ7IGkgPCBib3JkZXJSb3dPZkZpbGVDb21tZW50OyBpKyspIHsKKyAgICAgIG9wZW5UYWJsZUhlYWRlckxpbmUobmMpOworICAgICAgcGFkTGluZU51bWJlck9uVGFibGVIZWFkZXJGb3JTaWRlQShuYyk7CisgICAgICBwYWRMaW5lTnVtYmVyT25UYWJsZUhlYWRlckZvclNpZGVCKG5jKTsKKyAgICAgIG5jLm9wZW5UZCgpOworICAgICAgbmMuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUxpbmUoKSk7CisgICAgICBuYy5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlQ29sdW1uSGVhZGVyKCkpOworICAgICAgbmMuY2xvc2VUZCgpOworICAgICAgY2xvc2VMaW5lKG5jKTsKKyAgICB9CisgIH0KKwogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgcmVuZGVyKGZpbmFsIFBhdGNoU2NyaXB0IHNjcmlwdCkgewotICAgIGZpbmFsIFNwYXJzZUh0bWxGaWxlIGEgPSBnZXRTcGFyc2VIdG1sRmlsZUEoc2NyaXB0KTsKLSAgICBmaW5hbCBTcGFyc2VIdG1sRmlsZSBiID0gZ2V0U3BhcnNlSHRtbEZpbGVCKHNjcmlwdCk7CisgIHByb3RlY3RlZCB2b2lkIHJlbmRlcihmaW5hbCBQYXRjaFNjcmlwdCBzY3JpcHQsIGZpbmFsIFBhdGNoU2V0RGV0YWlsIGRldGFpbCkgewogICAgIGZpbmFsIFNhZmVIdG1sQnVpbGRlciBuYyA9IG5ldyBTYWZlSHRtbEJ1aWxkZXIoKTsKKyAgICBhbGxvY2F0ZVRhYmxlSGVhZGVyKG5jKTsKIAogICAgIC8vIERpc3BsYXkgdGhlIHBhdGNoIGhlYWRlcgogICAgIGZvciAoZmluYWwgU3RyaW5nIGxpbmUgOiBzY3JpcHQuZ2V0UGF0Y2hIZWFkZXIoKSkgewogICAgICAgYXBwZW5kRmlsZUhlYWRlcihuYywgbGluZSk7CiAgICAgfQotCi0gICAgaWYgKHNjcmlwdC5nZXREaXNwbGF5TWV0aG9kQSgpID09IERpc3BsYXlNZXRob2QuSU1HCi0gICAgICAgIHx8IHNjcmlwdC5nZXREaXNwbGF5TWV0aG9kQigpID09IERpc3BsYXlNZXRob2QuSU1HKSB7Ci0gICAgICBmaW5hbCBTdHJpbmcgcmF3QmFzZSA9IEdXVC5nZXRIb3N0UGFnZUJhc2VVUkwoKSArICJjYXQvIjsKLQotICAgICAgbmMub3BlblRyKCk7Ci0gICAgICBuYy5zZXRBdHRyaWJ1dGUoInZhbGlnbiIsICJjZW50ZXIiKTsKLSAgICAgIG5jLnNldEF0dHJpYnV0ZSgiYWxpZ24iLCAiY2VudGVyIik7Ci0KLSAgICAgIG5jLm9wZW5UZCgpOwotICAgICAgbmMubmJzcCgpOwotICAgICAgbmMuY2xvc2VUZCgpOwotCi0gICAgICBuYy5vcGVuVGQoKTsKLSAgICAgIG5jLm5ic3AoKTsKLSAgICAgIG5jLmNsb3NlVGQoKTsKLQotICAgICAgbmMub3BlblRkKCk7Ci0gICAgICBuYy5uYnNwKCk7Ci0gICAgICBuYy5jbG9zZVRkKCk7Ci0KLSAgICAgIG5jLm9wZW5UZCgpOwotICAgICAgaWYgKHNjcmlwdC5nZXREaXNwbGF5TWV0aG9kQSgpID09IERpc3BsYXlNZXRob2QuSU1HKSB7Ci0gICAgICAgIGlmIChpZFNpZGVBID09IG51bGwpIHsKLSAgICAgICAgICBhcHBlbmRJbWdUYWcobmMsIHJhd0Jhc2UgKyBLZXlVdGlsLmVuY29kZShwYXRjaEtleS50b1N0cmluZygpKSArICJeMSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFBhdGNoLktleSBrID0gbmV3IFBhdGNoLktleShpZFNpZGVBLCBwYXRjaEtleS5nZXQoKSk7Ci0gICAgICAgICAgYXBwZW5kSW1nVGFnKG5jLCByYXdCYXNlICsgS2V5VXRpbC5lbmNvZGUoay50b1N0cmluZygpKSArICJeMCIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoc2NyaXB0LmdldERpc3BsYXlNZXRob2RCKCkgPT0gRGlzcGxheU1ldGhvZC5JTUcpIHsKLSAgICAgICAgYXBwZW5kSW1nVGFnKG5jLCByYXdCYXNlICsgS2V5VXRpbC5lbmNvZGUocGF0Y2hLZXkudG9TdHJpbmcoKSkgKyAiXjAiKTsKLSAgICAgIH0KLSAgICAgIG5jLmNsb3NlVGQoKTsKLQotICAgICAgbmMuY2xvc2VUcigpOwotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gc3ludGF4SGlnaGxpZ2h0aW5nID0KLSAgICAgICAgc2NyaXB0LmdldERpZmZQcmVmcygpLmlzU3ludGF4SGlnaGxpZ2h0aW5nKCk7CiAgICAgZmluYWwgQXJyYXlMaXN0PFBhdGNoTGluZT4gbGluZXMgPSBuZXcgQXJyYXlMaXN0PFBhdGNoTGluZT4oKTsKLSAgICBmb3IgKGZpbmFsIEVkaXRMaXN0Lkh1bmsgaHVuayA6IHNjcmlwdC5nZXRIdW5rcygpKSB7Ci0gICAgICBhcHBlbmRIdW5rSGVhZGVyKG5jLCBodW5rKTsKLSAgICAgIHdoaWxlIChodW5rLm5leHQoKSkgewotICAgICAgICBpZiAoaHVuay5pc0NvbnRleHRMaW5lKCkpIHsKLSAgICAgICAgICBvcGVuTGluZShuYyk7Ci0gICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJBKCkpOwotICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGh1bmsuZ2V0Q3VyQigpKTsKLSAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgZmFsc2UsIENPTlRFWFQsIGEsIGh1bmsuZ2V0Q3VyQSgpKTsKLSAgICAgICAgICBjbG9zZUxpbmUobmMpOwotICAgICAgICAgIGh1bmsuaW5jQm90aCgpOwotICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKENPTlRFWFQsIGh1bmsuZ2V0Q3VyQSgpLCBodW5rLmdldEN1ckIoKSkpOworICAgIGlmICghaXNEaXNwbGF5QmluYXJ5KSB7CisgICAgICBmaW5hbCBTcGFyc2VIdG1sRmlsZSBhID0gZ2V0U3BhcnNlSHRtbEZpbGVBKHNjcmlwdCk7CisgICAgICBmaW5hbCBTcGFyc2VIdG1sRmlsZSBiID0gZ2V0U3BhcnNlSHRtbEZpbGVCKHNjcmlwdCk7CisgICAgICBpZiAoc2NyaXB0LmdldERpc3BsYXlNZXRob2RBKCkgPT0gRGlzcGxheU1ldGhvZC5JTUcKKyAgICAgICAgICB8fCBzY3JpcHQuZ2V0RGlzcGxheU1ldGhvZEIoKSA9PSBEaXNwbGF5TWV0aG9kLklNRykgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmF3QmFzZSA9IEdXVC5nZXRIb3N0UGFnZUJhc2VVUkwoKSArICJjYXQvIjsKIAotICAgICAgICB9IGVsc2UgaWYgKGh1bmsuaXNEZWxldGVkQSgpKSB7Ci0gICAgICAgICAgb3BlbkxpbmUobmMpOwotICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXIobmMsIGh1bmsuZ2V0Q3VyQSgpKTsKLSAgICAgICAgICBwYWRMaW5lTnVtYmVyKG5jKTsKLSAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgc3ludGF4SGlnaGxpZ2h0aW5nLCBERUxFVEUsIGEsIGh1bmsuZ2V0Q3VyQSgpKTsKLSAgICAgICAgICBjbG9zZUxpbmUobmMpOwotICAgICAgICAgIGh1bmsuaW5jQSgpOwotICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKERFTEVURSwgaHVuay5nZXRDdXJBKCksIDApKTsKLSAgICAgICAgICBpZiAoYS5zaXplKCkgPT0gaHVuay5nZXRDdXJBKCkKLSAgICAgICAgICAgICAgJiYgc2NyaXB0LmdldEEoKS5pc01pc3NpbmdOZXdsaW5lQXRFbmQoKSkgewotICAgICAgICAgICAgYXBwZW5kTm9MRihuYyk7CisgICAgICAgIG5jLm9wZW5UcigpOworICAgICAgICBuYy5zZXRBdHRyaWJ1dGUoInZhbGlnbiIsICJjZW50ZXIiKTsKKyAgICAgICAgbmMuc2V0QXR0cmlidXRlKCJhbGlnbiIsICJjZW50ZXIiKTsKKworICAgICAgICBuYy5vcGVuVGQoKTsKKyAgICAgICAgbmMubmJzcCgpOworICAgICAgICBuYy5jbG9zZVRkKCk7CisKKyAgICAgICAgbmMub3BlblRkKCk7CisgICAgICAgIG5jLm5ic3AoKTsKKyAgICAgICAgbmMuY2xvc2VUZCgpOworCisgICAgICAgIG5jLm9wZW5UZCgpOworICAgICAgICBuYy5uYnNwKCk7CisgICAgICAgIG5jLmNsb3NlVGQoKTsKKworICAgICAgICBuYy5vcGVuVGQoKTsKKyAgICAgICAgaWYgKHNjcmlwdC5nZXREaXNwbGF5TWV0aG9kQSgpID09IERpc3BsYXlNZXRob2QuSU1HKSB7CisgICAgICAgICAgaWYgKGlkU2lkZUEgPT0gbnVsbCkgeworICAgICAgICAgICAgYXBwZW5kSW1nVGFnKG5jLCByYXdCYXNlICsgS2V5VXRpbC5lbmNvZGUocGF0Y2hLZXkudG9TdHJpbmcoKSkgKyAiXjEiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUGF0Y2guS2V5IGsgPSBuZXcgUGF0Y2guS2V5KGlkU2lkZUEsIHBhdGNoS2V5LmdldCgpKTsKKyAgICAgICAgICAgIGFwcGVuZEltZ1RhZyhuYywgcmF3QmFzZSArIEtleVV0aWwuZW5jb2RlKGsudG9TdHJpbmcoKSkgKyAiXjAiKTsKICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjcmlwdC5nZXREaXNwbGF5TWV0aG9kQigpID09IERpc3BsYXlNZXRob2QuSU1HKSB7CisgICAgICAgICAgYXBwZW5kSW1nVGFnKG5jLCByYXdCYXNlICsgS2V5VXRpbC5lbmNvZGUocGF0Y2hLZXkudG9TdHJpbmcoKSkgKyAiXjAiKTsKKyAgICAgICAgfQorICAgICAgICBuYy5jbG9zZVRkKCk7CiAKLSAgICAgICAgfSBlbHNlIGlmIChodW5rLmlzSW5zZXJ0ZWRCKCkpIHsKLSAgICAgICAgICBvcGVuTGluZShuYyk7Ci0gICAgICAgICAgcGFkTGluZU51bWJlcihuYyk7Ci0gICAgICAgICAgYXBwZW5kTGluZU51bWJlcihuYywgaHVuay5nZXRDdXJCKCkpOwotICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBzeW50YXhIaWdobGlnaHRpbmcsIElOU0VSVCwgYiwgaHVuay5nZXRDdXJCKCkpOwotICAgICAgICAgIGNsb3NlTGluZShuYyk7Ci0gICAgICAgICAgaHVuay5pbmNCKCk7Ci0gICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoSU5TRVJULCAwLCBodW5rLmdldEN1ckIoKSkpOwotICAgICAgICAgIGlmIChiLnNpemUoKSA9PSBodW5rLmdldEN1ckIoKQotICAgICAgICAgICAgICAmJiBzY3JpcHQuZ2V0QigpLmlzTWlzc2luZ05ld2xpbmVBdEVuZCgpKSB7Ci0gICAgICAgICAgICBhcHBlbmROb0xGKG5jKTsKKyAgICAgICAgbmMuY2xvc2VUcigpOworICAgICAgfQorCisgICAgICBpZiAoaGFzRGlmZmVyZW5jZXMoc2NyaXB0KSkgeworICAgICAgICBmaW5hbCBib29sZWFuIHN5bnRheEhpZ2hsaWdodGluZyA9CisgICAgICAgICAgICBzY3JpcHQuZ2V0RGlmZlByZWZzKCkuaXNTeW50YXhIaWdobGlnaHRpbmcoKTsKKyAgICAgICAgZm9yIChmaW5hbCBFZGl0TGlzdC5IdW5rIGh1bmsgOiBzY3JpcHQuZ2V0SHVua3MoKSkgeworICAgICAgICAgIGFwcGVuZEh1bmtIZWFkZXIobmMsIGh1bmspOworICAgICAgICAgIHdoaWxlIChodW5rLm5leHQoKSkgeworICAgICAgICAgICAgaWYgKGh1bmsuaXNDb250ZXh0TGluZSgpKSB7CisgICAgICAgICAgICAgIG9wZW5MaW5lKG5jKTsKKyAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlckZvclNpZGVBKG5jLCBodW5rLmdldEN1ckEoKSk7CisgICAgICAgICAgICAgIGFwcGVuZExpbmVOdW1iZXJGb3JTaWRlQihuYywgaHVuay5nZXRDdXJCKCkpOworICAgICAgICAgICAgICBhcHBlbmRMaW5lVGV4dChuYywgZmFsc2UsIENPTlRFWFQsIGEsIGh1bmsuZ2V0Q3VyQSgpKTsKKyAgICAgICAgICAgICAgY2xvc2VMaW5lKG5jKTsKKyAgICAgICAgICAgICAgaHVuay5pbmNCb3RoKCk7CisgICAgICAgICAgICAgIGxpbmVzLmFkZChuZXcgUGF0Y2hMaW5lKENPTlRFWFQsIGh1bmsuZ2V0Q3VyQSgpLCBodW5rLmdldEN1ckIoKSkpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKGh1bmsuaXNEZWxldGVkQSgpKSB7CisgICAgICAgICAgICAgIG9wZW5MaW5lKG5jKTsKKyAgICAgICAgICAgICAgYXBwZW5kTGluZU51bWJlckZvclNpZGVBKG5jLCBodW5rLmdldEN1ckEoKSk7CisgICAgICAgICAgICAgIHBhZExpbmVOdW1iZXJGb3JTaWRlQihuYyk7CisgICAgICAgICAgICAgIGFwcGVuZExpbmVUZXh0KG5jLCBzeW50YXhIaWdobGlnaHRpbmcsIERFTEVURSwgYSwgaHVuay5nZXRDdXJBKCkpOworICAgICAgICAgICAgICBjbG9zZUxpbmUobmMpOworICAgICAgICAgICAgICBodW5rLmluY0EoKTsKKyAgICAgICAgICAgICAgbGluZXMuYWRkKG5ldyBQYXRjaExpbmUoREVMRVRFLCBodW5rLmdldEN1ckEoKSwgLTEpKTsKKyAgICAgICAgICAgICAgaWYgKGEuc2l6ZSgpID09IGh1bmsuZ2V0Q3VyQSgpCisgICAgICAgICAgICAgICAgICAmJiBzY3JpcHQuZ2V0QSgpLmlzTWlzc2luZ05ld2xpbmVBdEVuZCgpKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kTm9MRihuYyk7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlIGlmIChodW5rLmlzSW5zZXJ0ZWRCKCkpIHsKKyAgICAgICAgICAgICAgb3BlbkxpbmUobmMpOworICAgICAgICAgICAgICBwYWRMaW5lTnVtYmVyRm9yU2lkZUEobmMpOworICAgICAgICAgICAgICBhcHBlbmRMaW5lTnVtYmVyRm9yU2lkZUIobmMsIGh1bmsuZ2V0Q3VyQigpKTsKKyAgICAgICAgICAgICAgYXBwZW5kTGluZVRleHQobmMsIHN5bnRheEhpZ2hsaWdodGluZywgSU5TRVJULCBiLCBodW5rLmdldEN1ckIoKSk7CisgICAgICAgICAgICAgIGNsb3NlTGluZShuYyk7CisgICAgICAgICAgICAgIGh1bmsuaW5jQigpOworICAgICAgICAgICAgICBsaW5lcy5hZGQobmV3IFBhdGNoTGluZShJTlNFUlQsIC0xLCBodW5rLmdldEN1ckIoKSkpOworICAgICAgICAgICAgICBpZiAoYi5zaXplKCkgPT0gaHVuay5nZXRDdXJCKCkKKyAgICAgICAgICAgICAgICAgICYmIHNjcmlwdC5nZXRCKCkuaXNNaXNzaW5nTmV3bGluZUF0RW5kKCkpIHsKKyAgICAgICAgICAgICAgICBhcHBlbmROb0xGKG5jKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgICBpZiAoIWhhc0RpZmZlcmVuY2VzKHNjcmlwdCkpIHsKKyAgICAgIGFwcGVuZE5vRGlmZmVyZW5jZXMobmMpOworICAgIH0KICAgICByZXNldEh0bWwobmMpOwotICAgIGluaXRTY3JpcHQoc2NyaXB0KTsKLQotICAgIGludCByb3cgPSBzY3JpcHQuZ2V0UGF0Y2hIZWFkZXIoKS5zaXplKCk7Ci0gICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7Ci0gICAgZmluYWwgSXRlcmF0b3I8UGF0Y2hMaW5lPiBpTGluZSA9IGxpbmVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGlMaW5lLmhhc05leHQoKSkgewotICAgICAgZmluYWwgUGF0Y2hMaW5lIGwgPSBpTGluZS5uZXh0KCk7Ci0gICAgICBmaW5hbCBTdHJpbmcgbjsKLSAgICAgIHN3aXRjaCAobC5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBDT05URVhUOgotICAgICAgICAgIG4gPSBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0Q09OVEVYVCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgICBuID0gR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dERFTEVURSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOU0VSVDoKLSAgICAgICAgICBuID0gR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dElOU0VSVCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGNvbnRpbnVlOworICAgIHBvcHVsYXRlVGFibGVIZWFkZXIoc2NyaXB0LCBkZXRhaWwpOworICAgIGlmIChoYXNEaWZmZXJlbmNlcyhzY3JpcHQpKSB7CisgICAgICBpbml0U2NyaXB0KHNjcmlwdCk7CisgICAgICBpZiAoIWlzRGlzcGxheUJpbmFyeSkgeworICAgICAgICBpbnQgcm93ID0gc2NyaXB0LmdldFBhdGNoSGVhZGVyKCkuc2l6ZSgpOworICAgICAgICBmaW5hbCBDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8UGF0Y2hMaW5lPiBpTGluZSA9IGxpbmVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpTGluZS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICBmaW5hbCBQYXRjaExpbmUgbCA9IGlMaW5lLm5leHQoKTsKKyAgICAgICAgICBmaW5hbCBTdHJpbmcgbjsKKyAgICAgICAgICBzd2l0Y2ggKGwuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIENPTlRFWFQ6CisgICAgICAgICAgICAgIG4gPSBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0Q09OVEVYVCgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgREVMRVRFOgorICAgICAgICAgICAgICBuID0gR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dERFTEVURSgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSU5TRVJUOgorICAgICAgICAgICAgICBuID0gR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dElOU0VSVCgpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZSAoIWZtdC5nZXRTdHlsZU5hbWUocm93LCBQQykuY29udGFpbnMobikpIHsKKyAgICAgICAgICAgIHJvdysrOworICAgICAgICAgIH0KKyAgICAgICAgICBzZXRSb3dJdGVtKHJvdysrLCBsKTsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgd2hpbGUgKCFmbXQuZ2V0U3R5bGVOYW1lKHJvdywgUEMpLmNvbnRhaW5zKG4pKSB7Ci0gICAgICAgIHJvdysrOwotICAgICAgfQotICAgICAgc2V0Um93SXRlbShyb3crKywgbCk7CiAgICAgfQogICB9CiAKQEAgLTIyMiwxMCArMzU2LDI4IEBACiAKICAgICBmaW5hbCBBcnJheUxpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gYWxsID0gbmV3IEFycmF5TGlzdDxQYXRjaExpbmVDb21tZW50PigpOwogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IHRhYmxlLmdldFJvd0NvdW50KCk7KSB7Ci0gICAgICBpZiAoZ2V0Um93SXRlbShyb3cpIGluc3RhbmNlb2YgUGF0Y2hMaW5lKSB7CisgICAgICBmaW5hbCBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGZvcmE7CisgICAgICBmaW5hbCBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGZvcmI7CisgICAgICBpZiAocm93ID09IFJfSEVBRCkgeworICAgICAgICBmb3JhID0gY2QuZ2V0Rm9yQShSX0hFQUQpOworICAgICAgICBmb3JiID0gY2QuZ2V0Rm9yQihSX0hFQUQpOworICAgICAgICByb3crKzsKKworICAgICAgICBpZiAoIWZvcmEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgcm93ID0gaW5zZXJ0KGZvcmEsIHJvdywgZXhwYW5kQ29tbWVudHMpOworICAgICAgICB9CisgICAgICAgIHJvd09mVGFibGVIZWFkZXJCID0gcm93OworICAgICAgICBib3JkZXJSb3dPZkZpbGVDb21tZW50ID0gcm93ICsgMTsKKyAgICAgICAgaWYgKCFmb3JiLmlzRW1wdHkoKSkgeworICAgICAgICAgIHJvdysrOy8vIFNraXAgdGhlIEhlYWRlciBvZiBzaWRlQi4KKyAgICAgICAgICByb3cgPSBpbnNlcnQoZm9yYiwgcm93LCBleHBhbmRDb21tZW50cyk7CisgICAgICAgICAgYm9yZGVyUm93T2ZGaWxlQ29tbWVudCA9IHJvdzsKKyAgICAgICAgICBjcmVhdGVGaWxlQ29tbWVudEJvcmRlclJvdygpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGdldFJvd0l0ZW0ocm93KSBpbnN0YW5jZW9mIFBhdGNoTGluZSkgewogICAgICAgICBmaW5hbCBQYXRjaExpbmUgcExpbmUgPSAoUGF0Y2hMaW5lKSBnZXRSb3dJdGVtKHJvdyk7Ci0gICAgICAgIGZpbmFsIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZm9yYSA9IGNkLmdldEZvckEocExpbmUuZ2V0TGluZUEoKSk7Ci0gICAgICAgIGZpbmFsIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gZm9yYiA9IGNkLmdldEZvckIocExpbmUuZ2V0TGluZUIoKSk7CisgICAgICAgIGZvcmEgPSBjZC5nZXRGb3JBKHBMaW5lLmdldExpbmVBKCkpOworICAgICAgICBmb3JiID0gY2QuZ2V0Rm9yQihwTGluZS5nZXRMaW5lQigpKTsKICAgICAgICAgcm93Kys7CiAKICAgICAgICAgaWYgKCFmb3JhLmlzRW1wdHkoKSAmJiAhZm9yYi5pc0VtcHR5KCkpIHsKQEAgLTI0MywzNiArMzk1LDg0IEBACiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJvdysrOworICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICB9CiAgIH0KIAorICBwcml2YXRlIHZvaWQgZGVmYXVsdFN0eWxlKGZpbmFsIGludCByb3csIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10KSB7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIFBDIC0gMiwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBQQyAtIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmlnaHRCb3JkZXIoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIFBDIC0gMSwgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBQQywgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKKyAgfQogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBpbnNlcnRSb3coZmluYWwgaW50IHJvdykgewogICAgIHN1cGVyLmluc2VydFJvdyhyb3cpOwogICAgIGZpbmFsIENlbGxGb3JtYXR0ZXIgZm10ID0gdGFibGUuZ2V0Q2VsbEZvcm1hdHRlcigpOwotICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBQQyAtIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKLSAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgUEMgLSAxLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7Ci0gICAgZm10LmFkZFN0eWxlTmFtZShyb3csIFBDLCBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOworICAgIGRlZmF1bHRTdHlsZShyb3csIGZtdCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFBhdGNoU2NyZWVuLlR5cGUgZ2V0UGF0Y2hTY3JlZW5UeXBlKCkgeworICAgIHJldHVybiBQYXRjaFNjcmVlbi5UeXBlLlVOSUZJRUQ7CiAgIH0KIAogICBwcml2YXRlIGludCBpbnNlcnQoZmluYWwgTGlzdDxQYXRjaExpbmVDb21tZW50PiBpbiwgaW50IHJvdywgYm9vbGVhbiBleHBhbmRDb21tZW50KSB7CiAgICAgZm9yIChJdGVyYXRvcjxQYXRjaExpbmVDb21tZW50PiBjaSA9IGluLml0ZXJhdG9yKCk7IGNpLmhhc05leHQoKTspIHsKICAgICAgIGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgYyA9IGNpLm5leHQoKTsKLSAgICAgIGluc2VydFJvdyhyb3cpOworICAgICAgaWYgKGMuZ2V0TGluZSgpID09IFJfSEVBRCkgeworICAgICAgICBpbnNlcnRGaWxlQ29tbWVudFJvdyhyb3cpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW5zZXJ0Um93KHJvdyk7CisgICAgICB9CiAgICAgICBiaW5kQ29tbWVudChyb3csIFBDLCBjLCAhY2kuaGFzTmV4dCgpLCBleHBhbmRDb21tZW50KTsKICAgICAgIHJvdysrOwogICAgIH0KICAgICByZXR1cm4gcm93OwogICB9CiAKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGluc2VydEZpbGVDb21tZW50Um93KGZpbmFsIGludCByb3cpIHsKKyAgICB0YWJsZS5pbnNlcnRSb3cocm93KTsKKyAgICBmaW5hbCBDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldENlbGxGb3JtYXR0ZXIoKTsKKworICAgIGZtdC5hZGRTdHlsZU5hbWUocm93LCBDX0FSUk9XLCAvLworICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmljb25DZWxsT2ZGaWxlQ29tbWVudFJvdygpKTsKKyAgICBkZWZhdWx0U3R5bGUocm93LCBmbXQpOworCisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIENfQVJST1csIC8vCisgICAgICAgIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY2VsbHNOZXh0VG9GaWxlQ29tbWVudCgpKTsKKyAgICBmbXQuYWRkU3R5bGVOYW1lKHJvdywgUEMgLSAyLCAvLworICAgICAgICBHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmNlbGxzTmV4dFRvRmlsZUNvbW1lbnQoKSk7CisgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIFBDIC0gMSwgLy8KKyAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5jZWxsc05leHRUb0ZpbGVDb21tZW50KCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbGVDb21tZW50Qm9yZGVyUm93KCkgeworICAgIGlmICghaXNGaWxlQ29tbWVudEJvcmRlclJvd0V4aXN0KSB7CisgICAgICBpc0ZpbGVDb21tZW50Qm9yZGVyUm93RXhpc3QgPSB0cnVlOworICAgICAgdGFibGUuaW5zZXJ0Um93KGJvcmRlclJvd09mRmlsZUNvbW1lbnQpOworICAgICAgZmluYWwgQ2VsbEZvcm1hdHRlciBmbXQgPSB0YWJsZS5nZXRDZWxsRm9ybWF0dGVyKCk7CisgICAgICBmbXQuYWRkU3R5bGVOYW1lKGJvcmRlclJvd09mRmlsZUNvbW1lbnQsIENfQVJST1csIC8vCisgICAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5pY29uQ2VsbE9mRmlsZUNvbW1lbnRSb3coKSk7CisgICAgICBkZWZhdWx0U3R5bGUoYm9yZGVyUm93T2ZGaWxlQ29tbWVudCwgZm10KTsKKworICAgICAgZmluYWwgRWxlbWVudCBpY29uQ2VsbCA9CisgICAgICAgICAgZm10LmdldEVsZW1lbnQoYm9yZGVyUm93T2ZGaWxlQ29tbWVudCwgQ19BUlJPVyk7CisgICAgICBVSU9iamVjdC5zZXRTdHlsZU5hbWUoRE9NLmdldFBhcmVudChpY29uQ2VsbCksIC8vCisgICAgICAgICAgR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlQ29tbWVudEJvcmRlcigpLCB0cnVlKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHZvaWQgYXBwZW5kRmlsZUhlYWRlcihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSwgZmluYWwgU3RyaW5nIGxpbmUpIHsKICAgICBvcGVuTGluZShtKTsKLSAgICBwYWRMaW5lTnVtYmVyKG0pOwotICAgIHBhZExpbmVOdW1iZXIobSk7CisgICAgcGFkTGluZU51bWJlckZvclNpZGVBKG0pOworICAgIHBhZExpbmVOdW1iZXJGb3JTaWRlQihtKTsKIAogICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlTGluZSgpKTsKICAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOwogICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHRGaWxlSGVhZGVyKCkpOwogICAgIG0uYXBwZW5kKGxpbmUpOwpAQCAtMjgyLDEwICs0ODIsMTEgQEAKIAogICBwcml2YXRlIHZvaWQgYXBwZW5kSHVua0hlYWRlcihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSwgZmluYWwgSHVuayBodW5rKSB7CiAgICAgb3BlbkxpbmUobSk7Ci0gICAgcGFkTGluZU51bWJlcihtKTsKLSAgICBwYWRMaW5lTnVtYmVyKG0pOworICAgIHBhZExpbmVOdW1iZXJGb3JTaWRlQShtKTsKKyAgICBwYWRMaW5lTnVtYmVyRm9yU2lkZUIobSk7CiAKICAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUxpbmUoKSk7CiAgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5kaWZmVGV4dCgpKTsKICAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0SHVua0hlYWRlcigpKTsKICAgICBtLmFwcGVuZCgiQEAgLSIpOwpAQCAtMzIzLDYgKzUyNCw3IEBACiAgICAgICBmaW5hbCBTcGFyc2VIdG1sRmlsZSBzcmMsIGZpbmFsIGludCBpKSB7CiAgICAgZmluYWwgU2FmZUh0bWwgdGV4dCA9IHNyYy5nZXRTYWZlSHRtbExpbmUoaSk7CiAgICAgbS5vcGVuVGQoKTsKKyAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVMaW5lKCkpOwogICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHQoKSk7CiAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICBjYXNlIENPTlRFWFQ6CkBAIC0zNDYsMTQgKzU0OCwxNiBAQAogICAgICAgICBtLmFwcGVuZCgiKyIpOwogICAgICAgICBtLmFwcGVuZCh0ZXh0KTsKICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFJFUExBQ0U6CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBtLmNsb3NlVGQoKTsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBhcHBlbmROb0xGKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CiAgICAgb3BlbkxpbmUobSk7Ci0gICAgcGFkTGluZU51bWJlcihtKTsKLSAgICBwYWRMaW5lTnVtYmVyKG0pOworICAgIHBhZExpbmVOdW1iZXJGb3JTaWRlQShtKTsKKyAgICBwYWRMaW5lTnVtYmVyRm9yU2lkZUIobSk7CiAgICAgbS5vcGVuVGQoKTsKICAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmRpZmZUZXh0KCkpOwogICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGlmZlRleHROb0xGKCkpOwpAQCAtMzcwLDIwICs1NzQsNTggQEAKICAgICBtLmNsb3NlVGQoKTsKICAgfQogCisgIHByaXZhdGUgdm9pZCBvcGVuVGFibGVIZWFkZXJMaW5lKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtKSB7CisgICAgbS5vcGVuVHIoKTsKKyAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuaWNvbkNlbGwoKSk7CisgICAgbS5hZGRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5maWxlQ29sdW1uSGVhZGVyKCkpOworICAgIG0uY2xvc2VUZCgpOworICB9CisKICAgcHJpdmF0ZSB2b2lkIGNsb3NlTGluZShmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgewogICAgIG0uY2xvc2VUcigpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHBhZExpbmVOdW1iZXIoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0pIHsKKyAgcHJpdmF0ZSB2b2lkIHBhZExpbmVOdW1iZXJGb3JTaWRlQihmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgewogICAgIG0ub3BlblRkKCk7CiAgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOwogICAgIG0uY2xvc2VUZCgpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGFwcGVuZExpbmVOdW1iZXIoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0sIGZpbmFsIGludCBpZHgpIHsKKyAgcHJpdmF0ZSB2b2lkIHBhZExpbmVOdW1iZXJGb3JTaWRlQShmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgeworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmlnaHRCb3JkZXIoKSk7CisgICAgbS5jbG9zZVRkKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXBwZW5kTGluZU51bWJlckZvclNpZGVCKGZpbmFsIFNhZmVIdG1sQnVpbGRlciBtLCBmaW5hbCBpbnQgaWR4KSB7CiAgICAgbS5vcGVuVGQoKTsKICAgICBtLnNldFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmxpbmVOdW1iZXIoKSk7CiAgICAgbS5hcHBlbmQoU2FmZUh0bWwuYXNpcygiPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiPiIrIChpZHggKyAxKSArICI8L2E+IikpOwogICAgIG0uY2xvc2VUZCgpOwogICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFwcGVuZExpbmVOdW1iZXJGb3JTaWRlQShmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSwgZmluYWwgaW50IGlkeCkgeworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucmlnaHRCb3JkZXIoKSk7CisgICAgbS5hcHBlbmQoU2FmZUh0bWwuYXNpcygiPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiPiIrIChpZHggKyAxKSArICI8L2E+IikpOworICAgIG0uY2xvc2VUZCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBhZExpbmVOdW1iZXJPblRhYmxlSGVhZGVyRm9yU2lkZUIoZmluYWwgU2FmZUh0bWxCdWlsZGVyIG0pIHsKKyAgICBtLm9wZW5UZCgpOworICAgIG0uc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkubGluZU51bWJlcigpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLmZpbGVDb2x1bW5IZWFkZXIoKSk7CisgICAgbS5jbG9zZVRkKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcGFkTGluZU51bWJlck9uVGFibGVIZWFkZXJGb3JTaWRlQShmaW5hbCBTYWZlSHRtbEJ1aWxkZXIgbSkgeworICAgIG0ub3BlblRkKCk7CisgICAgbS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5lTnVtYmVyKCkpOworICAgIG0uYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZmlsZUNvbHVtbkhlYWRlcigpKTsKKyAgICBtLmFkZFN0eWxlTmFtZShHZXJyaXQuUkVTT1VSQ0VTLmNzcygpLnJpZ2h0Qm9yZGVyKCkpOworICAgIG0uY2xvc2VUZCgpOworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcGx1Z2lucy9QbHVnaW5NYXAuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wbHVnaW5zL1BsdWdpbk1hcC5qYXZhCmluZGV4IDZlY2EyMDYuLmU0YzUxNTkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wbHVnaW5zL1BsdWdpbk1hcC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wbHVnaW5zL1BsdWdpbk1hcC5qYXZhCkBAIC0xNiwxMyArMTYsMTQgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuTmF0aXZlTWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuUmVzdEFwaTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CiAKIC8qKiBQbHVnaW5zIGF2YWlsYWJsZSBmcm9tIHtAY29kZSAvcGx1Z2lucy99LiAqLwogcHVibGljIGNsYXNzIFBsdWdpbk1hcCBleHRlbmRzIE5hdGl2ZU1hcDxQbHVnaW5JbmZvPiB7CiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhbGwoQXN5bmNDYWxsYmFjazxQbHVnaW5NYXA+IGNhbGxiYWNrKSB7Ci0gICAgbmV3IFJlc3RBcGkoIi9wbHVnaW5zLyIpLmFkZFBhcmFtZXRlclRydWUoImFsbCIpCi0gICAgICAgIC5zZW5kKE5hdGl2ZU1hcC5jb3B5S2V5c0ludG9DaGlsZHJlbihjYWxsYmFjaykpOworICAgIG5ldyBSZXN0QXBpKCIvcGx1Z2lucy8iKQorICAgICAgLmFkZFBhcmFtZXRlclRydWUoImFsbCIpCisgICAgICAuZ2V0KE5hdGl2ZU1hcC5jb3B5S2V5c0ludG9DaGlsZHJlbihjYWxsYmFjaykpOwogICB9CiAKICAgcHJvdGVjdGVkIFBsdWdpbk1hcCgpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wcm9qZWN0cy9Qcm9qZWN0QXBpLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcHJvamVjdHMvUHJvamVjdEFwaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Njc2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcHJvamVjdHMvUHJvamVjdEFwaS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnByb2plY3RzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LlZvaWRSZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYy5SZXN0QXBpOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQucnBjLkFzeW5jQ2FsbGJhY2s7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0QXBpIHsKKyAgLyoqIENyZWF0ZSBhIG5ldyBwcm9qZWN0ICovCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBhcmVudCwKKyAgICAgIEJvb2xlYW4gY3JlYXRlRW1wdHlDY29tbWl0LCBCb29sZWFuIHBlcm1pc3Npb25zT25seSwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gYXN5bmNDYWxsYmFjaykgeworICAgIFByb2plY3RJbnB1dCBpbnB1dCA9IFByb2plY3RJbnB1dC5jcmVhdGUoKTsKKyAgICBpbnB1dC5zZXROYW1lKHByb2plY3ROYW1lKTsKKyAgICBpbnB1dC5zZXRQYXJlbnQocGFyZW50KTsKKyAgICBpbnB1dC5zZXRQZXJtaXNzaW9uc09ubHkocGVybWlzc2lvbnNPbmx5KTsKKyAgICBpbnB1dC5zZXRDcmVhdGVFbXB0eUNvbW1pdChjcmVhdGVFbXB0eUNjb21taXQpOworICAgIG5ldyBSZXN0QXBpKCIvcHJvamVjdHMvIikuaWQocHJvamVjdE5hbWUpLmlmTm9uZU1hdGNoKCkKKyAgICAgICAgLnB1dChpbnB1dCwgYXN5bmNDYWxsYmFjayk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9qZWN0SW5wdXQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgICBzdGF0aWMgUHJvamVjdElucHV0IGNyZWF0ZSgpIHsKKyAgICAgIHJldHVybiAoUHJvamVjdElucHV0KSBjcmVhdGVPYmplY3QoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUHJvamVjdElucHV0KCkgeworICAgIH0KKworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIHNldE5hbWUoU3RyaW5nIG4pIC8qLXsgaWYobil0aGlzLm5hbWU9bjsgfS0qLzsKKworICAgIGZpbmFsIG5hdGl2ZSB2b2lkIHNldFBhcmVudChTdHJpbmcgcCkgLyoteyBpZihwKXRoaXMucGFyZW50PXA7IH0tKi87CisKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBzZXRQZXJtaXNzaW9uc09ubHkoYm9vbGVhbiBwbykgLyoteyBpZihwbyl0aGlzLnBlcm1pc3Npb25zX29ubHk9cG87IH0tKi87CisKKyAgICBmaW5hbCBuYXRpdmUgdm9pZCBzZXRDcmVhdGVFbXB0eUNvbW1pdChib29sZWFuIGNjKSAvKi17IGlmKGNjKXRoaXMuY3JlYXRlX2VtcHR5X2NvbW1pdD1jYzsgfS0qLzsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3Byb2plY3RzL1Byb2plY3RNYXAuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9wcm9qZWN0cy9Qcm9qZWN0TWFwLmphdmEKaW5kZXggNDA4OTE5ZS4uYmJlYWJkMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3Byb2plY3RzL1Byb2plY3RNYXAuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcHJvamVjdHMvUHJvamVjdE1hcC5qYXZhCkBAIC0xNiw4ICsxNiw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLlJlc3RBcGk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlVSTDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKIAogLyoqIFByb2plY3RzIGF2YWlsYWJsZSBmcm9tIHtAY29kZSAvcHJvamVjdHMvfS4gKi8KIHB1YmxpYyBjbGFzcyBQcm9qZWN0TWFwIGV4dGVuZHMgTmF0aXZlTWFwPFByb2plY3RJbmZvPiB7CkBAIC0yNiw3ICsyNSw3IEBACiAgICAgICAgIC5hZGRQYXJhbWV0ZXJSYXcoInR5cGUiLCAiQUxMIikKICAgICAgICAgLmFkZFBhcmFtZXRlclRydWUoImFsbCIpCiAgICAgICAgIC5hZGRQYXJhbWV0ZXJUcnVlKCJkIikgLy8gZGVzY3JpcHRpb24KLSAgICAgICAgLnNlbmQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CisgICAgICAgIC5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIHZvaWQgcGVybWlzc2lvbnMoQXN5bmNDYWxsYmFjazxQcm9qZWN0TWFwPiBjYWxsYmFjaykgewpAQCAtMzQsNyArMzMsNyBAQAogICAgICAgICAuYWRkUGFyYW1ldGVyUmF3KCJ0eXBlIiwgIlBFUk1JU1NJT05TIikKICAgICAgICAgLmFkZFBhcmFtZXRlclRydWUoImFsbCIpCiAgICAgICAgIC5hZGRQYXJhbWV0ZXJUcnVlKCJkIikgLy8gZGVzY3JpcHRpb24KLSAgICAgICAgLnNlbmQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CisgICAgICAgIC5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNhbGxiYWNrKSk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIHZvaWQgcGFyZW50Q2FuZGlkYXRlcyhBc3luY0NhbGxiYWNrPFByb2plY3RNYXA+IGNhbGxiYWNrKSB7CkBAIC00MiwxNSArNDEsMjggQEAKICAgICAgICAgLmFkZFBhcmFtZXRlclJhdygidHlwZSIsICJQQVJFTlRfQ0FORElEQVRFUyIpCiAgICAgICAgIC5hZGRQYXJhbWV0ZXJUcnVlKCJhbGwiKQogICAgICAgICAuYWRkUGFyYW1ldGVyVHJ1ZSgiZCIpIC8vIGRlc2NyaXB0aW9uCi0gICAgICAgIC5zZW5kKE5hdGl2ZU1hcC5jb3B5S2V5c0ludG9DaGlsZHJlbihjYWxsYmFjaykpOworICAgICAgICAuZ2V0KE5hdGl2ZU1hcC5jb3B5S2V5c0ludG9DaGlsZHJlbihjYWxsYmFjaykpOwogICB9CiAKICAgcHVibGljIHN0YXRpYyB2b2lkIHN1Z2dlc3QoU3RyaW5nIHByZWZpeCwgaW50IGxpbWl0LCBBc3luY0NhbGxiYWNrPFByb2plY3RNYXA+IGNiKSB7Ci0gICAgbmV3IFJlc3RBcGkoIi9wcm9qZWN0cy8iICsgVVJMLmVuY29kZShwcmVmaXgpLnJlcGxhY2VBbGwoIls/XSIsICIlM0YiKSkKLSAgICAgICAgLmFkZFBhcmFtZXRlclJhdygidHlwZSIsICJBTEwiKQorICAgIG5ldyBSZXN0QXBpKCIvcHJvamVjdHMvIikKKyAgICAgICAgLmFkZFBhcmFtZXRlcigicCIsIHByZWZpeCkKICAgICAgICAgLmFkZFBhcmFtZXRlcigibiIsIGxpbWl0KQorICAgICAgICAuYWRkUGFyYW1ldGVyUmF3KCJ0eXBlIiwgIkFMTCIpCiAgICAgICAgIC5hZGRQYXJhbWV0ZXJUcnVlKCJkIikgLy8gZGVzY3JpcHRpb24KLSAgICAgICAgLnNlbmQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNiKSk7CisgICAgICAgIC5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNiKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWF0Y2goU3RyaW5nIG1hdGNoLCBBc3luY0NhbGxiYWNrPFByb2plY3RNYXA+IGNiKSB7CisgICAgaWYgKG1hdGNoID09IG51bGwgfHwgIiIuZXF1YWxzKG1hdGNoKSkgeworICAgICAgYWxsKGNiKTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3IFJlc3RBcGkoIi9wcm9qZWN0cy8iKQorICAgICAgICAgIC5hZGRQYXJhbWV0ZXIoIm0iLCBtYXRjaCkKKyAgICAgICAgICAuYWRkUGFyYW1ldGVyUmF3KCJ0eXBlIiwgIkFMTCIpCisgICAgICAgICAgLmFkZFBhcmFtZXRlclRydWUoImQiKSAvLyBkZXNjcmlwdGlvbgorICAgICAgICAgIC5nZXQoTmF0aXZlTWFwLmNvcHlLZXlzSW50b0NoaWxkcmVuKGNiKSk7CisgICAgfQogICB9CiAKICAgcHJvdGVjdGVkIFByb2plY3RNYXAoKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcXVlcnlJY29uLnBuZyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9xdWVyeUljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWNlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcXVlcnlJY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL0NhbGxiYWNrR3JvdXAuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvQ2FsbGJhY2tHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWY5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL0NhbGxiYWNrR3JvdXAuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBDbGFzcyBmb3IgZ3JvdXBpbmcgdG9nZXRoZXIgY2FsbGJhY2tzIGFuZCBjYWxsaW5nIHRoZW0gaW4gb3JkZXIuCisgKiA8cD4KKyAqIENhbGxiYWNrcyBhcmUgYWRkZWQgdG8gdGhlIGdyb3VwIHdpdGgge0BsaW5rICNhZGQoQXN5bmNDYWxsYmFjayl9LCB3aGljaAorICogcmV0dXJucyBhIHdyYXBwZWQgY2FsbGJhY2sgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gYW4gYXN5bmNocm9ub3VzIFJQQyBjYWxsLgorICogVGhlIGVuY2xvc2luZyBncm91cCBidWZmZXJzIHJldHVybmVkIHJlc3VsdHMgYW5kIGVuc3VyZXMgdGhhdAorICoge0Bjb2RlIG9uU3VjY2Vzc30gaXMgY2FsbGVkIGV4YWN0bHkgb25jZSBmb3IgZWFjaCBjYWxsYmFjayBpbiB0aGUgZ3JvdXAsIGluCisgKiB0aGUgc2FtZSBvcmRlciB0aGF0IGNhbGxiYWNrcyB3ZXJlIGFkZGVkLiBUaGlzIGFsbG93cyBjYWxsZXJzIHRvLCBmb3IKKyAqIGV4YW1wbGUsIHVzZSBhIHtAbGluayBTY3JlZW5Mb2FkQ2FsbGJhY2t9IGFzIHRoZSBsYXN0IGNhbGxiYWNrIGluIHRoZSBsaXN0CisgKiBhbmQgb25seSBkaXNwbGF5IHRoZSBzY3JlZW4gb25jZSBhbGwgY2FsbGJhY2tzIGhhdmUgc3VjY2VlZGVkLgorICogPHA+CisgKiBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlLCB0aGUgPGVtPmZpcnN0PC9lbT4gY2F1Z2h0IGV4Y2VwdGlvbiBpcyBzZW50IHRvCisgKiA8ZW0+YWxsPC9lbT4gY2FsbGJhY2tzJyB7QGNvZGUgb25GYWlsdXJlfSBtZXRob2RzLCBpbiBvcmRlcjsgc3Vic2VxdWVudAorICogc3VjY2Vzc2VzIG9yIGZhaWx1cmVzIGFyZSBhbGwgaWdub3JlZC4gTm90ZSB0aGF0IHRoaXMgbWVhbnMKKyAqIHtAY29kZSBvbkZhaWx1cmV9IG1heSBiZSBjYWxsZWQgd2l0aCBhbiBleGNlcHRpb24gdW5yZWxhdGVkIHRvIHRoZSBjYWxsYmFjaworICogcHJvY2Vzc2luZyBpdC4KKyAqLworcHVibGljIGNsYXNzIENhbGxiYWNrR3JvdXAgeworICBwcml2YXRlIGZpbmFsIExpc3Q8T2JqZWN0PiBjYWxsYmFja3M7CisgIHByaXZhdGUgZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiByZXN1bHRzOworICBwcml2YXRlIGJvb2xlYW4gZmFpbGVkOworCisgIHB1YmxpYyBDYWxsYmFja0dyb3VwKCkgeworICAgIGNhbGxiYWNrcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgIHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKyAgfQorCisgIHB1YmxpYyA8VD4gQXN5bmNDYWxsYmFjazxUPiBhZGQoZmluYWwgQXN5bmNDYWxsYmFjazxUPiBjYikgeworICAgIGNhbGxiYWNrcy5hZGQoY2IpOworICAgIHJldHVybiBuZXcgQXN5bmNDYWxsYmFjazxUPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFQgcmVzdWx0KSB7CisgICAgICAgIHJlc3VsdHMucHV0KGNiLCByZXN1bHQpOworICAgICAgICBDYWxsYmFja0dyb3VwLnRoaXMub25TdWNjZXNzKCk7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICAgICAgQ2FsbGJhY2tHcm91cC50aGlzLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwdWJsaWMgPFQ+IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazxUPiBhZGRHd3Rqc29ucnBjKAorICAgICAgZmluYWwgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrPFQ+IGNiKSB7CisgICAgY2FsbGJhY2tzLmFkZChjYik7CisgICAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s8VD4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhUIHJlc3VsdCkgeworICAgICAgICByZXN1bHRzLnB1dChjYiwgcmVzdWx0KTsKKyAgICAgICAgQ2FsbGJhY2tHcm91cC50aGlzLm9uU3VjY2VzcygpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgIENhbGxiYWNrR3JvdXAudGhpcy5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIG9uU3VjY2VzcygpIHsKKyAgICBpZiAocmVzdWx0cy5zaXplKCkgPCBjYWxsYmFja3Muc2l6ZSgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoT2JqZWN0IG8gOiBjYWxsYmFja3MpIHsKKyAgICAgIE9iamVjdCByZXN1bHQgPSByZXN1bHRzLmdldChvKTsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQXN5bmNDYWxsYmFjaykgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQXN5bmNDYWxsYmFjazxPYmplY3Q+IGNiID0gKEFzeW5jQ2FsbGJhY2s8T2JqZWN0PikgbzsKKyAgICAgICAgY2Iub25TdWNjZXNzKHJlc3VsdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrPE9iamVjdD4gY2IgPQorICAgICAgICAgICAgKGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazxPYmplY3Q+KSBvOworICAgICAgICBjYi5vblN1Y2Nlc3MocmVzdWx0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgb25GYWlsdXJlKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICBpZiAoZmFpbGVkKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZhaWxlZCA9IHRydWU7CisgICAgZm9yIChPYmplY3QgbyA6IGNhbGxiYWNrcykgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBc3luY0NhbGxiYWNrKSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBBc3luY0NhbGxiYWNrPE9iamVjdD4gY2IgPSAoQXN5bmNDYWxsYmFjazxPYmplY3Q+KSBvOworICAgICAgICBjYi5vbkZhaWx1cmUoY2F1Z2h0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s8T2JqZWN0PiBjYiA9CisgICAgICAgICAgICAoY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrPE9iamVjdD4pIG87CisgICAgICAgIGNiLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9HZXJyaXRDYWxsYmFjay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9HZXJyaXRDYWxsYmFjay5qYXZhCmluZGV4IGRjZTViYjYuLjA2ZDFmMGIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvR2Vycml0Q2FsbGJhY2suamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL0dlcnJpdENhbGxiYWNrLmphdmEKQEAgLTI0LDE0ICsyNCwxNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob3RTaWduZWRJbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5JbnZvY2F0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuUmVtb3RlSnNvbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50LlNlcnZlclVuYXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uSnNvbkNvbnN0YW50czsKIAogLyoqIEFic3RyYWN0IGNhbGxiYWNrIGhhbmRsaW5nIGdlbmVyaWMgZXJyb3IgY29uZGl0aW9ucyBhdXRvbWF0aWNhbGx5ICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2Vycml0Q2FsbGJhY2s8VD4gaW1wbGVtZW50cyBBc3luY0NhbGxiYWNrPFQ+IHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZXJyaXRDYWxsYmFjazxUPiBpbXBsZW1lbnRzCisgICAgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrPFQ+LAorICAgIGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrPFQ+IHsKICAgcHVibGljIHZvaWQgb25GYWlsdXJlKGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKICAgICBpZiAoaXNOb3RTaWduZWRJbihjYXVnaHQpIHx8IGlzSW52YWxpZFhTUkYoY2F1Z2h0KSkgewogICAgICAgbmV3IE5vdFNpZ25lZEluRGlhbG9nKCkuY2VudGVyKCk7CkBAIC01Myw3ICs1NCw5IEBACiAgICAgICBkLmNlbnRlcigpOwogCiAgICAgfSBlbHNlIGlmIChpc05hbWVBbHJlYWR5VXNlZChjYXVnaHQpKSB7Ci0gICAgICBuZXcgRXJyb3JEaWFsb2coR2Vycml0LkMubmFtZUFscmVhZHlVc2VkQm9keSgpKS5jZW50ZXIoKTsKKyAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSBjYXVnaHQuZ2V0TWVzc2FnZSgpOworICAgICAgZmluYWwgU3RyaW5nIGFscmVhZHlVc2VkTmFtZSA9IG1zZy5zdWJzdHJpbmcoTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLk1FU1NBR0UubGVuZ3RoKCkpOworICAgICAgbmV3IEVycm9yRGlhbG9nKEdlcnJpdC5NLm5hbWVBbHJlYWR5VXNlZEJvZHkoYWxyZWFkeVVzZWROYW1lKSkuY2VudGVyKCk7CiAKICAgICB9IGVsc2UgaWYgKGlzTm9TdWNoR3JvdXAoY2F1Z2h0KSkgewogICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGNhdWdodC5nZXRNZXNzYWdlKCk7CkBAIC03NiwxNCArNzksMTYgQEAKICAgICAgICAgJiYgY2F1Z2h0LmdldE1lc3NhZ2UoKS5lcXVhbHMoSnNvbkNvbnN0YW50cy5FUlJPUl9JTlZBTElEX1hTUkYpOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vdFNpZ25lZEluKGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKLSAgICByZXR1cm4gY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgotICAgICAgICAmJiBjYXVnaHQuZ2V0TWVzc2FnZSgpLmVxdWFscyhOb3RTaWduZWRJbkV4Y2VwdGlvbi5NRVNTQUdFKTsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vdFNpZ25lZEluKFRocm93YWJsZSBjYXVnaHQpIHsKKyAgICByZXR1cm4gUmVzdEFwaS5pc05vdFNpZ25lZEluKGNhdWdodCkKKyAgICAgICAgfHwgKGNhdWdodCBpbnN0YW5jZW9mIFJlbW90ZUpzb25FeGNlcHRpb24KKyAgICAgICAgICAgJiYgY2F1Z2h0LmdldE1lc3NhZ2UoKS5lcXVhbHMoTm90U2lnbmVkSW5FeGNlcHRpb24uTUVTU0FHRSkpOwogICB9CiAKLSAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTm9TdWNoRW50aXR5KGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKLSAgICByZXR1cm4gY2F1Z2h0IGluc3RhbmNlb2YgUmVtb3RlSnNvbkV4Y2VwdGlvbgotICAgICAgICAmJiBjYXVnaHQuZ2V0TWVzc2FnZSgpLmVxdWFscyhOb1N1Y2hFbnRpdHlFeGNlcHRpb24uTUVTU0FHRSk7CisgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc05vU3VjaEVudGl0eShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgcmV0dXJuIFJlc3RBcGkuaXNOb3RGb3VuZChjYXVnaHQpCisgICAgICAgIHx8IChjYXVnaHQgaW5zdGFuY2VvZiBSZW1vdGVKc29uRXhjZXB0aW9uCisgICAgICAgICAgICAmJiBjYXVnaHQuZ2V0TWVzc2FnZSgpLmVxdWFscyhOb1N1Y2hFbnRpdHlFeGNlcHRpb24uTUVTU0FHRSkpOwogICB9CiAKICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzSW5hY3RpdmVBY2NvdW50KGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKQEAgLTk4LDcgKzEwMyw3IEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05hbWVBbHJlYWR5VXNlZChmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CiAgICAgcmV0dXJuIGNhdWdodCBpbnN0YW5jZW9mIFJlbW90ZUpzb25FeGNlcHRpb24KLSAgICAgICAgJiYgY2F1Z2h0LmdldE1lc3NhZ2UoKS5lcXVhbHMoTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLk1FU1NBR0UpOworICAgICAgICAmJiBjYXVnaHQuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uLk1FU1NBR0UpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc05vU3VjaEdyb3VwKGZpbmFsIFRocm93YWJsZSBjYXVnaHQpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlTGlzdC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjBmZTAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkphdmFTY3JpcHRPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKiogQSByZWFkLW9ubHkgbGlzdCBvZiBuYXRpdmUgSmF2YVNjcmlwdCBvYmplY3RzIHN0b3JlZCBpbiBhIEpTT04gYXJyYXkuICovCi1wdWJsaWMgY2xhc3MgTmF0aXZlTGlzdDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKLSAgcHJvdGVjdGVkIE5hdGl2ZUxpc3QoKSB7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgTGlzdDxUPiBhc0xpc3QoKSB7Ci0gICAgcmV0dXJuIG5ldyBBYnN0cmFjdExpc3Q8VD4oKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBUIHNldChpbnQgaW5kZXgsIFQgZWxlbWVudCkgewotICAgICAgICBUIG9sZCA9IE5hdGl2ZUxpc3QudGhpcy5nZXQoaW5kZXgpOwotICAgICAgICBOYXRpdmVMaXN0LnRoaXMuc2V0MChpbmRleCwgZWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBvbGQ7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gTmF0aXZlTGlzdC50aGlzLmdldChpbmRleCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gTmF0aXZlTGlzdC50aGlzLnNpemUoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICByZXR1cm4gc2l6ZSgpID09IDA7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgbmF0aXZlIGludCBzaXplKCkgLyoteyByZXR1cm4gdGhpcy5sZW5ndGg7IH0tKi87Ci0gIHB1YmxpYyBmaW5hbCBuYXRpdmUgVCBnZXQoaW50IGkpIC8qLXsgcmV0dXJuIHRoaXNbaV07IH0tKi87Ci0gIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgc2V0MChpbnQgaSwgVCB2KSAvKi17IHRoaXNbaV0gPSB2OyB9LSovOwotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVNYXAuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlTWFwLmphdmEKaW5kZXggY2RlOTA0MS4uZDU2ZWVhZiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9OYXRpdmVNYXAuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZU1hcC5qYXZhCkBAIC0xNSw3ICsxNSw4IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5KYXZhU2NyaXB0T2JqZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOwogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKIApAQCAtNTMsNyArNTQsNyBAQAogICAgIHJldHVybiBOYXRpdmVzLmtleXModGhpcyk7CiAgIH0KIAotICBwdWJsaWMgZmluYWwgbmF0aXZlIE5hdGl2ZUxpc3Q8VD4gdmFsdWVzKCkKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBKc0FycmF5PFQ+IHZhbHVlcygpCiAgIC8qLXsKICAgICB2YXIgcyA9IHRoaXM7CiAgICAgdmFyIHYgPSBbXTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlU3RyaW5nLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZVN0cmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2M1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZVN0cmluZy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKKworLyoqIFdyYXBzIGEgU3RyaW5nIHRoYXQgd2FzIHJldHVybmVkIGZyb20gYSBKU09OIEFQSS4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBOYXRpdmVTdHJpbmcgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0IHsKKyAgc3RhdGljIE5hdGl2ZVN0cmluZyB3cmFwKFN0cmluZyB2YWx1ZSkgeworICAgIE5hdGl2ZVN0cmluZyBucyA9IChOYXRpdmVTdHJpbmcpIGNyZWF0ZU9iamVjdCgpOworICAgIG5zLnNldCh2YWx1ZSk7CisgICAgcmV0dXJuIG5zOworICB9CisKKyAgcHVibGljIGZpbmFsIG5hdGl2ZSBTdHJpbmcgYXNTdHJpbmcoKSAvKi17IHJldHVybiB0aGlzLnM7IH0tKi87CisgIHByaXZhdGUgZmluYWwgbmF0aXZlIHZvaWQgc2V0KFN0cmluZyB2KSAvKi17IHRoaXMucyA9IHY7IH0tKi87CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBBc3luY0NhbGxiYWNrPE5hdGl2ZVN0cmluZz4KKyAgdW53cmFwKGZpbmFsIEFzeW5jQ2FsbGJhY2s8U3RyaW5nPiBjYikgeworICAgIHJldHVybiBuZXcgQXN5bmNDYWxsYmFjazxOYXRpdmVTdHJpbmc+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoTmF0aXZlU3RyaW5nIHJlc3VsdCkgeworICAgICAgICBjYi5vblN1Y2Nlc3MocmVzdWx0ICE9IG51bGwgPyByZXN1bHQuYXNTdHJpbmcoKSA6IG51bGwpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShUaHJvd2FibGUgY2F1Z2h0KSB7CisgICAgICAgIGNiLm9uRmFpbHVyZShjYXVnaHQpOworICAgICAgfQorICAgIH07CisgIH0KKworICBwcm90ZWN0ZWQgTmF0aXZlU3RyaW5nKCkgeworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL05hdGl2ZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlcy5qYXZhCmluZGV4IGE2YzYwOWMuLjQxZjBmMjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlcy5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvTmF0aXZlcy5qYXZhCkBAIC0xNSw5ICsxNSwxMiBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5Kc0FycmF5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmpzb24uY2xpZW50LkpTT05PYmplY3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgTmF0aXZlcyB7CkBAIC0zMiwxNiArMzUsNTEgQEAKICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKICAgfQogCi0gIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PiBUIHBhcnNlSlNPTihTdHJpbmcganNvbikgewotICAgIGlmIChwYXJzZXIgPT0gbnVsbCkgewotICAgICAgcGFyc2VyID0gYmVzdEpzb25QYXJzZXIoKTsKKyAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IExpc3Q8VD4gYXNMaXN0KAorICAgICAgZmluYWwgSnNBcnJheTxUPiBhcnIpIHsKKyAgICBpZiAoYXJyID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAvLyBqYXZhYyBnZW5lcmljcyBidWcKLSAgICByZXR1cm4gTmF0aXZlcy48VD5wYXJzZTAocGFyc2VyLCBqc29uKTsKKyAgICByZXR1cm4gbmV3IEFic3RyYWN0TGlzdDxUPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFQgc2V0KGludCBpbmRleCwgVCBlbGVtZW50KSB7CisgICAgICAgIFQgb2xkID0gYXJyLmdldChpbmRleCk7CisgICAgICAgIGFyci5zZXQoaW5kZXgsIGVsZW1lbnQpOworICAgICAgICByZXR1cm4gb2xkOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBUIGdldChpbnQgaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIGFyci5nZXQoaW5kZXgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGFyci5sZW5ndGgoKTsKKyAgICAgIH0KKyAgICB9OworICB9CisKKyAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IEpzQXJyYXk8VD4gYXJyYXlPZihUIGVsZW1lbnQpIHsKKyAgICBKc0FycmF5PFQ+IGFyciA9IEphdmFTY3JpcHRPYmplY3QuY3JlYXRlQXJyYXkoKS5jYXN0KCk7CisgICAgYXJyLnB1c2goZWxlbWVudCk7CisgICAgcmV0dXJuIGFycjsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gVCBwYXJzZUpTT04oU3RyaW5nIGpzb24pIHsKKyAgICBpZiAoanNvbi5zdGFydHNXaXRoKCJcIiIpKSB7CisgICAgICByZXR1cm4gKFQpIE5hdGl2ZVN0cmluZy53cmFwKHBhcnNlU3RyaW5nKHBhcnNlciwganNvbikpOworICAgIH0KKyAgICByZXR1cm4gTmF0aXZlcy48VD4gcGFyc2VPYmplY3QocGFyc2VyLCBqc29uKTsgLy8gamF2YWMgZ2VuZXJpY3MgYnVnCiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBuYXRpdmUgPFQgZXh0ZW5kcyBKYXZhU2NyaXB0T2JqZWN0PgotICBUIHBhcnNlMChKYXZhU2NyaXB0T2JqZWN0IHAsIFN0cmluZyBzKQorICBUIHBhcnNlT2JqZWN0KEphdmFTY3JpcHRPYmplY3QgcCwgU3RyaW5nIHMpCisgIC8qLXsgcmV0dXJuIHAocyk7IH0tKi87CisKKyAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlCisgIFN0cmluZyBwYXJzZVN0cmluZyhKYXZhU2NyaXB0T2JqZWN0IHAsIFN0cmluZyBzKQogICAvKi17IHJldHVybiBwKHMpOyB9LSovOwogCiAgIHByaXZhdGUgc3RhdGljIEphdmFTY3JpcHRPYmplY3QgcGFyc2VyOwpAQCAtNTIsNiArOTAsMTAgQEAKICAgICByZXR1cm4gZnVuY3Rpb24ocykgeyByZXR1cm4gZXZhbCgnKCcgKyBzICsgJyknKTsgfTsKICAgfS0qLzsKIAorICBzdGF0aWMgeworICAgIHBhcnNlciA9IGJlc3RKc29uUGFyc2VyKCk7CisgIH0KKwogICBwcml2YXRlIE5hdGl2ZXMoKSB7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvUmVzdEFwaS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9SZXN0QXBpLmphdmEKaW5kZXggNjUwY2FjZC4uNGVlNjNjNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9SZXN0QXBpLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9SZXN0QXBpLmphdmEKQEAgLTE0LDIzICsxNCwzOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuUmVxdWVzdEJ1aWxkZXIuREVMRVRFOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXF1ZXN0QnVpbGRlci5HRVQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlcXVlc3RCdWlsZGVyLlBPU1Q7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlcXVlc3RCdWlsZGVyLlBVVDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LlJwY1N0YXR1czsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuSmF2YVNjcmlwdE9iamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXF1ZXN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlcXVlc3RCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmh0dHAuY2xpZW50LlJlcXVlc3RCdWlsZGVyLk1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXF1ZXN0Q2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuaHR0cC5jbGllbnQuUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5SZXNwb25zZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5odHRwLmNsaWVudC5VUkw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuanNvbi5jbGllbnQuSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5qc29uLmNsaWVudC5KU09OT2JqZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0Lmpzb24uY2xpZW50LkpTT05QYXJzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuanNvbi5jbGllbnQuSlNPTlZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5Bc3luY0NhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnJwYy5TdGF0dXNDb2RlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jbGllbnQuUmVtb3RlSnNvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY2xpZW50LlNlcnZlclVuYXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkpzb25Db25zdGFudHM7CiAKIC8qKiBNYWtlcyBhIFJFU1QgQVBJIGNhbGwgdG8gdGhlIHNlcnZlci4gKi8KIHB1YmxpYyBjbGFzcyBSZXN0QXBpIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDX1VOQVZBSUxBQkxFID0gMjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNDX0JBRF9UUkFOU1BPUlQgPSAzOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0NfQkFEX1JFU1BPTlNFID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVFlQRSA9ICJhcHBsaWNhdGlvbi9qc29uIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fVVRGOCA9IEpTT05fVFlQRSArICI7IGNoYXJzZXQ9dXRmLTgiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9UWVBFID0gInRleHQvcGxhaW4iOworCiAgIC8qKgogICAgKiBFeHBlY3RlZCBKU09OIGNvbnRlbnQgYm9keSBwcmVmaXggdGhhdCBwcmV2ZW50cyBYU1NJLgogICAgKiA8cD4KQEAgLTQyLDc1ICs1NywxMzEgQEAKICAgICovCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX01BR0lDID0gIildfSdcbiI7CiAKLSAgcHJpdmF0ZSBjbGFzcyBNeVJlcXVlc3RDYWxsYmFjazxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gaW1wbGVtZW50cwotICAgICAgUmVxdWVzdENhbGxiYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gd2FzR2V0OworICAvKiogVHJ1ZSBpZiBlcnIgaXMgYSBTdGF0dXNDb2RlRXhjZXB0aW9uIHJlcG9ydGluZyBOb3QgRm91bmQuICovCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05vdEZvdW5kKFRocm93YWJsZSBlcnIpIHsKKyAgICByZXR1cm4gaXNTdGF0dXMoZXJyLCBSZXNwb25zZS5TQ19OT1RfRk9VTkQpOworICB9CisKKyAgLyoqIFRydWUgaWYgZXJyIGlzIGRlc2NyaWJpbmcgYSB1c2VyIHRoYXQgaXMgY3VycmVudGx5IGFub255bW91cy4gKi8KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTm90U2lnbmVkSW4oVGhyb3dhYmxlIGVycikgeworICAgIGlmIChlcnIgaW5zdGFuY2VvZiBTdGF0dXNDb2RlRXhjZXB0aW9uKSB7CisgICAgICBTdGF0dXNDb2RlRXhjZXB0aW9uIHNjZSA9IChTdGF0dXNDb2RlRXhjZXB0aW9uKSBlcnI7CisgICAgICBpZiAoc2NlLmdldFN0YXR1c0NvZGUoKSA9PSBSZXNwb25zZS5TQ19VTkFVVEhPUklaRUQpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gc2NlLmdldFN0YXR1c0NvZGUoKSA9PSBSZXNwb25zZS5TQ19GT1JCSURERU4KKyAgICAgICAgICAmJiAoc2NlLmdldEVuY29kZWRSZXNwb25zZSgpLmVxdWFscygiQXV0aGVudGljYXRpb24gcmVxdWlyZWQiKQorICAgICAgICAgICAgICB8fCBzY2UuZ2V0RW5jb2RlZFJlc3BvbnNlKCkuc3RhcnRzV2l0aCgiTXVzdCBiZSBzaWduZWQtaW4iKSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8qKiBUcnVlIGlmIGVyciBpcyBhIFN0YXR1c0NvZGVFeGNlcHRpb24gd2l0aCBhIHNwZWNpZmljIEhUVFAgY29kZS4gKi8KKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3RhdHVzKFRocm93YWJsZSBlcnIsIGludCBzdGF0dXMpIHsKKyAgICByZXR1cm4gZXJyIGluc3RhbmNlb2YgU3RhdHVzQ29kZUV4Y2VwdGlvbgorICAgICAgICAmJiAoKFN0YXR1c0NvZGVFeGNlcHRpb24pIGVycikuZ2V0U3RhdHVzQ29kZSgpID09IHN0YXR1czsKKyAgfQorCisgIC8qKiBJcyB0aGUgR2Vycml0IENvZGUgUmV2aWV3IHNlcnZlciBsaWtlbHkgdG8gcmV0dXJuIHRoaXMgc3RhdHVzPyAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFeHBlY3RlZChpbnQgc3RhdHVzQ29kZSkgeworICAgIHN3aXRjaCAoc3RhdHVzQ29kZSkgeworICAgICAgY2FzZSBTQ19VTkFWQUlMQUJMRToKKyAgICAgIGNhc2UgNDAwOiAvLyBCYWQgUmVxdWVzdAorICAgICAgY2FzZSA0MDE6IC8vIFVuYXV0aG9yaXplZAorICAgICAgY2FzZSA0MDM6IC8vIEZvcmJpZGRlbgorICAgICAgY2FzZSA0MDQ6IC8vIE5vdCBGb3VuZAorICAgICAgY2FzZSA0MDU6IC8vIE1ldGhvZCBOb3QgQWxsb3dlZAorICAgICAgY2FzZSA0MDk6IC8vIENvbmZsaWN0CisgICAgICBjYXNlIDQxMjogLy8gUHJlY29uZGl0aW9uIEZhaWxlZAorICAgICAgY2FzZSA0Mjk6IC8vIFRvbyBNYW55IFJlcXVlc3RzIChSRkMgNjU4NSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIEFzc3VtZSBhbnkgb3RoZXIgY29kZSBpcyBub3QgZXhwZWN0ZWQuIFRoZXNlIG1heSBiZQorICAgICAgICAvLyBsb2NhbCBwcm94eSBzZXJ2ZXIgZXJyb3JzIG91dHNpZGUgb2Ygb3VyIGNvbnRyb2wuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIdHRwQ2FsbGJhY2s8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+CisgICAgICBpbXBsZW1lbnRzIFJlcXVlc3RDYWxsYmFjayB7CiAgICAgcHJpdmF0ZSBmaW5hbCBBc3luY0NhbGxiYWNrPFQ+IGNiOwogCi0gICAgcHVibGljIE15UmVxdWVzdENhbGxiYWNrKGJvb2xlYW4gd2FzR2V0LCBBc3luY0NhbGxiYWNrPFQ+IGNiKSB7Ci0gICAgICB0aGlzLndhc0dldCA9IHdhc0dldDsKKyAgICBIdHRwQ2FsbGJhY2soQXN5bmNDYWxsYmFjazxUPiBjYikgewogICAgICAgdGhpcy5jYiA9IGNiOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUmVzcG9uc2VSZWNlaXZlZChSZXF1ZXN0IHJlcSwgUmVzcG9uc2UgcmVzKSB7CiAgICAgICBpbnQgc3RhdHVzID0gcmVzLmdldFN0YXR1c0NvZGUoKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMjAwKSB7CisgICAgICBpZiAoc3RhdHVzID09IFJlc3BvbnNlLlNDX05PX0NPTlRFTlQpIHsKKyAgICAgICAgY2Iub25TdWNjZXNzKG51bGwpOwogICAgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOwotICAgICAgICBpZiAoKDQwMCA8PSBzdGF0dXMgJiYgc3RhdHVzIDwgNjAwKSAmJiBpc1RleHRCb2R5KHJlcykpIHsKLSAgICAgICAgICBjYi5vbkZhaWx1cmUobmV3IFJlbW90ZUpzb25FeGNlcHRpb24ocmVzLmdldFRleHQoKSwgc3RhdHVzLCBudWxsKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBTdGF0dXNDb2RlRXhjZXB0aW9uKHN0YXR1cywgcmVzLmdldFN0YXR1c1RleHQoKSkpOworCisgICAgICB9IGVsc2UgaWYgKDIwMCA8PSBzdGF0dXMgJiYgc3RhdHVzIDwgMzAwKSB7CisgICAgICAgIGlmICghaXNKc29uQm9keShyZXMpKSB7CisgICAgICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjQ29tcGxldGUoKTsKKyAgICAgICAgICBjYi5vbkZhaWx1cmUobmV3IFN0YXR1c0NvZGVFeGNlcHRpb24oU0NfQkFEX1JFU1BPTlNFLCAiRXhwZWN0ZWQgIgorICAgICAgICAgICAgICArIEpTT05fVFlQRSArICI7IHJlY2VpdmVkIENvbnRlbnQtVHlwZTogIgorICAgICAgICAgICAgICArIHJlcy5nZXRIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKSk7CisgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KIAotICAgICAgaWYgKCFpc0pzb25Cb2R5KHJlcykpIHsKKyAgICAgICAgVCBkYXRhOworICAgICAgICB0cnkgeworICAgICAgICAgIC8vIGphdmFjIGdlbmVyaWNzIGJ1ZworICAgICAgICAgIGRhdGEgPSBSZXN0QXBpLjxUPmNhc3QocGFyc2VKc29uKHJlcykpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOworICAgICAgICAgIGNiLm9uRmFpbHVyZShuZXcgU3RhdHVzQ29kZUV4Y2VwdGlvbihTQ19CQURfUkVTUE9OU0UsCisgICAgICAgICAgICAgICJJbnZhbGlkIEpTT046ICIgKyBlLmdldE1lc3NhZ2UoKSkpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNiLm9uU3VjY2VzcyhkYXRhKTsKICAgICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjQ29tcGxldGUoKTsKLSAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBSZW1vdGVKc29uRXhjZXB0aW9uKCJJbnZhbGlkIEpTT04iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KIAotICAgICAgU3RyaW5nIGpzb24gPSByZXMuZ2V0VGV4dCgpOwotICAgICAgaWYgKCFqc29uLnN0YXJ0c1dpdGgoSlNPTl9NQUdJQykpIHsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgIGlmIChpc1RleHRCb2R5KHJlcykpIHsKKyAgICAgICAgICBtc2cgPSByZXMuZ2V0VGV4dCgpLnRyaW0oKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0pzb25Cb2R5KHJlcykpIHsKKyAgICAgICAgICBKU09OVmFsdWUgdjsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdiA9IHBhcnNlSnNvbihyZXMpOworICAgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdiA9IG51bGw7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh2ICE9IG51bGwgJiYgdi5pc1N0cmluZygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1zZyA9IHYuaXNTdHJpbmcoKS5zdHJpbmdWYWx1ZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtc2cgPSB0cmltSnNvbk1hZ2ljKHJlcy5nZXRUZXh0KCkpLnRyaW0oKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbXNnID0gcmVzLmdldFN0YXR1c1RleHQoKTsKKyAgICAgICAgfQorCiAgICAgICAgIFJwY1N0YXR1cy5JTlNUQU5DRS5vblJwY0NvbXBsZXRlKCk7Ci0gICAgICAgIGNiLm9uRmFpbHVyZShuZXcgUmVtb3RlSnNvbkV4Y2VwdGlvbigiSW52YWxpZCBKU09OIikpOwotICAgICAgICByZXR1cm47CisgICAgICAgIGNiLm9uRmFpbHVyZShuZXcgU3RhdHVzQ29kZUV4Y2VwdGlvbihzdGF0dXMsIG1zZykpOwogICAgICAgfQotICAgICAganNvbiA9IGpzb24uc3Vic3RyaW5nKEpTT05fTUFHSUMubGVuZ3RoKCkpOwotCi0gICAgICBpZiAod2FzR2V0ICYmIGpzb24uc3RhcnRzV2l0aCgie1wiX2F1dGhrZXlcIjoiKSkgewotICAgICAgICBSZXN0QXBpLnRoaXMucmVzZW5kUG9zdChjYiwganNvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgVCBkYXRhOwotICAgICAgdHJ5IHsKLSAgICAgICAgLy8gamF2YWMgZ2VuZXJpY3MgYnVnCi0gICAgICAgIGRhdGEgPSBOYXRpdmVzLjxUPiBwYXJzZUpTT04oanNvbik7Ci0gICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjQ29tcGxldGUoKTsKLSAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBSZW1vdGVKc29uRXhjZXB0aW9uKCJJbnZhbGlkIEpTT04iKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgY2Iub25TdWNjZXNzKGRhdGEpOwotICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjQ29tcGxldGUoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFJlcXVlc3QgcmVxLCBUaHJvd2FibGUgZXJyKSB7CiAgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNDb21wbGV0ZSgpOwogICAgICAgaWYgKGVyci5nZXRNZXNzYWdlKCkuY29udGFpbnMoIlhtbEh0dHBSZXF1ZXN0LnN0YXR1cyIpKSB7Ci0gICAgICAgIGNiLm9uRmFpbHVyZShuZXcgU2VydmVyVW5hdmFpbGFibGVFeGNlcHRpb24oKSk7CisgICAgICAgIGNiLm9uRmFpbHVyZShuZXcgU3RhdHVzQ29kZUV4Y2VwdGlvbigKKyAgICAgICAgICAgIFNDX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgUnBjQ29uc3RhbnRzLkMuZXJyb3JTZXJ2ZXJVbmF2YWlsYWJsZSgpKSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBjYi5vbkZhaWx1cmUoZXJyKTsKKyAgICAgICAgY2Iub25GYWlsdXJlKG5ldyBTdGF0dXNDb2RlRXhjZXB0aW9uKFNDX0JBRF9UUkFOU1BPUlQsIGVyci5nZXRNZXNzYWdlKCkpKTsKICAgICAgIH0KICAgICB9CiAgIH0KIAogICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgdXJsOwogICBwcml2YXRlIGJvb2xlYW4gaGFzUXVlcnlQYXJhbXM7CisgIHByaXZhdGUgU3RyaW5nIGlmTm9uZU1hdGNoOwogCiAgIC8qKgogICAgKiBJbml0aWFsaXplIGEgbmV3IEFQSSBjYWxsLgpAQCAtMTMxLDEwICsyMDIsNDAgQEAKICAgICB1cmwuYXBwZW5kKG5hbWUpOwogICB9CiAKKyAgcHVibGljIFJlc3RBcGkgdmlldyhTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBpZFJhdyhuYW1lKTsKKyAgfQorCisgIHB1YmxpYyBSZXN0QXBpIGlkKFN0cmluZyBpZCkgeworICAgIHJldHVybiBpZFJhdyhVUkwuZW5jb2RlUXVlcnlTdHJpbmcoaWQpKTsKKyAgfQorCisgIHB1YmxpYyBSZXN0QXBpIGlkKGludCBpZCkgeworICAgIHJldHVybiBpZFJhdyhJbnRlZ2VyLnRvU3RyaW5nKGlkKSk7CisgIH0KKworICBwdWJsaWMgUmVzdEFwaSBpZFJhdyhTdHJpbmcgbmFtZSkgeworICAgIGlmIChoYXNRdWVyeVBhcmFtcykgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKyAgICBpZiAodXJsLmNoYXJBdCh1cmwubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKKyAgICAgIHVybC5hcHBlbmQoJy8nKTsKKyAgICB9CisgICAgdXJsLmFwcGVuZChuYW1lKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCiAgIHB1YmxpYyBSZXN0QXBpIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgcmV0dXJuIGFkZFBhcmFtZXRlclJhdyhuYW1lLCBVUkwuZW5jb2RlUXVlcnlTdHJpbmcodmFsdWUpKTsKICAgfQogCisgIHB1YmxpYyBSZXN0QXBpIGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIHZhbHVlKSB7CisgICAgZm9yIChTdHJpbmcgdmFsIDogdmFsdWUpIHsKKyAgICAgIGFkZFBhcmFtZXRlcihuYW1lLCB2YWwpOworICAgIH0KKyAgICByZXR1cm4gdGhpczsKKyAgfQorCiAgIHB1YmxpYyBSZXN0QXBpIGFkZFBhcmFtZXRlclRydWUoU3RyaW5nIG5hbWUpIHsKICAgICByZXR1cm4gYWRkUGFyYW1ldGVyUmF3KG5hbWUsIG51bGwpOwogICB9CkBAIC0xNjUsNDAgKzI2Niw4NyBAQAogICAgIHJldHVybiB0aGlzOwogICB9CiAKLSAgcHVibGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBzZW5kKGZpbmFsIEFzeW5jQ2FsbGJhY2s8VD4gY2IpIHsKLSAgICBSZXF1ZXN0QnVpbGRlciByZXEgPSBuZXcgUmVxdWVzdEJ1aWxkZXIoUmVxdWVzdEJ1aWxkZXIuR0VULCB1cmwudG9TdHJpbmcoKSk7Ci0gICAgcmVxLnNldEhlYWRlcigiQWNjZXB0IiwgSnNvbkNvbnN0YW50cy5KU09OX1RZUEUpOwotICAgIHJlcS5zZXRDYWxsYmFjayhuZXcgTXlSZXF1ZXN0Q2FsbGJhY2s8VD4odHJ1ZSwgY2IpKTsKKyAgcHVibGljIFJlc3RBcGkgaWZOb25lTWF0Y2goKSB7CisgICAgcmV0dXJuIGlmTm9uZU1hdGNoKCIqIik7CisgIH0KKworICBwdWJsaWMgUmVzdEFwaSBpZk5vbmVNYXRjaChTdHJpbmcgZXRhZykgeworICAgIGlmTm9uZU1hdGNoID0gZXRhZzsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgdXJsKCkgeworICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyA8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IHZvaWQgZ2V0KEFzeW5jQ2FsbGJhY2s8VD4gY2IpIHsKKyAgICBzZW5kKEdFVCwgY2IpOworICB9CisKKyAgcHVibGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBkZWxldGUoQXN5bmNDYWxsYmFjazxUPiBjYikgeworICAgIHNlbmQoREVMRVRFLCBjYik7CisgIH0KKworICBwcml2YXRlIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBzZW5kKAorICAgICAgTWV0aG9kIG1ldGhvZCwgQXN5bmNDYWxsYmFjazxUPiBjYikgeworICAgIEh0dHBDYWxsYmFjazxUPiBodHRwQ2FsbGJhY2sgPSBuZXcgSHR0cENhbGxiYWNrPFQ+KGNiKTsKICAgICB0cnkgewogICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjU3RhcnQoKTsKLSAgICAgIHJlcS5zZW5kKCk7CisgICAgICByZXF1ZXN0KG1ldGhvZCkuc2VuZFJlcXVlc3QobnVsbCwgaHR0cENhbGxiYWNrKTsKICAgICB9IGNhdGNoIChSZXF1ZXN0RXhjZXB0aW9uIGUpIHsKLSAgICAgIFJwY1N0YXR1cy5JTlNUQU5DRS5vblJwY0NvbXBsZXRlKCk7Ci0gICAgICBjYi5vbkZhaWx1cmUoZSk7CisgICAgICBodHRwQ2FsbGJhY2sub25FcnJvcihudWxsLCBlKTsKICAgICB9CiAgIH0KIAotICBwcml2YXRlIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCByZXNlbmRQb3N0KAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxUPiBjYiwgU3RyaW5nIHRva2VuKSB7Ci0gICAgUmVxdWVzdEJ1aWxkZXIgcmVxID0gbmV3IFJlcXVlc3RCdWlsZGVyKFJlcXVlc3RCdWlsZGVyLlBPU1QsIHVybC50b1N0cmluZygpKTsKLSAgICByZXEuc2V0SGVhZGVyKCJBY2NlcHQiLCBKc29uQ29uc3RhbnRzLkpTT05fVFlQRSk7Ci0gICAgcmVxLnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgSnNvbkNvbnN0YW50cy5KU09OX1RZUEUpOwotICAgIHJlcS5zZXRSZXF1ZXN0RGF0YSh0b2tlbik7Ci0gICAgcmVxLnNldENhbGxiYWNrKG5ldyBNeVJlcXVlc3RDYWxsYmFjazxUPihmYWxzZSwgY2IpKTsKKyAgcHVibGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBwb3N0KAorICAgICAgSmF2YVNjcmlwdE9iamVjdCBjb250ZW50LAorICAgICAgQXN5bmNDYWxsYmFjazxUPiBjYikgeworICAgIHNlbmRKU09OKFBPU1QsIGNvbnRlbnQsIGNiKTsKKyAgfQorCisgIHB1YmxpYyA8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IHZvaWQgcHV0KEFzeW5jQ2FsbGJhY2s8VD4gY2IpIHsKKyAgICBzZW5kKFBVVCwgY2IpOworICB9CisKKyAgcHVibGljIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBwdXQoCisgICAgICBKYXZhU2NyaXB0T2JqZWN0IGNvbnRlbnQsCisgICAgICBBc3luY0NhbGxiYWNrPFQ+IGNiKSB7CisgICAgc2VuZEpTT04oUFVULCBjb250ZW50LCBjYik7CisgIH0KKworICBwcml2YXRlIDxUIGV4dGVuZHMgSmF2YVNjcmlwdE9iamVjdD4gdm9pZCBzZW5kSlNPTigKKyAgICAgIE1ldGhvZCBtZXRob2QsIEphdmFTY3JpcHRPYmplY3QgY29udGVudCwKKyAgICAgIEFzeW5jQ2FsbGJhY2s8VD4gY2IpIHsKKyAgICBIdHRwQ2FsbGJhY2s8VD4gaHR0cENhbGxiYWNrID0gbmV3IEh0dHBDYWxsYmFjazxUPihjYik7CiAgICAgdHJ5IHsKLSAgICAgIHJlcS5zZW5kKCk7CisgICAgICBScGNTdGF0dXMuSU5TVEFOQ0Uub25ScGNTdGFydCgpOworICAgICAgU3RyaW5nIGJvZHkgPSBuZXcgSlNPTk9iamVjdChjb250ZW50KS50b1N0cmluZygpOworICAgICAgUmVxdWVzdEJ1aWxkZXIgcmVxID0gcmVxdWVzdChtZXRob2QpOworICAgICAgcmVxLnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgSlNPTl9VVEY4KTsKKyAgICAgIHJlcS5zZW5kUmVxdWVzdChib2R5LCBodHRwQ2FsbGJhY2spOwogICAgIH0gY2F0Y2ggKFJlcXVlc3RFeGNlcHRpb24gZSkgewotICAgICAgUnBjU3RhdHVzLklOU1RBTkNFLm9uUnBjQ29tcGxldGUoKTsKLSAgICAgIGNiLm9uRmFpbHVyZShlKTsKKyAgICAgIGh0dHBDYWxsYmFjay5vbkVycm9yKG51bGwsIGUpOwogICAgIH0KICAgfQogCisgIHByaXZhdGUgUmVxdWVzdEJ1aWxkZXIgcmVxdWVzdChNZXRob2QgbWV0aG9kKSB7CisgICAgUmVxdWVzdEJ1aWxkZXIgcmVxID0gbmV3IFJlcXVlc3RCdWlsZGVyKG1ldGhvZCwgdXJsKCkpOworICAgIGlmIChpZk5vbmVNYXRjaCAhPSBudWxsKSB7CisgICAgICByZXEuc2V0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIiwgaWZOb25lTWF0Y2gpOworICAgIH0KKyAgICByZXEuc2V0SGVhZGVyKCJBY2NlcHQiLCBKU09OX1RZUEUpOworICAgIGlmIChHZXJyaXQuZ2V0WEdlcnJpdEF1dGgoKSAhPSBudWxsKSB7CisgICAgICByZXEuc2V0SGVhZGVyKCJYLUdlcnJpdC1BdXRoIiwgR2Vycml0LmdldFhHZXJyaXRBdXRoKCkpOworICAgIH0KKyAgICByZXR1cm4gcmVxOworICB9CisKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0pzb25Cb2R5KFJlc3BvbnNlIHJlcykgewotICAgIHJldHVybiBpc0NvbnRlbnRUeXBlKHJlcywgSnNvbkNvbnN0YW50cy5KU09OX1RZUEUpOworICAgIHJldHVybiBpc0NvbnRlbnRUeXBlKHJlcywgSlNPTl9UWVBFKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUZXh0Qm9keShSZXNwb25zZSByZXMpIHsKLSAgICByZXR1cm4gaXNDb250ZW50VHlwZShyZXMsICJ0ZXh0L3BsYWluIik7CisgICAgcmV0dXJuIGlzQ29udGVudFR5cGUocmVzLCBURVhUX1RZUEUpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbnRlbnRUeXBlKFJlc3BvbnNlIHJlcywgU3RyaW5nIHdhbnQpIHsKQEAgLTIxMiw0ICszNjAsMzUgQEAKICAgICB9CiAgICAgcmV0dXJuIHdhbnQuZXF1YWxzKHR5cGUpOwogICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSlNPTlZhbHVlIHBhcnNlSnNvbihSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGpzb24gPSB0cmltSnNvbk1hZ2ljKHJlcy5nZXRUZXh0KCkpOworICAgIGlmIChqc29uLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3cgbmV3IEpTT05FeGNlcHRpb24oInJlc3BvbnNlIHdhcyBlbXB0eSIpOworICAgIH0KKyAgICByZXR1cm4gSlNPTlBhcnNlci5wYXJzZVN0cmljdChqc29uKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0cmltSnNvbk1hZ2ljKFN0cmluZyBqc29uKSB7CisgICAgaWYgKGpzb24uc3RhcnRzV2l0aChKU09OX01BR0lDKSkgeworICAgICAganNvbiA9IGpzb24uc3Vic3RyaW5nKEpTT05fTUFHSUMubGVuZ3RoKCkpOworICAgIH0KKyAgICByZXR1cm4ganNvbjsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIEphdmFTY3JpcHRPYmplY3Q+IFQgY2FzdChKU09OVmFsdWUgdmFsKSB7CisgICAgaWYgKHZhbC5pc09iamVjdCgpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiAoVCkgdmFsLmlzT2JqZWN0KCkuZ2V0SmF2YVNjcmlwdE9iamVjdCgpOworICAgIH0gZWxzZSBpZiAodmFsLmlzQXJyYXkoKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gKFQpIHZhbC5pc0FycmF5KCkuZ2V0SmF2YVNjcmlwdE9iamVjdCgpOworICAgIH0gZWxzZSBpZiAodmFsLmlzU3RyaW5nKCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIChUKSBOYXRpdmVTdHJpbmcud3JhcCh2YWwuaXNTdHJpbmcoKS5zdHJpbmdWYWx1ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHZhbC5pc051bGwoKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEpTT05FeGNlcHRpb24oInVuc3VwcG9ydGVkIEpTT04gdHlwZSIpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9TY3JlZW5Mb2FkQ2FsbGJhY2suamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvU2NyZWVuTG9hZENhbGxiYWNrLmphdmEKaW5kZXggZWIxMzgzNC4uYjhiOTIwOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9TY3JlZW5Mb2FkQ2FsbGJhY2suamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1NjcmVlbkxvYWRDYWxsYmFjay5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5Ob3RGb3VuZFNjcmVlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuTm90U2lnbmVkSW5EaWFsb2c7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpLlNjcmVlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKIApAQCAtNDMsNyArNDQsMTEgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShmaW5hbCBUaHJvd2FibGUgY2F1Z2h0KSB7CiAgICAgaWYgKGlzTm9TdWNoRW50aXR5KGNhdWdodCkpIHsKLSAgICAgIEdlcnJpdC5kaXNwbGF5KHNjcmVlbi5nZXRUb2tlbigpLCBuZXcgTm90Rm91bmRTY3JlZW4oKSk7CisgICAgICBpZiAoR2Vycml0LmlzU2lnbmVkSW4oKSkgeworICAgICAgICBHZXJyaXQuZGlzcGxheShzY3JlZW4uZ2V0VG9rZW4oKSwgbmV3IE5vdEZvdW5kU2NyZWVuKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3IE5vdFNpZ25lZEluRGlhbG9nKCkuY2VudGVyKCk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIHN1cGVyLm9uRmFpbHVyZShjYXVnaHQpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvVHJhbnNmb3JtQ2FsbGJhY2suamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9ycGMvVHJhbnNmb3JtQ2FsbGJhY2suamF2YQppbmRleCAyY2QyMmNiLi45M2M4NmEyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvcnBjL1RyYW5zZm9ybUNhbGxiYWNrLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3JwYy9UcmFuc2Zvcm1DYWxsYmFjay5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnJwYzsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ycGMuQXN5bmNDYWxsYmFjazsKIAogLyoqIFRyYW5zZm9ybXMgYSB2YWx1ZSBhbmQgcGFzc2VzIGl0IG9uIHRvIGFub3RoZXIgY2FsbGJhY2suICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNmb3JtQ2FsbGJhY2s8SSwgTz4gaW1wbGVtZW50cyBBc3luY0NhbGxiYWNrPEk+ewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRHcm91cFN1Z2dlc3RPcmFjbGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BY2NvdW50R3JvdXBTdWdnZXN0T3JhY2xlLmphdmEKaW5kZXggNWRhMDBjZC4uMjc4ZTE1OSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRHcm91cFN1Z2dlc3RPcmFjbGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZS5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TdWdnZXN0T3JhY2xlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2FmZWh0bWwuY2xpZW50LkhpZ2hsaWdodFN1Z2dlc3RPcmFjbGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMjgsMTQgKzI3LDE0IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqIFN1Z2dlc3Rpb24gT3JhY2xlIGZvciBBY2NvdW50R3JvdXAgZW50aXRpZXMuICovCi1wdWJsaWMgY2xhc3MgQWNjb3VudEdyb3VwU3VnZ2VzdE9yYWNsZSBleHRlbmRzIEhpZ2hsaWdodFN1Z2dlc3RPcmFjbGUgeworcHVibGljIGNsYXNzIEFjY291bnRHcm91cFN1Z2dlc3RPcmFjbGUgZXh0ZW5kcyBTdWdnZXN0QWZ0ZXJUeXBpbmdOQ2hhcnNPcmFjbGUgewogICBwcml2YXRlIE1hcDxTdHJpbmcsIEFjY291bnRHcm91cC5VVUlEPiBwcmlvclJlc3VsdHMgPQogICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBBY2NvdW50R3JvdXAuVVVJRD4oKTsKIAogICBwcml2YXRlIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZTsKIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgb25SZXF1ZXN0U3VnZ2VzdGlvbnMoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgIHB1YmxpYyB2b2lkIF9vblJlcXVlc3RTdWdnZXN0aW9ucyhmaW5hbCBSZXF1ZXN0IHJlcSwgZmluYWwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKICAgICBScGNTdGF0dXMuaGlkZShuZXcgUnVubmFibGUoKSB7CiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIFN1Z2dlc3RVdGlsLlNWQy5zdWdnZXN0QWNjb3VudEdyb3VwRm9yUHJvamVjdCgKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BY2NvdW50TGluay5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRMaW5rLmphdmEKaW5kZXggNzkwMTAyYy4uZmQ1Mjc3NyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRMaW5rLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FjY291bnRMaW5rLmphdmEKQEAgLTE2LDMyICsxNiw1MSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkZvcm1hdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuVXNlcklkZW50aXR5OwogCiAvKiogTGluayB0byBhbnkgdXNlcidzIGFjY291bnQgZGFzaGJvYXJkLiAqLwogcHVibGljIGNsYXNzIEFjY291bnRMaW5rIGV4dGVuZHMgSW5saW5lSHlwZXJsaW5rIHsKICAgLyoqIENyZWF0ZSBhIGxpbmsgYWZ0ZXIgbG9jYXRpbmcgYWNjb3VudCBkZXRhaWxzIGZyb20gYW4gYWN0aXZlIGNhY2hlLiAqLwotICBwdWJsaWMgc3RhdGljIEFjY291bnRMaW5rIGxpbmsoZmluYWwgQWNjb3VudEluZm9DYWNoZSBjYWNoZSwKLSAgICAgIGZpbmFsIEFjY291bnQuSWQgaWQpIHsKLSAgICBmaW5hbCBBY2NvdW50SW5mbyBhaSA9IGNhY2hlLmdldChpZCk7CisgIHB1YmxpYyBzdGF0aWMgQWNjb3VudExpbmsgbGluayhBY2NvdW50SW5mb0NhY2hlIGNhY2hlLCBBY2NvdW50LklkIGlkKSB7CisgICAgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjb3VudEluZm8gYWkgPSBjYWNoZS5nZXQoaWQpOwogICAgIHJldHVybiBhaSAhPSBudWxsID8gbmV3IEFjY291bnRMaW5rKGFpKSA6IG51bGw7CiAgIH0KIAotICBwdWJsaWMgQWNjb3VudExpbmsoZmluYWwgQWNjb3VudEluZm8gYWkpIHsKLSAgICBzdXBlcihGb3JtYXRVdGlsLm5hbWUoYWkpLCBQYWdlTGlua3MudG9BY2NvdW50UXVlcnkob3duZXIoYWkpKSk7Ci0gICAgc2V0VGl0bGUoRm9ybWF0VXRpbC5uYW1lRW1haWwoYWkpKTsKKyAgcHVibGljIEFjY291bnRMaW5rKGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvIGFpKSB7CisgICAgdGhpcyhGb3JtYXRVdGlsLmFzSW5mbyhhaSkpOworICB9CisKKyAgcHVibGljIEFjY291bnRMaW5rKFVzZXJJZGVudGl0eSBpZGVudCkgeworICAgIHRoaXMoQWNjb3VudEluZm8uY3JlYXRlKAorICAgICAgICBpZGVudC5nZXRBY2NvdW50KCkuZ2V0KCksCisgICAgICAgIGlkZW50LmdldE5hbWUoKSwKKyAgICAgICAgaWRlbnQuZ2V0RW1haWwoKSkpOworICB9CisKKyAgcHVibGljIEFjY291bnRMaW5rKEFjY291bnRJbmZvIGluZm8pIHsKKyAgICB0aGlzKGluZm8sIENoYW5nZS5TdGF0dXMuTkVXKTsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50TGluayhBY2NvdW50SW5mbyBpbmZvLCBDaGFuZ2UuU3RhdHVzIHN0YXR1cykgeworICAgIHN1cGVyKEZvcm1hdFV0aWwubmFtZShpbmZvKSwgUGFnZUxpbmtzLnRvQWNjb3VudFF1ZXJ5KG93bmVyKGluZm8pLCBzdGF0dXMpKTsKKyAgICBzZXRUaXRsZShGb3JtYXRVdGlsLm5hbWVFbWFpbChpbmZvKSk7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3duZXIoQWNjb3VudEluZm8gYWkpIHsKLSAgICBpZiAoYWkuZ2V0UHJlZmVycmVkRW1haWwoKSAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gYWkuZ2V0UHJlZmVycmVkRW1haWwoKTsKLSAgICB9IGVsc2UgaWYgKGFpLmdldEZ1bGxOYW1lKCkgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGFpLmdldEZ1bGxOYW1lKCk7CisgICAgaWYgKGFpLmVtYWlsKCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGFpLmVtYWlsKCk7CisgICAgfSBlbHNlIGlmIChhaS5uYW1lKCkgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGFpLm5hbWUoKTsKKyAgICB9IGVsc2UgaWYgKGFpLl9hY2NvdW50X2lkKCkgIT0gMCkgeworICAgICAgcmV0dXJuICIiICsgYWkuX2FjY291bnRfaWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICIiOwogICAgIH0KLSAgICByZXR1cm4gIiIgKyBhaS5nZXRJZCgpLmdldCgpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWNjb3VudFN1Z2dlc3RPcmFjbGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BY2NvdW50U3VnZ2VzdE9yYWNsZS5qYXZhCmluZGV4IGJjZjY0MzguLjBiZjBlYTkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BY2NvdW50U3VnZ2VzdE9yYWNsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BY2NvdW50U3VnZ2VzdE9yYWNsZS5qYXZhCkBAIC0xOSwxNSArMTksMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlN1Z2dlc3RPcmFjbGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKiBTdWdnZXN0aW9uIE9yYWNsZSBmb3IgQWNjb3VudCBlbnRpdGllcy4gKi8KLXB1YmxpYyBjbGFzcyBBY2NvdW50U3VnZ2VzdE9yYWNsZSBleHRlbmRzIEhpZ2hsaWdodFN1Z2dlc3RPcmFjbGUgeworcHVibGljIGNsYXNzIEFjY291bnRTdWdnZXN0T3JhY2xlIGV4dGVuZHMgU3VnZ2VzdEFmdGVyVHlwaW5nTkNoYXJzT3JhY2xlIHsKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG9uUmVxdWVzdFN1Z2dlc3Rpb25zKGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBDYWxsYmFjayBjYWxsYmFjaykgeworICBwdWJsaWMgdm9pZCBfb25SZXF1ZXN0U3VnZ2VzdGlvbnMoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrKSB7CiAgICAgUnBjU3RhdHVzLmhpZGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICBTdWdnZXN0VXRpbC5TVkMuc3VnZ2VzdEFjY291bnQocmVxLmdldFF1ZXJ5KCksIEJvb2xlYW4uVFJVRSwKQEAgLTU0LDExICs1MywxMSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLSAgICAgIHJldHVybiBGb3JtYXRVdGlsLm5hbWVFbWFpbChpbmZvKTsKKyAgICAgIHJldHVybiBGb3JtYXRVdGlsLm5hbWVFbWFpbChGb3JtYXRVdGlsLmFzSW5mbyhpbmZvKSk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKLSAgICAgIHJldHVybiBGb3JtYXRVdGlsLm5hbWVFbWFpbChpbmZvKTsKKyAgICAgIHJldHVybiBGb3JtYXRVdGlsLm5hbWVFbWFpbChGb3JtYXRVdGlsLmFzSW5mbyhpbmZvKSk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWRkTWVtYmVyQm94LmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQWRkTWVtYmVyQm94LmphdmEKaW5kZXggNzJhMDExZi4uZDRhYWE0YyAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0FkZE1lbWJlckJveC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9BZGRNZW1iZXJCb3guamF2YQpAQCAtNzIsNiArNzIsNyBAQAogICAgIG5hbWVUeHQuYWRkU2VsZWN0aW9uSGFuZGxlcihuZXcgU2VsZWN0aW9uSGFuZGxlcjxTdWdnZXN0aW9uPigpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgb25TZWxlY3Rpb24oU2VsZWN0aW9uRXZlbnQ8U3VnZ2VzdGlvbj4gZXZlbnQpIHsKKyAgICAgICAgbmFtZVR4dEJveC5zZXRGb2N1cyh0cnVlKTsKICAgICAgICAgaWYgKHN1Ym1pdE9uU2VsZWN0aW9uKSB7CiAgICAgICAgICAgc3VibWl0T25TZWxlY3Rpb24gPSBmYWxzZTsKICAgICAgICAgICBkb0FkZCgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1hbmRNZW51SXRlbS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1hbmRNZW51SXRlbS5qYXZhCmluZGV4IGZkYjVjNTYuLjcyYmYwNmMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tYW5kTWVudUl0ZW0uamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWFuZE1lbnVJdGVtLmphdmEKQEAgLTE1LDEwICsxNSwxMCBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuR2Vycml0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmFyaWEuY2xpZW50LlJvbGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5Db21tYW5kOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQW5jaG9yOwogCiBwdWJsaWMgY2xhc3MgQ29tbWFuZE1lbnVJdGVtIGV4dGVuZHMgQW5jaG9yIGltcGxlbWVudHMgQ2xpY2tIYW5kbGVyIHsKQEAgLTI3LDcgKzI3LDcgQEAKICAgcHVibGljIENvbW1hbmRNZW51SXRlbShmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgQ29tbWFuZCBjbWQpIHsKICAgICBzdXBlcih0ZXh0KTsKICAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5tZW51SXRlbSgpKTsKLSAgICBBY2Nlc3NpYmlsaXR5LnNldFJvbGUoZ2V0RWxlbWVudCgpLCBBY2Nlc3NpYmlsaXR5LlJPTEVfTUVOVUlURU0pOworICAgIFJvbGVzLmdldE1lbnVpdGVtUm9sZSgpLnNldChnZXRFbGVtZW50KCkpOwogICAgIGFkZENsaWNrSGFuZGxlcih0aGlzKTsKICAgICBjb21tYW5kID0gY21kOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWVudFBhbmVsLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWVudFBhbmVsLmphdmEKaW5kZXggZGRkMmIyNy4uOGY4YzdlYSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1lbnRQYW5lbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tZW50UGFuZWwuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkZvcm1hdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuYWNjb3VudC5BY2NvdW50SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkJsdXJFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkJsdXJIYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tZW50ZWRBY3Rpb25EaWFsb2cuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Db21tZW50ZWRBY3Rpb25EaWFsb2cuamF2YQppbmRleCAyNmI2MWY1Li4yNjM3MDNlIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvQ29tbWVudGVkQWN0aW9uRGlhbG9nLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0NvbW1lbnRlZEFjdGlvbkRpYWxvZy5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkJ1dHRvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5GbG93UGFuZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRm9jdXNXaWRnZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuUG9wdXBQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuR2xvYmFsS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5OcFRleHRBcmVhOwpAQCAtMzgsNiArMzksNyBAQAogICBwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKICAgcHJvdGVjdGVkIGZpbmFsIEZsb3dQYW5lbCBidXR0b25QYW5lbDsKICAgcHJvdGVjdGVkIEFzeW5jQ2FsbGJhY2s8VD4gY2FsbGJhY2s7CisgIHByb3RlY3RlZCBGb2N1c1dpZGdldCBmb2N1c09uOwogCiAgIHByb3RlY3RlZCBib29sZWFuIHNlbnQgPSBmYWxzZTsKIApAQCAtNDUsNyArNDcsNiBAQAogICAgICAgQXN5bmNDYWxsYmFjazxUPiBjYWxsYmFjaykgewogICAgIHN1cGVyKC8qIGF1dG8gaGlkZSAqL2ZhbHNlLCAvKiBtb2RhbCAqL3RydWUpOwogICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKLQogICAgIHNldEdsYXNzRW5hYmxlZCh0cnVlKTsKICAgICBzZXRUZXh0KHRpdGxlKTsKIApAQCAtNTUsNyArNTYsNyBAQAogICAgIG1lc3NhZ2Uuc2V0Q2hhcmFjdGVyV2lkdGgoNjApOwogICAgIG1lc3NhZ2Uuc2V0VmlzaWJsZUxpbmVzKDEwKTsKICAgICBET00uc2V0RWxlbWVudFByb3BlcnR5Qm9vbGVhbihtZXNzYWdlLmdldEVsZW1lbnQoKSwgInNwZWxsY2hlY2siLCB0cnVlKTsKLQorICAgIHNldEZvY3VzT24obWVzc2FnZSk7CiAgICAgc2VuZEJ1dHRvbiA9IG5ldyBCdXR0b24oVXRpbC5DLmNvbW1lbnRlZEFjdGlvbkJ1dHRvblNlbmQoKSk7CiAgICAgc2VuZEJ1dHRvbi5hZGRDbGlja0hhbmRsZXIobmV3IENsaWNrSGFuZGxlcigpIHsKICAgICAgIEBPdmVycmlkZQpAQCAtOTEsNiArOTIsMTAgQEAKICAgICBhZGRDbG9zZUhhbmRsZXIodGhpcyk7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBzZXRGb2N1c09uKEZvY3VzV2lkZ2V0IGZvY3VzV2lkZ2V0KSB7CisgICAgZm9jdXNPbiA9IGZvY3VzV2lkZ2V0OworICB9CisKICAgcHVibGljIHZvaWQgZW5hYmxlQnV0dG9ucyhib29sZWFuIGVuYWJsZSkgewogICAgIHNlbmRCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwogICAgIGNhbmNlbEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZSk7CkBAIC0xMDAsNyArMTA1LDkgQEAKICAgcHVibGljIHZvaWQgY2VudGVyKCkgewogICAgIHN1cGVyLmNlbnRlcigpOwogICAgIEdsb2JhbEtleS5kaWFsb2codGhpcyk7Ci0gICAgbWVzc2FnZS5zZXRGb2N1cyh0cnVlKTsKKyAgICBpZiAoZm9jdXNPbiAhPSBudWxsKSB7CisgICAgICBmb2N1c09uLnNldEZvY3VzKHRydWUpOworICAgIH0KICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0ZpbHRlcmVkVXNlckludGVyZmFjZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0ZpbHRlcmVkVXNlckludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMjQ0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvRmlsdGVyZWRVc2VySW50ZXJmYWNlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKKworcHVibGljIGludGVyZmFjZSBGaWx0ZXJlZFVzZXJJbnRlcmZhY2UgeworICAvKioKKyAgICogUmV0dXJuIHRoZSB2YWx1ZSBieSB3aGljaCB0aGUgdXNlciBpbnRlcmZhY2UgaXMgY3VycmVudGx5IGZpbHRlcmVkLgorICAgKgorICAgKiBAcmV0dXJuIHZhbHVlIGJ5IHdoaWNoIHRoZSB1c2VyIGludGVyZmFjZSBpcyBjdXJyZW50bHkgZmlsdGVyZWQsCisgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkgU3RyaW5nIGlmIGN1cnJlbnRseSBubyBmaWx0ZXIgaXMgYXBwbGllZAorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50RmlsdGVyKCk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvSGlnaGxpZ2h0aW5nSW5saW5lSHlwZXJsaW5rLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvSGlnaGxpZ2h0aW5nSW5saW5lSHlwZXJsaW5rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4MjVhMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9IaWdobGlnaHRpbmdJbmxpbmVIeXBlcmxpbmsuamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOworCisKK3B1YmxpYyBjbGFzcyBIaWdobGlnaHRpbmdJbmxpbmVIeXBlcmxpbmsgZXh0ZW5kcyBJbmxpbmVIeXBlcmxpbmsgeworCisgIHByaXZhdGUgU3RyaW5nIHRvSGlnaGxpZ2h0OworCisgIHB1YmxpYyBIaWdobGlnaHRpbmdJbmxpbmVIeXBlcmxpbmsoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyB0b2tlbiwKKyAgICAgIGZpbmFsIFN0cmluZyB0b0hpZ2hsaWdodCkgeworICAgIHN1cGVyKHRleHQsIHRva2VuKTsKKyAgICB0aGlzLnRvSGlnaGxpZ2h0ID0gdG9IaWdobGlnaHQ7CisgICAgaGlnaGxpZ2h0KHRleHQsIHRvSGlnaGxpZ2h0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgc3VwZXIuc2V0VGV4dCh0ZXh0KTsKKyAgICBoaWdobGlnaHQodGV4dCwgdG9IaWdobGlnaHQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGhpZ2hsaWdodChmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CisgICAgc2V0SFRNTChVdGlsLmhpZ2hsaWdodCh0ZXh0LCB0b0hpZ2hsaWdodCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvSGlnaGxpZ2h0aW5nUHJvamVjdHNUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0hpZ2hsaWdodGluZ1Byb2plY3RzVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzYwMzYwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0hpZ2hsaWdodGluZ1Byb2plY3RzVGFibGUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnByb2plY3RzLlByb2plY3RJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0TWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLklubGluZUhUTUw7CisKK3B1YmxpYyBjbGFzcyBIaWdobGlnaHRpbmdQcm9qZWN0c1RhYmxlIGV4dGVuZHMgUHJvamVjdHNUYWJsZSB7CisgIHByaXZhdGUgU3RyaW5nIHRvSGlnaGxpZ2h0OworCisgIHB1YmxpYyB2b2lkIGRpc3BsYXkoZmluYWwgUHJvamVjdE1hcCBwcm9qZWN0cywgZmluYWwgU3RyaW5nIHRvSGlnaGxpZ2h0KSB7CisgICAgdGhpcy50b0hpZ2hsaWdodCA9IHRvSGlnaGxpZ2h0OworICAgIHN1cGVyLmRpc3BsYXkocHJvamVjdHMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlKGZpbmFsIGludCByb3csIGZpbmFsIFByb2plY3RJbmZvIGspIHsKKyAgICB0YWJsZS5zZXRXaWRnZXQocm93LCAxLAorICAgICAgICBuZXcgSW5saW5lSFRNTChVdGlsLmhpZ2hsaWdodChrLm5hbWUoKSwgdG9IaWdobGlnaHQpKSk7CisgICAgdGFibGUuc2V0VGV4dChyb3csIDIsIGsuZGVzY3JpcHRpb24oKSk7CisKKyAgICBzZXRSb3dJdGVtKHJvdywgayk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9JZ25vcmVPdXRkYXRlZEZpbHRlclJlc3VsdHNDYWxsYmFja1dyYXBwZXIuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9JZ25vcmVPdXRkYXRlZEZpbHRlclJlc3VsdHNDYWxsYmFja1dyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWNhZGNjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0lnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOworCisvKioKKyAqIEdlcnJpdENhbGxiYWNrIHRvIGJlIHVzZWQgb24gdXNlciBpbnRlcmZhY2VzIHRoYXQgYWxsb3cgZmlsdGVyaW5nIHRvIGhhbmRsZQorICogUlBDJ3MgdGhhdCByZXF1ZXN0IGZpbHRlcmluZy4gVGhlIHVzZXIgbWF5IGNoYW5nZSB0aGUgZmlsdGVyIHF1aWNrbHkgc28gdGhhdAorICogYSByZXNwb25zZSBtYXkgYmUgb3V0ZGF0ZWQgd2hlbiB0aGUgY2xpZW50IHJlY2VpdmVzIGl0LiBJbiB0aGlzIGNhc2UgdGhlCisgKiByZXNwb25zZSBtdXN0IGJlIGlnbm9yZWQgYmVjYXVzZSB0aGUgcmVzcG9uc2VzIHRvIFJDUCdzIG1heSBjb21lIG91dC1vZi1vcmRlcgorICogYW5kIGFuIG91dGRhdGVkIHJlc3BvbnNlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgY29ycmVjdCByZXN1bHQgd2hpY2ggd2FzCisgKiByZWNlaXZlZCBiZWZvcmUuCisgKi8KK3B1YmxpYyBjbGFzcyBJZ25vcmVPdXRkYXRlZEZpbHRlclJlc3VsdHNDYWxsYmFja1dyYXBwZXI8VD4gZXh0ZW5kcyBHZXJyaXRDYWxsYmFjazxUPiB7CisgIHByaXZhdGUgZmluYWwgRmlsdGVyZWRVc2VySW50ZXJmYWNlIGZpbHRlcmVkVUk7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG15RmlsdGVyOworICBwcml2YXRlIGZpbmFsIEdlcnJpdENhbGxiYWNrPFQ+IGNiOworCisgIHB1YmxpYyBJZ25vcmVPdXRkYXRlZEZpbHRlclJlc3VsdHNDYWxsYmFja1dyYXBwZXIoCisgICAgICBmaW5hbCBGaWx0ZXJlZFVzZXJJbnRlcmZhY2UgZmlsdGVyZWRVSSwgZmluYWwgR2Vycml0Q2FsbGJhY2s8VD4gY2IpIHsKKyAgICB0aGlzLmZpbHRlcmVkVUkgPSBmaWx0ZXJlZFVJOworICAgIHRoaXMubXlGaWx0ZXIgPSBmaWx0ZXJlZFVJLmdldEN1cnJlbnRGaWx0ZXIoKTsKKyAgICB0aGlzLmNiID0gY2I7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIFQgcmVzdWx0KSB7CisgICAgaWYgKChteUZpbHRlciA9PSBudWxsICYmIGZpbHRlcmVkVUkuZ2V0Q3VycmVudEZpbHRlcigpID09IG51bGwpCisgICAgICAgIHx8IChteUZpbHRlciAhPSBudWxsICYmIG15RmlsdGVyLmVxdWFscyhmaWx0ZXJlZFVJLmdldEN1cnJlbnRGaWx0ZXIoKSkpKSB7CisgICAgICBjYi5vblN1Y2Nlc3MocmVzdWx0KTsKKyAgICB9CisgICAgLy8gRWxzZSBpZ25vcmUgdGhlIHJlc3VsdCwgdGhlIHVzZXIgaGFzIGFscmVhZHkgY2hhbmdlZCB0aGUgZmlsdGVyCisgICAgLy8gYW5kIHRoZSByZXN1bHQgaXMgbm90IHJlbGV2YW50IGFueW1vcmUuIElmIG11bHRpcGxlIFJQQydzIGFyZQorICAgIC8vIGZpcmVkIHRoZSByZXN1bHRzIG1heSBjb21lIGJhY2sgb3V0LW9mLW9yZGVyIGFuZCBhIG5vbi1yZWxldmFudAorICAgIC8vIHJlc3VsdCBjb3VsZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgcmVzdWx0IGlmIG5vdCBpZ25vcmVkLgorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTGlua01lbnVCYXIuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaW5rTWVudUJhci5qYXZhCmluZGV4IDAzNTMyODEuLmZlN2ZmZTkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaW5rTWVudUJhci5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaW5rTWVudUJhci5qYXZhCkBAIC0xNSwyMCArMTUsMjEgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5hcmlhLmNsaWVudC5Sb2xlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5Db21tYW5kOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkFjY2Vzc2liaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQ29tcG9zaXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5XaWRnZXQ7CiAKLXB1YmxpYyBjbGFzcyBMaW5rTWVudUJhciBleHRlbmRzIENvbXBvc2l0ZSB7CitwdWJsaWMgY2xhc3MgTGlua01lbnVCYXIgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTY3JlZW5Mb2FkSGFuZGxlciB7CiAgIHByaXZhdGUgZmluYWwgRmxvd1BhbmVsIGJvZHk7CiAKICAgcHVibGljIExpbmtNZW51QmFyKCkgewogICAgIGJvZHkgPSBuZXcgRmxvd1BhbmVsKCk7CiAgICAgaW5pdFdpZGdldChib2R5KTsKICAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5saW5rTWVudUJhcigpKTsKLSAgICBBY2Nlc3NpYmlsaXR5LnNldFJvbGUoZ2V0RWxlbWVudCgpLCBBY2Nlc3NpYmlsaXR5LlJPTEVfTUVOVUJBUik7CisgICAgUm9sZXMuZ2V0TWVudWJhclJvbGUoKS5zZXQoZ2V0RWxlbWVudCgpKTsKKyAgICBHZXJyaXQuRVZFTlRfQlVTLmFkZEhhbmRsZXIoU2NyZWVuTG9hZEV2ZW50LlRZUEUsIHRoaXMpOwogICB9CiAKICAgcHVibGljIHZvaWQgYWRkSXRlbShmaW5hbCBTdHJpbmcgdGV4dCwgZmluYWwgQ29tbWFuZCBpbXApIHsKQEAgLTY2LDQgKzY3LDcgQEAKICAgICB9CiAgICAgYm9keS5hZGQoaSk7CiAgIH0KKworICBwdWJsaWMgdm9pZCBvblNjcmVlbkxvYWQoU2NyZWVuTG9hZEV2ZW50IGV2ZW50KSB7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaW5rTWVudUl0ZW0uamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaW5rTWVudUl0ZW0uamF2YQppbmRleCBmMDc2YTJjLi4yMDU2OWMzIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTGlua01lbnVJdGVtLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpbmtNZW51SXRlbS5qYXZhCkBAIC0xNSwxNCArMTUsMTUgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5hcmlhLmNsaWVudC5Sb2xlczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5kb20uY2xpZW50LkFuY2hvckVsZW1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQWNjZXNzaWJpbGl0eTsKIAotcHVibGljIGNsYXNzIExpbmtNZW51SXRlbSBleHRlbmRzIElubGluZUh5cGVybGluayB7CitwdWJsaWMgY2xhc3MgTGlua01lbnVJdGVtIGV4dGVuZHMgSW5saW5lSHlwZXJsaW5rIGltcGxlbWVudHMgU2NyZWVuTG9hZEhhbmRsZXIgewogICBwdWJsaWMgTGlua01lbnVJdGVtKGZpbmFsIFN0cmluZyB0ZXh0LCBmaW5hbCBTdHJpbmcgdGFyZ2V0SGlzdG9yeVRva2VuKSB7CiAgICAgc3VwZXIodGV4dCwgdGFyZ2V0SGlzdG9yeVRva2VuKTsKICAgICBzZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5tZW51SXRlbSgpKTsKLSAgICBBY2Nlc3NpYmlsaXR5LnNldFJvbGUoZ2V0RWxlbWVudCgpLCBBY2Nlc3NpYmlsaXR5LlJPTEVfTUVOVUlURU0pOworICAgIFJvbGVzLmdldE1lbnVpdGVtUm9sZSgpLnNldChnZXRFbGVtZW50KCkpOworICAgIEdlcnJpdC5FVkVOVF9CVVMuYWRkSGFuZGxlcihTY3JlZW5Mb2FkRXZlbnQuVFlQRSwgdGhpcyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTMwLDQgKzMxLDEyIEBACiAgICAgc3VwZXIuZ28oKTsKICAgICBBbmNob3JFbGVtZW50LmFzKGdldEVsZW1lbnQoKSkuYmx1cigpOwogICB9CisKKyAgcHVibGljIHZvaWQgb25TY3JlZW5Mb2FkKFNjcmVlbkxvYWRFdmVudCBldmVudCkgeworICAgIGlmIChldmVudC5nZXRTY3JlZW4oKS5nZXRUb2tlbigpLmVxdWFscyhnZXRUYXJnZXRIaXN0b3J5VG9rZW4oKSkpeworICAgICAgYWRkU3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuYWN0aXZlUm93KCkpOworICAgIH0gZWxzZSB7CisgICAgICByZW1vdmVTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5hY3RpdmVSb3coKSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTGlzdGVuYWJsZU9sZFZhbHVlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTGlzdGVuYWJsZU9sZFZhbHVlLmphdmEKaW5kZXggNWMzZTEyNy4uNDdiY2EyYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpc3RlbmFibGVPbGRWYWx1ZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaXN0ZW5hYmxlT2xkVmFsdWUuamF2YQpAQCAtMjMsOCArMjMsMTEgQEAKICAgfQogCiAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBUIHZhbHVlKSB7Ci0gICAgb2xkVmFsdWUgPSBnZXQoKTsKLSAgICBzdXBlci5zZXQodmFsdWUpOwotICAgIG9sZFZhbHVlID0gbnVsbDsgLy8gYWxsb3cgaXQgdG8gYmUgZ2NlZCBiZWZvcmUgdGhlIG5leHQgZXZlbnQKKyAgICB0cnkgeworICAgICAgb2xkVmFsdWUgPSBnZXQoKTsKKyAgICAgIHN1cGVyLnNldCh2YWx1ZSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG9sZFZhbHVlID0gbnVsbDsgLy8gYWxsb3cgaXQgdG8gYmUgZ2NlZCBiZWZvcmUgdGhlIG5leHQgZXZlbnQKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaXN0ZW5hYmxlVmFsdWUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9MaXN0ZW5hYmxlVmFsdWUuamF2YQppbmRleCA2ZGFkODc1Li5kODM0ZWIyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTGlzdGVuYWJsZVZhbHVlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL0xpc3RlbmFibGVWYWx1ZS5qYXZhCkBAIC00NSw0ICs0NSwxMyBAQAogICAgICAgVmFsdWVDaGFuZ2VIYW5kbGVyPFQ+IGhhbmRsZXIpIHsKICAgICByZXR1cm4gbWFuYWdlci5hZGRIYW5kbGVyKFZhbHVlQ2hhbmdlRXZlbnQuZ2V0VHlwZSgpLCBoYW5kbGVyKTsKICAgfQorCisgIHB1YmxpYyBpbnQgZ2V0SGFuZGxlckNvdW50KCkgeworICAgIHJldHVybiBtYW5hZ2VyLmdldEhhbmRsZXJDb3VudChWYWx1ZUNoYW5nZUV2ZW50LmdldFR5cGUoKSk7CisgIH0KKworICBwdWJsaWMgVmFsdWVDaGFuZ2VIYW5kbGVyPD8+IGdldEhhbmRsZXIoaW50IGluZGV4KSB7CisgICAgcmV0dXJuIG1hbmFnZXIuZ2V0SGFuZGxlcihWYWx1ZUNoYW5nZUV2ZW50LmdldFR5cGUoKSwgaW5kZXgpOworICB9CisKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9OYXZpZ2F0aW9uVGFibGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9OYXZpZ2F0aW9uVGFibGUuamF2YQppbmRleCA4ZDc0YmMzLi42M2MyNjM2IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvTmF2aWdhdGlvblRhYmxlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL05hdmlnYXRpb25UYWJsZS5qYXZhCkBAIC0xNiwxMCArMTYsMTIgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QuZG9tLmNsaWVudC5Eb2N1bWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5UHJlc3NFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuSGFuZGxlclJlZ2lzdHJhdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5IVE1MVGFibGUuQ2VsbEZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TY3JvbGxQYW5lbDsKQEAgLTM0LDYgKzM2LDQxIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIE5hdmlnYXRpb25UYWJsZTxSb3dJdGVtPiBleHRlbmRzIEZhbmN5RmxleFRhYmxlPFJvd0l0ZW0+IHsKKyAgcHJvdGVjdGVkIGNsYXNzIE15RmxleFRhYmxlIGV4dGVuZHMgRmFuY3lGbGV4VGFibGUuTXlGbGV4VGFibGUgeworICAgIHB1YmxpYyBNeUZsZXhUYWJsZSgpIHsKKyAgICAgIHNpbmtFdmVudHMoRXZlbnQuT05EQkxDTElDSyB8IEV2ZW50Lk9OQ0xJQ0spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQnJvd3NlckV2ZW50KGZpbmFsIEV2ZW50IGV2ZW50KSB7CisgICAgICBzd2l0Y2ggKERPTS5ldmVudEdldFR5cGUoZXZlbnQpKSB7CisgICAgICAgIGNhc2UgRXZlbnQuT05DTElDSzogeworICAgICAgICAgIC8vIEZpbmQgb3V0IHdoaWNoIGNlbGwgd2FzIGFjdHVhbGx5IGNsaWNrZWQuCisgICAgICAgICAgZmluYWwgRWxlbWVudCB0ZCA9IGdldEV2ZW50VGFyZ2V0Q2VsbChldmVudCk7CisgICAgICAgICAgaWYgKHRkID09IG51bGwpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbCBpbnQgcm93ID0gcm93T2YodGQpOworICAgICAgICAgIGlmIChnZXRSb3dJdGVtKHJvdykgIT0gbnVsbCkgeworICAgICAgICAgICAgb25DZWxsU2luZ2xlQ2xpY2socm93T2YodGQpLCBjb2x1bW5PZih0ZCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEV2ZW50Lk9OREJMQ0xJQ0s6IHsKKyAgICAgICAgICAvLyBGaW5kIG91dCB3aGljaCBjZWxsIHdhcyBhY3R1YWxseSBjbGlja2VkLgorICAgICAgICAgIEVsZW1lbnQgdGQgPSBnZXRFdmVudFRhcmdldENlbGwoZXZlbnQpOworICAgICAgICAgIGlmICh0ZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIG9uQ2VsbERvdWJsZUNsaWNrKHJvd09mKHRkKSwgY29sdW1uT2YodGQpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN1cGVyLm9uQnJvd3NlckV2ZW50KGV2ZW50KTsKKyAgICB9CisgIH0KKwogICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlua2VkSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gc2F2ZWRQb3NpdGlvbnMgPQogICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KDEwLCAwLjc1ZiwgdHJ1ZSkgewpAQCAtNTQsNiArOTEsMTUgQEAKICAgcHJpdmF0ZSBib29sZWFuIGNvbXB1dGVkU2Nyb2xsVHlwZTsKICAgcHJpdmF0ZSBTY3JvbGxQYW5lbCBwYXJlbnRTY3JvbGxQYW5lbDsKIAorICBwcm90ZWN0ZWQgTmF2aWdhdGlvblRhYmxlKFN0cmluZyBpdGVtSGVscE5hbWUpIHsKKyAgICB0aGlzKCk7CisgICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBQcmV2S2V5Q29tbWFuZCgwLCAnaycsIFV0aWwuTS5oZWxwTGlzdFByZXYoaXRlbUhlbHBOYW1lKSkpOworICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgTmV4dEtleUNvbW1hbmQoMCwgJ2onLCBVdGlsLk0uaGVscExpc3ROZXh0KGl0ZW1IZWxwTmFtZSkpKTsKKyAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsICdvJywgVXRpbC5NLmhlbHBMaXN0T3BlbihpdGVtSGVscE5hbWUpKSk7CisgICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBPcGVuS2V5Q29tbWFuZCgwLCBLZXlDb2Rlcy5LRVlfRU5URVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuTS5oZWxwTGlzdE9wZW4oaXRlbUhlbHBOYW1lKSkpOworICB9CisKICAgcHJvdGVjdGVkIE5hdmlnYXRpb25UYWJsZSgpIHsKICAgICBwb2ludGVyID0gbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMuYXJyb3dSaWdodCgpKTsKICAgICBrZXlzTmF2aWdhdGlvbiA9IG5ldyBLZXlDb21tYW5kU2V0KEdlcnJpdC5DLnNlY3Rpb25OYXZpZ2F0aW9uKCkpOwpAQCAtOTEsNiArMTM3LDE2IEBACiAgICAgfQogICB9CiAKKyAgLyoqIEludm9rZWQgd2hlbiB0aGUgdXNlciBkb3VibGUgY2xpY2tzIG9uIGEgdGFibGUgY2VsbC4gKi8KKyAgcHJvdGVjdGVkIHZvaWQgb25DZWxsRG91YmxlQ2xpY2soaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIG9uT3BlblJvdyhyb3cpOworICB9CisKKyAgLyoqIEludm9rZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gYSB0YWJsZSBjZWxsLiAqLworICBwcm90ZWN0ZWQgdm9pZCBvbkNlbGxTaW5nbGVDbGljayhpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgbW92ZVBvaW50ZXJUbyhyb3cpOworICB9CisKICAgcHJvdGVjdGVkIGludCBnZXRDdXJyZW50Um93KCkgewogICAgIHJldHVybiBjdXJyZW50Um93OwogICB9CkBAIC0yNTksNiArMzE1LDExIEBACiAgICAgc3VwZXIub25VbmxvYWQoKTsKICAgfQogCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgTXlGbGV4VGFibGUgY3JlYXRlRmxleFRhYmxlKCkgeworICAgIHJldHVybiBuZXcgTXlGbGV4VGFibGUoKTsKKyAgfQorCiAgIHB1YmxpYyBjbGFzcyBQcmV2S2V5Q29tbWFuZCBleHRlbmRzIEtleUNvbW1hbmQgewogICAgIHB1YmxpYyBQcmV2S2V5Q29tbWFuZChpbnQgbWFzaywgY2hhciBrZXksIFN0cmluZyBoZWxwKSB7CiAgICAgICBzdXBlcihtYXNrLCBrZXksIGhlbHApOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL09uRWRpdEVuYWJsZXIuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9PbkVkaXRFbmFibGVyLmphdmEKaW5kZXggYjU3NGRiMS4uYTdkNDlhNCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL09uRWRpdEVuYWJsZXIuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvT25FZGl0RW5hYmxlci5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRm9jdXNXaWRnZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGlzdEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5UZXh0Qm94QmFzZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5WYWx1ZUJveEJhc2U7CiAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMTM5LDYgKzE0MCwxNyBAQAogICAgIGlmICh3aWRnZXQuaXNFbmFibGVkKCkgfHwKICAgICAgICAgISAoZS5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEZvY3VzV2lkZ2V0KSB8fAogICAgICAgICAhICgoRm9jdXNXaWRnZXQpIGUuZ2V0U291cmNlKCkpLmlzRW5hYmxlZCgpICkgeworICAgICAgaWYgKGUuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBWYWx1ZUJveEJhc2UpIHsKKyAgICAgICAgZmluYWwgVGV4dEJveEJhc2UgYm94ID0gKChUZXh0Qm94QmFzZSkgZS5nZXRTb3VyY2UoKSk7CisgICAgICAgIFNjaGVkdWxlci5nZXQoKS5zY2hlZHVsZURlZmVycmVkKG5ldyBTY2hlZHVsZWRDb21tYW5kKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgICAgICBpZiAoYm94LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgd2lkZ2V0LnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICB9CiAgICAgICByZXR1cm47CiAgICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdExpc3RQb3B1cC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3RMaXN0UG9wdXAuamF2YQppbmRleCAyMTdjYTVhLi5jYWM3NjY3IDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdExpc3RQb3B1cC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0TGlzdFBvcHVwLmphdmEKQEAgLTE0LDM2ICsxNCw0NiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFjY291bnQuVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucHJvamVjdHMuUHJvamVjdE1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLkdlcnJpdENhbGxiYWNrOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuQ2xpY2tFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleUNvZGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LmRvbS5jbGllbnQuS2V5VXBFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVVwSGFuZGxlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5XaW5kb3c7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkZsb3dQYW5lbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Ib3Jpem9udGFsUGFuZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuTGFiZWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuUG9wdXBQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5TY3JvbGxQYW5lbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmdsb2JhbGtleS5jbGllbnQuR2xvYmFsS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuZ2xvYmFsa2V5LmNsaWVudC5IaWRlUG9wdXBQYW5lbENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5nbG9iYWxrZXkuY2xpZW50Lk5wVGV4dEJveDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnVzZXIuY2xpZW50LlBsdWdpblNhZmVEaWFsb2dCb3g7CiAKIC8qKiBJdCBjcmVhdGVzIGEgcG9wdXAgY29udGFpbmluZyBhbGwgdGhlIHByb2plY3RzLiAqLwotcHVibGljIGNsYXNzIFByb2plY3RMaXN0UG9wdXAgewotICBwcml2YXRlIFByb2plY3RzVGFibGUgcHJvamVjdHNUYWI7CitwdWJsaWMgY2xhc3MgUHJvamVjdExpc3RQb3B1cCBpbXBsZW1lbnRzIEZpbHRlcmVkVXNlckludGVyZmFjZSB7CisgIHByaXZhdGUgSGlnaGxpZ2h0aW5nUHJvamVjdHNUYWJsZSBwcm9qZWN0c1RhYjsKICAgcHJpdmF0ZSBQbHVnaW5TYWZlRGlhbG9nQm94IHBvcHVwOworICBwcml2YXRlIE5wVGV4dEJveCBmaWx0ZXJUeHQ7CisgIHByaXZhdGUgSG9yaXpvbnRhbFBhbmVsIGZpbHRlclBhbmVsOworICBwcml2YXRlIFN0cmluZyBzdWJuYW1lOwogICBwcml2YXRlIEJ1dHRvbiBjbG9zZTsKICAgcHJpdmF0ZSBTY3JvbGxQYW5lbCBzcDsKICAgcHJpdmF0ZSBQb3B1cFBhbmVsLlBvc2l0aW9uQ2FsbGJhY2sgcG9wdXBQb3NpdGlvbjsKICAgcHJpdmF0ZSBpbnQgcHJlZmVycmVkVG9wOwogICBwcml2YXRlIGludCBwcmVmZXJyZWRMZWZ0OwotICBwcml2YXRlIGJvb2xlYW4gcG9waW5nVXA7CisgIHByaXZhdGUgYm9vbGVhbiBwb3BwaW5nVXA7CiAgIHByaXZhdGUgYm9vbGVhbiBmaXJzdFBvcHVwTG9hZCA9IHRydWU7CiAKICAgcHVibGljIHZvaWQgaW5pdFBvcHVwKGZpbmFsIFN0cmluZyBwb3B1cFRleHQsIGZpbmFsIFN0cmluZyBjdXJyZW50UGFnZUxpbmspIHsKICAgICBjcmVhdGVXaWRnZXRzKHBvcHVwVGV4dCwgY3VycmVudFBhZ2VMaW5rKTsKICAgICBmaW5hbCBGbG93UGFuZWwgcGZwID0gbmV3IEZsb3dQYW5lbCgpOworICAgIHBmcC5hZGQoZmlsdGVyUGFuZWwpOwogICAgIHNwID0gbmV3IFNjcm9sbFBhbmVsKHByb2plY3RzVGFiKTsKICAgICBzcC5zZXRTaXplKCIxMDAlIiwgIjEwMCUiKTsKICAgICBwZnAuYWRkKHNwKTsKQEAgLTg0LDEzICs5NCwzMCBAQAogICBwcm90ZWN0ZWQgdm9pZCBvcGVuUm93KFN0cmluZyBwcm9qZWN0TmFtZSkgewogICB9CiAKLSAgcHVibGljIGJvb2xlYW4gaXNQb3BpbmdVcCgpIHsKLSAgICByZXR1cm4gcG9waW5nVXA7CisgIHB1YmxpYyBib29sZWFuIGlzUG9wcGluZ1VwKCkgeworICAgIHJldHVybiBwb3BwaW5nVXA7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgY3JlYXRlV2lkZ2V0cyhmaW5hbCBTdHJpbmcgcG9wdXBUZXh0LAogICAgICAgZmluYWwgU3RyaW5nIGN1cnJlbnRQYWdlTGluaykgewotICAgIHByb2plY3RzVGFiID0gbmV3IFByb2plY3RzVGFibGUoKSB7CisgICAgZmlsdGVyUGFuZWwgPSBuZXcgSG9yaXpvbnRhbFBhbmVsKCk7CisgICAgZmlsdGVyUGFuZWwuc2V0U3R5bGVOYW1lKEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkucHJvamVjdEZpbHRlclBhbmVsKCkpOworICAgIGZpbmFsIExhYmVsIGZpbHRlckxhYmVsID0KKyAgICAgICAgbmV3IExhYmVsKGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5hZG1pbi5VdGlsLkMucHJvamVjdEZpbHRlcigpKTsKKyAgICBmaWx0ZXJMYWJlbC5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5wcm9qZWN0RmlsdGVyTGFiZWwoKSk7CisgICAgZmlsdGVyUGFuZWwuYWRkKGZpbHRlckxhYmVsKTsKKyAgICBmaWx0ZXJUeHQgPSBuZXcgTnBUZXh0Qm94KCk7CisgICAgZmlsdGVyVHh0LnNldFZhbHVlKHN1Ym5hbWUpOworICAgIGZpbHRlclR4dC5hZGRLZXlVcEhhbmRsZXIobmV3IEtleVVwSGFuZGxlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgb25LZXlVcChLZXlVcEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHN1Ym5hbWUgPSBmaWx0ZXJUeHQuZ2V0VmFsdWUoKTsKKyAgICAgICAgcG9wdWxhdGVQcm9qZWN0cygpOworICAgICAgfQorICAgIH0pOworICAgIGZpbHRlclBhbmVsLmFkZChmaWx0ZXJUeHQpOworCisgICAgcHJvamVjdHNUYWIgPSBuZXcgSGlnaGxpZ2h0aW5nUHJvamVjdHNUYWJsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgbW92ZVBvaW50ZXJUbyhmaW5hbCBpbnQgcm93LCBmaW5hbCBib29sZWFuIHNjcm9sbCkgewogICAgICAgICBzdXBlci5tb3ZlUG9pbnRlclRvKHJvdywgc2Nyb2xsKTsKQEAgLTExOSw3ICsxNDYsNyBAQAogICB9CiAKICAgcHVibGljIHZvaWQgZGlzcGxheVBvcHVwKCkgewotICAgIHBvcGluZ1VwID0gdHJ1ZTsKKyAgICBwb3BwaW5nVXAgPSB0cnVlOwogICAgIGlmIChmaXJzdFBvcHVwTG9hZCkgeyAvLyBGb3Igc2l6aW5nL3Bvc2l0aW9uaW5nLCBkZWxheSBkaXNwbGF5IHVudGlsIGxvYWRlZAogICAgICAgcG9wdWxhdGVQcm9qZWN0cygpOwogICAgIH0gZWxzZSB7CkBAIC0xMzIsNyArMTU5LDggQEAKICAgICAgIH0KICAgICAgIHByb2plY3RzVGFiLnNldFJlZ2lzdGVyS2V5cyh0cnVlKTsKICAgICAgIHByb2plY3RzVGFiLmZpbmlzaERpc3BsYXkoKTsKLSAgICAgIHBvcGluZ1VwID0gZmFsc2U7CisgICAgICBmaWx0ZXJUeHQuc2V0Rm9jdXModHJ1ZSk7CisgICAgICBwb3BwaW5nVXAgPSBmYWxzZTsKICAgICB9CiAgIH0KIApAQCAtMTQ2LDE1ICsxNzQsMjIgQEAKICAgfQogCiAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHJvamVjdHMoKSB7Ci0gICAgUHJvamVjdE1hcC5hbGwobmV3IEdlcnJpdENhbGxiYWNrPFByb2plY3RNYXA+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBvblN1Y2Nlc3MoZmluYWwgUHJvamVjdE1hcCByZXN1bHQpIHsKLSAgICAgICAgcHJvamVjdHNUYWIuZGlzcGxheShyZXN1bHQpOwotICAgICAgICBpZiAoZmlyc3RQb3B1cExvYWQpIHsgLy8gRGlzcGxheSB3YXMgZGVsYXllZCB1bnRpbCB0YWJsZSB3YXMgbG9hZGVkCi0gICAgICAgICAgZmlyc3RQb3B1cExvYWQgPSBmYWxzZTsKLSAgICAgICAgICBkaXNwbGF5UG9wdXAoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0pOworICAgIFByb2plY3RNYXAubWF0Y2goc3VibmFtZSwKKyAgICAgICAgbmV3IElnbm9yZU91dGRhdGVkRmlsdGVyUmVzdWx0c0NhbGxiYWNrV3JhcHBlcjxQcm9qZWN0TWFwPih0aGlzLAorICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFByb2plY3RNYXA+KCkgeworICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKGZpbmFsIFByb2plY3RNYXAgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcHJvamVjdHNUYWIuZGlzcGxheShyZXN1bHQsIHN1Ym5hbWUpOworICAgICAgICAgICAgICAgIGlmIChmaXJzdFBvcHVwTG9hZCkgeyAvLyBEaXNwbGF5IHdhcyBkZWxheWVkIHVudGlsIHRhYmxlIHdhcyBsb2FkZWQKKyAgICAgICAgICAgICAgICAgIGZpcnN0UG9wdXBMb2FkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICBkaXNwbGF5UG9wdXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRGaWx0ZXIoKSB7CisgICAgcmV0dXJuIHN1Ym5hbWU7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0TmFtZVN1Z2dlc3RPcmFjbGUuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0TmFtZVN1Z2dlc3RPcmFjbGUuamF2YQppbmRleCAyNWVkMjU4Li44MDM2NGNmIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdE5hbWVTdWdnZXN0T3JhY2xlLmphdmEKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3ROYW1lU3VnZ2VzdE9yYWNsZS5qYXZhCkBAIC0xNywxMiArMTcsMTIgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQuUnBjU3RhdHVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5wcm9qZWN0cy5Qcm9qZWN0TWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5ycGMuR2Vycml0Q2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiAKIC8qKiBTdWdnZXN0aW9uIE9yYWNsZSBmb3IgUHJvamVjdC5OYW1lS2V5IGVudGl0aWVzLiAqLwotcHVibGljIGNsYXNzIFByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZSBleHRlbmRzIEhpZ2hsaWdodFN1Z2dlc3RPcmFjbGUgeworcHVibGljIGNsYXNzIFByb2plY3ROYW1lU3VnZ2VzdE9yYWNsZSBleHRlbmRzIFN1Z2dlc3RBZnRlclR5cGluZ05DaGFyc09yYWNsZSB7CiAgIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBvblJlcXVlc3RTdWdnZXN0aW9ucyhmaW5hbCBSZXF1ZXN0IHJlcSwgZmluYWwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgcHVibGljIHZvaWQgX29uUmVxdWVzdFN1Z2dlc3Rpb25zKGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBDYWxsYmFjayBjYWxsYmFjaykgewogICAgIFJwY1N0YXR1cy5oaWRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgcnVuKCkgewpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICAgICAgbmV3IEdlcnJpdENhbGxiYWNrPFByb2plY3RNYXA+KCkgewogICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFByb2plY3RNYXAgbWFwKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25TdWdnZXN0aW9uc1JlYWR5KHJlcSwgbmV3IFJlc3BvbnNlKG1hcC52YWx1ZXMoKS5hc0xpc3QoKSkpOworICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uU3VnZ2VzdGlvbnNSZWFkeShyZXEsIG5ldyBSZXNwb25zZShOYXRpdmVzLmFzTGlzdChtYXAudmFsdWVzKCkpKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3RTZWFyY2hMaW5rLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdFNlYXJjaExpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWUyOWJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3RTZWFyY2hMaW5rLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5HZXJyaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LmFkbWluLlV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuSW1hZ2U7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0U2VhcmNoTGluayBleHRlbmRzIElubGluZUh5cGVybGluayB7CisKKyAgcHVibGljIFByb2plY3RTZWFyY2hMaW5rKFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSkgeworICAgIHN1cGVyKCIgIiwgUGFnZUxpbmtzLnRvUHJvamVjdERhc2hib2FyZChwcm9qZWN0TmFtZSwgImRlZmF1bHQiKSk7CisgICAgc2V0VGl0bGUoVXRpbC5DLnByb2plY3RMaXN0UXVlcnlMaW5rKCkpOworICAgIGZpbmFsIEltYWdlIGltYWdlID0gbmV3IEltYWdlKEdlcnJpdC5SRVNPVVJDRVMucXVlcnlJY29uKCkpOworICAgIERPTS5pbnNlcnRCZWZvcmUoZ2V0RWxlbWVudCgpLCBpbWFnZS5nZXRFbGVtZW50KCksCisgICAgICAgIERPTS5nZXRGaXJzdENoaWxkKGdldEVsZW1lbnQoKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdHNUYWJsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Byb2plY3RzVGFibGUuamF2YQppbmRleCAwY2JlMTk0Li5hM2E1MDUyIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUHJvamVjdHNUYWJsZS5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9Qcm9qZWN0c1RhYmxlLmphdmEKQEAgLTE3LDEwICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucHJvamVjdHMuUHJvamVjdEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnByb2plY3RzLlByb2plY3RNYXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlDb2RlczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5ET007Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQuRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC5FdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQucnBjLk5hdGl2ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuRmxleFRhYmxlLkZsZXhDZWxsRm9ybWF0dGVyOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMzAsMTEgKzI3LDcgQEAKIHB1YmxpYyBjbGFzcyBQcm9qZWN0c1RhYmxlIGV4dGVuZHMgTmF2aWdhdGlvblRhYmxlPFByb2plY3RJbmZvPiB7CiAKICAgcHVibGljIFByb2plY3RzVGFibGUoKSB7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBQcmV2S2V5Q29tbWFuZCgwLCAnaycsIFV0aWwuQy5wcm9qZWN0TGlzdFByZXYoKSkpOwotICAgIGtleXNOYXZpZ2F0aW9uLmFkZChuZXcgTmV4dEtleUNvbW1hbmQoMCwgJ2onLCBVdGlsLkMucHJvamVjdExpc3ROZXh0KCkpKTsKLSAgICBrZXlzTmF2aWdhdGlvbi5hZGQobmV3IE9wZW5LZXlDb21tYW5kKDAsICdvJywgVXRpbC5DLnByb2plY3RMaXN0T3BlbigpKSk7Ci0gICAga2V5c05hdmlnYXRpb24uYWRkKG5ldyBPcGVuS2V5Q29tbWFuZCgwLCBLZXlDb2Rlcy5LRVlfRU5URVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuQy5wcm9qZWN0TGlzdE9wZW4oKSkpOworICAgIHN1cGVyKFV0aWwuQy5wcm9qZWN0SXRlbUhlbHAoKSk7CiAgICAgaW5pdENvbHVtbkhlYWRlcnMoKTsKICAgfQogCkBAIC00OCw0MyArNDEsNiBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBNeUZsZXhUYWJsZSBjcmVhdGVGbGV4VGFibGUoKSB7Ci0gICAgTXlGbGV4VGFibGUgdGFibGUgPSBuZXcgTXlGbGV4VGFibGUoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG9uQnJvd3NlckV2ZW50KGZpbmFsIEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIHN3aXRjaCAoRE9NLmV2ZW50R2V0VHlwZShldmVudCkpIHsKLSAgICAgICAgICBjYXNlIEV2ZW50Lk9OQ0xJQ0s6IHsKLSAgICAgICAgICAgIC8vIEZpbmQgb3V0IHdoaWNoIGNlbGwgd2FzIGFjdHVhbGx5IGNsaWNrZWQuCi0gICAgICAgICAgICBmaW5hbCBFbGVtZW50IHRkID0gZ2V0RXZlbnRUYXJnZXRDZWxsKGV2ZW50KTsKLSAgICAgICAgICAgIGlmICh0ZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgaW50IHJvdyA9IHJvd09mKHRkKTsKLSAgICAgICAgICAgIGlmIChnZXRSb3dJdGVtKHJvdykgIT0gbnVsbCkgewotICAgICAgICAgICAgICBQcm9qZWN0c1RhYmxlLnRoaXMubW92ZVBvaW50ZXJUbyhyb3cpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBFdmVudC5PTkRCTENMSUNLOiB7Ci0gICAgICAgICAgICAvLyBGaW5kIG91dCB3aGljaCBjZWxsIHdhcyBhY3R1YWxseSBjbGlja2VkLgotICAgICAgICAgICAgRWxlbWVudCB0ZCA9IGdldEV2ZW50VGFyZ2V0Q2VsbChldmVudCk7Ci0gICAgICAgICAgICBpZiAodGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbk9wZW5Sb3cocm93T2YodGQpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIub25Ccm93c2VyRXZlbnQoZXZlbnQpOwotICAgICAgfQotICAgIH07Ci0KLSAgICB0YWJsZS5zaW5rRXZlbnRzKEV2ZW50Lk9OREJMQ0xJQ0sgfCBFdmVudC5PTkNMSUNLKTsKLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIE9iamVjdCBnZXRSb3dJdGVtS2V5KGZpbmFsIFByb2plY3RJbmZvIGl0ZW0pIHsKICAgICByZXR1cm4gaXRlbS5uYW1lKCk7CiAgIH0KQEAgLTEwMCw3ICs1Niw3IEBACiAgICAgd2hpbGUgKDEgPCB0YWJsZS5nZXRSb3dDb3VudCgpKQogICAgICAgdGFibGUucmVtb3ZlUm93KHRhYmxlLmdldFJvd0NvdW50KCkgLSAxKTsKIAotICAgIExpc3Q8UHJvamVjdEluZm8+IGxpc3QgPSBwcm9qZWN0cy52YWx1ZXMoKS5hc0xpc3QoKTsKKyAgICBMaXN0PFByb2plY3RJbmZvPiBsaXN0ID0gTmF0aXZlcy5hc0xpc3QocHJvamVjdHMudmFsdWVzKCkpOwogICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3I8UHJvamVjdEluZm8+KCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUHJvamVjdEluZm8gYSwgUHJvamVjdEluZm8gYikgewpAQCAtMTIwLDcgKzc2LDYgQEAKIAogICAgIGZpbmFsIEZsZXhDZWxsRm9ybWF0dGVyIGZtdCA9IHRhYmxlLmdldEZsZXhDZWxsRm9ybWF0dGVyKCk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7Ci0gICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDEsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuY1BST0pFQ1QoKSk7CiAgICAgZm10LmFkZFN0eWxlTmFtZShyb3csIDIsIEdlcnJpdC5SRVNPVVJDRVMuY3NzKCkuZGF0YUNlbGwoKSk7CiAKICAgICBwb3B1bGF0ZShyb3csIGspOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Jldmlld2VyU3VnZ2VzdE9yYWNsZS5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1Jldmlld2VyU3VnZ2VzdE9yYWNsZS5qYXZhCmluZGV4IDc0N2VmNDAuLjNmMWRlMmIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9SZXZpZXdlclN1Z2dlc3RPcmFjbGUuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvUmV2aWV3ZXJTdWdnZXN0T3JhY2xlLmphdmEKQEAgLTIyLDE4ICsyMiwxNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VySW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLlN1Z2dlc3RPcmFjbGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zYWZlaHRtbC5jbGllbnQuSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZTsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKiBTdWdnZXN0aW9uIE9yYWNsZSBmb3IgcmV2aWV3ZXJzLiAqLwotcHVibGljIGNsYXNzIFJldmlld2VyU3VnZ2VzdE9yYWNsZSBleHRlbmRzIEhpZ2hsaWdodFN1Z2dlc3RPcmFjbGUgeworcHVibGljIGNsYXNzIFJldmlld2VyU3VnZ2VzdE9yYWNsZSBleHRlbmRzIFN1Z2dlc3RBZnRlclR5cGluZ05DaGFyc09yYWNsZSB7CiAKICAgcHJpdmF0ZSBDaGFuZ2UuSWQgY2hhbmdlSWQ7CiAKICAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIG9uUmVxdWVzdFN1Z2dlc3Rpb25zKGZpbmFsIFJlcXVlc3QgcmVxLCBmaW5hbCBDYWxsYmFjayBjYWxsYmFjaykgeworICBwcm90ZWN0ZWQgdm9pZCBfb25SZXF1ZXN0U3VnZ2VzdGlvbnMoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIENhbGxiYWNrIGNhbGxiYWNrKSB7CiAgICAgUnBjU3RhdHVzLmhpZGUobmV3IFJ1bm5hYmxlKCkgewogICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICBTdWdnZXN0VXRpbC5TVkMuc3VnZ2VzdENoYW5nZVJldmlld2VyKGNoYW5nZUlkLCByZXEuZ2V0UXVlcnkoKSwKQEAgLTY2LDcgKzY1LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7CiAgICAgICBmaW5hbCBBY2NvdW50SW5mbyBhY2NvdW50SW5mbyA9IHJldmlld2VySW5mby5nZXRBY2NvdW50SW5mbygpOwogICAgICAgaWYgKGFjY291bnRJbmZvICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKGFjY291bnRJbmZvKTsKKyAgICAgICAgcmV0dXJuIEZvcm1hdFV0aWwubmFtZUVtYWlsKEZvcm1hdFV0aWwuYXNJbmZvKGFjY291bnRJbmZvKSk7CiAgICAgICB9CiAgICAgICByZXR1cm4gcmV2aWV3ZXJJbmZvLmdldEdyb3VwKCkuZ2V0TmFtZSgpICsgIiAoIgogICAgICAgICAgICsgVXRpbC5DLnN1Z2dlc3RlZEdyb3VwTGFiZWwoKSArICIpIjsKQEAgLTc1LDcgKzc0LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VtZW50U3RyaW5nKCkgewogICAgICAgZmluYWwgQWNjb3VudEluZm8gYWNjb3VudEluZm8gPSByZXZpZXdlckluZm8uZ2V0QWNjb3VudEluZm8oKTsKICAgICAgIGlmIChhY2NvdW50SW5mbyAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBGb3JtYXRVdGlsLm5hbWVFbWFpbChhY2NvdW50SW5mbyk7CisgICAgICAgIHJldHVybiBGb3JtYXRVdGlsLm5hbWVFbWFpbChGb3JtYXRVdGlsLmFzSW5mbyhhY2NvdW50SW5mbykpOwogICAgICAgfQogICAgICAgcmV0dXJuIHJldmlld2VySW5mby5nZXRHcm91cCgpLmdldE5hbWUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuLmphdmEKaW5kZXggODQ1YTA0Ni4uZTdjMmQ4NCAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbi5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TY3JlZW4uamF2YQpAQCAtMzksNiArMzksNyBAQAogICBwcml2YXRlIFN0cmluZyB0b2tlbjsKICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVzU2lnbkluOwogICBwcml2YXRlIFN0cmluZyB3aW5kb3dUaXRsZTsKKyAgcHJpdmF0ZSBXaWRnZXQgdGl0bGVXaWRnZXQ7CiAKICAgcHJvdGVjdGVkIFNjcmVlbigpIHsKICAgICBpbml0V2lkZ2V0KG5ldyBGbG93UGFuZWwoKSk7CkBAIC02NSw4ICs2NiwxMiBAQAogICAgIG1lLmFkZChoZWFkZXIgPSBuZXcgR3JpZCgxLCBDb2xzLnZhbHVlcygpLmxlbmd0aCkpOwogICAgIG1lLmFkZChib2R5ID0gbmV3IEZsb3dQYW5lbCgpKTsKIAorICAgIGhlYWRlclRleHQgPSBuZXcgSW5saW5lTGFiZWwoKTsKKyAgICBpZiAodGl0bGVXaWRnZXQgPT0gbnVsbCkgeworICAgICAgdGl0bGVXaWRnZXQgPSBoZWFkZXJUZXh0OworICAgIH0KICAgICBGbG93UGFuZWwgdGl0bGUgPSBuZXcgRmxvd1BhbmVsKCk7Ci0gICAgdGl0bGUuYWRkKGhlYWRlclRleHQgPSBuZXcgSW5saW5lTGFiZWwoKSk7CisgICAgdGl0bGUuYWRkKHRpdGxlV2lkZ2V0KTsKICAgICB0aXRsZS5zZXRTdHlsZU5hbWUoR2Vycml0LlJFU09VUkNFUy5jc3MoKS5zY3JlZW5IZWFkZXIoKSk7CiAgICAgaGVhZGVyLnNldFdpZGdldCgwLCBDb2xzLlRpdGxlLm9yZGluYWwoKSwgdGl0bGUpOwogCkBAIC05OSw2ICsxMDQsMTAgQEAKICAgICBoZWFkZXIuc2V0VmlzaWJsZSh2YWx1ZSk7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBzZXRUaXRsZShmaW5hbCBXaWRnZXQgdykgeworICAgIHRpdGxlV2lkZ2V0ID0gdzsKKyAgfQorCiAgIHByb3RlY3RlZCB2b2lkIHNldFRpdGxlRWFzdChmaW5hbCBXaWRnZXQgdykgewogICAgIGhlYWRlci5zZXRXaWRnZXQoMCwgQ29scy5FYXN0Lm9yZGluYWwoKSwgdyk7CiAgIH0KQEAgLTE1NSw2ICsxNjQsOCBAQAogICAgICAgR2Vycml0LnNldFdpbmRvd1RpdGxlKHRoaXMsIHdpbmRvd1RpdGxlKTsKICAgICB9CiAgICAgR2Vycml0LnVwZGF0ZU1lbnVzKHRoaXMpOworICAgIEdlcnJpdC5FVkVOVF9CVVMuZmlyZUV2ZW50KG5ldyBTY3JlZW5Mb2FkRXZlbnQodGhpcykpOworICAgIEdlcnJpdC5zZXRRdWVyeVN0cmluZyhudWxsKTsKICAgICByZWdpc3RlcktleXMoKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbkxvYWRFdmVudC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbkxvYWRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MmU1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU2NyZWVuTG9hZEV2ZW50LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmV2ZW50LnNoYXJlZC5Hd3RFdmVudDsKKworcHVibGljIGNsYXNzIFNjcmVlbkxvYWRFdmVudCBleHRlbmRzIEd3dEV2ZW50PFNjcmVlbkxvYWRIYW5kbGVyPiB7CisgIHByaXZhdGUgZmluYWwgU2NyZWVuIHNjcmVlbjsKKworICBwdWJsaWMgU2NyZWVuTG9hZEV2ZW50KFNjcmVlbiBzY3JlZW4pIHsKKyAgICBzdXBlcigpOworICAgIHRoaXMuc2NyZWVuID0gc2NyZWVuOworICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlPFNjcmVlbkxvYWRIYW5kbGVyPiBUWVBFID0gbmV3IFR5cGU8U2NyZWVuTG9hZEhhbmRsZXI+KCk7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGRpc3BhdGNoKFNjcmVlbkxvYWRIYW5kbGVyIGhhbmRsZXIpIHsKKyAgICBoYW5kbGVyLm9uU2NyZWVuTG9hZCh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR3d0RXZlbnQuVHlwZTxTY3JlZW5Mb2FkSGFuZGxlcj4gZ2V0QXNzb2NpYXRlZFR5cGUoKSB7CisgICAgcmV0dXJuIFRZUEU7CisgIH0KKworICBwdWJsaWMgU2NyZWVuIGdldFNjcmVlbigpeworICAgIHJldHVybiBzY3JlZW47CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TY3JlZW5Mb2FkSGFuZGxlci5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1NjcmVlbkxvYWRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxYmVjZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TY3JlZW5Mb2FkSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuRXZlbnRIYW5kbGVyOworCitwdWJsaWMgaW50ZXJmYWNlIFNjcmVlbkxvYWRIYW5kbGVyIGV4dGVuZHMgRXZlbnRIYW5kbGVyIHsKKyAgcHVibGljIHZvaWQgb25TY3JlZW5Mb2FkKFNjcmVlbkxvYWRFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU3VnZ2VzdEFmdGVyVHlwaW5nTkNoYXJzT3JhY2xlLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvU3VnZ2VzdEFmdGVyVHlwaW5nTkNoYXJzT3JhY2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1NGJhNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9TdWdnZXN0QWZ0ZXJUeXBpbmdOQ2hhcnNPcmFjbGUuamF2YQpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LnVpOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LkdlcnJpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5IaWdobGlnaHRTdWdnZXN0T3JhY2xlOworCisvKioKKyAqIFN1Z2dlc3Qgb3JhY2xlIHRoYXQgb25seSBwcm92aWRlcyBzdWdnZXN0aW9ucyBpZiB0aGUgdXNlciBoYXMgdHlwZWQgYXQgbGVhc3QKKyAqIGFzIG1hbnkgY2hhcmFjdGVycyBhcyBjb25maWd1cmVkIGJ5ICdzdWdnZXN0LmZyb20nLiBJZiAnc3VnZ2VzdC5mcm9tJyBpcyBzZXQKKyAqIHRvIDAsIHN1Z2dlc3Rpb25zIHdpbGwgYWx3YXlzIGJlIHByb3ZpZGVkLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3VnZ2VzdEFmdGVyVHlwaW5nTkNoYXJzT3JhY2xlIGV4dGVuZHMgSGlnaGxpZ2h0U3VnZ2VzdE9yYWNsZSB7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIG9uUmVxdWVzdFN1Z2dlc3Rpb25zKGZpbmFsIFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgQ2FsbGJhY2sgZG9uZSkgeworICAgIGZpbmFsIGludCBzdWdnZXN0RnJvbSA9IEdlcnJpdC5nZXRDb25maWcoKS5nZXRTdWdnZXN0RnJvbSgpOworICAgIGlmIChzdWdnZXN0RnJvbSA9PSAwIHx8IHJlcXVlc3QuZ2V0UXVlcnkoKS5sZW5ndGgoKSA+PSBzdWdnZXN0RnJvbSkgeworICAgICAgX29uUmVxdWVzdFN1Z2dlc3Rpb25zKHJlcXVlc3QsIGRvbmUpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIF9vblJlcXVlc3RTdWdnZXN0aW9ucyhSZXF1ZXN0IHJlcXVlc3QsIENhbGxiYWNrIGRvbmUpOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1RleHRCb3hDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1RleHRCb3hDaGFuZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOGVhMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVGV4dEJveENoYW5nZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LlNjaGVkdWxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5TY2hlZHVsZXIuU2NoZWR1bGVkQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkZvY3VzRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5Gb2N1c0hhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlEb3duRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlEb3duSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LktleVByZXNzRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5LZXlQcmVzc0hhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5Nb3VzZVVwRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5Nb3VzZVVwSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5zaGFyZWQuR3d0RXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuVGV4dEJveEJhc2U7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXh0Qm94Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBLZXlQcmVzc0hhbmRsZXIsIEtleURvd25IYW5kbGVyLCBNb3VzZVVwSGFuZGxlciB7CisKKyAgcHJpdmF0ZSBTdHJpbmcgb2xkVGV4dDsKKworICBwdWJsaWMgVGV4dEJveENoYW5nZUxpc3RlbmVyKGZpbmFsIFRleHRCb3hCYXNlIHRiKSB7CisgICAgb2xkVGV4dCA9IHRiLmdldFRleHQoKTsKKworICAgIHRiLmFkZEtleVByZXNzSGFuZGxlcih0aGlzKTsKKworICAgIC8vIElzIHRoZXJlIGFub3RoZXIgd2F5IHRvIGNhcHR1cmUgbWlkZGxlIGJ1dHRvbiBYMTEgcGFzdGVzIGluIGJyb3dzZXJzCisgICAgLy8gd2hpY2ggZG8gbm90IHlldCBzdXBwb3J0IE9OUEFTVEUgZXZlbnRzIChGaXJlZm94KT8KKyAgICB0Yi5hZGRNb3VzZVVwSGFuZGxlcih0aGlzKTsKKworICAgIC8vIFJlc2V0dGluZyB0aGUgIm9yaWdpbmFsIHRleHQiIG9uIGZvY3VzIGVuc3VyZXMgdGhhdCB3ZSBhcmUKKyAgICAvLyB1cCB0byBkYXRlIHdpdGggbm9uLXVzZXIgdXBkYXRlcyBvZiB0aGUgdGV4dCAoY2FsbHMgdG8KKyAgICAvLyBzZXRUZXh0KCkuLi4pIGFuZCBhbHNvIHVwIHRvIGRhdGUgd2l0aCB1c2VyIGNoYW5nZXMgd2hpY2gKKyAgICAvLyBvY2N1cnJlZCBhZnRlciBlbmFibGluZyAid2lkZ2V0Ii4KKyAgICB0Yi5hZGRGb2N1c0hhbmRsZXIobmV3IEZvY3VzSGFuZGxlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRm9jdXMoRm9jdXNFdmVudCBldmVudCkgeworICAgICAgICAgIG9sZFRleHQgPSB0Yi5nZXRUZXh0KCk7CisgICAgICAgIH0KKyAgICAgIH0pOworCisgICAgLy8gQ1RSTC1WIFBhc3RlcyBpbiBDaHJvbWUgc2VlbSBvbmx5IGRldGVjdGFibGUgdmlhIEJyb3dzZXJFdmVudHMgb3IKKyAgICAvLyBLZXlEb3duRXZlbnRzLCB0aGUgbGF0dGVyIGlzIGJldHRlci4KKyAgICB0Yi5hZGRLZXlEb3duSGFuZGxlcih0aGlzKTsKKyAgfQorCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uS2V5UHJlc3MoZmluYWwgS2V5UHJlc3NFdmVudCBlKSB7CisgICAgb24oZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25LZXlEb3duKGZpbmFsIEtleURvd25FdmVudCBlKSB7CisgICAgb24oZSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgb25Nb3VzZVVwKGZpbmFsIE1vdXNlVXBFdmVudCBlKSB7CisgICAgb24oZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgb24oZmluYWwgR3d0RXZlbnQ8Pz4gZSkgeworICAgIGZpbmFsIFRleHRCb3hCYXNlIHRiID0gKFRleHRCb3hCYXNlKSBlLmdldFNvdXJjZSgpOworCisgICAgaWYgKCF0Yi5nZXRUZXh0KCkuZXF1YWxzKG9sZFRleHQpKSB7CisgICAgICBvblRleHRDaGFuZ2VkKHRiLmdldFRleHQoKSk7CisgICAgICBvbGRUZXh0ID0gdGIuZ2V0VGV4dCgpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGUgdGV4dCBhcHBlYXJzIHRvIG5vdCBhbHdheXMgZ2V0IHVwZGF0ZWQgdW50aWwgdGhlIGhhbmRsZXJzIGNvbXBsZXRlLgorICAgICAgU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlRGVmZXJyZWQobmV3IFNjaGVkdWxlZENvbW1hbmQoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICAgIGlmICghdGIuZ2V0VGV4dCgpLmVxdWFscyhvbGRUZXh0KSkgeworICAgICAgICAgICAgb25UZXh0Q2hhbmdlZCh0Yi5nZXRUZXh0KCkpOworICAgICAgICAgICAgb2xkVGV4dCA9IHRiLmdldFRleHQoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0pOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIG9uVGV4dENoYW5nZWQoU3RyaW5nIG5ld1RleHQpOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJQ29uc3RhbnRzLmphdmEgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlDb25zdGFudHMuamF2YQppbmRleCBlYmJiMDQ5Li4xOTE5Y2QzIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlDb25zdGFudHMuamF2YQorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlDb25zdGFudHMuamF2YQpAQCAtMjIsNyArMjIsNSBAQAogCiAgIFN0cmluZyBwcm9qZWN0TmFtZSgpOwogICBTdHJpbmcgcHJvamVjdERlc2NyaXB0aW9uKCk7Ci0gIFN0cmluZyBwcm9qZWN0TGlzdE9wZW4oKTsKLSAgU3RyaW5nIHByb2plY3RMaXN0UHJldigpOwotICBTdHJpbmcgcHJvamVjdExpc3ROZXh0KCk7CisgIFN0cmluZyBwcm9qZWN0SXRlbUhlbHAoKTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSUNvbnN0YW50cy5wcm9wZXJ0aWVzIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJQ29uc3RhbnRzLnByb3BlcnRpZXMKaW5kZXggYWEwMGNlZS4uOGE3MjM1NSAxMDA2NDQKLS0tIGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJQ29uc3RhbnRzLnByb3BlcnRpZXMKKysrIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJQ29uc3RhbnRzLnByb3BlcnRpZXMKQEAgLTMsNiArMyw0IEBACiAKIHByb2plY3ROYW1lID0gUHJvamVjdCBOYW1lCiBwcm9qZWN0RGVzY3JpcHRpb24gPSBQcm9qZWN0IERlc2NyaXB0aW9uCi1wcm9qZWN0TGlzdE9wZW4gPSBTZWxlY3QgcHJvamVjdAotcHJvamVjdExpc3RQcmV2ID0gUHJldmlvdXMgcHJvamVjdAotcHJvamVjdExpc3ROZXh0ID0gTmV4dCBwcm9qZWN0Citwcm9qZWN0SXRlbUhlbHAgPSBwcm9qZWN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJTWVzc2FnZXMuamF2YSBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSU1lc3NhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiODQ2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVUlNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jbGllbnQudWk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5pMThuLmNsaWVudC5NZXNzYWdlczsKKworcHVibGljIGludGVyZmFjZSBVSU1lc3NhZ2VzIGV4dGVuZHMgTWVzc2FnZXMgeworICBTdHJpbmcgaGVscExpc3RPcGVuKFN0cmluZyBpdGVtKTsKKyAgU3RyaW5nIGhlbHBMaXN0UHJldihTdHJpbmcgaXRlbSk7CisgIFN0cmluZyBoZWxwTGlzdE5leHQoU3RyaW5nIGl0ZW0pOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1VJTWVzc2FnZXMucHJvcGVydGllcyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSU1lc3NhZ2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzOTI0NQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VSU1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzIEBACitoZWxwTGlzdE9wZW4gPSBTZWxlY3QgezB9CitoZWxwTGlzdFByZXYgPSBQcmV2aW91cyB7MH0KK2hlbHBMaXN0TmV4dCA9IE5leHQgezB9CmRpZmYgLS1naXQgYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVXRpbC5qYXZhIGIvZ2Vycml0LWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L3VpL1V0aWwuamF2YQppbmRleCA5OGYxM2VmLi44MDRlZWUxIDEwMDY0NAotLS0gYS9nZXJyaXQtZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jbGllbnQvdWkvVXRpbC5qYXZhCisrKyBiL2dlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC91aS9VdGlsLmphdmEKQEAgLTE1LDcgKzE1LDM1IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC51aTsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuY2xpZW50LkdXVDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNhZmVodG1sLmNsaWVudC5TYWZlSHRtbEJ1aWxkZXI7CiAKIHB1YmxpYyBjbGFzcyBVdGlsIHsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBVSUNvbnN0YW50cyBDID0gR1dULmNyZWF0ZShVSUNvbnN0YW50cy5jbGFzcyk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVUlNZXNzYWdlcyBNID0gR1dULmNyZWF0ZShVSU1lc3NhZ2VzLmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBoaWdobGlnaHQoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyB0b0hpZ2hsaWdodCkgeworICAgIGZpbmFsIFNhZmVIdG1sQnVpbGRlciBiID0gbmV3IFNhZmVIdG1sQnVpbGRlcigpOworICAgIGlmICh0b0hpZ2hsaWdodCA9PSBudWxsIHx8ICIiLmVxdWFscyh0b0hpZ2hsaWdodCkpIHsKKyAgICAgIGIuYXBwZW5kKHRleHQpOworICAgICAgcmV0dXJuIGIudG9TYWZlSHRtbCgpLmFzU3RyaW5nKCk7CisgICAgfQorCisgICAgaW50IHBvcyA9IDA7CisgICAgaW50IGVuZFBvcyA9IDA7CisgICAgd2hpbGUgKChwb3MgPSB0ZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZigKKyAgICAgICAgdG9IaWdobGlnaHQudG9Mb3dlckNhc2UoKSwgcG9zKSkgPiAtMSkgeworICAgICAgaWYgKHBvcyA+IGVuZFBvcykgeworICAgICAgICBiLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhlbmRQb3MsIHBvcykpOworICAgICAgfQorICAgICAgZW5kUG9zID0gcG9zICsgdG9IaWdobGlnaHQubGVuZ3RoKCk7CisgICAgICBiLm9wZW5FbGVtZW50KCJiIik7CisgICAgICBiLmFwcGVuZCh0ZXh0LnN1YnN0cmluZyhwb3MsIGVuZFBvcykpOworICAgICAgYi5jbG9zZUVsZW1lbnQoImIiKTsKKyAgICAgIHBvcyA9IGVuZFBvczsKKyAgICB9CisgICAgaWYgKGVuZFBvcyA8IHRleHQubGVuZ3RoKCkpIHsKKyAgICAgIGIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKGVuZFBvcykpOworICAgIH0KKyAgICByZXR1cm4gYi50b1NhZmVIdG1sKCkuYXNTdHJpbmcoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3BvbS54bWwgYi9nZXJyaXQtaHR0cGQvcG9tLnhtbAppbmRleCBjZWFjYjY2Li42ZTI2NTY5IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvcG9tLnhtbAorKysgYi9nZXJyaXQtaHR0cGQvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LWh0dHBkPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvQ2FjaGVCYXNlZFdlYlNlc3Npb24uamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0NhY2hlQmFzZWRXZWJTZXNzaW9uLmphdmEKaW5kZXggY2EzZDI4Ny4uOTY3OTJmMCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvQ2FjaGVCYXNlZFdlYlNlc3Npb24uamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9DYWNoZUJhc2VkV2ViU2Vzc2lvbi5qYXZhCkBAIC0yNSw3ICsyNSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFub255bW91c1VzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoTWV0aG9kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNhY2hlLkNhY2hlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKQEAgLTM2LDYgKzM1LDggQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuR2l0U21hcnRIdHRwVG9vbHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKQEAgLTY3LDEyICs2OCwxMiBAQAogICBwcml2YXRlIGZpbmFsIEF1dGhDb25maWcgYXV0aENvbmZpZzsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBbm9ueW1vdXNVc2VyPiBhbm9ueW1vdXNQcm92aWRlcjsKICAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5SZXF1ZXN0RmFjdG9yeSBpZGVudGlmaWVkOwotICBwcml2YXRlIEFjY2Vzc1BhdGggYWNjZXNzUGF0aDsKKyAgcHJpdmF0ZSBmaW5hbCBFbnVtU2V0PEFjY2Vzc1BhdGg+IG9rUGF0aHMgPSBFbnVtU2V0Lm9mKEFjY2Vzc1BhdGguVU5LTk9XTik7CiAgIHByaXZhdGUgQ29va2llIG91dENvb2tpZTsKLSAgcHJpdmF0ZSBBdXRoTWV0aG9kIGF1dGhNZXRob2Q7CiAKICAgcHJpdmF0ZSBLZXkga2V5OwogICBwcml2YXRlIFZhbCB2YWw7CisgIHByaXZhdGUgQ3VycmVudFVzZXIgdXNlcjsKIAogICBASW5qZWN0CiAgIENhY2hlQmFzZWRXZWJTZXNzaW9uKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LApAQCAtODcsMzEgKzg4LDIyIEBACiAgICAgdGhpcy5hbm9ueW1vdXNQcm92aWRlciA9IGFub255bW91c1Byb3ZpZGVyOwogICAgIHRoaXMuaWRlbnRpZmllZCA9IGlkZW50aWZpZWQ7CiAKLSAgICBpZiAoR2l0U21hcnRIdHRwVG9vbHMuaXNHaXRDbGllbnQocmVxdWVzdCkpIHsKLSAgICAgIGFjY2Vzc1BhdGggPSBBY2Nlc3NQYXRoLkdJVDsKLSAgICB9IGVsc2UgewotICAgICAgYWNjZXNzUGF0aCA9IEFjY2Vzc1BhdGguV0VCX1VJOwotICAgIH0KKyAgICBpZiAoIUdpdFNtYXJ0SHR0cFRvb2xzLmlzR2l0Q2xpZW50KHJlcXVlc3QpKSB7CisgICAgICBTdHJpbmcgY29va2llID0gcmVhZENvb2tpZSgpOworICAgICAgaWYgKGNvb2tpZSAhPSBudWxsKSB7CisgICAgICAgIGtleSA9IG5ldyBLZXkoY29va2llKTsKKyAgICAgICAgdmFsID0gbWFuYWdlci5nZXQoa2V5KTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsICYmIHZhbC5uZWVkc0Nvb2tpZVJlZnJlc2goKSkgeworICAgICAgICAgIC8vIENvb2tpZSBpcyBtb3JlIHRoYW4gaGFsZiBvbGQuIFNlbmQgdGhlIGNvb2tpZSBhZ2FpbiB0byB0aGUKKyAgICAgICAgICAvLyBjbGllbnQgd2l0aCBhbiB1cGRhdGVkIGV4cGlyYXRpb24gZGF0ZS4KKyAgICAgICAgICB2YWwgPSBtYW5hZ2VyLmNyZWF0ZVZhbChrZXksIHZhbCk7CisgICAgICAgIH0KIAotICAgIGZpbmFsIFN0cmluZyBjb29raWUgPSByZWFkQ29va2llKCk7Ci0gICAgaWYgKGNvb2tpZSAhPSBudWxsKSB7Ci0gICAgICBrZXkgPSBuZXcgS2V5KGNvb2tpZSk7Ci0gICAgICB2YWwgPSBtYW5hZ2VyLmdldChrZXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBrZXkgPSBudWxsOwotICAgICAgdmFsID0gbnVsbDsKLSAgICB9Ci0gICAgYXV0aE1ldGhvZCA9IGlzU2lnbmVkSW4oKSA/IEF1dGhNZXRob2QuQ09PS0lFIDogQXV0aE1ldGhvZC5OT05FOwotCi0gICAgaWYgKGlzU2lnbmVkSW4oKSAmJiB2YWwubmVlZHNDb29raWVSZWZyZXNoKCkpIHsKLSAgICAgIC8vIENvb2tpZSBpcyBtb3JlIHRoYW4gaGFsZiBvbGQuIFNlbmQgdGhlIGNvb2tpZSBhZ2FpbiB0byB0aGUKLSAgICAgIC8vIGNsaWVudCB3aXRoIGFuIHVwZGF0ZWQgZXhwaXJhdGlvbiBkYXRlLiBXZSBkb24ndCBkYXJlIHRvCi0gICAgICAvLyBjaGFuZ2UgdGhlIGtleSB0b2tlbiBoZXJlIGJlY2F1c2UgdGhlcmUgbWF5IGJlIG90aGVyIFJQQ3MKLSAgICAgIC8vIHF1ZXVlZCB1cCBpbiB0aGUgYnJvd3NlciB3aG9zZSB4c3JmS2V5IHdvdWxkIG5vdCBnZXQgdXBkYXRlZAotICAgICAgLy8gd2l0aCB0aGUgbmV3IHRva2VuLCBjYXVzaW5nIHRoZW0gdG8gZmFpbC4KLSAgICAgIC8vCi0gICAgICB2YWwgPSBtYW5hZ2VyLmNyZWF0ZVZhbChrZXksIHZhbCk7Ci0gICAgICBzYXZlQ29va2llKCk7CisgICAgICAgIFN0cmluZyB0b2tlbiA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJYLUdlcnJpdC1BdXRoIik7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCAmJiB0b2tlbiAhPSBudWxsICYmIHRva2VuLmVxdWFscyh2YWwuZ2V0QXV0aCgpKSkgeworICAgICAgICAgIG9rUGF0aHMuYWRkKEFjY2Vzc1BhdGguUkVTVF9BUEkpOworICAgICAgICB9CisgICAgICB9CiAgICAgfQogICB9CiAKQEAgLTEyOCwzMyArMTIwLDU0IEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gaXNTaWduZWRJbigpIHsKICAgICByZXR1cm4gdmFsICE9IG51bGw7CiAgIH0KIAotICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKCkgewotICAgIHJldHVybiBpc1NpZ25lZEluKCkgPyB2YWwuZ2V0WHNyZlRva2VuKCkgOiBudWxsOworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRYR2Vycml0QXV0aCgpIHsKKyAgICByZXR1cm4gaXNTaWduZWRJbigpID8gdmFsLmdldEF1dGgoKSA6IG51bGw7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBpc1Rva2VuVmFsaWQoZmluYWwgU3RyaW5nIGlucHV0VG9rZW4pIHsKLSAgICByZXR1cm4gaXNTaWduZWRJbigpIC8vCi0gICAgICAgICYmIHZhbC5nZXRYc3JmVG9rZW4oKSAhPSBudWxsIC8vCi0gICAgICAgICYmIHZhbC5nZXRYc3JmVG9rZW4oKS5lcXVhbHMoaW5wdXRUb2tlbik7CisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWEdlcnJpdEF1dGgoU3RyaW5nIGtleUluKSB7CisgICAgcmV0dXJuIGtleUluLmVxdWFscyhnZXRYR2Vycml0QXV0aCgpKTsKICAgfQogCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoIHBhdGgpIHsKKyAgICByZXR1cm4gb2tQYXRocy5jb250YWlucyhwYXRoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aCBwYXRoLCBib29sZWFuIG9rKSB7CisgICAgaWYgKG9rKSB7CisgICAgICBva1BhdGhzLmFkZChwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgb2tQYXRocy5yZW1vdmUocGF0aCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyBBY2NvdW50RXh0ZXJuYWxJZC5LZXkgZ2V0TGFzdExvZ2luRXh0ZXJuYWxJZCgpIHsKICAgICByZXR1cm4gdmFsICE9IG51bGwgPyB2YWwuZ2V0RXh0ZXJuYWxJZCgpIDogbnVsbDsKICAgfQogCisgIEBPdmVycmlkZQogICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKSB7Ci0gICAgaWYgKGlzU2lnbmVkSW4oKSkgewotICAgICAgcmV0dXJuIGlkZW50aWZpZWQuY3JlYXRlKGFjY2Vzc1BhdGgsIHZhbC5nZXRBY2NvdW50SWQoKSk7CisgICAgaWYgKHVzZXIgPT0gbnVsbCkgeworICAgICAgaWYgKGlzU2lnbmVkSW4oKSkgeworICAgICAgICB1c2VyID0gaWRlbnRpZmllZC5jcmVhdGUodmFsLmdldEFjY291bnRJZCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVzZXIgPSBhbm9ueW1vdXNQcm92aWRlci5nZXQoKTsKKyAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGFub255bW91c1Byb3ZpZGVyLmdldCgpOworICAgIHJldHVybiB1c2VyOwogICB9CiAKLSAgcHVibGljIHZvaWQgbG9naW4oZmluYWwgQXV0aFJlc3VsdCByZXMsIGZpbmFsIEF1dGhNZXRob2QgbWV0aCwKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZW1lbWJlck1lKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBsb2dpbihmaW5hbCBBdXRoUmVzdWx0IHJlcywgZmluYWwgYm9vbGVhbiByZW1lbWJlck1lKSB7CiAgICAgZmluYWwgQWNjb3VudC5JZCBpZCA9IHJlcy5nZXRBY2NvdW50SWQoKTsKICAgICBmaW5hbCBBY2NvdW50RXh0ZXJuYWxJZC5LZXkgaWRlbnRpdHkgPSByZXMuZ2V0RXh0ZXJuYWxJZCgpOwogCkBAIC0xNjMsMTkgKzE3NiwxOCBAQAogICAgIH0KIAogICAgIGtleSA9IG1hbmFnZXIuY3JlYXRlS2V5KGlkKTsKLSAgICB2YWwgPSBtYW5hZ2VyLmNyZWF0ZVZhbChrZXksIGlkLCByZW1lbWJlck1lLCBpZGVudGl0eSwgbnVsbCk7CisgICAgdmFsID0gbWFuYWdlci5jcmVhdGVWYWwoa2V5LCBpZCwgcmVtZW1iZXJNZSwgaWRlbnRpdHksIG51bGwsIG51bGwpOwogICAgIHNhdmVDb29raWUoKTsKLQotICAgIGF1dGhNZXRob2QgPSBtZXRoOwogICB9CiAKICAgLyoqIFNldCB0aGUgdXNlciBhY2NvdW50IGZvciB0aGlzIGN1cnJlbnQgcmVxdWVzdCBvbmx5LiAqLwotICBwdWJsaWMgdm9pZCBzZXRVc2VyQWNjb3VudElkKEFjY291bnQuSWQgaWQsIEF1dGhNZXRob2QgbWV0aG9kKSB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRVc2VyQWNjb3VudElkKEFjY291bnQuSWQgaWQpIHsKICAgICBrZXkgPSBuZXcgS2V5KCJpZDoiICsgaWQpOwotICAgIHZhbCA9IG5ldyBWYWwoaWQsIDAsIGZhbHNlLCBudWxsLCAiIiwgMCk7Ci0gICAgYXV0aE1ldGhvZCA9IG1ldGhvZDsKKyAgICB2YWwgPSBuZXcgVmFsKGlkLCAwLCBmYWxzZSwgbnVsbCwgMCwgbnVsbCwgbnVsbCk7CiAgIH0KIAorICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgbG9nb3V0KCkgewogICAgIGlmICh2YWwgIT0gbnVsbCkgewogICAgICAgbWFuYWdlci5kZXN0cm95KGtleSk7CkBAIC0xODUsNiArMTk3LDExIEBACiAgICAgfQogICB9CiAKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKCkgeworICAgIHJldHVybiB2YWwgIT0gbnVsbCA/IHZhbC5nZXRTZXNzaW9uSWQoKSA6IG51bGw7CisgIH0KKwogICBwcml2YXRlIHZvaWQgc2F2ZUNvb2tpZSgpIHsKICAgICBmaW5hbCBTdHJpbmcgdG9rZW47CiAgICAgZmluYWwgaW50IGFnZVNlY29uZHM7CkBAIC0yMjAsOCArMjM3LDQgQEAKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NlY3VyZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAgICAgcmV0dXJuIHJlcS5pc1NlY3VyZSgpIHx8ICJodHRwcyIuZXF1YWxzKHJlcS5nZXRTY2hlbWUoKSk7CiAgIH0KLQotICBwdWJsaWMgQXV0aE1ldGhvZCBnZXRBdXRoTWV0aG9kKCkgewotICAgIHJldHVybiBhdXRoTWV0aG9kOwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9DYW5vbmljYWxXZWJVcmwuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0Nhbm9uaWNhbFdlYlVybC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzBjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9DYW5vbmljYWxXZWJVcmwuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBDYW5vbmljYWxXZWJVcmwgeworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gY29uZmlndXJlZDsKKworICBASW5qZWN0CisgIENhbm9uaWNhbFdlYlVybCgKKyAgICAgIEBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybAorICAgICAgQE51bGxhYmxlCisgICAgICBQcm92aWRlcjxTdHJpbmc+IHByb3ZpZGVyKSB7CisgICAgY29uZmlndXJlZCA9IHByb3ZpZGVyOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIFN0cmluZyB1cmwgPSBjb25maWd1cmVkLmdldCgpOworICAgIHJldHVybiB1cmwgIT0gbnVsbCA/IHVybCA6IGNvbXB1dGVGcm9tUmVxdWVzdChyZXEpOworICB9CisKKyAgc3RhdGljIFN0cmluZyBjb21wdXRlRnJvbVJlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIFN0cmluZ0J1ZmZlciB1cmwgPSByZXEuZ2V0UmVxdWVzdFVSTCgpOworICAgIHVybC5zZXRMZW5ndGgodXJsLmxlbmd0aCgpIC0gcmVxLmdldFNlcnZsZXRQYXRoKCkubGVuZ3RoKCkpOworICAgIGlmICh1cmwuY2hhckF0KHVybC5sZW5ndGgoKSAtIDEpICE9ICcvJykgeworICAgICAgdXJsLmFwcGVuZCgnLycpOworICAgIH0KKyAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0NvbnRhaW5lckF1dGhGaWx0ZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0NvbnRhaW5lckF1dGhGaWx0ZXIuamF2YQppbmRleCA5Y2UyMjk4Li40MzNiNGY1IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Db250YWluZXJBdXRoRmlsdGVyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvQ29udGFpbmVyQXV0aEZpbHRlci5qYXZhCkBAIC0xNyw5ICsxNyw5IEBACiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0ZPUkJJRERFTjsKIGltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFjY2Vzc1BhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRTdGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoTWV0aG9kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKQEAgLTEwMCw5ICsxMDAsMTAgQEAKICAgICAgIHJzcC5zZW5kRXJyb3IoU0NfVU5BVVRIT1JJWkVEKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgc2Vzc2lvbi5nZXQoKS5zZXRVc2VyQWNjb3VudElkKAotICAgICAgICB3aG8uZ2V0QWNjb3VudCgpLmdldElkKCksCi0gICAgICAgIEF1dGhNZXRob2QuUEFTU1dPUkQpOworICAgIFdlYlNlc3Npb24gd3MgPSBzZXNzaW9uLmdldCgpOworICAgIHdzLnNldFVzZXJBY2NvdW50SWQod2hvLmdldEFjY291bnQoKS5nZXRJZCgpKTsKKyAgICB3cy5zZXRBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aC5HSVQsIHRydWUpOworICAgIHdzLnNldEFjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoLlJFU1RfQVBJLCB0cnVlKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2Vycml0Q29uZmlnUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0dlcnJpdENvbmZpZ1Byb3ZpZGVyLmphdmEKaW5kZXggYzFmM2FlNC4uYWE1NmFlOSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2Vycml0Q29uZmlnUHJvdmlkZXIuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9HZXJyaXRDb25maWdQcm92aWRlci5qYXZhCkBAIC0xNCw3ICsxNCw2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdlcnJpdENvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HaXR3ZWJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CkBAIC01Miw3ICs1MSw2IEBACiAgIHByaXZhdGUgZmluYWwgR2l0V2ViQ29uZmlnIGdpdFdlYkNvbmZpZzsKICAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgd2lsZFByb2plY3Q7CiAgIHByaXZhdGUgZmluYWwgU3NoSW5mbyBzc2hJbmZvOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKIAogICBwcml2YXRlIEVtYWlsU2VuZGVyIGVtYWlsU2VuZGVyOwogICBwcml2YXRlIGZpbmFsIENvbnRhY3RTdG9yZSBjb250YWN0U3RvcmU7CkBAIC02Miw3ICs2MCw3IEBACiAgIEBJbmplY3QKICAgR2Vycml0Q29uZmlnUHJvdmlkZXIoZmluYWwgUmVhbG0gciwgQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgZ3NjLAogICAgICAgZmluYWwgQXV0aENvbmZpZyBhYywgZmluYWwgR2l0V2ViQ29uZmlnIGd3YywgZmluYWwgQWxsUHJvamVjdHNOYW1lIHdwLAotICAgICAgZmluYWwgU3NoSW5mbyBzaSwgZmluYWwgQXBwcm92YWxUeXBlcyBhdCwgZmluYWwgQ29udGFjdFN0b3JlIGNzLAorICAgICAgZmluYWwgU3NoSW5mbyBzaSwgZmluYWwgQ29udGFjdFN0b3JlIGNzLAogICAgICAgZmluYWwgU2VydmxldENvbnRleHQgc2MsIGZpbmFsIERvd25sb2FkQ29uZmlnIGRjLAogICAgICAgZmluYWwgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFjbikgewogICAgIHJlYWxtID0gcjsKQEAgLTcyLDcgKzcwLDYgQEAKICAgICBnaXRXZWJDb25maWcgPSBnd2M7CiAgICAgc3NoSW5mbyA9IHNpOwogICAgIHdpbGRQcm9qZWN0ID0gd3A7Ci0gICAgYXBwcm92YWxUeXBlcyA9IGF0OwogICAgIGNvbnRhY3RTdG9yZSA9IGNzOwogICAgIHNlcnZsZXRDb250ZXh0ID0gc2M7CiAgICAgYW5vbnltb3VzQ293YXJkTmFtZSA9IGFjbjsKQEAgLTg2LDI1ICs4MywyNyBAQAogICBwcml2YXRlIEdlcnJpdENvbmZpZyBjcmVhdGUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKICAgICBmaW5hbCBHZXJyaXRDb25maWcgY29uZmlnID0gbmV3IEdlcnJpdENvbmZpZygpOwogICAgIHN3aXRjaCAoYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpKSB7Ci0gICAgICBjYXNlIE9QRU5JRDoKLSAgICAgICAgY29uZmlnLnNldEFsbG93ZWRPcGVuSURzKGF1dGhDb25maWcuZ2V0QWxsb3dlZE9wZW5JRHMoKSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE9QRU5JRF9TU086Ci0gICAgICAgIGNvbmZpZy5zZXRPcGVuSWRTc29VcmwoYXV0aENvbmZpZy5nZXRPcGVuSWRTc29VcmwoKSk7Ci0gICAgICAgIGJyZWFrOwotCiAgICAgICBjYXNlIExEQVA6CiAgICAgICBjYXNlIExEQVBfQklORDoKICAgICAgICAgY29uZmlnLnNldFJlZ2lzdGVyVXJsKGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAicmVnaXN0ZXJ1cmwiKSk7CisgICAgICAgIGNvbmZpZy5zZXRSZWdpc3RlclRleHQoY2ZnLmdldFN0cmluZygiYXV0aCIsIG51bGwsICJyZWdpc3RlcnRleHQiKSk7CiAgICAgICAgIGNvbmZpZy5zZXRFZGl0RnVsbE5hbWVVcmwoY2ZnLmdldFN0cmluZygiYXV0aCIsIG51bGwsICJlZGl0RnVsbE5hbWVVcmwiKSk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIENVU1RPTV9FWFRFTlNJT046CiAgICAgICAgIGNvbmZpZy5zZXRSZWdpc3RlclVybChjZmcuZ2V0U3RyaW5nKCJhdXRoIiwgbnVsbCwgInJlZ2lzdGVydXJsIikpOworICAgICAgICBjb25maWcuc2V0UmVnaXN0ZXJUZXh0KGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAicmVnaXN0ZXJ0ZXh0IikpOwogICAgICAgICBjb25maWcuc2V0RWRpdEZ1bGxOYW1lVXJsKGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAiZWRpdEZ1bGxOYW1lVXJsIikpOwogICAgICAgICBjb25maWcuc2V0SHR0cFBhc3N3b3JkVXJsKGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAiaHR0cFBhc3N3b3JkVXJsIikpOwogICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDTElFTlRfU1NMX0NFUlRfTERBUDoKKyAgICAgIGNhc2UgREVWRUxPUE1FTlRfQkVDT01FX0FOWV9BQ0NPVU5UOgorICAgICAgY2FzZSBIVFRQOgorICAgICAgY2FzZSBIVFRQX0xEQVA6CisgICAgICBjYXNlIE9QRU5JRDoKKyAgICAgIGNhc2UgT1BFTklEX1NTTzoKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNvbmZpZy5zZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoY2ZnLmdldEJvb2xlYW4oImF1dGgiLAogICAgICAgICAiY29udHJpYnV0b3JhZ3JlZW1lbnRzIiwgZmFsc2UpKTsKQEAgLTExNSwxMiArMTE0LDEyIEBACiAgICAgY29uZmlnLnNldERvd25sb2FkQ29tbWFuZHMoZG93bmxvYWRDb25maWcuZ2V0RG93bmxvYWRDb21tYW5kcygpKTsKICAgICBjb25maWcuc2V0QXV0aFR5cGUoYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpKTsKICAgICBjb25maWcuc2V0V2lsZFByb2plY3Qod2lsZFByb2plY3QpOwotICAgIGNvbmZpZy5zZXRBcHByb3ZhbFR5cGVzKGFwcHJvdmFsVHlwZXMpOwogICAgIGNvbmZpZy5zZXREb2N1bWVudGF0aW9uQXZhaWxhYmxlKHNlcnZsZXRDb250ZXh0CiAgICAgICAgIC5nZXRSZXNvdXJjZSgiL0RvY3VtZW50YXRpb24vaW5kZXguaHRtbCIpICE9IG51bGwpOwogICAgIGNvbmZpZy5zZXRUZXN0Q2hhbmdlTWVyZ2UoY2ZnLmdldEJvb2xlYW4oImNoYW5nZU1lcmdlIiwKICAgICAgICAgInRlc3QiLCBmYWxzZSkpOwogICAgIGNvbmZpZy5zZXRBbm9ueW1vdXNDb3dhcmROYW1lKGFub255bW91c0Nvd2FyZE5hbWUpOworICAgIGNvbmZpZy5zZXRTdWdnZXN0RnJvbShjZmcuZ2V0SW50KCJzdWdnZXN0IiwgImZyb20iLCAwKSk7CiAKICAgICBjb25maWcuc2V0UmVwb3J0QnVnVXJsKGNmZy5nZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJyZXBvcnRCdWdVcmwiKSk7CiAgICAgaWYgKGNvbmZpZy5nZXRSZXBvcnRCdWdVcmwoKSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9HZXJyaXRVaU9wdGlvbnMuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0dlcnJpdFVpT3B0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMDczMjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9HZXJyaXRVaU9wdGlvbnMuamF2YQpAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CisKK3B1YmxpYyBjbGFzcyBHZXJyaXRVaU9wdGlvbnMgeworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGVhZGxlc3M7CisKKyAgcHVibGljIEdlcnJpdFVpT3B0aW9ucyhib29sZWFuIGhlYWRsZXNzKSB7CisgICAgdGhpcy5oZWFkbGVzcyA9IGhlYWRsZXNzOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZW5hYmxlRGVmYXVsdFVpKCkgeworICAgIHJldHVybiAhaGVhZGxlc3M7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0dpdE92ZXJIdHRwU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2l0T3Zlckh0dHBTZXJ2bGV0LmphdmEKaW5kZXggNmJkMzVkZC4uZGFkOWI4MCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2l0T3Zlckh0dHBTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvR2l0T3Zlckh0dHBTZXJ2bGV0LmphdmEKQEAgLTE4LDEwICsxOCwxMyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNhcGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5Bbm9ueW1vdXNVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNhY2hlLkNhY2hlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQXN5bmNSZWNlaXZlQ29tbWl0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkNoYW5nZUNhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZWNlaXZlQ29tbWl0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlRhZ0NhY2hlOwpAQCAtMTU2LDggKzE1OSwxMiBAQAogICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiBlcnIpIHsKICAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihwcm9qZWN0TmFtZSk7CiAgICAgICB9CisKKyAgICAgIEN1cnJlbnRVc2VyIHVzZXIgPSBwYy5nZXRDdXJyZW50VXNlcigpOworICAgICAgdXNlci5zZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGguR0lUKTsKKwogICAgICAgaWYgKCFwYy5pc1Zpc2libGUoKSkgewotICAgICAgICBpZiAocGMuZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIEFub255bW91c1VzZXIpIHsKKyAgICAgICAgaWYgKHVzZXIgaW5zdGFuY2VvZiBBbm9ueW1vdXNVc2VyKSB7CiAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uKCk7CkBAIC0xNzYsMTIgKzE4MywxMCBAQAogCiAgIHN0YXRpYyBjbGFzcyBVcGxvYWRGYWN0b3J5IGltcGxlbWVudHMgVXBsb2FkUGFja0ZhY3Rvcnk8SHR0cFNlcnZsZXRSZXF1ZXN0PiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2ZlckNvbmZpZyBjb25maWc7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiBzZXNzaW9uOwogCiAgICAgQEluamVjdAotICAgIFVwbG9hZEZhY3RvcnkoVHJhbnNmZXJDb25maWcgdGMsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHNlc3Npb24pIHsKKyAgICBVcGxvYWRGYWN0b3J5KFRyYW5zZmVyQ29uZmlnIHRjKSB7CiAgICAgICB0aGlzLmNvbmZpZyA9IHRjOwotICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE5NiwxMSArMjAxLDEzIEBACiAgIHN0YXRpYyBjbGFzcyBVcGxvYWRGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewogICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOwogICAgIHByaXZhdGUgZmluYWwgVGFnQ2FjaGUgdGFnQ2FjaGU7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKIAogICAgIEBJbmplY3QKLSAgICBVcGxvYWRGaWx0ZXIoUHJvdmlkZXI8UmV2aWV3RGI+IGRiLCBUYWdDYWNoZSB0YWdDYWNoZSkgeworICAgIFVwbG9hZEZpbHRlcihQcm92aWRlcjxSZXZpZXdEYj4gZGIsIFRhZ0NhY2hlIHRhZ0NhY2hlLCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZSkgewogICAgICAgdGhpcy5kYiA9IGRiOwogICAgICAgdGhpcy50YWdDYWNoZSA9IHRhZ0NhY2hlOworICAgICAgdGhpcy5jaGFuZ2VDYWNoZSA9IGNoYW5nZUNhY2hlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjE5LDcgKzIyNiw3IEBACiAgICAgICB9CiAKICAgICAgIGlmICghcGMuYWxsUmVmc0FyZVZpc2libGUoKSkgewotICAgICAgICB1cC5zZXRBZHZlcnRpc2VSZWZzSG9vayhuZXcgVmlzaWJsZVJlZkZpbHRlcih0YWdDYWNoZSwgcmVwbywgcGMsIGRiLmdldCgpLCB0cnVlKSk7CisgICAgICAgIHVwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBWaXNpYmxlUmVmRmlsdGVyKHRhZ0NhY2hlLCBjaGFuZ2VDYWNoZSwgcmVwbywgcGMsIGRiLmdldCgpLCB0cnVlKSk7CiAgICAgICB9CiAKICAgICAgIG5leHQuZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwpAQCAtMjM2LDE0ICsyNDMsMTEgQEAKIAogICBzdGF0aWMgY2xhc3MgUmVjZWl2ZUZhY3RvcnkgaW1wbGVtZW50cyBSZWNlaXZlUGFja0ZhY3Rvcnk8SHR0cFNlcnZsZXRSZXF1ZXN0PiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBBc3luY1JlY2VpdmVDb21taXRzLkZhY3RvcnkgZmFjdG9yeTsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHNlc3Npb247CiAgICAgcHJpdmF0ZSBmaW5hbCBUcmFuc2ZlckNvbmZpZyBjb25maWc7CiAKICAgICBASW5qZWN0Ci0gICAgUmVjZWl2ZUZhY3RvcnkoQXN5bmNSZWNlaXZlQ29tbWl0cy5GYWN0b3J5IGZhY3RvcnksCi0gICAgICAgIFByb3ZpZGVyPFdlYlNlc3Npb24+IHNlc3Npb24sIFRyYW5zZmVyQ29uZmlnIGNvbmZpZykgeworICAgIFJlY2VpdmVGYWN0b3J5KEFzeW5jUmVjZWl2ZUNvbW1pdHMuRmFjdG9yeSBmYWN0b3J5LCBUcmFuc2ZlckNvbmZpZyBjb25maWcpIHsKICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uOwogICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CiAgICAgfQogCkBAIC0yODUsNiArMjg5LDcgQEAKIAogICAgICAgUmVjZWl2ZUNvbW1pdHMgcmMgPSAoUmVjZWl2ZUNvbW1pdHMpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEFUVF9SQyk7CiAgICAgICBSZWNlaXZlUGFjayBycCA9IHJjLmdldFJlY2VpdmVQYWNrKCk7CisgICAgICBycC5nZXRBZHZlcnRpc2VSZWZzSG9vaygpLmFkdmVydGlzZVJlZnMocnApOwogICAgICAgUHJvamVjdENvbnRyb2wgcGMgPSAoUHJvamVjdENvbnRyb2wpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKEFUVF9DT05UUk9MKTsKICAgICAgIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSA9IHBjLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0bWxEb21VdGlsLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9IdG1sRG9tVXRpbC5qYXZhCmluZGV4IDBhOTNmODAuLmM0NzU1MmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0bWxEb21VdGlsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHRtbERvbVV0aWwuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogCiAgIC8qKiBET0NUWVBFIGZvciBhIHN0YW5kYXJkcyBtb2RlIEhUTUwgZG9jdW1lbnQuICovCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU1RSSUNUID0KLSAgICAgICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiOworICAgICAgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU5cIiBcImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiOwogCiAgIC8qKiBDb252ZXJ0IGEgZG9jdW1lbnQgdG8gYSBVVEYtOCBieXRlIHNlcXVlbmNlLiAqLwogICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0b1VURjgoZmluYWwgRG9jdW1lbnQgaG9zdERvYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0dHBDYW5vbmljYWxXZWJVcmxQcm92aWRlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cENhbm9uaWNhbFdlYlVybFByb3ZpZGVyLmphdmEKaW5kZXggNWRmNjc4Yi4uNTE5NmU5YyAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cENhbm9uaWNhbFdlYlVybFByb3ZpZGVyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cENhbm9uaWNhbFdlYlVybFByb3ZpZGVyLmphdmEKQEAgLTE0LDcgKzE0LDYgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMjYsNyArMjUsNyBAQAogCiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKIAotLyoqIFNldHMge0BsaW5rIENhbm9uaWNhbFdlYlVybH0gdG8gY3VycmVudCBIVFRQIHJlcXVlc3QgaWYgbm90IGNvbmZpZ3VyZWQuICovCisvKiogU2V0cyB7QGNvZGUgQ2Fub25pY2FsV2ViVXJsfSB0byBjdXJyZW50IEhUVFAgcmVxdWVzdCBpZiBub3QgY29uZmlndXJlZC4gKi8KIHB1YmxpYyBjbGFzcyBIdHRwQ2Fub25pY2FsV2ViVXJsUHJvdmlkZXIgZXh0ZW5kcyBDYW5vbmljYWxXZWJVcmxQcm92aWRlciB7CiAgIHByaXZhdGUgUHJvdmlkZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXF1ZXN0UHJvdmlkZXI7CiAKQEAgLTY1LDEzICs2NCw3IEBACiAgICAgICAgICAgdGhyb3cgbm9XZWI7CiAgICAgICAgIH0KICAgICAgIH0KLQotICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHVybCA9IHJlcS5nZXRSZXF1ZXN0VVJMKCk7Ci0gICAgICB1cmwuc2V0TGVuZ3RoKHVybC5sZW5ndGgoKSAtIHJlcS5nZXRTZXJ2bGV0UGF0aCgpLmxlbmd0aCgpKTsKLSAgICAgIGlmICh1cmwuY2hhckF0KHVybC5sZW5ndGgoKSAtIDEpICE9ICcvJykgewotICAgICAgICB1cmwuYXBwZW5kKCcvJyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7CisgICAgICByZXR1cm4gQ2Fub25pY2FsV2ViVXJsLmNvbXB1dGVGcm9tUmVxdWVzdChyZXEpOwogICAgIH0KIAogICAgIC8vIFdlIGhhdmUgbm8gd2F5IG9mIGd1ZXNzaW5nIG91ciBIVFRQIHVybC4KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0dHBMb2dvdXRTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9IdHRwTG9nb3V0U2VydmxldC5qYXZhCmluZGV4IGU5YjM1MDAuLjg3OWRmYTMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0dHBMb2dvdXRTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cExvZ291dFNlcnZsZXQuamF2YQpAQCAtNzcsNyArNzcsNyBAQAogICBwcm90ZWN0ZWQgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKLSAgICBmaW5hbCBTdHJpbmcgc2lkID0gd2ViU2Vzc2lvbi5nZXQoKS5nZXRUb2tlbigpOworICAgIGZpbmFsIFN0cmluZyBzaWQgPSB3ZWJTZXNzaW9uLmdldCgpLmdldFNlc3Npb25JZCgpOwogICAgIGZpbmFsIEN1cnJlbnRVc2VyIGN1cnJlbnRVc2VyID0gd2ViU2Vzc2lvbi5nZXQoKS5nZXRDdXJyZW50VXNlcigpOwogICAgIGZpbmFsIFN0cmluZyB3aGF0ID0gInNpZ24gb3V0IjsKICAgICBmaW5hbCBsb25nIHdoZW4gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL0h0dHBSZXF1ZXN0Q29udGV4dC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cFJlcXVlc3RDb250ZXh0LmphdmEKaW5kZXggOGVmODI2Yi4uMmRiMzUzNCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cFJlcXVlc3RDb250ZXh0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvSHR0cFJlcXVlc3RDb250ZXh0LmphdmEKQEAgLTE0LDIwICsxNCwzMSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlJlcXVlc3RDb250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAogY2xhc3MgSHR0cFJlcXVlc3RDb250ZXh0IGltcGxlbWVudHMgUmVxdWVzdENvbnRleHQgewogICBwcml2YXRlIGZpbmFsIFdlYlNlc3Npb24gc2Vzc2lvbjsKKyAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlciBwcm92aWRlcjsKIAogICBASW5qZWN0Ci0gIEh0dHBSZXF1ZXN0Q29udGV4dChmaW5hbCBXZWJTZXNzaW9uIHNlc3Npb24pIHsKKyAgSHR0cFJlcXVlc3RDb250ZXh0KFdlYlNlc3Npb24gc2Vzc2lvbiwKKyAgICAgIFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyIHByb3ZpZGVyKSB7CiAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKKyAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgewogICAgIHJldHVybiBzZXNzaW9uLmdldEN1cnJlbnRVc2VyKCk7CiAgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByb3ZpZGVyPFJldmlld0RiPiBnZXRSZXZpZXdEYlByb3ZpZGVyKCkgeworICAgIHJldHVybiBwcm92aWRlcjsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUHJvamVjdEJhc2ljQXV0aEZpbHRlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUHJvamVjdEJhc2ljQXV0aEZpbHRlci5qYXZhCmluZGV4IDViMzljYjIuLjNkOWY0YzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Byb2plY3RCYXNpY0F1dGhGaWx0ZXIuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Qcm9qZWN0QmFzaWNBdXRoRmlsdGVyLmphdmEKQEAgLTE4LDExICsxOCwxMSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50U3RhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKQEAgLTEwNCwxMCArMTA0LDkgQEAKICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBSZXNwb25zZSByc3ApCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGZpbmFsIFN0cmluZyBoZHIgPSByZXEuZ2V0SGVhZGVyKEFVVEhPUklaQVRJT04pOwotICAgIGlmIChoZHIgPT0gbnVsbCkgeworICAgIGlmIChoZHIgPT0gbnVsbCB8fCAhaGRyLnN0YXJ0c1dpdGgoTElUX0JBU0lDKSkgewogICAgICAgLy8gQWxsb3cgYW4gYW5vbnltb3VzIGNvbm5lY3Rpb24gdGhyb3VnaCwgb3IgaXQgbWlnaHQgYmUgdXNpbmcgYQogICAgICAgLy8gc2Vzc2lvbiBjb29raWUgaW5zdGVhZCBvZiBiYXNpYyBhdXRoZW50aWNhdGlvbi4KLSAgICAgIC8vCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTE0Myw4ICsxNDIsMTAgQEAKIAogICAgIHRyeSB7CiAgICAgICBBdXRoUmVzdWx0IHdob0F1dGhSZXN1bHQgPSBhY2NvdW50TWFuYWdlci5hdXRoZW50aWNhdGUod2hvQXV0aCk7Ci0gICAgICBzZXNzaW9uLmdldCgpLnNldFVzZXJBY2NvdW50SWQod2hvQXV0aFJlc3VsdC5nZXRBY2NvdW50SWQoKSwKLSAgICAgICAgICBBdXRoTWV0aG9kLlBBU1NXT1JEKTsKKyAgICAgIFdlYlNlc3Npb24gd3MgPSBzZXNzaW9uLmdldCgpOworICAgICAgd3Muc2V0VXNlckFjY291bnRJZCh3aG9BdXRoUmVzdWx0LmdldEFjY291bnRJZCgpKTsKKyAgICAgIHdzLnNldEFjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoLkdJVCwgdHJ1ZSk7CisgICAgICB3cy5zZXRBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aC5SRVNUX0FQSSwgdHJ1ZSk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGNhdGNoIChBY2NvdW50RXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZy53YXJuKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yICIgKyB1c2VybmFtZSwgZSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Qcm9qZWN0RGlnZXN0RmlsdGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Qcm9qZWN0RGlnZXN0RmlsdGVyLmphdmEKaW5kZXggODRhYTUzMi4uYzM4NDI1ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUHJvamVjdERpZ2VzdEZpbHRlci5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Byb2plY3REaWdlc3RGaWx0ZXIuamF2YQpAQCAtMjAsOSArMjAsOSBAQAogaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CiBpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50U3RhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlNpZ25lZFRva2VuOwpAQCAtMTEwLDEwICsxMTAsOSBAQAogICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlc3BvbnNlIHJzcCkKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgU3RyaW5nIGhkciA9IHJlcS5nZXRIZWFkZXIoQVVUSE9SSVpBVElPTik7Ci0gICAgaWYgKGhkciA9PSBudWxsKSB7CisgICAgaWYgKGhkciA9PSBudWxsIHx8ICFoZHIuc3RhcnRzV2l0aCgiRGlnZXN0ICIpKSB7CiAgICAgICAvLyBBbGxvdyBhbiBhbm9ueW1vdXMgY29ubmVjdGlvbiB0aHJvdWdoLCBvciBpdCBtaWdodCBiZSB1c2luZyBhCiAgICAgICAvLyBzZXNzaW9uIGNvb2tpZSBpbnN0ZWFkIG9mIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4KLSAgICAgIC8vCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKQEAgLTE2NSw5ICsxNjQsMTAgQEAKICAgICBpZiAoZXhwZWN0LmVxdWFscyhyZXNwb25zZSkpIHsKICAgICAgIHRyeSB7CiAgICAgICAgIGlmICh0b2tlbnMuY2hlY2tUb2tlbihub25jZSwgIiIpICE9IG51bGwpIHsKLSAgICAgICAgICBzZXNzaW9uLmdldCgpLnNldFVzZXJBY2NvdW50SWQoCi0gICAgICAgICAgICAgIHdoby5nZXRBY2NvdW50KCkuZ2V0SWQoKSwKLSAgICAgICAgICAgICAgQXV0aE1ldGhvZC5QQVNTV09SRCk7CisgICAgICAgICAgV2ViU2Vzc2lvbiB3cyA9IHNlc3Npb24uZ2V0KCk7CisgICAgICAgICAgd3Muc2V0VXNlckFjY291bnRJZCh3aG8uZ2V0QWNjb3VudCgpLmdldElkKCkpOworICAgICAgICAgIHdzLnNldEFjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoLkdJVCwgdHJ1ZSk7CisgICAgICAgICAgd3Muc2V0QWNjZXNzUGF0aE9rKEFjY2Vzc1BhdGguUkVTVF9BUEksIHRydWUpOwogICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgIH0gZWxzZSB7CkBAIC0yMzIsMTIgKzIzMiw2IEBACiAgIH0KIAogICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyc2VBdXRob3JpemF0aW9uKFN0cmluZyBhdXRoKSB7Ci0gICAgaWYgKCFhdXRoLnN0YXJ0c1dpdGgoIkRpZ2VzdCAiKSkgewotICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IERpZ2VzdCBhdXRoZW50aWNhdGlvbiBzY2hlbWUsIGRlbnkgdGhlIHJlc3QuCi0gICAgICAvLwotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgfQotCiAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgaW50IG5leHQgPSAiRGlnZXN0ICIubGVuZ3RoKCk7CiAgICAgd2hpbGUgKG5leHQgPCBhdXRoLmxlbmd0aCgpKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9SZXN0QXBpU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvUmVzdEFwaVNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkYjJmMC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9SZXN0QXBpU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZDsKLQotaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19GT1JCSURERU47Ci1pbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DYXBhYmlsaXR5Q29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC51dGlsLmNsaS5DbWRMaW5lUGFyc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uSnNvbkNvbnN0YW50czsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlJQQ1NlcnZsZXRVdGlsczsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVzdEFwaVNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KLSAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc3RBcGlTZXJ2bGV0LmNsYXNzKTsKLQotICAvKiogTUlNRSB0eXBlIHVzZWQgZm9yIGEgSlNPTiByZXNwb25zZSBib2R5LiAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEUgPSBKc29uQ29uc3RhbnRzLkpTT05fVFlQRTsKLQotICAvKioKLSAgICogR2FyYmFnZSBwcmVmaXggaW5zZXJ0ZWQgYmVmb3JlIEpTT04gb3V0cHV0IHRvIHByZXZlbnQgWFNTSS4KLSAgICogPHA+Ci0gICAqIFRoaXMgcHJlZml4IGlzICIpXX0nXG4iIGFuZCBpcyBkZXNpZ25lZCB0byBwcmV2ZW50IGEgd2ViIGJyb3dzZXIgZnJvbQotICAgKiBleGVjdXRpbmcgdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlIHJlc291cmNlIFVSSSB3ZXJlIHRvIGJlIHJlZmVyZW5jZWQgdXNpbmcKLSAgICogYSAmbHQ7c2NyaXB0IHNyYz0iLi4uJmd0OyBIVE1MIHRhZyBmcm9tIGFub3RoZXIgd2ViIHNpdGUuIENsaWVudHMgdXNpbmcgdGhlCi0gICAqIEhUVFAgaW50ZXJmYWNlIHdpbGwgbmVlZCB0byBhbHdheXMgc3RyaXAgdGhlIGZpcnN0IGxpbmUgb2YgcmVzcG9uc2UgZGF0YSB0bwotICAgKiByZW1vdmUgdGhpcyBtYWdpYyBoZWFkZXIuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBKU09OX01BR0lDOwotCi0gIHN0YXRpYyB7Ci0gICAgdHJ5IHsKLSAgICAgIEpTT05fTUFHSUMgPSAiKV19J1xuIi5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXI7Ci0KLSAgQEluamVjdAotICBwcm90ZWN0ZWQgUmVzdEFwaVNlcnZsZXQoZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IGN1cnJlbnRVc2VyKSB7Ci0gICAgdGhpcy5jdXJyZW50VXNlciA9IGN1cnJlbnRVc2VyOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIHJlcy5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIiwgImF0dGFjaG1lbnQiKTsKLQotICAgIHRyeSB7Ci0gICAgICBjaGVja1JlcXVpcmVzQ2FwYWJpbGl0eSgpOwotICAgICAgc3VwZXIuc2VydmljZShyZXEsIHJlcyk7Ci0gICAgfSBjYXRjaCAoUmVxdWlyZUNhcGFiaWxpdHlFeGNlcHRpb24gZXJyKSB7Ci0gICAgICBzZW5kRXJyb3IocmVzLCBTQ19GT1JCSURERU4sIGVyci5nZXRNZXNzYWdlKCkpOwotICAgIH0gY2F0Y2ggKEVycm9yIGVycikgewotICAgICAgaGFuZGxlRXhjZXB0aW9uKGVyciwgcmVxLCByZXMpOwotICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKSB7Ci0gICAgICBoYW5kbGVFeGNlcHRpb24oZXJyLCByZXEsIHJlcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVxdWlyZXNDYXBhYmlsaXR5KCkgdGhyb3dzIFJlcXVpcmVDYXBhYmlsaXR5RXhjZXB0aW9uIHsKLSAgICBSZXF1aXJlc0NhcGFiaWxpdHkgcmMgPSBnZXRDbGFzcygpLmdldEFubm90YXRpb24oUmVxdWlyZXNDYXBhYmlsaXR5LmNsYXNzKTsKLSAgICBpZiAocmMgIT0gbnVsbCkgewotICAgICAgQ3VycmVudFVzZXIgdXNlciA9IGN1cnJlbnRVc2VyLmdldCgpOwotICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wgY3RsID0gdXNlci5nZXRDYXBhYmlsaXRpZXMoKTsKLSAgICAgIGlmICghY3RsLmNhblBlcmZvcm0ocmMudmFsdWUoKSkgJiYgIWN0bC5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSkgewotICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAiZmF0YWw6ICVzIGRvZXMgbm90IGhhdmUgXCIlc1wiIGNhcGFiaWxpdHkuIiwKLSAgICAgICAgICBPYmplY3RzLmZpcnN0Tm9uTnVsbCgKLSAgICAgICAgICAgIHVzZXIuZ2V0VXNlck5hbWUoKSwKLSAgICAgICAgICAgIHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcgotICAgICAgICAgICAgICA/ICgoSWRlbnRpZmllZFVzZXIpIHVzZXIpLmdldE5hbWVFbWFpbCgpCi0gICAgICAgICAgICAgIDogdXNlci50b1N0cmluZygpKSwKLSAgICAgICAgICByYy52YWx1ZSgpKTsKLSAgICAgICAgdGhyb3cgbmV3IFJlcXVpcmVDYXBhYmlsaXR5RXhjZXB0aW9uKG1zZyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGVyciwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFN0cmluZyB1cmkgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOwotICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KHJlcS5nZXRRdWVyeVN0cmluZygpKSkgewotICAgICAgdXJpICs9ICI/IiArIHJlcS5nZXRRdWVyeVN0cmluZygpOwotICAgIH0KLSAgICBsb2cuZXJyb3IoU3RyaW5nLmZvcm1hdCgiRXJyb3IgaW4gJXMgJXMiLCByZXEuZ2V0TWV0aG9kKCksIHVyaSksIGVycik7Ci0KLSAgICBpZiAoIXJlcy5pc0NvbW1pdHRlZCgpKSB7Ci0gICAgICByZXMucmVzZXQoKTsKLSAgICAgIHNlbmRFcnJvcihyZXMsIFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgIkludGVybmFsIFNlcnZlciBFcnJvciIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCi0gICAgICBpbnQgc3RhdHVzQ29kZSwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXMuc2V0U3RhdHVzKHN0YXR1c0NvZGUpOwotICAgIHNlbmRUZXh0KG51bGwsIHJlcywgbXNnKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhY2NlcHRzSnNvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7Ci0gICAgU3RyaW5nIGFjY2VwdCA9IHJlcS5nZXRIZWFkZXIoIkFjY2VwdCIpOwotICAgIGlmIChhY2NlcHQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoSlNPTl9UWVBFLmVxdWFscyhhY2NlcHQpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKGFjY2VwdC5zdGFydHNXaXRoKEpTT05fVFlQRSArICIsIikpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBmb3IgKFN0cmluZyBwIDogYWNjZXB0LnNwbGl0KCJbICw7XVsgLDtdKiIpKSB7Ci0gICAgICBpZiAoSlNPTl9UWVBFLmVxdWFscyhwKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNlbmRUZXh0KEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJlcy5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwotICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLSAgICBzZW5kKHJlcSwgcmVzLCBkYXRhLmdldEJ5dGVzKCJVVEYtOCIpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBzZW5kKEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChkYXRhLmxlbmd0aCA+IDI1NiAmJiByZXEgIT0gbnVsbAotICAgICAgICAmJiBSUENTZXJ2bGV0VXRpbHMuYWNjZXB0c0d6aXBFbmNvZGluZyhyZXEpKSB7Ci0gICAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKLSAgICAgIGRhdGEgPSBIdG1sRG9tVXRpbC5jb21wcmVzcyhkYXRhKTsKLSAgICB9Ci0gICAgcmVzLnNldENvbnRlbnRMZW5ndGgoZGF0YS5sZW5ndGgpOwotICAgIE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0gICAgdHJ5IHsKLSAgICAgIG91dC53cml0ZShkYXRhKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJQYXJzZXIgewotICAgIHByaXZhdGUgZmluYWwgQ21kTGluZVBhcnNlci5GYWN0b3J5IHBhcnNlckZhY3Rvcnk7Ci0KLSAgICBASW5qZWN0Ci0gICAgUGFyYW1ldGVyUGFyc2VyKENtZExpbmVQYXJzZXIuRmFjdG9yeSBwZikgewotICAgICAgdGhpcy5wYXJzZXJGYWN0b3J5ID0gcGY7Ci0gICAgfQotCi0gICAgcHVibGljIDxUPiBib29sZWFuIHBhcnNlKFQgcGFyYW0sIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCi0gICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHBhcnNlKHBhcmFtLCByZXEsIHJlcywgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgPFQ+IGJvb2xlYW4gcGFyc2UoVCBwYXJhbSwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIFNldDxTdHJpbmc+IGFyZ05hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgQ21kTGluZVBhcnNlciBjbHAgPSBwYXJzZXJGYWN0b3J5LmNyZWF0ZShwYXJhbSk7Ci0gICAgICB0cnkgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtZXRlck1hcCA9IHJlcS5nZXRQYXJhbWV0ZXJNYXAoKTsKLSAgICAgICAgY2xwLnBhcnNlT3B0aW9uTWFwKHBhcmFtZXRlck1hcCwgYXJnTmFtZXMpOwotICAgICAgfSBjYXRjaCAoQ21kTGluZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGlmICghY2xwLndhc0hlbHBSZXF1ZXN0ZWRCeU9wdGlvbigpKSB7Ci0gICAgICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKLSAgICAgICAgICBzZW5kVGV4dChyZXEsIHJlcywgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoY2xwLndhc0hlbHBSZXF1ZXN0ZWRCeU9wdGlvbigpKSB7Ci0gICAgICAgIFN0cmluZ1dyaXRlciBtc2cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGNscC5wcmludFF1ZXJ5U3RyaW5nVXNhZ2UocmVxLmdldFJlcXVlc3RVUkkoKSwgbXNnKTsKLSAgICAgICAgbXNnLndyaXRlKCdcbicpOwotICAgICAgICBtc2cud3JpdGUoJ1xuJyk7Ci0gICAgICAgIGNscC5wcmludFVzYWdlKG1zZywgbnVsbCk7Ci0gICAgICAgIG1zZy53cml0ZSgnXG4nKTsKLSAgICAgICAgc2VuZFRleHQocmVxLCByZXMsIG1zZy50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikgLy8gTmV2ZXIgc2VyaWFsaXplZCBvciB0aHJvd24gb3V0IG9mIHRoaXMgY2xhc3MuCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlcXVpcmVDYXBhYmlsaXR5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwdWJsaWMgUmVxdWlyZUNhcGFiaWxpdHlFeGNlcHRpb24oU3RyaW5nIG1zZykgewotICAgICAgc3VwZXIobXNnKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Jlc3RUb2tlblZlcmlmaWVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9SZXN0VG9rZW5WZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNlYmM3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Jlc3RUb2tlblZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZWdpc3Rlck5ld0VtYWlsU2VuZGVyOwotCi0vKiogVmVyaWZpZXMgdGhlIHRva2VuIHNlbnQgYnkge0BsaW5rIFJlZ2lzdGVyTmV3RW1haWxTZW5kZXJ9LiAqLwotcHVibGljIGludGVyZmFjZSBSZXN0VG9rZW5WZXJpZmllciB7Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSB0b2tlbiB0byB2ZXJpZnkgYSBSRVNUIFBVVCByZXF1ZXN0LgotICAgKgotICAgKiBAcGFyYW0gdXNlciB0aGUgY2FsbGVyIHRoYXQgd2FudHMgdG8gbWFrZSBhIFBVVCByZXF1ZXN0Ci0gICAqIEBwYXJhbSB1cmwgdGhlIFVSTCBiZWluZyByZXF1ZXN0ZWQKLSAgICogQHJldHVybiBhbiB1bmZvcmdlYWJsZSBzdHJpbmcgdG8gc2VuZCB0byB0aGUgdXNlciBhcyB0aGUgYm9keSBvZiBhIEdFVAotICAgKiAgICAgICAgIHJlcXVlc3QuIFByZXNlbnRpbmcgdGhlIHN0cmluZyBpbiBhIGZvbGxvdy11cCBQT1NUIHJlcXVlc3QgcHJvdmlkZXMKLSAgICogICAgICAgICBwcm9vZiB0aGUgdXNlciBoYXMgdGhlIGFiaWxpdHkgdG8gcmVhZCBtZXNzYWdlcyBzZW50IHRvIHRoaWVyCi0gICAqICAgICAgICAgYnJvd3NlciBhbmQgdGhleSBsaWtlbHkgYXJlbid0IG1ha2luZyB0aGUgcmVxdWVzdCB2aWEgWFNSRi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc2lnbihBY2NvdW50LklkIHVzZXIsIFN0cmluZyB1cmwpOwotCi0gIC8qKgotICAgKiBEZWNvZGUgYSB0b2tlbiBwcmV2aW91c2x5IGNyZWF0ZWQuCi0gICAqCi0gICAqIEBwYXJhbSB1c2VyIHRoZSB1c2VyIG1ha2luZyB0aGUgdmVyaWZ5IHJlcXVlc3QuCi0gICAqIEBwYXJhbSB1cmwgdGhlIHVybCB1c2VyIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzLgotICAgKiBAcGFyYW0gdG9rZW4gdGhlIHN0cmluZyBjcmVhdGVkIGJ5IHNpZ24uCi0gICAqIEB0aHJvd3MgSW52YWxpZFRva2VuRXhjZXB0aW9uIHRoZSB0b2tlbiBpcyBpbnZhbGlkLCBleHBpcmVkLCBtYWxmb3JtZWQsCi0gICAqICAgICAgICAgZXRjLgotICAgKi8KLSAgcHVibGljIHZvaWQgdmVyaWZ5KEFjY291bnQuSWQgdXNlciwgU3RyaW5nIHVybCwgU3RyaW5nIHRva2VuKQotICAgICAgdGhyb3dzIEludmFsaWRUb2tlbkV4Y2VwdGlvbjsKLQotICAvKiogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgdG9rZW4gZG9lcyBub3QgcGFyc2UgY29ycmVjdGx5LiAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEludmFsaWRUb2tlbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgSW52YWxpZFRva2VuRXhjZXB0aW9uKCkgewotICAgICAgc3VwZXIoIkludmFsaWQgdG9rZW4iKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW52YWxpZFRva2VuRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotICAgICAgc3VwZXIoIkludmFsaWQgdG9rZW4iLCBjYXVzZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9TaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9TaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDZjYWEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvU2lnbmVkVG9rZW5SZXN0VG9rZW5WZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuU2lnbmVkVG9rZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5WYWxpZFRva2VuOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuWHNyZkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTY0OwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi0vKiogVmVyaWZpZXMgdGhlIHRva2VuIHNlbnQgYnkge0BsaW5rIFJlc3RBcGlTZXJ2bGV0fS4gKi8KLXB1YmxpYyBjbGFzcyBTaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyIGltcGxlbWVudHMgUmVzdFRva2VuVmVyaWZpZXIgewotICBwcml2YXRlIGZpbmFsIFNpZ25lZFRva2VuIHJlc3RUb2tlbjsKLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7Ci0gICAgICBiaW5kKFJlc3RUb2tlblZlcmlmaWVyLmNsYXNzKS50byhTaWduZWRUb2tlblJlc3RUb2tlblZlcmlmaWVyLmNsYXNzKTsKLSAgICB9Ci0gIH0KLQotICBASW5qZWN0Ci0gIFNpZ25lZFRva2VuUmVzdFRva2VuVmVyaWZpZXIoQXV0aENvbmZpZyBjb25maWcpIHsKLSAgICByZXN0VG9rZW4gPSBjb25maWcuZ2V0UmVzdFRva2VuKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBzaWduKEFjY291bnQuSWQgdXNlciwgU3RyaW5nIHVybCkgewotICAgIHRyeSB7Ci0gICAgICBTdHJpbmcgcGF5bG9hZCA9IFN0cmluZy5mb3JtYXQoIiVzOiVzIiwgdXNlciwgdXJsKTsKLSAgICAgIGJ5dGVbXSB1dGY4ID0gcGF5bG9hZC5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIFN0cmluZyBiYXNlNjQgPSBCYXNlNjQuZW5jb2RlQnl0ZXModXRmOCk7Ci0gICAgICByZXR1cm4gcmVzdFRva2VuLm5ld1Rva2VuKGJhc2U2NCk7Ci0gICAgfSBjYXRjaCAoWHNyZkV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgdmVyaWZ5KEFjY291bnQuSWQgdXNlciwgU3RyaW5nIHVybCwgU3RyaW5nIHRva2VuU3RyaW5nKQotICAgICAgdGhyb3dzIEludmFsaWRUb2tlbkV4Y2VwdGlvbiB7Ci0gICAgVmFsaWRUb2tlbiB0b2tlbjsKLSAgICB0cnkgewotICAgICAgdG9rZW4gPSByZXN0VG9rZW4uY2hlY2tUb2tlbih0b2tlblN0cmluZywgbnVsbCk7Ci0gICAgfSBjYXRjaCAoWHNyZkV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIHRocm93IG5ldyBJbnZhbGlkVG9rZW5FeGNlcHRpb24oZXJyKTsKLSAgICB9Ci0gICAgaWYgKHRva2VuID09IG51bGwgfHwgdG9rZW4uZ2V0RGF0YSgpID09IG51bGwgfHwgdG9rZW4uZ2V0RGF0YSgpLmlzRW1wdHkoKSkgewotICAgICAgdGhyb3cgbmV3IEludmFsaWRUb2tlbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIFN0cmluZyBwYXlsb2FkOwotICAgIHRyeSB7Ci0gICAgICBwYXlsb2FkID0gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlKHRva2VuLmdldERhdGEoKSksICJVVEYtOCIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXJyKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKGVycik7Ci0gICAgfQotCi0gICAgaW50IGNvbG9uUG9zID0gcGF5bG9hZC5pbmRleE9mKCc6Jyk7Ci0gICAgaWYgKGNvbG9uUG9zID09IC0xKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQWNjb3VudC5JZCB0b2tlblVzZXI7Ci0gICAgdHJ5IHsKLSAgICAgIHRva2VuVXNlciA9IEFjY291bnQuSWQucGFyc2UocGF5bG9hZC5zdWJzdHJpbmcoMCwgY29sb25Qb3MpKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXJyKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKGVycik7Ci0gICAgfQotCi0gICAgU3RyaW5nIHRva2VuVXJsID0gcGF5bG9hZC5zdWJzdHJpbmcoY29sb25Qb3MrMSk7Ci0KLSAgICBpZiAoIXRva2VuVXNlci5lcXVhbHModXNlcikgfHwgIXRva2VuVXJsLmVxdWFscyh1cmwpKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFRva2VuRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9Ub2tlblZlcmlmaWVkUmVzdEFwaVNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Rva2VuVmVyaWZpZWRSZXN0QXBpU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGExYjU3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1Rva2VuVmVyaWZpZWRSZXN0QXBpU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZDsKLQotaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19CQURfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5SZXN0VG9rZW5WZXJpZmllci5JbnZhbGlkVG9rZW5FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uUGFyc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRva2VuVmVyaWZpZWRSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0VOQ09ERUQgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhLRVlfTkFNRSA9ICJfYXV0aGtleSI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIS0VZX0hFQURFUiA9ICJYLWF1dGhrZXkiOwotCi0gIHByaXZhdGUgZmluYWwgR3NvbiBnc29uOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiB1c2VyUHJvdmlkZXI7Ci0gIHByaXZhdGUgZmluYWwgUmVzdFRva2VuVmVyaWZpZXIgdmVyaWZpZXI7Ci0KLSAgQEluamVjdAotICBwcm90ZWN0ZWQgVG9rZW5WZXJpZmllZFJlc3RBcGlTZXJ2bGV0KFByb3ZpZGVyPEN1cnJlbnRVc2VyPiB1c2VyUHJvdmlkZXIsCi0gICAgICBSZXN0VG9rZW5WZXJpZmllciB2ZXJpZmllcikgewotICAgIHN1cGVyKHVzZXJQcm92aWRlcik7Ci0gICAgdGhpcy5nc29uID0gT3V0cHV0Rm9ybWF0LkpTT05fQ09NUEFDVC5uZXdHc29uKCk7Ci0gICAgdGhpcy51c2VyUHJvdmlkZXIgPSB1c2VyUHJvdmlkZXI7Ci0gICAgdGhpcy52ZXJpZmllciA9IHZlcmlmaWVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFByb2Nlc3MgdGhlIChwb3NzaWJseSBzdGF0ZSBjaGFuZ2luZykgcmVxdWVzdC4KLSAgICoKLSAgICogQHBhcmFtIHJlcSBpbmNvbWluZyBIVFRQIHJlcXVlc3QuCi0gICAqIEBwYXJhbSByZXMgb3V0Z29pbmcgcmVzcG9uc2UuCi0gICAqIEBwYXJhbSByZXF1ZXN0RGF0YSBKU09OIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIEhUVFAgcmVxdWVzdCBwYXJhbWV0ZXJzLgotICAgKiAgICAgICAgTnVsbCBpZiB0aGUgcmVxdWVzdCBib2R5IHdhcyBub3Qgc3VwcGxpZWQgaW4gSlNPTiBmb3JtYXQuCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkb1JlcXVlc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAotICAgICAgQE51bGxhYmxlIEpzb25PYmplY3QgcmVxdWVzdERhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbjsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCi0gICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIEN1cnJlbnRVc2VyIHVzZXIgPSB1c2VyUHJvdmlkZXIuZ2V0KCk7Ci0gICAgaWYgKCEodXNlciBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSkgewotICAgICAgc2VuZEVycm9yKHJlcywgU0NfVU5BVVRIT1JJWkVELCAiQVBJIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVG9rZW5JbmZvIGluZm8gPSBuZXcgVG9rZW5JbmZvKCk7Ci0gICAgaW5mby5fYXV0aGtleSA9IHZlcmlmaWVyLnNpZ24oCi0gICAgICAgICgoSWRlbnRpZmllZFVzZXIpIHVzZXIpLmdldEFjY291bnRJZCgpLAotICAgICAgICBjb21wdXRlVXJsKHJlcSkpOwotCi0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBTdHJpbmcgdHlwZTsKLSAgICBidWYud3JpdGUoSlNPTl9NQUdJQyk7Ci0gICAgaWYgKGFjY2VwdHNKc29uKHJlcSkpIHsKLSAgICAgIHR5cGUgPSBKU09OX1RZUEU7Ci0gICAgICBidWYud3JpdGUoZ3Nvbi50b0pzb24oaW5mbykuZ2V0Qnl0ZXMoVVRGXzgpKTsKLSAgICB9IGVsc2UgewotICAgICAgdHlwZSA9IEZPUk1fRU5DT0RFRDsKLSAgICAgIGJ1Zi53cml0ZShTdHJpbmcuZm9ybWF0KCIlcz0lcyIsCi0gICAgICAgICAgQVVUSEtFWV9OQU1FLAotICAgICAgICAgIFVSTEVuY29kZXIuZW5jb2RlKGluZm8uX2F1dGhrZXksIFVURl84KSkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLSAgICB9Ci0KLSAgICByZXMuc2V0Q29udGVudFR5cGUodHlwZSk7Ci0gICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKFVURl84KTsKLSAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIiwgImF0dGFjaG1lbnQiKTsKLSAgICBzZW5kKHJlcSwgcmVzLCBidWYudG9CeXRlQXJyYXkoKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICBDdXJyZW50VXNlciB1c2VyID0gdXNlclByb3ZpZGVyLmdldCgpOwotICAgIGlmICghKHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcikpIHsKLSAgICAgIHNlbmRFcnJvcihyZXMsIFNDX1VOQVVUSE9SSVpFRCwgIkFQSSByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIFBhcnNlZEJvZHkgYm9keTsKLSAgICBpZiAoSlNPTl9UWVBFLmVxdWFscyhyZXEuZ2V0Q29udGVudFR5cGUoKSkpIHsKLSAgICAgIGJvZHkgPSBwYXJzZUpzb24ocmVxLCByZXMpOwotICAgIH0gZWxzZSBpZiAoRk9STV9FTkNPREVELmVxdWFscyhyZXEuZ2V0Q29udGVudFR5cGUoKSkpIHsKLSAgICAgIGJvZHkgPSBwYXJzZUZvcm0ocmVxLCByZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzZW5kRXJyb3IocmVzLCBTQ19CQURfUkVRVUVTVCwgU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAiRXhwZWN0ZWQgQ29udGVudC1UeXBlOiAlcyBvciAlcyIsCi0gICAgICAgICAgSlNPTl9UWVBFLCBGT1JNX0VOQ09ERUQpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYm9keSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShib2R5Ll9hdXRoa2V5KSkgewotICAgICAgU3RyaW5nIGggPSByZXEuZ2V0SGVhZGVyKEFVVEhLRVlfSEVBREVSKTsKLSAgICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaCkpIHsKLSAgICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsIFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAiRXhwZWN0ZWQgJXMgaW4gcmVxdWVzdCBib2R5IG9yICVzIGluIEhUVFAgaGVhZGVycyIsCi0gICAgICAgICAgICBBVVRIS0VZX05BTUUsIEFVVEhLRVlfSEVBREVSKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJvZHkuX2F1dGhrZXkgPSBVUkxEZWNvZGVyLmRlY29kZShoLCBVVEZfOCk7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIHZlcmlmaWVyLnZlcmlmeSgKLSAgICAgICAgICAoKElkZW50aWZpZWRVc2VyKSB1c2VyKS5nZXRBY2NvdW50SWQoKSwKLSAgICAgICAgICBjb21wdXRlVXJsKHJlcSksCi0gICAgICAgICAgYm9keS5fYXV0aGtleSk7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFRva2VuRXhjZXB0aW9uIGVycikgewotICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsCi0gICAgICAgICAgU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBvciBleHBpcmVkICVzIiwgQVVUSEtFWV9OQU1FKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZG9SZXF1ZXN0KGJvZHkucmVxLCByZXMsIGJvZHkuanNvbik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBQYXJzZWRCb2R5IHBhcnNlSnNvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIEpzb25FbGVtZW50IGVsZW1lbnQgPSBuZXcgSnNvblBhcnNlcigpLnBhcnNlKHJlcS5nZXRSZWFkZXIoKSk7Ci0gICAgICBpZiAoIWVsZW1lbnQuaXNKc29uT2JqZWN0KCkpIHsKLSAgICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsICJFeHBlY3RlZCBKU09OIG9iamVjdCBpbiByZXF1ZXN0IGJvZHkiKTsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIFBhcnNlZEJvZHkgYm9keSA9IG5ldyBQYXJzZWRCb2R5KCk7Ci0gICAgICBib2R5LnJlcSA9IHJlcTsKLSAgICAgIGJvZHkuanNvbiA9IChKc29uT2JqZWN0KSBlbGVtZW50OwotICAgICAgSnNvbkVsZW1lbnQgYXV0aEtleSA9IGJvZHkuanNvbi5yZW1vdmUoQVVUSEtFWV9OQU1FKTsKLSAgICAgIGlmIChhdXRoS2V5ICE9IG51bGwKLSAgICAgICAgICAmJiBhdXRoS2V5LmlzSnNvblByaW1pdGl2ZSgpCi0gICAgICAgICAgJiYgYXV0aEtleS5nZXRBc0pzb25QcmltaXRpdmUoKS5pc1N0cmluZygpKSB7Ci0gICAgICAgIGJvZHkuX2F1dGhrZXkgPSBhdXRoS2V5LmdldEFzU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYm9keTsKLSAgICB9IGNhdGNoIChKc29uUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgc2VuZEVycm9yKHJlcywgU0NfQkFEX1JFUVVFU1QsICJJbnZhbGlkIEpTT04gb2JqZWN0IGluIHJlcXVlc3QgYm9keSIpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgUGFyc2VkQm9keSBwYXJzZUZvcm0oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKLSAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFBhcnNlZEJvZHkgYm9keSA9IG5ldyBQYXJzZWRCb2R5KCk7Ci0gICAgYm9keS5yZXEgPSBuZXcgV3JhcHBlZFJlcXVlc3QocmVxKTsKLSAgICBib2R5Ll9hdXRoa2V5ID0gcmVxLmdldFBhcmFtZXRlcihBVVRIS0VZX05BTUUpOwotICAgIHJldHVybiBib2R5OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXB1dGVVcmwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgIFN0cmluZ0J1ZmZlciB1cmwgPSByZXEuZ2V0UmVxdWVzdFVSTCgpOwotICAgIFN0cmluZyBxcyA9IHJlcS5nZXRRdWVyeVN0cmluZygpOwotICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KHFzKSkgewotICAgICAgdXJsLmFwcGVuZCgnPycpLmFwcGVuZChxcyk7Ci0gICAgfQotICAgIHJldHVybiB1cmwudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFRva2VuSW5mbyB7Ci0gICAgU3RyaW5nIF9hdXRoa2V5OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyc2VkQm9keSB7Ci0gICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcTsKLSAgICBTdHJpbmcgX2F1dGhrZXk7Ci0gICAgSnNvbk9iamVjdCBqc29uOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHBlZFJlcXVlc3QgZXh0ZW5kcyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyIHsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICAgIHByaXZhdGUgTWFwIHBhcmFtZXRlcnM7Ci0KLSAgICBXcmFwcGVkUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7Ci0gICAgICBzdXBlcihyZXEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgICBpZiAoQVVUSEtFWV9OQU1FLmVxdWFscyhuYW1lKSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdXBlci5nZXRQYXJhbWV0ZXIobmFtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZ1tdIGdldFBhcmFtZXRlclZhbHVlcyhTdHJpbmcgbmFtZSkgewotICAgICAgaWYgKEFVVEhLRVlfTkFNRS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0UGFyYW1ldGVyVmFsdWVzKG5hbWUpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcCBnZXRQYXJhbWV0ZXJNYXAoKSB7Ci0gICAgICBNYXAgbSA9IHBhcmFtZXRlcnM7Ci0gICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgIG0gPSBzdXBlci5nZXRQYXJhbWV0ZXJNYXAoKTsKLSAgICAgICAgaWYgKG0uY29udGFpbnNLZXkoQVVUSEtFWV9OQU1FKSkgewotICAgICAgICAgIG0gPSBNYXBzLm5ld0hhc2hNYXAobSk7Ci0gICAgICAgICAgbS5yZW1vdmUoQVVUSEtFWV9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBwYXJhbWV0ZXJzID0gbTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVudW1lcmF0aW9uIGdldFBhcmFtZXRlck5hbWVzKCkgewotICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5hc0VudW1lcmF0aW9uKGdldFBhcmFtZXRlck1hcCgpLmtleVNldCgpLml0ZXJhdG9yKCkpOwotICAgIH0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9VcmxNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1VybE1vZHVsZS5qYXZhCmluZGV4IGE3ZmRlOWIuLmI5M2RmNDMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1VybE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1VybE1vZHVsZS5qYXZhCkBAIC0yNCwxMCArMjQsMTEgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXcuU3NoSW5mb1NlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmF3LlN0YXRpY1NlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmF3LlRvb2xTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50LkFjY291bnRDYXBhYmlsaXRpZXNTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50LkFjY291bnRzUmVzdEFwaVNlcnZsZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZS5DaGFuZ2VzUmVzdEFwaVNlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZS5EZXByZWNhdGVkQ2hhbmdlUXVlcnlTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2UuTGlzdENoYW5nZXNTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0Lkxpc3RQcm9qZWN0c1NlcnZsZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmdyb3VwLkdyb3Vwc1Jlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0LlByb2plY3RzUmVzdEFwaVNlcnZsZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKQEAgLTM5LDYgKzQwLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zZXJ2bGV0LlNlcnZsZXRNb2R1bGU7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtNTcsOSArNTksMTEgQEAKICAgfQogCiAgIHByaXZhdGUgZmluYWwgVXJsQ29uZmlnIGNmZzsKKyAgcHJpdmF0ZSBHZXJyaXRVaU9wdGlvbnMgdWlPcHRpb25zOwogCi0gIFVybE1vZHVsZShVcmxDb25maWcgY2ZnKSB7CisgIFVybE1vZHVsZShVcmxDb25maWcgY2ZnLCBHZXJyaXRVaU9wdGlvbnMgdWlPcHRpb25zKSB7CiAgICAgdGhpcy5jZmcgPSBjZmc7CisgICAgdGhpcy51aU9wdGlvbnMgPSB1aU9wdGlvbnM7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTY3LDkgKzcxLDExIEBACiAgICAgZmlsdGVyKCIvKiIpLnRocm91Z2goS2V5LmdldChDYWNoZUNvbnRyb2xGaWx0ZXIuY2xhc3MpKTsKICAgICBiaW5kKEtleS5nZXQoQ2FjaGVDb250cm9sRmlsdGVyLmNsYXNzKSkuaW4oU0lOR0xFVE9OKTsKIAotICAgIHNlcnZlKCIvIikud2l0aChIb3N0UGFnZVNlcnZsZXQuY2xhc3MpOwotICAgIHNlcnZlKCIvR2Vycml0Iikud2l0aChMZWdhY3lHZXJyaXRTZXJ2bGV0LmNsYXNzKTsKLSAgICBzZXJ2ZSgiL0dlcnJpdC8qIikud2l0aChsZWdhY3lHZXJyaXRTY3JlZW4oKSk7CisgICAgaWYgKHVpT3B0aW9ucy5lbmFibGVEZWZhdWx0VWkoKSkgeworICAgICAgc2VydmUoIi8iKS53aXRoKEhvc3RQYWdlU2VydmxldC5jbGFzcyk7CisgICAgICBzZXJ2ZSgiL0dlcnJpdCIpLndpdGgoTGVnYWN5R2Vycml0U2VydmxldC5jbGFzcyk7CisgICAgICBzZXJ2ZSgiL0dlcnJpdC8qIikud2l0aChsZWdhY3lHZXJyaXRTY3JlZW4oKSk7CisgICAgfQogICAgIHNlcnZlKCIvY2F0LyoiKS53aXRoKENhdFNlcnZsZXQuY2xhc3MpOwogICAgIHNlcnZlKCIvbG9nb3V0Iikud2l0aChIdHRwTG9nb3V0U2VydmxldC5jbGFzcyk7CiAgICAgc2VydmUoIi9zaWdub3V0Iikud2l0aChIdHRwTG9nb3V0U2VydmxldC5jbGFzcyk7CkBAIC05NCw5ICsxMDAsMTAgQEAKICAgICBzZXJ2ZVJlZ2V4KCJeL3IvKC4rKS8/JCIpLndpdGgoRGlyZWN0Q2hhbmdlQnlDb21taXQuY2xhc3MpOwogCiAgICAgZmlsdGVyKCIvYS8qIikudGhyb3VnaChSZXF1aXJlSWRlbnRpZmllZFVzZXJGaWx0ZXIuY2xhc3MpOwotICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2FjY291bnRzL3NlbGYvY2FwYWJpbGl0aWVzJCIpLndpdGgoQWNjb3VudENhcGFiaWxpdGllc1NlcnZsZXQuY2xhc3MpOwotICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2NoYW5nZXMvJCIpLndpdGgoTGlzdENoYW5nZXNTZXJ2bGV0LmNsYXNzKTsKLSAgICBzZXJ2ZVJlZ2V4KCJeLyg/OmEvKT9wcm9qZWN0cy8oLiopPyQiKS53aXRoKExpc3RQcm9qZWN0c1NlcnZsZXQuY2xhc3MpOworICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2FjY291bnRzLyguKikkIikud2l0aChBY2NvdW50c1Jlc3RBcGlTZXJ2bGV0LmNsYXNzKTsKKyAgICBzZXJ2ZVJlZ2V4KCJeLyg/OmEvKT9jaGFuZ2VzLyguKikkIikud2l0aChDaGFuZ2VzUmVzdEFwaVNlcnZsZXQuY2xhc3MpOworICAgIHNlcnZlUmVnZXgoIl4vKD86YS8pP2dyb3Vwcy8oLiopPyQiKS53aXRoKEdyb3Vwc1Jlc3RBcGlTZXJ2bGV0LmNsYXNzKTsKKyAgICBzZXJ2ZVJlZ2V4KCJeLyg/OmEvKT9wcm9qZWN0cy8oLiopPyQiKS53aXRoKFByb2plY3RzUmVzdEFwaVNlcnZsZXQuY2xhc3MpOwogCiAgICAgaWYgKGNmZy5kZXByZWNhdGVkUXVlcnkpIHsKICAgICAgIHNlcnZlKCIvcXVlcnkiKS53aXRoKERlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuY2xhc3MpOwpAQCAtMTQ4LDcgKzE1NSwxMSBAQAogICAgICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBDaGFuZ2UuSWQgaWQgPSBDaGFuZ2UuSWQucGFyc2UocmVxLmdldFBhdGhJbmZvKCkpOworICAgICAgICAgIFN0cmluZyBpZFN0cmluZyA9IHJlcS5nZXRQYXRoSW5mbygpOworICAgICAgICAgIGlmIChpZFN0cmluZy5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBpZFN0cmluZyA9IGlkU3RyaW5nLnN1YnN0cmluZygwLCBpZFN0cmluZy5sZW5ndGgoKSAtIDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBDaGFuZ2UuSWQgaWQgPSBDaGFuZ2UuSWQucGFyc2UoaWRTdHJpbmcpOwogICAgICAgICAgIHRvR2Vycml0KFBhZ2VMaW5rcy50b0NoYW5nZShpZCksIHJlcSwgcnNwKTsKICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGVycikgewogICAgICAgICAgIHJzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwpAQCAtMTczLDggKzE4NCw5IEBACiAgICAgICAgIHdoaWxlIChuYW1lLmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChuYW1lLmVuZHNXaXRoKCIuZ2l0IikpIHsKLSAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDQpOworICAgICAgICBpZiAobmFtZS5lbmRzV2l0aChDb25zdGFudHMuRE9UX0dJVF9FWFQpKSB7CisgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIC8vCisgICAgICAgICAgICAgIG5hbWUubGVuZ3RoKCkgLSBDb25zdGFudHMuRE9UX0dJVF9FWFQubGVuZ3RoKCkpOwogICAgICAgICB9CiAgICAgICAgIHdoaWxlIChuYW1lLmVuZHNXaXRoKCIvIikpIHsKICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViTW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJNb2R1bGUuamF2YQppbmRleCAxYTQ4YmI1Li5mN2JhNmRmIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJNb2R1bGUuamF2YQpAQCAtMTQsMTEgKzE0LDEzIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzLlNJTkdMRVRPTjsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uUHJpdmF0ZUludGVybmFsc19EeW5hbWljVHlwZXMucmVnaXN0ZXJJblBhcmVudEluamVjdG9yczsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzLlNJTkdMRVRPTjsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdlcnJpdENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmJlY29tZS5CZWNvbWVBbnlBY2NvdW50TG9naW5TZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aS5XZWJVaVBsdWdpbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmJlY29tZS5CZWNvbWVBbnlBY2NvdW50TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGguY29udGFpbmVyLkh0dHBBdXRoTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGguY29udGFpbmVyLkh0dHBzQ2xpZW50U3NsQ2VydE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmxkYXAuTGRhcEF1dGhNb2R1bGU7CkBAIC0yNyw4ICsyOSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ21kTGluZVBhcnNlck1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUmVtb3RlUGVlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DaGFuZ2VVc2VyTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5DbGVhclBhc3N3b3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkdlbmVyYXRlUGFzc3dvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOwpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0UmVxdWVzdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29udGFjdC5Db250YWN0U3RvcmU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbnRhY3QuQ29udGFjdFN0b3JlUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Bc3luY1JlY2VpdmVDb21taXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLkd1aWNlUmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwpAQCAtNDQsNyArNDUsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zZXJ2bGV0LlJlcXVlc3RTY29wZWQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3Quc2VydmxldC5TZXJ2bGV0TW9kdWxlOwogCiBpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIApAQCAtNTUsMTUgKzU1LDE4IEBACiAgIHByaXZhdGUgZmluYWwgVXJsTW9kdWxlLlVybENvbmZpZyB1cmxDb25maWc7CiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB3YW50U1NMOwogICBwcml2YXRlIGZpbmFsIEdpdFdlYkNvbmZpZyBnaXRXZWJDb25maWc7CisgIHByaXZhdGUgZmluYWwgR2Vycml0VWlPcHRpb25zIHVpT3B0aW9uczsKIAogICBASW5qZWN0CiAgIFdlYk1vZHVsZShmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWcsCiAgICAgICBmaW5hbCBVcmxNb2R1bGUuVXJsQ29uZmlnIHVybENvbmZpZywKICAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFN0cmluZyBjYW5vbmljYWxVcmwsCisgICAgICBHZXJyaXRVaU9wdGlvbnMgdWlPcHRpb25zLAogICAgICAgZmluYWwgSW5qZWN0b3IgY3JlYXRpbmdJbmplY3RvcikgewogICAgIHRoaXMuYXV0aENvbmZpZyA9IGF1dGhDb25maWc7CiAgICAgdGhpcy51cmxDb25maWcgPSB1cmxDb25maWc7CiAgICAgdGhpcy53YW50U1NMID0gY2Fub25pY2FsVXJsICE9IG51bGwgJiYgY2Fub25pY2FsVXJsLnN0YXJ0c1dpdGgoImh0dHBzOiIpOworICAgIHRoaXMudWlPcHRpb25zID0gdWlPcHRpb25zOwogCiAgICAgdGhpcy5naXRXZWJDb25maWcgPQogICAgICAgICBjcmVhdGluZ0luamVjdG9yLmNyZWF0ZUNoaWxkSW5qZWN0b3IobmV3IEFic3RyYWN0TW9kdWxlKCkgewpAQCAtOTksMTIgKzEwMiw3IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgICBjYXNlIERFVkVMT1BNRU5UX0JFQ09NRV9BTllfQUNDT1VOVDoKLSAgICAgICAgaW5zdGFsbChuZXcgU2VydmxldE1vZHVsZSgpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKLSAgICAgICAgICAgIHNlcnZlKCIvYmVjb21lIikud2l0aChCZWNvbWVBbnlBY2NvdW50TG9naW5TZXJ2bGV0LmNsYXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOworICAgICAgICBpbnN0YWxsKG5ldyBCZWNvbWVBbnlBY2NvdW50TW9kdWxlKCkpOwogICAgICAgICBicmVhazsKIAogICAgICAgY2FzZSBPUEVOSUQ6CkBAIC0xMTYsNyArMTE0LDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgbG9naW5UeXBlOiAiICsgYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpKTsKICAgICB9CiAKLSAgICBpbnN0YWxsKG5ldyBVcmxNb2R1bGUodXJsQ29uZmlnKSk7CisgICAgaW5zdGFsbChuZXcgVXJsTW9kdWxlKHVybENvbmZpZywgdWlPcHRpb25zKSk7CiAgICAgaW5zdGFsbChuZXcgVWlScGNNb2R1bGUoKSk7CiAgICAgaW5zdGFsbChuZXcgR2Vycml0UmVxdWVzdE1vZHVsZSgpKTsKICAgICBpbnN0YWxsKG5ldyBHaXRPdmVySHR0cFNlcnZsZXQuTW9kdWxlKCkpOwpAQCAtMTMwLDExICsxMjgsMTAgQEAKICAgICAgICAgU0lOR0xFVE9OKTsKICAgICBiaW5kKEdlcnJpdENvbmZpZ1Byb3ZpZGVyLmNsYXNzKTsKICAgICBiaW5kKEdlcnJpdENvbmZpZy5jbGFzcykudG9Qcm92aWRlcihHZXJyaXRDb25maWdQcm92aWRlci5jbGFzcyk7CisgICAgRHluYW1pY1NldC5zZXRPZihiaW5kZXIoKSwgV2ViVWlQbHVnaW4uY2xhc3MpOwogCi0gICAgYmluZChBY2NvdW50TWFuYWdlci5jbGFzcyk7Ci0gICAgYmluZChDaGFuZ2VVc2VyTmFtZS5DdXJyZW50VXNlci5jbGFzcyk7Ci0gICAgZmFjdG9yeShDaGFuZ2VVc2VyTmFtZS5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KENsZWFyUGFzc3dvcmQuRmFjdG9yeS5jbGFzcyk7CisgICAgaW5zdGFsbChuZXcgQXN5bmNSZWNlaXZlQ29tbWl0cy5Nb2R1bGUoKSk7CiAgICAgaW5zdGFsbChuZXcgQ21kTGluZVBhcnNlck1vZHVsZSgpKTsKICAgICBmYWN0b3J5KEdlbmVyYXRlUGFzc3dvcmQuRmFjdG9yeS5jbGFzcyk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb24uamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb24uamF2YQppbmRleCA0NDkyMGE0OC4uMzM0OWNjMSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU2Vzc2lvbi5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb24uamF2YQpAQCAtMTYsMjcgKzE2LDIzIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFjY2Vzc1BhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhNZXRob2Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlc3VsdDsKIAogcHVibGljIGludGVyZmFjZSBXZWJTZXNzaW9uIHsKLSAgcHVibGljIEF1dGhNZXRob2QgZ2V0QXV0aE1ldGhvZCgpOwotCiAgIHB1YmxpYyBib29sZWFuIGlzU2lnbmVkSW4oKTsKLQotICBwdWJsaWMgU3RyaW5nIGdldFRva2VuKCk7Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNUb2tlblZhbGlkKFN0cmluZyBpbnB1dFRva2VuKTsKLQorICBwdWJsaWMgU3RyaW5nIGdldFhHZXJyaXRBdXRoKCk7CisgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRYR2Vycml0QXV0aChTdHJpbmcga2V5SW4pOwogICBwdWJsaWMgQWNjb3VudEV4dGVybmFsSWQuS2V5IGdldExhc3RMb2dpbkV4dGVybmFsSWQoKTsKLQogICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKTsKLQotICBwdWJsaWMgdm9pZCBsb2dpbihBdXRoUmVzdWx0IHJlcywgQXV0aE1ldGhvZCBtZXRoLCBib29sZWFuIHJlbWVtYmVyTWUpOworICBwdWJsaWMgdm9pZCBsb2dpbihBdXRoUmVzdWx0IHJlcywgYm9vbGVhbiByZW1lbWJlck1lKTsKIAogICAvKiogU2V0IHRoZSB1c2VyIGFjY291bnQgZm9yIHRoaXMgY3VycmVudCByZXF1ZXN0IG9ubHkuICovCi0gIHB1YmxpYyB2b2lkIHNldFVzZXJBY2NvdW50SWQoQWNjb3VudC5JZCBpZCwgQXV0aE1ldGhvZCBtZXRob2QpOworICBwdWJsaWMgdm9pZCBzZXRVc2VyQWNjb3VudElkKEFjY291bnQuSWQgaWQpOworICBwdWJsaWMgYm9vbGVhbiBpc0FjY2Vzc1BhdGhPayhBY2Nlc3NQYXRoIHBhdGgpOworICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NQYXRoT2soQWNjZXNzUGF0aCBwYXRoLCBib29sZWFuIG9rKTsKIAogICBwdWJsaWMgdm9pZCBsb2dvdXQoKTsKKyAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKTsKIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb25NYW5hZ2VyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJTZXNzaW9uTWFuYWdlci5qYXZhCmluZGV4IDRiNGVkZjQuLmE1MzM4ZjggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNlc3Npb25NYW5hZ2VyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU2Vzc2lvbk1hbmFnZXIuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5IT1VSUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSU5VVEVTOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CkBAIC0zNiw2ICszNyw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lZDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTQ3LDYgKzUwLDcgQEAKIAogQFNpbmdsZXRvbgogY2xhc3MgV2ViU2Vzc2lvbk1hbmFnZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoV2ViU2Vzc2lvbk1hbmFnZXIuY2xhc3MpOwogICBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX05BTUUgPSAid2ViX3Nlc3Npb25zIjsKIAogICBzdGF0aWMgbG9uZyBub3coKSB7CkBAIC02MywxMiArNjcsMjIgQEAKICAgICBwcm5nID0gbmV3IFNlY3VyZVJhbmRvbSgpOwogICAgIHNlbGYgPSBjYWNoZTsKIAotICAgIHNlc3Npb25NYXhBZ2VNaWxsaXMgPSBNSU5VVEVTLnRvTWlsbGlzKENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY2ZnLAorICAgIHNlc3Npb25NYXhBZ2VNaWxsaXMgPSBTRUNPTkRTLnRvTWlsbGlzKENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY2ZnLAogICAgICAgICAiY2FjaGUiLCBDQUNIRV9OQU1FLCAibWF4QWdlIiwKLSAgICAgICAgTUFYX0FHRV9NSU5VVEVTLCBNSU5VVEVTKSk7CisgICAgICAgIFNFQ09ORFMuY29udmVydChNQVhfQUdFX01JTlVURVMsIE1JTlVURVMpLCBTRUNPTkRTKSk7CisgICAgaWYgKHNlc3Npb25NYXhBZ2VNaWxsaXMgPCBNSU5VVEVTLnRvTWlsbGlzKDUpKSB7CisgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJjYWNoZS4lcy5tYXhBZ2UgaXMgc2V0IHRvICVkIG1pbGxpc2Vjb25kczsiICsKKyAgICAgICAgICAiIGl0IHNob3VsZCBiZSBhdCBsZWFzdCA1IG1pbnV0ZXMuIiwKKyAgICAgICAgICBDQUNIRV9OQU1FLCBzZXNzaW9uTWF4QWdlTWlsbGlzKSk7CisgICAgfQogICB9CiAKICAgS2V5IGNyZWF0ZUtleShmaW5hbCBBY2NvdW50LklkIHdobykgeworICAgIHJldHVybiBuZXcgS2V5KG5ld1VuaXF1ZVRva2VuKHdobykpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbmV3VW5pcXVlVG9rZW4oZmluYWwgQWNjb3VudC5JZCB3aG8pIHsKICAgICB0cnkgewogICAgICAgZmluYWwgaW50IG5vbmNlTGVuID0gMjA7CiAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmOwpAQCAtODAsNyArOTQsNyBAQAogICAgICAgd3JpdGVWYXJJbnQzMihidWYsIHdoby5nZXQoKSk7CiAgICAgICB3cml0ZUJ5dGVzKGJ1Ziwgcm5kKTsKIAotICAgICAgcmV0dXJuIG5ldyBLZXkoQ29va2llQmFzZTY0LmVuY29kZShidWYudG9CeXRlQXJyYXkoKSkpOworICAgICAgcmV0dXJuIENvb2tpZUJhc2U2NC5lbmNvZGUoYnVmLnRvQnl0ZUFycmF5KCkpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgcHJvZHVjZSBuZXcgYWNjb3VudCBjb29raWUiLCBlKTsKICAgICB9CkBAIC05MCwxMyArMTA0LDExIEBACiAgICAgZmluYWwgQWNjb3VudC5JZCB3aG8gPSB2YWwuZ2V0QWNjb3VudElkKCk7CiAgICAgZmluYWwgYm9vbGVhbiByZW1lbWJlciA9IHZhbC5pc1BlcnNpc3RlbnRDb29raWUoKTsKICAgICBmaW5hbCBBY2NvdW50RXh0ZXJuYWxJZC5LZXkgbGFzdExvZ2luID0gdmFsLmdldEV4dGVybmFsSWQoKTsKLSAgICBmaW5hbCBTdHJpbmcgeHNyZlRva2VuID0gdmFsLmdldFhzcmZUb2tlbigpOwotCi0gICAgcmV0dXJuIGNyZWF0ZVZhbChrZXksIHdobywgcmVtZW1iZXIsIGxhc3RMb2dpbiwgeHNyZlRva2VuKTsKKyAgICByZXR1cm4gY3JlYXRlVmFsKGtleSwgd2hvLCByZW1lbWJlciwgbGFzdExvZ2luLCB2YWwuc2Vzc2lvbklkLCB2YWwuYXV0aCk7CiAgIH0KIAogICBWYWwgY3JlYXRlVmFsKGZpbmFsIEtleSBrZXksIGZpbmFsIEFjY291bnQuSWQgd2hvLCBmaW5hbCBib29sZWFuIHJlbWVtYmVyLAotICAgICAgZmluYWwgQWNjb3VudEV4dGVybmFsSWQuS2V5IGxhc3RMb2dpbiwgU3RyaW5nIHhzcmZUb2tlbikgeworICAgICAgZmluYWwgQWNjb3VudEV4dGVybmFsSWQuS2V5IGxhc3RMb2dpbiwgU3RyaW5nIHNpZCwgU3RyaW5nIGF1dGgpIHsKICAgICAvLyBSZWZyZXNoIHRoZSBjb29raWUgZXZlcnkgaG91ciBvciB3aGVuIGl0IGlzIGhhbGYtZXhwaXJlZC4KICAgICAvLyBUaGlzIHJlZHVjZXMgdGhlIG9kZHMgdGhhdCB0aGUgdXNlciBzZXNzaW9uIHdpbGwgYmUga2lja2VkCiAgICAgLy8gZWFybHkgYnV0IGFsc28gYXZvaWRzIHVzIG5lZWRpbmcgdG8gcmVmcmVzaCB0aGUgY29va2llIG9uCkBAIC0xMDgsMTggKzEyMCwxNCBAQAogICAgIGZpbmFsIGxvbmcgbm93ID0gbm93KCk7CiAgICAgZmluYWwgbG9uZyByZWZyZXNoQ29va2llQXQgPSBub3cgKyByZWZyZXNoOwogICAgIGZpbmFsIGxvbmcgZXhwaXJlc0F0ID0gbm93ICsgc2Vzc2lvbk1heEFnZU1pbGxpczsKLQotICAgIGlmICh4c3JmVG9rZW4gPT0gbnVsbCkgewotICAgICAgLy8gSWYgd2UgZG9uJ3QgeWV0IGhhdmUgYSB0b2tlbiBmb3IgdGhpcyBzZXNzaW9uLCBlc3RhYmxpc2ggb25lLgotICAgICAgLy8KLSAgICAgIGZpbmFsIGludCBub25jZUxlbiA9IDIwOwotICAgICAgZmluYWwgYnl0ZVtdIHJuZCA9IG5ldyBieXRlW25vbmNlTGVuXTsKLSAgICAgIHBybmcubmV4dEJ5dGVzKHJuZCk7Ci0gICAgICB4c3JmVG9rZW4gPSBDb29raWVCYXNlNjQuZW5jb2RlKHJuZCk7CisgICAgaWYgKHNpZCA9PSBudWxsKSB7CisgICAgICBzaWQgPSBuZXdVbmlxdWVUb2tlbih3aG8pOworICAgIH0KKyAgICBpZiAoYXV0aCA9PSBudWxsKSB7CisgICAgICBhdXRoID0gbmV3VW5pcXVlVG9rZW4od2hvKTsKICAgICB9CiAKLSAgICBWYWwgdmFsID0gbmV3IFZhbCh3aG8sIHJlZnJlc2hDb29raWVBdCwgcmVtZW1iZXIsCi0gICAgICAgIGxhc3RMb2dpbiwgeHNyZlRva2VuLCBleHBpcmVzQXQpOworICAgIFZhbCB2YWwgPSBuZXcgVmFsKHdobywgcmVmcmVzaENvb2tpZUF0LCByZW1lbWJlciwgbGFzdExvZ2luLCBleHBpcmVzQXQsIHNpZCwgYXV0aCk7CiAgICAgc2VsZi5wdXQoa2V5LnRva2VuLCB2YWwpOwogICAgIHJldHVybiB2YWw7CiAgIH0KQEAgLTE4MiwxOSArMTkwLDIwIEBACiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyByZWZyZXNoQ29va2llQXQ7CiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBwZXJzaXN0ZW50Q29va2llOwogICAgIHByaXZhdGUgdHJhbnNpZW50IEFjY291bnRFeHRlcm5hbElkLktleSBleHRlcm5hbElkOwotICAgIHByaXZhdGUgdHJhbnNpZW50IFN0cmluZyB4c3JmVG9rZW47CiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgbG9uZyBleHBpcmVzQXQ7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIHNlc3Npb25JZDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgYXV0aDsKIAogICAgIFZhbChmaW5hbCBBY2NvdW50LklkIGFjY291bnRJZCwgZmluYWwgbG9uZyByZWZyZXNoQ29va2llQXQsCiAgICAgICAgIGZpbmFsIGJvb2xlYW4gcGVyc2lzdGVudENvb2tpZSwgZmluYWwgQWNjb3VudEV4dGVybmFsSWQuS2V5IGV4dGVybmFsSWQsCi0gICAgICAgIGZpbmFsIFN0cmluZyB4c3JmVG9rZW4sCi0gICAgICAgIGZpbmFsIGxvbmcgZXhwaXJlc0F0KSB7CisgICAgICAgIGZpbmFsIGxvbmcgZXhwaXJlc0F0LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLCBmaW5hbCBTdHJpbmcgYXV0aCkgewogICAgICAgdGhpcy5hY2NvdW50SWQgPSBhY2NvdW50SWQ7CiAgICAgICB0aGlzLnJlZnJlc2hDb29raWVBdCA9IHJlZnJlc2hDb29raWVBdDsKICAgICAgIHRoaXMucGVyc2lzdGVudENvb2tpZSA9IHBlcnNpc3RlbnRDb29raWU7CiAgICAgICB0aGlzLmV4dGVybmFsSWQgPSBleHRlcm5hbElkOwotICAgICAgdGhpcy54c3JmVG9rZW4gPSB4c3JmVG9rZW47CiAgICAgICB0aGlzLmV4cGlyZXNBdCA9IGV4cGlyZXNBdDsKKyAgICAgIHRoaXMuc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgdGhpcy5hdXRoID0gYXV0aDsKICAgICB9CiAKICAgICBBY2NvdW50LklkIGdldEFjY291bnRJZCgpIHsKQEAgLTIwNSw2ICsyMTQsMTQgQEAKICAgICAgIHJldHVybiBleHRlcm5hbElkOwogICAgIH0KIAorICAgIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7CisgICAgICByZXR1cm4gc2Vzc2lvbklkOworICAgIH0KKworICAgIFN0cmluZyBnZXRBdXRoKCkgeworICAgICAgcmV0dXJuIGF1dGg7CisgICAgfQorCiAgICAgYm9vbGVhbiBuZWVkc0Nvb2tpZVJlZnJlc2goKSB7CiAgICAgICByZXR1cm4gcmVmcmVzaENvb2tpZUF0IDw9IG5vdygpOwogICAgIH0KQEAgLTIxMywxMCArMjMwLDYgQEAKICAgICAgIHJldHVybiBwZXJzaXN0ZW50Q29va2llOwogICAgIH0KIAotICAgIFN0cmluZyBnZXRYc3JmVG9rZW4oKSB7Ci0gICAgICByZXR1cm4geHNyZlRva2VuOwotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChmaW5hbCBPYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIDEpOwogICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIGFjY291bnRJZC5nZXQoKSk7CkBAIC0yMzIsMTIgKzI0NSwxOSBAQAogICAgICAgICB3cml0ZVN0cmluZyhvdXQsIGV4dGVybmFsSWQuZ2V0KCkpOwogICAgICAgfQogCi0gICAgICB3cml0ZVZhckludDMyKG91dCwgNSk7Ci0gICAgICB3cml0ZVN0cmluZyhvdXQsIHhzcmZUb2tlbik7CisgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKKyAgICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIDUpOworICAgICAgICB3cml0ZVN0cmluZyhvdXQsIHNlc3Npb25JZCk7CisgICAgICB9CiAKICAgICAgIHdyaXRlVmFySW50MzIob3V0LCA2KTsKICAgICAgIHdyaXRlRml4SW50NjQob3V0LCBleHBpcmVzQXQpOwogCisgICAgICBpZiAoYXV0aCAhPSBudWxsKSB7CisgICAgICAgIHdyaXRlVmFySW50MzIob3V0LCA3KTsKKyAgICAgICAgd3JpdGVTdHJpbmcob3V0LCBhdXRoKTsKKyAgICAgIH0KKwogICAgICAgd3JpdGVWYXJJbnQzMihvdXQsIDApOwogICAgIH0KIApAQCAtMjYwLDExICsyODAsMTQgQEAKICAgICAgICAgICAgIGV4dGVybmFsSWQgPSBuZXcgQWNjb3VudEV4dGVybmFsSWQuS2V5KHJlYWRTdHJpbmcoaW4pKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHhzcmZUb2tlbiA9IHJlYWRTdHJpbmcoaW4pOworICAgICAgICAgICAgc2Vzc2lvbklkID0gcmVhZFN0cmluZyhpbik7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICBleHBpcmVzQXQgPSByZWFkRml4SW50NjQoaW4pOwogICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgYXV0aCA9IHJlYWRTdHJpbmcoaW4pOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5rbm93biB0YWcgZm91bmQgaW4gb2JqZWN0OiAiICsgdGFnKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU3NoR2x1ZU1vZHVsZS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViU3NoR2x1ZU1vZHVsZS5qYXZhCmluZGV4IDgyZTlkYTcuLmViMDY2MTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL1dlYlNzaEdsdWVNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJTc2hHbHVlTW9kdWxlLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hLZXlDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CkBAIC0yOSwxOCArMjgsMTQgQEAKICAqLwogcHVibGljIGNsYXNzIFdlYlNzaEdsdWVNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3NoSW5mbz4gc3NoSW5mb1Byb3ZpZGVyOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFNzaEtleUNhY2hlPiBzc2hLZXlDYWNoZVByb3ZpZGVyOwogCiAgIEBJbmplY3QKLSAgV2ViU3NoR2x1ZU1vZHVsZShQcm92aWRlcjxTc2hJbmZvPiBzc2hJbmZvUHJvdmlkZXIsCi0gICAgICBQcm92aWRlcjxTc2hLZXlDYWNoZT4gc3NoS2V5Q2FjaGVQcm92aWRlcikgeworICBXZWJTc2hHbHVlTW9kdWxlKFByb3ZpZGVyPFNzaEluZm8+IHNzaEluZm9Qcm92aWRlcikgewogICAgIHRoaXMuc3NoSW5mb1Byb3ZpZGVyID0gc3NoSW5mb1Byb3ZpZGVyOwotICAgIHRoaXMuc3NoS2V5Q2FjaGVQcm92aWRlciA9IHNzaEtleUNhY2hlUHJvdmlkZXI7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgIGJpbmQoU3NoSW5mby5jbGFzcykudG9Qcm92aWRlcihzc2hJbmZvUHJvdmlkZXIpOwotICAgIGJpbmQoU3NoS2V5Q2FjaGUuY2xhc3MpLnRvUHJvdmlkZXIoc3NoS2V5Q2FjaGVQcm92aWRlcik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQuamF2YQppbmRleCAwODIxNDk2Li4yOGUzNjFjIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2JlY29tZS9CZWNvbWVBbnlBY2NvdW50TG9naW5TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9iZWNvbWUvQmVjb21lQW55QWNjb3VudExvZ2luU2VydmxldC5qYXZhCkBAIC0xNiwxNyArMTYsMjAgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQuU0NIRU1FX1VTRVJOQU1FOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQudGVtcGxhdGUuU2l0ZUhlYWRlckZvb3RlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CkBAIC01MiwyMCArNTUsMjQgQEAKIAogQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCiBAU2luZ2xldG9uCi1wdWJsaWMgY2xhc3MgQmVjb21lQW55QWNjb3VudExvZ2luU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKK2NsYXNzIEJlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfREVWID0gQm9vbGVhbi5nZXRCb29sZWFuKCJHZXJyaXQuR3d0RGV2TW9kZSIpOwogCiAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb247CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgU2l0ZUhlYWRlckZvb3RlciBoZWFkZXJzOwogCiAgIEBJbmplY3QKICAgQmVjb21lQW55QWNjb3VudExvZ2luU2VydmxldChmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3cywKICAgICAgIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNmLAotICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYW0sIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICBmaW5hbCBBY2NvdW50TWFuYWdlciBhbSwKKyAgICAgIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LAorICAgICAgU2l0ZUhlYWRlckZvb3RlciBzaGYpIHsKICAgICB3ZWJTZXNzaW9uID0gd3M7CiAgICAgc2NoZW1hID0gc2Y7CiAgICAgYWNjb3VudE1hbmFnZXIgPSBhbTsKKyAgICBoZWFkZXJzID0gc2hmOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC03Nyw5ICs4NCw3IEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewotICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAKICAgICBmaW5hbCBBdXRoUmVzdWx0IHJlczsKICAgICBpZiAoImNyZWF0ZV9hY2NvdW50Ii5lcXVhbHMocmVxLmdldFBhcmFtZXRlcigiYWN0aW9uIikpKSB7CkBAIC0xMTQsOSArMTE5LDExIEBACiAgICAgfQogCiAgICAgaWYgKHJlcyAhPSBudWxsKSB7Ci0gICAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKHJlcywgQXV0aE1ldGhvZC5CQUNLRE9PUiwgZmFsc2UpOworICAgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihyZXMsIGZhbHNlKTsKICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcmRyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIHJkci5hcHBlbmQocmVxLmdldENvbnRleHRQYXRoKCkpOworICAgICAgcmRyLmFwcGVuZChPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgICBTdHJpbmdzLmVtcHR5VG9OdWxsKHJlcS5nZXRDb250ZXh0UGF0aCgpKSwKKyAgICAgICAgICAiLyIpKTsKICAgICAgIGlmIChJU19ERVYgJiYgcmVxLmdldFBhcmFtZXRlcigiZ3d0LmNvZGVzdnIiKSAhPSBudWxsKSB7CiAgICAgICAgIGlmIChyZHIuaW5kZXhPZigiPyIpIDwgMCkgewogICAgICAgICAgIHJkci5hcHBlbmQoIj8iKTsKQEAgLTE0NywxMiArMTU0LDEyIEBACiAKICAgcHJpdmF0ZSBieXRlW10gcHJlcGFyZUh0bWxPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CiAgICAgZmluYWwgU3RyaW5nIHBhZ2VOYW1lID0gIkJlY29tZUFueUFjY291bnQuaHRtbCI7Ci0gICAgZmluYWwgRG9jdW1lbnQgZG9jID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKGdldENsYXNzKCksIHBhZ2VOYW1lKTsKKyAgICBEb2N1bWVudCBkb2MgPSBoZWFkZXJzLnBhcnNlKGdldENsYXNzKCksIHBhZ2VOYW1lKTsKICAgICBpZiAoZG9jID09IG51bGwpIHsKICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIk5vICIgKyBwYWdlTmFtZSArICIgaW4gd2ViYXBwIik7CiAgICAgfQogICAgIGlmICghSVNfREVWKSB7Ci0gICAgICBmaW5hbCBFbGVtZW50IGRldm1vZGUgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgImdlcnJpdF9nd3RkZXZtb2RlIik7CisgICAgICBmaW5hbCBFbGVtZW50IGRldm1vZGUgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgImd3dGRldm1vZGUiKTsKICAgICAgIGlmIChkZXZtb2RlICE9IG51bGwpIHsKICAgICAgICAgZGV2bW9kZS5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZGV2bW9kZSk7CiAgICAgICB9CkBAIC0xNjYsNyArMTczLDcgQEAKICAgICAgICAgU3RyaW5nIGRpc3BsYXlOYW1lOwogICAgICAgICBpZiAoYS5nZXRVc2VyTmFtZSgpICE9IG51bGwpIHsKICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGEuZ2V0VXNlck5hbWUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChhLmdldEZ1bGxOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICB9IGVsc2UgaWYgKGEuZ2V0RnVsbE5hbWUoKSAhPSBudWxsICYmICFhLmdldEZ1bGxOYW1lKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgZGlzcGxheU5hbWUgPSBhLmdldEZ1bGxOYW1lKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoYS5nZXRQcmVmZXJyZWRFbWFpbCgpICE9IG51bGwpIHsKICAgICAgICAgICBkaXNwbGF5TmFtZSA9IGEuZ2V0UHJlZmVycmVkRW1haWwoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnRNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTJhNDI1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9iZWNvbWUvQmVjb21lQW55QWNjb3VudE1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmJlY29tZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuU2VydmxldE1vZHVsZTsKKworcHVibGljIGNsYXNzIEJlY29tZUFueUFjY291bnRNb2R1bGUgZXh0ZW5kcyBTZXJ2bGV0TW9kdWxlIHsKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNlcnZsZXRzKCkgeworICAgIHNlcnZlKCIvbG9naW4iLCAiL2xvZ2luLyoiKS53aXRoKEJlY29tZUFueUFjY291bnRMb2dpblNlcnZsZXQuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aEZpbHRlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cEF1dGhGaWx0ZXIuamF2YQppbmRleCBlYjhhNzZiLi5hZGNhOTVlIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aEZpbHRlci5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBBdXRoRmlsdGVyLmphdmEKQEAgLTE0LDE0ICsxNCwyNCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGguY29udGFpbmVyOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0cy5maXJzdE5vbk51bGw7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5ncy5lbXB0eVRvTnVsbDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24ubmV0Lkh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT047CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZC5TQ0hFTUVfR0VSUklUOworCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuSHRtbERvbVV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViU2Vzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXcuSG9zdFBhZ2VTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50RXh0ZXJuYWxJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuUlBDU2VydmxldFV0aWxzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTY0OworCiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKQEAgLTI5LDcgKzM5LDYgQEAKIGltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKIGltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOwogaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CiBpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CiBpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CkBAIC00OCwxNCArNTcsMTUgQEAKICAqLwogQFNpbmdsZXRvbgogY2xhc3MgSHR0cEF1dGhGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb247CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gc2Vzc2lvblByb3ZpZGVyOwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzaWduSW5SYXc7CiAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIHNpZ25Jbkd6aXA7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvZ2luSGVhZGVyOwogCiAgIEBJbmplY3QKICAgSHR0cEF1dGhGaWx0ZXIoZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbiwKLSAgICAgIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRoaXMud2ViU2Vzc2lvbiA9IHdlYlNlc3Npb247CisgICAgICBmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgdGhpcy5zZXNzaW9uUHJvdmlkZXIgPSB3ZWJTZXNzaW9uOwogCiAgICAgZmluYWwgU3RyaW5nIHBhZ2VOYW1lID0gIkxvZ2luUmVkaXJlY3QuaHRtbCI7CiAgICAgZmluYWwgU3RyaW5nIGRvYyA9IEh0bWxEb21VdGlsLnJlYWRGaWxlKGdldENsYXNzKCksIHBhZ2VOYW1lKTsKQEAgLTY1LDEzICs3NSwxOCBAQAogCiAgICAgc2lnbkluUmF3ID0gZG9jLmdldEJ5dGVzKEh0bWxEb21VdGlsLkVOQyk7CiAgICAgc2lnbkluR3ppcCA9IEh0bWxEb21VdGlsLmNvbXByZXNzKHNpZ25JblJhdyk7CisgICAgbG9naW5IZWFkZXIgPSBmaXJzdE5vbk51bGwoCisgICAgICAgIGVtcHR5VG9OdWxsKGF1dGhDb25maWcuZ2V0TG9naW5IdHRwSGVhZGVyKCkpLAorICAgICAgICBBVVRIT1JJWkFUSU9OKTsKICAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAogICAgICAgZmluYWwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBGaWx0ZXJDaGFpbiBjaGFpbikKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7Ci0gICAgaWYgKCF3ZWJTZXNzaW9uLmdldCgpLmlzU2lnbmVkSW4oKSkgeworICAgIGlmIChpc1Nlc3Npb25WYWxpZCgoSHR0cFNlcnZsZXRSZXF1ZXN0KSByZXF1ZXN0KSkgeworICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0gZWxzZSB7CiAgICAgICAvLyBOb3Qgc2lnbmVkIGluIHlldC4gU2luY2UgdGhlIGJyb3dzZXIgc3RhdGUgbWlnaHQgaGF2ZSBhbiBhbmNob3IKICAgICAgIC8vIHRva2VuIHdoaWNoIHdlIHdhbnQgdG8gY2FwdHVyZSBhbmQgY2FycnkgdGhyb3VnaCB0aGUgYXV0aCBwcm9jZXNzCiAgICAgICAvLyB3ZSBzZW5kIGJhY2sgSmF2YVNjcmlwdCBub3cgdG8gY2FwdHVyZSB0aGF0LCBhbmQgZG8gdGhlIHJlYWwgd29yawpAQCAtODcsOSArMTAyLDcgQEAKICAgICAgICAgdG9zZW5kID0gc2lnbkluUmF3OwogICAgICAgfQogCi0gICAgICByc3Auc2V0SGVhZGVyKCJFeHBpcmVzIiwgIkZyaSwgMDEgSmFuIDE5ODAgMDA6MDA6MDAgR01UIik7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgICAgcnNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKICAgICAgIHJzcC5zZXRDaGFyYWN0ZXJFbmNvZGluZyhIdG1sRG9tVXRpbC5FTkMpOwogICAgICAgcnNwLnNldENvbnRlbnRMZW5ndGgodG9zZW5kLmxlbmd0aCk7CkBAIC05OSwxMyArMTEyLDcyIEBACiAgICAgICB9IGZpbmFsbHkgewogICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLy8gQWxyZWFkeSBzaWduZWQgaW4sIGZvcndhcmQgdGhlIHJlcXVlc3QuCi0gICAgICAvLwotICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOwogICAgIH0KICAgfQogCisgIHByaXZhdGUgYm9vbGVhbiBpc1Nlc3Npb25WYWxpZChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgV2ViU2Vzc2lvbiBzZXNzaW9uID0gc2Vzc2lvblByb3ZpZGVyLmdldCgpOworICAgIGlmIChzZXNzaW9uLmlzU2lnbmVkSW4oKSkgeworICAgICAgU3RyaW5nIHVzZXIgPSBnZXRSZW1vdGVVc2VyKHJlcSk7CisgICAgICByZXR1cm4gdXNlciA9PSBudWxsIHx8IGNvcnJlY3RVc2VyKHVzZXIsIHNlc3Npb24pOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvcnJlY3RVc2VyKFN0cmluZyB1c2VyLCBXZWJTZXNzaW9uIHNlc3Npb24pIHsKKyAgICBBY2NvdW50RXh0ZXJuYWxJZC5LZXkgaWQgPSBzZXNzaW9uLmdldExhc3RMb2dpbkV4dGVybmFsSWQoKTsKKyAgICByZXR1cm4gaWQgIT0gbnVsbAorICAgICAgICAmJiBpZC5lcXVhbHMobmV3IEFjY291bnRFeHRlcm5hbElkLktleShTQ0hFTUVfR0VSUklULCB1c2VyKSk7CisgIH0KKworICBTdHJpbmcgZ2V0UmVtb3RlVXNlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgaWYgKEFVVEhPUklaQVRJT04uZXF1YWxzKGxvZ2luSGVhZGVyKSkgeworICAgICAgU3RyaW5nIHVzZXIgPSBlbXB0eVRvTnVsbChyZXEuZ2V0UmVtb3RlVXNlcigpKTsKKyAgICAgIGlmICh1c2VyICE9IG51bGwpIHsKKyAgICAgICAgLy8gVGhlIGNvbnRhaW5lciBwZXJmb3JtZWQgdGhlIGF1dGhlbnRpY2F0aW9uLCBhbmQgaGFzIHRoZSB1c2VyCisgICAgICAgIC8vIGlkZW50aXR5IGFscmVhZHkgZGVjb2RlZCBmb3IgdXMuIEhvbm9yIHRoYXQgYXMgd2UgaGF2ZSBiZWVuCisgICAgICAgIC8vIGNvbmZpZ3VyZWQgdG8gaG9ub3IgSFRUUCBhdXRoZW50aWNhdGlvbi4KKyAgICAgICAgcmV0dXJuIHVzZXI7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZSBjb250YWluZXIgZGlkbid0IGRvIHRoZSBhdXRoZW50aWNhdGlvbiB3ZSBtaWdodAorICAgICAgLy8gaGF2ZSBkb25lIGl0IGluIHRoZSBmcm9udC1lbmQgd2ViIHNlcnZlci4gVHJ5IHRvIHNwbGl0CisgICAgICAvLyB0aGUgaWRlbnRpdHkgb3V0IG9mIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBhbmQgaG9ub3IgaXQuCisgICAgICAvLworICAgICAgU3RyaW5nIGF1dGggPSBlbXB0eVRvTnVsbChyZXEuZ2V0SGVhZGVyKEFVVEhPUklaQVRJT04pKTsKKyAgICAgIGlmIChhdXRoID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgIH0gZWxzZSBpZiAoYXV0aC5zdGFydHNXaXRoKCJCYXNpYyAiKSkgeworICAgICAgICBhdXRoID0gYXV0aC5zdWJzdHJpbmcoIkJhc2ljICIubGVuZ3RoKCkpOworICAgICAgICBhdXRoID0gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlKGF1dGgpKTsKKyAgICAgICAgZmluYWwgaW50IGMgPSBhdXRoLmluZGV4T2YoJzonKTsKKyAgICAgICAgcmV0dXJuIGMgPiAwID8gYXV0aC5zdWJzdHJpbmcoMCwgYykgOiBudWxsOworCisgICAgICB9IGVsc2UgaWYgKGF1dGguc3RhcnRzV2l0aCgiRGlnZXN0ICIpKSB7CisgICAgICAgIGludCB1ID0gYXV0aC5pbmRleE9mKCJ1c2VybmFtZT1cIiIpOworICAgICAgICBpZiAodSA8PSAwKSB7CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgYXV0aCA9IGF1dGguc3Vic3RyaW5nKHUgKyAxMCk7CisgICAgICAgIGludCBlID0gYXV0aC5pbmRleE9mKCciJyk7CisgICAgICAgIHJldHVybiBlID4gMCA/IGF1dGguc3Vic3RyaW5nKDAsIGF1dGguaW5kZXhPZignIicpKSA6IG51bGw7CisKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBOb25zdGFuZGFyZCBIVFRQIGhlYWRlci4gV2UgaGF2ZSBiZWVuIHRvbGQgdG8gdHJ1c3QgdGhpcworICAgICAgLy8gaGVhZGVyIGJsaW5kbHkgYXMtaXMuCisgICAgICAvLworICAgICAgcmV0dXJuIGVtcHR5VG9OdWxsKHJlcS5nZXRIZWFkZXIobG9naW5IZWFkZXIpKTsKKyAgICB9CisgIH0KKworICBTdHJpbmcgZ2V0TG9naW5IZWFkZXIoKSB7CisgICAgcmV0dXJuIGxvZ2luSGVhZGVyOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgewogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aE1vZHVsZS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cEF1dGhNb2R1bGUuamF2YQppbmRleCA1NTNiMWY0Li5kYWFhN2UyIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwQXV0aE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBBdXRoTW9kdWxlLmphdmEKQEAgLTIxLDYgKzIxLDYgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNlcnZsZXRzKCkgewogICAgIGZpbHRlcigiLyIpLnRocm91Z2goSHR0cEF1dGhGaWx0ZXIuY2xhc3MpOwotICAgIHNlcnZlKCIvbG9naW4vKiIpLndpdGgoSHR0cExvZ2luU2VydmxldC5jbGFzcyk7CisgICAgc2VydmUoIi9sb2dpbiIsICIvbG9naW4vKiIpLndpdGgoSHR0cExvZ2luU2VydmxldC5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBMb2dpblNlcnZsZXQuamF2YQppbmRleCA5YjdlYWY1Li5mZTdhYTIzIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwTG9naW5TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cExvZ2luU2VydmxldC5qYXZhCkBAIC0xNSwyMCArMTUsMTggQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5jb250YWluZXI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkNhbm9uaWNhbFdlYlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5IdG1sRG9tVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5XZWJTZXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aE1ldGhvZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5CYXNlNjQ7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKQEAgLTU4LDIzICs1NiwyMCBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KICAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEh0dHBMb2dpblNlcnZsZXQuY2xhc3MpOwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJWkFUSU9OID0gIkF1dGhvcml6YXRpb24iOwogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb247Ci0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDYW5vbmljYWxXZWJVcmwgdXJsUHJvdmlkZXI7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGxvZ2luSGVhZGVyOworICBwcml2YXRlIGZpbmFsIEh0dHBBdXRoRmlsdGVyIGF1dGhGaWx0ZXI7CiAKICAgQEluamVjdAotICBIdHRwTG9naW5TZXJ2bGV0KGZpbmFsIEF1dGhDb25maWcgYXV0aENvbmZpZywKLSAgICAgIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb24sCi0gICAgICBAQ2Fub25pY2FsV2ViVXJsIEBOdWxsYWJsZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyLAotICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXIpIHsKKyAgSHR0cExvZ2luU2VydmxldChmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uLAorICAgICAgZmluYWwgQ2Fub25pY2FsV2ViVXJsIHVybFByb3ZpZGVyLAorICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXIsCisgICAgICBmaW5hbCBIdHRwQXV0aEZpbHRlciBhdXRoRmlsdGVyKSB7CiAgICAgdGhpcy53ZWJTZXNzaW9uID0gd2ViU2Vzc2lvbjsKICAgICB0aGlzLnVybFByb3ZpZGVyID0gdXJsUHJvdmlkZXI7CiAgICAgdGhpcy5hY2NvdW50TWFuYWdlciA9IGFjY291bnRNYW5hZ2VyOwotCi0gICAgZmluYWwgU3RyaW5nIGhkciA9IGF1dGhDb25maWcuZ2V0TG9naW5IdHRwSGVhZGVyKCk7Ci0gICAgdGhpcy5sb2dpbkhlYWRlciA9IGhkciAhPSBudWxsICYmICFoZHIuZXF1YWxzKCIiKSA/IGhkciA6IEFVVEhPUklaQVRJT047CisgICAgdGhpcy5hdXRoRmlsdGVyID0gYXV0aEZpbHRlcjsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtODYsMTkgKzgxLDE2IEBACiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgcnNwLnNldEhlYWRlcigiRXhwaXJlcyIsICJGcmksIDAxIEphbiAxOTgwIDAwOjAwOjAwIEdNVCIpOwotICAgIHJzcC5zZXRIZWFkZXIoIlByYWdtYSIsICJuby1jYWNoZSIpOwotICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOwotCi0gICAgZmluYWwgU3RyaW5nIHVzZXIgPSBnZXRSZW1vdGVVc2VyKHJlcSk7CisgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOworICAgIGZpbmFsIFN0cmluZyB1c2VyID0gYXV0aEZpbHRlci5nZXRSZW1vdGVVc2VyKHJlcSk7CiAgICAgaWYgKHVzZXIgPT0gbnVsbCB8fCAiIi5lcXVhbHModXNlcikpIHsKLSAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSB1c2VyIGJ5ICIgKyBsb2dpbkhlYWRlcgorICAgICAgbG9nLmVycm9yKCJVbmFibGUgdG8gYXV0aGVudGljYXRlIHVzZXIgYnkgIiArIGF1dGhGaWx0ZXIuZ2V0TG9naW5IZWFkZXIoKQogICAgICAgICAgICsgIiByZXF1ZXN0IGhlYWRlci4gIENoZWNrIGNvbnRhaW5lciBvciBzZXJ2ZXIgY29uZmlndXJhdGlvbi4iKTsKIAogICAgICAgZmluYWwgRG9jdW1lbnQgZG9jID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKCAvLwogICAgICAgICAgIEh0dHBMb2dpblNlcnZsZXQuY2xhc3MsICJDb25maWd1cmF0aW9uRXJyb3IuaHRtbCIpOwogCi0gICAgICByZXBsYWNlKGRvYywgImxvZ2luSGVhZGVyIiwgbG9naW5IZWFkZXIpOworICAgICAgcmVwbGFjZShkb2MsICJsb2dpbkhlYWRlciIsIGF1dGhGaWx0ZXIuZ2V0TG9naW5IZWFkZXIoKSk7CiAgICAgICByZXBsYWNlKGRvYywgIlNlcnZlck5hbWUiLCByZXEuZ2V0U2VydmVyTmFtZSgpKTsKICAgICAgIHJlcGxhY2UoZG9jLCAiU2VydmVyUG9ydCIsICI6IiArIHJlcS5nZXRTZXJ2ZXJQb3J0KCkpOwogICAgICAgcmVwbGFjZShkb2MsICJDb250ZXh0UGF0aCIsIHJlcS5nZXRDb250ZXh0UGF0aCgpKTsKQEAgLTEyOSwxNSArMTIxLDE0IEBACiAgICAgfQogCiAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByZHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIHJkci5hcHBlbmQodXJsUHJvdmlkZXIuZ2V0KCkpOworICAgIHJkci5hcHBlbmQodXJsUHJvdmlkZXIuZ2V0KHJlcSkpOwogICAgIHJkci5hcHBlbmQoJyMnKTsKICAgICBpZiAoYXJzcC5pc05ldygpICYmICF0b2tlbi5zdGFydHNXaXRoKFBhZ2VMaW5rcy5SRUdJU1RFUiArICIvIikpIHsKICAgICAgIHJkci5hcHBlbmQoUGFnZUxpbmtzLlJFR0lTVEVSKTsKICAgICB9CiAgICAgcmRyLmFwcGVuZCh0b2tlbik7CiAKLSAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKGFyc3AsIEF1dGhNZXRob2QuQ09PS0lFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBwZXJzaXN0ZW50IGNvb2tpZSAqLyk7CisgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCB0cnVlIC8qIHBlcnNpc3RlbnQgY29va2llICovKTsKICAgICByc3Auc2VuZFJlZGlyZWN0KHJkci50b1N0cmluZygpKTsKICAgfQogCkBAIC0xNzMsNTAgKzE2NCw0IEBACiAgICAgfQogICAgIHJldHVybiB0b2tlbjsKICAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJlbW90ZVVzZXIoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgIGlmIChBVVRIT1JJWkFUSU9OLmVxdWFscyhsb2dpbkhlYWRlcikpIHsKLSAgICAgIGZpbmFsIFN0cmluZyB1c2VyID0gcmVxLmdldFJlbW90ZVVzZXIoKTsKLSAgICAgIGlmICh1c2VyICE9IG51bGwgJiYgISIiLmVxdWFscyh1c2VyKSkgewotICAgICAgICAvLyBUaGUgY29udGFpbmVyIHBlcmZvcm1lZCB0aGUgYXV0aGVudGljYXRpb24sIGFuZCBoYXMgdGhlIHVzZXIKLSAgICAgICAgLy8gaWRlbnRpdHkgYWxyZWFkeSBkZWNvZGVkIGZvciB1cy4gSG9ub3IgdGhhdCBhcyB3ZSBoYXZlIGJlZW4KLSAgICAgICAgLy8gY29uZmlndXJlZCB0byBob25vciBIVFRQIGF1dGhlbnRpY2F0aW9uLgotICAgICAgICAvLwotICAgICAgICByZXR1cm4gdXNlcjsKLSAgICAgIH0KLQotICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBkaWRuJ3QgZG8gdGhlIGF1dGhlbnRpY2F0aW9uIHdlIG1pZ2h0Ci0gICAgICAvLyBoYXZlIGRvbmUgaXQgaW4gdGhlIGZyb250LWVuZCB3ZWIgc2VydmVyLiBUcnkgdG8gc3BsaXQKLSAgICAgIC8vIHRoZSBpZGVudGl0eSBvdXQgb2YgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGFuZCBob25vciBpdC4KLSAgICAgIC8vCi0gICAgICBTdHJpbmcgYXV0aCA9IHJlcS5nZXRIZWFkZXIoQVVUSE9SSVpBVElPTik7Ci0gICAgICBpZiAoYXV0aCA9PSBudWxsIHx8ICIiLmVxdWFscyhhdXRoKSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgfSBlbHNlIGlmIChhdXRoLnN0YXJ0c1dpdGgoIkJhc2ljICIpKSB7Ci0gICAgICAgIGF1dGggPSBhdXRoLnN1YnN0cmluZygiQmFzaWMgIi5sZW5ndGgoKSk7Ci0gICAgICAgIGF1dGggPSBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGUoYXV0aCkpOwotICAgICAgICBmaW5hbCBpbnQgYyA9IGF1dGguaW5kZXhPZignOicpOwotICAgICAgICByZXR1cm4gYyA+IDAgPyBhdXRoLnN1YnN0cmluZygwLCBjKSA6IG51bGw7Ci0KLSAgICAgIH0gZWxzZSBpZiAoYXV0aC5zdGFydHNXaXRoKCJEaWdlc3QgIikpIHsKLSAgICAgICAgZmluYWwgaW50IHUgPSBhdXRoLmluZGV4T2YoInVzZXJuYW1lPVwiIik7Ci0gICAgICAgIGlmICh1IDw9IDApIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBhdXRoID0gYXV0aC5zdWJzdHJpbmcodSArIDEwKTsKLSAgICAgICAgZmluYWwgaW50IGUgPSBhdXRoLmluZGV4T2YoJyInKTsKLSAgICAgICAgcmV0dXJuIGUgPiAwID8gYXV0aC5zdWJzdHJpbmcoMCwgYXV0aC5pbmRleE9mKCciJykpIDogbnVsbDsKLQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vbnN0YW5kYXJkIEhUVFAgaGVhZGVyLiBXZSBoYXZlIGJlZW4gdG9sZCB0byB0cnVzdCB0aGlzCi0gICAgICAvLyBoZWFkZXIgYmxpbmRseSBhcy1pcy4KLSAgICAgIC8vCi0gICAgICBmaW5hbCBTdHJpbmcgdXNlciA9IHJlcS5nZXRIZWFkZXIobG9naW5IZWFkZXIpOwotICAgICAgcmV0dXJuIHVzZXIgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKHVzZXIpID8gdXNlciA6IG51bGw7Ci0gICAgfQotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRBdXRoRmlsdGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRBdXRoRmlsdGVyLmphdmEKaW5kZXggZmYwZWIyOS4uYzg5MmM5ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvSHR0cHNDbGllbnRTc2xDZXJ0QXV0aEZpbHRlci5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydEF1dGhGaWx0ZXIuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoTWV0aG9kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXF1ZXN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtNDIsNyArNDEsNyBAQAogQFNpbmdsZXRvbgogY2xhc3MgSHR0cHNDbGllbnRTc2xDZXJ0QXV0aEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CiAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBSRUdFWF9VU0VSSUQgPSBQYXR0ZXJuLmNvbXBpbGUoIkNOPShbXixdKiksLioiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBSRUdFWF9VU0VSSUQgPSBQYXR0ZXJuLmNvbXBpbGUoIkNOPShbXixdKikiKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9CiAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSHR0cHNDbGllbnRTc2xDZXJ0QXV0aEZpbHRlci5jbGFzcyk7CiAKQEAgLTcxLDcgKzcwLDcgQEAKICAgICBTdHJpbmcgbmFtZSA9IGNlcnRzWzBdLmdldFN1YmplY3RETigpLmdldE5hbWUoKTsKICAgICBNYXRjaGVyIG0gPSBSRUdFWF9VU0VSSUQubWF0Y2hlcihuYW1lKTsKICAgICBTdHJpbmcgdXNlck5hbWU7Ci0gICAgaWYgKG0ubWF0Y2hlcygpKSB7CisgICAgaWYgKG0uZmluZCgpKSB7CiAgICAgICB1c2VyTmFtZSA9IG0uZ3JvdXAoMSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJDb3VsZG4ndCBleHRyYWN0IHVzZXJuYW1lIGZyb20geW91ciBjZXJ0aWZpY2F0ZSIpOwpAQCAtODUsNyArODQsNyBAQAogICAgICAgbG9nLmVycm9yKGVyciwgZSk7CiAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbihlcnIsIGUpOwogICAgIH0KLSAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKGFyc3AsIEF1dGhNZXRob2QuQ09PS0lFLCB0cnVlKTsKKyAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKGFyc3AsIHRydWUpOwogICAgIGNoYWluLmRvRmlsdGVyKHJlcSwgcnNwKTsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydExvZ2luU2VydmxldC5qYXZhCmluZGV4IGM1ZmExYmEuLmQ5NTg1YjkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydExvZ2luU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydExvZ2luU2VydmxldC5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwpAQCAtNTUsOSArNTYsNyBAQAogICAgIHJkci5hcHBlbmQoJyMnKTsKICAgICByZHIuYXBwZW5kKGdldFRva2VuKHJlcSkpOwogCi0gICAgcnNwLnNldEhlYWRlcigiRXhwaXJlcyIsICJGcmksIDAxIEphbiAxOTgwIDAwOjAwOjAwIEdNVCIpOwotICAgIHJzcC5zZXRIZWFkZXIoIlByYWdtYSIsICJuby1jYWNoZSIpOwotICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKICAgICByc3Auc2VuZFJlZGlyZWN0KHJkci50b1N0cmluZygpKTsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9IdHRwc0NsaWVudFNzbENlcnRNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydE1vZHVsZS5qYXZhCmluZGV4IDdkMzJhYzguLmVkZjUwMWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0h0dHBzQ2xpZW50U3NsQ2VydE1vZHVsZS5qYXZhCkBAIC0yMSw2ICsyMSw2IEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKICAgICBmaWx0ZXIoIi8iKS50aHJvdWdoKEh0dHBzQ2xpZW50U3NsQ2VydEF1dGhGaWx0ZXIuY2xhc3MpOwotICAgIHNlcnZlKCIvbG9naW4vKiIpLndpdGgoSHR0cHNDbGllbnRTc2xDZXJ0TG9naW5TZXJ2bGV0LmNsYXNzKTsKKyAgICBzZXJ2ZSgiL2xvZ2luIiwgIi9sb2dpbi8qIikud2l0aChIdHRwc0NsaWVudFNzbENlcnRMb2dpblNlcnZsZXQuY2xhc3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTGRhcEF1dGhNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9MZGFwQXV0aE1vZHVsZS5qYXZhCmluZGV4IGM0NmVkYzMuLmU3NjYzYmIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9MZGFwQXV0aE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9MZGFwQXV0aE1vZHVsZS5qYXZhCkBAIC0xNCwyMCArMTQsMTIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmxkYXA7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuUnBjU2VydmxldE1vZHVsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuVWlScGNNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3Quc2VydmxldC5TZXJ2bGV0TW9kdWxlOwogCi0vKiogUlBDIHN1cHBvcnQgcmVsYXRlZCB0byB1c2VybmFtZS9wYXNzd29yZCBMREFQIGF1dGhlbnRpY2F0aW9uLiAqLworLyoqIENvbmZpZ3VyZSB1c2VybmFtZS9wYXNzd29yZCBMREFQIGF1dGhlbnRpY2F0aW9uLiAqLwogcHVibGljIGNsYXNzIExkYXBBdXRoTW9kdWxlIGV4dGVuZHMgU2VydmxldE1vZHVsZSB7CiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKLSAgICBzZXJ2ZSgiL2xvZ2luLyoiKS53aXRoKExvZ2luUmVkaXJlY3RTZXJ2bGV0LmNsYXNzKTsKLSAgICBpbnN0YWxsKG5ldyBScGNTZXJ2bGV0TW9kdWxlKFVpUnBjTW9kdWxlLlBSRUZJWCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKLSAgICAgICAgcnBjKFVzZXJQYXNzQXV0aFNlcnZpY2VJbXBsLmNsYXNzKTsKLSAgICAgIH0KLSAgICB9KTsKKyAgICBzZXJ2ZSgiL2xvZ2luIiwgIi9sb2dpbi8qIikud2l0aChMZGFwTG9naW5TZXJ2bGV0LmNsYXNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9sZGFwL0xkYXBMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9MZGFwTG9naW5TZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyYTdkYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9MZGFwTG9naW5TZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmxkYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuQ2Fub25pY2FsV2ViVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQudGVtcGxhdGUuU2l0ZUhlYWRlckZvb3RlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRVc2VyTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkF1dGhlbnRpY2F0aW9uVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKiogSGFuZGxlcyB1c2VybmFtZS9wYXNzd29yZCBiYXNlZCBhdXRoZW50aWNhdGlvbiBhZ2FpbnN0IHRoZSBkaXJlY3RvcnkuICovCitAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKK0BTaW5nbGV0b24KK2NsYXNzIExkYXBMb2dpblNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5CisgICAgICAuZ2V0TG9nZ2VyKExkYXBMb2dpblNlcnZsZXQuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbjsKKyAgcHJpdmF0ZSBmaW5hbCBDYW5vbmljYWxXZWJVcmwgdXJsUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgU2l0ZUhlYWRlckZvb3RlciBoZWFkZXJzOworCisgIEBJbmplY3QKKyAgTGRhcExvZ2luU2VydmxldChBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlciwKKyAgICAgIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb24sCisgICAgICBDYW5vbmljYWxXZWJVcmwgdXJsUHJvdmlkZXIsCisgICAgICBTaXRlSGVhZGVyRm9vdGVyIGhlYWRlcnMpIHsKKyAgICB0aGlzLmFjY291bnRNYW5hZ2VyID0gYWNjb3VudE1hbmFnZXI7CisgICAgdGhpcy53ZWJTZXNzaW9uID0gd2ViU2Vzc2lvbjsKKyAgICB0aGlzLnVybFByb3ZpZGVyID0gdXJsUHJvdmlkZXI7CisgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBzZW5kRm9ybShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZXJyb3JNZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBzZWxmID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICBTdHJpbmcgY2FuY2VsID0gT2JqZWN0cy5maXJzdE5vbk51bGwodXJsUHJvdmlkZXIuZ2V0KHJlcSksICIvIik7CisgICAgU3RyaW5nIHRva2VuID0gZ2V0VG9rZW4ocmVxKTsKKyAgICBpZiAoIXRva2VuLmVxdWFscygiLyIpKSB7CisgICAgICBjYW5jZWwgKz0gIiMiICsgdG9rZW47CisgICAgfQorCisgICAgRG9jdW1lbnQgZG9jID0gaGVhZGVycy5wYXJzZShMZGFwTG9naW5TZXJ2bGV0LmNsYXNzLCAiTG9naW5Gb3JtLmh0bWwiKTsKKyAgICBIdG1sRG9tVXRpbC5maW5kKGRvYywgImhvc3ROYW1lIikuc2V0VGV4dENvbnRlbnQocmVxLmdldFNlcnZlck5hbWUoKSk7CisgICAgSHRtbERvbVV0aWwuZmluZChkb2MsICJsb2dpbl9mb3JtIikuc2V0QXR0cmlidXRlKCJhY3Rpb24iLCBzZWxmKTsKKyAgICBIdG1sRG9tVXRpbC5maW5kKGRvYywgImNhbmNlbF9saW5rIikuc2V0QXR0cmlidXRlKCJocmVmIiwgY2FuY2VsKTsKKworICAgIEVsZW1lbnQgZW1zZyA9IEh0bWxEb21VdGlsLmZpbmQoZG9jLCAiZXJyb3JfbWVzc2FnZSIpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZXJyb3JNZXNzYWdlKSkgeworICAgICAgZW1zZy5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZW1zZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGVtc2cuc2V0VGV4dENvbnRlbnQoZXJyb3JNZXNzYWdlKTsKKyAgICB9CisKKyAgICBieXRlW10gYmluID0gSHRtbERvbVV0aWwudG9VVEY4KGRvYyk7CisgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX1VOQVVUSE9SSVpFRCk7CisgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKKyAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7CisgICAgcmVzLnNldENvbnRlbnRMZW5ndGgoYmluLmxlbmd0aCk7CisgICAgU2VydmxldE91dHB1dFN0cmVhbSBvdXQgPSByZXMuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgdHJ5IHsKKyAgICAgIG91dC53cml0ZShiaW4pOworICAgIH0gZmluYWxseSB7CisgICAgICBvdXQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHNlbmRGb3JtKHJlcSwgcmVzLCBudWxsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFN0cmluZyB1c2VybmFtZSA9IFN0cmluZ3MubnVsbFRvRW1wdHkocmVxLmdldFBhcmFtZXRlcigidXNlcm5hbWUiKSkudHJpbSgpOworICAgIFN0cmluZyBwYXNzd29yZCA9IFN0cmluZ3MubnVsbFRvRW1wdHkocmVxLmdldFBhcmFtZXRlcigicGFzc3dvcmQiKSk7CisgICAgU3RyaW5nIHJlbWVtYmVyID0gU3RyaW5ncy5udWxsVG9FbXB0eShyZXEuZ2V0UGFyYW1ldGVyKCJyZW1lbWJlcm1lIikpOworICAgIGlmICh1c2VybmFtZS5pc0VtcHR5KCkgfHwgcGFzc3dvcmQuaXNFbXB0eSgpKSB7CisgICAgICBzZW5kRm9ybShyZXEsIHJlcywgIkludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQXV0aFJlcXVlc3QgYXJlcSA9IEF1dGhSZXF1ZXN0LmZvclVzZXIodXNlcm5hbWUpOworICAgIGFyZXEuc2V0UGFzc3dvcmQocGFzc3dvcmQpOworCisgICAgQXV0aFJlc3VsdCBhcmVzOworICAgIHRyeSB7CisgICAgICBhcmVzID0gYWNjb3VudE1hbmFnZXIuYXV0aGVudGljYXRlKGFyZXEpOworICAgIH0gY2F0Y2ggKEFjY291bnRVc2VyTmFtZUV4Y2VwdGlvbiBlKSB7CisgICAgICBzZW5kRm9ybShyZXEsIHJlcywgZS5nZXRNZXNzYWdlKCkpOworICAgICAgcmV0dXJuOworICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0aW9uVW5hdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgc2VuZEZvcm0ocmVxLCByZXMsICJBdXRoZW50aWNhdGlvbiB1bmF2YWlsYWJsZSBhdCB0aGlzIHRpbWUuIik7CisgICAgICByZXR1cm47CisgICAgfSBjYXRjaCAoQWNjb3VudEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuaW5mbyhTdHJpbmcuZm9ybWF0KCInJXMnIGZhaWxlZCB0byBzaWduIGluOiAlcyIsIHVzZXJuYW1lLCBlLmdldE1lc3NhZ2UoKSkpOworICAgICAgc2VuZEZvcm0ocmVxLCByZXMsICJJbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkLiIpOworICAgICAgcmV0dXJuOworICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJMREFQIGF1dGhlbnRpY2F0aW9uIGZhaWxlZCIsIGUpOworICAgICAgc2VuZEZvcm0ocmVxLCByZXMsICJBdXRoZW50aWNhdGlvbiB1bmF2YWlsYWJsZSBhdCB0aGlzIHRpbWUuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nQnVpbGRlciBkZXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBkZXN0LmFwcGVuZCh1cmxQcm92aWRlci5nZXQocmVxKSk7CisgICAgZGVzdC5hcHBlbmQoJyMnKTsKKyAgICBkZXN0LmFwcGVuZChnZXRUb2tlbihyZXEpKTsKKworICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocmVzKTsKKyAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKGFyZXMsICIxIi5lcXVhbHMocmVtZW1iZXIpKTsKKyAgICByZXMuc2VuZFJlZGlyZWN0KGRlc3QudG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VG9rZW4oZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIFN0cmluZyB0b2tlbiA9IHJlcS5nZXRQYXRoSW5mbygpOworICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmlzRW1wdHkoKSkgeworICAgICAgdG9rZW4gPSBQYWdlTGlua3MuTUlORTsKKyAgICB9IGVsc2UgaWYgKCF0b2tlbi5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgIHRva2VuID0gIi8iICsgdG9rZW47CisgICAgfQorICAgIHJldHVybiB0b2tlbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9sZGFwL0xvZ2luUmVkaXJlY3RTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTG9naW5SZWRpcmVjdFNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZTIyNy4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTG9naW5SZWRpcmVjdFNlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLmxkYXA7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLlNpZ25Jbk1vZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViU2Vzc2lvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLS8qKgotICogU2VydmxldCBib3VuZCB0byB7QGNvZGUgL2xvZ2luLyp9IHRvIHJlZGlyZWN0IGFmdGVyIHVzZXIvcGFzcyBzaWduLWluLgotICogPHA+Ci0gKiBUaGlzIHNlcnZsZXQgaXMgcmVxdWlyZWQgYmVjYXVzZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGlzIGRvbmUgb3ZlciBSUEMsIGJ1dCBpZgotICogdGhlIFJQQyBpcyBzdWNjZXNzZnVsIHdlIG5lZWQgdG8gZm9yY2UgdGhlIGhvc3QgcGFnZSB0byBmdWxseSByZWxvYWQgdG8gcGljawotICogdXAgdGhlIGFjY291bnQgaW5mb3JtYXRpb24sIGFzIHdlIGRvbid0IHN1cHBvcnQgdXBkYXRpbmcgdGhlIFVJIG9uIHRoZSBmbHkKLSAqIGFmdGVyIGEgc2lnbi1pbi4KLSAqLwotQFNpbmdsZXRvbgotY2xhc3MgTG9naW5SZWRpcmVjdFNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbjsKLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOwotCi0gIEBJbmplY3QKLSAgTG9naW5SZWRpcmVjdFNlcnZsZXQoZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbiwKLSAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXIpIHsKLSAgICB0aGlzLndlYlNlc3Npb24gPSB3ZWJTZXNzaW9uOwotICAgIHRoaXMudXJsUHJvdmlkZXIgPSB1cmxQcm92aWRlcjsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAotICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgU3RyaW5nIHRva2VuOwotICAgIGlmICh3ZWJTZXNzaW9uLmdldCgpLmlzU2lnbmVkSW4oKSkgewotICAgICAgdG9rZW4gPSBnZXRUb2tlbihyZXEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIlNlc3Npb24gY29va2llIG5vdCBhdmFpbGFibGUuIjsKLSAgICAgIHRva2VuID0gIi9TaWduSW5GYWlsdXJlLCIgKyBTaWduSW5Nb2RlLlNJR05fSU4gKyAiLCIgKyBtc2c7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nQnVpbGRlciByZHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIHJkci5hcHBlbmQodXJsUHJvdmlkZXIuZ2V0KCkpOwotICAgIHJkci5hcHBlbmQoJyMnKTsKLSAgICByZHIuYXBwZW5kKHRva2VuKTsKLQotICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKLSAgICByc3Auc2VuZFJlZGlyZWN0KHJkci50b1N0cmluZygpKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFRva2VuKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKLSAgICBTdHJpbmcgdG9rZW4gPSByZXEuZ2V0UGF0aEluZm8oKTsKLSAgICBpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5pc0VtcHR5KCkpIHsKLSAgICAgIHRva2VuID0gUGFnZUxpbmtzLk1JTkU7Ci0gICAgfSBlbHNlIGlmICghdG9rZW4uc3RhcnRzV2l0aCgiLyIpKSB7Ci0gICAgICB0b2tlbiA9ICIvIiArIHRva2VuOwotICAgIH0KLSAgICByZXR1cm4gdG9rZW47Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9Vc2VyUGFzc0F1dGhTZXJ2aWNlSW1wbC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9sZGFwL1VzZXJQYXNzQXV0aFNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGVjYmIuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9sZGFwL1VzZXJQYXNzQXV0aFNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5sZGFwOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgudXNlcnBhc3MuTG9naW5SZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgudXNlcnBhc3MuVXNlclBhc3NBdXRoU2VydmljZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5XZWJTZXNzaW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRNYW5hZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRVc2VyTmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoTWV0aG9kOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXF1ZXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguQXV0aGVudGljYXRpb25VbmF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWc7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Bc3luY0NhbGxiYWNrOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWNsYXNzIFVzZXJQYXNzQXV0aFNlcnZpY2VJbXBsIGltcGxlbWVudHMgVXNlclBhc3NBdXRoU2VydmljZSB7Ci0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbjsKLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50TWFuYWdlciBhY2NvdW50TWFuYWdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBBdXRoVHlwZSBhdXRoVHlwZTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQotICAgICAgLmdldExvZ2dlcihVc2VyUGFzc0F1dGhTZXJ2aWNlSW1wbC5jbGFzcyk7Ci0KLSAgQEluamVjdAotICBVc2VyUGFzc0F1dGhTZXJ2aWNlSW1wbChmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uLAotICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXIsIGZpbmFsIEF1dGhDb25maWcgYXV0aENvbmZpZykgewotICAgIHRoaXMud2ViU2Vzc2lvbiA9IHdlYlNlc3Npb247Ci0gICAgdGhpcy5hY2NvdW50TWFuYWdlciA9IGFjY291bnRNYW5hZ2VyOwotICAgIHRoaXMuYXV0aFR5cGUgPSBhdXRoQ29uZmlnLmdldEF1dGhUeXBlKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgYXV0aGVudGljYXRlKFN0cmluZyB1c2VybmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxMb2dpblJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBMb2dpblJlc3VsdCByZXN1bHQgPSBuZXcgTG9naW5SZXN1bHQoYXV0aFR5cGUpOwotICAgIGlmICh1c2VybmFtZSA9PSBudWxsIHx8ICIiLmVxdWFscyh1c2VybmFtZS50cmltKCkpIC8vCi0gICAgICAgIHx8IHBhc3N3b3JkID09IG51bGwgfHwgIiIuZXF1YWxzKHBhc3N3b3JkKSkgewotICAgICAgcmVzdWx0LnNldEVycm9yKExvZ2luUmVzdWx0LkVycm9yLklOVkFMSURfTE9HSU4pOwotICAgICAgY2FsbGJhY2sub25TdWNjZXNzKHJlc3VsdCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdXNlcm5hbWUgPSB1c2VybmFtZS50cmltKCk7Ci0KLSAgICBmaW5hbCBBdXRoUmVxdWVzdCByZXEgPSBBdXRoUmVxdWVzdC5mb3JVc2VyKHVzZXJuYW1lKTsKLSAgICByZXEuc2V0UGFzc3dvcmQocGFzc3dvcmQpOwotCi0gICAgZmluYWwgQXV0aFJlc3VsdCByZXM7Ci0gICAgdHJ5IHsKLSAgICAgIHJlcyA9IGFjY291bnRNYW5hZ2VyLmF1dGhlbnRpY2F0ZShyZXEpOwotICAgIH0gY2F0Y2ggKEFjY291bnRVc2VyTmFtZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBlbnRlcmVkIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgd2VyZSBjb3JyZWN0LCBidXQgdXNlciBuYW1lIGNvdWxkIG5vdCBiZQotICAgICAgLy8gc2V0IGZvciB0aGUgbmV3bHkgY3JlYXRlZCBhY2NvdW50IGFuZCB0aGlzIGlzIHdoeSB0aGUgbG9naW4gZmFpbHMsCi0gICAgICAvLyBlcnJvciBzY3JlZW4gd2l0aCBlcnJvciBtZXNzYWdlIHNob3VsZCBiZSBzaG93biB0byB0aGUgdXNlcgotICAgICAgY2FsbGJhY2sub25GYWlsdXJlKGUpOwotICAgICAgcmV0dXJuOwotICAgIH0gY2F0Y2ggKEF1dGhlbnRpY2F0aW9uVW5hdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgcmVzdWx0LnNldEVycm9yKExvZ2luUmVzdWx0LkVycm9yLkFVVEhFTlRJQ0FUSU9OX1VOQVZBSUxBQkxFKTsKLSAgICAgIGNhbGxiYWNrLm9uU3VjY2VzcyhyZXN1bHQpOwotICAgICAgcmV0dXJuOwotICAgIH0gY2F0Y2ggKEFjY291bnRFeGNlcHRpb24gZSkgewotICAgICAgbG9nLmluZm8oU3RyaW5nLmZvcm1hdCgiJyVzJyBmYWlsZWQgdG8gc2lnbiBpbjogJXMiLCB1c2VybmFtZSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgIHJlc3VsdC5zZXRFcnJvcihMb2dpblJlc3VsdC5FcnJvci5JTlZBTElEX0xPR0lOKTsKLSAgICAgIGNhbGxiYWNrLm9uU3VjY2VzcyhyZXN1bHQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlc3VsdC5zdWNjZXNzID0gdHJ1ZTsKLSAgICByZXN1bHQuaXNOZXcgPSByZXMuaXNOZXcoKTsKLSAgICB3ZWJTZXNzaW9uLmdldCgpLmxvZ2luKHJlcywgQXV0aE1ldGhvZC5QQVNTV09SRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogcGVyc2lzdGVudCBjb29raWUgKi8pOwotICAgIGNhbGxiYWNrLm9uU3VjY2VzcyhyZXN1bHQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0TG9nb1NlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRMb2dvU2VydmxldC5qYXZhCmluZGV4IDViYTFmMDkuLjQxYWE1NTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRMb2dvU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRMb2dvU2VydmxldC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmdpdHdlYjsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkdpdFdlYkNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIApAQCAtMzMsMTEgKzM0LDYgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQogQFNpbmdsZXRvbgogY2xhc3MgR2l0TG9nb1NlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUFYX0FHRSA9Ci0gICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCg1LCBUaW1lVW5pdC5NSU5VVEVTKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NUUkwgPQotICAgICAgInB1YmxpYywgbWF4LWFnZT0iICsgKE1BWF9BR0UgLyAxMDAwTCk7Ci0KICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1vZGlmaWVkOwogICBwcml2YXRlIGZpbmFsIGJ5dGVbXSByYXc7CiAKQEAgLTYwLDE2ICs1NiwxOCBAQAogICB9CiAKICAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBsb25nIGdldExhc3RNb2RpZmllZChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuIG1vZGlmaWVkOworICB9CisKKyAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBpZiAocmF3ICE9IG51bGwpIHsKLSAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICByc3Auc2V0Q29udGVudFR5cGUoImltYWdlL3BuZyIpOwogICAgICAgcnNwLnNldENvbnRlbnRMZW5ndGgocmF3Lmxlbmd0aCk7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgQ0FDSEVfQ1RSTCk7Ci0gICAgICByc3Auc2V0RGF0ZUhlYWRlcigiRGF0ZSIsIG5vdyk7Ci0gICAgICByc3Auc2V0RGF0ZUhlYWRlcigiRXhwaXJlcyIsIG5vdyArIE1BWF9BR0UpOwogICAgICAgcnNwLnNldERhdGVIZWFkZXIoIkxhc3QtTW9kaWZpZWQiLCBtb2RpZmllZCk7CisgICAgICBDYWNoZUhlYWRlcnMuc2V0Q2FjaGVhYmxlKHJlcSwgcnNwLCA1LCBUaW1lVW5pdC5NSU5VVEVTKTsKIAogICAgICAgZmluYWwgU2VydmxldE91dHB1dFN0cmVhbSBvcyA9IHJzcC5nZXRPdXRwdXRTdHJlYW0oKTsKICAgICAgIHRyeSB7CkBAIC03OCw2ICs3Niw3IEBACiAgICAgICAgIG9zLmNsb3NlKCk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKICAgICAgIHJzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdFdlYkNzc1NlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJDc3NTZXJ2bGV0LmphdmEKaW5kZXggZTM5Nzk2MS4uZGNjYTEwNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdFdlYkNzc1NlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViQ3NzU2VydmxldC5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuR2l0V2ViQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlJQQ1NlcnZsZXRVdGlsczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwpAQCAtNDksMTAgKzUwLDYgQEAKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTkMgPSAiVVRGLTgiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9BR0UgPQotICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoNSwgVGltZVVuaXQuTUlOVVRFUyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9DVFJMID0KLSAgICAgICJwdWJsaWMsIG1heC1hZ2U9IiArIChNQVhfQUdFIC8gMTAwMEwpOwogCiAgIHByaXZhdGUgZmluYWwgbG9uZyBtb2RpZmllZDsKICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gcmF3X2NzczsKQEAgLTg5LDcgKzg2LDYgQEAKICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGlmIChyYXdfY3NzICE9IG51bGwpIHsKLSAgICAgIGZpbmFsIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICByc3Auc2V0Q29udGVudFR5cGUoInRleHQvY3NzIik7CiAgICAgICByc3Auc2V0Q2hhcmFjdGVyRW5jb2RpbmcoRU5DKTsKICAgICAgIGZpbmFsIGJ5dGVbXSB0b1NlbmQ7CkBAIC0xMDAsMTAgKzk2LDggQEAKICAgICAgICAgdG9TZW5kID0gcmF3X2NzczsKICAgICAgIH0KICAgICAgIHJzcC5zZXRDb250ZW50TGVuZ3RoKHRvU2VuZC5sZW5ndGgpOwotICAgICAgcnNwLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsIENBQ0hFX0NUUkwpOwotICAgICAgcnNwLnNldERhdGVIZWFkZXIoIkRhdGUiLCBub3cpOwotICAgICAgcnNwLnNldERhdGVIZWFkZXIoIkV4cGlyZXMiLCBub3cgKyBNQVhfQUdFKTsKICAgICAgIHJzcC5zZXREYXRlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiwgbW9kaWZpZWQpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldENhY2hlYWJsZShyZXEsIHJzcCwgNSwgVGltZVVuaXQuTUlOVVRFUyk7CiAKICAgICAgIGZpbmFsIFNlcnZsZXRPdXRwdXRTdHJlYW0gb3MgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCk7CiAgICAgICB0cnkgewpAQCAtMTEyLDYgKzEwNiw3IEBACiAgICAgICAgIG9zLmNsb3NlKCk7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocnNwKTsKICAgICAgIHJzcC5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdFdlYkphdmFTY3JpcHRTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViSmF2YVNjcmlwdFNlcnZsZXQuamF2YQppbmRleCA2MWYzMmFjLi5kNzE3MzJhIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViSmF2YVNjcmlwdFNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViSmF2YVNjcmlwdFNlcnZsZXQuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5naXR3ZWI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5HaXRXZWJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKQEAgLTMzLDExICszNCw2IEBACiBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKIEBTaW5nbGV0b24KIGNsYXNzIEdpdFdlYkphdmFTY3JpcHRTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9BR0UgPQotICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoNSwgVGltZVVuaXQuTUlOVVRFUyk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9DVFJMID0KLSAgICAgICJwdWJsaWMsIG1heC1hZ2U9IiArIChNQVhfQUdFIC8gMTAwMEwpOwotCiAgIHByaXZhdGUgZmluYWwgbG9uZyBtb2RpZmllZDsKICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gcmF3OwogCkBAIC02OCwxMyArNjQsMTAgQEAKICAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGlmIChyYXcgIT0gbnVsbCkgewotICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgIHJzcC5zZXRDb250ZW50VHlwZSgidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICByc3Auc2V0Q29udGVudExlbmd0aChyYXcubGVuZ3RoKTsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCBDQUNIRV9DVFJMKTsKLSAgICAgIHJzcC5zZXREYXRlSGVhZGVyKCJEYXRlIiwgbm93KTsKLSAgICAgIHJzcC5zZXREYXRlSGVhZGVyKCJFeHBpcmVzIiwgbm93ICsgTUFYX0FHRSk7CiAgICAgICByc3Auc2V0RGF0ZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIsIG1vZGlmaWVkKTsKKyAgICAgIENhY2hlSGVhZGVycy5zZXRDYWNoZWFibGUocmVxLCByc3AsIDUsIFRpbWVVbml0Lk1JTlVURVMpOwogCiAgICAgICBmaW5hbCBTZXJ2bGV0T3V0cHV0U3RyZWFtIG9zID0gcnNwLmdldE91dHB1dFN0cmVhbSgpOwogICAgICAgdHJ5IHsKQEAgLTgzLDYgKzc2LDcgQEAKICAgICAgICAgb3MuY2xvc2UoKTsKICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgICAgcnNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvZ2l0d2ViL0dpdFdlYlNlcnZsZXQuamF2YQppbmRleCA2YzM3ZTQzLi5iYTdhNWI4IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9naXR3ZWIvR2l0V2ViU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2dpdHdlYi9HaXRXZWJTZXJ2bGV0LmphdmEKQEAgLTMwLDYgKzMwLDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuZ2l0d2ViOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2Vycml0Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuR2l0V2ViQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmxhdW5jaGVyLkdlcnJpdExhdW5jaGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwpAQCAtMzksNiArNDAsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKQEAgLTU4LDEwICs2MCw4IEBACiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMzg4LDE3ICszODgsMTQgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgdHJ5IHsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIlByYWdtYSIsICJuby1jYWNoZSIpOwotICAgICAgcnNwLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIik7CisgICAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAgICAgICBleGVjKHJlcSwgcnNwLCBwcm9qZWN0LCByZXBvKTsKICAgICB9IGZpbmFsbHkgewogICAgICAgcmVwby5jbG9zZSgpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycyhmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKQotICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CiAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGFpciA6IHJlcS5nZXRRdWVyeVN0cmluZygpLnNwbGl0KCJbJjtdIikpIHsKICAgICAgIGZpbmFsIGludCBlcSA9IHBhaXIuaW5kZXhPZignPScpOwpAQCAtNDA2LDggKzQwMyw4IEBACiAgICAgICAgIFN0cmluZyBuYW1lID0gcGFpci5zdWJzdHJpbmcoMCwgZXEpOwogICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYWlyLnN1YnN0cmluZyhlcSArIDEpOwogCi0gICAgICAgIG5hbWUgPSBVUkxEZWNvZGVyLmRlY29kZShuYW1lLCAiVVRGLTgiKTsKLSAgICAgICAgdmFsdWUgPSBVUkxEZWNvZGVyLmRlY29kZSh2YWx1ZSwgIlVURi04Iik7CisgICAgICAgIG5hbWUgPSBVcmwuZGVjb2RlKG5hbWUpOworICAgICAgICB2YWx1ZSA9IFVybC5kZWNvZGUodmFsdWUpOwogICAgICAgICBwYXJhbXMucHV0KG5hbWUsIHZhbHVlKTsKICAgICAgIH0KICAgICB9CkBAIC00MTksNyArNDE2LDggQEAKICAgICAgIGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBmaW5hbCBQcm9jZXNzIHByb2MgPQogICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKG5ldyBTdHJpbmdbXSB7Z2l0d2ViQ2dpLmdldEFic29sdXRlUGF0aCgpfSwKLSAgICAgICAgICAgIG1ha2VFbnYocmVxLCBwcm9qZWN0KSwgcmVwby5nZXREaXJlY3RvcnkoKSk7CisgICAgICAgICAgICBtYWtlRW52KHJlcSwgcHJvamVjdCksCisgICAgICAgICAgICBnaXR3ZWJDZ2kuZ2V0QWJzb2x1dGVGaWxlKCkuZ2V0UGFyZW50RmlsZSgpKTsKIAogICAgIGNvcHlTdGRlcnJUb0xvZyhwcm9jLmdldEVycm9yU3RyZWFtKCkpOwogICAgIGlmICgwIDwgcmVxLmdldENvbnRlbnRMZW5ndGgoKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcGx1Z2lucy9IdHRwQXV0b1JlZ2lzdGVyTW9kdWxlR2VuZXJhdG9yLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBBdXRvUmVnaXN0ZXJNb2R1bGVHZW5lcmF0b3IuamF2YQppbmRleCAyZDk1N2YyLi5kMWM2MTdmIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBBdXRvUmVnaXN0ZXJNb2R1bGVHZW5lcmF0b3IuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBBdXRvUmVnaXN0ZXJNb2R1bGVHZW5lcmF0b3IuamF2YQpAQCAtMTQsMTQgKzE0LDIwIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucGx1Z2luczsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5BdXRvUmVnaXN0ZXJVdGlsLmNhbGN1bGF0ZUJpbmRBbm5vdGF0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRMaXN0TXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5FeHBvcnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuSW52YWxpZFBsdWdpbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5Nb2R1bGVHZW5lcmF0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNjb3BlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zZXJ2bGV0LlNlcnZsZXRNb2R1bGU7CiAKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CkBAIC0yOSw2ICszNSw3IEBACiBjbGFzcyBIdHRwQXV0b1JlZ2lzdGVyTW9kdWxlR2VuZXJhdG9yIGV4dGVuZHMgU2VydmxldE1vZHVsZQogICAgIGltcGxlbWVudHMgTW9kdWxlR2VuZXJhdG9yIHsKICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzczxIdHRwU2VydmxldD4+IHNlcnZlID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgIHByaXZhdGUgZmluYWwgTXVsdGltYXA8VHlwZUxpdGVyYWw8Pz4sIENsYXNzPD8+PiBsaXN0ZW5lcnMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNlcnZsZXRzKCkgewpAQCAtMzYsNiArNDMsMTYgQEAKICAgICAgIGJpbmQoZS5nZXRWYWx1ZSgpKS5pbihTY29wZXMuU0lOR0xFVE9OKTsKICAgICAgIHNlcnZlKGUuZ2V0S2V5KCkpLndpdGgoZS5nZXRWYWx1ZSgpKTsKICAgICB9CisgICAgZm9yIChNYXAuRW50cnk8VHlwZUxpdGVyYWw8Pz4sIENsYXNzPD8+PiBlIDogbGlzdGVuZXJzLmVudHJpZXMoKSkgeworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBUeXBlTGl0ZXJhbDxPYmplY3Q+IHR5cGUgPSAoVHlwZUxpdGVyYWw8T2JqZWN0PikgZS5nZXRLZXkoKTsKKworICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICBDbGFzczxPYmplY3Q+IGltcGwgPSAoQ2xhc3M8T2JqZWN0PikgZS5nZXRWYWx1ZSgpOworCisgICAgICBBbm5vdGF0aW9uIG4gPSBjYWxjdWxhdGVCaW5kQW5ub3RhdGlvbihpbXBsKTsKKyAgICAgIGJpbmQodHlwZSkuYW5ub3RhdGVkV2l0aChuKS50byhpbXBsKTsKKyAgICB9CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTYzLDYgKzgwLDExIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgbGlzdGVuKFR5cGVMaXRlcmFsPD8+IHRsLCBDbGFzczw/PiBjbGF6eikgeworICAgIGxpc3RlbmVycy5wdXQodGwsIGNsYXp6KTsKKyAgfQorCisgIEBPdmVycmlkZQogICBwdWJsaWMgTW9kdWxlIGNyZWF0ZSgpIHRocm93cyBJbnZhbGlkUGx1Z2luRXhjZXB0aW9uIHsKICAgICByZXR1cm4gdGhpczsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcGx1Z2lucy9IdHRwUGx1Z2luTW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBQbHVnaW5Nb2R1bGUuamF2YQppbmRleCAyYmNhYTMwLi41ZGM3ZTJlIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBQbHVnaW5Nb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBQbHVnaW5Nb2R1bGUuamF2YQpAQCAtMjcsNyArMjcsNiBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2VydmxldHMoKSB7CiAgICAgYmluZChIdHRwUGx1Z2luU2VydmxldC5jbGFzcyk7Ci0gICAgc2VydmUoIi9wbHVnaW5zLyoiKS53aXRoKEh0dHBQbHVnaW5TZXJ2bGV0LmNsYXNzKTsKICAgICBzZXJ2ZVJlZ2V4KCJeLyg/OmEvKT9wbHVnaW5zLyguKik/JCIpLndpdGgoSHR0cFBsdWdpblNlcnZsZXQuY2xhc3MpOwogCiAgICAgYmluZChTdGFydFBsdWdpbkxpc3RlbmVyLmNsYXNzKQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcGx1Z2lucy9IdHRwUGx1Z2luU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcGx1Z2lucy9IdHRwUGx1Z2luU2VydmxldC5qYXZhCmluZGV4IGU3Mzc3MDAuLjU0OWMyMzkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvSHR0cFBsdWdpblNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL0h0dHBQbHVnaW5TZXJ2bGV0LmphdmEKQEAgLTE0LDIwICsxNCwyNCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnBsdWdpbnM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJNYXRjaGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLlJlZ2lzdHJhdGlvbkhhbmRsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucGx1Z2luLkxpc3RQbHVnaW5zU2VydmxldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5NaW1lVXRpbEZpbGVUeXBlUmVnaXN0cnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmRvY3VtZW50YXRpb24uTWFya2Rvd25Gb3JtYXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpbnNDb2xsZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlJlbG9hZFBsdWdpbkxpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlN0YXJ0UGx1Z2luTGlzdGVuZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwpAQCAtODAsNyArODQsNyBAQAogICBwcml2YXRlIGZpbmFsIENhY2hlPFJlc291cmNlS2V5LCBSZXNvdXJjZT4gcmVzb3VyY2VDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3NoSG9zdDsKICAgcHJpdmF0ZSBmaW5hbCBpbnQgc3NoUG9ydDsKLSAgcHJpdmF0ZSBmaW5hbCBMaXN0UGx1Z2luc1NlcnZsZXQgbGlzdFNlcnZsZXQ7CisgIHByaXZhdGUgZmluYWwgUmVzdEFwaVNlcnZsZXQgbWFuYWdlckFwaTsKIAogICBwcml2YXRlIExpc3Q8UGx1Z2luPiBwZW5kaW5nID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CiAgIHByaXZhdGUgU3RyaW5nIGJhc2U7CkBAIC05MiwxMSArOTYsMTMgQEAKICAgICAgIEBDYW5vbmljYWxXZWJVcmwgUHJvdmlkZXI8U3RyaW5nPiB3ZWJVcmwsCiAgICAgICBATmFtZWQoSHR0cFBsdWdpbk1vZHVsZS5QTFVHSU5fUkVTT1VSQ0VTKSBDYWNoZTxSZXNvdXJjZUtleSwgUmVzb3VyY2U+IGNhY2hlLAogICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnLAotICAgICAgU3NoSW5mbyBzc2hJbmZvLCBMaXN0UGx1Z2luc1NlcnZsZXQgbGlzdFNlcnZsZXQpIHsKKyAgICAgIFNzaEluZm8gc3NoSW5mbywKKyAgICAgIFJlc3RBcGlTZXJ2bGV0Lkdsb2JhbHMgZ2xvYmFscywKKyAgICAgIFBsdWdpbnNDb2xsZWN0aW9uIHBsdWdpbnMpIHsKICAgICB0aGlzLm1pbWVVdGlsID0gbWltZVV0aWw7CiAgICAgdGhpcy53ZWJVcmwgPSB3ZWJVcmw7CiAgICAgdGhpcy5yZXNvdXJjZUNhY2hlID0gY2FjaGU7Ci0gICAgdGhpcy5saXN0U2VydmxldCA9IGxpc3RTZXJ2bGV0OworICAgIHRoaXMubWFuYWdlckFwaSA9IG5ldyBSZXN0QXBpU2VydmxldChnbG9iYWxzLCBwbHVnaW5zKTsKIAogICAgIFN0cmluZyBzc2hIb3N0ID0gInJldmlldy5leGFtcGxlLmNvbSI7CiAgICAgaW50IHNzaFBvcnQgPSAyOTQxODsKQEAgLTE4NywxNCArMTkzLDE5IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBzZXJ2aWNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQogICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgbmFtZSA9IGV4dHJhY3ROYW1lKHJlcSk7Ci0gICAgaWYgKG5hbWUuZXF1YWxzKCIiKSkgewotICAgICAgbGlzdFNlcnZsZXQuc2VydmljZShyZXEsIHJlcyk7CisgICAgTGlzdDxTdHJpbmc+IHBhcnRzID0gTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgU3BsaXR0ZXIub24oJy8nKS5saW1pdCgzKS5vbWl0RW1wdHlTdHJpbmdzKCkKKyAgICAgICAgLnNwbGl0KFN0cmluZ3MubnVsbFRvRW1wdHkocmVxLmdldFBhdGhJbmZvKCkpKSk7CisKKyAgICBpZiAoaXNBcGlDYWxsKHJlcSwgcGFydHMpKSB7CisgICAgICBtYW5hZ2VyQXBpLnNlcnZpY2UocmVxLCByZXMpOwogICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIFN0cmluZyBuYW1lID0gcGFydHMuZ2V0KDApOwogICAgIGZpbmFsIFBsdWdpbkhvbGRlciBob2xkZXIgPSBwbHVnaW5zLmdldChuYW1lKTsKICAgICBpZiAoaG9sZGVyID09IG51bGwpIHsKLSAgICAgIG5vQ2FjaGUocmVzKTsKKyAgICAgIENhY2hlSGVhZGVycy5zZXROb3RDYWNoZWFibGUocmVzKTsKICAgICAgIHJlcy5zZW5kRXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19OT1RfRk9VTkQpOwogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIxNCwxMSArMjI1LDE5IEBACiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0FwaUNhbGwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgTGlzdDxTdHJpbmc+IHBhcnRzKSB7CisgICAgU3RyaW5nIG1ldGhvZCA9IHJlcS5nZXRNZXRob2QoKTsKKyAgICBpbnQgY250ID0gcGFydHMuc2l6ZSgpOworICAgIHJldHVybiBjbnQgPT0gMAorICAgICAgICB8fCAoY250ID09IDEgJiYgKCJQVVQiLmVxdWFscyhtZXRob2QpIHx8ICJERUxFVEUiLmVxdWFscyhtZXRob2QpKSkKKyAgICAgICAgfHwgKGNudCA9PSAyICYmIHBhcnRzLmdldCgxKS5zdGFydHNXaXRoKCJnZXJyaXR+IikpOworICB9CisKICAgcHJpdmF0ZSB2b2lkIG9uRGVmYXVsdChQbHVnaW5Ib2xkZXIgaG9sZGVyLAogICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKICAgICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGlmICghIkdFVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkgJiYgISJIRUFEIi5lcXVhbHMocmVxLmdldE1ldGhvZCgpKSkgewotICAgICAgbm9DYWNoZShyZXMpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyZXMpOwogICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX01FVEhPRF9OT1RfQUxMT1dFRCk7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjM5LDggKzI1OCwxMSBAQAogICAgIH0KIAogICAgIGlmICgiIi5lcXVhbHMoZmlsZSkpIHsKLSAgICAgIHJlcy5zZW5kUmVkaXJlY3QodXJpICsgIkRvY3VtZW50YXRpb24vaW5kZXguaHRtbCIpOwotICAgIH0gZWxzZSBpZiAoZmlsZS5zdGFydHNXaXRoKCJzdGF0aWMvIikpIHsKKyAgICAgIHJlcy5zZW5kUmVkaXJlY3QodXJpICsgaG9sZGVyLmRvY1ByZWZpeCArICJpbmRleC5odG1sIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGZpbGUuc3RhcnRzV2l0aChob2xkZXIuc3RhdGljUHJlZml4KSkgewogICAgICAgSmFyRmlsZSBqYXIgPSBob2xkZXIucGx1Z2luLmdldEphckZpbGUoKTsKICAgICAgIEphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KGZpbGUpOwogICAgICAgaWYgKGV4aXN0cyhlbnRyeSkpIHsKQEAgLTI0OSwxMSArMjcxLDEyIEBACiAgICAgICAgIHJlc291cmNlQ2FjaGUucHV0KGtleSwgUmVzb3VyY2UuTk9UX0ZPVU5EKTsKICAgICAgICAgUmVzb3VyY2UuTk9UX0ZPVU5ELnNlbmQocmVxLCByZXMpOwogICAgICAgfQotICAgIH0gZWxzZSBpZiAoZmlsZS5lcXVhbHMoIkRvY3VtZW50YXRpb24iKSkgeworICAgIH0gZWxzZSBpZiAoZmlsZS5lcXVhbHMoCisgICAgICAgIGhvbGRlci5kb2NQcmVmaXguc3Vic3RyaW5nKDAsIGhvbGRlci5kb2NQcmVmaXgubGVuZ3RoKCkgLSAxKSkpIHsKICAgICAgIHJlcy5zZW5kUmVkaXJlY3QodXJpICsgIi9pbmRleC5odG1sIik7Ci0gICAgfSBlbHNlIGlmIChmaWxlLnN0YXJ0c1dpdGgoIkRvY3VtZW50YXRpb24vIikgJiYgZmlsZS5lbmRzV2l0aCgiLyIpKSB7CisgICAgfSBlbHNlIGlmIChmaWxlLnN0YXJ0c1dpdGgoaG9sZGVyLmRvY1ByZWZpeCkgJiYgZmlsZS5lbmRzV2l0aCgiLyIpKSB7CiAgICAgICByZXMuc2VuZFJlZGlyZWN0KHVyaSArICJpbmRleC5odG1sIik7Ci0gICAgfSBlbHNlIGlmIChmaWxlLnN0YXJ0c1dpdGgoIkRvY3VtZW50YXRpb24vIikpIHsKKyAgICB9IGVsc2UgaWYgKGZpbGUuc3RhcnRzV2l0aChob2xkZXIuZG9jUHJlZml4KSkgewogICAgICAgSmFyRmlsZSBqYXIgPSBob2xkZXIucGx1Z2luLmdldEphckZpbGUoKTsKICAgICAgIEphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KGZpbGUpOwogICAgICAgaWYgKCFleGlzdHMoZW50cnkpKSB7CkBAIC01MDEsNiArNTI0LDEwIEBACiAgICAgfQogICAgIGlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7CiAgICAgICBjb250ZW50VHlwZSA9IG1pbWVVdGlsLmdldE1pbWVUeXBlKGVudHJ5LmdldE5hbWUoKSwgZGF0YSkudG9TdHJpbmcoKTsKKyAgICAgIGlmICgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi5lcXVhbHMoY29udGVudFR5cGUpCisgICAgICAgICAgJiYgZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuanMiKSkgeworICAgICAgICBjb250ZW50VHlwZSA9ICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IjsKKyAgICAgIH0KICAgICB9CiAKICAgICBsb25nIHRpbWUgPSBlbnRyeS5nZXRUaW1lKCk7CkBAIC01NDksMjkgKzU3NiwzNSBAQAogICAgIHJldHVybiBkYXRhOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3ROYW1lKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKLSAgICBTdHJpbmcgcGF0aCA9IHJlcS5nZXRQYXRoSW5mbygpOwotICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkocGF0aCkgfHwgIi8iLmVxdWFscyhwYXRoKSkgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICBpbnQgcyA9IHBhdGguaW5kZXhPZignLycsIDEpOwotICAgIHJldHVybiAwIDw9IHMgPyBwYXRoLnN1YnN0cmluZygxLCBzKSA6IHBhdGguc3Vic3RyaW5nKDEpOwotICB9Ci0KLSAgc3RhdGljIHZvaWQgbm9DYWNoZShIdHRwU2VydmxldFJlc3BvbnNlIHJlcykgewotICAgIHJlcy5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKLSAgICByZXMuc2V0SGVhZGVyKCJDb250ZW50LURpc3Bvc2l0aW9uIiwgImF0dGFjaG1lbnQiKTsKLSAgfQotCiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBsdWdpbkhvbGRlciB7CiAgICAgZmluYWwgUGx1Z2luIHBsdWdpbjsKICAgICBmaW5hbCBHdWljZUZpbHRlciBmaWx0ZXI7CisgICAgZmluYWwgU3RyaW5nIHN0YXRpY1ByZWZpeDsKKyAgICBmaW5hbCBTdHJpbmcgZG9jUHJlZml4OwogCiAgICAgUGx1Z2luSG9sZGVyKFBsdWdpbiBwbHVnaW4sIEd1aWNlRmlsdGVyIGZpbHRlcikgewogICAgICAgdGhpcy5wbHVnaW4gPSBwbHVnaW47CiAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgICAgIHRoaXMuc3RhdGljUHJlZml4ID0KKyAgICAgICAgZ2V0UHJlZml4KHBsdWdpbiwgIkdlcnJpdC1IdHRwU3RhdGljUHJlZml4IiwgInN0YXRpYy8iKTsKKyAgICAgIHRoaXMuZG9jUHJlZml4ID0KKyAgICAgICAgZ2V0UHJlZml4KHBsdWdpbiwgIkdlcnJpdC1IdHRwRG9jdW1lbnRhdGlvblByZWZpeCIsICJEb2N1bWVudGF0aW9uLyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoUGx1Z2luIHBsdWdpbiwgU3RyaW5nIGF0dHIsIFN0cmluZyBkZWYpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIFN0cmluZyBwcmVmaXggPSBwbHVnaW4uZ2V0SmFyRmlsZSgpLmdldE1hbmlmZXN0KCkuZ2V0TWFpbkF0dHJpYnV0ZXMoKQorICAgICAgICAgICAgLmdldFZhbHVlKGF0dHIpOworICAgICAgICBpZiAocHJlZml4ICE9IG51bGwpIHsKKyAgICAgICAgICByZXR1cm4gQ2hhck1hdGNoZXIuaXMoJy8nKS50cmltRnJvbShwcmVmaXgpICsgIi8iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBkZWY7CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgiRXJyb3IgZ2V0dGluZyAlcyBmb3IgcGx1Z2luICVzLCB1c2luZyBkZWZhdWx0IiwKKyAgICAgICAgICAgIGF0dHIsIHBsdWdpbi5nZXROYW1lKCkpLCBlKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CiAgICAgfQogICB9CiAKQEAgLTU5MCw3ICs2MjMsOCBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKLSAgICAgIHJldHVybiAoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgZ2V0UmVxdWVzdCgpKS5nZXRSZXF1ZXN0VVJJKCk7CisgICAgICByZXR1cm4gKChIdHRwU2VydmxldFJlcXVlc3QpIGdldFJlcXVlc3QoKSkuZ2V0UmVxdWVzdFVSSSgpLnN1YnN0cmluZygKKyAgICAgICAgICBjb250ZXh0UGF0aC5sZW5ndGgoKSk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL1Jlc291cmNlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9wbHVnaW5zL1Jlc291cmNlLmphdmEKaW5kZXggMDU5NzBhZi4uZjM1NGZkNSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcGx1Z2lucy9SZXNvdXJjZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3BsdWdpbnMvUmVzb3VyY2UuamF2YQpAQCAtMTQsNiArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnBsdWdpbnM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKQEAgLTI5LDcgKzMxLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICB2b2lkIHNlbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBIdHRwUGx1Z2luU2VydmxldC5ub0NhY2hlKHJlcyk7CisgICAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJlcyk7CiAgICAgICByZXMuc2VuZEVycm9yKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKICAgICB9CiAgIH07CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvQ2F0U2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0NhdFNlcnZsZXQuamF2YQppbmRleCBhZGY0YWQ1Li4xZWNkOTI5IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvQ2F0U2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9DYXRTZXJ2bGV0LmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXc7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKQEAgLTIzLDYgKzI0LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKQEAgLTQ0LDcgKzQ2LDYgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwpAQCAtOTUsNyArOTYsNyBAQAogICAgIC8vIHJhdGhlciB0aGFuIGVzY2FwZWQgYXMgIiUyNTJGIiwgd2hpY2ggbWFrZXMgbWUgZmVlbCByZWFsbHkgcmVhbGx5CiAgICAgLy8gdW5jb21mb3J0YWJsZSB3aXRoIGEgYmxpbmQgZGVjb2RlIHJpZ2h0IGhlcmUuCiAgICAgLy8KLSAgICBrZXlTdHIgPSBVUkxEZWNvZGVyLmRlY29kZShrZXlTdHIsICJVVEYtOCIpOworICAgIGtleVN0ciA9IFVybC5kZWNvZGUoa2V5U3RyKTsKIAogICAgIGlmICgha2V5U3RyLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgcnNwLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX05PVF9GT1VORCk7CkBAIC0yMjYsOSArMjI3LDcgQEAKICAgICBmaW5hbCBsb25nIHdoZW4gPSBmcm9tQ29tbWl0LmdldENvbW1pdFRpbWUoKSAqIDEwMDBMOwogCiAgICAgcnNwLnNldERhdGVIZWFkZXIoIkxhc3QtTW9kaWZpZWQiLCB3aGVuKTsKLSAgICByc3Auc2V0RGF0ZUhlYWRlcigiRXhwaXJlcyIsIDBMKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAKICAgICBPdXRwdXRTdHJlYW0gb3V0OwogICAgIFppcE91dHB1dFN0cmVhbSB6bzsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Ib3N0UGFnZVNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Ib3N0UGFnZVNlcnZsZXQuamF2YQppbmRleCA2YTQzZDk1Li42Y2RkOWJkIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvSG9zdFBhZ2VTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0hvc3RQYWdlU2VydmxldC5qYXZhCkBAIC0xNCwyNSArMTQsMzAgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXc7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5oYXNoLkhhc2hlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5oYXNoLkhhc2hpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkJ5dGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdlcnJpdENvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Ib3N0UGFnZURhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLndlYnVpLldlYlVpUGx1Z2luOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuc2VydmVyLlJQQ1NlcnZsZXRVdGlsczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLmxpbmtlci5zZXJ2ZXIuUGVybXV0YXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5saW5rZXIuc2VydmVyLlBlcm11dGF0aW9uU2VsZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuSnNvblNlcnZsZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5SUENTZXJ2bGV0VXRpbHM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKQEAgLTQ0LDggKzQ5LDggQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKQEAgLTY2LDYgKzcxLDcgQEAKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXI7CiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gc2Vzc2lvbjsKICAgcHJpdmF0ZSBmaW5hbCBHZXJyaXRDb25maWcgY29uZmlnOworICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8V2ViVWlQbHVnaW4+IHBsdWdpbnM7CiAgIHByaXZhdGUgZmluYWwgSG9zdFBhZ2VEYXRhLlRoZW1lIHNpZ25lZE91dFRoZW1lOwogICBwcml2YXRlIGZpbmFsIEhvc3RQYWdlRGF0YS5UaGVtZSBzaWduZWRJblRoZW1lOwogICBwcml2YXRlIGZpbmFsIFNpdGVQYXRocyBzaXRlOwpAQCAtNzksMTUgKzg1LDE4IEBACiAgIEhvc3RQYWdlU2VydmxldChmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3UsIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHcsCiAgICAgICBmaW5hbCBTaXRlUGF0aHMgc3AsIGZpbmFsIFRoZW1lRmFjdG9yeSB0aGVtZUZhY3RvcnksCiAgICAgICBmaW5hbCBHZXJyaXRDb25maWcgZ2MsIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LAorICAgICAgZmluYWwgRHluYW1pY1NldDxXZWJVaVBsdWdpbj4gd2ViVWlQbHVnaW5zLAogICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgY2ZnKQogICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKICAgICBjdXJyZW50VXNlciA9IGN1OwogICAgIHNlc3Npb24gPSB3OwogICAgIGNvbmZpZyA9IGdjOworICAgIHBsdWdpbnMgPSB3ZWJVaVBsdWdpbnM7CiAgICAgc2lnbmVkT3V0VGhlbWUgPSB0aGVtZUZhY3RvcnkuZ2V0U2lnbmVkT3V0VGhlbWUoKTsKICAgICBzaWduZWRJblRoZW1lID0gdGhlbWVGYWN0b3J5LmdldFNpZ25lZEluVGhlbWUoKTsKICAgICBzaXRlID0gc3A7CiAgICAgcmVmcmVzaEhlYWRlckZvb3RlciA9IGNmZy5nZXRCb29sZWFuKCJzaXRlIiwgInJlZnJlc2hIZWFkZXJGb290ZXIiLCB0cnVlKTsKKyAgICBib29sZWFuIGNoZWNrVXNlckFnZW50ID0gY2ZnLmdldEJvb2xlYW4oInNpdGUiLCAiY2hlY2tVc2VyQWdlbnQiLCB0cnVlKTsKIAogICAgIGZpbmFsIFN0cmluZyBwYWdlTmFtZSA9ICJIb3N0UGFnZS5odG1sIjsKICAgICB0ZW1wbGF0ZSA9IEh0bWxEb21VdGlsLnBhcnNlRmlsZShnZXRDbGFzcygpLCBwYWdlTmFtZSk7CkBAIC0xMDIsNDAgKzExMSw0MCBAQAogICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oIk5vICIgKyBIUERfSUQgKyAiIGluICIgKyBwYWdlTmFtZSk7CiAgICAgfQogCi0gICAgZmluYWwgU3RyaW5nIHNyYyA9ICJnZXJyaXQvZ2Vycml0Lm5vY2FjaGUuanMiOwotICAgIHNlbGVjdG9yID0gbmV3IFBlcm11dGF0aW9uU2VsZWN0b3IoImdlcnJpdCIpOwotICAgIGlmIChJU19ERVYgfHwgIWNmZy5nZXRCb29sZWFuKCJzaXRlIiwgImNoZWNrVXNlckFnZW50IiwgdHJ1ZSkpIHsKLSAgICAgIG5vQ2FjaGVOYW1lID0gc3JjOwotICAgIH0gZWxzZSB7Ci0gICAgICBmaW5hbCBFbGVtZW50IGRldm1vZGUgPSBIdG1sRG9tVXRpbC5maW5kKHRlbXBsYXRlLCAiZ2Vycml0X2d3dGRldm1vZGUiKTsKKyAgICBTdHJpbmcgc3JjID0gImdlcnJpdF91aS9nZXJyaXRfdWkubm9jYWNoZS5qcyI7CisgICAgaWYgKCFJU19ERVYpIHsKKyAgICAgIEVsZW1lbnQgZGV2bW9kZSA9IEh0bWxEb21VdGlsLmZpbmQodGVtcGxhdGUsICJnd3RkZXZtb2RlIik7CiAgICAgICBpZiAoZGV2bW9kZSAhPSBudWxsKSB7CiAgICAgICAgIGRldm1vZGUuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGRldm1vZGUpOwogICAgICAgfQogCiAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlQXNTdHJlYW0oIi8iICsgc3JjKTsKLSAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gIiArIHNyYyArICIgaW4gd2ViYXBwIHJvb3QiKTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7Ci0gICAgICB0cnkgeworICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgSGFzaGVyIG1kID0gSGFzaGluZy5tZDUoKS5uZXdIYXNoZXIoKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07Ci0gICAgICAgICAgaW50IG47Ci0gICAgICAgICAgd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+IDApIHsKLSAgICAgICAgICAgIG1kLnVwZGF0ZShidWYsIDAsIG4pOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIHdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICAgIG1kLnB1dEJ5dGVzKGJ1ZiwgMCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGluLmNsb3NlKCk7CiAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCByZWFkaW5nICIgKyBzcmMsIGUpOwogICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbGVkIHJlYWRpbmcgIiArIHNyYywgZSk7CisgICAgICAgIHNyYyArPSAiP2NvbnRlbnQ9IiArIG1kLmhhc2goKS50b1N0cmluZygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nLmRlYnVnKCJObyAiICsgc3JjICsgIiBpbiB3ZWJhcHAgcm9vdDsga2VlcGluZyBub25jYWNoZS5qcyBVUkwiKTsKICAgICAgIH0KLSAgICAgIGZpbmFsIFN0cmluZyBpZCA9IE9iamVjdElkLmZyb21SYXcobWQuZGlnZXN0KCkpLm5hbWUoKTsKLSAgICAgIG5vQ2FjaGVOYW1lID0gc3JjICsgIj9jb250ZW50PSIgKyBpZDsKLSAgICAgIHNlbGVjdG9yLmluaXQoc2VydmxldENvbnRleHQpOwogICAgIH0KIAorICAgIG5vQ2FjaGVOYW1lID0gc3JjOworICAgIHNlbGVjdG9yID0gbmV3IFBlcm11dGF0aW9uU2VsZWN0b3IoImdlcnJpdF91aSIpOworICAgIGlmIChjaGVja1VzZXJBZ2VudCAmJiAhSVNfREVWKSB7CisgICAgICBzZWxlY3Rvci5pbml0KHNlcnZsZXRDb250ZXh0KTsKKyAgICB9CiAgICAgcGFnZSA9IG5ldyBQYWdlKCk7CiAgIH0KIApAQCAtMTYyLDE4ICsxNzEsMTYgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBQYWdlLkNvbnRlbnQgcGFnZSA9IGdldCgpLmdldChzZWxlY3QocmVxKSk7Ci0gICAgZmluYWwgYnl0ZVtdIHJhdzsKLQorICAgIGZpbmFsIFBhZ2UuQ29udGVudCBwYWdlID0gc2VsZWN0KHJlcSk7CisgICAgZmluYWwgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAgICAgZmluYWwgQ3VycmVudFVzZXIgdXNlciA9IGN1cnJlbnRVc2VyLmdldCgpOwogICAgIGlmICh1c2VyIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpIHsKLSAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgdy53cml0ZShIUERfSUQgKyAiLmFjY291bnQ9Iik7CiAgICAgICBqc29uKCgoSWRlbnRpZmllZFVzZXIpIHVzZXIpLmdldEFjY291bnQoKSwgdyk7CiAgICAgICB3LndyaXRlKCI7Iik7CiAKLSAgICAgIHcud3JpdGUoSFBEX0lEICsgIi54c3JmVG9rZW49Iik7Ci0gICAgICBqc29uKHNlc3Npb24uZ2V0KCkuZ2V0VG9rZW4oKSwgdyk7CisgICAgICB3LndyaXRlKEhQRF9JRCArICIueEdlcnJpdEF1dGg9Iik7CisgICAgICBqc29uKHNlc3Npb24uZ2V0KCkuZ2V0WEdlcnJpdEF1dGgoKSwgdyk7CiAgICAgICB3LndyaXRlKCI7Iik7CiAKICAgICAgIHcud3JpdGUoSFBEX0lEICsgIi5hY2NvdW50RGlmZlByZWY9Iik7CkBAIC0xODMsMjQgKzE5MCwyNCBAQAogICAgICAgdy53cml0ZShIUERfSUQgKyAiLnRoZW1lPSIpOwogICAgICAganNvbihzaWduZWRJblRoZW1lLCB3KTsKICAgICAgIHcud3JpdGUoIjsiKTsKLQotICAgICAgZmluYWwgYnl0ZVtdIHVzZXJEYXRhID0gdy50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgICAgcmF3ID0gY29uY2F0KHBhZ2UucGFydDEsIHVzZXJEYXRhLCBwYWdlLnBhcnQyKTsKICAgICB9IGVsc2UgewotICAgICAgcmF3ID0gcGFnZS5mdWxsOworICAgICAgdy53cml0ZShIUERfSUQgKyAiLnRoZW1lPSIpOworICAgICAganNvbihzaWduZWRPdXRUaGVtZSwgdyk7CisgICAgICB3LndyaXRlKCI7Iik7CiAgICAgfQorICAgIHBsdWdpbnModyk7CiAKKyAgICBmaW5hbCBieXRlW10gaHBkID0gdy50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpOworICAgIGZpbmFsIGJ5dGVbXSByYXcgPSBCeXRlcy5jb25jYXQocGFnZS5wYXJ0MSwgaHBkLCBwYWdlLnBhcnQyKTsKICAgICBmaW5hbCBieXRlW10gdG9zZW5kOwogICAgIGlmIChSUENTZXJ2bGV0VXRpbHMuYWNjZXB0c0d6aXBFbmNvZGluZyhyZXEpKSB7CiAgICAgICByc3Auc2V0SGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKTsKLSAgICAgIHRvc2VuZCA9IHJhdyA9PSBwYWdlLmZ1bGwgPyBwYWdlLmZ1bGxfZ3ogOiBIdG1sRG9tVXRpbC5jb21wcmVzcyhyYXcpOworICAgICAgdG9zZW5kID0gSHRtbERvbVV0aWwuY29tcHJlc3MocmF3KTsKICAgICB9IGVsc2UgewogICAgICAgdG9zZW5kID0gcmF3OwogICAgIH0KIAotICAgIHJzcC5zZXRIZWFkZXIoIkV4cGlyZXMiLCAiRnJpLCAwMSBKYW4gMTk4MCAwMDowMDowMCBHTVQiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICByc3Auc2V0SGVhZGVyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUiKTsKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAgICAgcnNwLnNldENvbnRlbnRUeXBlKCJ0ZXh0L2h0bWwiKTsKICAgICByc3Auc2V0Q2hhcmFjdGVyRW5jb2RpbmcoSHRtbERvbVV0aWwuRU5DKTsKICAgICByc3Auc2V0Q29udGVudExlbmd0aCh0b3NlbmQubGVuZ3RoKTsKQEAgLTIxMiwyOSArMjE5LDMxIEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBQZXJtdXRhdGlvbiBzZWxlY3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewotICAgIGlmICgiMCIuZXF1YWxzKHJlcS5nZXRQYXJhbWV0ZXIoInMiKSkpIHsKKyAgcHJpdmF0ZSB2b2lkIHBsdWdpbnMoU3RyaW5nV3JpdGVyIHcpIHsKKyAgICBMaXN0PFN0cmluZz4gdXJscyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoV2ViVWlQbHVnaW4gdSA6IHBsdWdpbnMpIHsKKyAgICAgIHVybHMuYWRkKFN0cmluZy5mb3JtYXQoInBsdWdpbnMvJXMvJXMiLAorICAgICAgICAgIHUuZ2V0UGx1Z2luTmFtZSgpLAorICAgICAgICAgIHUuZ2V0SmF2YVNjcmlwdFJlc291cmNlUGF0aCgpKSk7CisgICAgfQorICAgIGlmICghdXJscy5pc0VtcHR5KCkpIHsKKyAgICAgIHcud3JpdGUoSFBEX0lEICsgIi5wbHVnaW5zPSIpOworICAgICAganNvbih1cmxzLCB3KTsKKyAgICAgIHcud3JpdGUoIjsiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFBhZ2UuQ29udGVudCBzZWxlY3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIFBhZ2UgcGcgPSBnZXQoKTsKKyAgICBpZiAoIjEiLmVxdWFscyhyZXEuZ2V0UGFyYW1ldGVyKCJkYmciKSkpIHsKKyAgICAgIHJldHVybiBwZy5kZWJ1ZzsKKyAgICB9IGVsc2UgaWYgKCIwIi5lcXVhbHMocmVxLmdldFBhcmFtZXRlcigicyIpKSkgewogICAgICAgLy8gSWYgcz0wIGlzIHVzZWQgaW4gdGhlIFVSTCwgdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgYXNrZWQgdXMKICAgICAgIC8vIHRvIG5vdCBwZXJmb3JtIHNlbGVjdGlvbiBvbiB0aGUgc2VydmVyIHNpZGUsIHBlcmhhcHMgZHVlIHRvCiAgICAgICAvLyBpdCBpbmNvcnJlY3RseSBndWVzc2luZyB0aGVpciB1c2VyIGFnZW50LgotICAgICAgLy8KLSAgICAgIHJldHVybiBudWxsOworICAgICAgcmV0dXJuIHBnLmdldChudWxsKTsKICAgICB9Ci0gICAgcmV0dXJuIHNlbGVjdG9yLnNlbGVjdChyZXEpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNvbmNhdChieXRlW10gcDEsIGJ5dGVbXSBwMiwgYnl0ZVtdIHAzKSB7Ci0gICAgZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtwMS5sZW5ndGggKyBwMi5sZW5ndGggKyBwMy5sZW5ndGhdOwotICAgIGludCBwID0gMDsKLSAgICBwID0gYXBwZW5kKHAxLCByLCBwKTsKLSAgICBwID0gYXBwZW5kKHAyLCByLCBwKTsKLSAgICBwID0gYXBwZW5kKHAzLCByLCBwKTsKLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCBhcHBlbmQoYnl0ZVtdIHNyYywgZmluYWwgYnl0ZVtdIGRzdCwgaW50IHApIHsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNyYywgMCwgZHN0LCBwLCBzcmMubGVuZ3RoKTsKLSAgICByZXR1cm4gcCArIHNyYy5sZW5ndGg7CisgICAgcmV0dXJuIHBnLmdldChzZWxlY3Rvci5zZWxlY3QocmVxKSk7CiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyB7CkBAIC0yNTYsNiArMjY1LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIEZpbGVJbmZvIGhlYWRlcjsKICAgICBwcml2YXRlIGZpbmFsIEZpbGVJbmZvIGZvb3RlcjsKICAgICBwcml2YXRlIGZpbmFsIE1hcDxQZXJtdXRhdGlvbiwgQ29udGVudD4gcGVybXV0YXRpb25zOworICAgIHByaXZhdGUgZmluYWwgQ29udGVudCBkZWJ1ZzsKIAogICAgIFBhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgRG9jdW1lbnQgaG9zdERvYyA9IEh0bWxEb21VdGlsLmNsb25lKHRlbXBsYXRlKTsKQEAgLTI4OCw4ICsyOTgsMTIgQEAKIAogICAgICAgRWxlbWVudCBub2NhY2hlID0gSHRtbERvbVV0aWwuZmluZChob3N0RG9jLCAiZ2Vycml0X21vZHVsZSIpOwogICAgICAgYXNTY3JpcHQobm9jYWNoZSk7CisgICAgICBub2NhY2hlLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKTsKICAgICAgIG5vY2FjaGUuc2V0QXR0cmlidXRlKCJzcmMiLCBub0NhY2hlTmFtZSk7CiAgICAgICBwZXJtdXRhdGlvbnMucHV0KG51bGwsIG5ldyBDb250ZW50KGhvc3REb2MpKTsKKworICAgICAgbm9jYWNoZS5zZXRBdHRyaWJ1dGUoInNyYyIsICJnZXJyaXRfdWkvZ2Vycml0X2RiZy5ub2NhY2hlLmpzIik7CisgICAgICBkZWJ1ZyA9IG5ldyBDb250ZW50KGhvc3REb2MpOwogICAgIH0KIAogICAgIENvbnRlbnQgZ2V0KFBlcm11dGF0aW9uIHApIHsKQEAgLTMwNSw3ICszMTksNiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc1NjcmlwdChmaW5hbCBFbGVtZW50IHNjcmlwdE5vZGUpIHsKLSAgICAgIHNjcmlwdE5vZGUucmVtb3ZlQXR0cmlidXRlKCJpZCIpOwogICAgICAgc2NyaXB0Tm9kZS5zZXRBdHRyaWJ1dGUoInR5cGUiLCAidGV4dC9qYXZhc2NyaXB0Iik7CiAgICAgICBzY3JpcHROb2RlLnNldEF0dHJpYnV0ZSgibGFuZ3VhZ2UiLCAiamF2YXNjcmlwdCIpOwogICAgIH0KQEAgLTMxMyw4ICszMjYsNiBAQAogICAgIGNsYXNzIENvbnRlbnQgewogICAgICAgZmluYWwgYnl0ZVtdIHBhcnQxOwogICAgICAgZmluYWwgYnl0ZVtdIHBhcnQyOwotICAgICAgZmluYWwgYnl0ZVtdIGZ1bGw7Ci0gICAgICBmaW5hbCBieXRlW10gZnVsbF9nejsKIAogICAgICAgQ29udGVudChEb2N1bWVudCBob3N0RG9jKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgcmF3ID0gSHRtbERvbVV0aWwudG9TdHJpbmcoaG9zdERvYyk7CkBAIC0zMjQsMTUgKzMzNSw2IEBACiAgICAgICAgIH0KICAgICAgICAgcGFydDEgPSByYXcuc3Vic3RyaW5nKDAsIHApLmdldEJ5dGVzKCJVVEYtOCIpOwogICAgICAgICBwYXJ0MiA9IHJhdy5zdWJzdHJpbmcocmF3LmluZGV4T2YoJz4nLCBwKSArIDEpLmdldEJ5dGVzKCJVVEYtOCIpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICB3LndyaXRlKEhQRF9JRCArICIudGhlbWU9Iik7Ci0gICAgICAgIGpzb24oc2lnbmVkT3V0VGhlbWUsIHcpOwotICAgICAgICB3LndyaXRlKCI7Iik7Ci0KLSAgICAgICAgZmluYWwgYnl0ZVtdIHRoZW1lRGF0YSA9IHcudG9TdHJpbmcoKS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgICAgZnVsbCA9IGNvbmNhdChwYXJ0MSwgdGhlbWVEYXRhLCBwYXJ0Mik7Ci0gICAgICAgIGZ1bGxfZ3ogPSBIdG1sRG9tVXRpbC5jb21wcmVzcyhmdWxsKTsKICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9MZWdhY3lHZXJyaXRTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvTGVnYWN5R2Vycml0U2VydmxldC5qYXZhCmluZGV4IGQzODdmNmUuLjc5YzJhZWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9MZWdhY3lHZXJyaXRTZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0xlZ2FjeUdlcnJpdFNlcnZsZXQuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXc7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5IdG1sRG9tVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5SUENTZXJ2bGV0VXRpbHM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKQEAgLTY2LDkgKzY3LDcgQEAKICAgICAgIHRvc2VuZCA9IHJhdzsKICAgICB9CiAKLSAgICByc3Auc2V0SGVhZGVyKCJFeHBpcmVzIiwgIkZyaSwgMDEgSmFuIDE5ODAgMDA6MDA6MDAgR01UIik7Ci0gICAgcnNwLnNldEhlYWRlcigiUHJhZ21hIiwgIm5vLWNhY2hlIik7Ci0gICAgcnNwLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIik7CisgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgIHJzcC5zZXRDb250ZW50VHlwZSgidGV4dC9odG1sIik7CiAgICAgcnNwLnNldENoYXJhY3RlckVuY29kaW5nKEh0bWxEb21VdGlsLkVOQyk7CiAgICAgcnNwLnNldENvbnRlbnRMZW5ndGgodG9zZW5kLmxlbmd0aCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvU3NoSW5mb1NlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Tc2hJbmZvU2VydmxldC5qYXZhCmluZGV4IDYwNzhjNGUuLjU3NTY4ODAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Tc2hJbmZvU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Tc2hJbmZvU2VydmxldC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJhdzsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIApAQCAtNjAsMTAgKzYxLDYgQEAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJzcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByc3Auc2V0SGVhZGVyKCJFeHBpcmVzIiwgIkZyaSwgMDEgSmFuIDE5ODAgMDA6MDA6MDAgR01UIik7Ci0gICAgcnNwLnNldEhlYWRlcigiUHJhZ21hIiwgIm5vLWNhY2hlIik7Ci0gICAgcnNwLnNldEhlYWRlcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlIik7Ci0KICAgICBmaW5hbCBMaXN0PEhvc3RLZXk+IGhvc3RLZXlzID0gc3NoZC5nZXRIb3N0S2V5cygpOwogICAgIGZpbmFsIFN0cmluZyBvdXQ7CiAgICAgaWYgKCFob3N0S2V5cy5pc0VtcHR5KCkpIHsKQEAgLTg4LDYgKzg1LDcgQEAKICAgICAgIG91dCA9ICJOT1RfQVZBSUxBQkxFIjsKICAgICB9CiAKKyAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAgICAgcnNwLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOwogICAgIHJzcC5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpOwogICAgIGZpbmFsIFByaW50V3JpdGVyIHcgPSByc3AuZ2V0V3JpdGVyKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvU3RhdGljU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1N0YXRpY1NlcnZsZXQuamF2YQppbmRleCA5ODhkYWRiLi5iYzBhMTc0IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvU3RhdGljU2VydmxldC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9TdGF0aWNTZXJ2bGV0LmphdmEKQEAgLTE0LDcgKzE0LDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yYXc7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CitpbXBvcnQgY29tLmdvb2dsZS5nd3RleHB1aS5zZXJ2ZXIuQ2FjaGVIZWFkZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuUlBDU2VydmxldFV0aWxzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CkBAIC0yNiw3ICsyOCw4IEBACiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKQEAgLTM3LDEyICs0MCw3IEBACiBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKIEBTaW5nbGV0b24KIHB1YmxpYyBjbGFzcyBTdGF0aWNTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9BR0UgPSAxMiAqIDYwICogNjAgKiAxMDAwTC8qIG1pbGxpc2Vjb25kcyAqLzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NUUkwgPQotICAgICAgInB1YmxpYywgbWF4LWFnZT0iICsgKE1BWF9BR0UgLyAxMDAwTCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gTUlNRV9UWVBFUyA9Ci0gICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBNSU1FX1RZUEVTID0gTWFwcy5uZXdIYXNoTWFwKCk7CiAgIHN0YXRpYyB7CiAgICAgTUlNRV9UWVBFUy5wdXQoImh0bWwiLCAidGV4dC9odG1sIik7CiAgICAgTUlNRV9UWVBFUy5wdXQoImh0bSIsICJ0ZXh0L2h0bWwiKTsKQEAgLTE0Nyw2ICsxNDUsNyBAQAogICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZmluYWwgRmlsZSBwID0gbG9jYWwocmVxKTsKICAgICBpZiAocCA9PSBudWxsKSB7CisgICAgICBDYWNoZUhlYWRlcnMuc2V0Tm90Q2FjaGVhYmxlKHJzcCk7CiAgICAgICByc3Auc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EKTsKICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNjEsOCArMTYwLDcgQEAKICAgICAgIHRvc2VuZCA9IHJlYWRGaWxlKHApOwogICAgIH0KIAotICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCBDQUNIRV9DVFJMKTsKLSAgICByc3Auc2V0RGF0ZUhlYWRlcigiRXhwaXJlcyIsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgTUFYX0FHRSk7CisgICAgQ2FjaGVIZWFkZXJzLnNldENhY2hlYWJsZShyZXEsIHJzcCwgMTIsIFRpbWVVbml0LkhPVVJTKTsKICAgICByc3Auc2V0RGF0ZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIsIHAubGFzdE1vZGlmaWVkKCkpOwogICAgIHJzcC5zZXRDb250ZW50VHlwZSh0eXBlKTsKICAgICByc3Auc2V0Q29udGVudExlbmd0aCh0b3NlbmQubGVuZ3RoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9UaGVtZUZhY3RvcnkuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9UaGVtZUZhY3RvcnkuamF2YQppbmRleCA5NzIzNjc0Li45ZTg5ZWVlIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvVGhlbWVGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L1RoZW1lRmFjdG9yeS5qYXZhCkBAIC0zOCwxMSArMzgsMTEgQEAKIAogICBwcml2YXRlIEhvc3RQYWdlRGF0YS5UaGVtZSBnZXRUaGVtZShTdHJpbmcgbmFtZSkgewogICAgIEhvc3RQYWdlRGF0YS5UaGVtZSB0aGVtZSA9IG5ldyBIb3N0UGFnZURhdGEuVGhlbWUoKTsKLSAgICB0aGVtZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcihuYW1lLCAiYmFja2dyb3VuZENvbG9yIiwgIiNGQ0ZFRUYiKTsKLSAgICB0aGVtZS50ZXh0Q29sb3IgPSBjb2xvcihuYW1lLCAidGV4dENvbG9yIiwgIiMwMDAwMDAiKTsKLSAgICB0aGVtZS50cmltQ29sb3IgPSBjb2xvcihuYW1lLCAidHJpbUNvbG9yIiwgIiNENEU5QTkiKTsKLSAgICB0aGVtZS5zZWxlY3Rpb25Db2xvciA9IGNvbG9yKG5hbWUsICJzZWxlY3Rpb25Db2xvciIsICIjRkZGRkNDIik7Ci0gICAgdGhlbWUudG9wTWVudUNvbG9yID0gY29sb3IobmFtZSwgInRvcE1lbnVDb2xvciIsIHRoZW1lLnRyaW1Db2xvcik7CisgICAgdGhlbWUuYmFja2dyb3VuZENvbG9yID0gY29sb3IobmFtZSwgImJhY2tncm91bmRDb2xvciIsICIjRkZGRkZGIik7CisgICAgdGhlbWUudGV4dENvbG9yID0gY29sb3IobmFtZSwgInRleHRDb2xvciIsICIjMzUzNTM1Iik7CisgICAgdGhlbWUudHJpbUNvbG9yID0gY29sb3IobmFtZSwgInRyaW1Db2xvciIsICIjRUVFRUVFIik7CisgICAgdGhlbWUuc2VsZWN0aW9uQ29sb3IgPSBjb2xvcihuYW1lLCAic2VsZWN0aW9uQ29sb3IiLCAiI0Q4RURGOSIpOworICAgIHRoZW1lLnRvcE1lbnVDb2xvciA9IGNvbG9yKG5hbWUsICJ0b3BNZW51Q29sb3IiLCAiI0ZGRkZGRiIpOwogICAgIHRoZW1lLmNoYW5nZVRhYmxlT3V0ZGF0ZWRDb2xvciA9IGNvbG9yKG5hbWUsICJjaGFuZ2VUYWJsZU91dGRhdGVkQ29sb3IiLCAiI0YwODA4MCIpOwogICAgIHRoZW1lLnRhYmxlT2RkUm93Q29sb3IgPSBjb2xvcihuYW1lLCAidGFibGVPZGRSb3dDb2xvciIsICJ0cmFuc3BhcmVudCIpOwogICAgIHRoZW1lLnRhYmxlRXZlblJvd0NvbG9yID0gY29sb3IobmFtZSwgInRhYmxlRXZlblJvd0NvbG9yIiwgInRyYW5zcGFyZW50Iik7CkBAIC01NCwxMSArNTQsNyBAQAogICAgIGlmICh2ID09IG51bGwgfHwgdi5pc0VtcHR5KCkpIHsKICAgICAgIHYgPSBjZmcuZ2V0U3RyaW5nKCJ0aGVtZSIsIG51bGwsIG5hbWUpOwogICAgICAgaWYgKHYgPT0gbnVsbCB8fCB2LmlzRW1wdHkoKSkgewotICAgICAgICBpZiAoInNpZ25lZC1pbiIuZXF1YWxzKHNlY3Rpb24pICYmICJiYWNrZ3JvdW5kQ29sb3IiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgIHYgPSAiI0ZGRkZGRiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdiA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQorICAgICAgICB2ID0gZGVmYXVsdFZhbHVlOwogICAgICAgfQogICAgIH0KICAgICBpZiAoIXYuc3RhcnRzV2l0aCgiIyIpICYmIHYubWF0Y2hlcygiXlswLTlhLWZBLUZdezIsNn0kIikpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jlc3RhcGkvUGFyYW1ldGVyUGFyc2VyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yZXN0YXBpL1BhcmFtZXRlclBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmZmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yZXN0YXBpL1BhcmFtZXRlclBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmVzdGFwaTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0LnJlcGx5QmluYXJ5UmVzdWx0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0LnJlcGx5RXJyb3I7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TcGxpdHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJpbmFyeVJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnV0aWwuY2xpLkNtZExpbmVQYXJzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25BcnJheTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QcmltaXRpdmU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkNtZExpbmVFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitjbGFzcyBQYXJhbWV0ZXJQYXJzZXIgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVTZXQ8U3RyaW5nPiBSRVNFUlZFRF9LRVlTID0gSW1tdXRhYmxlU2V0Lm9mKAorICAgICAgInBwIiwgInByZXR0eVByaW50IiwgInN0cmljdCIsICJjYWxsYmFjayIsICJhbHQiLCAiZmllbGRzIik7CisKKyAgcHJpdmF0ZSBmaW5hbCBDbWRMaW5lUGFyc2VyLkZhY3RvcnkgcGFyc2VyRmFjdG9yeTsKKworICBASW5qZWN0CisgIFBhcmFtZXRlclBhcnNlcihDbWRMaW5lUGFyc2VyLkZhY3RvcnkgcGYpIHsKKyAgICB0aGlzLnBhcnNlckZhY3RvcnkgPSBwZjsKKyAgfQorCisgIDxUPiBib29sZWFuIHBhcnNlKFQgcGFyYW0sCisgICAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gaW4sCisgICAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIENtZExpbmVQYXJzZXIgY2xwID0gcGFyc2VyRmFjdG9yeS5jcmVhdGUocGFyYW0pOworICAgIHRyeSB7CisgICAgICBjbHAucGFyc2VPcHRpb25NYXAoaW4pOworICAgIH0gY2F0Y2ggKENtZExpbmVFeGNlcHRpb24gZSkgeworICAgICAgaWYgKCFjbHAud2FzSGVscFJlcXVlc3RlZEJ5T3B0aW9uKCkpIHsKKyAgICAgICAgcmVwbHlFcnJvcihyZXMsIFNDX0JBRF9SRVFVRVNULCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2xwLndhc0hlbHBSZXF1ZXN0ZWRCeU9wdGlvbigpKSB7CisgICAgICBTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgY2xwLnByaW50UXVlcnlTdHJpbmdVc2FnZShyZXEuZ2V0UmVxdWVzdFVSSSgpLCBtc2cpOworICAgICAgbXNnLndyaXRlKCdcbicpOworICAgICAgbXNnLndyaXRlKCdcbicpOworICAgICAgY2xwLnByaW50VXNhZ2UobXNnLCBudWxsKTsKKyAgICAgIG1zZy53cml0ZSgnXG4nKTsKKyAgICAgIHJlcGx5QmluYXJ5UmVzdWx0KHJlcSwgcmVzLAorICAgICAgICAgIEJpbmFyeVJlc3VsdC5jcmVhdGUobXNnLnRvU3RyaW5nKCkpLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIikpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RhdGljIHZvaWQgc3BsaXRRdWVyeVN0cmluZyhTdHJpbmcgcXVlcnlTdHJpbmcsCisgICAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gY29uZmlnLAorICAgICAgTXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcykgeworICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KHF1ZXJ5U3RyaW5nKSkgeworICAgICAgZm9yIChTdHJpbmcga3ZQYWlyIDogU3BsaXR0ZXIub24oJyYnKS5zcGxpdChxdWVyeVN0cmluZykpIHsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpID0gU3BsaXR0ZXIub24oJz0nKS5saW1pdCgyKS5zcGxpdChrdlBhaXIpLml0ZXJhdG9yKCk7CisgICAgICAgIFN0cmluZyBrZXkgPSBVcmwuZGVjb2RlKGkubmV4dCgpKTsKKyAgICAgICAgU3RyaW5nIHZhbCA9IGkuaGFzTmV4dCgpID8gVXJsLmRlY29kZShpLm5leHQoKSkgOiAiIjsKKyAgICAgICAgaWYgKFJFU0VSVkVEX0tFWVMuY29udGFpbnMoa2V5KSkgeworICAgICAgICAgIGNvbmZpZy5wdXQoa2V5LCB2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBhcmFtcy5wdXQoa2V5LCB2YWwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gcXVlcnkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIFNldDxTdHJpbmc+IHBhcmFtcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KHJlcS5nZXRRdWVyeVN0cmluZygpKSkgeworICAgICAgZm9yIChTdHJpbmcga3ZQYWlyIDogU3BsaXR0ZXIub24oJyYnKS5zcGxpdChyZXEuZ2V0UXVlcnlTdHJpbmcoKSkpIHsKKyAgICAgICAgcGFyYW1zLmFkZChJdGVyYWJsZXMuZ2V0Rmlyc3QoCisgICAgICAgICAgICBTcGxpdHRlci5vbignPScpLmxpbWl0KDIpLnNwbGl0KGt2UGFpciksCisgICAgICAgICAgICBudWxsKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBwYXJhbXM7CisgIH0KKworICAvKioKKyAgICogQ29udmVydCBhIHN0YW5kYXJkIFVSTCBlbmNvZGVkIGZvcm0gaW5wdXQgaW50byBhIHBhcnNlZCBKU09OIHRyZWUuCisgICAqIDxwPgorICAgKiBHaXZlbiBhbiBpbnB1dCBzdWNoIGFzOgorICAgKgorICAgKiA8cHJlPgorICAgKiBtZXNzYWdlPURvZXMrbm90K2NvbXBpbGUuJmxhYmVscy5WZXJpZmllZD0tMQorICAgKiA8L3ByZT4KKyAgICoKKyAgICogd2hpY2ggaXMgZWFzaWx5IGNyZWF0ZWQgdXNpbmcgdGhlIGN1cmwgY29tbWFuZCBsaW5lIHRvb2w6CisgICAqCisgICAqIDxwcmU+CisgICAqIGN1cmwgLS1kYXRhICdtZXNzYWdlPURvZXMgbm90IGNvbXBpbGUuJyAtLWRhdGEgbGFiZWxzLlZlcmlmaWVkPS0xCisgICAqIDwvcHJlPgorICAgKgorICAgKiBjb252ZXJ0cyB0byBhIEpTT04gb2JqZWN0IHN0cnVjdHVyZSB0aGF0IGlzIG5vcm1hbGx5IGV4cGVjdGVkOgorICAgKgorICAgKiA8cHJlPgorICAgKiB7CisgICAqICAgIm1lc3NhZ2UiOiAiRG9lcyBub3QgY29tcGlsZS4iLAorICAgKiAgICJsYWJlbHMiOiB7CisgICAqICAgICAiVmVyaWZpZWQiOiAiLTEiCisgICAqICAgfQorICAgKiB9CisgICAqIDwvcHJlPgorICAgKgorICAgKiBUaGlzIGlucHV0IGNhbiB0aGVuIGJlIGZ1cnRoZXIgcHJvY2Vzc2VkIGludG8gdGhlIEphdmEgaW5wdXQgdHlwZSBleHBlY3RlZAorICAgKiBieSBhIHZpZXcgdXNpbmcgR3Nvbi4gSGVyZSB3ZSByZWx5IG9uIEdzb24gdG8gcGVyZm9ybSBpbXBsaWNpdCBjb252ZXJzaW9uCisgICAqIG9mIGEgc3RyaW5nIHtAY29kZSAiLTEifSB0byBhIG51bWJlciB0eXBlIHdoZW4gdGhlIEphdmEgaW5wdXQgdHlwZSBleHBlY3RzCisgICAqIGEgbnVtYmVyLgorICAgKiA8cD4KKyAgICogQ29udmVyc2lvbiBhc3N1bWVzIGFueSBmaWVsZCBuYW1lIHRoYXQgZG9lcyBub3QgY29udGFpbiB7QGNvZGUgIi4ifSB3aWxsIGJlCisgICAqIGEgcHJvcGVydHkgb2YgdGhlIHRvcCBsZXZlbCBpbnB1dCBvYmplY3QuIEFueSBmaWVsZCB3aXRoIGEgZG90IHdpbGwgdXNlIHRoZQorICAgKiBmaXJzdCBzZWdtZW50IGFzIHRoZSB0b3AgbGV2ZWwgcHJvcGVydHkgbmFtZSBuYW1pbmcgYW4gb2JqZWN0LCBhbmQgdGhlIHJlc3QKKyAgICogb2YgdGhlIGZpZWxkIG5hbWUgYXMgYSBwcm9wZXJ0eSBpbiB0aGUgbmVzdGVkIG9iamVjdC4KKyAgICoKKyAgICogQHBhcmFtIHJlcSByZXF1ZXN0IHRvIHBhcnNlIGZvcm0gaW5wdXQgZnJvbSBhbmQgY3JlYXRlIEpTT04gdHJlZS4KKyAgICogQHJldHVybiB0aGUgY29udmVydGVkIEpTT04gb2JqZWN0IHRyZWUuCisgICAqIEB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgY2FzdCwgYXMgdGhlcmUgYXJlCisgICAqICAgICAgICAgY29uZmxpY3RpbmcgZGVmaW5pdGlvbnMgZm9yIGEgbmVzdGVkIG9iamVjdC4KKyAgICovCisgIHN0YXRpYyBKc29uT2JqZWN0IGZvcm1Ub0pzb24oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmdbXT4gbWFwID0gcmVxLmdldFBhcmFtZXRlck1hcCgpOworICAgIHJldHVybiBmb3JtVG9Kc29uKG1hcCwgcXVlcnkocmVxKSk7CisgIH0KKworICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgc3RhdGljIEpzb25PYmplY3QgZm9ybVRvSnNvbihNYXA8U3RyaW5nLCBTdHJpbmdbXT4gbWFwLCBTZXQ8U3RyaW5nPiBxdWVyeSkKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uIHsKKyAgICBKc29uT2JqZWN0IGlucHV0T2JqZWN0ID0gbmV3IEpzb25PYmplY3QoKTsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZ1tdPiBlbnQgOiBtYXAuZW50cnlTZXQoKSkgeworICAgICAgU3RyaW5nIGtleSA9IGVudC5nZXRLZXkoKTsKKyAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IGVudC5nZXRWYWx1ZSgpOworCisgICAgICBpZiAocXVlcnkuY29udGFpbnMoa2V5KSB8fCB2YWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgLy8gRGlzYWxsb3cgcHJvY2Vzc2luZyBxdWVyeSBwYXJhbWV0ZXJzIGFzIGlucHV0IGJvZHkgZmllbGRzLgorICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgb2Ygdmlld3Mgc2hvdWxkIGF2b2lkIGR1cGxpY2F0ZSBuYW1pbmcuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBKc29uT2JqZWN0IG9iaiA9IGlucHV0T2JqZWN0OworICAgICAgaW50IGRvdCA9IGtleS5pbmRleE9mKCcuJyk7CisgICAgICBpZiAoMCA8PSBkb3QpIHsKKyAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0ga2V5LnN1YnN0cmluZygwLCBkb3QpOworICAgICAgICBKc29uRWxlbWVudCBlID0gaW5wdXRPYmplY3QuZ2V0KHByb3BlcnR5KTsKKyAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgIG9iaiA9IG5ldyBKc29uT2JqZWN0KCk7CisgICAgICAgICAgaW5wdXRPYmplY3QuYWRkKHByb3BlcnR5LCBvYmopOworICAgICAgICB9IGVsc2UgaWYgKGUuaXNKc29uT2JqZWN0KCkpIHsKKyAgICAgICAgICBvYmogPSBlLmdldEFzSnNvbk9iamVjdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJrZXkgJXMgY29uZmxpY3RzIHdpdGggJXMiLAorICAgICAgICAgICAgICBrZXksIHByb3BlcnR5KSk7CisgICAgICAgIH0KKyAgICAgICAga2V5ID0ga2V5LnN1YnN0cmluZyhkb3QgKyAxKTsKKyAgICAgIH0KKworICAgICAgaWYgKG9iai5nZXQoa2V5KSAhPSBudWxsKSB7CisgICAgICAgIC8vIFRoaXMgZXJyb3Igc2hvdWxkIG5ldmVyIGhhcHBlbi4gSWYgYWxsIGZvcm0gdmFsdWVzIGFyZSBoYW5kbGVkCisgICAgICAgIC8vIHRvZ2V0aGVyIGluIGEgc2luZ2xlIHBhc3MgcHJvcGVydGllcyBhcmUgc2V0IG9ubHkgb25jZS4gU2V0dGluZworICAgICAgICAvLyBhZ2FpbiBpbmRpY2F0ZXMgc29tZXRoaW5nIGhhcyBnb25lIHZlcnkgd3JvbmcuCisgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJpbnZhbGlkIGZvcm0gaW5wdXQsIHVzZSBKU09OIGluc3RlYWQiKTsKKyAgICAgIH0gZWxzZSBpZiAodmFsdWVzLmxlbmd0aCA9PSAxKSB7CisgICAgICAgIG9iai5hZGRQcm9wZXJ0eShrZXksIHZhbHVlc1swXSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBKc29uQXJyYXkgbGlzdCA9IG5ldyBKc29uQXJyYXkoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdiA6IHZhbHVlcykgeworICAgICAgICAgIGxpc3QuYWRkKG5ldyBKc29uUHJpbWl0aXZlKHYpKTsKKyAgICAgICAgfQorICAgICAgICBvYmouYWRkKGtleSwgbGlzdCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dE9iamVjdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmVzdGFwaS9SZXN0QXBpU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmVzdGFwaS9SZXN0QXBpU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYWExOTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yZXN0YXBpL1Jlc3RBcGlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw4NjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19DT05GTElDVDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfQ1JFQVRFRDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfRk9SQklEREVOOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CitpbXBvcnQgc3RhdGljIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlLlNDX01FVEhPRF9OT1RfQUxMT1dFRDsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfTk9UX0ZPVU5EOworaW1wb3J0IHN0YXRpYyBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSzsKK2ltcG9ydCBzdGF0aWMgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfUFJFQ09ORElUSU9OX0ZBSUxFRDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRIYXNoTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ubmV0Lkh0dHBIZWFkZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0LkF1ZGl0U2VydmljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hdWRpdC5IdHRwQXVkaXRFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzQ3JlYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzUG9zdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmluYXJ5UmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5QcmVjb25kaXRpb25GYWlsZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlB1dElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlN0cmVhbWluZ1Jlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLldlYlNlc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFjY2Vzc1BhdGg7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFub255bW91c1VzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQ2FwYWJpbGl0eUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkV4Y2x1c2lvblN0cmF0ZWd5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5GaWVsZEF0dHJpYnV0ZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkZpZWxkTmFtaW5nUG9saWN5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkVsZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblByaW1pdGl2ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uc3RyZWFtLkpzb25SZWFkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5NYWxmb3JtZWRKc29uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0ZXhwdWkuc2VydmVyLkNhY2hlSGVhZGVyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QudXRpbC5Qcm92aWRlcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5UZW1wb3JhcnlCdWZmZXIuSGVhcDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworcHVibGljIGNsYXNzIFJlc3RBcGlTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkKKyAgICAgIC5nZXRMb2dnZXIoUmVzdEFwaVNlcnZsZXQuY2xhc3MpOworCisgIC8qKiBNSU1FIHR5cGUgdXNlZCBmb3IgYSBKU09OIHJlc3BvbnNlIGJvZHkuICovCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1RZUEUgPSAiYXBwbGljYXRpb24vanNvbiI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX1RZUEUgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsKKworICAvKioKKyAgICogR2FyYmFnZSBwcmVmaXggaW5zZXJ0ZWQgYmVmb3JlIEpTT04gb3V0cHV0IHRvIHByZXZlbnQgWFNTSS4KKyAgICogPHA+CisgICAqIFRoaXMgcHJlZml4IGlzICIpXX0nXG4iIGFuZCBpcyBkZXNpZ25lZCB0byBwcmV2ZW50IGEgd2ViIGJyb3dzZXIgZnJvbQorICAgKiBleGVjdXRpbmcgdGhlIHJlc3BvbnNlIGJvZHkgaWYgdGhlIHJlc291cmNlIFVSSSB3ZXJlIHRvIGJlIHJlZmVyZW5jZWQgdXNpbmcKKyAgICogYSAmbHQ7c2NyaXB0IHNyYz0iLi4uJmd0OyBIVE1MIHRhZyBmcm9tIGFub3RoZXIgd2ViIHNpdGUuIENsaWVudHMgdXNpbmcgdGhlCisgICAqIEhUVFAgaW50ZXJmYWNlIHdpbGwgbmVlZCB0byBhbHdheXMgc3RyaXAgdGhlIGZpcnN0IGxpbmUgb2YgcmVzcG9uc2UgZGF0YSB0bworICAgKiByZW1vdmUgdGhpcyBtYWdpYyBoZWFkZXIuCisgICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBKU09OX01BR0lDOworCisgIHN0YXRpYyB7CisgICAgSlNPTl9NQUdJQyA9ICIpXX0nXG4iLmdldEJ5dGVzKFVURl84KTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2xvYmFscyB7CisgICAgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IGN1cnJlbnRVc2VyOworICAgIGZpbmFsIFByb3ZpZGVyPFdlYlNlc3Npb24+IHdlYlNlc3Npb247CisgICAgZmluYWwgUHJvdmlkZXI8UGFyYW1ldGVyUGFyc2VyPiBwYXJhbVBhcnNlcjsKKyAgICBmaW5hbCBBdWRpdFNlcnZpY2UgYXVkaXRTZXJ2aWNlOworCisgICAgQEluamVjdAorICAgIEdsb2JhbHMoUHJvdmlkZXI8Q3VycmVudFVzZXI+IGN1cnJlbnRVc2VyLAorICAgICAgICBQcm92aWRlcjxXZWJTZXNzaW9uPiB3ZWJTZXNzaW9uLAorICAgICAgICBQcm92aWRlcjxQYXJhbWV0ZXJQYXJzZXI+IHBhcmFtUGFyc2VyLAorICAgICAgICBBdWRpdFNlcnZpY2UgYXVkaXRTZXJ2aWNlKSB7CisgICAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7CisgICAgICB0aGlzLndlYlNlc3Npb24gPSB3ZWJTZXNzaW9uOworICAgICAgdGhpcy5wYXJhbVBhcnNlciA9IHBhcmFtUGFyc2VyOworICAgICAgdGhpcy5hdWRpdFNlcnZpY2UgPSBhdWRpdFNlcnZpY2U7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBHbG9iYWxzIGdsb2JhbHM7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmVzdENvbGxlY3Rpb248UmVzdFJlc291cmNlLCBSZXN0UmVzb3VyY2U+PiBtZW1iZXJzOworCisgIHB1YmxpYyBSZXN0QXBpU2VydmxldChHbG9iYWxzIGdsb2JhbHMsCisgICAgICBSZXN0Q29sbGVjdGlvbjw/IGV4dGVuZHMgUmVzdFJlc291cmNlLCA/IGV4dGVuZHMgUmVzdFJlc291cmNlPiBtZW1iZXJzKSB7CisgICAgdGhpcyhnbG9iYWxzLCBQcm92aWRlcnMub2YobWVtYmVycykpOworICB9CisKKyAgcHVibGljIFJlc3RBcGlTZXJ2bGV0KEdsb2JhbHMgZ2xvYmFscywKKyAgICAgIFByb3ZpZGVyPD8gZXh0ZW5kcyBSZXN0Q29sbGVjdGlvbjw/IGV4dGVuZHMgUmVzdFJlc291cmNlLCA/IGV4dGVuZHMgUmVzdFJlc291cmNlPj4gbWVtYmVycykgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIFByb3ZpZGVyPFJlc3RDb2xsZWN0aW9uPFJlc3RSZXNvdXJjZSwgUmVzdFJlc291cmNlPj4gbiA9CisgICAgICAgIChQcm92aWRlcjxSZXN0Q29sbGVjdGlvbjxSZXN0UmVzb3VyY2UsIFJlc3RSZXNvdXJjZT4+KSBjaGVja05vdE51bGwoKE9iamVjdCkgbWVtYmVycyk7CisgICAgdGhpcy5nbG9iYWxzID0gZ2xvYmFsczsKKyAgICB0aGlzLm1lbWJlcnMgPSBuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGxvbmcgYXVkaXRTdGFydFRzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyZXMpOworICAgIHJlcy5zZXRIZWFkZXIoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCAiYXR0YWNobWVudCIpOworICAgIHJlcy5zZXRIZWFkZXIoIlgtQ29udGVudC1UeXBlLU9wdGlvbnMiLCAibm9zbmlmZiIpOworICAgIGludCBzdGF0dXMgPSBTQ19PSzsKKyAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsKKyAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gTGlua2VkSGFzaE11bHRpbWFwLmNyZWF0ZSgpOworICAgIE9iamVjdCBpbnB1dFJlcXVlc3RCb2R5ID0gbnVsbDsKKworICAgIHRyeSB7CisgICAgICBjaGVja1VzZXJTZXNzaW9uKHJlcSk7CisKKyAgICAgIExpc3Q8SWRTdHJpbmc+IHBhdGggPSBzcGxpdFBhdGgocmVxKTsKKyAgICAgIFJlc3RDb2xsZWN0aW9uPFJlc3RSZXNvdXJjZSwgUmVzdFJlc291cmNlPiByYyA9IG1lbWJlcnMuZ2V0KCk7CisgICAgICBjaGVja0FjY2Vzc0Fubm90YXRpb25zKHJjLmdldENsYXNzKCkpOworCisgICAgICBSZXN0UmVzb3VyY2UgcnNyYyA9IFRvcExldmVsUmVzb3VyY2UuSU5TVEFOQ0U7CisgICAgICBSZXN0VmlldzxSZXN0UmVzb3VyY2U+IHZpZXcgPSBudWxsOworICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICgiR0VUIi5lcXVhbHMocmVxLmdldE1ldGhvZCgpKSkgeworICAgICAgICAgIHZpZXcgPSByYy5saXN0KCk7CisgICAgICAgIH0gZWxzZSBpZiAocmMgaW5zdGFuY2VvZiBBY2NlcHRzUG9zdCAmJiAiUE9TVCIuZXF1YWxzKHJlcS5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICBBY2NlcHRzUG9zdDxSZXN0UmVzb3VyY2U+IGFjID0gKEFjY2VwdHNQb3N0PFJlc3RSZXNvdXJjZT4pIHJjOworICAgICAgICAgIHZpZXcgPSBhYy5wb3N0KHJzcmMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIElkU3RyaW5nIGlkID0gcGF0aC5yZW1vdmUoMCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcnNyYyA9IHJjLnBhcnNlKHJzcmMsIGlkKTsKKyAgICAgICAgICBjaGVja1ByZWNvbmRpdGlvbnMocmVxLCByc3JjKTsKKyAgICAgICAgfSBjYXRjaCAoUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgaWYgKHJjIGluc3RhbmNlb2YgQWNjZXB0c0NyZWF0ZQorICAgICAgICAgICAgICAmJiBwYXRoLmlzRW1wdHkoKQorICAgICAgICAgICAgICAmJiAoIlBPU1QiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpCisgICAgICAgICAgICAgICAgICB8fCAiUFVUIi5lcXVhbHMocmVxLmdldE1ldGhvZCgpKSkpIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgQWNjZXB0c0NyZWF0ZTxSZXN0UmVzb3VyY2U+IGFjID0gKEFjY2VwdHNDcmVhdGU8UmVzdFJlc291cmNlPikgcmM7CisgICAgICAgICAgICB2aWV3ID0gYWMuY3JlYXRlKHJzcmMsIGlkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFNDX0NSRUFURUQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKKyAgICAgICAgICB2aWV3ID0gdmlldyhyYywgcmVxLmdldE1ldGhvZCgpLCBwYXRoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2hlY2tBY2Nlc3NBbm5vdGF0aW9ucyh2aWV3LmdldENsYXNzKCkpOworCisgICAgICB3aGlsZSAodmlldyBpbnN0YW5jZW9mIFJlc3RDb2xsZWN0aW9uPD8sPz4pIHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIFJlc3RDb2xsZWN0aW9uPFJlc3RSZXNvdXJjZSwgUmVzdFJlc291cmNlPiBjID0KKyAgICAgICAgICAgIChSZXN0Q29sbGVjdGlvbjxSZXN0UmVzb3VyY2UsIFJlc3RSZXNvdXJjZT4pIHZpZXc7CisKKyAgICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgaWYgKCJHRVQiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpKSB7CisgICAgICAgICAgICB2aWV3ID0gYy5saXN0KCk7CisgICAgICAgICAgfSBlbHNlIGlmIChjIGluc3RhbmNlb2YgQWNjZXB0c1Bvc3QgJiYgIlBPU1QiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpKSB7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgIEFjY2VwdHNQb3N0PFJlc3RSZXNvdXJjZT4gYWMgPSAoQWNjZXB0c1Bvc3Q8UmVzdFJlc291cmNlPikgYzsKKyAgICAgICAgICAgIHZpZXcgPSBhYy5wb3N0KHJzcmMpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBJZFN0cmluZyBpZCA9IHBhdGgucmVtb3ZlKDApOworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICByc3JjID0gYy5wYXJzZShyc3JjLCBpZCk7CisgICAgICAgICAgICBjaGVja1ByZWNvbmRpdGlvbnMocmVxLCByc3JjKTsKKyAgICAgICAgICAgIHZpZXcgPSBudWxsOworICAgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBBY2NlcHRzQ3JlYXRlCisgICAgICAgICAgICAgICAgJiYgcGF0aC5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiAoIlBPU1QiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICJQVVQiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpKSkgeworICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgICAgQWNjZXB0c0NyZWF0ZTxSZXN0UmVzb3VyY2U+IGFjID0gKEFjY2VwdHNDcmVhdGU8UmVzdFJlc291cmNlPikgYzsKKyAgICAgICAgICAgICAgdmlldyA9IGFjLmNyZWF0ZShyc3JjLCBpZCk7CisgICAgICAgICAgICAgIHN0YXR1cyA9IFNDX0NSRUFURUQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICB2aWV3ID0gdmlldyhjLCByZXEuZ2V0TWV0aG9kKCksIHBhdGgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjaGVja0FjY2Vzc0Fubm90YXRpb25zKHZpZXcuZ2V0Q2xhc3MoKSk7CisgICAgICB9CisKKyAgICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBjb25maWcgPSBMaW5rZWRIYXNoTXVsdGltYXAuY3JlYXRlKCk7CisgICAgICBQYXJhbWV0ZXJQYXJzZXIuc3BsaXRRdWVyeVN0cmluZyhyZXEuZ2V0UXVlcnlTdHJpbmcoKSwgY29uZmlnLCBwYXJhbXMpOworICAgICAgaWYgKCFnbG9iYWxzLnBhcmFtUGFyc2VyLmdldCgpLnBhcnNlKHZpZXcsIHBhcmFtcywgcmVxLCByZXMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaWYgKHZpZXcgaW5zdGFuY2VvZiBSZXN0TW9kaWZ5Vmlldzw/LCA/PikgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgUmVzdE1vZGlmeVZpZXc8UmVzdFJlc291cmNlLCBPYmplY3Q+IG0gPQorICAgICAgICAgICAgKFJlc3RNb2RpZnlWaWV3PFJlc3RSZXNvdXJjZSwgT2JqZWN0PikgdmlldzsKKworICAgICAgICBpbnB1dFJlcXVlc3RCb2R5ID0gcGFyc2VSZXF1ZXN0KHJlcSwgaW5wdXRUeXBlKG0pKTsKKyAgICAgICAgcmVzdWx0ID0gbS5hcHBseShyc3JjLCBpbnB1dFJlcXVlc3RCb2R5KTsKKyAgICAgIH0gZWxzZSBpZiAodmlldyBpbnN0YW5jZW9mIFJlc3RSZWFkVmlldzw/PikgeworICAgICAgICByZXN1bHQgPSAoKFJlc3RSZWFkVmlldzxSZXN0UmVzb3VyY2U+KSB2aWV3KS5hcHBseShyc3JjKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZXNwb25zZSkgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgICAgICBSZXNwb25zZSByID0gKFJlc3BvbnNlKSByZXN1bHQ7CisgICAgICAgIHN0YXR1cyA9IHIuc3RhdHVzQ29kZSgpOworICAgICAgfSBlbHNlIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZXNwb25zZS5SZWRpcmVjdCkgeworICAgICAgICByZXMuc2VuZFJlZGlyZWN0KCgoUmVzcG9uc2UuUmVkaXJlY3QpIHJlc3VsdCkubG9jYXRpb24oKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHJlcy5zZXRTdGF0dXMoc3RhdHVzKTsKKworICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFN0cmVhbWluZ1Jlc3BvbnNlKSB7CisgICAgICAgIFN0cmVhbWluZ1Jlc3BvbnNlIHIgPSAoU3RyZWFtaW5nUmVzcG9uc2UpIHJlc3VsdDsKKyAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKHIuZ2V0Q29udGVudFR5cGUoKSk7CisgICAgICAgIHIuc3RyZWFtKHJlcy5nZXRPdXRwdXRTdHJlYW0oKSk7CisgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBSZXNwb25zZS5ub25lKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gUmVzcG9uc2UudW53cmFwKHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBCaW5hcnlSZXN1bHQpIHsKKyAgICAgICAgICByZXBseUJpbmFyeVJlc3VsdChyZXEsIHJlcywgKEJpbmFyeVJlc3VsdCkgcmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXBseUpzb24ocmVxLCByZXMsIGNvbmZpZywgcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKEF1dGhFeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IFNDX0ZPUkJJRERFTiwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEJhZFJlcXVlc3RFeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IFNDX0JBRF9SRVFVRVNULCBlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfTUVUSE9EX05PVF9BTExPV0VELCAiTWV0aG9kIG5vdCBhbGxvd2VkIik7CisgICAgfSBjYXRjaCAoUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXBseUVycm9yKHJlcywgc3RhdHVzID0gU0NfQ09ORkxJQ1QsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChQcmVjb25kaXRpb25GYWlsZWRFeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IFNDX1BSRUNPTkRJVElPTl9GQUlMRUQsCisgICAgICAgICAgT2JqZWN0cy5maXJzdE5vbk51bGwoZS5nZXRNZXNzYWdlKCksICJQcmVjb25kaXRpb24gZmFpbGVkIikpOworICAgIH0gY2F0Y2ggKFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IFNDX05PVF9GT1VORCwgIk5vdCBmb3VuZCIpOworICAgIH0gY2F0Y2ggKFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IDQyMiwKKyAgICAgICAgICBPYmplY3RzLmZpcnN0Tm9uTnVsbChlLmdldE1lc3NhZ2UoKSwgIlVucHJvY2Vzc2FibGUgRW50aXR5IikpOworICAgIH0gY2F0Y2ggKEFtYmlndW91c1ZpZXdFeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IFNDX05PVF9GT1VORCwgZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKE1hbGZvcm1lZEpzb25FeGNlcHRpb24gZSkgeworICAgICAgcmVwbHlFcnJvcihyZXMsIHN0YXR1cyA9IFNDX0JBRF9SRVFVRVNULCAiSW52YWxpZCAiICsgSlNPTl9UWVBFICsgIiBpbiByZXF1ZXN0Iik7CisgICAgfSBjYXRjaCAoSnNvblBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcGx5RXJyb3IocmVzLCBzdGF0dXMgPSBTQ19CQURfUkVRVUVTVCwgIkludmFsaWQgIiArIEpTT05fVFlQRSArICIgaW4gcmVxdWVzdCIpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBzdGF0dXMgPSBTQ19JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICBoYW5kbGVFeGNlcHRpb24oZSwgcmVxLCByZXMpOworICAgIH0gZmluYWxseSB7CisgICAgICBnbG9iYWxzLmF1ZGl0U2VydmljZS5kaXNwYXRjaChuZXcgSHR0cEF1ZGl0RXZlbnQoZ2xvYmFscy53ZWJTZXNzaW9uLmdldCgpCisgICAgICAgICAgLmdldFNlc3Npb25JZCgpLCBnbG9iYWxzLmN1cnJlbnRVc2VyLmdldCgpLCByZXEuZ2V0UmVxdWVzdFVSSSgpLAorICAgICAgICAgIGF1ZGl0U3RhcnRUcywgcGFyYW1zLCByZXEuZ2V0TWV0aG9kKCksIGlucHV0UmVxdWVzdEJvZHksIHN0YXR1cywKKyAgICAgICAgICByZXN1bHQpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tQcmVjb25kaXRpb25zKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIFJlc3RSZXNvdXJjZSByc3JjKQorICAgICAgdGhyb3dzIFByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgaWYgKCIqIi5lcXVhbHMocmVxLmdldEhlYWRlcigiSWYtTm9uZS1NYXRjaCIpKSkgeworICAgICAgdGhyb3cgbmV3IFByZWNvbmRpdGlvbkZhaWxlZEV4Y2VwdGlvbigiUmVzb3VyY2UgYWxyZWFkeSBleGlzdHMiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBUeXBlIGlucHV0VHlwZShSZXN0TW9kaWZ5VmlldzxSZXN0UmVzb3VyY2UsIE9iamVjdD4gbSkgeworICAgIFR5cGUgaW5wdXRUeXBlID0gZXh0cmFjdElucHV0VHlwZShtLmdldENsYXNzKCkpOworICAgIGlmIChpbnB1dFR5cGUgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJWaWV3ICVzIGRvZXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnQgJXMiLAorICAgICAgICAgIG0uZ2V0Q2xhc3MoKSwgUmVzdE1vZGlmeVZpZXcuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgfQorICAgIHJldHVybiBpbnB1dFR5cGU7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICBwcml2YXRlIHN0YXRpYyBUeXBlIGV4dHJhY3RJbnB1dFR5cGUoQ2xhc3MgY2xhenopIHsKKyAgICBmb3IgKFR5cGUgdCA6IGNsYXp6LmdldEdlbmVyaWNJbnRlcmZhY2VzKCkpIHsKKyAgICAgIGlmICh0IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUKKyAgICAgICAgICAmJiAoKFBhcmFtZXRlcml6ZWRUeXBlKSB0KS5nZXRSYXdUeXBlKCkgPT0gUmVzdE1vZGlmeVZpZXcuY2xhc3MpIHsKKyAgICAgICAgcmV0dXJuICgoUGFyYW1ldGVyaXplZFR5cGUpIHQpLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVsxXTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2xhenouZ2V0U3VwZXJjbGFzcygpICE9IG51bGwpIHsKKyAgICAgIFR5cGUgaSA9IGV4dHJhY3RJbnB1dFR5cGUoY2xhenouZ2V0U3VwZXJjbGFzcygpKTsKKyAgICAgIGlmIChpICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChDbGFzcyB0IDogY2xhenouZ2V0SW50ZXJmYWNlcygpKSB7CisgICAgICBUeXBlIGkgPSBleHRyYWN0SW5wdXRUeXBlKHQpOworICAgICAgaWYgKGkgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIHByaXZhdGUgT2JqZWN0IHBhcnNlUmVxdWVzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBUeXBlIHR5cGUpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uLAorICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCisgICAgICBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIHsKKyAgICBpZiAoaXNUeXBlKEpTT05fVFlQRSwgcmVxLmdldENvbnRlbnRUeXBlKCkpKSB7CisgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IHJlcS5nZXRSZWFkZXIoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIEpzb25SZWFkZXIganNvbiA9IG5ldyBKc29uUmVhZGVyKGJyKTsKKyAgICAgICAganNvbi5zZXRMZW5pZW50KHRydWUpOworCisgICAgICAgIEpzb25Ub2tlbiBmaXJzdDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBmaXJzdCA9IGpzb24ucGVlaygpOworICAgICAgICB9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJFeHBlY3RlZCBKU09OIG9iamVjdCIpOworICAgICAgICB9CisgICAgICAgIGlmIChmaXJzdCA9PSBKc29uVG9rZW4uU1RSSU5HKSB7CisgICAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nKGpzb24ubmV4dFN0cmluZygpLCB0eXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT3V0cHV0Rm9ybWF0LkpTT04ubmV3R3NvbigpLmZyb21Kc29uKGpzb24sIHR5cGUpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgYnIuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCJQVVQiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpICYmIGFjY2VwdHNQdXRJbnB1dCh0eXBlKSkgeworICAgICAgcmV0dXJuIHBhcnNlUHV0SW5wdXQocmVxLCB0eXBlKTsKKyAgICB9IGVsc2UgaWYgKCJERUxFVEUiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpICYmIGhhc05vQm9keShyZXEpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGVsc2UgaWYgKGhhc05vQm9keShyZXEpKSB7CisgICAgICByZXR1cm4gY3JlYXRlSW5zdGFuY2UodHlwZSk7CisgICAgfSBlbHNlIGlmIChpc1R5cGUoInRleHQvcGxhaW4iLCByZXEuZ2V0Q29udGVudFR5cGUoKSkpIHsKKyAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gcmVxLmdldFJlYWRlcigpOworICAgICAgdHJ5IHsKKyAgICAgICAgY2hhcltdIHRtcCA9IG5ldyBjaGFyWzI1Nl07CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpbnQgbjsKKyAgICAgICAgd2hpbGUgKDAgPCAobiA9IGJyLnJlYWQodG1wKSkpIHsKKyAgICAgICAgICBzYi5hcHBlbmQodG1wLCAwLCBuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoc2IudG9TdHJpbmcoKSwgdHlwZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBici5jbG9zZSgpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIlBPU1QiLmVxdWFscyhyZXEuZ2V0TWV0aG9kKCkpCisgICAgICAgICYmIGlzVHlwZShGT1JNX1RZUEUsIHJlcS5nZXRDb250ZW50VHlwZSgpKSkgeworICAgICAgcmV0dXJuIE91dHB1dEZvcm1hdC5KU09OLm5ld0dzb24oKS5mcm9tSnNvbigKKyAgICAgICAgICBQYXJhbWV0ZXJQYXJzZXIuZm9ybVRvSnNvbihyZXEpLAorICAgICAgICAgIHR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiRXhwZWN0ZWQgQ29udGVudC1UeXBlOiAiICsgSlNPTl9UWVBFKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc05vQm9keShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgaW50IGxlbiA9IHJlcS5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgU3RyaW5nIHR5cGUgPSByZXEuZ2V0Q29udGVudFR5cGUoKTsKKyAgICByZXR1cm4gKGxlbiA8PSAwICYmIHR5cGUgPT0gbnVsbCkKKyAgICAgICAgfHwgKGxlbiA9PSAwICYmIGlzVHlwZShGT1JNX1RZUEUsIHR5cGUpKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYWNjZXB0c1B1dElucHV0KFR5cGUgdHlwZSkgeworICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgIGZvciAoRmllbGQgZiA6ICgoQ2xhc3MpIHR5cGUpLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgaWYgKGYuZ2V0VHlwZSgpID09IFB1dElucHV0LmNsYXNzKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBPYmplY3QgcGFyc2VQdXRJbnB1dChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBUeXBlIHR5cGUpCisgICAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwKKyAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwKKyAgICAgIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24geworICAgIE9iamVjdCBvYmogPSBjcmVhdGVJbnN0YW5jZSh0eXBlKTsKKyAgICBmb3IgKEZpZWxkIGYgOiBvYmouZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICBpZiAoZi5nZXRUeXBlKCkgPT0gUHV0SW5wdXQuY2xhc3MpIHsKKyAgICAgICAgZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICBmLnNldChvYmosIG5ldyBQdXRJbnB1dCgpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlcS5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHJlcS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBvYmo7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgIH0KKworICBwcml2YXRlIE9iamVjdCBwYXJzZVN0cmluZyhTdHJpbmcgdmFsdWUsIFR5cGUgdHlwZSkKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBTZWN1cml0eUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLAorICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLAorICAgICAgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgaWYgKHR5cGUgPT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgT2JqZWN0IG9iaiA9IGNyZWF0ZUluc3RhbmNlKHR5cGUpOworICAgIEZpZWxkW10gZmllbGRzID0gb2JqLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKKyAgICBpZiAoZmllbGRzLmxlbmd0aCA9PSAwICYmIFN0cmluZ3MuaXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKyAgICAgIHJldHVybiBvYmo7CisgICAgfQorICAgIGZvciAoRmllbGQgZiA6IGZpZWxkcykgeworICAgICAgaWYgKGYuZ2V0QW5ub3RhdGlvbihEZWZhdWx0SW5wdXQuY2xhc3MpICE9IG51bGwKKyAgICAgICAgICAmJiBmLmdldFR5cGUoKSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICBmLnNldChvYmosIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIG9iajsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIkV4cGVjdGVkIEpTT04gb2JqZWN0Iik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlSW5zdGFuY2UoVHlwZSB0eXBlKQorICAgICAgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgQ2xhc3M8T2JqZWN0PiBjbGF6eiA9IChDbGFzczxPYmplY3Q+KSB0eXBlOworICAgICAgQ29uc3RydWN0b3I8T2JqZWN0PiBjID0gY2xhenouZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcigpOworICAgICAgYy5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgcmV0dXJuIGMubmV3SW5zdGFuY2UoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FeGNlcHRpb24oIkNhbm5vdCBtYWtlICIgKyB0eXBlKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVwbHlKc29uKEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gY29uZmlnLAorICAgICAgT2JqZWN0IHJlc3VsdCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYnVmID0gaGVhcChJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgYnVmLndyaXRlKEpTT05fTUFHSUMpOworICAgIFdyaXRlciB3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCBVVEZfOCkpOworICAgIEdzb24gZ3NvbiA9IG5ld0dzb24oY29uZmlnLCByZXEpOworICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBKc29uRWxlbWVudCkgeworICAgICAgZ3Nvbi50b0pzb24oKEpzb25FbGVtZW50KSByZXN1bHQsIHcpOworICAgIH0gZWxzZSB7CisgICAgICBnc29uLnRvSnNvbihyZXN1bHQsIHcpOworICAgIH0KKyAgICB3LndyaXRlKCdcbicpOworICAgIHcuZmx1c2goKTsKKworICAgIHJlcGx5QmluYXJ5UmVzdWx0KHJlcSwgcmVzLCBuZXcgQmluYXJ5UmVzdWx0KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gYnVmLmxlbmd0aCgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWYud3JpdGVUbyhvcywgbnVsbCk7CisgICAgICB9CisgICAgfS5zZXRDb250ZW50VHlwZShKU09OX1RZUEUpLnNldENoYXJhY3RlckVuY29kaW5nKFVURl84Lm5hbWUoKSkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgR3NvbiBuZXdHc29uKE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBjb25maWcsCisgICAgICBATnVsbGFibGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIEdzb25CdWlsZGVyIGdiID0gT3V0cHV0Rm9ybWF0LkpTT05fQ09NUEFDVC5uZXdHc29uQnVpbGRlcigpOworCisgICAgZW5hYmxlUHJldHR5UHJpbnQoZ2IsIGNvbmZpZywgcmVxKTsKKyAgICBlbmFibGVQYXJ0aWFsR2V0RmllbGRzKGdiLCBjb25maWcpOworCisgICAgcmV0dXJuIGdiLmNyZWF0ZSgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmFibGVQcmV0dHlQcmludChHc29uQnVpbGRlciBnYiwKKyAgICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBjb25maWcsCisgICAgICBATnVsbGFibGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIFN0cmluZyBwcCA9IEl0ZXJhYmxlcy5nZXRGaXJzdChjb25maWcuZ2V0KCJwcCIpLCBudWxsKTsKKyAgICBpZiAocHAgPT0gbnVsbCkgeworICAgICAgcHAgPSBJdGVyYWJsZXMuZ2V0Rmlyc3QoY29uZmlnLmdldCgicHJldHR5UHJpbnQiKSwgbnVsbCk7CisgICAgICBpZiAocHAgPT0gbnVsbCAmJiByZXEgIT0gbnVsbCkgeworICAgICAgICBwcCA9IGFjY2VwdHNKc29uKHJlcSkgPyAiMCIgOiAiMSI7CisgICAgICB9CisgICAgfQorICAgIGlmICgiMSIuZXF1YWxzKHBwKSB8fCAidHJ1ZSIuZXF1YWxzKHBwKSkgeworICAgICAgZ2Iuc2V0UHJldHR5UHJpbnRpbmcoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuYWJsZVBhcnRpYWxHZXRGaWVsZHMoR3NvbkJ1aWxkZXIgZ2IsCisgICAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gY29uZmlnKSB7CisgICAgZmluYWwgU2V0PFN0cmluZz4gd2FudCA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoU3RyaW5nIHAgOiBjb25maWcuZ2V0KCJmaWVsZHMiKSkgeworICAgICAgSXRlcmFibGVzLmFkZEFsbCh3YW50LCBTcGxpdHRlci5vbignLCcpCisgICAgICAgICAgLm9taXRFbXB0eVN0cmluZ3MoKS50cmltUmVzdWx0cygpCisgICAgICAgICAgLnNwbGl0KHApKTsKKyAgICB9CisgICAgaWYgKCF3YW50LmlzRW1wdHkoKSkgeworICAgICAgZ2IuYWRkU2VyaWFsaXphdGlvbkV4Y2x1c2lvblN0cmF0ZWd5KG5ldyBFeGNsdXNpb25TdHJhdGVneSgpIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFNraXBGaWVsZChGaWVsZEF0dHJpYnV0ZXMgZmllbGQpIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSA9IG5hbWVzLmdldChmaWVsZC5nZXROYW1lKCkpOworICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIE5hbWVzIGFyZSBzdXBwbGllZCBieSBHc29uIGluIHRlcm1zIG9mIEphdmEgc291cmNlLgorICAgICAgICAgICAgLy8gVHJhbnNsYXRlIGFuZCBjYWNoZSB0aGUgSlNPTiBsb3dlcl9jYXNlX3N0eWxlIHVzZWQuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBuYW1lID0KKyAgICAgICAgICAgICAgICAgIEZpZWxkTmFtaW5nUG9saWN5LkxPV0VSX0NBU0VfV0lUSF9VTkRFUlNDT1JFUy50cmFuc2xhdGVOYW1lKC8vCisgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKGZpZWxkLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICBuYW1lcy5wdXQoZmllbGQuZ2V0TmFtZSgpLCBuYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gIXdhbnQuY29udGFpbnMobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkU2tpcENsYXNzKENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9KTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgdm9pZCByZXBseUJpbmFyeVJlc3VsdCgKKyAgICAgIEBOdWxsYWJsZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBCaW5hcnlSZXN1bHQgYmluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXMuc2V0Q29udGVudFR5cGUoYmluLmdldENvbnRlbnRUeXBlKCkpOworICAgICAgT3V0cHV0U3RyZWFtIGRzdCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGxvbmcgbGVuID0gYmluLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgYm9vbGVhbiBnemlwID0gYmluLmNhbkd6aXAoKSAmJiBhY2NlcHRzR3ppcChyZXEpOworICAgICAgICBpZiAoZ3ppcCAmJiAyNTYgPD0gbGVuICYmIGxlbiA8PSAoMTAgPDwgMjApKSB7CisgICAgICAgICAgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYnVmID0gY29tcHJlc3MoYmluKTsKKyAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpIDwgbGVuKSB7CisgICAgICAgICAgICByZXMuc2V0Q29udGVudExlbmd0aCgoaW50KSBidWYubGVuZ3RoKCkpOworICAgICAgICAgICAgcmVzLnNldEhlYWRlcigiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisgICAgICAgICAgICBidWYud3JpdGVUbyhkc3QsIG51bGwpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXBseVVuY29tcHJlc3NlZChyZXMsIGRzdCwgYmluLCBsZW4pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChnemlwKSB7CisgICAgICAgICAgcmVzLnNldEhlYWRlcigiQ29udGVudC1FbmNvZGluZyIsICJnemlwIik7CisgICAgICAgICAgZHN0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oZHN0KTsKKyAgICAgICAgICBiaW4ud3JpdGVUbyhkc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlcGx5VW5jb21wcmVzc2VkKHJlcywgZHN0LCBiaW4sIGxlbik7CisgICAgICAgIH0KKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGRzdC5jbG9zZSgpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBiaW4uY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcGx5VW5jb21wcmVzc2VkKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLAorICAgICAgT3V0cHV0U3RyZWFtIGRzdCwgQmluYXJ5UmVzdWx0IGJpbiwgbG9uZyBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKDAgPD0gbGVuICYmIGxlbiA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICByZXMuc2V0Q29udGVudExlbmd0aCgoaW50KSBsZW4pOworICAgIH0gZWxzZSBpZiAoMCA8PSBsZW4pIHsKKyAgICAgIHJlcy5zZXRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgTG9uZy50b1N0cmluZyhsZW4pKTsKKyAgICB9CisgICAgYmluLndyaXRlVG8oZHN0KTsKKyAgfQorCisgIHByaXZhdGUgUmVzdFZpZXc8UmVzdFJlc291cmNlPiB2aWV3KAorICAgICAgUmVzdENvbGxlY3Rpb248UmVzdFJlc291cmNlLCBSZXN0UmVzb3VyY2U+IHJjLAorICAgICAgU3RyaW5nIG1ldGhvZCwgTGlzdDxJZFN0cmluZz4gcGF0aCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sCisgICAgICBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBBbWJpZ3VvdXNWaWV3RXhjZXB0aW9uIHsKKyAgICBEeW5hbWljTWFwPFJlc3RWaWV3PFJlc3RSZXNvdXJjZT4+IHZpZXdzID0gcmMudmlld3MoKTsKKyAgICBmaW5hbCBJZFN0cmluZyBwcm9qZWN0aW9uID0gcGF0aC5pc0VtcHR5KCkKKyAgICAgICAgPyBJZFN0cmluZy5mcm9tVXJsKCIvIikKKyAgICAgICAgOiBwYXRoLnJlbW92ZSgwKTsKKyAgICBpZiAoIXBhdGguaXNFbXB0eSgpKSB7CisgICAgICAvLyBJZiB0aGVyZSBhcmUgcGF0aCBjb21wb25lbnRzIHN0aWxsIHJlbWFpbmluZyBhZnRlciB0aGlzIHByb2plY3Rpb24KKyAgICAgIC8vIGlzIGNob3NlbiwgbG9vayBmb3IgdGhlIHByb2plY3Rpb24gYmFzZWQgdXBvbiBHRVQgYXMgdGhlIG1ldGhvZCBhcworICAgICAgLy8gdGhlIGNsaWVudCB0aGlua3MgaXQgaXMgYSBuZXN0ZWQgY29sbGVjdGlvbi4KKyAgICAgIG1ldGhvZCA9ICJHRVQiOworICAgIH0KKworICAgIExpc3Q8U3RyaW5nPiBwID0gc3BsaXRQcm9qZWN0aW9uKHByb2plY3Rpb24pOworICAgIGlmIChwLnNpemUoKSA9PSAyKSB7CisgICAgICBSZXN0VmlldzxSZXN0UmVzb3VyY2U+IHZpZXcgPQorICAgICAgICAgIHZpZXdzLmdldChwLmdldCgwKSwgbWV0aG9kICsgIi4iICsgcC5nZXQoMSkpOworICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gdmlldzsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKHByb2plY3Rpb24pOworICAgIH0KKworICAgIFN0cmluZyBuYW1lID0gbWV0aG9kICsgIi4iICsgcC5nZXQoMCk7CisgICAgUmVzdFZpZXc8UmVzdFJlc291cmNlPiBjb3JlID0gdmlld3MuZ2V0KCJnZXJyaXQiLCBuYW1lKTsKKyAgICBpZiAoY29yZSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gY29yZTsKKyAgICB9CisKKyAgICBNYXA8U3RyaW5nLCBSZXN0VmlldzxSZXN0UmVzb3VyY2U+PiByID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgZm9yIChTdHJpbmcgcGx1Z2luIDogdmlld3MucGx1Z2lucygpKSB7CisgICAgICBSZXN0VmlldzxSZXN0UmVzb3VyY2U+IGFjdGlvbiA9IHZpZXdzLmdldChwbHVnaW4sIG5hbWUpOworICAgICAgaWYgKGFjdGlvbiAhPSBudWxsKSB7CisgICAgICAgIHIucHV0KHBsdWdpbiwgYWN0aW9uKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoci5zaXplKCkgPT0gMSkgeworICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5nZXRGaXJzdChyLnZhbHVlcygpLCBudWxsKTsKKyAgICB9IGVsc2UgaWYgKHIuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihwcm9qZWN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEFtYmlndW91c1ZpZXdFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgIlByb2plY3Rpb24gJXMgaXMgYW1iaWd1b3VzOiAiLAorICAgICAgICBuYW1lLAorICAgICAgICBKb2luZXIub24oIiwgIikuam9pbigKKyAgICAgICAgICBJdGVyYWJsZXMudHJhbnNmb3JtKHIua2V5U2V0KCksIG5ldyBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoU3RyaW5nIGluKSB7CisgICAgICAgICAgICAgIHJldHVybiBpbiArICJ+IiArIHByb2plY3Rpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgfSkpKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxJZFN0cmluZz4gc3BsaXRQYXRoKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBTdHJpbmcgcGF0aCA9IHJlcS5nZXRQYXRoSW5mbygpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkocGF0aCkpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisgICAgTGlzdDxJZFN0cmluZz4gb3V0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChTdHJpbmcgcCA6IFNwbGl0dGVyLm9uKCcvJykuc3BsaXQocGF0aCkpIHsKKyAgICAgIG91dC5hZGQoSWRTdHJpbmcuZnJvbVVybChwKSk7CisgICAgfQorICAgIGlmIChvdXQuc2l6ZSgpID4gMCAmJiBvdXQuZ2V0KG91dC5zaXplKCkgLSAxKS5pc0VtcHR5KCkpIHsKKyAgICAgIG91dC5yZW1vdmUob3V0LnNpemUoKSAtIDEpOworICAgIH0KKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHNwbGl0UHJvamVjdGlvbihJZFN0cmluZyBwcm9qZWN0aW9uKSB7CisgICAgTGlzdDxTdHJpbmc+IHAgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoMik7CisgICAgSXRlcmFibGVzLmFkZEFsbChwLCBTcGxpdHRlci5vbignficpLmxpbWl0KDIpLnNwbGl0KHByb2plY3Rpb24uZ2V0KCkpKTsKKyAgICByZXR1cm4gcDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja1VzZXJTZXNzaW9uKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB7CisgICAgQ3VycmVudFVzZXIgdXNlciA9IGdsb2JhbHMuY3VycmVudFVzZXIuZ2V0KCk7CisgICAgaWYgKGlzU3RhdGVDaGFuZ2UocmVxKSkgeworICAgICAgaWYgKHVzZXIgaW5zdGFuY2VvZiBBbm9ueW1vdXNVc2VyKSB7CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIpOworICAgICAgfSBlbHNlIGlmICghZ2xvYmFscy53ZWJTZXNzaW9uLmdldCgpLmlzQWNjZXNzUGF0aE9rKEFjY2Vzc1BhdGguUkVTVF9BUEkpKSB7CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJJbnZhbGlkIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4gSW4gb3JkZXIgdG8gYXV0aGVudGljYXRlLCBwcmVmaXggdGhlIFJFU1QgZW5kcG9pbnQgVVJMIHdpdGggL2EvIChlLmcuIGh0dHA6Ly9leGFtcGxlLmNvbS9hL3Byb2plY3RzLykuIik7CisgICAgICB9CisgICAgfQorICAgIHVzZXIuc2V0QWNjZXNzUGF0aChBY2Nlc3NQYXRoLlJFU1RfQVBJKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTdGF0ZUNoYW5nZShIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgU3RyaW5nIG1ldGhvZCA9IHJlcS5nZXRNZXRob2QoKTsKKyAgICByZXR1cm4gISgiR0VUIi5lcXVhbHMobWV0aG9kKSB8fCAiSEVBRCIuZXF1YWxzKG1ldGhvZCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrQWNjZXNzQW5ub3RhdGlvbnMoQ2xhc3M8PyBleHRlbmRzIE9iamVjdD4gY2xhenopCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB7CisgICAgUmVxdWlyZXNDYXBhYmlsaXR5IHJjID0gY2xhenouZ2V0QW5ub3RhdGlvbihSZXF1aXJlc0NhcGFiaWxpdHkuY2xhc3MpOworICAgIGlmIChyYyAhPSBudWxsKSB7CisgICAgICBDdXJyZW50VXNlciB1c2VyID0gZ2xvYmFscy5jdXJyZW50VXNlci5nZXQoKTsKKyAgICAgIENhcGFiaWxpdHlDb250cm9sIGN0bCA9IHVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7CisgICAgICBpZiAoIWN0bC5jYW5QZXJmb3JtKHJjLnZhbHVlKCkpICYmICFjdGwuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJDYXBhYmlsaXR5ICVzIGlzIHJlcXVpcmVkIHRvIGFjY2VzcyB0aGlzIHJlc291cmNlIiwKKyAgICAgICAgICAgIHJjLnZhbHVlKCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXJyLCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorICAgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgU3RyaW5nIHVyaSA9IHJlcS5nZXRSZXF1ZXN0VVJJKCk7CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkocmVxLmdldFF1ZXJ5U3RyaW5nKCkpKSB7CisgICAgICB1cmkgKz0gIj8iICsgcmVxLmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgfQorICAgIGxvZy5lcnJvcihTdHJpbmcuZm9ybWF0KCJFcnJvciBpbiAlcyAlcyIsIHJlcS5nZXRNZXRob2QoKSwgdXJpKSwgZXJyKTsKKworICAgIGlmICghcmVzLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgIHJlcy5yZXNldCgpOworICAgICAgcmVwbHlFcnJvcihyZXMsIFNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwgIkludGVybmFsIHNlcnZlciBlcnJvciIpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkIHJlcGx5RXJyb3IoSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsIGludCBzdGF0dXNDb2RlLCBTdHJpbmcgbXNnKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICByZXMuc2V0U3RhdHVzKHN0YXR1c0NvZGUpOworICAgIHJlcGx5VGV4dChudWxsLCByZXMsIG1zZyk7CisgIH0KKworICBzdGF0aWMgdm9pZCByZXBseVRleHQoQE51bGxhYmxlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCisgICAgICBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywgU3RyaW5nIHRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKChyZXEgPT0gbnVsbCB8fCAiR0VUIi5lcXVhbHMocmVxLmdldE1ldGhvZCgpKSkgJiYgaXNNYXliZUhUTUwodGV4dCkpIHsKKyAgICAgIHJlcGx5SnNvbihyZXEsIHJlcywgSW1tdXRhYmxlTXVsdGltYXAub2YoInBwIiwgIjAiKSwgbmV3IEpzb25QcmltaXRpdmUodGV4dCkpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIXRleHQuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgdGV4dCArPSAiXG4iOworICAgICAgfQorICAgICAgcmVwbHlCaW5hcnlSZXN1bHQocmVxLCByZXMsCisgICAgICAgICAgQmluYXJ5UmVzdWx0LmNyZWF0ZSh0ZXh0KS5zZXRDb250ZW50VHlwZSgidGV4dC9wbGFpbiIpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIElTX0hUTUwgPSBQYXR0ZXJuLmNvbXBpbGUoIls8Jl0iKTsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01heWJlSFRNTChTdHJpbmcgdGV4dCkgeworICAgIHJldHVybiBJU19IVE1MLm1hdGNoZXIodGV4dCkuZmluZCgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhY2NlcHRzSnNvbihIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisgICAgcmV0dXJuIHJlcSAhPSBudWxsICYmIGlzVHlwZShKU09OX1RZUEUsIHJlcS5nZXRIZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBpZiAocmVxICE9IG51bGwpIHsKKyAgICAgIFN0cmluZyBhY2NlcHRzID0gcmVxLmdldEhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcpOworICAgICAgcmV0dXJuIGFjY2VwdHMgIT0gbnVsbCAmJiBhY2NlcHRzLmluZGV4T2YoImd6aXAiKSAhPSAtMTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1R5cGUoU3RyaW5nIGV4cGVjdCwgU3RyaW5nIGdpdmVuKSB7CisgICAgaWYgKGdpdmVuID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGV4cGVjdC5lcXVhbHMoZ2l2ZW4pKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGdpdmVuLnN0YXJ0c1dpdGgoZXhwZWN0ICsgIiwiKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGZvciAoU3RyaW5nIHAgOiBnaXZlbi5zcGxpdCgiWyAsO11bICw7XSoiKSkgeworICAgICAgaWYgKGV4cGVjdC5lcXVhbHMocCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGNvbXByZXNzKEJpbmFyeVJlc3VsdCBiaW4pCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGJ1ZiA9IGhlYXAoMjAgPDwgMjApOworICAgIEdaSVBPdXRwdXRTdHJlYW0gZ3ogPSBuZXcgR1pJUE91dHB1dFN0cmVhbShidWYpOworICAgIGJpbi53cml0ZVRvKGd6KTsKKyAgICBnei5maW5pc2goKTsKKyAgICBnei5mbHVzaCgpOworICAgIHJldHVybiBidWY7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBIZWFwIGhlYXAoaW50IG1heCkgeworICAgIHJldHVybiBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAobWF4KTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbWJpZ3VvdXNWaWV3RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgICBBbWJpZ3VvdXNWaWV3RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9BdWRpdGVkSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL0F1ZGl0ZWRIdHRwU2VydmxldFJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5YjU0YwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9BdWRpdGVkSHR0cFNlcnZsZXRSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworCitjbGFzcyBBdWRpdGVkSHR0cFNlcnZsZXRSZXNwb25zZQorICAgIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIKKyAgICBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVzcG9uc2UgeworICBwcml2YXRlIGludCBzdGF0dXM7CisKKyAgQXVkaXRlZEh0dHBTZXJ2bGV0UmVzcG9uc2UoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgfQorCisgIGludCBnZXRTdGF0dXMoKSB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IHNjKSB7CisgICAgc3VwZXIuc2V0U3RhdHVzKHNjKTsKKyAgICB0aGlzLnN0YXR1cyA9IHNjOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc2MsIFN0cmluZyBzbSkgeworICAgIHN1cGVyLnNldFN0YXR1cyhzYywgc20pOworICAgIHRoaXMuc3RhdHVzID0gc2M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzdXBlci5zZW5kRXJyb3Ioc2MpOworICAgIHRoaXMuc3RhdHVzID0gc2M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBzYywgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBzdXBlci5zZW5kRXJyb3Ioc2MsIG1zZyk7CisgICAgdGhpcy5zdGF0dXMgPSBzYzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzZW5kUmVkaXJlY3QoU3RyaW5nIGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHN1cGVyLnNlbmRSZWRpcmVjdChsb2NhdGlvbik7CisgICAgdGhpcy5zdGF0dXMgPSBTQ19NT1ZFRF9URU1QT1JBUklMWTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL0Jhc2VTZXJ2aWNlSW1wbGVtZW50YXRpb24uamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9CYXNlU2VydmljZUltcGxlbWVudGF0aW9uLmphdmEKaW5kZXggNjI1MDZmMC4uMzI3Nzk5MiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL0Jhc2VTZXJ2aWNlSW1wbGVtZW50YXRpb24uamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvQmFzZVNlcnZpY2VJbXBsZW1lbnRhdGlvbi5qYXZhCkBAIC00OCw2ICs0OCwxMCBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKKyAgcHJvdGVjdGVkIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgeworICAgIHJldHVybiBjdXJyZW50VXNlci5nZXQoKTsKKyAgfQorCiAgIC8qKgogICAgKiBFeGVjdXRlcyA8Y29kZT5hY3Rpb24ucnVuPC9jb2RlPiB3aXRoIGFuIGFjdGl2ZSBSZXZpZXdEYiBjb25uZWN0aW9uLgogICAgKiA8cD4KQEAgLTY4LDcgKzcyLDExIEBACiAgICAgfSBjYXRjaCAoSW52YWxpZFF1ZXJ5RXhjZXB0aW9uIGUpIHsKICAgICAgIGNhbGxiYWNrLm9uRmFpbHVyZShlKTsKICAgICB9IGNhdGNoIChOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgIGNhbGxiYWNrLm9uRmFpbHVyZShuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKCkpOworICAgICAgaWYgKGUuZ2V0TWVzc2FnZSgpICE9IG51bGwpIHsKKyAgICAgICAgY2FsbGJhY2sub25GYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxiYWNrLm9uRmFpbHVyZShuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKCkpOworICAgICAgfQogICAgIH0gY2F0Y2ggKE5vU3VjaEdyb3VwRXhjZXB0aW9uIGUpIHsKICAgICAgIGNhbGxiYWNrLm9uRmFpbHVyZShuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKCkpOwogICAgIH0gY2F0Y2ggKE9ybVJ1bnRpbWVFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL0dlcnJpdEpzb25TZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvR2Vycml0SnNvblNlcnZsZXQuamF2YQppbmRleCAxYjI0NzkyLi41NWVjYjAxIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvR2Vycml0SnNvblNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvR2Vycml0SnNvblNlcnZsZXQuamF2YQpAQCAtMTQsMTMgKzE0LDE1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hdWRpdC5BdWRpdEV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5hdWRpdC5BdWRpdFNlcnZpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQuUnBjQXVkaXRFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXVkaXQuQXVkaXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGguU2lnbkluUmVxdWlyZWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob3RTaWduZWRJbkV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5XZWJTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbkJ1aWxkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5SZW1vdGVKc29uU2VydmljZTsKQEAgLTM2LDExICszOCwxMSBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKIC8qKgogICogQmFzZSBKU09OIHNlcnZsZXQgdG8gZW5zdXJlIHRoZSBjdXJyZW50IHVzZXIgaXMgbm90IGZvcmdlZC4KICAqLwpAQCAtNjcsNyArNjksNyBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIEdlcnJpdENhbGwgY3JlYXRlQWN0aXZlQ2FsbChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApIHsKLSAgICBmaW5hbCBHZXJyaXRDYWxsIGNhbGwgPSBuZXcgR2Vycml0Q2FsbChzZXNzaW9uLmdldCgpLCByZXEsIHJzcCk7CisgICAgZmluYWwgR2Vycml0Q2FsbCBjYWxsID0gbmV3IEdlcnJpdENhbGwoc2Vzc2lvbi5nZXQoKSwgcmVxLCBuZXcgQXVkaXRlZEh0dHBTZXJ2bGV0UmVzcG9uc2UocnNwKSk7CiAgICAgY3VycmVudENhbGwuc2V0KGNhbGwpOwogICAgIHJldHVybiBjYWxsOwogICB9CkBAIC0xMzEsNjQgKzEzMyw4OCBAQAogICAgICAgfQogICAgICAgQXVkaXQgbm90ZSA9IChBdWRpdCkgbWV0aG9kLmdldEFubm90YXRpb24oQXVkaXQuY2xhc3MpOwogICAgICAgaWYgKG5vdGUgIT0gbnVsbCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgc2lkID0gY2FsbC5nZXRXZWJTZXNzaW9uKCkuZ2V0VG9rZW4oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpZCA9IGNhbGwuZ2V0V2ViU2Vzc2lvbigpLmdldFNlc3Npb25JZCgpOwogICAgICAgICBmaW5hbCBDdXJyZW50VXNlciB1c2VybmFtZSA9IGNhbGwuZ2V0V2ViU2Vzc2lvbigpLmdldEN1cnJlbnRVc2VyKCk7Ci0gICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBhcmdzID0KKyAgICAgICAgZmluYWwgTXVsdGltYXA8U3RyaW5nLCA/PiBhcmdzID0KICAgICAgICAgICAgIGV4dHJhY3RQYXJhbXMobm90ZSwgY2FsbCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB3aGF0ID0gZXh0cmFjdFdoYXQobm90ZSwgbWV0aG9kLmdldE5hbWUoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyB3aGF0ID0gZXh0cmFjdFdoYXQobm90ZSwgY2FsbCk7CiAgICAgICAgIGZpbmFsIE9iamVjdCByZXN1bHQgPSBjYWxsLmdldFJlc3VsdCgpOwogCi0gICAgICAgIGF1ZGl0LmRpc3BhdGNoKG5ldyBBdWRpdEV2ZW50KHNpZCwgdXNlcm5hbWUsIHdoYXQsIGNhbGwuZ2V0V2hlbigpLCBhcmdzLAotICAgICAgICAgICAgcmVzdWx0KSk7CisgICAgICAgIGF1ZGl0LmRpc3BhdGNoKG5ldyBScGNBdWRpdEV2ZW50KHNpZCwgdXNlcm5hbWUsIHdoYXQsIGNhbGwuZ2V0V2hlbigpLAorICAgICAgICAgICAgYXJncywgY2FsbC5nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRNZXRob2QoKSwgY2FsbC5nZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRNZXRob2QoKSwKKyAgICAgICAgICAgICgoQXVkaXRlZEh0dHBTZXJ2bGV0UmVzcG9uc2UpIChjYWxsLmdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKSkpCisgICAgICAgICAgICAgICAgLmdldFN0YXR1cygpLCByZXN1bHQpKTsKICAgICAgIH0KICAgICB9IGNhdGNoIChUaHJvd2FibGUgYWxsKSB7CiAgICAgICBsb2cuZXJyb3IoIlVuYWJsZSB0byBsb2cgdGhlIGNhbGwiLCBhbGwpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgTGlzdDxPYmplY3Q+IGV4dHJhY3RQYXJhbXMoZmluYWwgQXVkaXQgbm90ZSwgZmluYWwgR2Vycml0Q2FsbCBjYWxsKSB7Ci0gICAgTGlzdDxPYmplY3Q+IGFyZ3MgPSBMaXN0cy5uZXdBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChjYWxsLmdldFBhcmFtcygpKSk7CisgIHByaXZhdGUgTXVsdGltYXA8U3RyaW5nLCA/PiBleHRyYWN0UGFyYW1zKGZpbmFsIEF1ZGl0IG5vdGUsIGZpbmFsIEdlcnJpdENhbGwgY2FsbCkgeworICAgIE11bHRpbWFwPFN0cmluZywgT2JqZWN0PiBhcmdzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisKKyAgICBPYmplY3RbXSBwYXJhbXMgPSBjYWxsLmdldFBhcmFtcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7CisgICAgICBhcmdzLnB1dCgiJCIgKyBpLCBwYXJhbXNbaV0pOworICAgIH0KKwogICAgIGZvciAoaW50IGlkeCA6IG5vdGUub2JmdXNjYXRlKCkpIHsKLSAgICAgIGFyZ3Muc2V0KGlkeCwgIioqKioqIik7CisgICAgICBhcmdzLnJlbW92ZUFsbCgiJCIgKyBpZHgpOworICAgICAgYXJncy5wdXQoIiQiICsgaWR4LCAiKioqKioiKTsKICAgICB9CiAgICAgcmV0dXJuIGFyZ3M7CiAgIH0KIAotICBwcml2YXRlIFN0cmluZyBleHRyYWN0V2hhdChmaW5hbCBBdWRpdCBub3RlLCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICBwcml2YXRlIFN0cmluZyBleHRyYWN0V2hhdChmaW5hbCBBdWRpdCBub3RlLCBmaW5hbCBHZXJyaXRDYWxsIGNhbGwpIHsKKyAgICBTdHJpbmcgbWV0aG9kQ2xhc3MgPSBjYWxsLmdldE1ldGhvZENsYXNzKCkuZ2V0TmFtZSgpOworICAgIG1ldGhvZENsYXNzID0gbWV0aG9kQ2xhc3Muc3Vic3RyaW5nKG1ldGhvZENsYXNzLmxhc3RJbmRleE9mKCIuIikrMSk7CiAgICAgU3RyaW5nIHdoYXQgPSBub3RlLmFjdGlvbigpOwogICAgIGlmICh3aGF0Lmxlbmd0aCgpID09IDApIHsKLSAgICAgIGJvb2xlYW4gY2Nhc2UgPSBDaGFyYWN0ZXIuaXNMb3dlckNhc2UobWV0aG9kTmFtZS5jaGFyQXQoMCkpOwotCi0gICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kTmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIGNoYXIgYyA9IG1ldGhvZE5hbWUuY2hhckF0KGkpOwotICAgICAgICBpZiAoY2Nhc2UgJiYgIUNoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkgewotICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotICAgICAgfQotICAgICAgd2hhdCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICB3aGF0ID0gY2FsbC5nZXRNZXRob2QoKS5nZXROYW1lKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIHdoYXQ7CisgICAgcmV0dXJuIG1ldGhvZENsYXNzICsgIi4iICsgd2hhdDsKICAgfQogCiAgIHN0YXRpYyBjbGFzcyBHZXJyaXRDYWxsIGV4dGVuZHMgQWN0aXZlQ2FsbCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBXZWJTZXNzaW9uIHNlc3Npb247CiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHdoZW47CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGQgcmVzdWx0RmllbGQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGQgbWV0aG9kRmllbGQ7CiAKICAgICAvLyBOZWVkZWQgdG8gYWxsb3cgYWNjZXNzIHRvIG5vbi1wdWJsaWMgcmVzdWx0IGZpZWxkIGluIEdXVC9KU09OLVJQQwogICAgIHN0YXRpYyB7CisgICAgICByZXN1bHRGaWVsZCA9IGdldFByaXZhdGVGaWVsZChBY3RpdmVDYWxsLmNsYXNzLCAicmVzdWx0Iik7CisgICAgICBtZXRob2RGaWVsZCA9IGdldFByaXZhdGVGaWVsZChNZXRob2RIYW5kbGUuY2xhc3MsICJtZXRob2QiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBGaWVsZCBnZXRQcml2YXRlRmllbGQoQ2xhc3M8Pz4gY2xhenosIFN0cmluZyBmaWVsZE5hbWUpIHsKICAgICAgIEZpZWxkIGRlY2xhcmVkRmllbGQgPSBudWxsOwogICAgICAgdHJ5IHsKLSAgICAgICAgZGVjbGFyZWRGaWVsZCA9IEFjdGl2ZUNhbGwuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgicmVzdWx0Iik7CisgICAgICAgIGRlY2xhcmVkRmllbGQgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7CiAgICAgICAgIGRlY2xhcmVkRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIGxvZy5lcnJvcigiVW5hYmxlIHRvIGV4cG9zZSBSUFMvSlNPTiByZXN1bHQgZmllbGQiKTsKICAgICAgIH0KKyAgICAgIHJldHVybiBkZWNsYXJlZEZpZWxkOworICAgIH0KIAotICAgICAgcmVzdWx0RmllbGQgPSBkZWNsYXJlZEZpZWxkOworICAgIC8vIFN1cnJvZ2F0ZSBvZiB0aGUgbWlzc2luZyBnZXRNZXRob2RDbGFzcygpIGluIEdXVC9KU09OLVJQQworICAgIHB1YmxpYyBDbGFzczw/PiBnZXRNZXRob2RDbGFzcygpIHsKKyAgICAgIGlmIChtZXRob2RGaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorCisgICAgICB0cnkgeworICAgICAgICBNZXRob2QgbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kRmllbGQuZ2V0KHRoaXMuZ2V0TWV0aG9kKCkpOworICAgICAgICByZXR1cm4gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBhY2Nlc3MgcmVzdWx0IGZpZWxkIik7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nLmVycm9yKCJObyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgcmVzdWx0IGZpZWxkIik7CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAogICAgIC8vIFN1cnJvZ2F0ZSBvZiB0aGUgbWlzc2luZyBnZXRSZXN1bHQoKSBpbiBHV1QvSlNPTi1SUEMKQEAgLTI0NiwxMSArMjcyLDEzIEBACiAgICAgICAgIC8vCiAgICAgICAgIHJldHVybiAhc2Vzc2lvbi5pc1NpZ25lZEluKCk7CiAKLSAgICAgIH0gZWxzZSB7CisgICAgICB9IGVsc2UgaWYgKHNlc3Npb24uaXNTaWduZWRJbigpICYmIHNlc3Npb24uaXNWYWxpZFhHZXJyaXRBdXRoKGtleUluKSkgewogICAgICAgICAvLyBUaGUgc2Vzc2lvbiBtdXN0IGV4aXN0LCBhbmQgbXVzdCBiZSB1c2luZyB0aGlzIHRva2VuLgogICAgICAgICAvLwotICAgICAgICByZXR1cm4gc2Vzc2lvbi5pc1NpZ25lZEluKCkgJiYgc2Vzc2lvbi5pc1Rva2VuVmFsaWQoa2V5SW4pOworICAgICAgICBzZXNzaW9uLmdldEN1cnJlbnRVc2VyKCkuc2V0QWNjZXNzUGF0aChBY2Nlc3NQYXRoLkpTT05fUlBDKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcHVibGljIFdlYlNlc3Npb24gZ2V0V2ViU2Vzc2lvbigpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9ScGNTZXJ2bGV0TW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvUnBjU2VydmxldE1vZHVsZS5qYXZhCmluZGV4IDg3NmZlZTMuLjk1M2JjNzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9ScGNTZXJ2bGV0TW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL1JwY1NlcnZsZXRNb2R1bGUuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogCiAvKiogQmluZHMge0BsaW5rIFJlbW90ZUpzb25TZXJ2aWNlfSBpbXBsZW1lbnRhdGlvbnMgdG8gYSBKU09OIHNlcnZsZXQuICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUnBjU2VydmxldE1vZHVsZSBleHRlbmRzIFNlcnZsZXRNb2R1bGUgewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiL2dlcnJpdC9ycGMvIjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIi9nZXJyaXRfdWkvcnBjLyI7CiAKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJlZml4OwogCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvU3VnZ2VzdFNlcnZpY2VJbXBsLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvU3VnZ2VzdFNlcnZpY2VJbXBsLmphdmEKaW5kZXggMWJhYTQ5Yi4uNTU5YzI3MCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL1N1Z2dlc3RTZXJ2aWNlSW1wbC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9TdWdnZXN0U2VydmljZUltcGwuamF2YQpAQCAtMzMsOCArMzMsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRWaXNpYmlsaXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQmFja2VuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cE1lbWJlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5Qb3N0UmV2aWV3ZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5BZGRSZXZpZXdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOwpAQCAtMjI0LDE2ICsyMjQsMjcgQEAKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgICAgIH0KLSAgICAgICAgVmlzaWJpbGl0eUNvbnRyb2wgdmlzaWJpbGl0eUNvbnRyb2wgPSBuZXcgVmlzaWJpbGl0eUNvbnRyb2woKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKEFjY291bnQgYWNjb3VudCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBJZGVudGlmaWVkVXNlciB3aG8gPQotICAgICAgICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUocmV2aWV3RGJQcm92aWRlciwgYWNjb3VudC5nZXRJZCgpKTsKLSAgICAgICAgICAgIC8vIHdlIGNhbid0IHVzZSBjaGFuZ2VDb250cm9sIGRpcmVjdGx5IGFzIGl0IHdvbid0IHN1Z2dlc3QgcmV2aWV3ZXJzCi0gICAgICAgICAgICAvLyB0byBkcmFmdHMKLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VDb250cm9sLmZvclVzZXIod2hvKS5pc1JlZlZpc2libGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH07CisKKyAgICAgICAgVmlzaWJpbGl0eUNvbnRyb2wgdmlzaWJpbGl0eUNvbnRyb2w7CisgICAgICAgIGlmIChjaGFuZ2VDb250cm9sLmdldFJlZkNvbnRyb2woKS5pc1Zpc2libGVCeVJlZ2lzdGVyZWRVc2VycygpKSB7CisgICAgICAgICAgdmlzaWJpbGl0eUNvbnRyb2wgPSBuZXcgVmlzaWJpbGl0eUNvbnRyb2woKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZShBY2NvdW50IGFjY291bnQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHZpc2liaWxpdHlDb250cm9sID0gbmV3IFZpc2liaWxpdHlDb250cm9sKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoQWNjb3VudCBhY2NvdW50KSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgSWRlbnRpZmllZFVzZXIgd2hvID0KKyAgICAgICAgICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUocmV2aWV3RGJQcm92aWRlciwgYWNjb3VudC5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGNoYW5nZUNvbnRyb2wgZGlyZWN0bHkgYXMgaXQgd29uJ3Qgc3VnZ2VzdCByZXZpZXdlcnMKKyAgICAgICAgICAgICAgLy8gdG8gZHJhZnRzCisgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VDb250cm9sLmZvclVzZXIod2hvKS5pc1JlZlZpc2libGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9OworICAgICAgICB9CiAKICAgICAgICAgZmluYWwgTGlzdDxBY2NvdW50SW5mbz4gc3VnZ2VzdGVkQWNjb3VudHMgPQogICAgICAgICAgICAgc3VnZ2VzdEFjY291bnQoZGIsIHF1ZXJ5LCBCb29sZWFuLlRSVUUsIGxpbWl0LCB2aXNpYmlsaXR5Q29udHJvbCk7CkBAIC0yNjIsMTMgKzI3MywxMyBAQAogCiAgIHByaXZhdGUgYm9vbGVhbiBzdWdnZXN0R3JvdXBBc1Jldmlld2VyKGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0LAogICAgICAgZmluYWwgR3JvdXBSZWZlcmVuY2UgZ3JvdXApIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGlmICghQWRkUmV2aWV3ZXIuaXNMZWdhbFJldmlld2VyR3JvdXAoZ3JvdXAuZ2V0VVVJRCgpKSkgeworICAgIGlmICghUG9zdFJldmlld2Vycy5pc0xlZ2FsUmV2aWV3ZXJHcm91cChncm91cC5nZXRVVUlEKCkpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIGZpbmFsIFNldDxBY2NvdW50PiBtZW1iZXJzID0KLSAgICAgICAgICBncm91cE1lbWJlcnNGYWN0b3J5LmNyZWF0ZSgpLmxpc3RBY2NvdW50cyhncm91cC5nZXRVVUlEKCksIHByb2plY3QpOworICAgICAgZmluYWwgU2V0PEFjY291bnQ+IG1lbWJlcnMgPSBncm91cE1lbWJlcnNGYWN0b3J5LmNyZWF0ZShnZXRDdXJyZW50VXNlcigpKQorICAgICAgICAgIC5saXN0QWNjb3VudHMoZ3JvdXAuZ2V0VVVJRCgpLCBwcm9qZWN0KTsKIAogICAgICAgaWYgKG1lbWJlcnMuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI3Niw3ICsyODcsNyBAQAogCiAgICAgICBmaW5hbCBpbnQgbWF4QWxsb3dlZCA9CiAgICAgICAgICAgY2ZnLmdldEludCgiYWRkcmV2aWV3ZXIiLCAibWF4QWxsb3dlZCIsCi0gICAgICAgICAgICAgIEFkZFJldmlld2VyLkRFRkFVTFRfTUFYX1JFVklFV0VSUyk7CisgICAgICAgICAgICAgIFBvc3RSZXZpZXdlcnMuREVGQVVMVF9NQVhfUkVWSUVXRVJTKTsKICAgICAgIGlmIChtYXhBbGxvd2VkID4gMCAmJiBtZW1iZXJzLnNpemUoKSA+IG1heEFsbG93ZWQpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvQWNjb3VudENhcGFiaWxpdGllc1NlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRDYXBhYmlsaXRpZXNTZXJ2bGV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzM2MyMDkuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvQWNjb3VudENhcGFiaWxpdGllc1NlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmFjY291bnQ7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfQUNDT1VOVDsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfR1JPVVA7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX1BST0pFQ1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuRkxVU0hfQ0FDSEVTOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LktJTExfVEFTSzsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5QUklPUklUWTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5TVEFSVF9SRVBMSUNBVElPTjsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5WSUVXX0NBQ0hFUzsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5WSUVXX0NPTk5FQ1RJT05TOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LlZJRVdfUVVFVUU7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLlJlc3RBcGlTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkNhcGFiaWxpdHlDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUXVldWVQcm92aWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKLQotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1AU2luZ2xldG9uCi1wdWJsaWMgY2xhc3MgQWNjb3VudENhcGFiaWxpdGllc1NlcnZsZXQgZXh0ZW5kcyBSZXN0QXBpU2VydmxldCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlclBhcnNlciBwYXJhbVBhcnNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxJbXBsPiBmYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgQWNjb3VudENhcGFiaWxpdGllc1NlcnZsZXQoZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IGN1cnJlbnRVc2VyLAotICAgICAgUGFyYW1ldGVyUGFyc2VyIHBhcmFtUGFyc2VyLCBQcm92aWRlcjxJbXBsPiBmYWN0b3J5KSB7Ci0gICAgc3VwZXIoY3VycmVudFVzZXIpOwotICAgIHRoaXMucGFyYW1QYXJzZXIgPSBwYXJhbVBhcnNlcjsKLSAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBJbXBsIGltcGwgPSBmYWN0b3J5LmdldCgpOwotICAgIGlmIChhY2NlcHRzSnNvbihyZXEpKSB7Ci0gICAgICBpbXBsLmZvcm1hdCA9IE91dHB1dEZvcm1hdC5KU09OX0NPTVBBQ1Q7Ci0gICAgfQotICAgIGlmIChwYXJhbVBhcnNlci5wYXJzZShpbXBsLCByZXEsIHJlcykpIHsKLSAgICAgIGltcGwuY29tcHV0ZSgpOwotCi0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCAiVVRGLTgiKTsKLSAgICAgIGlmIChpbXBsLmZvcm1hdC5pc0pzb24oKSkgewotICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoSlNPTl9UWVBFKTsKLSAgICAgICAgYnVmLndyaXRlKEpTT05fTUFHSUMpOwotICAgICAgICBpbXBsLmZvcm1hdC5uZXdHc29uKCkudG9Kc29uKAotICAgICAgICAgICAgaW1wbC5oYXZlLAotICAgICAgICAgICAgbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBPYmplY3Q+PigpIHt9LmdldFR5cGUoKSwKLSAgICAgICAgICAgIG91dCk7Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICBidWYud3JpdGUoJ1xuJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGUgOiBpbXBsLmhhdmUuZW50cnlTZXQoKSkgewotICAgICAgICAgIG91dC53cml0ZShlLmdldEtleSgpKTsKLSAgICAgICAgICBpZiAoIShlLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBCb29sZWFuKSkgewotICAgICAgICAgICAgb3V0LndyaXRlKCI6ICIpOwotICAgICAgICAgICAgb3V0LndyaXRlKGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0LndyaXRlKCdcbicpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgfQotICAgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOwotICAgICAgc2VuZChyZXEsIHJlcywgYnVmLnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBJbXBsIHsKLSAgICBwcml2YXRlIGZpbmFsIENhcGFiaWxpdHlDb250cm9sIGNjOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBoYXZlOwotCi0gICAgQE9wdGlvbihuYW1lID0gIi0tZm9ybWF0IiwgbWV0YVZhciA9ICJGTVQiLCB1c2FnZSA9ICJPdXRwdXQgZGlzcGxheSBmb3JtYXQiKQotICAgIHByaXZhdGUgT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IE91dHB1dEZvcm1hdC5URVhUOwotCi0gICAgQE9wdGlvbihuYW1lID0gIi1xIiwgbWV0YVZhciA9ICJDQVAiLCBtdWx0aVZhbHVlZCA9IHRydWUsIHVzYWdlID0gIkNhcGFiaWxpdHkgdG8gaW5zcGVjdCIpCi0gICAgdm9pZCBhZGRRdWVyeShTdHJpbmcgbmFtZSkgewotICAgICAgaWYgKHF1ZXJ5ID09IG51bGwpIHsKLSAgICAgICAgcXVlcnkgPSBTZXRzLm5ld0hhc2hTZXQoKTsKLSAgICAgIH0KLSAgICAgIHF1ZXJ5LmFkZChuYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgIH0KLSAgICBwcml2YXRlIFNldDxTdHJpbmc+IHF1ZXJ5OwotCi0gICAgQEluamVjdAotICAgIEltcGwoQ3VycmVudFVzZXIgdXNlcikgewotICAgICAgY2MgPSB1c2VyLmdldENhcGFiaWxpdGllcygpOwotICAgICAgaGF2ZSA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOwotICAgIH0KLQotICAgIHZvaWQgY29tcHV0ZSgpIHsKLSAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBHbG9iYWxDYXBhYmlsaXR5LmdldEFsbE5hbWVzKCkpIHsKLSAgICAgICAgaWYgKCFuYW1lLmVxdWFscyhQUklPUklUWSkgJiYgd2FudChuYW1lKSAmJiBjYy5jYW5QZXJmb3JtKG5hbWUpKSB7Ci0gICAgICAgICAgaWYgKEdsb2JhbENhcGFiaWxpdHkuaGFzUmFuZ2UobmFtZSkpIHsKLSAgICAgICAgICAgIGhhdmUucHV0KG5hbWUsIG5ldyBSYW5nZShjYy5nZXRSYW5nZShuYW1lKSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoYXZlLnB1dChuYW1lLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaGF2ZS5wdXQoQ1JFQVRFX0FDQ09VTlQsIGNjLmNhbkNyZWF0ZUFjY291bnQoKSk7Ci0gICAgICBoYXZlLnB1dChDUkVBVEVfR1JPVVAsIGNjLmNhbkNyZWF0ZUdyb3VwKCkpOwotICAgICAgaGF2ZS5wdXQoQ1JFQVRFX1BST0pFQ1QsIGNjLmNhbkNyZWF0ZVByb2plY3QoKSk7Ci0gICAgICBoYXZlLnB1dChLSUxMX1RBU0ssIGNjLmNhbktpbGxUYXNrKCkpOwotICAgICAgaGF2ZS5wdXQoVklFV19DQUNIRVMsIGNjLmNhblZpZXdDYWNoZXMoKSk7Ci0gICAgICBoYXZlLnB1dChGTFVTSF9DQUNIRVMsIGNjLmNhbkZsdXNoQ2FjaGVzKCkpOwotICAgICAgaGF2ZS5wdXQoVklFV19DT05ORUNUSU9OUywgY2MuY2FuVmlld0Nvbm5lY3Rpb25zKCkpOwotICAgICAgaGF2ZS5wdXQoVklFV19RVUVVRSwgY2MuY2FuVmlld1F1ZXVlKCkpOwotICAgICAgaGF2ZS5wdXQoU1RBUlRfUkVQTElDQVRJT04sIGNjLmNhblN0YXJ0UmVwbGljYXRpb24oKSk7Ci0KLSAgICAgIFF1ZXVlUHJvdmlkZXIuUXVldWVUeXBlIHF1ZXVlID0gY2MuZ2V0UXVldWVUeXBlKCk7Ci0gICAgICBpZiAocXVldWUgIT0gUXVldWVQcm92aWRlci5RdWV1ZVR5cGUuSU5URVJBQ1RJVkUKLSAgICAgICAgICB8fCAocXVlcnkgIT0gbnVsbCAmJiBxdWVyeS5jb250YWlucyhQUklPUklUWSkpKSB7Ci0gICAgICAgIGhhdmUucHV0KFBSSU9SSVRZLCBxdWV1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ciA9IGhhdmUuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLSAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlID0gaXRyLm5leHQoKTsKLSAgICAgICAgaWYgKCF3YW50KGUuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgaXRyLnJlbW92ZSgpOwotICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIEJvb2xlYW4gJiYgISgoQm9vbGVhbikgZS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgIGl0ci5yZW1vdmUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB3YW50KFN0cmluZyBuYW1lKSB7Ci0gICAgICByZXR1cm4gcXVlcnkgPT0gbnVsbCB8fCBxdWVyeS5jb250YWlucyhuYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFJhbmdlIHsKLSAgICBwcml2YXRlIHRyYW5zaWVudCBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2U7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gICAgcHJpdmF0ZSBpbnQgbWluOwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgaW50IG1heDsKLQotICAgIFJhbmdlKFBlcm1pc3Npb25SYW5nZSByKSB7Ci0gICAgICByYW5nZSA9IHI7Ci0gICAgICBtaW4gPSByLmdldE1pbigpOwotICAgICAgbWF4ID0gci5nZXRNYXgoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHJhbmdlLnRvU3RyaW5nKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50TW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50TW9kdWxlLmphdmEKaW5kZXggOTU3ZjMzOS4uYmVmNjMxNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvQWNjb3VudE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRNb2R1bGUuamF2YQpAQCAtMzAsMTggKzMwLDEyIEBACiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKICAgICAgICAgZmFjdG9yeShBZ3JlZW1lbnRJbmZvRmFjdG9yeS5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShDcmVhdGVHcm91cC5GYWN0b3J5LmNsYXNzKTsKICAgICAgICAgZmFjdG9yeShEZWxldGVFeHRlcm5hbElkcy5GYWN0b3J5LmNsYXNzKTsKICAgICAgICAgZmFjdG9yeShFeHRlcm5hbElkRGV0YWlsRmFjdG9yeS5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShHcm91cERldGFpbEhhbmRsZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoTXlHcm91cHNGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFJlZ2lzdGVyTmV3RW1haWxTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoUmVuYW1lR3JvdXAuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoVmlzaWJsZUdyb3Vwc0hhbmRsZXIuRmFjdG9yeS5jbGFzcyk7CiAgICAgICB9CiAgICAgfSk7CiAgICAgcnBjKEFjY291bnRTZWN1cml0eUltcGwuY2xhc3MpOwogICAgIHJwYyhBY2NvdW50U2VydmljZUltcGwuY2xhc3MpOwotICAgIHJwYyhHcm91cEFkbWluU2VydmljZUltcGwuY2xhc3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50U2VjdXJpdHlJbXBsLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50U2VjdXJpdHlJbXBsLmphdmEKaW5kZXggZTNiNzQwOC4uNmQxODNiOCAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvQWNjb3VudFNlY3VyaXR5SW1wbC5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRTZWN1cml0eUltcGwuamF2YQpAQCAtMTksMTAgKzE5LDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2NvdW50U2VjdXJpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ29udHJpYnV0b3JBZ3JlZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Db250YWN0SW5mb3JtYXRpb25TdG9yZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuSW52YWxpZFNzaEtleUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuQmFzZVNlcnZpY2VJbXBsZW1lbnRhdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKQEAgLTQ5LDcgKzQ4LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5SZWFsbTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbnRhY3QuQ29udGFjdFN0b3JlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsVG9rZW5WZXJpZmllcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZWdpc3Rlck5ld0VtYWlsU2VuZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZTsKQEAgLTg4LDcgKzg2LDYgQEAKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VVc2VyTmFtZS5DdXJyZW50VXNlciBjaGFuZ2VVc2VyTmFtZUZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgRGVsZXRlRXh0ZXJuYWxJZHMuRmFjdG9yeSBkZWxldGVFeHRlcm5hbElkc0ZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgRXh0ZXJuYWxJZERldGFpbEZhY3RvcnkuRmFjdG9yeSBleHRlcm5hbElkRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBNeUdyb3Vwc0ZhY3RvcnkuRmFjdG9yeSBteUdyb3Vwc0ZhY3Rvcnk7CiAKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKICAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CkBAIC0xMDYsNyArMTAzLDYgQEAKICAgICAgIGZpbmFsIENoYW5nZVVzZXJOYW1lLkN1cnJlbnRVc2VyIGNoYW5nZVVzZXJOYW1lRmFjdG9yeSwKICAgICAgIGZpbmFsIERlbGV0ZUV4dGVybmFsSWRzLkZhY3RvcnkgZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5LAogICAgICAgZmluYWwgRXh0ZXJuYWxJZERldGFpbEZhY3RvcnkuRmFjdG9yeSBleHRlcm5hbElkRGV0YWlsRmFjdG9yeSwKLSAgICAgIGZpbmFsIE15R3JvdXBzRmFjdG9yeS5GYWN0b3J5IG15R3JvdXBzRmFjdG9yeSwKICAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLCBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUpIHsKICAgICBzdXBlcihzY2hlbWEsIGN1cnJlbnRVc2VyKTsKICAgICBjb250YWN0U3RvcmUgPSBjczsKQEAgLTEyOCw3ICsxMjQsNiBAQAogICAgIHRoaXMuY2hhbmdlVXNlck5hbWVGYWN0b3J5ID0gY2hhbmdlVXNlck5hbWVGYWN0b3J5OwogICAgIHRoaXMuZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5ID0gZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5OwogICAgIHRoaXMuZXh0ZXJuYWxJZERldGFpbEZhY3RvcnkgPSBleHRlcm5hbElkRGV0YWlsRmFjdG9yeTsKLSAgICB0aGlzLm15R3JvdXBzRmFjdG9yeSA9IG15R3JvdXBzRmFjdG9yeTsKICAgICB0aGlzLmhvb2tzID0gaG9va3M7CiAgICAgdGhpcy5ncm91cENhY2hlID0gZ3JvdXBDYWNoZTsKICAgfQpAQCAtMTkzLDcgKzE4OCw4IEBACiAgICAgaWYgKHJlYWxtLmFsbG93c0VkaXQoQWNjb3VudC5GaWVsZE5hbWUuVVNFUl9OQU1FKSkgewogICAgICAgSGFuZGxlci53cmFwKGNoYW5nZVVzZXJOYW1lRmFjdG9yeS5jcmVhdGUobmV3TmFtZSkpLnRvKGNhbGxiYWNrKTsKICAgICB9IGVsc2UgewotICAgICAgY2FsbGJhY2sub25GYWlsdXJlKG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKSk7CisgICAgICBjYWxsYmFjay5vbkZhaWx1cmUobmV3IFBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb24oIk5vdCBhbGxvd2VkIHRvIGNoYW5nZSIKKyAgICAgICAgICArICIgdXNlcm5hbWUiKSk7CiAgICAgfQogICB9CiAKQEAgLTIxMywxNiArMjA5LDYgQEAKICAgICBleHRlcm5hbElkRGV0YWlsRmFjdG9yeS5jcmVhdGUoKS50byhjYWxsYmFjayk7CiAgIH0KIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgbXlHcm91cHMoZmluYWwgQXN5bmNDYWxsYmFjazxMaXN0PEFjY291bnRHcm91cD4+IGNhbGxiYWNrKSB7Ci0gICAgcnVuKGNhbGxiYWNrLCBuZXcgQWN0aW9uPExpc3Q8QWNjb3VudEdyb3VwPj4oKSB7Ci0gICAgICBwdWJsaWMgTGlzdDxBY2NvdW50R3JvdXA+IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKLSAgICAgICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIHJldHVybiBteUdyb3Vwc0ZhY3RvcnkuY3JlYXRlKCkuY2FsbCgpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KICAgcHVibGljIHZvaWQgZGVsZXRlRXh0ZXJuYWxJZHMoZmluYWwgU2V0PEFjY291bnRFeHRlcm5hbElkLktleT4ga2V5cywKICAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8U2V0PEFjY291bnRFeHRlcm5hbElkLktleT4+IGNhbGxiYWNrKSB7CiAgICAgZGVsZXRlRXh0ZXJuYWxJZHNGYWN0b3J5LmNyZWF0ZShrZXlzKS50byhjYWxsYmFjayk7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50c1Jlc3RBcGlTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9BY2NvdW50c1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxZDU2MwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0FjY291bnRzUmVzdEFwaVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmFjY291bnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRzQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQWNjb3VudHNSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQEluamVjdAorICBBY2NvdW50c1Jlc3RBcGlTZXJ2bGV0KFJlc3RBcGlTZXJ2bGV0Lkdsb2JhbHMgZ2xvYmFscywKKyAgICAgIFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHMpIHsKKyAgICBzdXBlcihnbG9iYWxzLCBhY2NvdW50cyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0NyZWF0ZUdyb3VwLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9DcmVhdGVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmViZDA0Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0NyZWF0ZUdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmFjY291bnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLlBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUGVyZm9ybUNyZWF0ZUdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1jbGFzcyBDcmVhdGVHcm91cCBleHRlbmRzIEhhbmRsZXI8QWNjb3VudEdyb3VwLklkPiB7Ci0gIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBDcmVhdGVHcm91cCBjcmVhdGUoU3RyaW5nIGdyb3VwTmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFBlcmZvcm1DcmVhdGVHcm91cC5GYWN0b3J5IHBlcmZvcm1DcmVhdGVHcm91cEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZ3JvdXBOYW1lOwotCi0gIEBJbmplY3QKLSAgQ3JlYXRlR3JvdXAoZmluYWwgUGVyZm9ybUNyZWF0ZUdyb3VwLkZhY3RvcnkgcGVyZm9ybUNyZWF0ZUdyb3VwRmFjdG9yeSwKLSAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIsIEBBc3Npc3RlZCBmaW5hbCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0gICAgdGhpcy5wZXJmb3JtQ3JlYXRlR3JvdXBGYWN0b3J5ID0gcGVyZm9ybUNyZWF0ZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLnVzZXIgPSB1c2VyOwotICAgIHRoaXMuZ3JvdXBOYW1lID0gZ3JvdXBOYW1lOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgY2FsbCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbiwKLSAgICAgIFBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb24gewotICAgIGZpbmFsIFBlcmZvcm1DcmVhdGVHcm91cCBwZXJmb3JtQ3JlYXRlR3JvdXAgPSBwZXJmb3JtQ3JlYXRlR3JvdXBGYWN0b3J5LmNyZWF0ZSgpOwotICAgIGZpbmFsIEFjY291bnQuSWQgbWUgPSB1c2VyLmdldEFjY291bnRJZCgpOwotICAgIHJldHVybiBwZXJmb3JtQ3JlYXRlR3JvdXAuY3JlYXRlR3JvdXAoZ3JvdXBOYW1lLCBudWxsLCBmYWxzZSwgbnVsbCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1lKSwgbnVsbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0dyb3VwQWRtaW5TZXJ2aWNlSW1wbC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBBZG1pblNlcnZpY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTJlMDUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBBZG1pblNlcnZpY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBBZG1pblNlcnZpY2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBMaXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwT3B0aW9uczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkluYWN0aXZlQWNjb3VudEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEFjY291bnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hFbnRpdHlFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuQmFzZVNlcnZpY2VJbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXF1ZXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQmFja2VuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmRzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwSW5jbHVkZUNhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWNsYXNzIEdyb3VwQWRtaW5TZXJ2aWNlSW1wbCBleHRlbmRzIEJhc2VTZXJ2aWNlSW1wbGVtZW50YXRpb24gaW1wbGVtZW50cwotICAgIEdyb3VwQWRtaW5TZXJ2aWNlIHsKLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOwotICBwcml2YXRlIGZpbmFsIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXI7Ci0gIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgQXV0aFR5cGUgYXV0aFR5cGU7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlOwotICBwcml2YXRlIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQ7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGU7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIENyZWF0ZUdyb3VwLkZhY3RvcnkgY3JlYXRlR3JvdXBGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJlbmFtZUdyb3VwLkZhY3RvcnkgcmVuYW1lR3JvdXBGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIEdyb3VwRGV0YWlsSGFuZGxlci5GYWN0b3J5IGdyb3VwRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBWaXNpYmxlR3JvdXBzSGFuZGxlci5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgR3JvdXBBZG1pblNlcnZpY2VJbXBsKGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBzY2hlbWEsCi0gICAgICBmaW5hbCBQcm92aWRlcjxJZGVudGlmaWVkVXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAotICAgICAgZmluYWwgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGUsCi0gICAgICBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyLAotICAgICAgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXIsCi0gICAgICBmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWcsCi0gICAgICBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCi0gICAgICBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLAotICAgICAgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIENyZWF0ZUdyb3VwLkZhY3RvcnkgY3JlYXRlR3JvdXBGYWN0b3J5LAotICAgICAgZmluYWwgUmVuYW1lR3JvdXAuRmFjdG9yeSByZW5hbWVHcm91cEZhY3RvcnksCi0gICAgICBmaW5hbCBHcm91cERldGFpbEhhbmRsZXIuRmFjdG9yeSBncm91cERldGFpbEZhY3RvcnksCi0gICAgICBmaW5hbCBWaXNpYmxlR3JvdXBzSGFuZGxlci5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5KSB7Ci0gICAgc3VwZXIoc2NoZW1hLCBjdXJyZW50VXNlcik7Ci0gICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7Ci0gICAgdGhpcy5ncm91cEluY2x1ZGVDYWNoZSA9IGdyb3VwSW5jbHVkZUNhY2hlOwotICAgIHRoaXMuYWNjb3VudFJlc29sdmVyID0gYWNjb3VudFJlc29sdmVyOwotICAgIHRoaXMuYWNjb3VudE1hbmFnZXIgPSBhY2NvdW50TWFuYWdlcjsKLSAgICB0aGlzLmF1dGhUeXBlID0gYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpOwotICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7Ci0gICAgdGhpcy5ncm91cEJhY2tlbmQgPSBncm91cEJhY2tlbmQ7Ci0gICAgdGhpcy5ncm91cENvbnRyb2xGYWN0b3J5ID0gZ3JvdXBDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmNyZWF0ZUdyb3VwRmFjdG9yeSA9IGNyZWF0ZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLnJlbmFtZUdyb3VwRmFjdG9yeSA9IHJlbmFtZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLmdyb3VwRGV0YWlsRmFjdG9yeSA9IGdyb3VwRGV0YWlsRmFjdG9yeTsKLSAgICB0aGlzLnZpc2libGVHcm91cHNGYWN0b3J5ID0gdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpYmxlR3JvdXBzKGZpbmFsIEFzeW5jQ2FsbGJhY2s8R3JvdXBMaXN0PiBjYWxsYmFjaykgewotICAgIHZpc2libGVHcm91cHNGYWN0b3J5LmNyZWF0ZSgpLnRvKGNhbGxiYWNrKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUdyb3VwKGZpbmFsIFN0cmluZyBuZXdOYW1lLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxBY2NvdW50R3JvdXAuSWQ+IGNhbGxiYWNrKSB7Ci0gICAgY3JlYXRlR3JvdXBGYWN0b3J5LmNyZWF0ZShuZXdOYW1lKS50byhjYWxsYmFjayk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBncm91cERldGFpbChBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVVUlELAotICAgICAgQXN5bmNDYWxsYmFjazxHcm91cERldGFpbD4gY2FsbGJhY2spIHsKLSAgICBpZiAoZ3JvdXBJZCA9PSBudWxsICYmIGdyb3VwVVVJRCAhPSBudWxsKSB7Ci0gICAgICBBY2NvdW50R3JvdXAgZyA9IGdyb3VwQ2FjaGUuZ2V0KGdyb3VwVVVJRCk7Ci0gICAgICBpZiAoZyAhPSBudWxsKSB7Ci0gICAgICAgIGdyb3VwSWQgPSBnLmdldElkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGdyb3VwRGV0YWlsRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2hhbmdlR3JvdXBEZXNjcmlwdGlvbihmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbiwgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGRiLmFjY291bnRHcm91cHMoKS5nZXQoZ3JvdXBJZCk7Ci0gICAgICAgIGFzc2VydEFtR3JvdXBPd25lcihkYiwgZ3JvdXApOwotICAgICAgICBncm91cC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIGRiLmFjY291bnRHcm91cHMoKS51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGdyb3VwKSk7Ci0gICAgICAgIGdyb3VwQ2FjaGUuZXZpY3QoZ3JvdXApOwotICAgICAgICByZXR1cm4gVm9pZFJlc3VsdC5JTlNUQU5DRTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGNoYW5nZUdyb3VwT3B0aW9ucyhmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIEdyb3VwT3B0aW9ucyBncm91cE9wdGlvbnMsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBydW4oY2FsbGJhY2ssIG5ldyBBY3Rpb248Vm9pZFJlc3VsdD4oKSB7Ci0gICAgICBwdWJsaWMgVm9pZFJlc3VsdCBydW4oZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24sIEZhaWx1cmUgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXAgPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KGdyb3VwSWQpOwotICAgICAgICBhc3NlcnRBbUdyb3VwT3duZXIoZGIsIGdyb3VwKTsKLSAgICAgICAgZ3JvdXAuc2V0VmlzaWJsZVRvQWxsKGdyb3VwT3B0aW9ucy5pc1Zpc2libGVUb0FsbCgpKTsKLSAgICAgICAgZGIuYWNjb3VudEdyb3VwcygpLnVwZGF0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oZ3JvdXApKTsKLSAgICAgICAgZ3JvdXBDYWNoZS5ldmljdChncm91cCk7Ci0gICAgICAgIHJldHVybiBWb2lkUmVzdWx0LklOU1RBTkNFOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2hhbmdlR3JvdXBPd25lcihmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBuZXdPd25lck5hbWUsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Vm9pZFJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBydW4oY2FsbGJhY2ssIG5ldyBBY3Rpb248Vm9pZFJlc3VsdD4oKSB7Ci0gICAgICBwdWJsaWMgVm9pZFJlc3VsdCBydW4oZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24sIEZhaWx1cmUgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXAgPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KGdyb3VwSWQpOwotICAgICAgICBhc3NlcnRBbUdyb3VwT3duZXIoZGIsIGdyb3VwKTsKLQotICAgICAgICBHcm91cFJlZmVyZW5jZSBvd25lciA9Ci0gICAgICAgICAgICBHcm91cEJhY2tlbmRzLmZpbmRFeGFjdFN1Z2dlc3Rpb24oZ3JvdXBCYWNrZW5kLCBuZXdPd25lck5hbWUpOwotICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBncm91cC5zZXRPd25lckdyb3VwVVVJRChvd25lci5nZXRVVUlEKCkpOwotICAgICAgICBkYi5hY2NvdW50R3JvdXBzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihncm91cCkpOwotICAgICAgICBncm91cENhY2hlLmV2aWN0KGdyb3VwKTsKLSAgICAgICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZW5hbWVHcm91cChmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgZmluYWwgU3RyaW5nIG5ld05hbWUsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPEdyb3VwRGV0YWlsPiBjYWxsYmFjaykgewotICAgIHJlbmFtZUdyb3VwRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCwgbmV3TmFtZSkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2hhbmdlR3JvdXBUeXBlKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgZmluYWwgQWNjb3VudEdyb3VwLlR5cGUgbmV3VHlwZSwgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBncm91cCA9IGRiLmFjY291bnRHcm91cHMoKS5nZXQoZ3JvdXBJZCk7Ci0gICAgICAgIGFzc2VydEFtR3JvdXBPd25lcihkYiwgZ3JvdXApOwotICAgICAgICBncm91cC5zZXRUeXBlKG5ld1R5cGUpOwotICAgICAgICBkYi5hY2NvdW50R3JvdXBzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihncm91cCkpOwotICAgICAgICBncm91cENhY2hlLmV2aWN0KGdyb3VwKTsKLSAgICAgICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGRHcm91cE1lbWJlcihmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBuYW1lT3JFbWFpbCwgZmluYWwgQXN5bmNDYWxsYmFjazxHcm91cERldGFpbD4gY2FsbGJhY2spIHsKLSAgICBydW4oY2FsbGJhY2ssIG5ldyBBY3Rpb248R3JvdXBEZXRhaWw+KCkgewotICAgICAgcHVibGljIEdyb3VwRGV0YWlsIHJ1bihSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgRmFpbHVyZSwKLSAgICAgICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbCBjb250cm9sID0gZ3JvdXBDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihncm91cElkKTsKLSAgICAgICAgaWYgKGdyb3VwQ2FjaGUuZ2V0KGdyb3VwSWQpLmdldFR5cGUoKSAhPSBBY2NvdW50R3JvdXAuVHlwZS5JTlRFUk5BTCkgewotICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBY2NvdW50IGEgPSBmaW5kQWNjb3VudChuYW1lT3JFbWFpbCk7Ci0gICAgICAgIGlmICghYS5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IEluYWN0aXZlQWNjb3VudEV4Y2VwdGlvbihhLmdldEZ1bGxOYW1lKCkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWNvbnRyb2wuY2FuQWRkTWVtYmVyKGEuZ2V0SWQoKSkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyLktleSBrZXkgPQotICAgICAgICAgICAgbmV3IEFjY291bnRHcm91cE1lbWJlci5LZXkoYS5nZXRJZCgpLCBncm91cElkKTsKLSAgICAgICAgQWNjb3VudEdyb3VwTWVtYmVyIG0gPSBkYi5hY2NvdW50R3JvdXBNZW1iZXJzKCkuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChtID09IG51bGwpIHsKLSAgICAgICAgICBtID0gbmV3IEFjY291bnRHcm91cE1lbWJlcihrZXkpOwotICAgICAgICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpLmluc2VydCgKLSAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdChtLAotICAgICAgICAgICAgICAgICAgZ2V0QWNjb3VudElkKCkpKSk7Ci0gICAgICAgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obSkpOwotICAgICAgICAgIGFjY291bnRDYWNoZS5ldmljdChtLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBncm91cERldGFpbEZhY3RvcnkuY3JlYXRlKGdyb3VwSWQpLmNhbGwoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZEdyb3VwSW5jbHVkZShmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIGZpbmFsIFN0cmluZyBncm91cE5hbWUsIGZpbmFsIEFzeW5jQ2FsbGJhY2s8R3JvdXBEZXRhaWw+IGNhbGxiYWNrKSB7Ci0gICAgcnVuKGNhbGxiYWNrLCBuZXcgQWN0aW9uPEdyb3VwRGV0YWlsPigpIHsKLSAgICAgIHB1YmxpYyBHcm91cERldGFpbCBydW4oUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24sIEZhaWx1cmUsCi0gICAgICAgICAgTm9TdWNoR3JvdXBFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBHcm91cENvbnRyb2wgY29udHJvbCA9IGdyb3VwQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoZ3JvdXBJZCk7Ci0gICAgICAgIGlmIChncm91cENhY2hlLmdldChncm91cElkKS5nZXRUeXBlKCkgIT0gQWNjb3VudEdyb3VwLlR5cGUuSU5URVJOQUwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwIGEgPSBmaW5kR3JvdXAoZ3JvdXBOYW1lKTsKLSAgICAgICAgaWYgKCFjb250cm9sLmNhbkFkZEdyb3VwKGEuZ2V0SWQoKSkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTm9TdWNoRW50aXR5RXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZS5LZXkga2V5ID0KLSAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlLktleShncm91cElkLCBhLmdldElkKCkpOwotICAgICAgICBBY2NvdW50R3JvdXBJbmNsdWRlIG0gPSBkYi5hY2NvdW50R3JvdXBJbmNsdWRlcygpLmdldChrZXkpOwotICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgbSA9IG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlKGtleSk7Ci0gICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpLmluc2VydCgKLSAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQobSwKLSAgICAgICAgICAgICAgICAgIGdldEFjY291bnRJZCgpKSkpOwotICAgICAgICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtKSk7Ci0gICAgICAgICAgZ3JvdXBJbmNsdWRlQ2FjaGUuZXZpY3RJbmNsdWRlKGEuZ2V0R3JvdXBVVUlEKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGdyb3VwRGV0YWlsRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCkuY2FsbCgpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGVsZXRlR3JvdXBNZW1iZXJzKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgZmluYWwgU2V0PEFjY291bnRHcm91cE1lbWJlci5LZXk+IGtleXMsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKSB7Ci0gICAgcnVuKGNhbGxiYWNrLCBuZXcgQWN0aW9uPFZvaWRSZXN1bHQ+KCkgewotICAgICAgcHVibGljIFZvaWRSZXN1bHQgcnVuKGZpbmFsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAotICAgICAgICAgIE5vU3VjaEdyb3VwRXhjZXB0aW9uLCBGYWlsdXJlIHsKLSAgICAgICAgZmluYWwgR3JvdXBDb250cm9sIGNvbnRyb2wgPSBncm91cENvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGdyb3VwSWQpOwotICAgICAgICBpZiAoZ3JvdXBDYWNoZS5nZXQoZ3JvdXBJZCkuZ2V0VHlwZSgpICE9IEFjY291bnRHcm91cC5UeXBlLklOVEVSTkFMKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyLktleSBrIDoga2V5cykgewotICAgICAgICAgIGlmICghZ3JvdXBJZC5lcXVhbHMoay5nZXRBY2NvdW50R3JvdXBJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5vU3VjaEVudGl0eUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gZ2V0QWNjb3VudElkKCk7Ci0gICAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwTWVtYmVyLktleSBrIDoga2V5cykgewotICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cE1lbWJlciBtID0gZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmdldChrKTsKLSAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIWNvbnRyb2wuY2FuUmVtb3ZlTWVtYmVyKG0uZ2V0QWNjb3VudElkKCkpKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjY291bnRHcm91cE1lbWJlckF1ZGl0IGF1ZGl0ID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQgYSA6IGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpCi0gICAgICAgICAgICAgICAgLmJ5R3JvdXBBY2NvdW50KG0uZ2V0QWNjb3VudEdyb3VwSWQoKSwgbS5nZXRBY2NvdW50SWQoKSkpIHsKLSAgICAgICAgICAgICAgaWYgKGEuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgIGF1ZGl0ID0gYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXVkaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICBhdWRpdC5yZW1vdmVkKG1lKTsKLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVyc0F1ZGl0KCkKLSAgICAgICAgICAgICAgICAgIC51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGF1ZGl0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBhdWRpdCA9IG5ldyBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdChtLCBtZSk7Ci0gICAgICAgICAgICAgIGF1ZGl0LnJlbW92ZWRMZWdhY3koKTsKLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVyc0F1ZGl0KCkKLSAgICAgICAgICAgICAgICAgIC5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGF1ZGl0KSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG0pKTsKLSAgICAgICAgICAgIGFjY291bnRDYWNoZS5ldmljdChtLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBkZWxldGVHcm91cEluY2x1ZGVzKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgZmluYWwgU2V0PEFjY291bnRHcm91cEluY2x1ZGUuS2V5PiBrZXlzLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKLSAgICAgICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiwgRmFpbHVyZSB7Ci0gICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbCBjb250cm9sID0gZ3JvdXBDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihncm91cElkKTsKLSAgICAgICAgaWYgKGdyb3VwQ2FjaGUuZ2V0KGdyb3VwSWQpLmdldFR5cGUoKSAhPSBBY2NvdW50R3JvdXAuVHlwZS5JTlRFUk5BTCkgewotICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUuS2V5IGsgOiBrZXlzKSB7Ci0gICAgICAgICAgaWYgKCFncm91cElkLmVxdWFscyhrLmdldEdyb3VwSWQoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQWNjb3VudC5JZCBtZSA9IGdldEFjY291bnRJZCgpOwotICAgICAgICBmaW5hbCBTZXQ8QWNjb3VudEdyb3VwLklkPiBncm91cHNUb0V2aWN0ID0gbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwLklkPigpOwotICAgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUuS2V5IGsgOiBrZXlzKSB7Ci0gICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZSBtID0KLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXMoKS5nZXQoayk7Ci0gICAgICAgICAgaWYgKG0gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFjb250cm9sLmNhblJlbW92ZUdyb3VwKG0uZ2V0SW5jbHVkZUlkKCkpKSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hFbnRpdHlFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCBhdWRpdCA9IG51bGw7Ci0gICAgICAgICAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCBhIDogZGIKLSAgICAgICAgICAgICAgICAuYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpLmJ5R3JvdXBJbmNsdWRlKAotICAgICAgICAgICAgICAgICAgICBtLmdldEdyb3VwSWQoKSwgbS5nZXRJbmNsdWRlSWQoKSkpIHsKLSAgICAgICAgICAgICAgaWYgKGEuaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgIGF1ZGl0ID0gYTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXVkaXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICBhdWRpdC5yZW1vdmVkKG1lKTsKLSAgICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpLnVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhdWRpdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG0pKTsKLSAgICAgICAgICAgIGdyb3Vwc1RvRXZpY3QuYWRkKGsuZ2V0SW5jbHVkZUlkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKEFjY291bnRHcm91cCBncm91cCA6IGRiLmFjY291bnRHcm91cHMoKS5nZXQoZ3JvdXBzVG9FdmljdCkpIHsKLSAgICAgICAgICBncm91cEluY2x1ZGVDYWNoZS5ldmljdEluY2x1ZGUoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkUmVzdWx0LklOU1RBTkNFOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEFtR3JvdXBPd25lcihmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgQWNjb3VudEdyb3VwIGdyb3VwKQotICAgICAgdGhyb3dzIEZhaWx1cmUgewotICAgIHRyeSB7Ci0gICAgICBpZiAoIWdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihncm91cC5nZXRJZCgpKS5pc093bmVyKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5vU3VjaEdyb3VwRXhjZXB0aW9uKGdyb3VwLmdldElkKCkpKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgRmFpbHVyZShuZXcgTm9TdWNoR3JvdXBFeGNlcHRpb24oZ3JvdXAuZ2V0SWQoKSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgQWNjb3VudCBmaW5kQWNjb3VudChmaW5hbCBTdHJpbmcgbmFtZU9yRW1haWwpIHRocm93cyBPcm1FeGNlcHRpb24sCi0gICAgICBGYWlsdXJlIHsKLSAgICBBY2NvdW50IHIgPSBhY2NvdW50UmVzb2x2ZXIuZmluZChuYW1lT3JFbWFpbCk7Ci0gICAgaWYgKHIgPT0gbnVsbCkgewotICAgICAgc3dpdGNoIChhdXRoVHlwZSkgewotICAgICAgICBjYXNlIEhUVFBfTERBUDoKLSAgICAgICAgY2FzZSBDTElFTlRfU1NMX0NFUlRfTERBUDoKLSAgICAgICAgY2FzZSBMREFQOgotICAgICAgICAgIHIgPSBjcmVhdGVBY2NvdW50QnlMZGFwKG5hbWVPckVtYWlsKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgIH0KLSAgICAgIGlmIChyID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUobmV3IE5vU3VjaEFjY291bnRFeGNlcHRpb24obmFtZU9yRW1haWwpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLQotICBwcml2YXRlIEFjY291bnQgY3JlYXRlQWNjb3VudEJ5TGRhcChTdHJpbmcgdXNlcikgewotICAgIGlmICghdXNlci5tYXRjaGVzKEFjY291bnQuVVNFUl9OQU1FX1BBVFRFUk4pKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgZmluYWwgQXV0aFJlcXVlc3QgcmVxID0gQXV0aFJlcXVlc3QuZm9yVXNlcih1c2VyKTsKLSAgICAgIHJlcS5zZXRTa2lwQXV0aGVudGljYXRpb24odHJ1ZSk7Ci0gICAgICByZXR1cm4gYWNjb3VudENhY2hlLmdldChhY2NvdW50TWFuYWdlci5hdXRoZW50aWNhdGUocmVxKS5nZXRBY2NvdW50SWQoKSkKLSAgICAgICAgICAuZ2V0QWNjb3VudCgpOwotICAgIH0gY2F0Y2ggKEFjY291bnRFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBBY2NvdW50R3JvdXAgZmluZEdyb3VwKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAotICAgICAgRmFpbHVyZSB7Ci0gICAgZmluYWwgQWNjb3VudEdyb3VwIGcgPSBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkobmFtZSkpOwotICAgIGlmIChnID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hHcm91cEV4Y2VwdGlvbihuYW1lKSk7Ci0gICAgfQotICAgIHJldHVybiBnOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9hY2NvdW50L0dyb3VwRGV0YWlsSGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBEZXRhaWxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzQyMTguLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvR3JvdXBEZXRhaWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmFjY291bnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBEZXRhaWxGYWN0b3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1wdWJsaWMgY2xhc3MgR3JvdXBEZXRhaWxIYW5kbGVyIGV4dGVuZHMgSGFuZGxlcjxHcm91cERldGFpbD4gewotICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIEdyb3VwRGV0YWlsSGFuZGxlciBjcmVhdGUoQWNjb3VudEdyb3VwLklkIGdyb3VwSWQpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeSBncm91cERldGFpbEZhY3Rvcnk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZDsKLQotICBASW5qZWN0Ci0gIEdyb3VwRGV0YWlsSGFuZGxlcihmaW5hbCBHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeSBncm91cERldGFpbEZhY3RvcnksCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQpIHsKLSAgICB0aGlzLmdyb3VwRGV0YWlsRmFjdG9yeSA9IGdyb3VwRGV0YWlsRmFjdG9yeTsKLSAgICB0aGlzLmdyb3VwSWQgPSBncm91cElkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBHcm91cERldGFpbCBjYWxsKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgTm9TdWNoR3JvdXBFeGNlcHRpb24gewotICAgIHJldHVybiBncm91cERldGFpbEZhY3RvcnkuY3JlYXRlKGdyb3VwSWQpLmNhbGwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvTXlHcm91cHNGYWN0b3J5LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9NeUdyb3Vwc0ZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjZTM3MS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9NeUdyb3Vwc0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuYWNjb3VudDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuVmlzaWJsZUdyb3VwczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1jbGFzcyBNeUdyb3Vwc0ZhY3RvcnkgZXh0ZW5kcyBIYW5kbGVyPExpc3Q8QWNjb3VudEdyb3VwPj4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgTXlHcm91cHNGYWN0b3J5IGNyZWF0ZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBWaXNpYmxlR3JvdXBzLkZhY3RvcnkgdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKLQotICBASW5qZWN0Ci0gIE15R3JvdXBzRmFjdG9yeShmaW5hbCBWaXNpYmxlR3JvdXBzLkZhY3RvcnkgdmlzaWJsZUdyb3Vwc0ZhY3RvcnksIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIpIHsKLSAgICB0aGlzLnZpc2libGVHcm91cHNGYWN0b3J5ID0gdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0gICAgdGhpcy51c2VyID0gdXNlcjsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdDxBY2NvdW50R3JvdXA+IGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgVmlzaWJsZUdyb3VwcyB2aXNpYmxlR3JvdXBzID0gdmlzaWJsZUdyb3Vwc0ZhY3RvcnkuY3JlYXRlKCk7Ci0gICAgcmV0dXJuIHZpc2libGVHcm91cHMuZ2V0KHVzZXIpLmdldEdyb3VwcygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9SZW5hbWVHcm91cC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvUmVuYW1lR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmYWY5ZS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9SZW5hbWVHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5JbnZhbGlkTmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUGVyZm9ybVJlbmFtZUdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1jbGFzcyBSZW5hbWVHcm91cCBleHRlbmRzIEhhbmRsZXI8R3JvdXBEZXRhaWw+IHsKLSAgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIFJlbmFtZUdyb3VwIGNyZWF0ZShBY2NvdW50R3JvdXAuSWQgaWQsIFN0cmluZyBuZXdOYW1lKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgUGVyZm9ybVJlbmFtZUdyb3VwLkZhY3RvcnkgcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBuZXdOYW1lOwotCi0gIEBJbmplY3QKLSAgUmVuYW1lR3JvdXAoZmluYWwgUGVyZm9ybVJlbmFtZUdyb3VwLkZhY3RvcnkgcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwgQEFzc2lzdGVkIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0gICAgdGhpcy5wZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5ID0gcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeTsKLSAgICB0aGlzLmdyb3VwSWQgPSBncm91cElkOwotICAgIHRoaXMubmV3TmFtZSA9IG5ld05hbWU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEdyb3VwRGV0YWlsIGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24sCi0gICAgICBOb1N1Y2hHcm91cEV4Y2VwdGlvbiwgSW52YWxpZE5hbWVFeGNlcHRpb24gewotICAgIHJldHVybiBwZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5LmNyZWF0ZSgpLnJlbmFtZUdyb3VwKGdyb3VwSWQsIG5ld05hbWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9WaXNpYmxlR3JvdXBzSGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2FjY291bnQvVmlzaWJsZUdyb3Vwc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmOTFmNy4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvYWNjb3VudC9WaXNpYmxlR3JvdXBzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5hY2NvdW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBMaXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlZpc2libGVHcm91cHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotCi1wdWJsaWMgY2xhc3MgVmlzaWJsZUdyb3Vwc0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPEdyb3VwTGlzdD4gewotCi0gIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBWaXNpYmxlR3JvdXBzSGFuZGxlciBjcmVhdGUoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgVmlzaWJsZUdyb3Vwcy5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgVmlzaWJsZUdyb3Vwc0hhbmRsZXIoZmluYWwgVmlzaWJsZUdyb3Vwcy5GYWN0b3J5IHZpc2libGVHcm91cHNGYWN0b3J5KSB7Ci0gICAgdGhpcy52aXNpYmxlR3JvdXBzRmFjdG9yeSA9IHZpc2libGVHcm91cHNGYWN0b3J5OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBHcm91cExpc3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHJldHVybiB2aXNpYmxlR3JvdXBzRmFjdG9yeS5jcmVhdGUoKS5nZXQoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZS9DaGFuZ2VzUmVzdEFwaVNlcnZsZXQuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2UvQ2hhbmdlc1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU4MTBiOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2UvQ2hhbmdlc1Jlc3RBcGlTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlc0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIENoYW5nZXNSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQEluamVjdAorICBDaGFuZ2VzUmVzdEFwaVNlcnZsZXQoUmVzdEFwaVNlcnZsZXQuR2xvYmFscyBnbG9iYWxzLAorICAgICAgUHJvdmlkZXI8Q2hhbmdlc0NvbGxlY3Rpb24+IGNoYW5nZXMpIHsKKyAgICBzdXBlcihnbG9iYWxzLCBjaGFuZ2VzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZS9EZXByZWNhdGVkQ2hhbmdlUXVlcnlTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0RlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuamF2YQppbmRleCBjZjQ0M2U3Li5kYTIxYzUxIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0RlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0RlcHJlY2F0ZWRDaGFuZ2VRdWVyeVNlcnZsZXQuamF2YQpAQCAtNzMsNiArNzMsNyBAQAogICAgIHAuc2V0SW5jbHVkZUN1cnJlbnRQYXRjaFNldChnZXQocmVxLCAiY3VycmVudC1wYXRjaC1zZXQiLCBmYWxzZSkpOwogICAgIHAuc2V0SW5jbHVkZVBhdGNoU2V0cyhnZXQocmVxLCAicGF0Y2gtc2V0cyIsIGZhbHNlKSk7CiAgICAgcC5zZXRJbmNsdWRlQXBwcm92YWxzKGdldChyZXEsICJhbGwtYXBwcm92YWxzIiwgZmFsc2UpKTsKKyAgICBwLnNldEluY2x1ZGVGaWxlcyhnZXQocmVxLCAiZmlsZXMiLCBmYWxzZSkpOwogICAgIHAuc2V0T3V0cHV0KHJzcC5nZXRPdXRwdXRTdHJlYW0oKSwgZm9ybWF0KTsKICAgICBwLnF1ZXJ5KGdldChyZXEsICJxIiwgInN0YXR1czpvcGVuIikpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0xpc3RDaGFuZ2VzU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZS9MaXN0Q2hhbmdlc1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwMWQ0My4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlL0xpc3RDaGFuZ2VzU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2U7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5SZXN0QXBpU2VydmxldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUXVlcnlQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkxpc3RDaGFuZ2VzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwotCi1AU2luZ2xldG9uCi1wdWJsaWMgY2xhc3MgTGlzdENoYW5nZXNTZXJ2bGV0IGV4dGVuZHMgUmVzdEFwaVNlcnZsZXQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpc3RDaGFuZ2VzU2VydmxldC5jbGFzcyk7Ci0gIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyUGFyc2VyIHBhcmFtUGFyc2VyOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3RDaGFuZ2VzPiBmYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgTGlzdENoYW5nZXNTZXJ2bGV0KGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBjdXJyZW50VXNlciwKLSAgICAgIFBhcmFtZXRlclBhcnNlciBwYXJhbVBhcnNlciwgUHJvdmlkZXI8TGlzdENoYW5nZXM+IGxzKSB7Ci0gICAgc3VwZXIoY3VycmVudFVzZXIpOwotICAgIHRoaXMucGFyYW1QYXJzZXIgPSBwYXJhbVBhcnNlcjsKLSAgICB0aGlzLmZhY3RvcnkgPSBsczsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgTGlzdENoYW5nZXMgaW1wbCA9IGZhY3RvcnkuZ2V0KCk7Ci0gICAgaWYgKGFjY2VwdHNKc29uKHJlcSkpIHsKLSAgICAgIGltcGwuc2V0Rm9ybWF0KE91dHB1dEZvcm1hdC5KU09OX0NPTVBBQ1QpOwotICAgIH0KLSAgICBpZiAocGFyYW1QYXJzZXIucGFyc2UoaW1wbCwgcmVxLCByZXMpKSB7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgaWYgKGltcGwuZ2V0Rm9ybWF0KCkuaXNKc29uKCkpIHsKLSAgICAgICAgYnVmLndyaXRlKEpTT05fTUFHSUMpOwotICAgICAgfQotCi0gICAgICBXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYnVmLCAiVVRGLTgiKSk7Ci0gICAgICB0cnkgewotICAgICAgICBpbXBsLnF1ZXJ5KG91dCk7Ci0gICAgICB9IGNhdGNoIChRdWVyeVBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcmVzLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX0JBRF9SRVFVRVNUKTsKLSAgICAgICAgc2VuZFRleHQocmVxLCByZXMsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nLmVycm9yKCJFcnJvciBxdWVyeWluZyAvY2hhbmdlcy8iLCBlKTsKLSAgICAgICAgcmVzLnNlbmRFcnJvcihIdHRwU2VydmxldFJlc3BvbnNlLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG91dC5mbHVzaCgpOwotCi0gICAgICByZXMuc2V0Q29udGVudFR5cGUoaW1wbC5nZXRGb3JtYXQoKS5pc0pzb24oKSA/IEpTT05fVFlQRSA6ICJ0ZXh0L3BsYWluIik7Ci0gICAgICByZXMuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7Ci0gICAgICBzZW5kKHJlcSwgcmVzLCBidWYudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0FiYW5kb25DaGFuZ2VIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0FiYW5kb25DaGFuZ2VIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTA4ODUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9BYmFuZG9uQ2hhbmdlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3UmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLkFiYW5kb25DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1jbGFzcyBBYmFuZG9uQ2hhbmdlSGFuZGxlciBleHRlbmRzIEhhbmRsZXI8Q2hhbmdlRGV0YWlsPiB7Ci0KLSAgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIEFiYW5kb25DaGFuZ2VIYW5kbGVyIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFiYW5kb25DaGFuZ2U+IGFiYW5kb25DaGFuZ2VQcm92aWRlcjsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7Ci0gIEBOdWxsYWJsZQotICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOwotCi0gIEBJbmplY3QKLSAgQWJhbmRvbkNoYW5nZUhhbmRsZXIoZmluYWwgUHJvdmlkZXI8QWJhbmRvbkNoYW5nZT4gYWJhbmRvbkNoYW5nZVByb3ZpZGVyLAotICAgICAgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3RvcnksCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKLSAgICAgIEBBc3Npc3RlZCBATnVsbGFibGUgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICB0aGlzLmFiYW5kb25DaGFuZ2VQcm92aWRlciA9IGFiYW5kb25DaGFuZ2VQcm92aWRlcjsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKLSAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sCi0gICAgICBQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24sIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwKLSAgICAgIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBBYmFuZG9uQ2hhbmdlIGFiYW5kb25DaGFuZ2UgPSBhYmFuZG9uQ2hhbmdlUHJvdmlkZXIuZ2V0KCk7Ci0gICAgYWJhbmRvbkNoYW5nZS5zZXRDaGFuZ2VJZChwYXRjaFNldElkLmdldFBhcmVudEtleSgpKTsKLSAgICBhYmFuZG9uQ2hhbmdlLnNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IGFiYW5kb25DaGFuZ2UuY2FsbCgpOwotICAgIGlmIChyZXN1bHQuZ2V0RXJyb3JzKCkuc2l6ZSgpID4gMCkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihyZXN1bHQuZ2V0Q2hhbmdlSWQoKSk7Ci0gICAgfQotICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShyZXN1bHQuZ2V0Q2hhbmdlSWQoKSkuY2FsbCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZURldGFpbEZhY3RvcnkuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlRGV0YWlsRmFjdG9yeS5qYXZhCmluZGV4IDY2NjBhM2QuLjEyMGI5YWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlRGV0YWlsRmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlRGV0YWlsRmFjdG9yeS5qYXZhCkBAIC0xNCw5ICsxNCw2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZWRldGFpbDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKQEAgLTI3LDcgKzI0LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlJldklkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQW5vbnltb3VzVXNlcjsKQEAgLTM2LDE1ICszMiwxNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUHJvamVjdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm9DYWNoZUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5SZWJhc2VDaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1lcmdlT3A7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuQ2F0ZWdvcnlGdW5jdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuRnVuY3Rpb25TdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtNjksOSArNjUsNyBAQAogICAgIENoYW5nZURldGFpbEZhY3RvcnkgY3JlYXRlKENoYW5nZS5JZCBpZCk7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgRnVuY3Rpb25TdGF0ZS5GYWN0b3J5IGZ1bmN0aW9uU3RhdGU7CiAgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXREZXRhaWxGYWN0b3J5LkZhY3RvcnkgcGF0Y2hTZXREZXRhaWw7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljOwogICBwcml2YXRlIGZpbmFsIEFub255bW91c1VzZXIgYW5vbnltb3VzVXNlcjsKQEAgLTg3LDkgKzgxLDEyIEBACiAgIHByaXZhdGUgZmluYWwgTWVyZ2VPcC5GYWN0b3J5IG9wRmFjdG9yeTsKICAgcHJpdmF0ZSBib29sZWFuIHRlc3RNZXJnZTsKIAorICBwcml2YXRlIExpc3Q8UGF0Y2hTZXRBbmNlc3Rvcj4gY3VycmVudFBhdGNoU2V0QW5jZXN0b3JzOworICBwcml2YXRlIExpc3Q8UGF0Y2hTZXQ+IGN1cnJlbnREZXBQYXRjaFNldHM7CisgIHByaXZhdGUgTGlzdDxDaGFuZ2U+IGN1cnJlbnREZXBDaGFuZ2VzOworCiAgIEBJbmplY3QKLSAgQ2hhbmdlRGV0YWlsRmFjdG9yeShmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZSwKKyAgQ2hhbmdlRGV0YWlsRmFjdG9yeSgKICAgICAgIGZpbmFsIFBhdGNoU2V0RGV0YWlsRmFjdG9yeS5GYWN0b3J5IHBhdGNoU2V0RGV0YWlsLCBmaW5hbCBSZXZpZXdEYiBkYiwKICAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAogICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LApAQCAtOTgsOCArOTUsNiBAQAogICAgICAgZmluYWwgTWVyZ2VPcC5GYWN0b3J5IG9wRmFjdG9yeSwKICAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgZmluYWwgQ29uZmlnIGNmZywKICAgICAgIEBBc3Npc3RlZCBmaW5hbCBDaGFuZ2UuSWQgaWQpIHsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwotICAgIHRoaXMuZnVuY3Rpb25TdGF0ZSA9IGZ1bmN0aW9uU3RhdGU7CiAgICAgdGhpcy5wYXRjaFNldERldGFpbCA9IHBhdGNoU2V0RGV0YWlsOwogICAgIHRoaXMuZGIgPSBkYjsKICAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CkBAIC0xMTYsNyArMTExLDcgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5vU3VjaEVudGl0eUV4Y2VwdGlvbiwKICAgICAgIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLAotICAgICAgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIHsKICAgICBjb250cm9sID0gY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOwogICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UgPSBjb250cm9sLmdldENoYW5nZSgpOwogICAgIGZpbmFsIFBhdGNoU2V0IHBhdGNoID0gZGIucGF0Y2hTZXRzKCkuZ2V0KGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKQEAgLTE0MSw5ICsxMzYsOSBAQAogCiAgICAgZGV0YWlsLnNldENhblJldmVydChjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5NRVJHRUQgJiYgY29udHJvbC5jYW5BZGRQYXRjaFNldCgpKTsKIAotICAgIGRldGFpbC5zZXRDYW5SZWJhc2UoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpICYmIGNvbnRyb2wuY2FuUmViYXNlKCkpOwotCiAgICAgZGV0YWlsLnNldENhbkVkaXQoY29udHJvbC5nZXRSZWZDb250cm9sKCkuY2FuV3JpdGUoKSk7CisgICAgZGV0YWlsLnNldENhbkVkaXRDb21taXRNZXNzYWdlKGNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSAmJiBjb250cm9sLmNhbkFkZFBhdGNoU2V0KCkpOworICAgIGRldGFpbC5zZXRDYW5FZGl0VG9waWNOYW1lKGNvbnRyb2wuY2FuRWRpdFRvcGljTmFtZSgpKTsKIAogICAgIExpc3Q8U3VibWl0UmVjb3JkPiBzdWJtaXRSZWNvcmRzID0gY29udHJvbC5nZXRTdWJtaXRSZWNvcmRzKGRiLCBwYXRjaCk7CiAgICAgZm9yIChTdWJtaXRSZWNvcmQgcmVjIDogc3VibWl0UmVjb3JkcykgewpAQCAtMTYxLDYgKzE1Niw4IEBACiAgICAgfQogICAgIGRldGFpbC5zZXRTdWJtaXRSZWNvcmRzKHN1Ym1pdFJlY29yZHMpOwogCisgICAgZGV0YWlsLnNldFN1Ym1pdFR5cGVSZWNvcmQoY29udHJvbC5nZXRTdWJtaXRUeXBlUmVjb3JkKGRiLCBwYXRjaCkpOworCiAgICAgcGF0Y2hzZXRzQnlJZCA9IG5ldyBIYXNoTWFwPFBhdGNoU2V0LklkLCBQYXRjaFNldD4oKTsKICAgICBsb2FkUGF0Y2hTZXRzKCk7CiAgICAgbG9hZE1lc3NhZ2VzKCk7CkBAIC0xNjgsNiArMTY1LDExIEBACiAgICAgICBsb2FkQ3VycmVudFBhdGNoU2V0KCk7CiAgICAgfQogICAgIGxvYWQoKTsKKworICAgIGRldGFpbC5zZXRDYW5SZWJhc2UoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpICYmCisgICAgICAgIGNvbnRyb2wuY2FuUmViYXNlKCkgJiYKKyAgICAgICAgUmViYXNlQ2hhbmdlLmNhbkRvUmViYXNlKGRiLCBjaGFuZ2UsIHJlcG9NYW5hZ2VyLAorICAgICAgICAgICAgY3VycmVudFBhdGNoU2V0QW5jZXN0b3JzLCBjdXJyZW50RGVwUGF0Y2hTZXRzLCBjdXJyZW50RGVwQ2hhbmdlcykpOwogICAgIGRldGFpbC5zZXRBY2NvdW50cyhhaWMuY3JlYXRlKCkpOwogICAgIHJldHVybiBkZXRhaWw7CiAgIH0KQEAgLTIwNSw1MyArMjA3LDEzIEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGxvYWQoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24geworICBwcml2YXRlIHZvaWQgbG9hZCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwKKyAgICAgIE5vU3VjaFByb2plY3RFeGNlcHRpb24gewogICAgIGZpbmFsIENoYW5nZS5TdGF0dXMgc3RhdHVzID0gZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpOwogICAgIGlmICgoc3RhdHVzLmVxdWFscyhDaGFuZ2UuU3RhdHVzLk5FVykgfHwgc3RhdHVzLmVxdWFscyhDaGFuZ2UuU3RhdHVzLkRSQUZUKSkgJiYKICAgICAgICAgdGVzdE1lcmdlKSB7CiAgICAgICBDaGFuZ2VVdGlsLnRlc3RNZXJnZShvcEZhY3RvcnksIGRldGFpbC5nZXRDaGFuZ2UoKSk7CiAgICAgfQotCi0gICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNJZCA9IGRldGFpbC5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpOwotICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzID0KLSAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2VJZCkudG9MaXN0KCk7Ci0KLSAgICBpZiAoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpKSB7Ci0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlIGZzID0gZnVuY3Rpb25TdGF0ZS5jcmVhdGUoY29udHJvbCwgcHNJZCwgYWxsQXBwcm92YWxzKTsKLQotICAgICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgYXQgOiBhcHByb3ZhbFR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKSkgewotICAgICAgICBDYXRlZ29yeUZ1bmN0aW9uLmZvckNhdGVnb3J5KGF0LmdldENhdGVnb3J5KCkpLnJ1bihhdCwgZnMpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gY2FuUmVtb3ZlUmV2aWV3ZXJzID0gZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpIC8vCi0gICAgICAgICYmIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyOwotICAgIGZpbmFsIEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+IGFkID0KLSAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+KCk7Ci0gICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGNhIDogYWxsQXBwcm92YWxzKSB7Ci0gICAgICBBcHByb3ZhbERldGFpbCBkID0gYWQuZ2V0KGNhLmdldEFjY291bnRJZCgpKTsKLSAgICAgIGlmIChkID09IG51bGwpIHsKLSAgICAgICAgZCA9IG5ldyBBcHByb3ZhbERldGFpbChjYS5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgIGQuc2V0Q2FuUmVtb3ZlKGNhblJlbW92ZVJldmlld2Vycyk7Ci0gICAgICAgIGFkLnB1dChkLmdldEFjY291bnQoKSwgZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZC5jYW5SZW1vdmUoKSkgewotICAgICAgICBkLnNldENhblJlbW92ZShjb250cm9sLmNhblJlbW92ZVJldmlld2VyKGNhKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY2EuZ2V0UGF0Y2hTZXRJZCgpLmVxdWFscyhwc0lkKSkgewotICAgICAgICBkLmFkZChjYSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgQWNjb3VudC5JZCBvd25lciA9IGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRPd25lcigpOwotICAgIGlmIChhZC5jb250YWluc0tleShvd25lcikpIHsKLSAgICAgIC8vIEVuc3VyZSB0aGUgb3duZXIgYWx3YXlzIHNvcnRzIHRvIHRoZSB0b3Agb2YgdGhlIHRhYmxlCi0gICAgICAvLwotICAgICAgYWQuZ2V0KG93bmVyKS5zb3J0Rmlyc3QoKTsKLSAgICB9Ci0KLSAgICBhaWMud2FudChhZC5rZXlTZXQoKSk7Ci0gICAgZGV0YWlsLnNldEFwcHJvdmFscyhhZC52YWx1ZXMoKSk7CiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gaXNSZXZpZXdlcihDaGFuZ2UgY2hhbmdlKSB7CkBAIC0yNjYsNiArMjI4LDggQEAKICAgcHJpdmF0ZSB2b2lkIGxvYWRDdXJyZW50UGF0Y2hTZXQoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAogICAgICAgTm9TdWNoRW50aXR5RXhjZXB0aW9uLCBQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24sCiAgICAgICBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24geworICAgIGN1cnJlbnREZXBQYXRjaFNldHMgPSBuZXcgQXJyYXlMaXN0PFBhdGNoU2V0PigpOworICAgIGN1cnJlbnREZXBDaGFuZ2VzID0gbmV3IEFycmF5TGlzdDxDaGFuZ2U+KCk7CiAgICAgZmluYWwgUGF0Y2hTZXQgY3VycmVudFBhdGNoID0gZmluZEN1cnJlbnRPckxhdGVzdFBhdGNoU2V0KCk7CiAgICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNJZCA9IGN1cnJlbnRQYXRjaC5nZXRJZCgpOwogICAgIGZpbmFsIFBhdGNoU2V0RGV0YWlsRmFjdG9yeSBsb2FkZXIgPSBwYXRjaFNldERldGFpbC5jcmVhdGUobnVsbCwgcHNJZCwgbnVsbCk7CkBAIC0yNzgsOCArMjQyLDEwIEBACiAgICAgZmluYWwgSGFzaE1hcDxDaGFuZ2UuSWQsUGF0Y2hTZXQuSWQ+IGFuY2VzdG9yUGF0Y2hJZHMgPQogICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsUGF0Y2hTZXQuSWQ+KCk7CiAgICAgZmluYWwgTGlzdDxDaGFuZ2UuSWQ+IGFuY2VzdG9yT3JkZXIgPSBuZXcgQXJyYXlMaXN0PENoYW5nZS5JZD4oKTsKLSAgICBmb3IgKFBhdGNoU2V0QW5jZXN0b3IgYSA6IGRiLnBhdGNoU2V0QW5jZXN0b3JzKCkuYW5jZXN0b3JzT2YocHNJZCkpIHsKKyAgICBjdXJyZW50UGF0Y2hTZXRBbmNlc3RvcnMgPSBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmFuY2VzdG9yc09mKHBzSWQpLnRvTGlzdCgpOworICAgIGZvciAoUGF0Y2hTZXRBbmNlc3RvciBhIDogY3VycmVudFBhdGNoU2V0QW5jZXN0b3JzKSB7CiAgICAgICBmb3IgKFBhdGNoU2V0IHAgOiBkYi5wYXRjaFNldHMoKS5ieVJldmlzaW9uKGEuZ2V0QW5jZXN0b3JSZXZpc2lvbigpKSkgeworICAgICAgICBjdXJyZW50RGVwUGF0Y2hTZXRzLmFkZChwKTsKICAgICAgICAgZmluYWwgQ2hhbmdlLklkIGNrID0gcC5nZXRJZCgpLmdldFBhcmVudEtleSgpOwogICAgICAgICBpZiAoY2hhbmdlc1RvR2V0LmFkZChjaykpIHsKICAgICAgICAgICBhbmNlc3RvclBhdGNoSWRzLnB1dChjaywgcC5nZXRJZCgpKTsKQEAgLTMxMyw2ICsyNzksNyBAQAogICAgIGZvciAoZmluYWwgQ2hhbmdlLklkIGEgOiBhbmNlc3Rvck9yZGVyKSB7CiAgICAgICBmaW5hbCBDaGFuZ2UgYWMgPSBtLmdldChhKTsKICAgICAgIGlmIChhYyAhPSBudWxsICYmIGFjLmdldFByb2plY3QoKS5lcXVhbHMoZGV0YWlsLmdldENoYW5nZSgpLmdldFByb2plY3QoKSkpIHsKKyAgICAgICAgY3VycmVudERlcENoYW5nZXMuYWRkKGFjKTsKICAgICAgICAgaWYgKGFjLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSBDaGFuZ2UuU1RBVFVTX0RSQUZUCiAgICAgICAgICAgICB8fCBhYy5nZXRPd25lcigpLmVxdWFscyhjdXJyZW50VXNlcklkKQogICAgICAgICAgICAgfHwgaXNSZXZpZXdlcihhYykpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTWFuYWdlU2VydmljZUltcGwuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTWFuYWdlU2VydmljZUltcGwuamF2YQppbmRleCBmOTk5MjFiLi41M2UwZDlkIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZU1hbmFnZVNlcnZpY2VJbXBsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9DaGFuZ2VNYW5hZ2VTZXJ2aWNlSW1wbC5qYXZhCkBAIC0xNyw0NCArMTcsMjcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlTWFuYWdlU2VydmljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0LklkOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCiBjbGFzcyBDaGFuZ2VNYW5hZ2VTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIENoYW5nZU1hbmFnZVNlcnZpY2UgewotICBwcml2YXRlIGZpbmFsIFN1Ym1pdEFjdGlvbi5GYWN0b3J5IHN1Ym1pdEFjdGlvbjsKLSAgcHJpdmF0ZSBmaW5hbCBBYmFuZG9uQ2hhbmdlSGFuZGxlci5GYWN0b3J5IGFiYW5kb25DaGFuZ2VIYW5kbGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBSZWJhc2VDaGFuZ2UuRmFjdG9yeSByZWJhc2VDaGFuZ2VGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJlc3RvcmVDaGFuZ2VIYW5kbGVyLkZhY3RvcnkgcmVzdG9yZUNoYW5nZUhhbmRsZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJldmVydENoYW5nZS5GYWN0b3J5IHJldmVydENoYW5nZUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUmViYXNlQ2hhbmdlSGFuZGxlci5GYWN0b3J5IHJlYmFzZUNoYW5nZUZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUHVibGlzaEFjdGlvbi5GYWN0b3J5IHB1Ymxpc2hBY3Rpb247CiAgIHByaXZhdGUgZmluYWwgRGVsZXRlRHJhZnRDaGFuZ2UuRmFjdG9yeSBkZWxldGVEcmFmdENoYW5nZUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyLkZhY3RvcnkgZWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyRmFjdG9yeTsKIAogICBASW5qZWN0Ci0gIENoYW5nZU1hbmFnZVNlcnZpY2VJbXBsKGZpbmFsIFN1Ym1pdEFjdGlvbi5GYWN0b3J5IHBhdGNoU2V0QWN0aW9uLAotICAgICAgZmluYWwgQWJhbmRvbkNoYW5nZUhhbmRsZXIuRmFjdG9yeSBhYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3RvcnksCi0gICAgICBmaW5hbCBSZWJhc2VDaGFuZ2UuRmFjdG9yeSByZWJhc2VDaGFuZ2VGYWN0b3J5LAotICAgICAgZmluYWwgUmVzdG9yZUNoYW5nZUhhbmRsZXIuRmFjdG9yeSByZXN0b3JlQ2hhbmdlSGFuZGxlckZhY3RvcnksCi0gICAgICBmaW5hbCBSZXZlcnRDaGFuZ2UuRmFjdG9yeSByZXZlcnRDaGFuZ2VGYWN0b3J5LAorICBDaGFuZ2VNYW5hZ2VTZXJ2aWNlSW1wbCgKKyAgICAgIGZpbmFsIFJlYmFzZUNoYW5nZUhhbmRsZXIuRmFjdG9yeSByZWJhc2VDaGFuZ2VGYWN0b3J5LAogICAgICAgZmluYWwgUHVibGlzaEFjdGlvbi5GYWN0b3J5IHB1Ymxpc2hBY3Rpb24sCi0gICAgICBmaW5hbCBEZWxldGVEcmFmdENoYW5nZS5GYWN0b3J5IGRlbGV0ZURyYWZ0Q2hhbmdlRmFjdG9yeSkgewotICAgIHRoaXMuc3VibWl0QWN0aW9uID0gcGF0Y2hTZXRBY3Rpb247Ci0gICAgdGhpcy5hYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3RvcnkgPSBhYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3Rvcnk7CisgICAgICBmaW5hbCBEZWxldGVEcmFmdENoYW5nZS5GYWN0b3J5IGRlbGV0ZURyYWZ0Q2hhbmdlRmFjdG9yeSwKKyAgICAgIGZpbmFsIEVkaXRDb21taXRNZXNzYWdlSGFuZGxlci5GYWN0b3J5IGVkaXRDb21taXRNZXNzYWdlSGFuZGxlcikgewogICAgIHRoaXMucmViYXNlQ2hhbmdlRmFjdG9yeSA9IHJlYmFzZUNoYW5nZUZhY3Rvcnk7Ci0gICAgdGhpcy5yZXN0b3JlQ2hhbmdlSGFuZGxlckZhY3RvcnkgPSByZXN0b3JlQ2hhbmdlSGFuZGxlckZhY3Rvcnk7Ci0gICAgdGhpcy5yZXZlcnRDaGFuZ2VGYWN0b3J5ID0gcmV2ZXJ0Q2hhbmdlRmFjdG9yeTsKICAgICB0aGlzLnB1Ymxpc2hBY3Rpb24gPSBwdWJsaXNoQWN0aW9uOwogICAgIHRoaXMuZGVsZXRlRHJhZnRDaGFuZ2VGYWN0b3J5ID0gZGVsZXRlRHJhZnRDaGFuZ2VGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3VibWl0KGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2IpIHsKLSAgICBzdWJtaXRBY3Rpb24uY3JlYXRlKHBhdGNoU2V0SWQpLnRvKGNiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFiYW5kb25DaGFuZ2UoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spIHsKLSAgICBhYmFuZG9uQ2hhbmdlSGFuZGxlckZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQsIG1lc3NhZ2UpLnRvKGNhbGxiYWNrKTsKKyAgICB0aGlzLmVkaXRDb21taXRNZXNzYWdlSGFuZGxlckZhY3RvcnkgPSBlZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXI7CiAgIH0KIAogICBwdWJsaWMgdm9pZCByZWJhc2VDaGFuZ2UoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKQEAgLTYyLDE2ICs0NSw2IEBACiAgICAgcmViYXNlQ2hhbmdlRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCkudG8oY2FsbGJhY2spOwogICB9CiAKLSAgcHVibGljIHZvaWQgcmV2ZXJ0Q2hhbmdlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIGZpbmFsIFN0cmluZyBtZXNzYWdlLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKSB7Ci0gICAgcmV2ZXJ0Q2hhbmdlRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCwgbWVzc2FnZSkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzdG9yZUNoYW5nZShmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwKLSAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8Q2hhbmdlRGV0YWlsPiBjYWxsYmFjaykgewotICAgIHJlc3RvcmVDaGFuZ2VIYW5kbGVyRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCwgbWVzc2FnZSkudG8oY2FsbGJhY2spOwotICB9Ci0KICAgcHVibGljIHZvaWQgcHVibGlzaChmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAogICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxDaGFuZ2VEZXRhaWw+IGNhbGxiYWNrKSB7CiAgICAgcHVibGlzaEFjdGlvbi5jcmVhdGUocGF0Y2hTZXRJZCkudG8oY2FsbGJhY2spOwpAQCAtODEsNCArNTQsOSBAQAogICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewogICAgIGRlbGV0ZURyYWZ0Q2hhbmdlRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCkudG8oY2FsbGJhY2spOwogICB9CisKKyAgcHVibGljIHZvaWQgY3JlYXRlTmV3UGF0Y2hTZXQoSWQgcGF0Y2hTZXRJZCwgU3RyaW5nIG1lc3NhZ2UsCisgICAgICBBc3luY0NhbGxiYWNrPENoYW5nZURldGFpbD4gY2FsbGJhY2spIHsKKyAgICBlZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXJGYWN0b3J5LmNyZWF0ZShwYXRjaFNldElkLCBtZXNzYWdlKS50byhjYWxsYmFjayk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZU1vZHVsZS5qYXZhCmluZGV4IGI2NzJhNDM5Li40OGMxM2MyIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0NoYW5nZU1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvQ2hhbmdlTW9kdWxlLmphdmEKQEAgLTI4LDE1ICsyOCwxMiBAQAogICAgIGluc3RhbGwobmV3IEZhY3RvcnlNb2R1bGUoKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgZmFjdG9yeShBYmFuZG9uQ2hhbmdlSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShSZXN0b3JlQ2hhbmdlSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShSZXZlcnRDaGFuZ2UuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoUmViYXNlQ2hhbmdlLkZhY3RvcnkuY2xhc3MpOworICAgICAgICBmYWN0b3J5KEVkaXRDb21taXRNZXNzYWdlSGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKKyAgICAgICAgZmFjdG9yeShSZWJhc2VDaGFuZ2VIYW5kbGVyLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoSW5jbHVkZWRJbkRldGFpbEZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoUGF0Y2hTZXREZXRhaWxGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFBhdGNoU2V0UHVibGlzaERldGFpbEZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgIGZhY3RvcnkoU3VibWl0QWN0aW9uLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFB1Ymxpc2hBY3Rpb24uRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoRGVsZXRlRHJhZnRDaGFuZ2UuRmFjdG9yeS5jbGFzcyk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0RlbGV0ZURyYWZ0Q2hhbmdlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL0RlbGV0ZURyYWZ0Q2hhbmdlLmphdmEKaW5kZXggZWNkOGI1NC4uNjNjMjJjZSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9EZWxldGVEcmFmdENoYW5nZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvRGVsZXRlRHJhZnRDaGFuZ2UuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb247CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOwogCiAgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKIApAQCAtNDYsMTIgKzQ2LDEyIEBACiAgIERlbGV0ZURyYWZ0Q2hhbmdlKGZpbmFsIFJldmlld0RiIGRiLAogICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAogICAgICAgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlciwKLSAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCkgewogICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKLSAgICB0aGlzLnJlcGxpY2F0aW9uID0gcmVwbGljYXRpb247CisgICAgdGhpcy5naXRSZWZVcGRhdGVkID0gZ2l0UmVmVXBkYXRlZDsKIAogICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7CiAgIH0KQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOwogICAgIH0KIAotICAgIENoYW5nZVV0aWwuZGVsZXRlRHJhZnRDaGFuZ2UocGF0Y2hTZXRJZCwgZ2l0TWFuYWdlciwgcmVwbGljYXRpb24sIGRiKTsKKyAgICBDaGFuZ2VVdGlsLmRlbGV0ZURyYWZ0Q2hhbmdlKHBhdGNoU2V0SWQsIGdpdE1hbmFnZXIsIGdpdFJlZlVwZGF0ZWQsIGRiKTsKICAgICByZXR1cm4gVm9pZFJlc3VsdC5JTlNUQU5DRTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9FZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwNjRjOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuY2hhbmdlZGV0YWlsOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQXBwcm92YWxzVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuVHJhY2tpbmdGb290ZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdG9yczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLk5vU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitjbGFzcyBFZGl0Q29tbWl0TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4geworICBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgRWRpdENvbW1pdE1lc3NhZ2VIYW5kbGVyIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBDb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyLkZhY3RvcnkgY29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlckZhY3Rvcnk7CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CisKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkOworICBATnVsbGFibGUKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOworICBwcml2YXRlIGZpbmFsIENvbW1pdFZhbGlkYXRvcnMuRmFjdG9yeSBjb21taXRWYWxpZGF0b3JzRmFjdG9yeTsKKworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OworCisgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKKyAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWw7CisgIHByaXZhdGUgZmluYWwgVHJhY2tpbmdGb290ZXJzIHRyYWNraW5nRm9vdGVyczsKKworICBASW5qZWN0CisgIEVkaXRDb21taXRNZXNzYWdlSGFuZGxlcihmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCisgICAgICBmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCisgICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSwKKyAgICAgIGZpbmFsIENvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIuRmFjdG9yeSBjb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyRmFjdG9yeSwKKyAgICAgIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAorICAgICAgQEFzc2lzdGVkIEBOdWxsYWJsZSBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ2hhbmdlSG9va3MgaG9va3MsCisgICAgICBmaW5hbCBDb21taXRWYWxpZGF0b3JzLkZhY3RvcnkgY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnksCisgICAgICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLAorICAgICAgQEdlcnJpdFBlcnNvbklkZW50IGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQsCisgICAgICBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWwsIFRyYWNraW5nRm9vdGVycyB0cmFja2luZ0Zvb3RlcnMpIHsKKyAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKKyAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OworICAgIHRoaXMuY29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlckZhY3RvcnkgPSBjb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyRmFjdG9yeTsKKworICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB0aGlzLmhvb2tzID0gaG9va3M7CisgICAgdGhpcy5jb21taXRWYWxpZGF0b3JzRmFjdG9yeSA9IGNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5OworICAgIHRoaXMuZ2l0TWFuYWdlciA9IGdpdE1hbmFnZXI7CisKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5teUlkZW50ID0gbXlJZGVudDsKKyAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOworICAgIHRoaXMudHJhY2tpbmdGb290ZXJzID0gdHJhY2tpbmdGb290ZXJzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKKyAgICAgIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisKKyAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOworICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKKyAgICBpZiAoIWNvbnRyb2wuY2FuQWRkUGF0Y2hTZXQoKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIk5vdCBhbGxvd2VkIHRvIGFkZCBuZXcgUGF0Y2ggU2V0cyB0bzogIiArIGNoYW5nZUlkLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGZpbmFsIFJlcG9zaXRvcnkgZ2l0OworICAgIHRyeSB7CisgICAgICBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpLmdldFByb2plY3QoKSk7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQsIGUpOworICAgIH0KKyAgICB0cnkgeworICAgICAgQ29tbWl0VmFsaWRhdG9ycyBjb21taXRWYWxpZGF0b3JzID0KKyAgICAgICAgICBjb21taXRWYWxpZGF0b3JzRmFjdG9yeS5jcmVhdGUoY29udHJvbC5nZXRSZWZDb250cm9sKCksIG5ldyBOb1NzaEluZm8oKSwgZ2l0KTsKKworICAgICAgQ2hhbmdlVXRpbC5lZGl0Q29tbWl0TWVzc2FnZShwYXRjaFNldElkLCBjb250cm9sLmdldFJlZkNvbnRyb2woKSwgY29tbWl0VmFsaWRhdG9ycywgY3VycmVudFVzZXIsIG1lc3NhZ2UsIGRiLAorICAgICAgICAgIGNvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXJGYWN0b3J5LCBob29rcywgZ2l0LCBwYXRjaFNldEluZm9GYWN0b3J5LCBnaXRSZWZVcGRhdGVkLCBteUlkZW50LAorICAgICAgICAgIGFwcHJvdmFsc1V0aWwsIHRyYWNraW5nRm9vdGVycyk7CisKKyAgICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShjaGFuZ2VJZCkuY2FsbCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBnaXQuY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUGF0Y2hTZXRQdWJsaXNoRGV0YWlsRmFjdG9yeS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5LmphdmEKaW5kZXggNTBiYWY5Ny4uZDAxMDFhNiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5LmphdmEKQEAgLTE0LDE4ICsxNCwxNCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbERldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTZXRQdWJsaXNoRGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwpAQCAtMzQsMTQgKzMwLDEwIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuQ2F0ZWdvcnlGdW5jdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3cuRnVuY3Rpb25TdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC01Myw5ICs0NSw3IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IGluZm9GYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uU3RhdGUuRmFjdG9yeSBmdW5jdGlvblN0YXRlOwogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXM7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljOwogICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CiAKQEAgLTY5LDE1ICs1OSwxMSBAQAogICBQYXRjaFNldFB1Ymxpc2hEZXRhaWxGYWN0b3J5KGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgaW5mb0ZhY3RvcnksCiAgICAgICBmaW5hbCBSZXZpZXdEYiBkYiwKICAgICAgIGZpbmFsIEFjY291bnRJbmZvQ2FjaGVGYWN0b3J5LkZhY3RvcnkgYWNjb3VudEluZm9DYWNoZUZhY3RvcnksCi0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZSwKICAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlcywKICAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIsIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkKSB7CiAgICAgdGhpcy5pbmZvRmFjdG9yeSA9IGluZm9GYWN0b3J5OwogICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLmZ1bmN0aW9uU3RhdGUgPSBmdW5jdGlvblN0YXRlOwogICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwogICAgIHRoaXMuYWljID0gYWNjb3VudEluZm9DYWNoZUZhY3RvcnkuY3JlYXRlKCk7CiAgICAgdGhpcy51c2VyID0gdXNlcjsKIApAQCAtMTAxLDkgKzg3LDYgQEAKICAgICBkZXRhaWwuc2V0Q2hhbmdlKGNoYW5nZSk7CiAgICAgZGV0YWlsLnNldERyYWZ0cyhkcmFmdHMpOwogCi0gICAgTGlzdDxQZXJtaXNzaW9uUmFuZ2U+IGFsbG93ZWQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGdpdmVuID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpCiAgICAgICAgICYmIHBhdGNoU2V0SWQuZXF1YWxzKGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKSkgewogICAgICAgLy8gVE9ETyBQdXNoIHRoaXMgc2VsZWN0aW9uIG9mIGxhYmVscyBkb3duIGludG8gdGhlIFByb2xvZyBpbnRlcnByZXRlci4KQEAgLTEyMCwxMSArMTAzLDYgQEAKICAgICAgICAgICByYW5nZUJ5TmFtZS5wdXQoci5nZXRMYWJlbCgpLCByKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgYWxsb3dlZCA9IG5ldyBBcnJheUxpc3Q8UGVybWlzc2lvblJhbmdlPigpOwotCi0gICAgICBnaXZlbiA9IGRiLnBhdGNoU2V0QXBwcm92YWxzKCkgLy8KLSAgICAgICAgICAuYnlQYXRjaFNldFVzZXIocGF0Y2hTZXRJZCwgdXNlci5nZXRBY2NvdW50SWQoKSkgLy8KLSAgICAgICAgICAudG9MaXN0KCk7CiAKICAgICAgIGJvb2xlYW4gY291bGRTdWJtaXQgPSBmYWxzZTsKICAgICAgIExpc3Q8U3VibWl0UmVjb3JkPiBzdWJtaXRSZWNvcmRzID0gY29udHJvbC5jYW5TdWJtaXQoZGIsIHBhdGNoU2V0KTsKQEAgLTE0MiwxMiArMTIwLDggQEAKICAgICAgICAgICAgIGJvb2xlYW4gY2FuTWFrZU9rID0gZmFsc2U7CiAgICAgICAgICAgICBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UgPSByYW5nZUJ5TmFtZS5nZXQobGJsLmxhYmVsKTsKICAgICAgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGlmICghYWxsb3dlZC5jb250YWlucyhyYW5nZSkpIHsKLSAgICAgICAgICAgICAgICBhbGxvd2VkLmFkZChyYW5nZSk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBBcHByb3ZhbFR5cGUgYXQgPSBhcHByb3ZhbFR5cGVzLmJ5TGFiZWwobGJsLmxhYmVsKTsKLSAgICAgICAgICAgICAgaWYgKGF0ID09IG51bGwgfHwgYXQuZ2V0TWF4KCkuZ2V0VmFsdWUoKSA9PSByYW5nZS5nZXRNYXgoKSkgeworICAgICAgICAgICAgICBMYWJlbFR5cGUgbHQgPSBjb250cm9sLmdldExhYmVsVHlwZXMoKS5ieUxhYmVsKGxibC5sYWJlbCk7CisgICAgICAgICAgICAgIGlmIChsdCAhPSBudWxsICYmIGx0LmdldE1heCgpLmdldFZhbHVlKCkgPT0gcmFuZ2UuZ2V0TWF4KCkpIHsKICAgICAgICAgICAgICAgICBjYW5NYWtlT2sgPSB0cnVlOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNjMsNiArMTM3LDEwIEBACiAgICAgICAgICAgICAgICAgICBvaysrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIElNUE9TU0lCTEU6CisgICAgICAgICAgICAgIGNhc2UgUkVKRUNUOgorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KIApAQCAtMTc2LDYwICsxNTQsMTEgQEAKICAgICAgIGlmIChjb3VsZFN1Ym1pdCAmJiBjb250cm9sLmdldFJlZkNvbnRyb2woKS5jYW5TdWJtaXQoKSkgewogICAgICAgICBkZXRhaWwuc2V0Q2FuU3VibWl0KHRydWUpOwogICAgICAgfQotCi0gICAgICBkZXRhaWwuc2V0U3VibWl0UmVjb3JkcyhzdWJtaXRSZWNvcmRzKTsKICAgICB9CiAKLSAgICBkZXRhaWwuc2V0TGFiZWxzKGFsbG93ZWQpOwotICAgIGRldGFpbC5zZXRHaXZlbihnaXZlbik7Ci0gICAgbG9hZEFwcHJvdmFscyhkZXRhaWwsIGNvbnRyb2wpOwotCisgICAgZGV0YWlsLnNldFN1Ym1pdFR5cGVSZWNvcmQoY29udHJvbC5nZXRTdWJtaXRUeXBlUmVjb3JkKGRiLCBwYXRjaFNldCkpOwogICAgIGRldGFpbC5zZXRBY2NvdW50cyhhaWMuY3JlYXRlKCkpOwogCiAgICAgcmV0dXJuIGRldGFpbDsKICAgfQotCi0gIHByaXZhdGUgdm9pZCBsb2FkQXBwcm92YWxzKGZpbmFsIFBhdGNoU2V0UHVibGlzaERldGFpbCBkZXRhaWwsCi0gICAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNvbnRyb2wpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIFBhdGNoU2V0LklkIHBzSWQgPSBkZXRhaWwuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKTsKLSAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwotICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzID0KLSAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2VJZCkudG9MaXN0KCk7Ci0KLSAgICBpZiAoZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpKSB7Ci0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlIGZzID0gZnVuY3Rpb25TdGF0ZS5jcmVhdGUoY29udHJvbCwgcHNJZCwgYWxsQXBwcm92YWxzKTsKLQotICAgICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgYXQgOiBhcHByb3ZhbFR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKSkgewotICAgICAgICBDYXRlZ29yeUZ1bmN0aW9uLmZvckNhdGVnb3J5KGF0LmdldENhdGVnb3J5KCkpLnJ1bihhdCwgZnMpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIGJvb2xlYW4gY2FuUmVtb3ZlUmV2aWV3ZXJzID0gZGV0YWlsLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpIC8vCi0gICAgICAgICYmIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyOwotICAgIGZpbmFsIEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+IGFkID0KLSAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudC5JZCwgQXBwcm92YWxEZXRhaWw+KCk7Ci0gICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGNhIDogYWxsQXBwcm92YWxzKSB7Ci0gICAgICBBcHByb3ZhbERldGFpbCBkID0gYWQuZ2V0KGNhLmdldEFjY291bnRJZCgpKTsKLSAgICAgIGlmIChkID09IG51bGwpIHsKLSAgICAgICAgZCA9IG5ldyBBcHByb3ZhbERldGFpbChjYS5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgIGQuc2V0Q2FuUmVtb3ZlKGNhblJlbW92ZVJldmlld2Vycyk7Ci0gICAgICAgIGFkLnB1dChkLmdldEFjY291bnQoKSwgZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZC5jYW5SZW1vdmUoKSkgewotICAgICAgICBkLnNldENhblJlbW92ZShjb250cm9sLmNhblJlbW92ZVJldmlld2VyKGNhKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoY2EuZ2V0UGF0Y2hTZXRJZCgpLmVxdWFscyhwc0lkKSkgewotICAgICAgICBkLmFkZChjYSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmluYWwgQWNjb3VudC5JZCBvd25lciA9IGRldGFpbC5nZXRDaGFuZ2UoKS5nZXRPd25lcigpOwotICAgIGlmIChhZC5jb250YWluc0tleShvd25lcikpIHsKLSAgICAgIC8vIEVuc3VyZSB0aGUgb3duZXIgYWx3YXlzIHNvcnRzIHRvIHRoZSB0b3Agb2YgdGhlIHRhYmxlCi0gICAgICBhZC5nZXQob3duZXIpLnNvcnRGaXJzdCgpOwotICAgIH0KLQotICAgIGFpYy53YW50KGFkLmtleVNldCgpKTsKLSAgICBkZXRhaWwuc2V0QXBwcm92YWxzKGFkLnZhbHVlcygpKTsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9QdWJsaXNoQWN0aW9uLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1B1Ymxpc2hBY3Rpb24uamF2YQppbmRleCBmNTdiMjljLi4zOGY4ZmM2IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1B1Ymxpc2hBY3Rpb24uamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1B1Ymxpc2hBY3Rpb24uamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuUHVibGlzaERyYWZ0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CkBAIC01Myw3ICs1NCw4IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgQ2hhbmdlRGV0YWlsIGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sCiAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKLSAgICAgIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIHsKICAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0gcHVibGlzaEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQpLmNhbGwoKTsKICAgICBpZiAocmVzdWx0LmdldEVycm9ycygpLnNpemUoKSA+IDApIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBwdWJsaXNoIHBhdGNoc2V0Iik7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcxZTMwMi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuY2hhbmdlZGV0YWlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFwcHJvdmFsc1V0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlYmFzZWRQYXRjaFNldFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1jbGFzcyBSZWJhc2VDaGFuZ2UgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUmViYXNlQ2hhbmdlIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOwotICBwcml2YXRlIGZpbmFsIFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5IHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3Rvcnk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLQotICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tSdW5uZXIgaG9va3M7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQ7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWw7Ci0KLSAgQEluamVjdAotICBSZWJhc2VDaGFuZ2UoZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAotICAgICAgZmluYWwgUmV2aWV3RGIgZGIsIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLAotICAgICAgZmluYWwgUmViYXNlZFBhdGNoU2V0U2VuZGVyLkZhY3RvcnkgcmViYXNlZFBhdGNoU2V0U2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIGZpbmFsIENoYW5nZUhvb2tSdW5uZXIgaG9va3MsCi0gICAgICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwKLSAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAotICAgICAgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsKSB7Ci0gICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7Ci0gICAgdGhpcy5yZWJhc2VkUGF0Y2hTZXRTZW5kZXJGYWN0b3J5ID0gcmViYXNlZFBhdGNoU2V0U2VuZGVyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKLSAgICB0aGlzLmhvb2tzID0gaG9va3M7Ci0gICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKLQotICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci0gICAgdGhpcy5yZXBsaWNhdGlvbiA9IHJlcGxpY2F0aW9uOwotICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7Ci0KLSAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKLSAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKLSAgICAgIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0KLSAgICBDaGFuZ2VVdGlsLnJlYmFzZUNoYW5nZShwYXRjaFNldElkLCBjdXJyZW50VXNlciwgZGIsCi0gICAgICAgIHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3RvcnksIGhvb2tzLCBnaXRNYW5hZ2VyLCBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgICByZXBsaWNhdGlvbiwgbXlJZGVudCwgY2hhbmdlQ29udHJvbEZhY3RvcnksIGFwcHJvdmFsc1V0aWwpOwotCi0gICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkpLmNhbGwoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2VIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWFjZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2VIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DaGFuZ2VEZXRhaWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuUmViYXNlQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2NsYXNzIFJlYmFzZUNoYW5nZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4geworICBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgUmViYXNlQ2hhbmdlSGFuZGxlciBjcmVhdGUoUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFJlYmFzZUNoYW5nZSByZWJhc2VDaGFuZ2U7CisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3Rvcnk7CisKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkOworCisgIEBJbmplY3QKKyAgUmViYXNlQ2hhbmdlSGFuZGxlcihmaW5hbCBSZWJhc2VDaGFuZ2UgcmViYXNlQ2hhbmdlLAorICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCisgICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSwKKyAgICAgIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkKSB7CisgICAgdGhpcy5yZWJhc2VDaGFuZ2UgPSByZWJhc2VDaGFuZ2U7CisgICAgdGhpcy5jdXJyZW50VXNlciA9IGN1cnJlbnRVc2VyOworICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7CisKKyAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEVtYWlsRXhjZXB0aW9uLCBOb1N1Y2hFbnRpdHlFeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwKKyAgICAgIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisgICAgcmViYXNlQ2hhbmdlLnJlYmFzZShwYXRjaFNldElkLCBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CisgICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkpLmNhbGwoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZXN0b3JlQ2hhbmdlSGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2NoYW5nZWRldGFpbC9SZXN0b3JlQ2hhbmdlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU3MWZkLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUmVzdG9yZUNoYW5nZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuY2hhbmdlZGV0YWlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEVudGl0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5SZXN0b3JlQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotY2xhc3MgUmVzdG9yZUNoYW5nZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUmVzdG9yZUNoYW5nZUhhbmRsZXIgY3JlYXRlKFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIFN0cmluZyBtZXNzYWdlKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmVzdG9yZUNoYW5nZT4gcmVzdG9yZUNoYW5nZVByb3ZpZGVyOwotICBwcml2YXRlIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLSAgQE51bGxhYmxlCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgQEluamVjdAotICBSZXN0b3JlQ2hhbmdlSGFuZGxlcihmaW5hbCBQcm92aWRlcjxSZXN0b3JlQ2hhbmdlPiByZXN0b3JlQ2hhbmdlUHJvdmlkZXIsCi0gICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAotICAgICAgQEFzc2lzdGVkIEBOdWxsYWJsZSBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgIHRoaXMucmVzdG9yZUNoYW5nZVByb3ZpZGVyID0gcmVzdG9yZUNoYW5nZVByb3ZpZGVyOwotICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7Ci0KLSAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIENoYW5nZURldGFpbCBjYWxsKCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLAotICAgICAgRW1haWxFeGNlcHRpb24sIE5vU3VjaEVudGl0eUV4Y2VwdGlvbiwgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLAotICAgICAgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIFJlc3RvcmVDaGFuZ2UgcmVzdG9yZUNoYW5nZSA9IHJlc3RvcmVDaGFuZ2VQcm92aWRlci5nZXQoKTsKLSAgICByZXN0b3JlQ2hhbmdlLnNldENoYW5nZUlkKHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkpOwotICAgIHJlc3RvcmVDaGFuZ2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0gcmVzdG9yZUNoYW5nZS5jYWxsKCk7Ci0gICAgaWYgKHJlc3VsdC5nZXRFcnJvcnMoKS5zaXplKCkgPiAwKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uKHJlc3VsdC5nZXRDaGFuZ2VJZCgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHJlc3VsdC5nZXRDaGFuZ2VJZCgpKS5jYWxsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUmV2ZXJ0Q2hhbmdlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1JldmVydENoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGEwM2JkLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvUmV2ZXJ0Q2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ2hhbmdlRGV0YWlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmV2ZXJ0ZWRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1jbGFzcyBSZXZlcnRDaGFuZ2UgZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgUmV2ZXJ0Q2hhbmdlIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkLCBTdHJpbmcgbWVzc2FnZSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZlcnRlZFNlbmRlci5GYWN0b3J5IHJldmVydGVkU2VuZGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLSAgQE51bGxhYmxlCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKLQotICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OwotCi0gIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKLQotICBASW5qZWN0Ci0gIFJldmVydENoYW5nZShmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCi0gICAgICBmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBSZXZlcnRlZFNlbmRlci5GYWN0b3J5IHJldmVydGVkU2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBAQXNzaXN0ZWQgQE51bGxhYmxlIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDaGFuZ2VIb29rcyBob29rcywKLSAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXIsCi0gICAgICBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCi0gICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uLAotICAgICAgQEdlcnJpdFBlcnNvbklkZW50IGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQpIHsKLSAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKLSAgICB0aGlzLnJldmVydGVkU2VuZGVyRmFjdG9yeSA9IHJldmVydGVkU2VuZGVyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5wYXRjaFNldElkID0gcGF0Y2hTZXRJZDsKLSAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIHRoaXMuaG9va3MgPSBob29rczsKLSAgICB0aGlzLmdpdE1hbmFnZXIgPSBnaXRNYW5hZ2VyOwotCi0gICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLSAgICB0aGlzLnJlcGxpY2F0aW9uID0gcmVwbGljYXRpb247Ci0gICAgdGhpcy5teUlkZW50ID0gbXlJZGVudDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQ2hhbmdlRGV0YWlsIGNhbGwoKSB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCi0gICAgICBFbWFpbEV4Y2VwdGlvbiwgTm9TdWNoRW50aXR5RXhjZXB0aW9uLCBQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24sCi0gICAgICBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLSAgICBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwYXRjaFNldElkLmdldFBhcmVudEtleSgpOwotICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKLSAgICBpZiAoIWNvbnRyb2wuY2FuQWRkUGF0Y2hTZXQoKSkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7Ci0gICAgfQotCi0gICAgQ2hhbmdlLklkIHJldmVydGVkQ2hhbmdlSWQgPSBDaGFuZ2VVdGlsLnJldmVydChwYXRjaFNldElkLCBjdXJyZW50VXNlciwgbWVzc2FnZSwgZGIsCi0gICAgICAgIHJldmVydGVkU2VuZGVyRmFjdG9yeSwgaG9va3MsIGdpdE1hbmFnZXIsIHBhdGNoU2V0SW5mb0ZhY3RvcnksCi0gICAgICAgIHJlcGxpY2F0aW9uLCBteUlkZW50KTsKLQotICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShyZXZlcnRlZENoYW5nZUlkKS5jYWxsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvU3VibWl0QWN0aW9uLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvY2hhbmdlZGV0YWlsL1N1Ym1pdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IyMWQ1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9jaGFuZ2VkZXRhaWwvU3VibWl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLmNoYW5nZWRldGFpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZXZpZXdSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hFbnRpdHlFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLkhhbmRsZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuU3VibWl0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1jbGFzcyBTdWJtaXRBY3Rpb24gZXh0ZW5kcyBIYW5kbGVyPENoYW5nZURldGFpbD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgU3VibWl0QWN0aW9uIGNyZWF0ZShQYXRjaFNldC5JZCBwYXRjaFNldElkKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU3VibWl0LkZhY3Rvcnkgc3VibWl0RmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7Ci0KLSAgQEluamVjdAotICBTdWJtaXRBY3Rpb24oZmluYWwgU3VibWl0LkZhY3Rvcnkgc3VibWl0RmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQpIHsKLSAgICB0aGlzLnN1Ym1pdEZhY3RvcnkgPSBzdWJtaXRGYWN0b3J5OwotICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7Ci0KLSAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBDaGFuZ2VEZXRhaWwgY2FsbCgpIHRocm93cyBPcm1FeGNlcHRpb24sIE5vU3VjaEVudGl0eUV4Y2VwdGlvbiwKLSAgICAgIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiwgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLAotICAgICAgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9Ci0gICAgICAgIHN1Ym1pdEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQpLmNhbGwoKTsKLSAgICBpZiAocmVzdWx0LmdldEVycm9ycygpLnNpemUoKSA+IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgIkNhbm5vdCBzdWJtaXQgIiArIHJlc3VsdC5nZXRFcnJvcnMoKS5nZXQoMCkuZ2V0TWVzc2FnZU9yVHlwZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKHJlc3VsdC5nZXRDaGFuZ2VJZCgpKS5jYWxsKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9ncm91cC9Hcm91cHNSZXN0QXBpU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL2dyb3VwL0dyb3Vwc1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYzc0NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9ncm91cC9Hcm91cHNSZXN0QXBpU2VydmxldC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBHcm91cHNSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQEluamVjdAorICBHcm91cHNSZXN0QXBpU2VydmxldChSZXN0QXBpU2VydmxldC5HbG9iYWxzIGdsb2JhbHMsCisgICAgICBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHMpIHsKKyAgICBzdXBlcihnbG9iYWxzLCBncm91cHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvQWRkUmV2aWV3ZXJIYW5kbGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvQWRkUmV2aWV3ZXJIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZDZlNjAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL0FkZFJldmlld2VySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wYXRjaDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VyUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWwuQ2hhbmdlRGV0YWlsRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5BZGRSZXZpZXdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotY2xhc3MgQWRkUmV2aWV3ZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlcjxSZXZpZXdlclJlc3VsdD4gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgQWRkUmV2aWV3ZXJIYW5kbGVyIGNyZWF0ZShDaGFuZ2UuSWQgY2hhbmdlSWQsIENvbGxlY3Rpb248U3RyaW5nPiByZXZpZXdlcnMsCi0gICAgICAgIGJvb2xlYW4gY29uZmlybWVkKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQWRkUmV2aWV3ZXIuRmFjdG9yeSBhZGRSZXZpZXdlckZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3Rvcnk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQ7Ci0gIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHJldmlld2VyczsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbmZpcm1lZDsKLQotICBASW5qZWN0Ci0gIEFkZFJldmlld2VySGFuZGxlcihmaW5hbCBBZGRSZXZpZXdlci5GYWN0b3J5IGFkZFJldmlld2VyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZCwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcmV2aWV3ZXJzLAotICAgICAgQEFzc2lzdGVkIGZpbmFsIGJvb2xlYW4gY29uZmlybWVkKSB7Ci0KLSAgICB0aGlzLmFkZFJldmlld2VyRmFjdG9yeSA9IGFkZFJldmlld2VyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZURldGFpbEZhY3RvcnkgPSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gICAgdGhpcy5jaGFuZ2VJZCA9IGNoYW5nZUlkOwotICAgIHRoaXMucmV2aWV3ZXJzID0gcmV2aWV3ZXJzOwotICAgIHRoaXMuY29uZmlybWVkID0gY29uZmlybWVkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBSZXZpZXdlclJlc3VsdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgUmV2aWV3ZXJSZXN1bHQgcmVzdWx0ID0gYWRkUmV2aWV3ZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2VJZCwgcmV2aWV3ZXJzLCBjb25maXJtZWQpLmNhbGwoKTsKLSAgICByZXN1bHQuc2V0Q2hhbmdlKGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKGNoYW5nZUlkKS5jYWxsKCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaERldGFpbFNlcnZpY2VJbXBsLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hEZXRhaWxTZXJ2aWNlSW1wbC5qYXZhCmluZGV4IDQwYzliODQuLjMxNzQ3NTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaERldGFpbFNlcnZpY2VJbXBsLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1BhdGNoRGV0YWlsU2VydmljZUltcGwuamF2YQpAQCAtMTQsMzggKzE0LDI0IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnBhdGNoOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxTdW1tYXJ5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsU3VtbWFyeVNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNoYW5nZURldGFpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QYXRjaERldGFpbFNlcnZpY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGF0Y2hTY3JpcHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3UmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VyUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoRW50aXR5RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5CYXNlU2VydmljZUltcGxlbWVudGF0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5jaGFuZ2VkZXRhaWwuQ2hhbmdlRGV0YWlsRmFjdG9yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudERpZmZQcmVmZXJlbmNlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UGF0Y2hSZXZpZXc7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoLktleTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRJbmZvQ2FjaGVGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuRGVsZXRlRHJhZnRQYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QdWJsaXNoQ29tbWVudHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93LkZ1bmN0aW9uU3RhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLmNvbW1vbi5Wb2lkUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CkBAIC01NiwyMiArNDIsMTAgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIAogY2xhc3MgUGF0Y2hEZXRhaWxTZXJ2aWNlSW1wbCBleHRlbmRzIEJhc2VTZXJ2aWNlSW1wbGVtZW50YXRpb24gaW1wbGVtZW50cwogICAgIFBhdGNoRGV0YWlsU2VydmljZSB7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOwotCi0gIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkuRmFjdG9yeSBhY2NvdW50SW5mb0NhY2hlRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBBZGRSZXZpZXdlckhhbmRsZXIuRmFjdG9yeSBhZGRSZXZpZXdlckhhbmRsZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBEZWxldGVEcmFmdFBhdGNoU2V0LkZhY3RvcnkgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUmVtb3ZlUmV2aWV3ZXJIYW5kbGVyLkZhY3RvcnkgcmVtb3ZlUmV2aWV3ZXJIYW5kbGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZUZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUHVibGlzaENvbW1lbnRzLkZhY3RvcnkgcHVibGlzaENvbW1lbnRzRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNjcmlwdEZhY3RvcnkuRmFjdG9yeSBwYXRjaFNjcmlwdEZhY3RvcnlGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFNhdmVEcmFmdC5GYWN0b3J5IHNhdmVEcmFmdEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3Rvcnk7CkBAIC03OSwyOCArNTMsMTQgQEAKICAgQEluamVjdAogICBQYXRjaERldGFpbFNlcnZpY2VJbXBsKGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBzY2hlbWEsCiAgICAgICBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBBY2NvdW50SW5mb0NhY2hlRmFjdG9yeS5GYWN0b3J5IGFjY291bnRJbmZvQ2FjaGVGYWN0b3J5LAotICAgICAgZmluYWwgQWRkUmV2aWV3ZXJIYW5kbGVyLkZhY3RvcnkgYWRkUmV2aWV3ZXJIYW5kbGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIFJlbW92ZVJldmlld2VySGFuZGxlci5GYWN0b3J5IHJlbW92ZVJldmlld2VySGFuZGxlckZhY3RvcnksCi0gICAgICBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCiAgICAgICBmaW5hbCBEZWxldGVEcmFmdFBhdGNoU2V0LkZhY3RvcnkgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3RvcnksCi0gICAgICBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZUZhY3RvcnksCiAgICAgICBmaW5hbCBQYXRjaFNjcmlwdEZhY3RvcnkuRmFjdG9yeSBwYXRjaFNjcmlwdEZhY3RvcnlGYWN0b3J5LAotICAgICAgZmluYWwgUHVibGlzaENvbW1lbnRzLkZhY3RvcnkgcHVibGlzaENvbW1lbnRzRmFjdG9yeSwKICAgICAgIGZpbmFsIFNhdmVEcmFmdC5GYWN0b3J5IHNhdmVEcmFmdEZhY3RvcnksCiAgICAgICBmaW5hbCBDaGFuZ2VEZXRhaWxGYWN0b3J5LkZhY3RvcnkgY2hhbmdlRGV0YWlsRmFjdG9yeSkgewogICAgIHN1cGVyKHNjaGVtYSwgY3VycmVudFVzZXIpOwotICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsVHlwZXM7CiAKLSAgICB0aGlzLmFjY291bnRJbmZvQ2FjaGVGYWN0b3J5ID0gYWNjb3VudEluZm9DYWNoZUZhY3Rvcnk7Ci0gICAgdGhpcy5hZGRSZXZpZXdlckhhbmRsZXJGYWN0b3J5ID0gYWRkUmV2aWV3ZXJIYW5kbGVyRmFjdG9yeTsKLSAgICB0aGlzLnJlbW92ZVJldmlld2VySGFuZGxlckZhY3RvcnkgPSByZW1vdmVSZXZpZXdlckhhbmRsZXJGYWN0b3J5OwotICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLmRlbGV0ZURyYWZ0UGF0Y2hTZXRGYWN0b3J5ID0gZGVsZXRlRHJhZnRQYXRjaFNldEZhY3Rvcnk7Ci0gICAgdGhpcy5mdW5jdGlvblN0YXRlRmFjdG9yeSA9IGZ1bmN0aW9uU3RhdGVGYWN0b3J5OwogICAgIHRoaXMucGF0Y2hTY3JpcHRGYWN0b3J5RmFjdG9yeSA9IHBhdGNoU2NyaXB0RmFjdG9yeUZhY3Rvcnk7Ci0gICAgdGhpcy5wdWJsaXNoQ29tbWVudHNGYWN0b3J5ID0gcHVibGlzaENvbW1lbnRzRmFjdG9yeTsKICAgICB0aGlzLnNhdmVEcmFmdEZhY3RvcnkgPSBzYXZlRHJhZnRGYWN0b3J5OwogICAgIHRoaXMuY2hhbmdlRGV0YWlsRmFjdG9yeSA9IGNoYW5nZURldGFpbEZhY3Rvcnk7CiAgIH0KQEAgLTE2NSw2ICsxMjUsOCBAQAogICAgICAgICAgIHJldHVybiBjaGFuZ2VEZXRhaWxGYWN0b3J5LmNyZWF0ZShyZXN1bHQuZ2V0Q2hhbmdlSWQoKSkuY2FsbCgpOwogICAgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgewogICAgICAgICAgIHRocm93IG5ldyBGYWlsdXJlKG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24ocmVzdWx0LmdldENoYW5nZUlkKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUoZSk7CiAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVudGl0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgdGhyb3cgbmV3IEZhaWx1cmUoZSk7CiAgICAgICAgIH0gY2F0Y2ggKFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CkBAIC0xNzcsMTU0ICsxMzksNCBAQAogICAgICAgfQogICAgIH0pOwogICB9Ci0KLSAgcHVibGljIHZvaWQgcHVibGlzaENvbW1lbnRzKGZpbmFsIFBhdGNoU2V0LklkIHBzaWQsIGZpbmFsIFN0cmluZyBtc2csCi0gICAgICBmaW5hbCBTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiB0YWdzLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYikgewotICAgIEhhbmRsZXIud3JhcChwdWJsaXNoQ29tbWVudHNGYWN0b3J5LmNyZWF0ZShwc2lkLCBtc2csIHRhZ3MsIGZhbHNlKSkudG8oY2IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFVwZGF0ZSB0aGUgcmV2aWV3ZWQgc3RhdHVzIGZvciB0aGUgZmlsZSBieSB1c2VyIEBjb2Rle2FjY291bnR9Ci0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXZpZXdlZEJ5Q3VycmVudFVzZXIoZmluYWwgS2V5IHBhdGNoS2V5LAotICAgICAgZmluYWwgYm9vbGVhbiByZXZpZXdlZCwgQXN5bmNDYWxsYmFjazxWb2lkUmVzdWx0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxWb2lkUmVzdWx0PigpIHsKLSAgICAgIHB1YmxpYyBWb2lkUmVzdWx0IHJ1bihSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgICAgIEFjY291bnQuSWQgYWNjb3VudCA9IGdldEFjY291bnRJZCgpOwotICAgICAgICBBY2NvdW50UGF0Y2hSZXZpZXcuS2V5IGtleSA9Ci0gICAgICAgICAgICBuZXcgQWNjb3VudFBhdGNoUmV2aWV3LktleShwYXRjaEtleSwgYWNjb3VudCk7Ci0gICAgICAgIGRiLmFjY291bnRzKCkuYmVnaW5UcmFuc2FjdGlvbihhY2NvdW50KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBBY2NvdW50UGF0Y2hSZXZpZXcgYXByID0gZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmdldChrZXkpOwotICAgICAgICAgIGlmIChhcHIgPT0gbnVsbCAmJiByZXZpZXdlZCkgewotICAgICAgICAgICAgZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmluc2VydCgKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IEFjY291bnRQYXRjaFJldmlldyhwYXRjaEtleSwgYWNjb3VudCkpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGFwciAhPSBudWxsICYmICFyZXZpZXdlZCkgewotICAgICAgICAgICAgZGIuYWNjb3VudFBhdGNoUmV2aWV3cygpLmRlbGV0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oYXByKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRiLmNvbW1pdCgpOwotICAgICAgICAgIHJldHVybiBWb2lkUmVzdWx0LklOU1RBTkNFOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGRiLnJvbGxiYWNrKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGFkZFJldmlld2VycyhmaW5hbCBDaGFuZ2UuSWQgaWQsIGZpbmFsIExpc3Q8U3RyaW5nPiByZXZpZXdlcnMsCi0gICAgICBmaW5hbCBib29sZWFuIGNvbmZpcm1lZCwgZmluYWwgQXN5bmNDYWxsYmFjazxSZXZpZXdlclJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICBhZGRSZXZpZXdlckhhbmRsZXJGYWN0b3J5LmNyZWF0ZShpZCwgcmV2aWV3ZXJzLCBjb25maXJtZWQpLnRvKGNhbGxiYWNrKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZVJldmlld2VyKGZpbmFsIENoYW5nZS5JZCBpZCwgZmluYWwgQWNjb3VudC5JZCByZXZpZXdlcklkLAotICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxSZXZpZXdlclJlc3VsdD4gY2FsbGJhY2spIHsKLSAgICByZW1vdmVSZXZpZXdlckhhbmRsZXJGYWN0b3J5LmNyZWF0ZShpZCwgcmV2aWV3ZXJJZCkudG8oY2FsbGJhY2spOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXNlckFwcHJvdmFscyhmaW5hbCBTZXQ8Q2hhbmdlLklkPiBjaWRzLCBmaW5hbCBBY2NvdW50LklkIGFpZCwKLSAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8QXBwcm92YWxTdW1tYXJ5U2V0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxBcHByb3ZhbFN1bW1hcnlTZXQ+KCkgewotICAgICAgcHVibGljIEFwcHJvdmFsU3VtbWFyeVNldCBydW4oUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+IGFwcHJvdmFscyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4oKTsKLSAgICAgICAgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljRmFjdG9yeSA9Ci0gICAgICAgICAgICBhY2NvdW50SW5mb0NhY2hlRmFjdG9yeS5jcmVhdGUoKTsKLQotICAgICAgICBhaWNGYWN0b3J5LndhbnQoYWlkKTsKLSAgICAgICAgZm9yIChmaW5hbCBDaGFuZ2UuSWQgaWQgOiBjaWRzKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY2MgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihpZCk7Ci0gICAgICAgICAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlID0gY2MuZ2V0Q2hhbmdlKCk7Ci0gICAgICAgICAgICBmaW5hbCBQYXRjaFNldC5JZCBwc19pZCA9IGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpOwotICAgICAgICAgICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+IHBzYXMgPQotICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+KCk7Ci0gICAgICAgICAgICBmaW5hbCBGdW5jdGlvblN0YXRlIGZzID0KLSAgICAgICAgICAgICAgICBmdW5jdGlvblN0YXRlRmFjdG9yeS5jcmVhdGUoY2MsIHBzX2lkLCBwc2FzLnZhbHVlcygpKTsKLQotICAgICAgICAgICAgZm9yIChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGNhIDogZGIucGF0Y2hTZXRBcHByb3ZhbHMoKQotICAgICAgICAgICAgICAgIC5ieVBhdGNoU2V0VXNlcihwc19pZCwgYWlkKSkgewotICAgICAgICAgICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIGNhdGVnb3J5ID0gY2EuZ2V0Q2F0ZWdvcnlJZCgpOwotICAgICAgICAgICAgICBpZiAoQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQuZXF1YWxzKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICBmcy5ub3JtYWxpemUoYXBwcm92YWxUeXBlcy5ieUlkKGNhdGVnb3J5KSwgY2EpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChjYS5nZXRWYWx1ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBwc2FzLnB1dChjYXRlZ29yeSwgY2EpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhcHByb3ZhbHMucHV0KGlkLCBuZXcgQXBwcm92YWxTdW1tYXJ5KHBzYXMudmFsdWVzKCkpKTsKLSAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gbnNjZSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSB1c2VyIGhhcyBubyBhY2Nlc3MgdG8gc2VlIHRoaXMgY2hhbmdlLCBzbyB3ZSBzaW1wbHkgZG8gbm90Ci0gICAgICAgICAgICAgKiBwcm92aWRlIGFueSBkZXRhaWxzIGFib3V0IGl0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQXBwcm92YWxTdW1tYXJ5U2V0KGFpY0ZhY3RvcnkuY3JlYXRlKCksIGFwcHJvdmFscyk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdHJvbmdlc3RBcHByb3ZhbHMoZmluYWwgU2V0PENoYW5nZS5JZD4gY2lkcywKLSAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8QXBwcm92YWxTdW1tYXJ5U2V0PiBjYWxsYmFjaykgewotICAgIHJ1bihjYWxsYmFjaywgbmV3IEFjdGlvbjxBcHByb3ZhbFN1bW1hcnlTZXQ+KCkgewotICAgICAgcHVibGljIEFwcHJvdmFsU3VtbWFyeVNldCBydW4oUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNYXA8Q2hhbmdlLklkLCBBcHByb3ZhbFN1bW1hcnk+IGFwcHJvdmFscyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIEFwcHJvdmFsU3VtbWFyeT4oKTsKLSAgICAgICAgZmluYWwgQWNjb3VudEluZm9DYWNoZUZhY3RvcnkgYWljRmFjdG9yeSA9Ci0gICAgICAgICAgICBhY2NvdW50SW5mb0NhY2hlRmFjdG9yeS5jcmVhdGUoKTsKLQotICAgICAgICBmb3IgKGZpbmFsIENoYW5nZS5JZCBpZCA6IGNpZHMpIHsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbCBjYyA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGlkKTsKLSAgICAgICAgICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UgPSBjYy5nZXRDaGFuZ2UoKTsKLSAgICAgICAgICAgIGZpbmFsIFBhdGNoU2V0LklkIHBzX2lkID0gY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCk7Ci0gICAgICAgICAgICBmaW5hbCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gcHNhcyA9Ci0gICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICAgICAgICAgIGZpbmFsIEZ1bmN0aW9uU3RhdGUgZnMgPQotICAgICAgICAgICAgICAgIGZ1bmN0aW9uU3RhdGVGYWN0b3J5LmNyZWF0ZShjYywgcHNfaWQsIHBzYXMudmFsdWVzKCkpOwotCi0gICAgICAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgY2EgOiBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQocHNfaWQpKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0ZWdvcnkgPSBjYS5nZXRDYXRlZ29yeUlkKCk7Ci0gICAgICAgICAgICAgIGlmIChBcHByb3ZhbENhdGVnb3J5LlNVQk1JVC5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSkgewotICAgICAgICAgICAgICAgIGZzLm5vcm1hbGl6ZShhcHByb3ZhbFR5cGVzLmJ5SWQoY2F0ZWdvcnkpLCBjYSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKGNhLmdldFZhbHVlKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJvb2xlYW4ga2VlcCA9IHRydWU7Ci0gICAgICAgICAgICAgIGlmIChwc2FzLmNvbnRhaW5zS2V5KGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIGZpbmFsIHNob3J0IG9sZFZhbHVlID0gcHNhcy5nZXQoY2F0ZWdvcnkpLmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgc2hvcnQgbmV3VmFsdWUgPSBjYS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGtlZXAgPQotICAgICAgICAgICAgICAgICAgICAoTWF0aC5hYnMob2xkVmFsdWUpIDwgTWF0aC5hYnMobmV3VmFsdWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChNYXRoLmFicyhvbGRWYWx1ZSkgPT0gTWF0aC5hYnMobmV3VmFsdWUpICYmIChuZXdWYWx1ZSA8IG9sZFZhbHVlKSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChrZWVwKSB7Ci0gICAgICAgICAgICAgICAgYWljRmFjdG9yeS53YW50KGNhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICAgICAgICBwc2FzLnB1dChjYXRlZ29yeSwgY2EpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFwcHJvdmFscy5wdXQoaWQsIG5ldyBBcHByb3ZhbFN1bW1hcnkocHNhcy52YWx1ZXMoKSkpOwotICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBuc2NlKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIHVzZXIgaGFzIG5vIGFjY2VzcyB0byBzZWUgdGhpcyBjaGFuZ2UsIHNvIHdlIHNpbXBseSBkbyBub3QKLSAgICAgICAgICAgICAqIHByb3ZpZGUgYW55IGRldGFpbHMgYWJvdXQgaXQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbmV3IEFwcHJvdmFsU3VtbWFyeVNldChhaWNGYWN0b3J5LmNyZWF0ZSgpLCBhcHByb3ZhbHMpOwotICAgICAgfQotICAgIH0pOwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hNb2R1bGUuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaE1vZHVsZS5qYXZhCmluZGV4IDNlOTRiNGMuLmQxZjViMjQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaE1vZHVsZS5qYXZhCkBAIC0yOCw4ICsyOCw2IEBACiAgICAgaW5zdGFsbChuZXcgRmFjdG9yeU1vZHVsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICBmYWN0b3J5KEFkZFJldmlld2VySGFuZGxlci5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgZmFjdG9yeShSZW1vdmVSZXZpZXdlckhhbmRsZXIuRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoUGF0Y2hTY3JpcHRGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KFNhdmVEcmFmdC5GYWN0b3J5LmNsYXNzKTsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaFNjcmlwdEJ1aWxkZXIuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaFNjcmlwdEJ1aWxkZXIuamF2YQppbmRleCA4MTZiYmVmLi45YTRiODlmIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hTY3JpcHRCdWlsZGVyLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1BhdGNoU2NyaXB0QnVpbGRlci5qYXZhCkBAIC0xMzMsNiArMTMzLDcgQEAKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgYm9vbGVhbiBpbnRyYWxpbmVEaWZmZXJlbmNlSXNQb3NzaWJsZSA9IHRydWU7CiAgICAgYm9vbGVhbiBpbnRyYWxpbmVGYWlsdXJlID0gZmFsc2U7CisgICAgYm9vbGVhbiBpbnRyYWxpbmVUaW1lb3V0ID0gZmFsc2U7CiAKICAgICBhLnBhdGggPSBvbGROYW1lKGNvbnRlbnQpOwogICAgIGIucGF0aCA9IG5ld05hbWUoY29udGVudCk7CkBAIC0xNjAsMTAgKzE2MSwxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICBjYXNlIEVSUk9SOgotICAgICAgICAgIGNhc2UgVElNRU9VVDoKICAgICAgICAgICAgIGludHJhbGluZURpZmZlcmVuY2VJc1Bvc3NpYmxlID0gZmFsc2U7CiAgICAgICAgICAgICBpbnRyYWxpbmVGYWlsdXJlID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBUSU1FT1VUOgorICAgICAgICAgICAgaW50cmFsaW5lRGlmZmVyZW5jZUlzUG9zc2libGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGludHJhbGluZVRpbWVvdXQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGludHJhbGluZURpZmZlcmVuY2VJc1Bvc3NpYmxlID0gZmFsc2U7CkBAIC0xOTgsMTAgKzIwMywxMCBAQAogICAgICAgICBjb250ZXh0ID0gZGlmZlByZWZzLmdldENvbnRleHQoKTsKICAgICAgICAgaHVnZUZpbGUgPSB0cnVlOwogCi0gICAgICB9IGVsc2UgaWYgKGRpZmZQcmVmcy5pc1N5bnRheEhpZ2hsaWdodGluZygpKSB7Ci0gICAgICAgIC8vIEluIG9yZGVyIHRvIHN5bnRheCBoaWdobGlnaHQgdGhlIGZpbGUgcHJvcGVybHkgd2UgbmVlZCB0bwotICAgICAgICAvLyBnaXZlIHRoZSBjbGllbnQgdGhlIGNvbXBsZXRlIGZpbGUgY29udGVudHMuIFNvIGZvcmNlIG91cgotICAgICAgICAvLyBjb250ZXh0IHRlbXBvcmFyaWx5IHRvIHRoZSBjb21wbGV0ZSBmaWxlIHNpemUuCisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJbiBvcmRlciB0byBleHBhbmQgdGhlIHNraXBwZWQgY29tbW9uIGxpbmVzIG9yIHN5bnRheCBoaWdobGlnaHQgdGhlCisgICAgICAgIC8vIGZpbGUgcHJvcGVybHkgd2UgbmVlZCB0byBnaXZlIHRoZSBjbGllbnQgdGhlIGNvbXBsZXRlIGZpbGUgY29udGVudHMuCisgICAgICAgIC8vIFNvIGZvcmNlIG91ciBjb250ZXh0IHRlbXBvcmFyaWx5IHRvIHRoZSBjb21wbGV0ZSBmaWxlIHNpemUuCiAgICAgICAgIC8vCiAgICAgICAgIGNvbnRleHQgPSBNQVhfQ09OVEVYVDsKICAgICAgIH0KQEAgLTIxMiw3ICsyMTcsNyBAQAogICAgICAgICBjb250ZW50LmdldE9sZE5hbWUoKSwgY29udGVudC5nZXROZXdOYW1lKCksIGEuZmlsZU1vZGUsIGIuZmlsZU1vZGUsCiAgICAgICAgIGNvbnRlbnQuZ2V0SGVhZGVyTGluZXMoKSwgZGlmZlByZWZzLCBhLmRzdCwgYi5kc3QsIGVkaXRzLAogICAgICAgICBhLmRpc3BsYXlNZXRob2QsIGIuZGlzcGxheU1ldGhvZCwgY29tbWVudHMsIGhpc3RvcnksIGh1Z2VGaWxlLAotICAgICAgICBpbnRyYWxpbmVEaWZmZXJlbmNlSXNQb3NzaWJsZSwgaW50cmFsaW5lRmFpbHVyZSk7CisgICAgICAgIGludHJhbGluZURpZmZlcmVuY2VJc1Bvc3NpYmxlLCBpbnRyYWxpbmVGYWlsdXJlLCBpbnRyYWxpbmVUaW1lb3V0KTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNb2RpZnkoUGF0Y2hMaXN0RW50cnkgY29udGVudCkgewpAQCAtMzQxLDcgKzM0Niw3IEBACiAgICAgfQogCiAgICAgZmluYWwgRWRpdCBsYXN0ID0gZWRpdHMuZ2V0KGVkaXRzLnNpemUoKSAtIDEpOwotICAgIHJldHVybiBsYXN0LmdldEJlZ2luQigpICsgKGEgLSBsYXN0LmdldEVuZEEoKSk7CisgICAgcmV0dXJuIGxhc3QuZ2V0RW5kQigpICsgKGEgLSBsYXN0LmdldEVuZEEoKSk7CiAgIH0KIAogICBwcml2YXRlIGludCBtYXBCMkEoZmluYWwgaW50IGIpIHsKQEAgLTM2Nyw3ICszNzIsNyBAQAogICAgIH0KIAogICAgIGZpbmFsIEVkaXQgbGFzdCA9IGVkaXRzLmdldChlZGl0cy5zaXplKCkgLSAxKTsKLSAgICByZXR1cm4gbGFzdC5nZXRCZWdpbkEoKSArIChiIC0gbGFzdC5nZXRFbmRCKCkpOworICAgIHJldHVybiBsYXN0LmdldEVuZEEoKSArIChiIC0gbGFzdC5nZXRFbmRCKCkpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHBhY2tDb250ZW50KGJvb2xlYW4gaWdub3JlZFdoaXRlc3BhY2UpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaFNjcmlwdEZhY3RvcnkuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9QYXRjaFNjcmlwdEZhY3RvcnkuamF2YQppbmRleCA5N2Q4NTBhLi43OTcyMjljIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvUGF0Y2hTY3JpcHRGYWN0b3J5LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1BhdGNoU2NyaXB0RmFjdG9yeS5qYXZhCkBAIC0xMzgsNiArMTM4LDExIEBACiAgICAgYUlkID0gcHNhICE9IG51bGwgPyB0b09iamVjdElkKGRiLCBwc2EpIDogbnVsbDsKICAgICBiSWQgPSB0b09iamVjdElkKGRiLCBwc2IpOwogCisgICAgaWYgKChwc2EgIT0gbnVsbCAmJiAhY29udHJvbC5pc1BhdGNoVmlzaWJsZShkYi5wYXRjaFNldHMoKS5nZXQocHNhKSwgZGIpKSB8fAorICAgICAgICAocHNiICE9IG51bGwgJiYgIWNvbnRyb2wuaXNQYXRjaFZpc2libGUoZGIucGF0Y2hTZXRzKCkuZ2V0KHBzYiksIGRiKSkpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOworICAgIH0KKwogICAgIGZpbmFsIFJlcG9zaXRvcnkgZ2l0OwogICAgIHRyeSB7CiAgICAgICBnaXQgPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShwcm9qZWN0S2V5KTsKQEAgLTIzMiw2ICsyMzcsOSBAQAogICAgIC8vIHByb3BlciByZW5hbWUgZGV0ZWN0aW9uIGJldHdlZW4gdGhlIHBhdGNoIHNldHMuCiAgICAgLy8KICAgICBmb3IgKGZpbmFsIFBhdGNoU2V0IHBzIDogZGIucGF0Y2hTZXRzKCkuYnlDaGFuZ2UoY2hhbmdlSWQpKSB7CisgICAgICBpZiAoIWNvbnRyb2wuaXNQYXRjaFZpc2libGUocHMsIGRiKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KICAgICAgIFN0cmluZyBuYW1lID0gcGF0Y2hLZXkuZ2V0KCk7CiAgICAgICBpZiAocHNhICE9IG51bGwpIHsKICAgICAgICAgc3dpdGNoIChjaGFuZ2VUeXBlKSB7CkBAIC0yNDEsNiArMjQ5LDEyIEBACiAgICAgICAgICAgICAgIG5hbWUgPSBvbGROYW1lOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIE1PRElGSUVEOgorICAgICAgICAgIGNhc2UgREVMRVRFRDoKKyAgICAgICAgICBjYXNlIEFEREVEOgorICAgICAgICAgIGNhc2UgUkVXUklURToKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTI2Niw2ICsyODAsOSBAQAogICAgICAgICB9CiAgICAgICAgIGxvYWRQdWJsaXNoZWQoYnlLZXksIGFpYywgbmV3TmFtZSk7CiAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFJFV1JJVEU6CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIGZpbmFsIEN1cnJlbnRVc2VyIHVzZXIgPSBjb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CkBAIC0yODgsNiArMzA1LDkgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgbG9hZERyYWZ0cyhieUtleSwgYWljLCBtZSwgbmV3TmFtZSk7CiAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBSRVdSSVRFOgorICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1JlbW92ZVJldmlld2VySGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1JlbW92ZVJldmlld2VySGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjMxYzFjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wYXRjaC9SZW1vdmVSZXZpZXdlckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucGF0Y2g7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZXZpZXdlclJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuY2hhbmdlZGV0YWlsLkNoYW5nZURldGFpbEZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUmVtb3ZlUmV2aWV3ZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi0vKioKLSAqIEltcGxlbWVudCB0aGUgcmVtb3RlIGxvZ2ljIHRoYXQgcmVtb3ZlcyBhIHJldmlld2VyIGZyb20gYSBjaGFuZ2UuCi0gKi8KLWNsYXNzIFJlbW92ZVJldmlld2VySGFuZGxlciBleHRlbmRzIEhhbmRsZXI8UmV2aWV3ZXJSZXN1bHQ+IHsKLSAgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIFJlbW92ZVJldmlld2VySGFuZGxlciBjcmVhdGUoQ2hhbmdlLklkIGNoYW5nZUlkLCBBY2NvdW50LklkIHJldmlld2VySWQpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBSZW1vdmVSZXZpZXdlci5GYWN0b3J5IHJlbW92ZVJldmlld2VyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50LklkIHJldmlld2VySWQ7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkOwotICBwcml2YXRlIGZpbmFsIENoYW5nZURldGFpbEZhY3RvcnkuRmFjdG9yeSBjaGFuZ2VEZXRhaWxGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgUmVtb3ZlUmV2aWV3ZXJIYW5kbGVyKGZpbmFsIFJlbW92ZVJldmlld2VyLkZhY3RvcnkgcmVtb3ZlUmV2aWV3ZXJGYWN0b3J5LAotICAgICAgZmluYWwgQ2hhbmdlRGV0YWlsRmFjdG9yeS5GYWN0b3J5IGNoYW5nZURldGFpbEZhY3RvcnksCi0gICAgICBAQXNzaXN0ZWQgQ2hhbmdlLklkIGNoYW5nZUlkLCBAQXNzaXN0ZWQgQWNjb3VudC5JZCByZXZpZXdlcklkKSB7Ci0gICAgdGhpcy5yZW1vdmVSZXZpZXdlckZhY3RvcnkgPSByZW1vdmVSZXZpZXdlckZhY3Rvcnk7Ci0gICAgdGhpcy5jaGFuZ2VJZCA9IGNoYW5nZUlkOwotICAgIHRoaXMucmV2aWV3ZXJJZCA9IHJldmlld2VySWQ7Ci0gICAgdGhpcy5jaGFuZ2VEZXRhaWxGYWN0b3J5ID0gY2hhbmdlRGV0YWlsRmFjdG9yeTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgUmV2aWV3ZXJSZXN1bHQgY2FsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFJldmlld2VyUmVzdWx0IHJlc3VsdCA9IHJlbW92ZVJldmlld2VyRmFjdG9yeS5jcmVhdGUoCi0gICAgICAgIGNoYW5nZUlkLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocmV2aWV3ZXJJZCkpLmNhbGwoKTsKLSAgICByZXN1bHQuc2V0Q2hhbmdlKGNoYW5nZURldGFpbEZhY3RvcnkuY3JlYXRlKGNoYW5nZUlkKS5jYWxsKCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1NhdmVEcmFmdC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1NhdmVEcmFmdC5qYXZhCmluZGV4IDA2YzIxZGYuLjE4YWI1ZmY1IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGF0Y2gvU2F2ZURyYWZ0LmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BhdGNoL1NhdmVEcmFmdC5qYXZhCkBAIC03MSw4ICs3MSw4IEBACiAKICAgICAgIGZpbmFsIEFjY291bnQuSWQgbWUgPSBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKTsKICAgICAgIGlmIChjb21tZW50LmdldEtleSgpLmdldCgpID09IG51bGwpIHsKLSAgICAgICAgaWYgKGNvbW1lbnQuZ2V0TGluZSgpIDwgMSkgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbW1lbnQgbGluZSBtdXN0IGJlID49IDEsIG5vdCAiCisgICAgICAgIGlmIChjb21tZW50LmdldExpbmUoKSA8IDApIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb21tZW50IGxpbmUgbXVzdCBiZSA+PSAwLCBub3QgIgogICAgICAgICAgICAgICArIGNvbW1lbnQuZ2V0TGluZSgpKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGx1Z2luL0xpc3RQbHVnaW5zU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3BsdWdpbi9MaXN0UGx1Z2luc1NlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4MTQ1Yy4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcGx1Z2luL0xpc3RQbHVnaW5zU2VydmxldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wbHVnaW47Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLlJlc3RBcGlTZXJ2bGV0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLkxpc3RQbHVnaW5zOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKLQotQFNpbmdsZXRvbgotQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCi1wdWJsaWMgY2xhc3MgTGlzdFBsdWdpbnNTZXJ2bGV0IGV4dGVuZHMgUmVzdEFwaVNlcnZsZXQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXJQYXJzZXIgcGFyYW1QYXJzZXI7Ci0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TGlzdFBsdWdpbnM+IGZhY3Rvcnk7Ci0KLSAgQEluamVjdAotICBMaXN0UGx1Z2luc1NlcnZsZXQoZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IGN1cnJlbnRVc2VyLAotICAgICAgUGFyYW1ldGVyUGFyc2VyIHBhcmFtUGFyc2VyLCBQcm92aWRlcjxMaXN0UGx1Z2lucz4gbHMpIHsKLSAgICBzdXBlcihjdXJyZW50VXNlcik7Ci0gICAgdGhpcy5wYXJhbVBhcnNlciA9IHBhcmFtUGFyc2VyOwotICAgIHRoaXMuZmFjdG9yeSA9IGxzOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBMaXN0UGx1Z2lucyBpbXBsID0gZmFjdG9yeS5nZXQoKTsKLSAgICBpZiAoYWNjZXB0c0pzb24ocmVxKSkgewotICAgICAgaW1wbC5zZXRGb3JtYXQoT3V0cHV0Rm9ybWF0LkpTT05fQ09NUEFDVCk7Ci0gICAgfQotICAgIGlmIChwYXJhbVBhcnNlci5wYXJzZShpbXBsLCByZXEsIHJlcykpIHsKLSAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBpZiAoaW1wbC5nZXRGb3JtYXQoKS5pc0pzb24oKSkgewotICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoSlNPTl9UWVBFKTsKLSAgICAgICAgYnVmLndyaXRlKEpTT05fTUFHSUMpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0gICAgICB9Ci0gICAgICBpbXBsLmRpc3BsYXkoYnVmKTsKLSAgICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLSAgICAgIHNlbmQocmVxLCByZXMsIGJ1Zi50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0FkZEJyYW5jaC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvQWRkQnJhbmNoLmphdmEKaW5kZXggOTdlOWJiNC4uZDI2NTAxZSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvQWRkQnJhbmNoLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvQWRkQnJhbmNoLmphdmEKQEAgLTE1LDggKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnByb2plY3Q7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGlzdEJyYW5jaGVzUmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuSW52YWxpZE5hbWVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWRkQnJhbmNoUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuSW52YWxpZFJldmlzaW9uRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CkBAIC00Niw3ICs0NSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1jbGFzcyBBZGRCcmFuY2ggZXh0ZW5kcyBIYW5kbGVyPExpc3RCcmFuY2hlc1Jlc3VsdD4geworY2xhc3MgQWRkQnJhbmNoIGV4dGVuZHMgSGFuZGxlcjxBZGRCcmFuY2hSZXN1bHQ+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFkZEJyYW5jaC5jbGFzcyk7CiAKICAgaW50ZXJmYWNlIEZhY3RvcnkgewpAQCAtOTAsOSArODksNyBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMaXN0QnJhbmNoZXNSZXN1bHQgY2FsbCgpIHRocm93cyBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uLAotICAgICAgSW52YWxpZE5hbWVFeGNlcHRpb24sIEludmFsaWRSZXZpc2lvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCi0gICAgICBCcmFuY2hDcmVhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24geworICBwdWJsaWMgQWRkQnJhbmNoUmVzdWx0IGNhbGwoKSB0aHJvd3MgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgIGZpbmFsIFByb2plY3RDb250cm9sIHByb2plY3RDb250cm9sID0KICAgICAgICAgcHJvamVjdENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IocHJvamVjdE5hbWUpOwogCkBAIC0xMDQsMTAgKzEwMSwxNCBAQAogICAgICAgcmVmbmFtZSA9IENvbnN0YW50cy5SX0hFQURTICsgcmVmbmFtZTsKICAgICB9CiAgICAgaWYgKCFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKHJlZm5hbWUpKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZE5hbWVFeGNlcHRpb24oKTsKKyAgICAgIHJldHVybiBuZXcgQWRkQnJhbmNoUmVzdWx0KG5ldyBBZGRCcmFuY2hSZXN1bHQuRXJyb3IoCisgICAgICAgICAgQWRkQnJhbmNoUmVzdWx0LkVycm9yLlR5cGUuSU5WQUxJRF9OQU1FLCByZWZuYW1lKSk7CiAgICAgfQogICAgIGlmIChNYWdpY0JyYW5jaC5pc01hZ2ljQnJhbmNoKHJlZm5hbWUpKSB7Ci0gICAgICB0aHJvdyBuZXcgQnJhbmNoQ3JlYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uKHJlZm5hbWUpOworICAgICAgcmV0dXJuIG5ldyBBZGRCcmFuY2hSZXN1bHQoCisgICAgICAgICAgbmV3IEFkZEJyYW5jaFJlc3VsdC5FcnJvcigKKyAgICAgICAgICAgICAgQWRkQnJhbmNoUmVzdWx0LkVycm9yLlR5cGUuQlJBTkNIX0NSRUFUSU9OX05PVF9BTExPV0VEX1VOREVSX1JFRk5BTUVfUFJFRklYLAorICAgICAgICAgICAgICBNYWdpY0JyYW5jaC5nZXRNYWdpY1JlZk5hbWVQcmVmaXgocmVmbmFtZSkpKTsKICAgICB9CiAKICAgICBmaW5hbCBCcmFuY2guTmFtZUtleSBuYW1lID0gbmV3IEJyYW5jaC5OYW1lS2V5KHByb2plY3ROYW1lLCByZWZuYW1lKTsKQEAgLTE0NCw5ICsxNDUsMjIgQEAKICAgICAgICAgICBjYXNlIEZBU1RfRk9SV0FSRDoKICAgICAgICAgICBjYXNlIE5FVzoKICAgICAgICAgICBjYXNlIE5PX0NIQU5HRToKLSAgICAgICAgICAgIHJlZmVyZW5jZVVwZGF0ZWQuZmlyZShuYW1lLmdldFBhcmVudEtleSgpLCByZWZuYW1lKTsKKyAgICAgICAgICAgIHJlZmVyZW5jZVVwZGF0ZWQuZmlyZShuYW1lLmdldFBhcmVudEtleSgpLCB1KTsKICAgICAgICAgICAgIGhvb2tzLmRvUmVmVXBkYXRlZEhvb2sobmFtZSwgdSwgaWRlbnRpZmllZFVzZXIuZ2V0QWNjb3VudCgpKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgTE9DS19GQUlMVVJFOgorICAgICAgICAgICAgaWYgKHJlcG8uZ2V0UmVmKHJlZm5hbWUpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRCcmFuY2hSZXN1bHQobmV3IEFkZEJyYW5jaFJlc3VsdC5FcnJvcigKKyAgICAgICAgICAgICAgICAgIEFkZEJyYW5jaFJlc3VsdC5FcnJvci5UeXBlLkJSQU5DSF9BTFJFQURZX0VYSVNUUywgcmVmbmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHJlZlByZWZpeCA9IGdldFJlZlByZWZpeChyZWZuYW1lKTsKKyAgICAgICAgICAgIHdoaWxlICghQ29uc3RhbnRzLlJfSEVBRFMuZXF1YWxzKHJlZlByZWZpeCkpIHsKKyAgICAgICAgICAgICAgaWYgKHJlcG8uZ2V0UmVmKHJlZlByZWZpeCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWRkQnJhbmNoUmVzdWx0KG5ldyBBZGRCcmFuY2hSZXN1bHQuRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIEFkZEJyYW5jaFJlc3VsdC5FcnJvci5UeXBlLkJSQU5DSF9DUkVBVElPTl9DT05GTElDVCwgcmVmUHJlZml4KSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmVmUHJlZml4ID0gZ2V0UmVmUHJlZml4KHJlZlByZWZpeCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHJlc3VsdC5uYW1lKCkpOwogICAgICAgICAgIH0KQEAgLTE1NSwxMSArMTY5LDIyIEBACiAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGNyZWF0ZSBicmFuY2ggIiArIG5hbWUsIGVycik7CiAgICAgICAgIHRocm93IGVycjsKICAgICAgIH0KKyAgICB9IGNhdGNoIChJbnZhbGlkUmV2aXNpb25FeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIG5ldyBBZGRCcmFuY2hSZXN1bHQobmV3IEFkZEJyYW5jaFJlc3VsdC5FcnJvcigKKyAgICAgICAgICBBZGRCcmFuY2hSZXN1bHQuRXJyb3IuVHlwZS5JTlZBTElEX1JFVklTSU9OKSk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIHJlcG8uY2xvc2UoKTsKICAgICB9CiAKLSAgICByZXR1cm4gbGlzdEJyYW5jaGVzRmFjdG9yeS5jcmVhdGUocHJvamVjdE5hbWUpLmNhbGwoKTsKKyAgICByZXR1cm4gbmV3IEFkZEJyYW5jaFJlc3VsdChsaXN0QnJhbmNoZXNGYWN0b3J5LmNyZWF0ZShwcm9qZWN0TmFtZSkuY2FsbCgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSZWZQcmVmaXgoZmluYWwgU3RyaW5nIHJlZk5hbWUpIHsKKyAgICBmaW5hbCBpbnQgaSA9IHJlZk5hbWUubGFzdEluZGV4T2YoJy8nKTsKKyAgICBpZiAoaSA+IENvbnN0YW50cy5SX0hFQURTLmxlbmd0aCgpIC0gMSkgeworICAgICAgcmV0dXJuIHJlZk5hbWUuc3Vic3RyaW5nKDAsIGkpOworICAgIH0KKyAgICByZXR1cm4gQ29uc3RhbnRzLlJfSEVBRFM7CiAgIH0KIAogICBwcml2YXRlIE9iamVjdElkIHBhcnNlU3RhcnRpbmdSZXZpc2lvbihmaW5hbCBSZXBvc2l0b3J5IHJlcG8pCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9CcmFuY2hDcmVhdGlvbk5vdEFsbG93ZWRFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0JyYW5jaENyZWF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGNkYzMyLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0JyYW5jaENyZWF0aW9uTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgQnJhbmNoQ3JlYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIkJyYW5jaCBjcmVhdGlvbiBpcyBub3QgYWxsb3dlZCB1bmRlcjogIjsKLQotICBwdWJsaWMgQnJhbmNoQ3JlYXRpb25Ob3RBbGxvd2VkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyByZWZuYW1lUHJlZml4KSB7Ci0gICAgc3VwZXIoTUVTU0FHRSArIHJlZm5hbWVQcmVmaXgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9DcmVhdGVQcm9qZWN0SGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvQ3JlYXRlUHJvamVjdEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQxZjMzMi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9DcmVhdGVQcm9qZWN0SGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnByb2plY3Q7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLlByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMuSGFuZGxlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNyZWF0ZVByb2plY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ3JlYXRlUHJvamVjdEFyZ3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUHJvamVjdEhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyPFZvaWRSZXN1bHQ+IHsKLQotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgQ3JlYXRlUHJvamVjdEhhbmRsZXIgY3JlYXRlKEBBc3Npc3RlZCgicHJvamVjdE5hbWUiKSBTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICAgIEBBc3Npc3RlZCgicGFyZW50TmFtZSIpIFN0cmluZyBwYXJlbnROYW1lLAotICAgICAgICBAQXNzaXN0ZWQoImVtcHR5Q29tbWl0IikgYm9vbGVhbiBlbXB0eUNvbW1pdCwKLSAgICAgICAgQEFzc2lzdGVkKCJwZXJtaXNzaW9uc09ubHkiKSBib29sZWFuIHBlcm1pc3Npb25zT25seSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIENyZWF0ZVByb2plY3QuRmFjdG9yeSBjcmVhdGVQcm9qZWN0RmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbC5GYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWU7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmVudE5hbWU7Ci0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBlbXB0eUNvbW1pdDsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHBlcm1pc3Npb25zT25seTsKLQotICBASW5qZWN0Ci0gIHB1YmxpYyBDcmVhdGVQcm9qZWN0SGFuZGxlcihmaW5hbCBDcmVhdGVQcm9qZWN0LkZhY3RvcnkgY3JlYXRlUHJvamVjdEZhY3RvcnksCi0gICAgICBmaW5hbCBQcm9qZWN0Q29udHJvbC5GYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCgicHJvamVjdE5hbWUiKSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWUsCi0gICAgICBAQXNzaXN0ZWQoInBhcmVudE5hbWUiKSBmaW5hbCBTdHJpbmcgcGFyZW50TmFtZSwKLSAgICAgIEBBc3Npc3RlZCgiZW1wdHlDb21taXQiKSBmaW5hbCBib29sZWFuIGVtcHR5Q29tbWl0LAotICAgICAgQEFzc2lzdGVkKCJwZXJtaXNzaW9uc09ubHkiKSBmaW5hbCBib29sZWFuIHBlcm1pc3Npb25zT25seSkgewotICAgIHRoaXMuY3JlYXRlUHJvamVjdEZhY3RvcnkgPSBjcmVhdGVQcm9qZWN0RmFjdG9yeTsKLSAgICB0aGlzLnByb2plY3RDb250cm9sRmFjdG9yeSA9IHByb2plY3RDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0gICAgdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLSAgICB0aGlzLmVtcHR5Q29tbWl0ID0gZW1wdHlDb21taXQ7Ci0gICAgdGhpcy5wZXJtaXNzaW9uc09ubHkgPSBwZXJtaXNzaW9uc09ubHk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFZvaWRSZXN1bHQgY2FsbCgpIHRocm93cyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24gewotICAgIGZpbmFsIENyZWF0ZVByb2plY3RBcmdzIGFyZ3MgPSBuZXcgQ3JlYXRlUHJvamVjdEFyZ3MoKTsKLSAgICBhcmdzLnNldFByb2plY3ROYW1lKHByb2plY3ROYW1lKTsKLSAgICBpZiAoIXBhcmVudE5hbWUuZXF1YWxzKCIiKSkgewotICAgICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IG5hbWVLZXkgPSBuZXcgUHJvamVjdC5OYW1lS2V5KHBhcmVudE5hbWUpOwotICAgICAgdHJ5IHsKLSAgICAgICAgYXJncy5uZXdQYXJlbnQgPSBwcm9qZWN0Q29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IobmFtZUtleSk7Ci0gICAgICB9IGNhdGNoIChOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbigiUGFyZW50IHByb2plY3QgXCIiCi0gICAgICAgICAgICArIHBhcmVudE5hbWUgKyAiXCIgZG9lcyBub3QgZXhpc3QuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGFyZ3MucHJvamVjdERlc2NyaXB0aW9uID0gIiI7Ci0gICAgYXJncy5zdWJtaXRUeXBlID0gU3VibWl0VHlwZS5NRVJHRV9JRl9ORUNFU1NBUlk7Ci0gICAgYXJncy5icmFuY2ggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICBhcmdzLmNyZWF0ZUVtcHR5Q29tbWl0ID0gZW1wdHlDb21taXQ7Ci0gICAgYXJncy5wZXJtaXNzaW9uc09ubHkgPSBwZXJtaXNzaW9uc09ubHk7Ci0KLSAgICBmaW5hbCBDcmVhdGVQcm9qZWN0IGNyZWF0ZVByb2plY3QgPSBjcmVhdGVQcm9qZWN0RmFjdG9yeS5jcmVhdGUoYXJncyk7Ci0gICAgY3JlYXRlUHJvamVjdC5jcmVhdGVQcm9qZWN0KCk7Ci0gICAgcmV0dXJuIFZvaWRSZXN1bHQuSU5TVEFOQ0U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0RlbGV0ZUJyYW5jaGVzLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9EZWxldGVCcmFuY2hlcy5qYXZhCmluZGV4IGYyYjNjYTMuLjhmNTQzMGQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0RlbGV0ZUJyYW5jaGVzLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvRGVsZXRlQnJhbmNoZXMuamF2YQpAQCAtNTAsNyArNTAsNyBAQAogCiAgIHByaXZhdGUgZmluYWwgUHJvamVjdENvbnRyb2wuRmFjdG9yeSBwcm9qZWN0Q29udHJvbEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7Ci0gIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CiAgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgaWRlbnRpZmllZFVzZXI7CiAgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CiAgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CkBAIC02MSw3ICs2MSw3IEBACiAgIEBJbmplY3QKICAgRGVsZXRlQnJhbmNoZXMoZmluYWwgUHJvamVjdENvbnRyb2wuRmFjdG9yeSBwcm9qZWN0Q29udHJvbEZhY3RvcnksCiAgICAgICBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlciwKLSAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCiAgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciBpZGVudGlmaWVkVXNlciwKICAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLAogICAgICAgZmluYWwgUmV2aWV3RGIgZGIsCkBAIC02OSw3ICs2OSw3IEBACiAgICAgICBAQXNzaXN0ZWQgUHJvamVjdC5OYW1lS2V5IG5hbWUsIEBBc3Npc3RlZCBTZXQ8QnJhbmNoLk5hbWVLZXk+IHRvUmVtb3ZlKSB7CiAgICAgdGhpcy5wcm9qZWN0Q29udHJvbEZhY3RvcnkgPSBwcm9qZWN0Q29udHJvbEZhY3Rvcnk7CiAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwotICAgIHRoaXMucmVwbGljYXRpb24gPSByZXBsaWNhdGlvbjsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOwogICAgIHRoaXMuaWRlbnRpZmllZFVzZXIgPSBpZGVudGlmaWVkVXNlcjsKICAgICB0aGlzLmhvb2tzID0gaG9va3M7CiAgICAgdGhpcy5kYiA9IGRiOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgICAgICAgY2FzZSBGQVNUX0ZPUldBUkQ6CiAgICAgICAgICAgY2FzZSBGT1JDRUQ6CiAgICAgICAgICAgICBkZWxldGVkLmFkZChicmFuY2hLZXkpOwotICAgICAgICAgICAgcmVwbGljYXRpb24uZmlyZShwcm9qZWN0TmFtZSwgcmVmbmFtZSk7CisgICAgICAgICAgICBnaXRSZWZVcGRhdGVkLmZpcmUocHJvamVjdE5hbWUsIHUpOwogICAgICAgICAgICAgaG9va3MuZG9SZWZVcGRhdGVkSG9vayhicmFuY2hLZXksIHUsIGlkZW50aWZpZWRVc2VyLmdldEFjY291bnQoKSk7CiAgICAgICAgICAgICBicmVhazsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvTGlzdFByb2plY3RzU2VydmxldC5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvTGlzdFByb2plY3RzU2VydmxldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzI3ZDM1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L0xpc3RQcm9qZWN0c1NlcnZsZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucHJvamVjdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5SZXN0QXBpU2VydmxldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5MaXN0UHJvamVjdHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci0KLUBTaW5nbGV0b24KLXB1YmxpYyBjbGFzcyBMaXN0UHJvamVjdHNTZXJ2bGV0IGV4dGVuZHMgUmVzdEFwaVNlcnZsZXQgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLSAgcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXJQYXJzZXIgcGFyYW1QYXJzZXI7Ci0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TGlzdFByb2plY3RzPiBmYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgTGlzdFByb2plY3RzU2VydmxldChmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXIsCi0gICAgICBQYXJhbWV0ZXJQYXJzZXIgcGFyYW1QYXJzZXIsIFByb3ZpZGVyPExpc3RQcm9qZWN0cz4gbHMpIHsKLSAgICBzdXBlcihjdXJyZW50VXNlcik7Ci0gICAgdGhpcy5wYXJhbVBhcnNlciA9IHBhcmFtUGFyc2VyOwotICAgIHRoaXMuZmFjdG9yeSA9IGxzOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBMaXN0UHJvamVjdHMgaW1wbCA9IGZhY3RvcnkuZ2V0KCk7Ci0gICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkocmVxLmdldFBhdGhJbmZvKCkpKSB7Ci0gICAgICBpbXBsLnNldE1hdGNoUHJlZml4KFVSTERlY29kZXIuZGVjb2RlKHJlcS5nZXRQYXRoSW5mbygpLCAiVVRGLTgiKSk7Ci0gICAgfQotICAgIGlmIChhY2NlcHRzSnNvbihyZXEpKSB7Ci0gICAgICBpbXBsLnNldEZvcm1hdChPdXRwdXRGb3JtYXQuSlNPTl9DT01QQUNUKTsKLSAgICB9Ci0gICAgaWYgKHBhcmFtUGFyc2VyLnBhcnNlKGltcGwsIHJlcSwgcmVzKSkgewotICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgIGlmIChpbXBsLmdldEZvcm1hdCgpLmlzSnNvbigpKSB7Ci0gICAgICAgIHJlcy5zZXRDb250ZW50VHlwZShKU09OX1RZUEUpOwotICAgICAgICBidWYud3JpdGUoSlNPTl9NQUdJQyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvcGxhaW4iKTsKLSAgICAgIH0KLSAgICAgIGltcGwuZGlzcGxheShidWYpOwotICAgICAgcmVzLnNldENoYXJhY3RlckVuY29kaW5nKCJVVEYtOCIpOwotICAgICAgc2VuZChyZXEsIHJlcywgYnVmLnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFjY2Vzc0ZhY3RvcnkuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RBY2Nlc3NGYWN0b3J5LmphdmEKaW5kZXggN2IzYjhlNy4uMmM1NjgxYiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFjY2Vzc0ZhY3RvcnkuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWNjZXNzRmFjdG9yeS5qYXZhCkBAIC0xMjEsNiArMTIxLDkgQEAKICAgICAgICAgaWYgKHBjLmlzT3duZXIoKSkgewogICAgICAgICAgIGxvY2FsLmFkZChzZWN0aW9uKTsKICAgICAgICAgICBvd25lck9mLmFkZChuYW1lKTsKKworICAgICAgICB9IGVsc2UgaWYgKG1ldGFDb25maWdDb250cm9sLmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgbG9jYWwuYWRkKHNlY3Rpb24pOwogICAgICAgICB9CiAKICAgICAgIH0gZWxzZSBpZiAoUmVmQ29uZmlnU2VjdGlvbi5pc1ZhbGlkKG5hbWUpKSB7CkBAIC0yMDEsNiArMjA0LDcgQEAKICAgICBkZXRhaWwuc2V0Q2FuVXBsb2FkKHBjLmlzT3duZXIoKQogICAgICAgICB8fCAobWV0YUNvbmZpZ0NvbnRyb2wuaXNWaXNpYmxlKCkgJiYgbWV0YUNvbmZpZ0NvbnRyb2wuY2FuVXBsb2FkKCkpKTsKICAgICBkZXRhaWwuc2V0Q29uZmlnVmlzaWJsZShwYy5pc093bmVyKCkgfHwgbWV0YUNvbmZpZ0NvbnRyb2wuaXNWaXNpYmxlKCkpOworICAgIGRldGFpbC5zZXRMYWJlbFR5cGVzKHBjLmdldExhYmVsVHlwZXMoKSk7CiAgICAgcmV0dXJuIGRldGFpbDsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWNjZXNzSGFuZGxlci5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFjY2Vzc0hhbmRsZXIuamF2YQppbmRleCAwMmI4NGIwLi4wYTUwYTM4IDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWNjZXNzSGFuZGxlci5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RBY2Nlc3NIYW5kbGVyLmphdmEKQEAgLTE0LDYgKzE0LDggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5ycGMucHJvamVjdDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUHJvamVjdEFjY2Vzc1V0aWwubWVyZ2VTZWN0aW9uczsKKwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKQEAgLTM2LDExICszOCw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvamVjdEFjY2Vzc0hhbmRsZXI8VD4gZXh0ZW5kcyBIYW5kbGVyPFQ+IHsKQEAgLTE1MSwyMyArMTUwLDYgQEAKICAgICB0b0RlbGV0ZS5yZW1vdmUoc2VjdGlvbi5nZXROYW1lKCkpOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxBY2Nlc3NTZWN0aW9uPiBtZXJnZVNlY3Rpb25zKExpc3Q8QWNjZXNzU2VjdGlvbj4gc3JjKSB7Ci0gICAgTWFwPFN0cmluZywgQWNjZXNzU2VjdGlvbj4gbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBBY2Nlc3NTZWN0aW9uPigpOwotICAgIGZvciAoQWNjZXNzU2VjdGlvbiBzZWN0aW9uIDogc3JjKSB7Ci0gICAgICBpZiAoc2VjdGlvbi5nZXRQZXJtaXNzaW9ucygpLmlzRW1wdHkoKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgQWNjZXNzU2VjdGlvbiBwcmlvciA9IG1hcC5nZXQoc2VjdGlvbi5nZXROYW1lKCkpOwotICAgICAgaWYgKHByaW9yICE9IG51bGwpIHsKLSAgICAgICAgcHJpb3IubWVyZ2VGcm9tKHNlY3Rpb24pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWFwLnB1dChzZWN0aW9uLmdldE5hbWUoKSwgc2VjdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEFjY2Vzc1NlY3Rpb24+KG1hcC52YWx1ZXMoKSk7Ci0gIH0KLQogICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBzY2FuU2VjdGlvbk5hbWVzKFByb2plY3RDb25maWcgY29uZmlnKSB7CiAgICAgU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAgICAgZm9yIChBY2Nlc3NTZWN0aW9uIHNlY3Rpb24gOiBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbnMoKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFkbWluU2VydmljZUltcGwuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RBZG1pblNlcnZpY2VJbXBsLmphdmEKaW5kZXggOTgzZjFmYy4uMGU0NmJjMyAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdEFkbWluU2VydmljZUltcGwuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0QWRtaW5TZXJ2aWNlSW1wbC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5wcm9qZWN0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BZGRCcmFuY2hSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGlzdEJyYW5jaGVzUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlByb2plY3RBY2Nlc3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUHJvamVjdEFkbWluU2VydmljZTsKQEAgLTIzLDcgKzI0LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uQXN5bmNDYWxsYmFjazsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLlZvaWRSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC00MCw3ICs0MCw2IEBACiAgIHByaXZhdGUgZmluYWwgTGlzdEJyYW5jaGVzLkZhY3RvcnkgbGlzdEJyYW5jaGVzRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBWaXNpYmxlUHJvamVjdERldGFpbHMuRmFjdG9yeSB2aXNpYmxlUHJvamVjdERldGFpbHNGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFByb2plY3RBY2Nlc3NGYWN0b3J5LkZhY3RvcnkgcHJvamVjdEFjY2Vzc0ZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQ3JlYXRlUHJvamVjdEhhbmRsZXIuRmFjdG9yeSBjcmVhdGVQcm9qZWN0SGFuZGxlckZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUHJvamVjdERldGFpbEZhY3RvcnkuRmFjdG9yeSBwcm9qZWN0RGV0YWlsRmFjdG9yeTsKIAogICBASW5qZWN0CkBAIC01Miw4ICs1MSw3IEBACiAgICAgICBmaW5hbCBMaXN0QnJhbmNoZXMuRmFjdG9yeSBsaXN0QnJhbmNoZXNGYWN0b3J5LAogICAgICAgZmluYWwgVmlzaWJsZVByb2plY3REZXRhaWxzLkZhY3RvcnkgdmlzaWJsZVByb2plY3REZXRhaWxzRmFjdG9yeSwKICAgICAgIGZpbmFsIFByb2plY3RBY2Nlc3NGYWN0b3J5LkZhY3RvcnkgcHJvamVjdEFjY2Vzc0ZhY3RvcnksCi0gICAgICBmaW5hbCBQcm9qZWN0RGV0YWlsRmFjdG9yeS5GYWN0b3J5IHByb2plY3REZXRhaWxGYWN0b3J5LAotICAgICAgZmluYWwgQ3JlYXRlUHJvamVjdEhhbmRsZXIuRmFjdG9yeSBjcmVhdGVOZXdQcm9qZWN0RmFjdG9yeSkgeworICAgICAgZmluYWwgUHJvamVjdERldGFpbEZhY3RvcnkuRmFjdG9yeSBwcm9qZWN0RGV0YWlsRmFjdG9yeSkgewogICAgIHRoaXMuYWRkQnJhbmNoRmFjdG9yeSA9IGFkZEJyYW5jaEZhY3Rvcnk7CiAgICAgdGhpcy5jaGFuZ2VQcm9qZWN0QWNjZXNzRmFjdG9yeSA9IGNoYW5nZVByb2plY3RBY2Nlc3NGYWN0b3J5OwogICAgIHRoaXMucmV2aWV3UHJvamVjdEFjY2Vzc0ZhY3RvcnkgPSByZXZpZXdQcm9qZWN0QWNjZXNzRmFjdG9yeTsKQEAgLTYzLDcgKzYxLDYgQEAKICAgICB0aGlzLnZpc2libGVQcm9qZWN0RGV0YWlsc0ZhY3RvcnkgPSB2aXNpYmxlUHJvamVjdERldGFpbHNGYWN0b3J5OwogICAgIHRoaXMucHJvamVjdEFjY2Vzc0ZhY3RvcnkgPSBwcm9qZWN0QWNjZXNzRmFjdG9yeTsKICAgICB0aGlzLnByb2plY3REZXRhaWxGYWN0b3J5ID0gcHJvamVjdERldGFpbEZhY3Rvcnk7Ci0gICAgdGhpcy5jcmVhdGVQcm9qZWN0SGFuZGxlckZhY3RvcnkgPSBjcmVhdGVOZXdQcm9qZWN0RmFjdG9yeTsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtMTI2LDE2ICsxMjMsOCBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIHZvaWQgYWRkQnJhbmNoKGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwKICAgICAgIGZpbmFsIFN0cmluZyBicmFuY2hOYW1lLCBmaW5hbCBTdHJpbmcgc3RhcnRpbmdSZXZpc2lvbiwKLSAgICAgIGZpbmFsIEFzeW5jQ2FsbGJhY2s8TGlzdEJyYW5jaGVzUmVzdWx0PiBjYWxsYmFjaykgeworICAgICAgZmluYWwgQXN5bmNDYWxsYmFjazxBZGRCcmFuY2hSZXN1bHQ+IGNhbGxiYWNrKSB7CiAgICAgYWRkQnJhbmNoRmFjdG9yeS5jcmVhdGUocHJvamVjdE5hbWUsIGJyYW5jaE5hbWUsIHN0YXJ0aW5nUmV2aXNpb24pLnRvKAogICAgICAgICBjYWxsYmFjayk7CiAgIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgY3JlYXRlTmV3UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIFN0cmluZyBwYXJlbnROYW1lLAotICAgICAgYm9vbGVhbiBlbXB0eUNvbW1pdCwgYm9vbGVhbiBwZXJtaXNzaW9uc09ubHksCi0gICAgICBBc3luY0NhbGxiYWNrPFZvaWRSZXN1bHQ+IGNhbGxiYWNrKSB7Ci0gICAgY3JlYXRlUHJvamVjdEhhbmRsZXJGYWN0b3J5LmNyZWF0ZShwcm9qZWN0TmFtZSwgcGFyZW50TmFtZSwgZW1wdHlDb21taXQsCi0gICAgICAgIHBlcm1pc3Npb25zT25seSkudG8oY2FsbGJhY2spOwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0RGV0YWlsRmFjdG9yeS5qYXZhIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUHJvamVjdERldGFpbEZhY3RvcnkuamF2YQppbmRleCAyNzQxNjQwLi4yNTMzZmViIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0RGV0YWlsRmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3REZXRhaWxGYWN0b3J5LmphdmEKQEAgLTE0LDggKzE0LDEwIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnByb2plY3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Qcm9qZWN0RGV0YWlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5IYW5kbGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Jbmhlcml0ZWRCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKQEAgLTY4LDYgKzcwLDI4IEBACiAgICAgZGV0YWlsLnNldENhbk1vZGlmeU1lcmdlVHlwZSh1c2VySXNPd25lcik7CiAgICAgZGV0YWlsLnNldENhbk1vZGlmeVN0YXRlKHVzZXJJc093bmVyKTsKIAorICAgIGZpbmFsIEluaGVyaXRlZEJvb2xlYW4gdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzID0gbmV3IEluaGVyaXRlZEJvb2xlYW4oKTsKKyAgICBmaW5hbCBJbmhlcml0ZWRCb29sZWFuIHVzZVNpZ25lZE9mZkJ5ID0gbmV3IEluaGVyaXRlZEJvb2xlYW4oKTsKKyAgICBmaW5hbCBJbmhlcml0ZWRCb29sZWFuIHVzZUNvbnRlbnRNZXJnZSA9IG5ldyBJbmhlcml0ZWRCb29sZWFuKCk7CisgICAgZmluYWwgSW5oZXJpdGVkQm9vbGVhbiByZXF1aXJlQ2hhbmdlSUQgPSBuZXcgSW5oZXJpdGVkQm9vbGVhbigpOworICAgIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cy5zZXRWYWx1ZShwcm9qZWN0U3RhdGUuZ2V0UHJvamVjdCgpCisgICAgICAgIC5nZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoKSk7CisgICAgdXNlU2lnbmVkT2ZmQnkuc2V0VmFsdWUocHJvamVjdFN0YXRlLmdldFByb2plY3QoKS5nZXRVc2VTaWduZWRPZmZCeSgpKTsKKyAgICB1c2VDb250ZW50TWVyZ2Uuc2V0VmFsdWUocHJvamVjdFN0YXRlLmdldFByb2plY3QoKS5nZXRVc2VDb250ZW50TWVyZ2UoKSk7CisgICAgcmVxdWlyZUNoYW5nZUlELnNldFZhbHVlKHByb2plY3RTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0UmVxdWlyZUNoYW5nZUlEKCkpOworICAgIFByb2plY3RTdGF0ZSBwYXJlbnRTdGF0ZSA9IEl0ZXJhYmxlcy5nZXRGaXJzdChwcm9qZWN0U3RhdGUucGFyZW50cygpLCBudWxsKTsKKyAgICBpZiAocGFyZW50U3RhdGUgIT0gbnVsbCkgeworICAgICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzLnNldEluaGVyaXRlZFZhbHVlKHBhcmVudFN0YXRlCisgICAgICAgICAgLmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpOworICAgICAgdXNlU2lnbmVkT2ZmQnkuc2V0SW5oZXJpdGVkVmFsdWUocGFyZW50U3RhdGUuaXNVc2VTaWduZWRPZmZCeSgpKTsKKyAgICAgIHVzZUNvbnRlbnRNZXJnZS5zZXRJbmhlcml0ZWRWYWx1ZShwYXJlbnRTdGF0ZS5pc1VzZUNvbnRlbnRNZXJnZSgpKTsKKyAgICAgIHJlcXVpcmVDaGFuZ2VJRC5zZXRJbmhlcml0ZWRWYWx1ZShwYXJlbnRTdGF0ZS5pc1JlcXVpcmVDaGFuZ2VJRCgpKTsKKyAgICB9CisgICAgZGV0YWlsLnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyh1c2VDb250cmlidXRvckFncmVlbWVudHMpOworICAgIGRldGFpbC5zZXRVc2VTaWduZWRPZmZCeSh1c2VTaWduZWRPZmZCeSk7CisgICAgZGV0YWlsLnNldFVzZUNvbnRlbnRNZXJnZSh1c2VDb250ZW50TWVyZ2UpOworICAgIGRldGFpbC5zZXRSZXF1aXJlQ2hhbmdlSUQocmVxdWlyZUNoYW5nZUlEKTsKKwogICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSA9IHByb2plY3RTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpOwogICAgIFJlcG9zaXRvcnkgZ2l0OwogICAgIHRyeSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0TW9kdWxlLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0TW9kdWxlLmphdmEKaW5kZXggZTk0M2UzZmMuLjJkNGYyMTAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0TW9kdWxlLmphdmEKQEAgLTMxLDcgKzMxLDYgQEAKICAgICAgICAgZmFjdG9yeShBZGRCcmFuY2guRmFjdG9yeS5jbGFzcyk7CiAgICAgICAgIGZhY3RvcnkoQ2hhbmdlUHJvamVjdEFjY2Vzcy5GYWN0b3J5LmNsYXNzKTsKICAgICAgICAgZmFjdG9yeShSZXZpZXdQcm9qZWN0QWNjZXNzLkZhY3RvcnkuY2xhc3MpOwotICAgICAgICBmYWN0b3J5KENyZWF0ZVByb2plY3RIYW5kbGVyLkZhY3RvcnkuY2xhc3MpOwogICAgICAgICBmYWN0b3J5KENoYW5nZVByb2plY3RTZXR0aW5ncy5GYWN0b3J5LmNsYXNzKTsKICAgICAgICAgZmFjdG9yeShEZWxldGVCcmFuY2hlcy5GYWN0b3J5LmNsYXNzKTsKICAgICAgICAgZmFjdG9yeShMaXN0QnJhbmNoZXMuRmFjdG9yeS5jbGFzcyk7CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0c1Jlc3RBcGlTZXJ2bGV0LmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9Qcm9qZWN0c1Jlc3RBcGlTZXJ2bGV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzYjhiMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Byb2plY3RzUmVzdEFwaVNlcnZsZXQuamF2YQpAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucnBjLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5yZXN0YXBpLlJlc3RBcGlTZXJ2bGV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RzQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgUHJvamVjdHNSZXN0QXBpU2VydmxldCBleHRlbmRzIFJlc3RBcGlTZXJ2bGV0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgQEluamVjdAorICBQcm9qZWN0c1Jlc3RBcGlTZXJ2bGV0KFJlc3RBcGlTZXJ2bGV0Lkdsb2JhbHMgZ2xvYmFscywKKyAgICAgIFByb3ZpZGVyPFByb2plY3RzQ29sbGVjdGlvbj4gcHJvamVjdHMpIHsKKyAgICBzdXBlcihnbG9iYWxzLCBwcm9qZWN0cyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Jldmlld1Byb2plY3RBY2Nlc3MuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3JwYy9wcm9qZWN0L1Jldmlld1Byb2plY3RBY2Nlc3MuamF2YQppbmRleCA2OWEyODNhLi4yNTEyNDlmIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9ycGMvcHJvamVjdC9SZXZpZXdQcm9qZWN0QWNjZXNzLmphdmEKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcnBjL3Byb2plY3QvUmV2aWV3UHJvamVjdEFjY2Vzcy5qYXZhCkBAIC0yNywxNCArMjcsMTcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBCYWNrZW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5Qb3N0UmV2aWV3ZXJzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLkFkZFJldmlld2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKQEAgLTU4LDE0ICs2MSwxNiBAQAogICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwogICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CiAgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIEFkZFJldmlld2VyLkZhY3RvcnkgYWRkUmV2aWV3ZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFBvc3RSZXZpZXdlcnM+IHJldmlld2Vyc1Byb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlRmFjdG9yeTsKIAogICBASW5qZWN0CiAgIFJldmlld1Byb2plY3RBY2Nlc3MoZmluYWwgUHJvamVjdENvbnRyb2wuRmFjdG9yeSBwcm9qZWN0Q29udHJvbEZhY3RvcnksCiAgICAgICBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLAogICAgICAgZmluYWwgTWV0YURhdGFVcGRhdGUuVXNlciBtZXRhRGF0YVVwZGF0ZUZhY3RvcnksIGZpbmFsIFJldmlld0RiIGRiLAogICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlciwgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgQWRkUmV2aWV3ZXIuRmFjdG9yeSBhZGRSZXZpZXdlckZhY3RvcnksCisgICAgICBmaW5hbCBQcm92aWRlcjxQb3N0UmV2aWV3ZXJzPiByZXZpZXdlcnNQcm92aWRlciwKKyAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlRmFjdG9yeSwKIAogICAgICAgQEFzc2lzdGVkIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwKICAgICAgIEBOdWxsYWJsZSBAQXNzaXN0ZWQgZmluYWwgT2JqZWN0SWQgYmFzZSwKQEAgLTc2LDE0ICs4MSwxNiBAQAogICAgIHRoaXMuZGIgPSBkYjsKICAgICB0aGlzLnVzZXIgPSB1c2VyOwogICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci0gICAgdGhpcy5hZGRSZXZpZXdlckZhY3RvcnkgPSBhZGRSZXZpZXdlckZhY3Rvcnk7CisgICAgdGhpcy5yZXZpZXdlcnNQcm92aWRlciA9IHJldmlld2Vyc1Byb3ZpZGVyOworICAgIHRoaXMuY2hhbmdlRmFjdG9yeSA9IGNoYW5nZUZhY3Rvcnk7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIENoYW5nZS5JZCB1cGRhdGVQcm9qZWN0Q29uZmlnKFByb2plY3RDb25maWcgY29uZmlnLCBNZXRhRGF0YVVwZGF0ZSBtZCkKICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKICAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBuZXcgQ2hhbmdlLklkKGRiLm5leHRDaGFuZ2VJZCgpKTsKLSAgICBQYXRjaFNldCBwcyA9IG5ldyBQYXRjaFNldChuZXcgUGF0Y2hTZXQuSWQoY2hhbmdlSWQsIDEpKTsKKyAgICBQYXRjaFNldCBwcyA9CisgICAgICAgIG5ldyBQYXRjaFNldChuZXcgUGF0Y2hTZXQuSWQoY2hhbmdlSWQsIENoYW5nZS5JTklUSUFMX1BBVENIX1NFVF9JRCkpOwogICAgIFJldkNvbW1pdCBjb21taXQgPSBjb25maWcuY29tbWl0VG9OZXdSZWYobWQsIHBzLmdldFJlZk5hbWUoKSk7CiAgICAgaWYgKGNvbW1pdC5nZXRJZCgpLmVxdWFscyhiYXNlKSkgewogICAgICAgcmV0dXJuIG51bGw7CkBAIC05Niw3ICsxMDMsNiBAQAogICAgICAgICBuZXcgQnJhbmNoLk5hbWVLZXkoCiAgICAgICAgICAgICBjb25maWcuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSwKICAgICAgICAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcpKTsKLSAgICBjaGFuZ2UubmV4dFBhdGNoU2V0SWQoKTsKIAogICAgIHBzLnNldENyZWF0ZWRPbihjaGFuZ2UuZ2V0Q3JlYXRlZE9uKCkpOwogICAgIHBzLnNldFVwbG9hZGVyKGNoYW5nZS5nZXRPd25lcigpKTsKQEAgLTExMSw3ICsxMTcsNyBAQAogICAgICAgaW5zZXJ0QW5jZXN0b3JzKHBzLmdldElkKCksIGNvbW1pdCk7CiAgICAgICBkYi5wYXRjaFNldHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBzKSk7CiAgICAgICBkYi5jaGFuZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjaGFuZ2UpKTsKLSAgICAgIGFkZFByb2plY3RPd25lcnNBc1Jldmlld2VycyhjaGFuZ2VJZCk7CisgICAgICBhZGRQcm9qZWN0T3duZXJzQXNSZXZpZXdlcnMoY2hhbmdlKTsKICAgICAgIGRiLmNvbW1pdCgpOwogICAgIH0gZmluYWxseSB7CiAgICAgICBkYi5yb2xsYmFjaygpOwpAQCAtMTMzLDEyICsxMzksMTUgQEAKICAgICBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmluc2VydCh0b0luc2VydCk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgYWRkUHJvamVjdE93bmVyc0FzUmV2aWV3ZXJzKGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZCkgeworICBwcml2YXRlIHZvaWQgYWRkUHJvamVjdE93bmVyc0FzUmV2aWV3ZXJzKGZpbmFsIENoYW5nZSBjaGFuZ2UpIHsKICAgICBmaW5hbCBTdHJpbmcgcHJvamVjdE93bmVycyA9CiAgICAgICAgIGdyb3VwQmFja2VuZC5nZXQoQWNjb3VudEdyb3VwLlBST0pFQ1RfT1dORVJTKS5nZXROYW1lKCk7CiAgICAgdHJ5IHsKLSAgICAgIGFkZFJldmlld2VyRmFjdG9yeS5jcmVhdGUoY2hhbmdlSWQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihwcm9qZWN0T3duZXJzKSwKLSAgICAgICAgICBmYWxzZSkuY2FsbCgpOworICAgICAgQ2hhbmdlUmVzb3VyY2UgcnNyYyA9CisgICAgICAgICAgbmV3IENoYW5nZVJlc291cmNlKGNoYW5nZUZhY3RvcnkuY29udHJvbEZvcihjaGFuZ2UsIHVzZXIpKTsKKyAgICAgIFBvc3RSZXZpZXdlcnMuSW5wdXQgaW5wdXQgPSBuZXcgUG9zdFJldmlld2Vycy5JbnB1dCgpOworICAgICAgaW5wdXQucmV2aWV3ZXIgPSBwcm9qZWN0T3duZXJzOworICAgICAgcmV2aWV3ZXJzUHJvdmlkZXIuZ2V0KCkuYXBwbHkocnNyYywgaW5wdXQpOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAvLyBvbmUgb2YgdGhlIG93bmVyIGdyb3VwcyBpcyBub3QgdmlzaWJsZSB0byB0aGUgdXNlciBhbmQgdGhpcyBpdCB3aHkgaXQKICAgICAgIC8vIGNhbid0IGJlIGFkZGVkIGFzIHJldmlld2VyCmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC90ZW1wbGF0ZS9TaXRlSGVhZGVyRm9vdGVyLmphdmEgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC90ZW1wbGF0ZS9TaXRlSGVhZGVyRm9vdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIxZjAzMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3RlbXBsYXRlL1NpdGVIZWFkZXJGb290ZXIuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnRlbXBsYXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkh0bWxEb21VdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBTaXRlSGVhZGVyRm9vdGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNpdGVIZWFkZXJGb290ZXIuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZWZyZXNoSGVhZGVyRm9vdGVyOworICBwcml2YXRlIGZpbmFsIFNpdGVQYXRocyBzaXRlUGF0aHM7CisgIHByaXZhdGUgdm9sYXRpbGUgVGVtcGxhdGUgdGVtcGxhdGU7CisKKyAgQEluamVjdAorICBTaXRlSGVhZGVyRm9vdGVyKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZywgU2l0ZVBhdGhzIHNpdGVQYXRocykgeworICAgIHRoaXMucmVmcmVzaEhlYWRlckZvb3RlciA9IGNmZy5nZXRCb29sZWFuKCJzaXRlIiwgInJlZnJlc2hIZWFkZXJGb290ZXIiLCB0cnVlKTsKKyAgICB0aGlzLnNpdGVQYXRocyA9IHNpdGVQYXRoczsKKworICAgIFRlbXBsYXRlIHQgPSBuZXcgVGVtcGxhdGUoc2l0ZVBhdGhzKTsKKyAgICB0cnkgeworICAgICAgdC5sb2FkKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgbG9nLndhcm4oIkNhbm5vdCBsb2FkIHNpdGUgaGVhZGVyIG9yIGZvb3RlciIsIGUpOworICAgIH0KKyAgICB0ZW1wbGF0ZSA9IHQ7CisgIH0KKworICBwdWJsaWMgRG9jdW1lbnQgcGFyc2UoQ2xhc3M8Pz4gY2xhenosIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFRlbXBsYXRlIHQgPSB0ZW1wbGF0ZTsKKyAgICBpZiAocmVmcmVzaEhlYWRlckZvb3RlciAmJiB0LmlzU3RhbGUoKSkgeworICAgICAgdCA9IG5ldyBUZW1wbGF0ZShzaXRlUGF0aHMpOworICAgICAgdHJ5IHsKKyAgICAgICAgdC5sb2FkKCk7CisgICAgICAgIHRlbXBsYXRlID0gdDsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nLndhcm4oIkNhbm5vdCByZWZyZXNoIHNpdGUgaGVhZGVyIG9yIGZvb3RlciIsIGUpOworICAgICAgICB0ID0gdGVtcGxhdGU7CisgICAgICB9CisgICAgfQorCisgICAgRG9jdW1lbnQgZG9jID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKGNsYXp6LCBuYW1lKTsKKyAgICBpbmplY3RDc3MoZG9jLCAiZ2Vycml0X3NpdGVjc3MiLCB0LmNzcyk7CisgICAgaW5qZWN0WG1sKGRvYywgImdlcnJpdF9oZWFkZXIiLCB0LmhlYWRlcik7CisgICAgaW5qZWN0WG1sKGRvYywgImdlcnJpdF9mb290ZXIiLCB0LmZvb3Rlcik7CisgICAgcmV0dXJuIGRvYzsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbmplY3RDc3MoRG9jdW1lbnQgZG9jLCBTdHJpbmcgaWQsIFN0cmluZyBjb250ZW50KSB7CisgICAgRWxlbWVudCBlID0gSHRtbERvbVV0aWwuZmluZChkb2MsIGlkKTsKKyAgICBpZiAoZSAhPSBudWxsKSB7CisgICAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShjb250ZW50KSkgeworICAgICAgICB3aGlsZSAoZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkgeworICAgICAgICAgIGUucmVtb3ZlQ2hpbGQoZS5nZXRGaXJzdENoaWxkKCkpOworICAgICAgICB9CisgICAgICAgIGUucmVtb3ZlQXR0cmlidXRlKCJpZCIpOworICAgICAgICBlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oIlxuIiArIGNvbnRlbnQgKyAiXG4iKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgaW5qZWN0WG1sKERvY3VtZW50IGRvYywgU3RyaW5nIGlkLCBFbGVtZW50IGQpIHsKKyAgICBFbGVtZW50IGUgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgaWQpOworICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgIGlmIChkICE9IG51bGwpIHsKKyAgICAgICAgd2hpbGUgKGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpIHsKKyAgICAgICAgICBlLnJlbW92ZUNoaWxkKGUuZ2V0Rmlyc3RDaGlsZCgpKTsKKyAgICAgICAgfQorICAgICAgICBlLmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKGQsIHRydWUpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGUuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlbXBsYXRlIHsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVJbmZvIGNzc0ZpbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSW5mbyBoZWFkZXJGaWxlOworICAgIHByaXZhdGUgZmluYWwgRmlsZUluZm8gZm9vdGVyRmlsZTsKKworICAgIFN0cmluZyBjc3M7CisgICAgRWxlbWVudCBoZWFkZXI7CisgICAgRWxlbWVudCBmb290ZXI7CisKKyAgICBUZW1wbGF0ZShTaXRlUGF0aHMgc2l0ZSkgeworICAgICAgY3NzRmlsZSA9IG5ldyBGaWxlSW5mbyhzaXRlLnNpdGVfY3NzKTsKKyAgICAgIGhlYWRlckZpbGUgPSBuZXcgRmlsZUluZm8oc2l0ZS5zaXRlX2hlYWRlcik7CisgICAgICBmb290ZXJGaWxlID0gbmV3IEZpbGVJbmZvKHNpdGUuc2l0ZV9mb290ZXIpOworICAgIH0KKworICAgIHZvaWQgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBjc3MgPSBIdG1sRG9tVXRpbC5yZWFkRmlsZSgKKyAgICAgICAgICBjc3NGaWxlLnBhdGguZ2V0UGFyZW50RmlsZSgpLAorICAgICAgICAgIGNzc0ZpbGUucGF0aC5nZXROYW1lKCkpOworICAgICAgaGVhZGVyID0gcmVhZFhtbChoZWFkZXJGaWxlKTsKKyAgICAgIGZvb3RlciA9IHJlYWRYbWwoZm9vdGVyRmlsZSk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc1N0YWxlKCkgeworICAgICAgcmV0dXJuIGNzc0ZpbGUuaXNTdGFsZSgpIHx8IGhlYWRlckZpbGUuaXNTdGFsZSgpIHx8IGZvb3RlckZpbGUuaXNTdGFsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEVsZW1lbnQgcmVhZFhtbChGaWxlSW5mbyBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBEb2N1bWVudCBkID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKHNyYy5wYXRoKTsKKyAgICAgIHJldHVybiBkICE9IG51bGwgPyBkLmdldERvY3VtZW50RWxlbWVudCgpIDogbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGaWxlSW5mbyB7CisgICAgZmluYWwgRmlsZSBwYXRoOworICAgIGZpbmFsIGxvbmcgdGltZTsKKworICAgIEZpbGVJbmZvKEZpbGUgcCkgeworICAgICAgcGF0aCA9IHA7CisgICAgICB0aW1lID0gcGF0aC5sYXN0TW9kaWZpZWQoKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzU3RhbGUoKSB7CisgICAgICByZXR1cm4gdGltZSAhPSBwYXRoLmxhc3RNb2RpZmllZCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2JlY29tZS9CZWNvbWVBbnlBY2NvdW50Lmh0bWwgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnQuaHRtbAppbmRleCBjM2M3NTAzLi5jNjYwMzExIDEwMDY0NAotLS0gYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnQuaHRtbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvYmVjb21lL0JlY29tZUFueUFjY291bnQuaHRtbApAQCAtMSwxMCArMSwxMCBAQAogPGh0bWw+CiAgIDxoZWFkPgogICAgIDx0aXRsZT5HZXJyaXQgQ29kZSBSZXZpZXc8L3RpdGxlPgotICAgIDxzY3JpcHQgaWQ9ImdlcnJpdF9nd3RkZXZtb2RlIj4KKyAgICA8c2NyaXB0IGlkPSJnd3RkZXZtb2RlIj4KICAgICAgIChmdW5jdGlvbiAoKSB7CiAgICAgICAgIHZhciBwbiA9ICdnd3QuY29kZXN2cic7Ci0gICAgICAgIHZhciBjbiA9ICdnZXJyaXQuJyArIHBuOworICAgICAgICB2YXIgY24gPSAnZ2Vycml0X3VpLicgKyBwbjsKIAogICAgICAgICB2YXIgcF9zdGFydCA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guaW5kZXhPZihwbiArICc9Jyk7CiAgICAgICAgIGlmIChwX3N0YXJ0ICE9IC0xKSB7CkBAIC0yOSw1MSArMjksNTkgQEAKICAgICAgICAgfQogICAgICAgfSkoKTsKICAgICA8L3NjcmlwdD4KKyAgICA8c3R5bGUgaWQ9ImdlcnJpdF9zaXRlY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT4KICAgPC9oZWFkPgogICA8Ym9keT4KLSAgICA8aDI+U2lnbiBJbjwvaDI+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0aD5Vc2VybmFtZTo8L3RoPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBuYW1lPSJ1c2VyX25hbWUiIC8+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQmVjb21lIEFjY291bnQiIC8+Ci0gICAgICAgICAgPC9mb3JtPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KKyAgICA8ZGl2IGlkPSJnZXJyaXRfdG9wbWVudSIgc3R5bGU9ImhlaWdodDo0NXB4OyIgY2xhc3M9ImdlcnJpdFRvcE1lbnUiPjwvZGl2PgorICAgIDxkaXYgaWQ9ImdlcnJpdF9oZWFkZXIiPjwvZGl2PgorICAgIDxkaXYgaWQ9ImdlcnJpdF9ib2R5IiBjbGFzcz0iZ2Vycml0Qm9keSI+CisgICAgICA8aDI+U2lnbiBJbjwvaDI+CisgICAgICA8dGFibGUgYm9yZGVyPSIwIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aD5Vc2VybmFtZTo8L3RoPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjMwIiBuYW1lPSJ1c2VyX25hbWUiIC8+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCZWNvbWUgQWNjb3VudCIgLz4KKyAgICAgICAgICAgIDwvZm9ybT4KKyAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgogCi0gICAgICA8dHI+Ci0gICAgICAgIDx0aD5FbWFpbCBBZGRyZXNzOjwvdGg+Ci0gICAgICAgIDx0ZD4KLSAgICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+Ci0gICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgc2l6ZT0iMzAiIG5hbWU9InByZWZlcnJlZF9lbWFpbCIgLz4KLSAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJCZWNvbWUgQWNjb3VudCIgLz4KLSAgICAgICAgICA8L2Zvcm0+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPkVtYWlsIEFkZHJlc3M6PC90aD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9IkdFVCI+CisgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBzaXplPSIzMCIgbmFtZT0icHJlZmVycmVkX2VtYWlsIiAvPgorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQmVjb21lIEFjY291bnQiIC8+CisgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KIAotICAgICAgPHRyPgotICAgICAgICA8dGg+QWNjb3VudCBJRDo8L3RoPgotICAgICAgICA8dGQ+Ci0gICAgICAgICAgPGZvcm0gbWV0aG9kPSJHRVQiPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjEyIiBuYW1lPSJhY2NvdW50X2lkIiAvPgotICAgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkJlY29tZSBBY2NvdW50IiAvPgotICAgICAgICAgIDwvZm9ybT4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGg+QWNjb3VudCBJRDo8L3RoPgorICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0iR0VUIj4KKyAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIHNpemU9IjEyIiBuYW1lPSJhY2NvdW50X2lkIiAvPgorICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQmVjb21lIEFjY291bnQiIC8+CisgICAgICAgICAgICA8L2Zvcm0+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KIAotICAgICAgPHRyPgotICAgICAgICA8dGg+Q2hvb3NlOjwvdGg+Ci0gICAgICAgIDx0ZCBpZD0idXNlcmxpc3QiLz4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPkNob29zZTo8L3RoPgorICAgICAgICAgIDx0ZCBpZD0idXNlcmxpc3QiLz4KKyAgICAgICAgPC90cj4KKyAgICAgIDwvdGFibGU+CiAKLSAgICA8aHIgLz4KLSAgICA8aDI+UmVnaXN0ZXI8L2gyPgotICAgIDxmb3JtIG1ldGhvZD0iUE9TVCI+Ci0gICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJjcmVhdGVfYWNjb3VudCIgLz4KLSAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJOZXcgQWNjb3VudCIgLz4KLSAgICA8L2Zvcm0+CisgICAgICA8aHIgLz4KKyAgICAgIDxoMj5SZWdpc3RlcjwvaDI+CisgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiPgorICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJjcmVhdGVfYWNjb3VudCIgLz4KKyAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9Ik5ldyBBY2NvdW50IiAvPgorICAgICAgPC9mb3JtPgorICAgIDwvZGl2PgorICAgIDxkaXYgc3R5bGU9ImNsZWFyOiBib3RoOyBtYXJnaW4tdG9wOiAxNXB4OyBwYWRkaW5nLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tOiAxNXB4OyI+CisgICAgICA8ZGl2IGlkPSJnZXJyaXRfZm9vdGVyIj48L2Rpdj4KKyAgICA8L2Rpdj4KICAgPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9Db25maWd1cmF0aW9uRXJyb3IuaHRtbCBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvQ29uZmlndXJhdGlvbkVycm9yLmh0bWwKaW5kZXggNzI5NDAxMi4uYTA1ZTFlYSAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2NvbnRhaW5lci9Db25maWd1cmF0aW9uRXJyb3IuaHRtbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0NvbmZpZ3VyYXRpb25FcnJvci5odG1sCkBAIC02NCw3ICs2NCw5IEBACiAgICAgICBSZXF1aXJlIHZhbGlkLXVzZXIKICAgICAgIC4uLgogICAgICZsdDsvTG9jYXRpb24mZ3Q7PC9kaXY+Ci0gICAgUHJveHlQYXNzIDxzcGFuIGNsYXNzPSdDb250ZXh0UGF0aCc+L3I8L3NwYW4+LyBodHRwOi8vLi4uPHNwYW4gY2xhc3M9J0NvbnRleHRQYXRoJz4vcjwvc3Bhbj4vCisKKyAgICBBbGxvd0VuY29kZWRTbGFzaGVzIE9uCisgICAgUHJveHlQYXNzIDxzcGFuIGNsYXNzPSdDb250ZXh0UGF0aCc+L3I8L3NwYW4+LyBodHRwOi8vLi4uPHNwYW4gY2xhc3M9J0NvbnRleHRQYXRoJz4vcjwvc3Bhbj4vIG5vZGVjb2RlCiAmbHQ7L1ZpcnR1YWxIb3N0Jmd0OwogICAgIDwvcHJlPgogICA8L2JvZHk+CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvY29udGFpbmVyL0xvZ2luUmVkaXJlY3QuaHRtbCBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvTG9naW5SZWRpcmVjdC5odG1sCmluZGV4IDcyYjU4OWYuLjQzM2JlMjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvTG9naW5SZWRpcmVjdC5odG1sCisrKyBiL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9jb250YWluZXIvTG9naW5SZWRpcmVjdC5odG1sCkBAIC0xLDQgKzEsNCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9zdHJpY3QuZHRkIj4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiPgogPGh0bWw+CiAgIDxoZWFkPgogICAgIDx0aXRsZT5HZXJyaXQgQ29kZSBSZXZpZXc8L3RpdGxlPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTG9naW5Gb3JtLmh0bWwgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvbGRhcC9Mb2dpbkZvcm0uaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2JjN2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL2xkYXAvTG9naW5Gb3JtLmh0bWwKQEAgLTAsMCArMSw4MyBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBTaWduIEluPC90aXRsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgI2Vycm9yX21lc3NhZ2UgeworICAgICAgICBwYWRkaW5nOiA1cHg7CisgICAgICAgIG1hcmdpbjogMmVtOworICAgICAgICB3aWR0aDogMjBlbTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAxMTYpOworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIH0KKyAgICAgICNjYW5jZWxfbGluayB7CisgICAgICAgIG1hcmdpbi1sZWZ0OiA0NXB4OworICAgICAgfQorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIGlkPSJnZXJyaXRfc2l0ZWNzcyIgdHlwZT0idGV4dC9jc3MiPjwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBpZD0iZ2Vycml0X3RvcG1lbnUiIHN0eWxlPSJoZWlnaHQ6NDVweDsiIGNsYXNzPSJnZXJyaXRUb3BNZW51Ij48L2Rpdj4KKyAgICA8ZGl2IGlkPSJnZXJyaXRfaGVhZGVyIj48L2Rpdj4KKyAgICA8ZGl2IGlkPSJnZXJyaXRfYm9keSIgY2xhc3M9ImdlcnJpdEJvZHkiPgorICAgICAgPGgxPlNpZ24gSW4gdG8gR2Vycml0IENvZGUgUmV2aWV3IGF0IDxzcGFuIGlkPSJob3N0TmFtZSI+ZXhhbXBsZS5jb208L3NwYW4+PC9oMT4KKyAgICAgIDxkaXYgaWQ9ImVycm9yX21lc3NhZ2UiPkludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuPC9kaXY+CisgICAgICA8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iIyIgaWQ9ImxvZ2luX2Zvcm0iPgorICAgICAgICA8dGFibGUgc3R5bGU9ImJvcmRlcjogMDsiPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRoPlVzZXJuYW1lPC90aD4KKyAgICAgICAgICA8dGQ+PGlucHV0IG5hbWU9InVzZXJuYW1lIiBpZD0iZl91c2VyIgorICAgICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dCIKKyAgICAgICAgICAgICAgICAgICAgIHNpemU9IjI1IgorICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9IjEiIC8+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aD5QYXNzd29yZDwvdGg+CisgICAgICAgICAgPHRkPjxpbnB1dCBuYW1lPSJwYXNzd29yZCIgaWQ9ImZfcGFzcyIKKyAgICAgICAgICAgICAgICAgICAgIHR5cGU9InBhc3N3b3JkIgorICAgICAgICAgICAgICAgICAgICAgc2l6ZT0iMjUiCisgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD0iMiIgLz48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjwvdGQ+CisgICAgICAgICAgPHRkPgorICAgICAgICAgICAgPGlucHV0IG5hbWU9InJlbWVtYmVybWUiIGlkPSJmX3JlbWVtYmVyIgorICAgICAgICAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgorICAgICAgICAgICAgICAgICAgIHZhbHVlPSIxIgorICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PSIzIiAvPgorICAgICAgICAgICAgPGxhYmVsIGZvcj0iZl9yZW1lbWJlciI+UmVtZW1iZXIgbWU8L2xhYmVsPgorICAgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2lnbiBJbiIgdGFiaW5kZXg9IjQiLz4KKyAgICAgICAgICAgIDxhIGhyZWY9Ii4uLyIgaWQ9ImNhbmNlbF9saW5rIj5DYW5jZWw8L2E+CisgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPC90YWJsZT4KKyAgICAgIDwvZm9ybT4KKyAgICAgIDxkaXYgc3R5bGU9ImNsZWFyOiBib3RoOyBtYXJnaW4tdG9wOiAxNXB4OyBwYWRkaW5nLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tOiAxNXB4OyI+CisgICAgICAgIDxkaXYgaWQ9ImdlcnJpdF9mb290ZXIiPjwvZGl2PgorICAgICAgPC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgbG9naW5fZm9ybSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbl9mb3JtJyk7CisgICAgICB2YXIgZl91c2VyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZfdXNlcicpOworICAgICAgdmFyIGZfcGFzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX3Bhc3MnKTsKKyAgICAgIGZfdXNlci5vbmtleWRvd24gPSBmdW5jdGlvbihlKSB7CisgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHsKKyAgICAgICAgICBmX3Bhc3MuZm9jdXMoKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZfcGFzcy5vbmtleWRvd24gPSBmdW5jdGlvbihlKSB7CisgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHsKKyAgICAgICAgICBsb2dpbl9mb3JtLnN1Ym1pdCgpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZl91c2VyLmZvY3VzKCk7CisgICAgPC9zY3JpcHQ+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0hvc3RQYWdlLmh0bWwgYi9nZXJyaXQtaHR0cGQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jhdy9Ib3N0UGFnZS5odG1sCmluZGV4IGZmMDlmNTAuLjkwNzQxNGYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0hvc3RQYWdlLmh0bWwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvSG9zdFBhZ2UuaHRtbApAQCAtMiwxMCArMiwxMCBAQAogICA8aGVhZD4KICAgICA8dGl0bGU+R2Vycml0IENvZGUgUmV2aWV3PC90aXRsZT4KICAgICA8bWV0YSBuYW1lPSJnd3Q6cHJvcGVydHkiIGNvbnRlbnQ9ImxvY2FsZT1lbl9VUyIgLz4KLSAgICA8c2NyaXB0IGlkPSJnZXJyaXRfZ3d0ZGV2bW9kZSI+CisgICAgPHNjcmlwdCBpZD0iZ3d0ZGV2bW9kZSI+CiAgICAgICAoZnVuY3Rpb24gKCkgewogICAgICAgICB2YXIgcG4gPSAnZ3d0LmNvZGVzdnInOwotICAgICAgICB2YXIgY24gPSAnZ2Vycml0LicgKyBwbjsKKyAgICAgICAgdmFyIGNuID0gJ2dlcnJpdF91aS4nICsgcG47CiAKICAgICAgICAgdmFyIHBfc3RhcnQgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluZGV4T2YocG4gKyAnPScpOwogICAgICAgICBpZiAocF9zdGFydCAhPSAtMSkgewpAQCAtMzIsNyArMzIsNyBAQAogICAgIDwvc2NyaXB0PgogICAgIDxzY3JpcHQgaWQ9ImdlcnJpdF9ob3N0cGFnZWRhdGEiPjwvc2NyaXB0PgogICAgIDxzdHlsZSAgaWQ9ImdlcnJpdF9zaXRlY3NzIiB0eXBlPSJ0ZXh0L2NzcyI+PC9zdHlsZT4KLSAgICA8bGluayByZWw9Imljb24iIHR5cGU9ImltYWdlL2dpZiIgaHJlZj0iZmF2aWNvbi5pY28iIC8+CisgICAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiB0eXBlPSJpbWFnZS94LWljb24iIGhyZWY9ImZhdmljb24uaWNvIiAvPgogICA8L2hlYWQ+CiAgIDxib2R5PgogICAgIDxkaXYgaWQ9ImdlcnJpdF90b3BtZW51Ij48L2Rpdj4KZGlmZiAtLWdpdCBhL2dlcnJpdC1odHRwZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvcmF3L0xlZ2FjeUdlcnJpdC5odG1sIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvTGVnYWN5R2Vycml0Lmh0bWwKaW5kZXggNTA1MGJmMi4uNjYzOWE1YiAxMDA2NDQKLS0tIGEvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvTGVnYWN5R2Vycml0Lmh0bWwKKysrIGIvZ2Vycml0LWh0dHBkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yYXcvTGVnYWN5R2Vycml0Lmh0bWwKQEAgLTEsNCArMSw0IEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3N0cmljdC5kdGQiPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+CiA8aHRtbD4KICAgPGhlYWQ+CiAgICAgPHRpdGxlPkdlcnJpdCBDb2RlIFJldmlldzwvdGl0bGU+CmRpZmYgLS1naXQgYS9nZXJyaXQtaHR0cGQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yZXN0YXBpL1BhcmFtZXRlclBhcnNlclRlc3QuamF2YSBiL2dlcnJpdC1odHRwZC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL3Jlc3RhcGkvUGFyYW1ldGVyUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYmM3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtaHR0cGQvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9yZXN0YXBpL1BhcmFtZXRlclBhcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQucmVzdGFwaTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uQXJyYXk7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QcmltaXRpdmU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEZvcm1Ub0pzb24oKSB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiB7CisgICAgSnNvbk9iamVjdCBvYmogPSBQYXJhbWV0ZXJQYXJzZXIuZm9ybVRvSnNvbigKKyAgICAgICAgSW1tdXRhYmxlTWFwLm9mKAorICAgICAgICAgICAgIm1lc3NhZ2UiLCBuZXcgU3RyaW5nW117InRoaXMuaXMudGV4dCJ9LAorICAgICAgICAgICAgImxhYmVscy5WZXJpZmllZCIsIG5ldyBTdHJpbmdbXXsiLTEifSwKKyAgICAgICAgICAgICJsYWJlbHMuQ29kZS1SZXZpZXciLCBuZXcgU3RyaW5nW117IjIifSwKKyAgICAgICAgICAgICJhX2xpc3QiLCBuZXcgU3RyaW5nW117ImEiLCAiYiJ9KSwKKyAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKCJxIikpOworCisgICAgSnNvbk9iamVjdCBsYWJlbHMgPSBuZXcgSnNvbk9iamVjdCgpOworICAgIGxhYmVscy5hZGRQcm9wZXJ0eSgiVmVyaWZpZWQiLCAiLTEiKTsKKyAgICBsYWJlbHMuYWRkUHJvcGVydHkoIkNvZGUtUmV2aWV3IiwgIjIiKTsKKyAgICBKc29uQXJyYXkgbGlzdCA9IG5ldyBKc29uQXJyYXkoKTsKKyAgICBsaXN0LmFkZChuZXcgSnNvblByaW1pdGl2ZSgiYSIpKTsKKyAgICBsaXN0LmFkZChuZXcgSnNvblByaW1pdGl2ZSgiYiIpKTsKKyAgICBKc29uT2JqZWN0IGV4cCA9IG5ldyBKc29uT2JqZWN0KCk7CisgICAgZXhwLmFkZFByb3BlcnR5KCJtZXNzYWdlIiwgInRoaXMuaXMudGV4dCIpOworICAgIGV4cC5hZGQoImxhYmVscyIsIGxhYmVscyk7CisgICAgZXhwLmFkZCgiYV9saXN0IiwgbGlzdCk7CisKKyAgICBhc3NlcnRFcXVhbHMoZXhwLCBvYmopOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtbGF1bmNoZXIvcG9tLnhtbCBiL2dlcnJpdC1sYXVuY2hlci9wb20ueG1sCmluZGV4IGU3MDAzNTEuLjViMGMxMTAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1sYXVuY2hlci9wb20ueG1sCisrKyBiL2dlcnJpdC1sYXVuY2hlci9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtbGF1bmNoZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9sYXVuY2hlci9HZXJyaXRMYXVuY2hlci5qYXZhIGIvZ2Vycml0LWxhdW5jaGVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvbGF1bmNoZXIvR2Vycml0TGF1bmNoZXIuamF2YQppbmRleCA5Y2NhNTU5Li5kNDljNmM3IDEwMDY0NAotLS0gYS9nZXJyaXQtbGF1bmNoZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9sYXVuY2hlci9HZXJyaXRMYXVuY2hlci5qYXZhCisrKyBiL2dlcnJpdC1sYXVuY2hlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2xhdW5jaGVyL0dlcnJpdExhdW5jaGVyLmphdmEKQEAgLTIwNiwyNyArMjA2LDEwIEBACiAgICAgICAgICAgZmluYWwgWmlwRW50cnkgemUgPSBlLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgaWYgKHplLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICh6ZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiV0VCLUlORi9saWIvIikpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gemUuZ2V0TmFtZSgpLnN1YnN0cmluZygiV0VCLUlORi9saWIvIi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIHRtcCA9IGNyZWF0ZVRlbXBGaWxlKHNhZmVOYW1lKHplKSwgIi5qYXIiKTsKLSAgICAgICAgICAgIGZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluID0gemYuZ2V0SW5wdXRTdHJlYW0oemUpOwotICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKLSAgICAgICAgICAgICAgICBpbnQgbjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCkpID4gMCkgewotICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZiwgMCwgbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgamFycy5wdXQobmFtZSwgdG1wLnRvVVJJKCkudG9VUkwoKSk7CisgICAgICAgICAgfSBlbHNlIGlmICh6ZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiV0VCLUlORi9saWIvIikpIHsKKyAgICAgICAgICAgIGV4dHJhY3RKYXIoemYsIHplLCBqYXJzKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHplLmdldE5hbWUoKS5zdGFydHNXaXRoKCJXRUItSU5GL3BnbS1saWIvIikpIHsKKyAgICAgICAgICAgIGV4dHJhY3RKYXIoemYsIHplLCBqYXJzKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gZmluYWxseSB7CkBAIC0yNDgsNyArMjMxLDcgQEAKICAgICBtb3ZlKGphcnMsICJqYXZheC5pbmplY3QtMS5qYXIiLCBleHRhcGkpOwogICAgIG1vdmUoamFycywgImFvcGFsbGlhbmNlLTEuMC5qYXIiLCBleHRhcGkpOwogICAgIG1vdmUoamFycywgImd1aWNlLXNlcnZsZXQtIiwgZXh0YXBpKTsKLSAgICBtb3ZlKGphcnMsICJzZXJ2bGV0LWFwaS0iLCBleHRhcGkpOworICAgIG1vdmUoamFycywgInRvbWNhdC1zZXJ2bGV0LWFwaS0iLCBleHRhcGkpOwogCiAgICAgQ2xhc3NMb2FkZXIgcGFyZW50ID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKICAgICBpZiAoIWV4dGFwaS5pc0VtcHR5KCkpIHsKQEAgLTI2MSw2ICsyNDQsMzEgQEAKICAgICAgICAgcGFyZW50KTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIHZvaWQgZXh0cmFjdEphcihaaXBGaWxlIHpmLCBaaXBFbnRyeSB6ZSwKKyAgICAgIFNvcnRlZE1hcDxTdHJpbmcsIFVSTD4gamFycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBGaWxlIHRtcCA9IGNyZWF0ZVRlbXBGaWxlKHNhZmVOYW1lKHplKSwgIi5qYXIiKTsKKyAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcCk7CisgICAgdHJ5IHsKKyAgICAgIElucHV0U3RyZWFtIGluID0gemYuZ2V0SW5wdXRTdHJlYW0oemUpOworICAgICAgdHJ5IHsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICBpbnQgbjsKKyAgICAgICAgd2hpbGUgKChuID0gaW4ucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpKSA+IDApIHsKKyAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBuKTsKKyAgICAgICAgfQorICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgb3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgU3RyaW5nIG5hbWUgPSB6ZS5nZXROYW1lKCk7CisgICAgamFycy5wdXQoCisgICAgICAgIG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy8nKSwgbmFtZS5sZW5ndGgoKSksCisgICAgICAgIHRtcC50b1VSSSgpLnRvVVJMKCkpOworICB9CisKICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtb3ZlKFNvcnRlZE1hcDxTdHJpbmcsIFVSTD4gamFycywKICAgICAgIFN0cmluZyBwcmVmaXgsCiAgICAgICBMaXN0PFVSTD4gZXh0YXBpKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtbWFpbi9wb20ueG1sIGIvZ2Vycml0LW1haW4vcG9tLnhtbAppbmRleCBiYjJkNzYzLi5jZjY3MjYxIDEwMDY0NAotLS0gYS9nZXJyaXQtbWFpbi9wb20ueG1sCisrKyBiL2dlcnJpdC1tYWluL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1tYWluPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9nZXJyaXQtb3BlbmlkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwppbmRleCBmOWZlMzQ1Li44MzlkNjQ3IDEwMDY0NAotLS0gYS9nZXJyaXQtb3BlbmlkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgYi9nZXJyaXQtb3BlbmlkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpAQCAtMSw0ICsxLDUgQEAKIGVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCiBlbmNvZGluZy8vc3JjL21haW4vamF2YT1VVEYtOAorZW5jb2RpbmcvL3NyYy9tYWluL3Jlc291cmNlcz1VVEYtOAogZW5jb2RpbmcvL3NyYy90ZXN0L2phdmE9VVRGLTgKIGVuY29kaW5nLzxwcm9qZWN0Pj1VVEYtOApkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC9wb20ueG1sIGIvZ2Vycml0LW9wZW5pZC9wb20ueG1sCmluZGV4IDAxZTJlM2UuLjdiZDhmYmYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1vcGVuaWQvcG9tLnhtbAorKysgYi9nZXJyaXQtb3BlbmlkL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1vcGVuaWQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvRGlzY292ZXJ5UmVzdWx0LmphdmEgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvRGlzY292ZXJ5UmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExZjI5YQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9EaXNjb3ZlcnlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitmaW5hbCBjbGFzcyBEaXNjb3ZlcnlSZXN1bHQgeworICBzdGF0aWMgZW51bSBTdGF0dXMgeworICAgIC8qKiBQcm92aWRlciB3YXMgZGlzY292ZXJlZCBhbmQge0Bjb2RlIHByb3ZpZGVyVXJsfSBpcyB2YWxpZC4gKi8KKyAgICBWQUxJRCwKKworICAgIC8qKiBJZGVudGlmaWVyIGlzbid0IGZvciBhbiBPcGVuSUQgcHJvdmlkZXIuICovCisgICAgTk9fUFJPVklERVIsCisKKyAgICAvKiogVGhlIHByb3ZpZGVyIHdhcyBkaXNjb3ZlcmVkLCBidXQgc29tZXRoaW5nIGVsc2UgZmFpbGVkLiAqLworICAgIEVSUk9SOworICB9CisKKyAgU3RhdHVzIHN0YXR1czsKKyAgU3RyaW5nIHByb3ZpZGVyVXJsOworICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3ZpZGVyQXJnczsKKworICBEaXNjb3ZlcnlSZXN1bHQoKSB7CisgIH0KKworICBEaXNjb3ZlcnlSZXN1bHQoU3RyaW5nIHJlZGlyZWN0LCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MpIHsKKyAgICBzdGF0dXMgPSBTdGF0dXMuVkFMSUQ7CisgICAgcHJvdmlkZXJVcmwgPSByZWRpcmVjdDsKKyAgICBwcm92aWRlckFyZ3MgPSBhcmdzOworICB9CisKKyAgRGlzY292ZXJ5UmVzdWx0KFN0YXR1cyBzKSB7CisgICAgc3RhdHVzID0gczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL0xvZ2luRm9ybS5qYXZhIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL0xvZ2luRm9ybS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGVjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvTG9naW5Gb3JtLmphdmEKQEAgLTAsMCArMSwzMTAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLm9wZW5pZDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5QYWdlTGlua3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLk9wZW5JZFVybHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5IdG1sRG9tVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC50ZW1wbGF0ZS5TaXRlSGVhZGVyRm9vdGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKiBIYW5kbGVzIE9wZW5JRCBiYXNlZCBsb2dpbiBmbG93LiAqLworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCitAU2luZ2xldG9uCitjbGFzcyBMb2dpbkZvcm0gZXh0ZW5kcyBIdHRwU2VydmxldCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMb2dpbkZvcm0uY2xhc3MpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IEFMTF9QUk9WSURFUlMgPSBJbW11dGFibGVNYXAub2YoCisgICAgICAiZ29vZ2xlIiwgT3BlbklkVXJscy5VUkxfR09PR0xFLAorICAgICAgInlhaG9vIiwgT3BlbklkVXJscy5VUkxfWUFIT08pOworCisgIHByaXZhdGUgZmluYWwgSW1tdXRhYmxlU2V0PFN0cmluZz4gc3VnZ2VzdFByb3ZpZGVyczsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIE9wZW5JZFNlcnZpY2VJbXBsIGltcGw7CisgIHByaXZhdGUgZmluYWwgaW50IG1heFJlZGlyZWN0VXJsTGVuZ3RoOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBzc29Vcmw7CisgIHByaXZhdGUgZmluYWwgU2l0ZUhlYWRlckZvb3RlciBoZWFkZXI7CisKKyAgQEluamVjdAorICBMb2dpbkZvcm0oCisgICAgICBAQ2Fub25pY2FsV2ViVXJsIEBOdWxsYWJsZSBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyLAorICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnLAorICAgICAgQXV0aENvbmZpZyBhdXRoQ29uZmlnLAorICAgICAgT3BlbklkU2VydmljZUltcGwgaW1wbCwKKyAgICAgIFNpdGVIZWFkZXJGb290ZXIgaGVhZGVyKSB7CisgICAgdGhpcy51cmxQcm92aWRlciA9IHVybFByb3ZpZGVyOworICAgIHRoaXMuaW1wbCA9IGltcGw7CisgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgdGhpcy5tYXhSZWRpcmVjdFVybExlbmd0aCA9IGNvbmZpZy5nZXRJbnQoCisgICAgICAgICJvcGVuaWQiLCAibWF4UmVkaXJlY3RVcmxMZW5ndGgiLAorICAgICAgICAxMCk7CisKKyAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KHVybFByb3ZpZGVyLmdldCgpKSkgeworICAgICAgbG9nLmVycm9yKCJnZXJyaXQuY2Fub25pY2FsV2ViVXJsIG11c3QgYmUgc2V0IGluIGdlcnJpdC5jb25maWciKTsKKyAgICB9CisKKyAgICBpZiAoYXV0aENvbmZpZy5nZXRBdXRoVHlwZSgpID09IEF1dGhUeXBlLk9QRU5JRF9TU08pIHsKKyAgICAgIHN1Z2dlc3RQcm92aWRlcnMgPSBJbW11dGFibGVTZXQub2YoKTsKKyAgICAgIHNzb1VybCA9IGF1dGhDb25maWcuZ2V0T3BlbklkU3NvVXJsKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNldDxTdHJpbmc+IHByb3ZpZGVycyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBBTExfUFJPVklERVJTLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgaWYgKGltcGwuaXNBbGxvd2VkT3BlbklEKGUuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICBwcm92aWRlcnMuYWRkKGUuZ2V0S2V5KCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdWdnZXN0UHJvdmlkZXJzID0gSW1tdXRhYmxlU2V0LmNvcHlPZihwcm92aWRlcnMpOworICAgICAgc3NvVXJsID0gbnVsbDsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9HZXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGlmIChzc29VcmwgIT0gbnVsbCkgeworICAgICAgU3RyaW5nIHRva2VuID0gZ2V0VG9rZW4ocmVxKTsKKyAgICAgIFNpZ25Jbk1vZGUgbW9kZTsKKyAgICAgIGlmIChQYWdlTGlua3MuUkVHSVNURVIuZXF1YWxzKHRva2VuKSkgeworICAgICAgICBtb2RlID0gU2lnbkluTW9kZS5SRUdJU1RFUjsKKyAgICAgICAgdG9rZW4gPSBQYWdlTGlua3MuTUlORTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1vZGUgPSBTaWduSW5Nb2RlLlNJR05fSU47CisgICAgICB9CisgICAgICBkaXNjb3ZlcihyZXEsIHJlcywgZmFsc2UsIHNzb1VybCwgZmFsc2UsIHRva2VuLCBtb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIGlkID0gU3RyaW5ncy5udWxsVG9FbXB0eShyZXEuZ2V0UGFyYW1ldGVyKCJpZCIpKS50cmltKCk7CisgICAgICBpZiAoIWlkLmlzRW1wdHkoKSkgeworICAgICAgICBkb1Bvc3QocmVxLCByZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbGVhbiBsaW5rID0gcmVxLmdldFBhcmFtZXRlcigibGluayIpICE9IG51bGw7CisgICAgICAgIHNlbmRGb3JtKHJlcSwgcmVzLCBsaW5rLCBudWxsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZG9Qb3N0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBib29sZWFuIGxpbmsgPSByZXEuZ2V0UGFyYW1ldGVyKCJsaW5rIikgIT0gbnVsbDsKKyAgICBTdHJpbmcgaWQgPSBTdHJpbmdzLm51bGxUb0VtcHR5KHJlcS5nZXRQYXJhbWV0ZXIoImlkIikpLnRyaW0oKTsKKyAgICBpZiAoaWQuaXNFbXB0eSgpKSB7CisgICAgICBzZW5kRm9ybShyZXEsIHJlcywgbGluaywgbnVsbCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghaWQuc3RhcnRzV2l0aCgiaHR0cDovLyIpICYmICFpZC5zdGFydHNXaXRoKCJodHRwczovLyIpKSB7CisgICAgICBpZCA9ICJodHRwOi8vIiArIGlkOworICAgIH0KKyAgICBpZiAoKHNzb1VybCAhPSBudWxsICYmICFzc29VcmwuZXF1YWxzKGlkKSkgfHwgIWltcGwuaXNBbGxvd2VkT3BlbklEKGlkKSkgeworICAgICAgc2VuZEZvcm0ocmVxLCByZXMsIGxpbmssICJPcGVuSUQgcHJvdmlkZXIgbm90IHBlcm1pdHRlZCBieSBzaXRlIHBvbGljeS4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sZWFuIHJlbWVtYmVyID0gIjEiLmVxdWFscyhyZXEuZ2V0UGFyYW1ldGVyKCJyZW1lbWJlcm1lIikpOworICAgIFN0cmluZyB0b2tlbiA9IGdldFRva2VuKHJlcSk7CisgICAgU2lnbkluTW9kZSBtb2RlOworICAgIGlmIChsaW5rKSB7CisgICAgICBtb2RlID0gU2lnbkluTW9kZS5MSU5LX0lERU5USVk7CisgICAgfSBlbHNlIGlmIChQYWdlTGlua3MuUkVHSVNURVIuZXF1YWxzKHRva2VuKSkgeworICAgICAgbW9kZSA9IFNpZ25Jbk1vZGUuUkVHSVNURVI7CisgICAgICB0b2tlbiA9IFBhZ2VMaW5rcy5NSU5FOworICAgIH0gZWxzZSB7CisgICAgICBtb2RlID0gU2lnbkluTW9kZS5TSUdOX0lOOworICAgIH0KKworICAgIGRpc2NvdmVyKHJlcSwgcmVzLCBsaW5rLCBpZCwgcmVtZW1iZXIsIHRva2VuLCBtb2RlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBkaXNjb3ZlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgIGJvb2xlYW4gbGluaywgU3RyaW5nIGlkLCBib29sZWFuIHJlbWVtYmVyLCBTdHJpbmcgdG9rZW4sIFNpZ25Jbk1vZGUgbW9kZSkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHNzb1VybCAhPSBudWxsKSB7CisgICAgICByZW1lbWJlciA9IGZhbHNlOworICAgIH0KKworICAgIERpc2NvdmVyeVJlc3VsdCByID0gaW1wbC5kaXNjb3ZlcihyZXEsIGlkLCBtb2RlLCByZW1lbWJlciwgdG9rZW4pOworICAgIHN3aXRjaCAoci5zdGF0dXMpIHsKKyAgICAgIGNhc2UgVkFMSUQ6CisgICAgICAgIHJlZGlyZWN0KHIsIHJlcyk7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIE5PX1BST1ZJREVSOgorICAgICAgICBzZW5kRm9ybShyZXEsIHJlcywgbGluaywKKyAgICAgICAgICAgICJQcm92aWRlciBpcyBub3Qgc3VwcG9ydGVkLCBvciB3YXMgaW5jb3JyZWN0bHkgZW50ZXJlZC4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRVJST1I6CisgICAgICAgIHNlbmRGb3JtKHJlcSwgcmVzLCBsaW5rLCAiVW5hYmxlIHRvIGNvbm5lY3Qgd2l0aCBPcGVuSUQgcHJvdmlkZXIuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWRpcmVjdChEaXNjb3ZlcnlSZXN1bHQgciwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZ0J1aWxkZXIgdXJsID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICB1cmwuYXBwZW5kKHIucHJvdmlkZXJVcmwpOworICAgIGlmIChyLnByb3ZpZGVyQXJncyAhPSBudWxsICYmICFyLnByb3ZpZGVyQXJncy5pc0VtcHR5KCkpIHsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gYXJnIDogci5wcm92aWRlckFyZ3MuZW50cnlTZXQoKSkgeworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKCc/Jyk7CisgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1cmwuYXBwZW5kKCcmJyk7CisgICAgICAgIH0KKyAgICAgICAgdXJsLmFwcGVuZChVcmwuZW5jb2RlKGFyZy5nZXRLZXkoKSkpCisgICAgICAgICAgIC5hcHBlbmQoJz0nKQorICAgICAgICAgICAuYXBwZW5kKFVybC5lbmNvZGUoYXJnLmdldFZhbHVlKCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHVybC5sZW5ndGgoKSA8PSBtYXhSZWRpcmVjdFVybExlbmd0aCkgeworICAgICAgcmVzLnNlbmRSZWRpcmVjdCh1cmwudG9TdHJpbmcoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRG9jdW1lbnQgZG9jID0gSHRtbERvbVV0aWwucGFyc2VGaWxlKExvZ2luRm9ybS5jbGFzcywgIlJlZGlyZWN0Rm9ybS5odG1sIik7CisgICAgRWxlbWVudCBmb3JtID0gSHRtbERvbVV0aWwuZmluZChkb2MsICJyZWRpcmVjdF9mb3JtIik7CisgICAgZm9ybS5zZXRBdHRyaWJ1dGUoImFjdGlvbiIsIHIucHJvdmlkZXJVcmwpOworICAgIGlmIChyLnByb3ZpZGVyQXJncyAhPSBudWxsICYmICFyLnByb3ZpZGVyQXJncy5pc0VtcHR5KCkpIHsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBhcmcgOiByLnByb3ZpZGVyQXJncy5lbnRyeVNldCgpKSB7CisgICAgICAgIEVsZW1lbnQgaW4gPSBkb2MuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKKyAgICAgICAgaW4uc2V0QXR0cmlidXRlKCJ0eXBlIiwgImhpZGRlbiIpOworICAgICAgICBpbi5zZXRBdHRyaWJ1dGUoIm5hbWUiLCBhcmcuZ2V0S2V5KCkpOworICAgICAgICBpbi5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgYXJnLmdldFZhbHVlKCkpOworICAgICAgICBmb3JtLmFwcGVuZENoaWxkKGluKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2VuZEh0bWwocmVzLCBkb2MpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRva2VuKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKyAgICBTdHJpbmcgdG9rZW4gPSByZXEuZ2V0UGF0aEluZm8oKTsKKyAgICBpZiAodG9rZW4gPT0gbnVsbCB8fCB0b2tlbi5pc0VtcHR5KCkpIHsKKyAgICAgIHRva2VuID0gUGFnZUxpbmtzLk1JTkU7CisgICAgfSBlbHNlIGlmICghdG9rZW4uc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICB0b2tlbiA9ICIvIiArIHRva2VuOworICAgIH0KKyAgICByZXR1cm4gdG9rZW47CisgIH0KKworICBwcml2YXRlIHZvaWQgc2VuZEZvcm0oSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXMsCisgICAgICBib29sZWFuIGxpbmssIEBOdWxsYWJsZSBTdHJpbmcgZXJyb3JNZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBzZWxmID0gcmVxLmdldFJlcXVlc3RVUkkoKTsKKyAgICBTdHJpbmcgY2FuY2VsID0gT2JqZWN0cy5maXJzdE5vbk51bGwodXJsUHJvdmlkZXIuZ2V0KCksICIvIik7CisgICAgU3RyaW5nIHRva2VuID0gZ2V0VG9rZW4ocmVxKTsKKyAgICBpZiAoIXRva2VuLmVxdWFscygiLyIpKSB7CisgICAgICBjYW5jZWwgKz0gIiMiICsgdG9rZW47CisgICAgfQorCisgICAgRG9jdW1lbnQgZG9jID0gaGVhZGVyLnBhcnNlKExvZ2luRm9ybS5jbGFzcywgIkxvZ2luRm9ybS5odG1sIik7CisgICAgSHRtbERvbVV0aWwuZmluZChkb2MsICJob3N0TmFtZSIpLnNldFRleHRDb250ZW50KHJlcS5nZXRTZXJ2ZXJOYW1lKCkpOworICAgIEh0bWxEb21VdGlsLmZpbmQoZG9jLCAibG9naW5fZm9ybSIpLnNldEF0dHJpYnV0ZSgiYWN0aW9uIiwgc2VsZik7CisgICAgSHRtbERvbVV0aWwuZmluZChkb2MsICJjYW5jZWxfbGluayIpLnNldEF0dHJpYnV0ZSgiaHJlZiIsIGNhbmNlbCk7CisKKyAgICBpZiAoIWxpbmsgfHwgc3NvVXJsICE9IG51bGwpIHsKKyAgICAgIEVsZW1lbnQgaW5wdXQgPSBIdG1sRG9tVXRpbC5maW5kKGRvYywgImZfbGluayIpOworICAgICAgaW5wdXQuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKGlucHV0KTsKKyAgICB9CisKKyAgICBTdHJpbmcgbGFzdCA9IGdldExhc3RJZChyZXEpOworICAgIGlmIChsYXN0ICE9IG51bGwpIHsKKyAgICAgIEh0bWxEb21VdGlsLmZpbmQoZG9jLCAiZl9vcGVuaWQiKS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwgbGFzdCk7CisgICAgfQorCisgICAgRWxlbWVudCBlbXNnID0gSHRtbERvbVV0aWwuZmluZChkb2MsICJlcnJvcl9tZXNzYWdlIik7CisgICAgaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShlcnJvck1lc3NhZ2UpKSB7CisgICAgICBlbXNnLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChlbXNnKTsKKyAgICB9IGVsc2UgeworICAgICAgZW1zZy5zZXRUZXh0Q29udGVudChlcnJvck1lc3NhZ2UpOworICAgIH0KKworICAgIGZvciAoU3RyaW5nIG5hbWUgOiBBTExfUFJPVklERVJTLmtleVNldCgpKSB7CisgICAgICBFbGVtZW50IGRpdiA9IEh0bWxEb21VdGlsLmZpbmQoZG9jLCAicHJvdmlkZXJfIiArIG5hbWUpOworICAgICAgaWYgKGRpdiA9PSBudWxsKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKCFzdWdnZXN0UHJvdmlkZXJzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgIGRpdi5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZGl2KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBFbGVtZW50IGEgPSBIdG1sRG9tVXRpbC5maW5kKGRpdiwgImlkXyIgKyBuYW1lKTsKKyAgICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgICAgZGl2LmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChkaXYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFN0cmluZ0J1aWxkZXIgdSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICB1LmFwcGVuZChzZWxmKS5hcHBlbmQoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSk7CisgICAgICBpZiAobGluaykgeworICAgICAgICB1LmFwcGVuZCgiJmxpbmsiKTsKKyAgICAgIH0KKyAgICAgIGEuc2V0QXR0cmlidXRlKCJocmVmIiwgdS50b1N0cmluZygpKTsKKyAgICB9CisgICAgc2VuZEh0bWwocmVzLCBkb2MpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNlbmRIdG1sKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzLCBEb2N1bWVudCBkb2MpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIGJ5dGVbXSBiaW4gPSBIdG1sRG9tVXRpbC50b1VURjgoZG9jKTsKKyAgICByZXMuc2V0U3RhdHVzKEh0dHBTZXJ2bGV0UmVzcG9uc2UuU0NfVU5BVVRIT1JJWkVEKTsKKyAgICByZXMuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOworICAgIHJlcy5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKKyAgICByZXMuc2V0Q29udGVudExlbmd0aChiaW4ubGVuZ3RoKTsKKyAgICBTZXJ2bGV0T3V0cHV0U3RyZWFtIG91dCA9IHJlcy5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICB0cnkgeworICAgICAgb3V0LndyaXRlKGJpbik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYXN0SWQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgIENvb2tpZVtdIGNvb2tpZXMgPSByZXEuZ2V0Q29va2llcygpOworICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgIGZvciAoQ29va2llIGMgOiBjb29raWVzKSB7CisgICAgICAgIGlmIChPcGVuSWRVcmxzLkxBU1RJRF9DT09LSUUuZXF1YWxzKGMuZ2V0TmFtZSgpKSkgeworICAgICAgICAgIHJldHVybiBjLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRMb2dpblNlcnZsZXQuamF2YSBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRMb2dpblNlcnZsZXQuamF2YQppbmRleCBjZmI3NjdkLi40Y2JiMjJmIDEwMDY0NAotLS0gYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkTG9naW5TZXJ2bGV0LmphdmEKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL09wZW5JZExvZ2luU2VydmxldC5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dGV4cHVpLnNlcnZlci5DYWNoZUhlYWRlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIApAQCAtNDQsOSArNDUsNyBAQAogICBwdWJsaWMgdm9pZCBkb1Bvc3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByc3ApCiAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIHRyeSB7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJFeHBpcmVzIiwgIkZyaSwgMDEgSmFuIDE5ODAgMDA6MDA6MDAgR01UIik7Ci0gICAgICByc3Auc2V0SGVhZGVyKCJQcmFnbWEiLCAibm8tY2FjaGUiKTsKLSAgICAgIHJzcC5zZXRIZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSIpOworICAgICAgQ2FjaGVIZWFkZXJzLnNldE5vdENhY2hlYWJsZShyc3ApOwogICAgICAgaW1wbC5kb0F1dGgocmVxLCByc3ApOwogICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICBnZXRTZXJ2bGV0Q29udGV4dCgpLmxvZygiVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgYXV0aGVudGljYXRpb24iLCBlKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRNb2R1bGUuamF2YSBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9PcGVuSWRNb2R1bGUuamF2YQppbmRleCBhOTI4Y2I4Li5jODdhMGNmIDEwMDY0NAotLS0gYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL09wZW5JZE1vZHVsZS5qYXZhCkBAIC0xNCwyMiArMTQsMTYgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLm9wZW5pZDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnJwYy5ScGNTZXJ2bGV0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuU2VydmxldE1vZHVsZTsKIAotLyoqIFNlcnZsZXRzIGFuZCBSUEMgc3VwcG9ydCByZWxhdGVkIHRvIE9wZW5JRCBhdXRoZW50aWNhdGlvbi4gKi8KKy8qKiBTZXJ2bGV0cyByZWxhdGVkIHRvIE9wZW5JRCBhdXRoZW50aWNhdGlvbi4gKi8KIHB1YmxpYyBjbGFzcyBPcGVuSWRNb2R1bGUgZXh0ZW5kcyBTZXJ2bGV0TW9kdWxlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNlcnZsZXRzKCkgeworICAgIHNlcnZlKCIvbG9naW4iLCAiL2xvZ2luLyoiKS53aXRoKExvZ2luRm9ybS5jbGFzcyk7CiAgICAgc2VydmUoIi8iICsgT3BlbklkU2VydmljZUltcGwuUkVUVVJOX1VSTCkud2l0aChPcGVuSWRMb2dpblNlcnZsZXQuY2xhc3MpOwogICAgIHNlcnZlKCIvIiArIFhyZHNTZXJ2bGV0LkxPQ0FUSU9OKS53aXRoKFhyZHNTZXJ2bGV0LmNsYXNzKTsKICAgICBmaWx0ZXIoIi8iKS50aHJvdWdoKFhyZHNGaWx0ZXIuY2xhc3MpOwotCi0gICAgaW5zdGFsbChuZXcgUnBjU2VydmxldE1vZHVsZShScGNTZXJ2bGV0TW9kdWxlLlBSRUZJWCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTZXJ2bGV0cygpIHsKLSAgICAgICAgcnBjKE9wZW5JZFNlcnZpY2VJbXBsLmNsYXNzKTsKLSAgICAgIH0KLSAgICB9KTsKKyAgICBiaW5kKE9wZW5JZFNlcnZpY2VJbXBsLmNsYXNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL09wZW5JZFNlcnZpY2VJbXBsLmphdmEgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZUltcGwuamF2YQppbmRleCAwOWE1ZDEwLi41ZDc0MTY2IDEwMDY0NAotLS0gYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZUltcGwuamF2YQorKysgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvT3BlbklkU2VydmljZUltcGwuamF2YQpAQCAtMTUsMjMgKzE1LDE4IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLmF1dGgub3BlbmlkOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5TaWduSW5Nb2RlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5EaXNjb3ZlcnlSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmF1dGgub3BlbmlkLk9wZW5JZFByb3ZpZGVyUGF0dGVybjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5vcGVuaWQuT3BlbklkU2VydmljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uYXV0aC5vcGVuaWQuT3BlbklkVXJsczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViU2Vzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlVybEVuY29kZWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoTWV0aG9kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLm9wZW5pZC5PcGVuSWRQcm92aWRlclBhdHRlcm47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ29uZmlnVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dGpzb25ycGMuY29tbW9uLkFzeW5jQ2FsbGJhY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleVV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwpAQCAtNjgsMTMgKzYzLDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5Db29raWU7CiBpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKIAogQFNpbmdsZXRvbgotY2xhc3MgT3BlbklkU2VydmljZUltcGwgaW1wbGVtZW50cyBPcGVuSWRTZXJ2aWNlIHsKK2NsYXNzIE9wZW5JZFNlcnZpY2VJbXBsIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9CiAgICAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPcGVuSWRTZXJ2aWNlSW1wbC5jbGFzcyk7CiAKQEAgLTk4LDEwICs5MiwxMSBAQAogCiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8V2ViU2Vzc2lvbj4gd2ViU2Vzc2lvbjsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxJZGVudGlmaWVkVXNlcj4gaWRlbnRpZmllZFVzZXI7Ci0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDYW5vbmljYWxXZWJVcmwgdXJsUHJvdmlkZXI7CiAgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7CiAgIHByaXZhdGUgZmluYWwgQ29uc3VtZXJNYW5hZ2VyIG1hbmFnZXI7CiAgIHByaXZhdGUgZmluYWwgTGlzdDxPcGVuSWRQcm92aWRlclBhdHRlcm4+IGFsbG93ZWRPcGVuSURzOworICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBvcGVuSWREb21haW5zOwogCiAgIC8qKiBNYXhpbXVtIGFnZSwgaW4gc2Vjb25kcywgYmVmb3JlIGZvcmNpbmcgcmUtYXV0aGVudGljYXRpb24gb2YgYWNjb3VudC4gKi8KICAgcHJpdmF0ZSBmaW5hbCBpbnQgcGFwZU1heEF1dGhBZ2U7CkBAIC0xMDksNyArMTA0LDcgQEAKICAgQEluamVjdAogICBPcGVuSWRTZXJ2aWNlSW1wbChmaW5hbCBQcm92aWRlcjxXZWJTZXNzaW9uPiBjZiwKICAgICAgIGZpbmFsIFByb3ZpZGVyPElkZW50aWZpZWRVc2VyPiBpdSwKLSAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXAsCisgICAgICBDYW5vbmljYWxXZWJVcmwgdXAsCiAgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjb25maWcsIGZpbmFsIEF1dGhDb25maWcgYWMsCiAgICAgICBmaW5hbCBBY2NvdW50TWFuYWdlciBhbSkgdGhyb3dzIENvbnN1bWVyRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewogCkBAIC0xNDMsMjQgKzEzOCwxOCBAQAogICAgIGFjY291bnRNYW5hZ2VyID0gYW07CiAgICAgbWFuYWdlciA9IG5ldyBDb25zdW1lck1hbmFnZXIoKTsKICAgICBhbGxvd2VkT3BlbklEcyA9IGFjLmdldEFsbG93ZWRPcGVuSURzKCk7CisgICAgb3BlbklkRG9tYWlucyA9IGFjLmdldE9wZW5JZERvbWFpbnMoKTsKICAgICBwYXBlTWF4QXV0aEFnZSA9IChpbnQpIENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY29uZmlnLCAvLwogICAgICAgICAiYXV0aCIsIG51bGwsICJtYXhPcGVuSWRTZXNzaW9uQWdlIiwgLTEsIFRpbWVVbml0LlNFQ09ORFMpOwogICB9CiAKICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyB2b2lkIGRpc2NvdmVyKGZpbmFsIFN0cmluZyBvcGVuaWRJZGVudGlmaWVyLCBmaW5hbCBTaWduSW5Nb2RlIG1vZGUsCi0gICAgICBmaW5hbCBib29sZWFuIHJlbWVtYmVyLCBmaW5hbCBTdHJpbmcgcmV0dXJuVG9rZW4sCi0gICAgICBmaW5hbCBBc3luY0NhbGxiYWNrPERpc2NvdmVyeVJlc3VsdD4gY2IpIHsKLSAgICBpZiAoIWlzQWxsb3dlZE9wZW5JRChvcGVuaWRJZGVudGlmaWVyKSkgewotICAgICAgY2Iub25TdWNjZXNzKG5ldyBEaXNjb3ZlcnlSZXN1bHQoRGlzY292ZXJ5UmVzdWx0LlN0YXR1cy5OT1RfQUxMT1dFRCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQorICBEaXNjb3ZlcnlSZXN1bHQgZGlzY292ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgU3RyaW5nIG9wZW5pZElkZW50aWZpZXIsCisgICAgICBmaW5hbCBTaWduSW5Nb2RlIG1vZGUsIGZpbmFsIGJvb2xlYW4gcmVtZW1iZXIsIGZpbmFsIFN0cmluZyByZXR1cm5Ub2tlbikgewogICAgIGZpbmFsIFN0YXRlIHN0YXRlOwotICAgIHN0YXRlID0gaW5pdChvcGVuaWRJZGVudGlmaWVyLCBtb2RlLCByZW1lbWJlciwgcmV0dXJuVG9rZW4pOworICAgIHN0YXRlID0gaW5pdChyZXEsIG9wZW5pZElkZW50aWZpZXIsIG1vZGUsIHJlbWVtYmVyLCByZXR1cm5Ub2tlbik7CiAgICAgaWYgKHN0YXRlID09IG51bGwpIHsKLSAgICAgIGNiLm9uU3VjY2VzcyhuZXcgRGlzY292ZXJ5UmVzdWx0KERpc2NvdmVyeVJlc3VsdC5TdGF0dXMuTk9fUFJPVklERVIpKTsKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBuZXcgRGlzY292ZXJ5UmVzdWx0KERpc2NvdmVyeVJlc3VsdC5TdGF0dXMuTk9fUFJPVklERVIpOwogICAgIH0KIAogICAgIGZpbmFsIEF1dGhSZXF1ZXN0IGFSZXE7CkBAIC0xODgsMTYgKzE3NywxNSBAQAogICAgICAgfQogICAgIH0gY2F0Y2ggKE1lc3NhZ2VFeGNlcHRpb24gZSkgewogICAgICAgbG9nLmVycm9yKCJDYW5ub3QgY3JlYXRlIE9wZW5JRCByZWRpcmVjdCBmb3IgIiArIG9wZW5pZElkZW50aWZpZXIsIGUpOwotICAgICAgY2Iub25TdWNjZXNzKG5ldyBEaXNjb3ZlcnlSZXN1bHQoRGlzY292ZXJ5UmVzdWx0LlN0YXR1cy5FUlJPUikpOwotICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuIG5ldyBEaXNjb3ZlcnlSZXN1bHQoRGlzY292ZXJ5UmVzdWx0LlN0YXR1cy5FUlJPUik7CiAgICAgfSBjYXRjaCAoQ29uc3VtZXJFeGNlcHRpb24gZSkgewogICAgICAgbG9nLmVycm9yKCJDYW5ub3QgY3JlYXRlIE9wZW5JRCByZWRpcmVjdCBmb3IgIiArIG9wZW5pZElkZW50aWZpZXIsIGUpOwotICAgICAgY2Iub25TdWNjZXNzKG5ldyBEaXNjb3ZlcnlSZXN1bHQoRGlzY292ZXJ5UmVzdWx0LlN0YXR1cy5FUlJPUikpOwotICAgICAgcmV0dXJuOworICAgICAgcmV0dXJuIG5ldyBEaXNjb3ZlcnlSZXN1bHQoRGlzY292ZXJ5UmVzdWx0LlN0YXR1cy5FUlJPUik7CiAgICAgfQogCi0gICAgY2Iub25TdWNjZXNzKG5ldyBEaXNjb3ZlcnlSZXN1bHQoYVJlcS5nZXREZXN0aW5hdGlvblVybChmYWxzZSksIC8vCi0gICAgICAgIGFSZXEuZ2V0UGFyYW1ldGVyTWFwKCkpKTsKKyAgICByZXR1cm4gbmV3IERpc2NvdmVyeVJlc3VsdCgKKyAgICAgICAgYVJlcS5nZXREZXN0aW5hdGlvblVybChmYWxzZSksCisgICAgICAgIGFSZXEuZ2V0UGFyYW1ldGVyTWFwKCkpOwogICB9CiAKICAgcHJpdmF0ZSBib29sZWFuIHJlcXVlc3RSZWdpc3RyYXRpb24oZmluYWwgQXV0aFJlcXVlc3QgYVJlcSkgewpAQCAtMjA4LDcgKzE5Niw2IEBACiAgICAgICAvLyByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24sIGluIGNhc2UgdGhlIGlkZW50aXR5IGlzIG5ldyB0byB1cy4KICAgICAgIC8vCiAgICAgICByZXR1cm4gdHJ1ZTsKLQogICAgIH0KIAogICAgIC8vIFdlIG1pZ2h0IGFscmVhZHkgaGF2ZSB0aGlzIGFjY291bnQgb24gZmlsZS4gTG9vayBmb3IgaXQuCkBAIC0yMjEsNyArMjA4LDcgQEAKICAgICB9CiAgIH0KIAotICAvKiogQ2FsbGVkIGJ5IHtAbGluayBPcGVuSWRMb2dpblNlcnZsZXR9IGRvR2V0LCBkb1Bvc3QgKi8KKyAgLyoqIENhbGxlZCBieSB7QGxpbmsgT3BlbklkTG9naW5Gb3JtfSBkb0dldCwgZG9Qb3N0ICovCiAgIHZvaWQgZG9BdXRoKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKQogICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgaWYgKE9NT0RFX0NBTkNFTC5lcXVhbHMocmVxLmdldFBhcmFtZXRlcihPUEVOSURfTU9ERSkpKSB7CkBAIC0yNDcsNyArMjM0LDcgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzdGF0ZSA9IGluaXQocmVkaXNjb3ZlcklkZW50aWZpZXIsIG1vZGUsIHJlbWVtYmVyLCByZXR1cm5Ub2tlbik7CisgICAgc3RhdGUgPSBpbml0KHJlcSwgcmVkaXNjb3ZlcklkZW50aWZpZXIsIG1vZGUsIHJlbWVtYmVyLCByZXR1cm5Ub2tlbik7CiAgICAgaWYgKHN0YXRlID09IG51bGwpIHsKICAgICAgIC8vIFJlLWRpc2NvdmVyeSBtdXN0IGhhdmUgZmFpbGVkLCB3ZSBjYW4ndCBydW4gYSBsb2dpbi4KICAgICAgIC8vCkBAIC0zNTYsNiArMzQzLDMyIEBACiAgICAgICBhcmVxLnNldEVtYWlsQWRkcmVzcyhmZXRjaFJzcC5nZXRBdHRyaWJ1dGVWYWx1ZSgiRW1haWwiKSk7CiAgICAgfQogCisgICAgaWYgKG9wZW5JZERvbWFpbnMgIT0gbnVsbCAmJiBvcGVuSWREb21haW5zLnNpemUoKSA+IDApIHsKKyAgICAgIC8vIEFkbWluaXN0cmF0b3IgbGltaXRlZCBlbWFpbCBkb21haW5zLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgT3BlbklELgorICAgICAgLy8gTG9naW4gcHJvY2VzcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcGFzc2VkIGVtYWlsIG1hdGNoZXMgb25lCisgICAgICAvLyBvZiB0aGVzZSBkb21haW5zLgorICAgICAgLy8KKyAgICAgIGZpbmFsIFN0cmluZyBlbWFpbCA9IGFyZXEuZ2V0RW1haWxBZGRyZXNzKCk7CisgICAgICBpbnQgZW1haWxBdEluZGV4ID0gZW1haWwubGFzdEluZGV4T2YoIkAiKTsKKyAgICAgIGlmIChlbWFpbEF0SW5kZXggPj0gMCAmJiBlbWFpbEF0SW5kZXggPCBlbWFpbC5sZW5ndGgoKSAtIDEpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVtYWlsRG9tYWluID0gZW1haWwuc3Vic3RyaW5nKGVtYWlsQXRJbmRleCk7CisKKyAgICAgICAgYm9vbGVhbiBtYXRjaCA9IGZhbHNlOworICAgICAgICBmb3IgKFN0cmluZyBkb21haW4gOiBvcGVuSWREb21haW5zKSB7CisgICAgICAgICAgaWYgKGVtYWlsRG9tYWluLmVxdWFsc0lnbm9yZUNhc2UoZG9tYWluKSkgeworICAgICAgICAgICAgbWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtYXRjaCkgeworICAgICAgICAgIGxvZy5lcnJvcigiRG9tYWluIGRpc2FsbG93ZWQ6ICIgKyBlbWFpbERvbWFpbik7CisgICAgICAgICAgY2FuY2VsV2l0aEVycm9yKHJlcSwgcnNwLCAiRG9tYWluIGRpc2FsbG93ZWQiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKICAgICBpZiAoY2xhaW1lZElkZW50aWZpZXIgIT0gbnVsbCkgewogICAgICAgLy8gVGhlIHVzZXIgdXNlZCBhIGNsYWltZWQgaWRlbnRpdHkgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgdmVyaWZpZWQKICAgICAgIC8vIGlkZW50aXR5IHdlIGhhdmUgaW4gb3VyIEF1dGhSZXF1ZXN0IGFib3ZlLiBXZSBzdGlsbCBzaG91bGQgaGF2ZSBhCkBAIC00MDksNyArNDIyLDcgQEAKICAgICAgICAgICBhcnNwID0gYWNjb3VudE1hbmFnZXIuYXV0aGVudGljYXRlKGFyZXEpOwogCiAgICAgICAgICAgZmluYWwgQ29va2llIGxhc3RJZCA9IG5ldyBDb29raWUoT3BlbklkVXJscy5MQVNUSURfQ09PS0lFLCAiIik7Ci0gICAgICAgICAgbGFzdElkLnNldFBhdGgocmVxLmdldENvbnRleHRQYXRoKCkgKyAiLyIpOworICAgICAgICAgIGxhc3RJZC5zZXRQYXRoKHJlcS5nZXRDb250ZXh0UGF0aCgpICsgIi9sb2dpbi8iKTsKICAgICAgICAgICBpZiAocmVtZW1iZXIpIHsKICAgICAgICAgICAgIGxhc3RJZC5zZXRWYWx1ZShyZWRpc2NvdmVySWRlbnRpZmllcik7CiAgICAgICAgICAgICBsYXN0SWQuc2V0TWF4QWdlKExBU1RJRF9BR0UpOwpAQCAtNDE3LDcgKzQzMCw3IEBACiAgICAgICAgICAgICBsYXN0SWQuc2V0TWF4QWdlKDApOwogICAgICAgICAgIH0KICAgICAgICAgICByc3AuYWRkQ29va2llKGxhc3RJZCk7Ci0gICAgICAgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCBBdXRoTWV0aG9kLkNPT0tJRSwgcmVtZW1iZXIpOworICAgICAgICAgIHdlYlNlc3Npb24uZ2V0KCkubG9naW4oYXJzcCwgcmVtZW1iZXIpOwogICAgICAgICAgIGlmIChhcnNwLmlzTmV3KCkgJiYgY2xhaW1lZElkZW50aWZpZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgZmluYWwgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQXV0aFJlcXVlc3QgbGlua1JlcSA9CiAgICAgICAgICAgICAgICAgbmV3IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkF1dGhSZXF1ZXN0KApAQCAtNDMxLDcgKzQ0NCw3IEBACiAKICAgICAgICAgY2FzZSBMSU5LX0lERU5USVk6IHsKICAgICAgICAgICBhcnNwID0gYWNjb3VudE1hbmFnZXIubGluayhpZGVudGlmaWVkVXNlci5nZXQoKS5nZXRBY2NvdW50SWQoKSwgYXJlcSk7Ci0gICAgICAgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dpbihhcnNwLCBBdXRoTWV0aG9kLkNPT0tJRSwgcmVtZW1iZXIpOworICAgICAgICAgIHdlYlNlc3Npb24uZ2V0KCkubG9naW4oYXJzcCwgcmVtZW1iZXIpOwogICAgICAgICAgIGNhbGxiYWNrKGZhbHNlLCByZXEsIHJzcCk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQ2OCw3ICs0ODEsNyBAQAogICAgIH0KIAogICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcmRyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICByZHIuYXBwZW5kKHVybFByb3ZpZGVyLmdldCgpKTsKKyAgICByZHIuYXBwZW5kKHVybFByb3ZpZGVyLmdldChyZXEpKTsKICAgICByZHIuYXBwZW5kKCcjJyk7CiAgICAgaWYgKGlzTmV3ICYmICF0b2tlbi5zdGFydHNXaXRoKFBhZ2VMaW5rcy5SRUdJU1RFUiArICIvIikpIHsKICAgICAgIHJkci5hcHBlbmQoUGFnZUxpbmtzLlJFR0lTVEVSKTsKQEAgLTQ5Myw3ICs1MDYsNyBAQAogICAgICAgd2ViU2Vzc2lvbi5nZXQoKS5sb2dvdXQoKTsKICAgICB9CiAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByZHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIHJkci5hcHBlbmQodXJsUHJvdmlkZXIuZ2V0KCkpOworICAgIHJkci5hcHBlbmQodXJsUHJvdmlkZXIuZ2V0KHJlcSkpOwogICAgIHJkci5hcHBlbmQoJyMnKTsKICAgICByZHIuYXBwZW5kKCJTaWduSW5GYWlsdXJlIik7CiAgICAgcmRyLmFwcGVuZCgnLCcpOwpAQCAtNTAzLDggKzUxNiw4IEBACiAgICAgcnNwLnNlbmRSZWRpcmVjdChyZHIudG9TdHJpbmcoKSk7CiAgIH0KIAotICBwcml2YXRlIFN0YXRlIGluaXQoZmluYWwgU3RyaW5nIG9wZW5pZElkZW50aWZpZXIsIGZpbmFsIFNpZ25Jbk1vZGUgbW9kZSwKLSAgICAgIGZpbmFsIGJvb2xlYW4gcmVtZW1iZXIsIGZpbmFsIFN0cmluZyByZXR1cm5Ub2tlbikgeworICBwcml2YXRlIFN0YXRlIGluaXQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgZmluYWwgU3RyaW5nIG9wZW5pZElkZW50aWZpZXIsCisgICAgICBmaW5hbCBTaWduSW5Nb2RlIG1vZGUsIGZpbmFsIGJvb2xlYW4gcmVtZW1iZXIsIGZpbmFsIFN0cmluZyByZXR1cm5Ub2tlbikgewogICAgIGZpbmFsIExpc3Q8Pz4gbGlzdDsKICAgICB0cnkgewogICAgICAgbGlzdCA9IG1hbmFnZXIuZGlzY292ZXIob3BlbmlkSWRlbnRpZmllcik7CkBAIC01MTYsNyArNTI5LDcgQEAKICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAotICAgIGZpbmFsIFN0cmluZyBjb250ZXh0VXJsID0gdXJsUHJvdmlkZXIuZ2V0KCk7CisgICAgZmluYWwgU3RyaW5nIGNvbnRleHRVcmwgPSB1cmxQcm92aWRlci5nZXQocmVxKTsKICAgICBmaW5hbCBEaXNjb3ZlcnlJbmZvcm1hdGlvbiBkaXNjb3ZlcmVkID0gbWFuYWdlci5hc3NvY2lhdGUobGlzdCk7CiAgICAgZmluYWwgVXJsRW5jb2RlZCByZXRUbyA9IG5ldyBVcmxFbmNvZGVkKGNvbnRleHRVcmwgKyBSRVRVUk5fVVJMKTsKICAgICByZXRUby5wdXQoUF9NT0RFLCBtb2RlLm5hbWUoKSk7CkBAIC01MzIsNyArNTQ1LDcgQEAKICAgICByZXR1cm4gbmV3IFN0YXRlKGRpc2NvdmVyZWQsIHJldFRvLCBjb250ZXh0VXJsKTsKICAgfQogCi0gIHByaXZhdGUgYm9vbGVhbiBpc0FsbG93ZWRPcGVuSUQoZmluYWwgU3RyaW5nIGlkKSB7CisgIGJvb2xlYW4gaXNBbGxvd2VkT3BlbklEKGZpbmFsIFN0cmluZyBpZCkgewogICAgIGZvciAoZmluYWwgT3BlbklkUHJvdmlkZXJQYXR0ZXJuIHBhdHRlcm4gOiBhbGxvd2VkT3BlbklEcykgewogICAgICAgaWYgKHBhdHRlcm4ubWF0Y2hlcyhpZCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvU2lnbkluTW9kZS5qYXZhIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL1NpZ25Jbk1vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmE5ODU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL1NpZ25Jbk1vZGUuamF2YQpAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQ7CisKK2VudW0gU2lnbkluTW9kZSB7CisgIFNJR05fSU4sIExJTktfSURFTlRJWSwgUkVHSVNURVI7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9Mb2dpbkZvcm0uaHRtbCBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL0xvZ2luRm9ybS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NzM0ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LW9wZW5pZC9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvYXV0aC9vcGVuaWQvTG9naW5Gb3JtLmh0bWwKQEAgLTAsMCArMSw5MCBAQAorPGh0bWw+CisgIDxoZWFkPgorICAgIDx0aXRsZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBTaWduIEluPC90aXRsZT4KKyAgICA8c3R5bGU+CisgICAgICAjZXJyb3JfbWVzc2FnZSB7CisgICAgICAgIHBhZGRpbmc6IDVweDsKKyAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OworICAgICAgICB3aWR0aDogMjBlbTsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAxMTYpOworICAgICAgICBmb250LXdlaWdodDogYm9sZDsKKyAgICAgIH0KKyAgICAgICNjYW5jZWxfbGluayB7CisgICAgICAgIG1hcmdpbi1sZWZ0OiA0NXB4OworICAgICAgfQorICAgICAgI2xvZ29fYm94IHsKKyAgICAgICAgcGFkZGluZy1sZWZ0OiAxNjBweDsKKyAgICAgIH0KKyAgICAgICNsb2dvX2ltZyB7CisgICAgICAgIHdpZHRoOiAyMDBweDsKKyAgICAgICAgaGVpZ2h0OiA4MHB4OworICAgICAgICBiYWNrZ3JvdW5kOiB1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTWdBQUFCUUNBWUFBQUJjYlRxd0FBQU5iVWxFUVZSNDJ1eGRlWEJWMVJtL1VSWXB1TkRSRmp0dVpjYU9aVHBkN0QrTzA3cGk2NVFxRk1RRUU3S3poRjJrUUVVcjFnVWtJQlFpSUtEVUJZUmdVQkNDSUhFQkJMS1I1R1VsS3dsWlNBS0p0dlVQWnpyOCtyNzN1ODBkZkhudjNpeXZlZUY5djVsdlFzaTUzenZ2M085M3ovbVdjNjZoVUNnVUNvVkNvVkFvRkFxRlFxRlFLQlFLaFVLaFVDZ1VDb1ZDb1ZBb0ZBb0ZRYUNsQXRnUURoU213MUFvRkJid3hSWmd6Z2dnd2dCY1NoQ0Z3Z00wRkFHckhnYWlERXFjV3dvUEtFRVVDaHhJQm1aK0g1Z2t4QkJSZ2lnVUJxb3pnZVgzQVU4WVFMUmI0a1dVSUFxRmdUMUxnU2xEU0k1NEVTV0lRbUg1RzdFR01Ga0lvUVJSS0M0QjZsM0ExRUZBckJKRW9laUVJSVhBMU1GS0VJVkNDYUpRS0VFVUNpV0lRcUVFVVNpVUlBcEZjT2RCbENBS2hTOWNQT3R5UkpDTFdzMnJDQVZjdUhCaGFrTkRBMnBxYWxCV1ZZT3FJM3R3Y2NvZ0lNNFhRZml6ZHY4bWxGWFhlYTZUNjBXUG9WRDBkNXc3ZHc2VmxaVW9MQ3hFYm00dWNuSnlrSldWNVpITVV3VW9QclRURVVIS2Q2OURabjVSeDdYWjJka2VmUzZYeTZPL3FhbEpaeGhGLzBCall5TktTa284Qm13YXRCQkRSUDZ2UTdMekMxSHlTYW9qZ2xSOGtJSnNGM1dhMHFGVHlDS2ZJZjlYVkZTRXMyZlBkb2tzTFMwdE9lNVpTUW1tQ0J6YTJ0cEduejU5bXFUZ0U5NkxFSlJlSW9pM2VKR2xyS3dNNTgrZlgyNzRnY3crSjArZWxLVmJqd21DdGpvZ094VklYdzU4dUpTeTl3WGd4THRBUTdFU01CUWhCaWl6aFJpbUxTbThDY0lsVm5jSVlpOGRmWkwrV1VTeFpybTh2THlPR2U3TW1UUG9OakZLUHdYV2pnZVNockprLzA5dWVjU1VzUWEzRENjT0JKYmZEMlR2dXV5Smd1TnZBNG5YQW5OdkFNN1hBdVZIZ1puWFVtWmNEU1FOODVZWmJsbDRHL0R5YjRCM1pnSlpPL3YvT01rVDJqUkNSd2JMSlpIbGd3aEJTZy92Y2tTUXlnOWZjeE9rVkQ3TGE0WnlTaFRwcnl5blNrdEx1ZXpqOVQwaUNMYk5ZUVJ1Z2xteXYyZ2tzSDRpOE80c1lQdGNZSE1Vc1BTWFFMelpKdEl0S1JPQTlzdDNTWWN2TmdIaEJwQndCZEJhRGM4REpOcWdKSVFCaVZkNlMzd1lFR1dPMFRpREQ1cUZ0d09IVS9yZk9OWFYxZEh3bkJIRHkwZVE1VXh6YzNPYjZQcTJPdGRSbVBmYjNEMzRuNzhneGx4Y1hJeFRwMDZSTE03NzRVWG9uaEFFS3g4Q0h2Zk1FTndOV2JBUFB0dFduUVJlbTBBamVNd3R6N2xKYzZFV2x5VkJqbXdSQStjMmh0WWFvT3d6M3QvRUFjQ3BENERHRXFDKzBKS0dZdUJNTHBDM0Z6aTRDbGczSHBqK1BXQ2lRYUt0L2dQd1RkdG9vei9nTzA5ZmY5TFJUcFk0c3FUcFVhS3c2T05PcjVmb2xmVEovRHlueTY4ZUV3U2JuaEJ5Y05aSWV3YU9yL3Y4ZFNCaEVHLytTM2VGRGtGaURHREtRT0JjT1J6cGFDb0ROa2JJQTRYanZPcWg0QityL1B4OEowL3JqalpWVlZYNGY1YWFWRmRYVzU4ZlFJTGd5N2RvQUpQY2tycWc2elBQMFRlQTZEQStIZE1XSTVRSUl2ZTdhOXV4bndjaVRaSjg4R3h3amxWN2UvdEl5L0RzbzBqbDVlWG95MW9zaWFaSlh3SkdrSVUvNWcxNytlN3VPL1piSmxQSHRLdUF4bElvUVh3RDY4Ykp3NFJPL29XNjRCc3JpZmI0TnppU1I5cUpqOURYeFlyaW53U0tJTzZRTFc5K1RGaVA2c09FRkpnMmhDUjUzNXBGUkNmS2orRFNaZGttNFBWSVlNVURRUEtEd0pvL0FtbExnTG84WjMxdXFRSU9yQUJTSmdMSkQ0Z2VydlBUVjNpY2FLLzIvMnBOaFNzZEtQN0U2bGR6QmJCN0NiQjZESFdzSEExc2pvWDBMZUFFcWN1VEtDQkpjdkRWNENLSVpLckYrTzNJSVViWjE5VzhzcVN6aVc3MW5DRHJIek9kN0ovYnQ3ZlhSVi9rbVZFZ2FVcjRYWisrQXgxa1dmZ1RDUnVUU0RFR3h5bkNqUFFrRGdhMnovUGJEekVvekJnT2pEZlk3eGlLKzNPcGQ5WU53T2NicWNNaUtYMnJHZGVBVWFtTndKU2gvTXdvc3crUm51dHB0SXRIQVJYSEVCaUNFRzVTTXNLMTlwRWdJUWdOVG96SDFyakVDZS9MY3ZmNitucFBYMDZjT0NIOTZiTElkZUsvT09ydmt5Tm9hRHZtOTV3Z1I5K2tJVTBaQUxSVUFzMFYvSzVMN3dSeTBvQ1lLMmlvc2h6TDJRV2NMWkNJRC84bTVESWpZbGd6QnAzcWYzK1JrSWxHdlB4ZTROaFdvRFlQa0FMUlkvL2diQlJ1K2xKN240ZEZrSFIrN3B6cmdmM0wyR2JlelV5QVZwNEFta285c3d1Mno1RlFMc243NUkxQTIxa0VoQ0Q4THZ5dUMyNEtIb0xZUFkzbDcxSmoxWmY3UVZwYlcxUEZ1Q1YwTExOQU4wVEl3VVNpRFhBbWx3WVJaZlJLSXN0dHJFSU82c3ZkTFdGZmhrTG4vd2lZZXlPUWRMM2ZRN3Z4MlVZZ2xnWXF5NTlML3BhOUU0ZzBqZjg5MzJUR2pxZWtEY2xZa21ITlhIRUcreExubG1YM0FPMzE4SkVVWkp1SmRLSURSQkF1YlNPcFV4NG13WklFOU91UXk4OVEyakFGMTM3ZTZJUXJnWm9zOUlyT1dkZlJ3RDlaSTBiSXNZZzJUTktrd2NHVGxkY25YUTIwV0ZGRDk3S05UOXgxWSsxMWJIaWN5NWZsOTlEQWl3N0ptTE1QODI0RXZtcUFqUlBONjErNUQrYk0yUHNFY2FWVFIvd1ZYTTcxTllRQWRrdXIydHJhVUNJSXc3Tzg4YjFXVzRVbGQ5QS8yUGVTWk5kbExMZ3NXdm1nSS8zNHBuMmtlOFloR1Q1NkFTYVJhZHdKZ3h3WkpPcUxnSVNCUUZ3WVBNR0QwMTl3ekNlWk9tMkFqQlNTZE1FdC9IeFp2dlV5UVlRVU1udUxIdmwrUnArQmEzcGIzME95MktHMjVSWkhOc01pU0JGNlJlZXpQek1KOHZLbEJNbFlCOGM2M3A1R2gvblYzOU5BZDg2blE3MzZZZWM2WHJtWHM0QXMyeVRySCt0OHBrVGVYdm9zU2NNQ1I1REs0K3hQVEYrL0NvTjVCTC9MS3pQWEVYb0V5VTBUUTZEZlVKZmZLLzF4TzhKY3YzK2NMQVNoN2pqRFkxUmRjUFpKcWdVMzAwRFhqQ0hwOWl4MXJ1Tzl1U3lzM0Q1UHdzeGlpQ3dnL0xmOXhqU3Bja0MwdEw4NlVBU2hYeFJyY0pZcis3UnZiVUVjYjM5TExKbGR1SDhpeEFoU2VWeld3RFNHdkwwOTdROXpDOU1HMDVoT2JKTWttRGpHbEhySE14UU5OSVlHS3BFa0xQMlZMTEhvN0M4WjVaWTcvSXY0SzNOdllMUXFaUnhRNk5ZWFMzME9qVGZnQkpFcWFFeW1EaTV2Kzdha3hEWjZKZEdqRUNNSUUyaXpydVY2KzZNWGUwNFEzblJXc3RhZUVpZTdPd1RoK2p6ZXpNclg1a3FZMk5UclVPSU1WdFRHRGdZMmhnY25RUTZzNExqUEhnN3h1NEtkSUF5TGhoUkJDS3k0bnc1eDhnTTlKOGhiVTRHSlZteGY4Z3NXUVFxN09ZUFVzVkk0UW5JYmZ3T2F5a1NYdlRRVThlZFhqVExXMUJkTUJFa1p6M0YvOFM0RVEvWmNsMWcrNFBZVmFId0pBKzM5RVB2b0V3bXlOUUZtWmJNWUVZMHQvNk91K2lCV0ZHblY3K2kwNzEvV25mNHhVUmdkUEFUQlYwM0FyT0djUWRLZUR2NGNpUHl0b3FJaU5Ba2lmc0pNTHJPazVMMjdlaVI4aWdpV2ZVaFk5Wkt4Q0tlRDNmVW9GcU5XMkRhYlVheTFqNkpMSWV5VU9IZ1NmeVdIZzJvR2NaT0NZeFV2VWJYc3ZyY0RPZlFnTXpQVFg1SlFDaE5Ea0NDRU8yTk1JNTRjQm1UdDZQb05yODRDcGcvajdMRitBcnpHSXBMMVdkM09nMlNuMGtDbkR3WE8xempUOCtkYmdERUdOeXhWSGc4V2dqQkJtSGdWeDJwanVIVnRmMGdVQ3BGQ2p5QUVudjgxYjFyU2RVQys0NGdXeTFXZXVwVXowTHdSVWszclRaQVlKdW1rOXNuKzZicVl1bVo4SjVPKzhGYjJiL05rZXgyU3hZOHdkWHpkM01ZdHNnRWlTS1BqdWoyVzBpU1pzL1g4bXpoV1FiUnowSzdVaE1uQzBDUUlLMjhYM01ZbmQ4SUFJTzB2UUZzOS9OL3dEZklHWDVOWXc0SFNESGlOeFpSQk1oNDBpT2d3U0YyVDMzMFg4UU5wUUN3MjdJQlU2Q0xDckxwTlhlaGJSOEUrWU9vd0pnbDNMUUlOL3VPQUVVUWVFSDUxMWVRQWgxWURMOTdOdmo4bTVMaU41U1hCZGdLaWd6SjNWdktHSGtHc1BNYXkzNHFCOGtiTyt5R3dOUkU0dkk1N3J3djJTMmFhaHpjc3ZsME1sdTJlSGdWVWZvbE94eUp4Z0JnYWZZSFoxMVAzMnJIQXlXMVNoZXRWemN0bDJrUjAycjgzWXEwOTgxSzVlL3dkcXlKWWlpUGZqSlBFRzhteDhpSHZhdDZrb1RCczRkMGVSN2NDazVoUUpVRSt0VXIxRjQxazNtWEpUenRFZnBjU2Y4eThSa0xlL0U3akRWN3o5MGVCNW5JWXdRaHh4QjJVdXpPckhzS251OHZKRzFoME81OTRZejAzbHdieWhFbUlSODJTOHprL0FIWXRCdjdKQXl0OEVJUnl2cG9IR1R4M3AraWcwTWlvYTV3WTRCRE9EbjRnK1JydUIvR2hJellNMkJ6TlF4R3NHY0VxSGJHRmQzc2NFNEtZTTRaMWFJTUkyMFYxS3J6UDA0YVFORzlOQjBxWU1ROXFGQlFVT05vd0paR3ZVSC85QWZMM0FidWZBVFpFY01mZHlnZjU5Tjh4bnpQQzErZGdNeGFkNWtHUWxjcXpvcEpIY3pmZytuQUo0VHF1QjBOckZYQm9EZkI2RkdlU1pGUEhoMzhGcWpOdGRoUjZ3NjQ5MnVzNWV4WWQ1Ty91Y2hVUGlWeHVLZlFoQmVsQStURXVVL3NYNkxBN2Nkb2xmeUw3MS9YOUlEWndSaEE5aWJFL25jaHVPdWFPRG9hVERVaEtFQ1ZJU0pLRXl5MzdQZDRTNFpMZGVrb1FKVWpvZ0pXK1FnQkh4NHlhN1NUcnp1TEdIcjFoS2wwSm91Z0hzRTRQRVhGQ0ZMYmxzVURpekV1Q3NlTUZPUCtwemZkUGtCZ3pHdVFLQVlMVTVVc2tqRktYcndUcDc2ODdrSE4ydlk0aHRTZUw5YjRRVnpIS010NzNmWGgxRkFraThYeko4QnFYT1NTQ0l4VytJdTUvSzBINlAzZzJybmwyVnRlUC9NeHpkZmI2QTZ2VTR0bGZBSzU5YWlpSy9nODVyVjJ5NnZROXJGbWxLeS9RRWVFNVVWZEpRazJKb2JnOElkRXJjMCtKMTdzOGZCSWt5aVRISy9mTG9RRktEa1VvZ0Nla2lHTXV1eFN0ZHhhU05KbXl4RHE0QXhlRkhMTkhBQm12S1RFVXVoU1Q4N1FrOUZ0VVZvSFRHV200dUNWV2p0MVVjaWdVQ29WQ29WQW9GQXFGUXFGUUtCUUtoVUtoVUNnVUNzVi8yNE1ERWdBQUFBQkIvMSszSTFBQkFHQWlsVloySUt2dnpFTUFBQUFBU1VWT1JLNUNZSUk9Jykgbm8tcmVwZWF0IDBweCAwcHg7CisgICAgICB9CisgICAgICAjZl9vcGVuaWQgeworICAgICAgICBwYWRkaW5nLWxlZnQ6IDI1cHg7CisgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7CisgICAgICAgIGJhY2tncm91bmQ6ICNmZmYgdXJsKCdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhFQUFRQU1RQUFPM3Q3ZUhoNHNyS3l2ejgvUDVwRFA5ckVOTFMwdi8yOFAvMTd0WFYxZEhFdlBEdzhNM056Zm41K2QzZDNmNWpBOTdTeXZudjZNZkx6Y2ZIeC8xbUNQeDRLYy9TMVBmMTg5Qyt0UCt4Z3YvazFOM094Zkh5OU5MVjEvMzkvZi8vL3lINUJBQUFBQUFBTEFBQUFBQVFBQkFBQUFWcTRDZU9aR21lNktobFNEb2V4ZE82SDBJVVIrb3R3VVlSa01EQ1V3SVlKaExGVHlHWkpBQ0F3UWNnRUFRNGtWdUVFMkFJR0FPUFFRQVF3WENmUzhLUUdBd01qSVlJVVNpMDNCN2lKK0Fjbm1jbEhnNFRBaDBRRHpJcEN3NFdHQlVaZWlrREZ6azBscGNqSVFBNycpIG5vLXJlcGVhdCBzY3JvbGwgNXB4IDUwJQorICAgICAgfQorICAgIDwvc3R5bGU+CisgICAgPHN0eWxlIGlkPSJnZXJyaXRfc2l0ZWNzcyIgdHlwZT0idGV4dC9jc3MiPjwvc3R5bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdiBpZD0iZ2Vycml0X3RvcG1lbnUiIHN0eWxlPSJoZWlnaHQ6NDVweDsiIGNsYXNzPSJnZXJyaXRUb3BNZW51Ij48L2Rpdj4KKyAgICA8ZGl2IGlkPSJnZXJyaXRfaGVhZGVyIj48L2Rpdj4KKyAgICA8ZGl2IGlkPSJnZXJyaXRfYm9keSIgY2xhc3M9ImdlcnJpdEJvZHkiPgorICAgICAgPGgxPlNpZ24gSW4gdG8gR2Vycml0IENvZGUgUmV2aWV3IGF0IDxzcGFuIGlkPSJob3N0TmFtZSI+ZXhhbXBsZS5jb208L3NwYW4+PC9oMT4KKyAgICAgIDxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIjIiBpZD0ibG9naW5fZm9ybSI+CisgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImxpbmsiIGlkPSJmX2xpbmsiIHZhbHVlPSIxIiAvPgorICAgICAgICA8ZGl2IGlkPSJsb2dvX2JveCI+PGRpdiBpZD0ibG9nb19pbWciPjwvZGl2PjwvZGl2PgorICAgICAgICA8ZGl2IGlkPSJlcnJvcl9tZXNzYWdlIj5JbnZhbGlkIE9wZW5JRCBpZGVudGlmaWVyLjwvZGl2PgorICAgICAgICA8ZGl2PgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IgorICAgICAgICAgICAgICAgICBuYW1lPSJpZCIKKyAgICAgICAgICAgICAgICAgaWQ9ImZfb3BlbmlkIgorICAgICAgICAgICAgICAgICBzaXplPSI2MCIKKyAgICAgICAgICAgICAgICAgdGFiaW5kZXg9IjEiIC8+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2PgorICAgICAgICAgIDxpbnB1dCBuYW1lPSJyZW1lbWJlcm1lIiBpZD0iZl9yZW1lbWJlciIKKyAgICAgICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCisgICAgICAgICAgICAgICAgIHZhbHVlPSIxIgorICAgICAgICAgICAgICAgICB0YWJpbmRleD0iMiIgLz4KKyAgICAgICAgICA8bGFiZWwgZm9yPSJmX3JlbWVtYmVyIj5SZW1lbWJlciBtZTwvbGFiZWw+CisgICAgICAgIDwvZGl2PgorICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiAyNXB4OyI+CisgICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNpZ24gSW4iIGlkPSJmX3N1Ym1pdCIgdGFiaW5kZXg9IjMiIC8+CisgICAgICAgICAgPGEgaHJlZj0iLi4vIiBpZD0iY2FuY2VsX2xpbmsiPkNhbmNlbDwvYT4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPGRpdiBpZD0icHJvdmlkZXJfZ29vZ2xlIj4KKyAgICAgICAgICA8aW1nIGhlaWdodD0iMTYiIHdpZHRoPSIxNiIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQVlBQUFBZjgvOWhBQUFCc1VsRVFWUjQycldTeTBzYllSUkg4OGZZaFc1S1FYVGhJa1VRTjZJU0pGQkJXNkZGQk4yVXFsQzc4TFZLRmxISW9xV0dha0Y4Z1VaOGdhalZ6S1NLWnBRbUFXdEswcEJtaGt4bVNnUHVpdWFZbVJLaFNFd1UvT0R5RFpmek84eWRPeGJMUXgxTkIwSDR5OEZCbG1NcHk5THlPYXZyS1VvS0I0SVh2QnNJSW9wUlBKNDQxZFkvMkZyOGZBdEZTeE8wZGtSeTRlQTFQRHArVGtWbG1HaE1LUzVJSk9GcGJZZ2o2ZlFhbGhWNFVoVm0wZXN2TG9qRUxpbXYxSmlZT1B3UGZsUzJnTTkzV05vSVhaMW5QQzQvSVJEUXpZRFRxVEEwUE0yZHR1Q1o4dkdtVjZTdlA1c3JML2RhNWMrNFRuTkxGbHZUTVltRVZycGthenVNMngxbmFPUTdEYzFmcUxPbWFheVhrYVN6NGhMSGV3bTdmWStaMlIwaVArSm1ZR3B5bS9xNkREYjc2dTBDd1IrZzkrMEZIejR1M3dBZExoOVZOV3U1VVg0VmxxeXNmYVhSRG9PRE56K2F3N25EczlaUHBOUHB3Z0pWMVdodkY2bTEvcWI3OVQ2ZnB3WG01a1ZHUm5kNS9tSWRRU3p3SDJpYWhxNy8yN254aXE1eEx5OWZiZERXc1V0UHp5YXVzUlZDNFZNTXptQU1OdjlzeVRka1dUWkxWVlV5bVl4NUo1TkpzNWRLcFZBVXhhdzhaL1NNN0JWK2Z6OVVjNHlZUkFBQUFBQkpSVTVFcmtKZ2dnPT0iIC8+CisgICAgICAgICAgPGEgaHJlZj0iP2lkPWh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vYWNjb3VudHMvbzgvaWQiIGlkPSJpZF9nb29nbGUiPlNpZ24gaW4gd2l0aCBhIEdvb2dsZSBBY2NvdW50PC9hPgorICAgICAgICA8L2Rpdj4KKyAgICAgICAgPGRpdiBpZD0icHJvdmlkZXJfeWFob28iPgorICAgICAgICAgIDxpbWcgaGVpZ2h0PSIxNiIgd2lkdGg9IjE2IiBzcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEVBQVFBUEVDQUFBQUFQOEFBUC8vLzh6TXpDSDVCQUVBQUFNQUxBQUFBQUFRQUJBQUFBSXFuSStweTMwQlkzQWdBakNrZkpEamlJQVFsZ1VrTnhxV2txcm0waG9uS2s3S2haT3p3L2YrZnlnQUFEcz0iIC8+CisgICAgICAgICAgPGEgaHJlZj0iP2lkPWh0dHBzOi8vbWUueWFob28uY29tIiBpZD0iaWRfeWFob28iPlNpZ24gaW4gd2l0aCBhIFlhaG9vISBJRDwvYT4KKyAgICAgICAgPC9kaXY+CisKKyAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMjVweDsiPgorICAgICAgICAgIDxoMj5XaGF0IGlzIE9wZW5JRD88L2gyPgorICAgICAgICAgIDxwPk9wZW5JRCBwcm92aWRlcyBzZWN1cmUgc2luZ2xlLXNpZ24tb24sIHdpdGhvdXQgcmV2ZWFsaW5nIHlvdXIgcGFzc3dvcmRzIHRvIHRoaXMgd2Vic2l0ZS48L3A+CisgICAgICAgICAgPHA+VGhlcmUgYXJlIG1hbnkgT3BlbklEIHByb3ZpZGVycyBhdmFpbGFibGUuICBZb3UgbWF5IGFscmVhZHkgYmUgbWVtYmVyIG9mIG9uZSE8L3A+CisgICAgICAgICAgPHA+PGEgaHJlZj0iaHR0cDovL29wZW5pZC5uZXQvZ2V0LyIgdGFyZ2V0PSJfYmxhbmsiPkdldCBPcGVuSUQ8L2E+PC9wPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZm9ybT4KKyAgICA8L2Rpdj4KKyAgICA8ZGl2IHN0eWxlPSJjbGVhcjogYm90aDsgbWFyZ2luLXRvcDogMTVweDsgcGFkZGluZy10b3A6IDJweDsgbWFyZ2luLWJvdHRvbTogMTVweDsiPgorICAgICAgPGRpdiBpZD0iZ2Vycml0X2Zvb3RlciI+PC9kaXY+CisgICAgPC9kaXY+CisKKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICB2YXIgZl9vcGVuaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZl9vcGVuaWQnKTsKKyAgICAgIHZhciBmX3N1Ym1pdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmX3N1Ym1pdCcpOworICAgICAgaWYgKGZfb3BlbmlkLnZhbHVlID09ICcnKQorICAgICAgICBmX29wZW5pZC5mb2N1cygpOworICAgICAgZWxzZQorICAgICAgICBmX3N1Ym1pdC5mb2N1cygpOworICAgIDwvc2NyaXB0PgorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9SZWRpcmVjdEZvcm0uaHRtbCBiL2dlcnJpdC1vcGVuaWQvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2h0dHBkL2F1dGgvb3BlbmlkL1JlZGlyZWN0Rm9ybS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzRlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtb3BlbmlkL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9hdXRoL29wZW5pZC9SZWRpcmVjdEZvcm0uaHRtbApAQCAtMCwwICsxLDE2IEBACis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPkdlcnJpdCBDb2RlIFJldmlldyAtIFJlZGlyZWN0aW5nIC4uLjwvdGl0bGU+CisgIDwvaGVhZD4KKyAgPGJvZHk+CisgICAgPGRpdj5SZWRpcmVjdGluZyAuLi48L2Rpdj4KKwk8Zm9ybSBtZXRob2Q9IlBPU1QiIGFjdGlvbj0iIyIgaWQ9InJlZGlyZWN0X2Zvcm0iPgorCSAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNvbnRpbnVlIiAvPgorICAgIDwvZm9ybT4KKyAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiPgorICAgICAgdmFyIHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVkaXJlY3RfZm9ybScpOworICAgICAgci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgICAgci5zdWJtaXQoKTsKKyAgICA8L3NjcmlwdD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBhY2thZ2UtcGx1Z2lucy8uZ2l0aWdub3JlIGIvZ2Vycml0LXBhY2thZ2UtcGx1Z2lucy8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTZiMDVjLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1wYWNrYWdlLXBsdWdpbnMvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotL3RhcmdldAotLy5jbGFzc3BhdGgKLS8ucHJvamVjdAotLy5zZXR0aW5ncy9vcmcubWF2ZW4uaWRlLmVjbGlwc2UucHJlZnMKLS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubTJlLmNvcmUucHJlZnMKLS9nZXJyaXQtcGFja2FnZS1wbHVnaW5zLmltbApkaWZmIC0tZ2l0IGEvZ2Vycml0LXBhY2thZ2UtcGx1Z2lucy9wb20ueG1sIGIvZ2Vycml0LXBhY2thZ2UtcGx1Z2lucy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDcyNzE5Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1wYWNrYWdlLXBsdWdpbnMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1Db3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi1odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmdlcnJpdC1wYWNrYWdlLXBsdWdpbnM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8bmFtZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBQYWNrYWdlIFBsdWdpbnM8L25hbWU+Ci0gIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC88L3VybD4KLQotICA8cHJvcGVydGllcz4KLSAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgICAgIFVURi04Ci0gICAgPC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXdhcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgIDx0eXBlPndhcjwvdHlwZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlc291cmNlLmdlcnJpdC5wbHVnaW5zLnJlcGxpY2F0aW9uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cmVwbGljYXRpb248L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtcmVzb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxpbmNsdWRlVHlwZXM+amFyPC9pbmNsdWRlVHlwZXM+Ci0gICAgICAgICAgICAgIDxzdHJpcFZlcnNpb24+dHJ1ZTwvc3RyaXBWZXJzaW9uPgotICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9L1dFQi1JTkYvcGx1Z2luczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLQotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHdhck5hbWU+Z2Vycml0LWZ1bGwtJHtwcm9qZWN0LnZlcnNpb259PC93YXJOYW1lPgotICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgPGFkZE1hdmVuRGVzY3JpcHRvcj5mYWxzZTwvYWRkTWF2ZW5EZXNjcmlwdG9yPgotICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KLSAgICAgICAgICAgICAgPE1haW4tQ2xhc3M+TWFpbjwvTWFpbi1DbGFzcz4KLSAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVRpdGxlPkdlcnJpdCBDb2RlIFJldmlldzwvSW1wbGVtZW50YXRpb24tVGl0bGU+Ci0gICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1WZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvSW1wbGVtZW50YXRpb24tVmVyc2lvbj4KLSAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBhdGNoLWNvbW1vbnNuZXQvcG9tLnhtbCBiL2dlcnJpdC1wYXRjaC1jb21tb25zbmV0L3BvbS54bWwKaW5kZXggZjFhOGIzZS4uYjM5MGFmNCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBhdGNoLWNvbW1vbnNuZXQvcG9tLnhtbAorKysgYi9nZXJyaXQtcGF0Y2gtY29tbW9uc25ldC9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGF0Y2gtY29tbW9uc25ldDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wYXRjaC1qZ2l0L3BvbS54bWwgYi9nZXJyaXQtcGF0Y2gtamdpdC9wb20ueG1sCmluZGV4IDY1MjIzZmIuLjIyNzQ0OTMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wYXRjaC1qZ2l0L3BvbS54bWwKKysrIGIvZ2Vycml0LXBhdGNoLWpnaXQvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhdGNoLWpnaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtcGF0Y2gtamdpdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlU3RhdEFjY2Vzc29yLmphdmEgYi9nZXJyaXQtcGF0Y2gtamdpdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlU3RhdEFjY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI0MWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wYXRjaC1qZ2l0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IuamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5XaW5kb3dDYWNoZTsKKworLy8gSGFjayB0byBvYnRhaW4gdmlzaWJpbGl0eSB0byBwYWNrYWdlIGxldmVsIG1ldGhvZHMgb25seS4KKy8vIFRoZXNlIGFyZW4ndCB5ZXQgcGFydCBvZiB0aGUgcHVibGljIEpHaXQgQVBJLgorCitwdWJsaWMgY2xhc3MgV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IgeworICBwdWJsaWMgc3RhdGljIGludCBnZXRPcGVuRmlsZXMoKSB7CisgICAgcmV0dXJuIFdpbmRvd0NhY2hlLmdldEluc3RhbmNlKCkuZ2V0T3BlbkZpbGVzKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0T3BlbkJ5dGVzKCkgeworICAgIHJldHVybiBXaW5kb3dDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE9wZW5CeXRlcygpOworICB9CisKKyAgcHJpdmF0ZSBXaW5kb3dDYWNoZVN0YXRBY2Nlc3NvcigpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBhdGNoLWpnaXQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZVN0YXRBY2Nlc3Nvci5qYXZhIGIvZ2Vycml0LXBhdGNoLWpnaXQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZVN0YXRBY2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTI5NTM2Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1wYXRjaC1qZ2l0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTsKLQotLy8gSGFjayB0byBvYnRhaW4gdmlzaWJpbGl0eSB0byBwYWNrYWdlIGxldmVsIG1ldGhvZHMgb25seS4KLS8vIFRoZXNlIGFyZW4ndCB5ZXQgcGFydCBvZiB0aGUgcHVibGljIEpHaXQgQVBJLgotCi1wdWJsaWMgY2xhc3MgV2luZG93Q2FjaGVTdGF0QWNjZXNzb3IgewotICBwdWJsaWMgc3RhdGljIGludCBnZXRPcGVuRmlsZXMoKSB7Ci0gICAgcmV0dXJuIFdpbmRvd0NhY2hlLmdldEluc3RhbmNlKCkuZ2V0T3BlbkZpbGVzKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0T3BlbkJ5dGVzKCkgewotICAgIHJldHVybiBXaW5kb3dDYWNoZS5nZXRJbnN0YW5jZSgpLmdldE9wZW5CeXRlcygpOwotICB9Ci0KLSAgcHJpdmF0ZSBXaW5kb3dDYWNoZVN0YXRBY2Nlc3NvcigpIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9wb20ueG1sIGIvZ2Vycml0LXBnbS9wb20ueG1sCmluZGV4IGEwMTUyMTkuLmNhMWNmMTAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vcG9tLnhtbAorKysgYi9nZXJyaXQtcGdtL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1wZ208L2FydGlmYWN0SWQ+CkBAIC02NSw2ICs2NSwxMiBAQAogICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtc2VydmVyPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgpAQCAtOTIsNyArOTgsNyBAQAogCiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRvbWNhdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgPGFydGlmYWN0SWQ+dG9tY2F0LXNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KIAogICAgIDxkZXBlbmRlbmN5PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9EYWVtb24uamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vRGFlbW9uLmphdmEKaW5kZXggYTgyNmM4OC4uY2E5OGE4NCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9EYWVtb24uamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL0RhZW1vbi5qYXZhCkBAIC0xOSwxMCArMTksMTAgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va1J1bm5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5BbGxSZXF1ZXN0RmlsdGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkNhY2hlQmFzZWRXZWJTZXNzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLkdlcnJpdFVpT3B0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5HaXRPdmVySHR0cE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5IdHRwQ2Fub25pY2FsV2ViVXJsUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuUmVxdWVzdENvbnRleHRGaWx0ZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuU2lnbmVkVG9rZW5SZXN0VG9rZW5WZXJpZmllcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5XZWJNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuV2ViU3NoR2x1ZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5hdXRoLm9wZW5pZC5PcGVuSWRNb2R1bGU7CkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLmh0dHAuamV0dHkuSmV0dHlNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLmh0dHAuamV0dHkuUHJvamVjdFFvU0ZpbHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5FcnJvckxvZ0ZpbGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuR2FyYmFnZUNvbGxlY3Rpb25Mb2dGaWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLkxvZ0ZpbGVDb21wcmVzc29yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLlJ1bnRpbWVTaHV0ZG93bjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5TaXRlUHJvZ3JhbTsKQEAgLTUxLDEyICs1MiwxNSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlNpZ25lZFRva2VuRW1haWxUb2tlblZlcmlmaWVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlNtdHBFbWFpbFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guSW50cmFMaW5lV29ya2VyUG9vbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW5HdWljZUVudmlyb25tZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpbk1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLlNjaGVtYVVwZGF0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFWZXJzaW9uQ2hlY2s7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5VcGRhdGVVSTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLk5vU3NoS2V5Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Ob1NzaE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaEtleUNhY2hlSW1wbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzLk1hc3RlckNvbW1hbmRNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kcy5TbGF2ZUNvbW1hbmRNb2R1bGU7CkBAIC02NSw2ICs2OSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU3RhdGVtZW50RXhlY3V0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKQEAgLTExMyw2ICsxMTgsOSBAQAogICBAT3B0aW9uKG5hbWUgPSAiLS1ydW4taWQiLCB1c2FnZSA9ICJDb29raWUgdG8gc3RvcmUgaW4gJHNpdGVfcGF0aC9sb2dzL2dlcnJpdC5ydW4iKQogICBwcml2YXRlIFN0cmluZyBydW5JZDsKIAorICBAT3B0aW9uKG5hbWUgPSAiLS1oZWFkbGVzcyIsIHVzYWdlID0gIkRvbid0IHN0YXJ0IHRoZSBVSSBmcm9udGVuZCIpCisgIHByaXZhdGUgYm9vbGVhbiBoZWFkbGVzczsKKwogICBwcml2YXRlIGZpbmFsIExpZmVjeWNsZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBMaWZlY3ljbGVNYW5hZ2VyKCk7CiAgIHByaXZhdGUgSW5qZWN0b3IgZGJJbmplY3RvcjsKICAgcHJpdmF0ZSBJbmplY3RvciBjZmdJbmplY3RvcjsKQEAgLTEyMiw2ICsxMzAsMTUgQEAKICAgcHJpdmF0ZSBJbmplY3RvciBodHRwZEluamVjdG9yOwogICBwcml2YXRlIEZpbGUgcnVuRmlsZTsKIAorICBwcml2YXRlIFJ1bm5hYmxlIHNlcnZlclN0YXJ0ZWQ7CisKKyAgcHVibGljIERhZW1vbigpIHsKKyAgfQorCisgIHB1YmxpYyBEYWVtb24oUnVubmFibGUgc2VydmVyU3RhcnRlZCkgeworICAgIHRoaXMuc2VydmVyU3RhcnRlZCA9IHNlcnZlclN0YXJ0ZWQ7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICBtdXN0SGF2ZVZhbGlkU2l0ZSgpOwpAQCAtMTQ3LDYgKzE2NCw3IEBACiAgICAgICB0aHJvdyBkaWUoIkNhbm5vdCBjb21iaW5lIC0tc2xhdmUgYW5kIC0tZW5hYmxlLWh0dHBkIik7CiAgICAgfQogCisgICAgbWFuYWdlci5hZGQoR2FyYmFnZUNvbGxlY3Rpb25Mb2dGaWxlLnN0YXJ0KGdldFNpdGVQYXRoKCkpKTsKICAgICBpZiAoY29uc29sZUxvZykgewogICAgIH0gZWxzZSB7CiAgICAgICBtYW5hZ2VyLmFkZChFcnJvckxvZ0ZpbGUuc3RhcnQoZ2V0U2l0ZVBhdGgoKSkpOwpAQCAtMTk4LDYgKzIxNiwxMCBAQAogICAgICAgICB9CiAgICAgICB9CiAKKyAgICAgIGlmIChzZXJ2ZXJTdGFydGVkICE9IG51bGwpIHsKKyAgICAgICAgc2VydmVyU3RhcnRlZC5ydW4oKTsKKyAgICAgIH0KKwogICAgICAgUnVudGltZVNodXRkb3duLndhaXRGb3IoKTsKICAgICAgIHJldHVybiAwOwogICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlcnIpIHsKQEAgLTI5MSwxMSArMzEzLDExIEBACiAgICAgbW9kdWxlcy5hZGQobmV3IFdvcmtRdWV1ZS5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IENoYW5nZUhvb2tSdW5uZXIuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBSZWNlaXZlQ29tbWl0c0V4ZWN1dG9yTW9kdWxlKCkpOworICAgIG1vZHVsZXMuYWRkKG5ldyBJbnRyYUxpbmVXb3JrZXJQb29sLk1vZHVsZSgpKTsKICAgICBtb2R1bGVzLmFkZChjZmdJbmplY3Rvci5nZXRJbnN0YW5jZShHZXJyaXRHbG9iYWxNb2R1bGUuY2xhc3MpKTsKICAgICBtb2R1bGVzLmFkZChuZXcgRGVmYXVsdENhY2hlRmFjdG9yeS5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IFNtdHBFbWFpbFNlbmRlci5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IFNpZ25lZFRva2VuRW1haWxUb2tlblZlcmlmaWVyLk1vZHVsZSgpKTsKLSAgICBtb2R1bGVzLmFkZChuZXcgU2lnbmVkVG9rZW5SZXN0VG9rZW5WZXJpZmllci5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IFBsdWdpbk1vZHVsZSgpKTsKICAgICBpZiAoaHR0cGQpIHsKICAgICAgIG1vZHVsZXMuYWRkKG5ldyBDYW5vbmljYWxXZWJVcmxNb2R1bGUoKSB7CkBAIC0zMTIsOSArMzM0LDIwIEBACiAgICAgICAgIH0KICAgICAgIH0pOwogICAgIH0KKyAgICBpZiAoc3NoZCkgeworICAgICAgbW9kdWxlcy5hZGQoU3NoS2V5Q2FjaGVJbXBsLm1vZHVsZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgbW9kdWxlcy5hZGQoTm9Tc2hLZXlDYWNoZS5tb2R1bGUoKSk7CisgICAgfQogICAgIGlmICghc2xhdmUpIHsKICAgICAgIG1vZHVsZXMuYWRkKG5ldyBNYXN0ZXJOb2RlU3RhcnR1cCgpKTsKICAgICB9CisgICAgbW9kdWxlcy5hZGQobmV3IEFic3RyYWN0TW9kdWxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoR2Vycml0VWlPcHRpb25zLmNsYXNzKS50b0luc3RhbmNlKG5ldyBHZXJyaXRVaU9wdGlvbnMoaGVhZGxlc3MpKTsKKyAgICAgIH0KKyAgICB9KTsKICAgICByZXR1cm4gY2ZnSW5qZWN0b3IuY3JlYXRlQ2hpbGRJbmplY3Rvcihtb2R1bGVzKTsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL0V4cG9ydFJldmlld05vdGVzLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL0V4cG9ydFJldmlld05vdGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTM2MGQuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9FeHBvcnRSZXZpZXdOb3Rlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ207Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlUHJvdmlkZXIuQ29udGV4dC5NVUxUSV9VU0VSOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTW9kdWxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLlNpdGVQcm9ncmFtOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZUltcGw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZUltcGw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNhY2hlLmgyLkRlZmF1bHRDYWNoZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BcHByb3ZhbFR5cGVzUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmxQcm92aWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkZhY3RvcnlNb2R1bGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Db2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQ3JlYXRlQ29kZVJldmlld05vdGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk5vdGVzQnJhbmNoVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLlNjaGVtYVZlcnNpb25DaGVjazsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TY29wZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5UZXh0UHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRocmVhZFNhZmVQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkJsb2NrTGlzdDsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLS8qKiBFeHBvcnQgcmV2aWV3IG5vdGVzIGZvciBhbGwgc3VibWl0dGVkIGNoYW5nZXMgaW4gYWxsIHByb2plY3RzLiAqLwotcHVibGljIGNsYXNzIEV4cG9ydFJldmlld05vdGVzIGV4dGVuZHMgU2l0ZVByb2dyYW0gewotICBAT3B0aW9uKG5hbWUgPSAiLS10aHJlYWRzIiwgdXNhZ2UgPSAiTnVtYmVyIG9mIGNvbmN1cnJlbnQgdGhyZWFkcyB0byBydW4iKQotICBwcml2YXRlIGludCB0aHJlYWRzID0gMjsKLQotICBwcml2YXRlIGZpbmFsIExpZmVjeWNsZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBMaWZlY3ljbGVNYW5hZ2VyKCk7Ci0gIHByaXZhdGUgZmluYWwgVGV4dFByb2dyZXNzTW9uaXRvciB0ZXh0TW9uaXRvciA9IG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0gIHByaXZhdGUgZmluYWwgVGhyZWFkU2FmZVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0KLSAgICAgIG5ldyBUaHJlYWRTYWZlUHJvZ3Jlc3NNb25pdG9yKHRleHRNb25pdG9yKTsKLQotICBwcml2YXRlIEluamVjdG9yIGRiSW5qZWN0b3I7Ci0gIHByaXZhdGUgSW5qZWN0b3IgZ2l0SW5qZWN0b3I7Ci0KLSAgQEluamVjdAotICBwcml2YXRlIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXI7Ci0KLSAgQEluamVjdAotICBwcml2YXRlIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IGRhdGFiYXNlOwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBDcmVhdGVDb2RlUmV2aWV3Tm90ZXMuRmFjdG9yeSBjb2RlUmV2aWV3Tm90ZXNGYWN0b3J5OwotCi0gIHByaXZhdGUgTWFwPFByb2plY3QuTmFtZUtleSwgTGlzdDxDaGFuZ2U+PiBjaGFuZ2VzOwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIGlmICh0aHJlYWRzIDw9IDApIHsKLSAgICAgIHRocmVhZHMgPSAxOwotICAgIH0KLQotICAgIGRiSW5qZWN0b3IgPSBjcmVhdGVEYkluamVjdG9yKE1VTFRJX1VTRVIpOwotICAgIGdpdEluamVjdG9yID0gZGJJbmplY3Rvci5jcmVhdGVDaGlsZEluamVjdG9yKG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICBpbnN0YWxsKFNjaGVtYVZlcnNpb25DaGVjay5tb2R1bGUoKSk7Ci0gICAgICAgIGJpbmQoQXBwcm92YWxUeXBlcy5jbGFzcykudG9Qcm92aWRlcihBcHByb3ZhbFR5cGVzUHJvdmlkZXIuY2xhc3MpLmluKAotICAgICAgICAgICAgU2NvcGVzLlNJTkdMRVRPTik7Ci0gICAgICAgIGJpbmQoU3RyaW5nLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKENhbm9uaWNhbFdlYlVybC5jbGFzcykKLSAgICAgICAgICAgIC50b1Byb3ZpZGVyKENhbm9uaWNhbFdlYlVybFByb3ZpZGVyLmNsYXNzKS5pbihTY29wZXMuU0lOR0xFVE9OKTsKLQotICAgICAgICBpbnN0YWxsKEFjY291bnRDYWNoZUltcGwubW9kdWxlKCkpOwotICAgICAgICBpbnN0YWxsKEdyb3VwQ2FjaGVJbXBsLm1vZHVsZSgpKTsKLSAgICAgICAgaW5zdGFsbChuZXcgRGVmYXVsdENhY2hlRmFjdG9yeS5Nb2R1bGUoKSk7Ci0gICAgICAgIGluc3RhbGwobmV3IEZhY3RvcnlNb2R1bGUoKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICAgICAgZmFjdG9yeShDcmVhdGVDb2RlUmV2aWV3Tm90ZXMuRmFjdG9yeS5jbGFzcyk7Ci0gICAgICAgICAgICBmYWN0b3J5KE5vdGVzQnJhbmNoVXRpbC5GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbnN0YWxsKG5ldyBMaWZlY3ljbGVNb2R1bGUoKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICAgICAgbGlzdGVuZXIoKS50byhMb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlci5MaWZlY3ljbGUuY2xhc3MpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgfSk7Ci0KLSAgICBtYW5hZ2VyLmFkZChkYkluamVjdG9yLCBnaXRJbmplY3Rvcik7Ci0gICAgbWFuYWdlci5zdGFydCgpOwotICAgIGdpdEluamVjdG9yLmluamVjdE1lbWJlcnModGhpcyk7Ci0KLSAgICBMaXN0PENoYW5nZT4gYWxsQ2hhbmdlTGlzdCA9IGFsbENoYW5nZXMoKTsKLSAgICBtb25pdG9yLmJlZ2luVGFzaygiU2Nhbm5pbmcgY2hhbmdlcyIsIGFsbENoYW5nZUxpc3Quc2l6ZSgpKTsKLSAgICBjaGFuZ2VzID0gY2x1c3RlcihhbGxDaGFuZ2VMaXN0KTsKLSAgICBhbGxDaGFuZ2VMaXN0ID0gbnVsbDsKLQotICAgIG1vbml0b3Iuc3RhcnRXb3JrZXJzKHRocmVhZHMpOwotICAgIGZvciAoaW50IHRpZCA9IDA7IHRpZCA8IHRocmVhZHM7IHRpZCsrKSB7Ci0gICAgICBuZXcgV29ya2VyKCkuc3RhcnQoKTsKLSAgICB9Ci0gICAgbW9uaXRvci53YWl0Rm9yQ29tcGxldGlvbigpOwotICAgIG1vbml0b3IuZW5kVGFzaygpOwotICAgIG1hbmFnZXIuc3RvcCgpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0PENoYW5nZT4gYWxsQ2hhbmdlcygpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIFJldmlld0RiIGRiID0gZGF0YWJhc2Uub3BlbigpOwotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gZGIuY2hhbmdlcygpLmFsbCgpLnRvTGlzdCgpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBkYi5jbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTWFwPFByb2plY3QuTmFtZUtleSwgTGlzdDxDaGFuZ2U+PiBjbHVzdGVyKExpc3Q8Q2hhbmdlPiBjaGFuZ2VzKSB7Ci0gICAgSGFzaE1hcDxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4gbSA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPFByb2plY3QuTmFtZUtleSwgTGlzdDxDaGFuZ2U+PigpOwotICAgIGZvciAoQ2hhbmdlIGNoYW5nZSA6IGNoYW5nZXMpIHsKLSAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5NRVJHRUQpIHsKLSAgICAgICAgTGlzdDxDaGFuZ2U+IGwgPSBtLmdldChjaGFuZ2UuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgaWYgKGwgPT0gbnVsbCkgewotICAgICAgICAgIGwgPSBuZXcgQmxvY2tMaXN0PENoYW5nZT4oKTsKLSAgICAgICAgICBtLnB1dChjaGFuZ2UuZ2V0UHJvamVjdCgpLCBsKTsKLSAgICAgICAgfQotICAgICAgICBsLmFkZChjaGFuZ2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbW9uaXRvci51cGRhdGUoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGV4cG9ydChSZXZpZXdEYiBkYiwgUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIExpc3Q8Q2hhbmdlPiBjaGFuZ2VzKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24sCi0gICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgUmVwb3NpdG9yeSBnaXQ7Ci0gICAgdHJ5IHsKLSAgICAgIGdpdCA9IGdpdE1hbmFnZXIub3BlblJlcG9zaXRvcnkocHJvamVjdCk7Ci0gICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIENyZWF0ZUNvZGVSZXZpZXdOb3RlcyBub3RlcyA9IGNvZGVSZXZpZXdOb3Rlc0ZhY3RvcnkuY3JlYXRlKGRiLCBnaXQpOwotICAgICAgbm90ZXMuY3JlYXRlKGNoYW5nZXMsIG51bGwsCi0gICAgICAgICAgIkV4cG9ydGVkIHByaW9yIHJldmlld3MgZnJvbSBHZXJyaXQgQ29kZSBSZXZpZXdcbiIsIG1vbml0b3IpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBnaXQuY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIE1hcC5FbnRyeTxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4gbmV4dCgpIHsKLSAgICBzeW5jaHJvbml6ZWQgKGNoYW5nZXMpIHsKLSAgICAgIGlmIChjaGFuZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLQotICAgICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IG5hbWUgPSBjaGFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgZmluYWwgTGlzdDxDaGFuZ2U+IGxpc3QgPSBjaGFuZ2VzLnJlbW92ZShuYW1lKTsKLSAgICAgIHJldHVybiBuZXcgTWFwLkVudHJ5PFByb2plY3QuTmFtZUtleSwgTGlzdDxDaGFuZ2U+PigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBQcm9qZWN0Lk5hbWVLZXkgZ2V0S2V5KCkgewotICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBMaXN0PENoYW5nZT4gZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExpc3Q8Q2hhbmdlPiBzZXRWYWx1ZShMaXN0PENoYW5nZT4gdmFsdWUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIFdvcmtlciBleHRlbmRzIFRocmVhZCB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgUmV2aWV3RGIgZGI7Ci0gICAgICB0cnkgewotICAgICAgICBkYiA9IGRhdGFiYXNlLm9wZW4oKTsKLSAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICBFbnRyeTxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8Q2hhbmdlPj4gbmV4dCA9IG5leHQoKTsKLSAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBleHBvcnQoZGIsIG5leHQuZ2V0S2V5KCksIG5leHQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgbW9uaXRvci5lbmRXb3JrZXIoKTsKLSAgICAgICAgZGIuY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vSW5pdC5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9Jbml0LmphdmEKaW5kZXggOTViODQ4N2YuLjNjNzgyMmMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vSW5pdC5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vSW5pdC5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuQnJvd3NlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5Jbml0RmxhZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQuSW5pdE1vZHVsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5SZWxvYWRTaXRlTGlicmFyeTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5TaXRlUGF0aEluaXRpYWxpemVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLkNvbnNvbGVVSTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5EaWU7CkBAIC0xMjEsMTIgKzEyMCw2IEBACiAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CiAgICAgICAgIGJpbmQoQ29uc29sZVVJLmNsYXNzKS50b0luc3RhbmNlKHVpKTsKICAgICAgICAgYmluZChGaWxlLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKFNpdGVQYXRoLmNsYXNzKS50b0luc3RhbmNlKHNpdGVQYXRoKTsKLSAgICAgICAgYmluZChSZWxvYWRTaXRlTGlicmFyeS5jbGFzcykudG9JbnN0YW5jZShuZXcgUmVsb2FkU2l0ZUxpYnJhcnkoKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgcmVsb2FkKCkgewotICAgICAgICAgICAgSW5pdC5zdXBlci5sb2FkU2l0ZUxpYigpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7CiAgICAgICB9CiAgICAgfSk7CiAKQEAgLTE0MCw4ICsxMzMsOSBAQAogICAgICAgICB0aHJvdyAoRGllKSB3aHk7CiAgICAgICB9CiAKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoY2UuZ2V0TWVzc2FnZSgpKTsKICAgICAgIHdoaWxlICh3aHkgIT0gbnVsbCkgeworICAgICAgICBidWYuYXBwZW5kKCJcbiIpOwogICAgICAgICBidWYuYXBwZW5kKHdoeS5nZXRNZXNzYWdlKCkpOwogICAgICAgICB3aHkgPSB3aHkuZ2V0Q2F1c2UoKTsKICAgICAgICAgaWYgKHdoeSAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL1Byb3RvR2VuLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL1Byb3RvR2VuLmphdmEKaW5kZXggMTdiNzAxNy4uNDUxMjA3OCAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9Qcm90b0dlbi5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vUHJvdG9HZW4uamF2YQpAQCAtMTgsNyArMTgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zY2hlbWEuamF2YS5KYXZhU2NoZW1hTW9kZWw7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5Mb2NrRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5Mb2NrRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2h0dHAvamV0dHkvSmV0dHlTZXJ2ZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaHR0cC9qZXR0eS9KZXR0eVNlcnZlci5qYXZhCmluZGV4IDU4MjM5NDAuLjNhN2E4NzQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaHR0cC9qZXR0eS9KZXR0eVNlcnZlci5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaHR0cC9qZXR0eS9KZXR0eVNlcnZlci5qYXZhCkBAIC00MiwxMCArNDIsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuc3NsLlNzbFNlbGVjdENoYW5uZWxDb25uZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5EZWZhdWx0U2VydmxldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LkZpbHRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LkZpbHRlck1hcHBpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5TZXJ2bGV0Q29udGV4dEhhbmRsZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5TZXJ2bGV0SG9sZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnV0aWwucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zc2wuU3NsQ29udGV4dEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQuUXVldWVkVGhyZWFkUG9vbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnRocmVhZC5UaHJlYWRQb29sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKQEAgLTYwLDYgKzYwLDcgQEAKIGltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNjcsNiArNjgsOCBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwogCitpbXBvcnQgamF2YXguc2VydmxldC5EaXNwYXRjaGVyVHlwZTsKKwogQFNpbmdsZXRvbgogcHVibGljIGNsYXNzIEpldHR5U2VydmVyIHsKICAgc3RhdGljIGNsYXNzIExpZmVjeWNsZSBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKQEAgLTE2MSwyMyArMTY0LDIzIEBACiAgICAgICAgIGRlZmF1bHRQb3J0ID0gODA7CiAgICAgICAgIGMgPSBuZXcgU2VsZWN0Q2hhbm5lbENvbm5lY3RvcigpOwogICAgICAgfSBlbHNlIGlmICgiaHR0cHMiLmVxdWFscyh1LmdldFNjaGVtZSgpKSkgewotICAgICAgICBmaW5hbCBTc2xTZWxlY3RDaGFubmVsQ29ubmVjdG9yIHNzbCA9IG5ldyBTc2xTZWxlY3RDaGFubmVsQ29ubmVjdG9yKCk7CisgICAgICAgIFNzbENvbnRleHRGYWN0b3J5IHNzbCA9IG5ldyBTc2xDb250ZXh0RmFjdG9yeSgpOwogICAgICAgICBmaW5hbCBGaWxlIGtleXN0b3JlID0gZ2V0RmlsZShjZmcsICJzc2xrZXlzdG9yZSIsICJldGMva2V5c3RvcmUiKTsKICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gY2ZnLmdldFN0cmluZygiaHR0cGQiLCBudWxsLCAic3Nsa2V5cGFzc3dvcmQiKTsKICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpIHsKICAgICAgICAgICBwYXNzd29yZCA9ICJnZXJyaXQiOwogICAgICAgICB9Ci0gICAgICAgIHNzbC5zZXRLZXlzdG9yZShrZXlzdG9yZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIHNzbC5zZXRUcnVzdHN0b3JlKGtleXN0b3JlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgc3NsLnNldEtleVBhc3N3b3JkKHBhc3N3b3JkKTsKLSAgICAgICAgc3NsLnNldFRydXN0UGFzc3dvcmQocGFzc3dvcmQpOworICAgICAgICBzc2wuc2V0S2V5U3RvcmVQYXRoKGtleXN0b3JlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgc3NsLnNldFRydXN0U3RvcmUoa2V5c3RvcmUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBzc2wuc2V0S2V5U3RvcmVQYXNzd29yZChwYXNzd29yZCk7CisgICAgICAgIHNzbC5zZXRUcnVzdFN0b3JlUGFzc3dvcmQocGFzc3dvcmQpOwogCiAgICAgICAgIGlmIChBdXRoVHlwZS5DTElFTlRfU1NMX0NFUlRfTERBUC5lcXVhbHMoYXV0aFR5cGUpKSB7CiAgICAgICAgICAgc3NsLnNldE5lZWRDbGllbnRBdXRoKHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdFBvcnQgPSA0NDM7Ci0gICAgICAgIGMgPSBzc2w7CisgICAgICAgIGMgPSBuZXcgU3NsU2VsZWN0Q2hhbm5lbENvbm5lY3Rvcihzc2wpOwogCiAgICAgICB9IGVsc2UgaWYgKCJwcm94eS1odHRwIi5lcXVhbHModS5nZXRTY2hlbWUoKSkpIHsKICAgICAgICAgZGVmYXVsdFBvcnQgPSA4MDgwOwpAQCAtMzM2LDcgKzMzOSw5IEBACiAgICAgLy8gYWxyZWFkeSBoYXZlIGJ1aWx0LgogICAgIC8vCiAgICAgR3VpY2VGaWx0ZXIgZmlsdGVyID0gZW52LndlYkluamVjdG9yLmdldEluc3RhbmNlKEd1aWNlRmlsdGVyLmNsYXNzKTsKLSAgICBhcHAuYWRkRmlsdGVyKG5ldyBGaWx0ZXJIb2xkZXIoZmlsdGVyKSwgIi8qIiwgRmlsdGVyTWFwcGluZy5ERUZBVUxUKTsKKyAgICBhcHAuYWRkRmlsdGVyKG5ldyBGaWx0ZXJIb2xkZXIoZmlsdGVyKSwgIi8qIiwgRW51bVNldC5vZigKKyAgICAgICAgRGlzcGF0Y2hlclR5cGUuUkVRVUVTVCwKKyAgICAgICAgRGlzcGF0Y2hlclR5cGUuQVNZTkMpKTsKICAgICBhcHAuYWRkRXZlbnRMaXN0ZW5lcihuZXcgR3VpY2VTZXJ2bGV0Q29udGV4dExpc3RlbmVyKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKSB7CkBAIC00OTEsNyArNDk2LDcgQEAKICAgICBmb3IgKEZpbGUgZSA6IGVudHJpZXMpIHsKICAgICAgIGlmIChlLmlzRGlyZWN0b3J5KCkgLyogbXVzdCBiZSBhIGRpcmVjdG9yeSAqLwogICAgICAgICAgICYmIGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImdlcnJpdC1nd3R1aS0iKQotICAgICAgICAgICYmIG5ldyBGaWxlKGUsICJnZXJyaXQvZ2Vycml0Lm5vY2FjaGUuanMiKS5pc0ZpbGUoKSkgeworICAgICAgICAgICYmIG5ldyBGaWxlKGUsICJnZXJyaXRfdWkvZ2Vycml0X3VpLm5vY2FjaGUuanMiKS5pc0ZpbGUoKSkgewogICAgICAgICByZXR1cm4gUmVzb3VyY2UubmV3UmVzb3VyY2UoZS50b1VSSSgpKTsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvQnJvd3Nlci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0Jyb3dzZXIuamF2YQppbmRleCBlYTEzMDQzLi44ZTM5NDhlIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvQnJvd3Nlci5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Ccm93c2VyLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTQyLDcgKzQzLDYgQEAKICAgICBpZiAodXJsID09IG51bGwpIHsKICAgICAgIHJldHVybjsKICAgICB9Ci0KICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoInByb3h5LSIpKSB7CiAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKCJwcm94eS0iLmxlbmd0aCgpKTsKICAgICB9CkBAIC01NCwxNSArNTQsMTkgQEAKICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiZXJyb3I6IGludmFsaWQgaHR0cGQubGlzdGVuVXJsOiAiICsgdXJsKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZmluYWwgU3RyaW5nIGhvc3RuYW1lID0gdXJpLmdldEhvc3QoKTsKLSAgICBmaW5hbCBpbnQgcG9ydCA9IEluaXRVdGlsLnBvcnRPZih1cmkpOworICAgIHdhaXRGb3JTZXJ2ZXIodXJpKTsKKyAgICBvcGVuQnJvd3Nlcih1cmksIGxpbmspOworICB9CiAKLSAgICBTeXN0ZW0uZXJyLnByaW50KCJXYWl0aW5nIGZvciBzZXJ2ZXIgdG8gc3RhcnQgLi4uICIpOworICBwcml2YXRlIHZvaWQgd2FpdEZvclNlcnZlcihVUkkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIFN0cmluZyBob3N0ID0gdXJpLmdldEhvc3QoKTsKKyAgICBpbnQgcG9ydCA9IEluaXRVdGlsLnBvcnRPZih1cmkpOworICAgIFN5c3RlbS5lcnIuZm9ybWF0KCJXYWl0aW5nIGZvciBzZXJ2ZXIgb24gJXM6JWQgLi4uICIsIGhvc3QsIHBvcnQpOwogICAgIFN5c3RlbS5lcnIuZmx1c2goKTsKICAgICBmb3IgKDs7KSB7Ci0gICAgICBmaW5hbCBTb2NrZXQgczsKKyAgICAgIFNvY2tldCBzOwogICAgICAgdHJ5IHsKLSAgICAgICAgcyA9IG5ldyBTb2NrZXQoaG9zdG5hbWUsIHBvcnQpOworICAgICAgICBzID0gbmV3IFNvY2tldChob3N0LCBwb3J0KTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKQEAgLTc0LDE4ICs3OCwzMyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIFN5c3RlbS5lcnIucHJpbnRsbigiT0siKTsKKyAgfQogCi0gICAgdXJsID0gY2ZnLmdldFN0cmluZygiZ2Vycml0IiwgbnVsbCwgImNhbm9uaWNhbFdlYlVybCIpOwotICAgIGlmICh1cmwgPT0gbnVsbCB8fCB1cmwuaXNFbXB0eSgpKSB7CisgIHByaXZhdGUgU3RyaW5nIHJlc29sdmVVcmwoVVJJIHVyaSwgU3RyaW5nIGxpbmspIHsKKyAgICBTdHJpbmcgdXJsID0gY2ZnLmdldFN0cmluZygiZ2Vycml0IiwgbnVsbCwgImNhbm9uaWNhbFdlYlVybCIpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkodXJsKSkgewogICAgICAgdXJsID0gdXJpLnRvU3RyaW5nKCk7CiAgICAgfQogICAgIGlmICghdXJsLmVuZHNXaXRoKCIvIikpIHsKICAgICAgIHVybCArPSAiLyI7CiAgICAgfQotICAgIGlmIChsaW5rICE9IG51bGwgJiYgIWxpbmsuaXNFbXB0eSgpKSB7CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkobGluaykpIHsKICAgICAgIHVybCArPSAiIyIgKyBsaW5rOwogICAgIH0KLSAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk9wZW5pbmcgYnJvd3NlciAuLi4iKTsKLSAgICBvcmcuaDIudG9vbHMuU2VydmVyLm9wZW5Ccm93c2VyKHVybCk7CisgICAgcmV0dXJuIHVybDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBvcGVuQnJvd3NlcihVUkkgdXJpLCBTdHJpbmcgbGluaykgeworICAgIFN0cmluZyB1cmwgPSByZXNvbHZlVXJsKHVyaSwgbGluayk7CisgICAgU3lzdGVtLmVyci5mb3JtYXQoIk9wZW5pbmcgJXMgLi4uIiwgdXJsKTsKKyAgICBTeXN0ZW0uZXJyLmZsdXNoKCk7CisgICAgdHJ5IHsKKyAgICAgIG9yZy5oMi50b29scy5TZXJ2ZXIub3BlbkJyb3dzZXIodXJsKTsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiT0siKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJGQUlMRUQiKTsKKyAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiT3BlbiBHZXJyaXQgd2l0aCBhIEphdmFTY3JpcHQgY2FwYWJsZSBicm93c2VyOiIpOworICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIgICIgKyB1cmwpOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0RhdGFiYXNlQ29uZmlnSW5pdGlhbGl6ZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9EYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjMWVkNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9EYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0OworCisvKiogQWJzdHJhY3Rpb24gb2YgaW5pdGlhbGl6ZXIgZm9yIHRoZSBkYXRhYmFzZSBzZWN0aW9uICovCitpbnRlcmZhY2UgRGF0YWJhc2VDb25maWdJbml0aWFsaXplciB7CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGRhdGFiYXNlIHBsYXRmb3JtIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc3RlcHMgYW5kIHdyaXRlcworICAgKiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgaW50byB0aGUgZ2l2ZW4gZGF0YWJhc2Ugc2VjdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgaW5pdENvbmZpZyhTZWN0aW9uIGRhdGFiYXNlU2VjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvRGF0YWJhc2VDb25maWdNb2R1bGUuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9EYXRhYmFzZUNvbmZpZ01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjhjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvRGF0YWJhc2VDb25maWdNb2R1bGUuamF2YQpAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzOworCitwdWJsaWMgY2xhc3MgRGF0YWJhc2VDb25maWdNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CisKKyAgcHJpdmF0ZSBmaW5hbCBTaXRlUGF0aHMgc2l0ZTsKKworICBwdWJsaWMgRGF0YWJhc2VDb25maWdNb2R1bGUoZmluYWwgU2l0ZVBhdGhzIHNpdGUpIHsKKyAgICB0aGlzLnNpdGUgPSBzaXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICBiaW5kKFNpdGVQYXRocy5jbGFzcykudG9JbnN0YW5jZShzaXRlKTsKKyAgICBiaW5kKERhdGFiYXNlQ29uZmlnSW5pdGlhbGl6ZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoCisgICAgICAgIE5hbWVzLm5hbWVkKCJoMiIpKS50byhIMkluaXRpYWxpemVyLmNsYXNzKTsKKyAgICBiaW5kKERhdGFiYXNlQ29uZmlnSW5pdGlhbGl6ZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoCisgICAgICAgIE5hbWVzLm5hbWVkKCJqZGJjIikpLnRvKEpEQkNJbml0aWFsaXplci5jbGFzcyk7CisgICAgYmluZChEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKAorICAgICAgICBOYW1lcy5uYW1lZCgibXlzcWwiKSkudG8oTXlTcWxJbml0aWFsaXplci5jbGFzcyk7CisgICAgYmluZChEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKAorICAgICAgICBOYW1lcy5uYW1lZCgicG9zdGdyZXNxbCIpKS50byhQb3N0Z3JlU1FMSW5pdGlhbGl6ZXIuY2xhc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSDJJbml0aWFsaXplci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0gySW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWEzZmYwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0gySW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2NsYXNzIEgySW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyIHsKKworICBwcml2YXRlIGZpbmFsIFNpdGVQYXRocyBzaXRlOworCisgIEBJbmplY3QKKyAgSDJJbml0aWFsaXplcihmaW5hbCBTaXRlUGF0aHMgc2l0ZSkgeworICAgIHRoaXMuc2l0ZSA9IHNpdGU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdENvbmZpZyhTZWN0aW9uIGRhdGFiYXNlU2VjdGlvbikgeworICAgIFN0cmluZyBwYXRoID0gZGF0YWJhc2VTZWN0aW9uLmdldCgiZGF0YWJhc2UiKTsKKyAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICBwYXRoID0gImRiL1Jldmlld0RCIjsKKyAgICAgIGRhdGFiYXNlU2VjdGlvbi5zZXQoImRhdGFiYXNlIiwgcGF0aCk7CisgICAgfQorICAgIEZpbGUgZGIgPSBzaXRlLnJlc29sdmUocGF0aCk7CisgICAgaWYgKGRiID09IG51bGwpIHsKKyAgICAgIHRocm93IEluaXRVdGlsLmRpZSgiZGF0YWJhc2UuZGF0YWJhc2UgbXVzdCBiZSBzdXBwbGllZCBmb3IgSDIiKTsKKyAgICB9CisgICAgZGIgPSBkYi5nZXRQYXJlbnRGaWxlKCk7CisgICAgaWYgKCFkYi5leGlzdHMoKSAmJiAhZGIubWtkaXJzKCkpIHsKKyAgICAgIHRocm93IEluaXRVdGlsLmRpZSgiY2Fubm90IGNyZWF0ZSBkYXRhYmFzZS5kYXRhYmFzZSAiCisgICAgICAgICAgKyBkYi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRBdXRoLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEF1dGguamF2YQppbmRleCBmYTRkYzE0Li4xNTI0NzA3IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEF1dGguamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEF1dGguamF2YQpAQCAtMzIsOCArMzIsOCBAQAogICBASW5qZWN0CiAgIEluaXRBdXRoKGZpbmFsIENvbnNvbGVVSSB1aSwgZmluYWwgU2VjdGlvbi5GYWN0b3J5IHNlY3Rpb25zKSB7CiAgICAgdGhpcy51aSA9IHVpOwotICAgIHRoaXMuYXV0aCA9IHNlY3Rpb25zLmdldCgiYXV0aCIpOwotICAgIHRoaXMubGRhcCA9IHNlY3Rpb25zLmdldCgibGRhcCIpOworICAgIHRoaXMuYXV0aCA9IHNlY3Rpb25zLmdldCgiYXV0aCIsIG51bGwpOworICAgIHRoaXMubGRhcCA9IHNlY3Rpb25zLmdldCgibGRhcCIsIG51bGwpOwogICB9CiAKICAgcHVibGljIHZvaWQgcnVuKCkgewpAQCAtNTQsNiArNTQsMTUgQEAKICAgICAgICAgYXV0aC5zdHJpbmcoIlNTTyBsb2dvdXQgVVJMIiwgImxvZ291dFVybCIsIG51bGwpOwogICAgICAgICBicmVhazsKICAgICAgIH0KKworICAgICAgY2FzZSBDTElFTlRfU1NMX0NFUlRfTERBUDoKKyAgICAgIGNhc2UgQ1VTVE9NX0VYVEVOU0lPTjoKKyAgICAgIGNhc2UgREVWRUxPUE1FTlRfQkVDT01FX0FOWV9BQ0NPVU5UOgorICAgICAgY2FzZSBMREFQOgorICAgICAgY2FzZSBMREFQX0JJTkQ6CisgICAgICBjYXNlIE9QRU5JRDoKKyAgICAgIGNhc2UgT1BFTklEX1NTTzoKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgc3dpdGNoIChhdXRoX3R5cGUpIHsKQEAgLTgwLDYgKzg5LDE0IEBACiAgICAgICAgIGxkYXAuc3RyaW5nKCJHcm91cCBCYXNlRE4iLCAiZ3JvdXBCYXNlIiwgYUJhc2UpOwogICAgICAgICBicmVhazsKICAgICAgIH0KKworICAgICAgY2FzZSBDTElFTlRfU1NMX0NFUlRfTERBUDoKKyAgICAgIGNhc2UgQ1VTVE9NX0VYVEVOU0lPTjoKKyAgICAgIGNhc2UgREVWRUxPUE1FTlRfQkVDT01FX0FOWV9BQ0NPVU5UOgorICAgICAgY2FzZSBIVFRQOgorICAgICAgY2FzZSBPUEVOSUQ6CisgICAgICBjYXNlIE9QRU5JRF9TU086CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIGlmIChhdXRoLmdldFNlY3VyZSgicmVnaXN0ZXJFbWFpbFByaXZhdGVLZXkiKSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdENhY2hlLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdENhY2hlLmphdmEKaW5kZXggZmIxYTkyNC4uMmI1NzI5ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRDYWNoZS5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0Q2FjaGUuamF2YQpAQCAtMzEsNyArMzEsNyBAQAogICBASW5qZWN0CiAgIEluaXRDYWNoZShmaW5hbCBTaXRlUGF0aHMgc2l0ZSwgZmluYWwgU2VjdGlvbi5GYWN0b3J5IHNlY3Rpb25zKSB7CiAgICAgdGhpcy5zaXRlID0gc2l0ZTsKLSAgICB0aGlzLmNhY2hlID0gc2VjdGlvbnMuZ2V0KCJjYWNoZSIpOworICAgIHRoaXMuY2FjaGUgPSBzZWN0aW9ucy5nZXQoImNhY2hlIiwgbnVsbCk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBydW4oKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdENvbnRhaW5lci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRDb250YWluZXIuamF2YQppbmRleCA3MDYzZjU0Li5mYmQ1NDNkIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdENvbnRhaW5lci5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0Q29udGFpbmVyLmphdmEKQEAgLTIzLDcgKzIzLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtNDQsNyArNDQsNyBAQAogICAgICAgZmluYWwgU2VjdGlvbi5GYWN0b3J5IHNlY3Rpb25zKSB7CiAgICAgdGhpcy51aSA9IHVpOwogICAgIHRoaXMuc2l0ZSA9IHNpdGU7Ci0gICAgdGhpcy5jb250YWluZXIgPSBzZWN0aW9ucy5nZXQoImNvbnRhaW5lciIpOworICAgIHRoaXMuY29udGFpbmVyID0gc2VjdGlvbnMuZ2V0KCJjb250YWluZXIiLCBudWxsKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0RGF0YWJhc2UuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0RGF0YWJhc2UuamF2YQppbmRleCBkNTAxZWE1Li4wMzM2ZGRhIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdERhdGFiYXNlLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXREYXRhYmFzZS5qYXZhCkBAIC0xNCwxNyArMTQsMjYgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdDsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5Jbml0VXRpbC5kaWU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0LkluaXRVdGlsLnVzZXJuYW1lOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VQcm92aWRlci5UeXBlLkgyOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmluamVjdC5TdGFnZS5QUk9EVUNUSU9OOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5Db25zb2xlVUk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5HdWljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVkOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXM7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCiAvKiogSW5pdGlhbGl6ZSB0aGUge0Bjb2RlIGRhdGFiYXNlfSBjb25maWd1cmF0aW9uIHNlY3Rpb24uICovCiBAU2luZ2xldG9uCkBAIC00MCw2NSArNDksMzkgQEAKICAgICB0aGlzLnVpID0gdWk7CiAgICAgdGhpcy5zaXRlID0gc2l0ZTsKICAgICB0aGlzLmxpYnJhcmllcyA9IGxpYnJhcmllczsKLSAgICB0aGlzLmRhdGFiYXNlID0gc2VjdGlvbnMuZ2V0KCJkYXRhYmFzZSIpOworICAgIHRoaXMuZGF0YWJhc2UgPSBzZWN0aW9ucy5nZXQoImRhdGFiYXNlIiwgbnVsbCk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgdWkuaGVhZGVyKCJTUUwgRGF0YWJhc2UiKTsKIAotICAgIGZpbmFsIERhdGFTb3VyY2VQcm92aWRlci5UeXBlIGRiX3R5cGUgPQotICAgICAgICBkYXRhYmFzZS5zZWxlY3QoIkRhdGFiYXNlIHNlcnZlciB0eXBlIiwgInR5cGUiLCBIMik7CisgICAgU2V0PFN0cmluZz4gYWxsb3dlZFZhbHVlcyA9IFNldHMubmV3VHJlZVNldCgpOworICAgIEluamVjdG9yIGkgPSBHdWljZS5jcmVhdGVJbmplY3RvcihQUk9EVUNUSU9OLCBuZXcgRGF0YWJhc2VDb25maWdNb2R1bGUoc2l0ZSkpOworICAgIExpc3Q8QmluZGluZzxEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyPj4gZGJDb25maWdCaW5kaW5ncyA9CisgICAgICAgIGkuZmluZEJpbmRpbmdzQnlUeXBlKG5ldyBUeXBlTGl0ZXJhbDxEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyPigpIHt9KTsKKyAgICBmb3IgKEJpbmRpbmc8RGF0YWJhc2VDb25maWdJbml0aWFsaXplcj4gYmluZGluZyA6IGRiQ29uZmlnQmluZGluZ3MpIHsKKyAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGJpbmRpbmcuZ2V0S2V5KCkuZ2V0QW5ub3RhdGlvbigpOworICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBOYW1lZCkgeworICAgICAgICBhbGxvd2VkVmFsdWVzLmFkZCgoKE5hbWVkKSBhbm5vdGF0aW9uKS52YWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CiAKLSAgICBzd2l0Y2ggKGRiX3R5cGUpIHsKLSAgICAgIGNhc2UgTVlTUUw6CisgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZGF0YWJhc2UuZ2V0KCJ1cmwiKSkKKyAgICAgICAgJiYgU3RyaW5ncy5pc051bGxPckVtcHR5KGRhdGFiYXNlLmdldCgidHlwZSIpKSkgeworICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgImpkYmMiKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZGJUeXBlID0KKyAgICAgICAgZGF0YWJhc2Uuc2VsZWN0KCJEYXRhYmFzZSBzZXJ2ZXIgdHlwZSIsICJ0eXBlIiwgImgyIiwgYWxsb3dlZFZhbHVlcyk7CisKKyAgICBEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyIGRjaSA9CisgICAgICAgIGkuZ2V0SW5zdGFuY2UoS2V5LmdldChEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyLmNsYXNzLAorICAgICAgICAgICAgTmFtZXMubmFtZWQoZGJUeXBlLnRvTG93ZXJDYXNlKCkpKSk7CisKKyAgICBpZiAoZGNpIGluc3RhbmNlb2YgTXlTcWxJbml0aWFsaXplcikgewogICAgICAgICBsaWJyYXJpZXMubXlzcWxEcml2ZXIuZG93bmxvYWRSZXF1aXJlZCgpOwotICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBmaW5hbCBib29sZWFuIHVzZXJQYXNzQXV0aDsKLSAgICBzd2l0Y2ggKGRiX3R5cGUpIHsKLSAgICAgIGNhc2UgSDI6IHsKLSAgICAgICAgdXNlclBhc3NBdXRoID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZGF0YWJhc2UuZ2V0KCJkYXRhYmFzZSIpOwotICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgcGF0aCA9ICJkYi9SZXZpZXdEQiI7Ci0gICAgICAgICAgZGF0YWJhc2Uuc2V0KCJkYXRhYmFzZSIsIHBhdGgpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgZGIgPSBzaXRlLnJlc29sdmUocGF0aCk7Ci0gICAgICAgIGlmIChkYiA9PSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgZGllKCJkYXRhYmFzZS5kYXRhYmFzZSBtdXN0IGJlIHN1cHBsaWVkIGZvciBIMiIpOwotICAgICAgICB9Ci0gICAgICAgIGRiID0gZGIuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBpZiAoIWRiLmV4aXN0cygpICYmICFkYi5ta2RpcnMoKSkgewotICAgICAgICAgIHRocm93IGRpZSgiY2Fubm90IGNyZWF0ZSBkYXRhYmFzZS5kYXRhYmFzZSAiICsgZGIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEpEQkM6IHsKLSAgICAgICAgdXNlclBhc3NBdXRoID0gdHJ1ZTsKLSAgICAgICAgZGF0YWJhc2Uuc3RyaW5nKCJEcml2ZXIgY2xhc3MgbmFtZSIsICJkcml2ZXIiLCBudWxsKTsKLSAgICAgICAgZGF0YWJhc2Uuc3RyaW5nKCJVUkwiLCAidXJsIiwgbnVsbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFBPU1RHUkVTUUw6Ci0gICAgICBjYXNlIE1ZU1FMOiB7Ci0gICAgICAgIHVzZXJQYXNzQXV0aCA9IHRydWU7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBkZWZQb3J0ID0gIigiICsgZGJfdHlwZS50b1N0cmluZygpICsgIiBkZWZhdWx0KSI7Ci0gICAgICAgIGRhdGFiYXNlLnN0cmluZygiU2VydmVyIGhvc3RuYW1lIiwgImhvc3RuYW1lIiwgImxvY2FsaG9zdCIpOwotICAgICAgICBkYXRhYmFzZS5zdHJpbmcoIlNlcnZlciBwb3J0IiwgInBvcnQiLCBkZWZQb3J0LCB0cnVlKTsKLSAgICAgICAgZGF0YWJhc2Uuc3RyaW5nKCJEYXRhYmFzZSBuYW1lIiwgImRhdGFiYXNlIiwgInJldmlld2RiIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBkaWUoImludGVybmFsIGJ1ZywgZGF0YWJhc2UgIiArIGRiX3R5cGUgKyAiIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0KLSAgICBpZiAodXNlclBhc3NBdXRoKSB7Ci0gICAgICBkYXRhYmFzZS5zdHJpbmcoIkRhdGFiYXNlIHVzZXJuYW1lIiwgInVzZXJuYW1lIiwgdXNlcm5hbWUoKSk7Ci0gICAgICBkYXRhYmFzZS5wYXNzd29yZCgidXNlcm5hbWUiLCAicGFzc3dvcmQiKTsKLSAgICB9CisgICAgZGNpLmluaXRDb25maWcoZGF0YWJhc2UpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEdpdE1hbmFnZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0R2l0TWFuYWdlci5qYXZhCmluZGV4IGYwY2QzMWYuLmI2Zjg1MTkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0R2l0TWFuYWdlci5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0R2l0TWFuYWdlci5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAgIEBJbmplY3QKICAgSW5pdEdpdE1hbmFnZXIoZmluYWwgQ29uc29sZVVJIHVpLCBmaW5hbCBTZWN0aW9uLkZhY3Rvcnkgc2VjdGlvbnMpIHsKICAgICB0aGlzLnVpID0gdWk7Ci0gICAgdGhpcy5nZXJyaXQgPSBzZWN0aW9ucy5nZXQoImdlcnJpdCIpOworICAgIHRoaXMuZ2Vycml0ID0gc2VjdGlvbnMuZ2V0KCJnZXJyaXQiLCBudWxsKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0SHR0cGQuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0SHR0cGQuamF2YQppbmRleCA5OGQyZTQ3Li4zZTc5MDFhIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdEh0dHBkLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRIdHRwZC5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0LkluaXRVdGlsLnRvVVJJOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuQ29uc29sZVVJOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1V0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5TaXRlUGF0aHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5TaWduZWRUb2tlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CkBAIC00OCw4ICs0Niw4IEBACiAgICAgdGhpcy51aSA9IHVpOwogICAgIHRoaXMuc2l0ZSA9IHNpdGU7CiAgICAgdGhpcy5mbGFncyA9IGZsYWdzOwotICAgIHRoaXMuaHR0cGQgPSBzZWN0aW9ucy5nZXQoImh0dHBkIik7Ci0gICAgdGhpcy5nZXJyaXQgPSBzZWN0aW9ucy5nZXQoImdlcnJpdCIpOworICAgIHRoaXMuaHR0cGQgPSBzZWN0aW9ucy5nZXQoImh0dHBkIiwgbnVsbCk7CisgICAgdGhpcy5nZXJyaXQgPSBzZWN0aW9ucy5nZXQoImdlcnJpdCIsIG51bGwpOwogICB9CiAKICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CkBAIC0xMjEsMTIgKzExOSw3IEBACiAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IGRpZSgiaW52YWxpZCBodHRwZC5saXN0ZW5VcmwiKTsKICAgICB9Ci0gICAgaWYgKGdlcnJpdC5nZXQoImNhbm9uaWNhbFdlYlVybCIpICE9IG51bGwgLy8KLSAgICAgICAgfHwgKCFwcm94eSAmJiBzc2wpIC8vCi0gICAgICAgIHx8IGdldEF1dGhUeXBlKCkgPT0gQXV0aFR5cGUuT1BFTklEKSB7Ci0gICAgICBnZXJyaXQuc3RyaW5nKCJDYW5vbmljYWwgVVJMIiwgImNhbm9uaWNhbFdlYlVybCIsIHVyaS50b1N0cmluZygpKTsKLSAgICB9Ci0KKyAgICBnZXJyaXQuc3RyaW5nKCJDYW5vbmljYWwgVVJMIiwgImNhbm9uaWNhbFdlYlVybCIsIHVyaS50b1N0cmluZygpKTsKICAgICBnZW5lcmF0ZVNzbENlcnRpZmljYXRlKCk7CiAgIH0KIApAQCAtMTk2LDggKzE4OSw0IEBACiAgICAgICB0aHJvdyBkaWUoIkNhbm5vdCBkZWxldGUgIiArIHRtcGRpcik7CiAgICAgfQogICB9Ci0KLSAgcHJpdmF0ZSBBdXRoVHlwZSBnZXRBdXRoVHlwZSgpIHsKLSAgICByZXR1cm4gQ29uZmlnVXRpbC5nZXRFbnVtKGZsYWdzLmNmZywgImF1dGgiLCBudWxsLCAidHlwZSIsIEF1dGhUeXBlLk9QRU5JRCk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0UGx1Z2luU3RlcHNMb2FkZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0UGx1Z2luU3RlcHNMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjU4NzAxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRQbHVnaW5TdGVwc0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlBsdWdpbk5hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuQ29uc29sZVVJOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBJbml0UGx1Z2luU3RlcHNMb2FkZXIgeworICBwcml2YXRlIGZpbmFsIEZpbGUgcGx1Z2luc0RpcjsKKyAgcHJpdmF0ZSBmaW5hbCBJbmplY3RvciBpbml0SW5qZWN0b3I7CisgIGZpbmFsIENvbnNvbGVVSSB1aTsKKworICBASW5qZWN0CisgIHB1YmxpYyBJbml0UGx1Z2luU3RlcHNMb2FkZXIoZmluYWwgQ29uc29sZVVJIHVpLCBmaW5hbCBTaXRlUGF0aHMgc2l0ZVBhdGhzLAorICAgICAgZmluYWwgSW5qZWN0b3IgaW5pdEluamVjdG9yKSB7CisgICAgdGhpcy5wbHVnaW5zRGlyID0gc2l0ZVBhdGhzLnBsdWdpbnNfZGlyOworICAgIHRoaXMuaW5pdEluamVjdG9yID0gaW5pdEluamVjdG9yOworICAgIHRoaXMudWkgPSB1aTsKKyAgfQorCisgIHB1YmxpYyBDb2xsZWN0aW9uPEluaXRTdGVwPiBnZXRJbml0U3RlcHMoKSB7CisgICAgTGlzdDxGaWxlPiBqYXJzID0gc2NhbkphcnNJblBsdWdpbnNEaXJlY3RvcnkoKTsKKyAgICBBcnJheUxpc3Q8SW5pdFN0ZXA+IHBsdWdpbnNJbml0U3RlcHMgPSBuZXcgQXJyYXlMaXN0PEluaXRTdGVwPigpOworCisgICAgZm9yIChGaWxlIGphciA6IGphcnMpIHsKKyAgICAgIEluaXRTdGVwIGluaXQgPSBsb2FkSW5pdFN0ZXAoamFyKTsKKyAgICAgIGlmIChpbml0ICE9IG51bGwpIHsKKyAgICAgICAgcGx1Z2luc0luaXRTdGVwcy5hZGQoaW5pdCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBwbHVnaW5zSW5pdFN0ZXBzOworICB9CisKKyAgcHJpdmF0ZSBJbml0U3RlcCBsb2FkSW5pdFN0ZXAoRmlsZSBqYXIpIHsKKyAgICB0cnkgeworICAgICAgQ2xhc3NMb2FkZXIgcGx1Z2luTG9hZGVyID0KKyAgICAgICAgICBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHtqYXIudG9VUkkoKS50b1VSTCgpfSwKKyAgICAgICAgICAgICAgSW5pdFBsdWdpblN0ZXBzTG9hZGVyLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoamFyKTsKKyAgICAgIEF0dHJpYnV0ZXMgamFyRmlsZUF0dHJpYnV0ZXMgPSBqYXJGaWxlLmdldE1hbmlmZXN0KCkuZ2V0TWFpbkF0dHJpYnV0ZXMoKTsKKyAgICAgIFN0cmluZyBpbml0Q2xhc3NOYW1lID0gamFyRmlsZUF0dHJpYnV0ZXMuZ2V0VmFsdWUoIkdlcnJpdC1Jbml0U3RlcCIpOworICAgICAgaWYgKGluaXRDbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgQ2xhc3M8PyBleHRlbmRzIEluaXRTdGVwPiBpbml0U3RlcENsYXNzID0KKyAgICAgICAgICAoQ2xhc3M8PyBleHRlbmRzIEluaXRTdGVwPikgcGx1Z2luTG9hZGVyLmxvYWRDbGFzcyhpbml0Q2xhc3NOYW1lKTsKKyAgICAgIHJldHVybiBnZXRQbHVnaW5JbmplY3RvcihqYXIpLmdldEluc3RhbmNlKGluaXRTdGVwQ2xhc3MpOworICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICB1aS5tZXNzYWdlKAorICAgICAgICAgICJXQVJOOiBJbml0U3RlcCBmcm9tIHBsdWdpbiAlcyBkb2VzIG5vdCBpbXBsZW1lbnQgJXMgKEV4Y2VwdGlvbjogJXMpIiwKKyAgICAgICAgICBqYXIuZ2V0TmFtZSgpLCBJbml0U3RlcC5jbGFzcy5nZXROYW1lKCksIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICB1aS5tZXNzYWdlKAorICAgICAgICAgICJXQVJOOiBDYW5ub3QgbG9hZCBhbmQgZ2V0IHBsdWdpbiBpbml0IHN0ZXAgZm9yICVzIChFeGNlcHRpb246ICVzKSIsCisgICAgICAgICAgamFyLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEluamVjdG9yIGdldFBsdWdpbkluamVjdG9yKEZpbGUgamFyRmlsZSkgeworICAgIFN0cmluZyBqYXJGaWxlTmFtZSA9IGphckZpbGUuZ2V0TmFtZSgpOworICAgIGZpbmFsIFN0cmluZyBwbHVnaW5OYW1lID0KKyAgICAgICAgamFyRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGphckZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykpOworICAgIHJldHVybiBpbml0SW5qZWN0b3IuY3JlYXRlQ2hpbGRJbmplY3RvcihuZXcgQWJzdHJhY3RNb2R1bGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZChTdHJpbmcuY2xhc3MpLmFubm90YXRlZFdpdGgoUGx1Z2luTmFtZS5jbGFzcykudG9JbnN0YW5jZSgKKyAgICAgICAgICAgIHBsdWdpbk5hbWUpOworICAgICAgfQorICAgIH0pOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PEZpbGU+IHNjYW5KYXJzSW5QbHVnaW5zRGlyZWN0b3J5KCkgeworICAgIGlmIChwbHVnaW5zRGlyID09IG51bGwgfHwgIXBsdWdpbnNEaXIuZXhpc3RzKCkpIHsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisgICAgRmlsZVtdIG1hdGNoZXMgPSBwbHVnaW5zRGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKKyAgICAgICAgU3RyaW5nIG4gPSBwYXRobmFtZS5nZXROYW1lKCk7CisgICAgICAgIHJldHVybiAobi5lbmRzV2l0aCgiLmphciIpICYmIHBhdGhuYW1lLmlzRmlsZSgpKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAobWF0Y2hlcyA9PSBudWxsKSB7CisgICAgICB1aS5tZXNzYWdlKCJXQVJOOiBDYW5ub3QgbGlzdCAlcyIsIHBsdWdpbnNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKyAgICBBcnJheXMuc29ydChtYXRjaGVzLCBuZXcgQ29tcGFyYXRvcjxGaWxlPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBjb21wYXJlKEZpbGUgbzEsIEZpbGUgbzIpIHsKKyAgICAgICAgcmV0dXJuIG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChtYXRjaGVzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRQbHVnaW5zLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFBsdWdpbnMuamF2YQppbmRleCAxNTVmZTRjLi5iODJkZjY0IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFBsdWdpbnMuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFBsdWdpbnMuamF2YQpAQCAtMzksMTcgKzM5LDI0IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBDb25zb2xlVUkgdWk7CiAgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGU7CisgIHByaXZhdGUgSW5pdFBsdWdpblN0ZXBzTG9hZGVyIHBsdWdpbkxvYWRlcjsKIAogICBASW5qZWN0Ci0gIEluaXRQbHVnaW5zKGZpbmFsIENvbnNvbGVVSSB1aSwgZmluYWwgU2l0ZVBhdGhzIHNpdGUpIHsKKyAgSW5pdFBsdWdpbnMoZmluYWwgQ29uc29sZVVJIHVpLCBmaW5hbCBTaXRlUGF0aHMgc2l0ZSwgSW5pdFBsdWdpblN0ZXBzTG9hZGVyIHBsdWdpbkxvYWRlcikgewogICAgIHRoaXMudWkgPSB1aTsKICAgICB0aGlzLnNpdGUgPSBzaXRlOworICAgIHRoaXMucGx1Z2luTG9hZGVyID0gcGx1Z2luTG9hZGVyOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogICAgIHVpLmhlYWRlcigiUGx1Z2lucyIpOwogCisgICAgaW5zdGFsbFBsdWdpbnMoKTsKKyAgICBpbml0UGx1Z2lucygpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGluc3RhbGxQbHVnaW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBmaW5hbCBGaWxlIG15V2FyOwogICAgIHRyeSB7CiAgICAgICBteVdhciA9IEdlcnJpdExhdW5jaGVyLmdldERpc3RyaWJ1dGlvbkFyY2hpdmUoKTsKQEAgLTEyNyw2ICsxMzQsMTIgQEAKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHZvaWQgaW5pdFBsdWdpbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBmb3IgKEluaXRTdGVwIGluaXRTdGVwIDogcGx1Z2luTG9hZGVyLmdldEluaXRTdGVwcygpKSB7CisgICAgICBpbml0U3RlcC5ydW4oKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmVyc2lvbihmaW5hbCBGaWxlIHBsdWdpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICBmaW5hbCBKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShwbHVnaW4pOwogICAgIHRyeSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFNlbmRFbWFpbC5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTZW5kRW1haWwuamF2YQppbmRleCBjNTczMmU5Li5lNGI4MjdkMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTZW5kRW1haWwuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFNlbmRFbWFpbC5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiAgIEluaXRTZW5kRW1haWwoZmluYWwgQ29uc29sZVVJIHVpLCBmaW5hbCBTaXRlUGF0aHMgc2l0ZSwKICAgICAgIGZpbmFsIFNlY3Rpb24uRmFjdG9yeSBzZWN0aW9ucykgewogICAgIHRoaXMudWkgPSB1aTsKLSAgICB0aGlzLnNlbmRlbWFpbCA9IHNlY3Rpb25zLmdldCgic2VuZGVtYWlsIik7CisgICAgdGhpcy5zZW5kZW1haWwgPSBzZWN0aW9ucy5nZXQoInNlbmRlbWFpbCIsIG51bGwpOwogICAgIHRoaXMuc2l0ZSA9IHNpdGU7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0luaXRTc2hkLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFNzaGQuamF2YQppbmRleCBiZmMwZWFmLi4wYzJhM2M2IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFNzaGQuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFNzaGQuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogICAgIHRoaXMudWkgPSB1aTsKICAgICB0aGlzLnNpdGUgPSBzaXRlOwogICAgIHRoaXMubGlicmFyaWVzID0gbGlicmFyaWVzOwotICAgIHRoaXMuc3NoZCA9IHNlY3Rpb25zLmdldCgic3NoZCIpOworICAgIHRoaXMuc3NoZCA9IHNlY3Rpb25zLmdldCgic3NoZCIsIG51bGwpOwogICB9CiAKICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvSW5pdFV0aWwuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0VXRpbC5qYXZhCmluZGV4IDEzODJmNjUuLjBhZDc1NjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0VXRpbC5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9Jbml0VXRpbC5qYXZhCkBAIC0xNiw5ICsxNiw5IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5EaWU7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5Mb2NrRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuRmlsZUJhc2VkQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkxvY2tGaWxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9KREJDSW5pdGlhbGl6ZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9KREJDSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDAzNGMxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0pEQkNJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5Jbml0VXRpbC51c2VybmFtZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKKworY2xhc3MgSkRCQ0luaXRpYWxpemVyIGltcGxlbWVudHMgRGF0YWJhc2VDb25maWdJbml0aWFsaXplciB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbml0Q29uZmlnKFNlY3Rpb24gZGF0YWJhc2UpIHsKKyAgICBib29sZWFuIGhhc1VybCA9IFN0cmluZ3MuZW1wdHlUb051bGwoZGF0YWJhc2UuZ2V0KCJ1cmwiKSkgIT0gbnVsbDsKKyAgICBkYXRhYmFzZS5zdHJpbmcoIlVSTCIsICJ1cmwiLCBudWxsKTsKKyAgICBndWVzc0RyaXZlcihkYXRhYmFzZSk7CisgICAgZGF0YWJhc2Uuc3RyaW5nKCJEcml2ZXIgY2xhc3MgbmFtZSIsICJkcml2ZXIiLCBudWxsKTsKKyAgICBkYXRhYmFzZS5zdHJpbmcoIkRhdGFiYXNlIHVzZXJuYW1lIiwgInVzZXJuYW1lIiwgaGFzVXJsID8gbnVsbCA6IHVzZXJuYW1lKCkpOworICAgIGRhdGFiYXNlLnBhc3N3b3JkKCJ1c2VybmFtZSIsICJwYXNzd29yZCIpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGd1ZXNzRHJpdmVyKFNlY3Rpb24gZGF0YWJhc2UpIHsKKyAgICBTdHJpbmcgdXJsID0gU3RyaW5ncy5lbXB0eVRvTnVsbChkYXRhYmFzZS5nZXQoInVybCIpKTsKKyAgICBpZiAodXJsICE9IG51bGwgJiYgU3RyaW5ncy5pc051bGxPckVtcHR5KGRhdGFiYXNlLmdldCgiZHJpdmVyIikpKSB7CisgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImpkYmM6aDI6IikpIHsKKyAgICAgICAgZGF0YWJhc2Uuc2V0KCJkcml2ZXIiLCAib3JnLmgyLkRyaXZlciIpOworICAgICAgfSBlbHNlIGlmICh1cmwuc3RhcnRzV2l0aCgiamRiYzpteXNxbDoiKSkgeworICAgICAgICBkYXRhYmFzZS5zZXQoImRyaXZlciIsICJjb20ubXlzcWwuamRiYy5Ecml2ZXIiKTsKKyAgICAgIH0gZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoImpkYmM6cG9zdGdyZXNxbDoiKSkgeworICAgICAgICBkYXRhYmFzZS5zZXQoImRyaXZlciIsICJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9MaWJyYXJpZXMuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9MaWJyYXJpZXMuamF2YQppbmRleCBmZjFlZGRmLi5iMWZhMGMzIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyaWVzLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcmllcy5qYXZhCkBAIC03OCw2ICs3OCw3IEBACiAgICAgZGwuc2V0TmFtZShnZXQoY2ZnLCBuLCAibmFtZSIpKTsKICAgICBkbC5zZXRKYXJVcmwoZ2V0KGNmZywgbiwgInVybCIpKTsKICAgICBkbC5zZXRTSEExKGdldChjZmcsIG4sICJzaGExIikpOworICAgIGRsLnNldFJlbW92ZShnZXQoY2ZnLCBuLCAicmVtb3ZlIikpOwogICAgIGZpZWxkLnNldCh0aGlzLCBkbCk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcnlEb3dubG9hZGVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyeURvd25sb2FkZXIuamF2YQppbmRleCBlYTFiNTE1Li5iZjM1OGY0IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyeURvd25sb2FkZXIuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyeURvd25sb2FkZXIuamF2YQpAQCAtMTQsOCArMTQsMTAgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5wZ20udXRpbC5Db25zb2xlVUk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWwuRGllOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLklvVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTI2LDYgKzI4LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CkBAIC00MCwyMCArNDMsMTggQEAKIGNsYXNzIExpYnJhcnlEb3dubG9hZGVyIHsKICAgcHJpdmF0ZSBmaW5hbCBDb25zb2xlVUkgdWk7CiAgIHByaXZhdGUgZmluYWwgRmlsZSBsaWJfZGlyOwotICBwcml2YXRlIGZpbmFsIFJlbG9hZFNpdGVMaWJyYXJ5IHJlbG9hZDsKIAogICBwcml2YXRlIGJvb2xlYW4gcmVxdWlyZWQ7CiAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAgIHByaXZhdGUgU3RyaW5nIGphclVybDsKICAgcHJpdmF0ZSBTdHJpbmcgc2hhMTsKKyAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlOwogICBwcml2YXRlIEZpbGUgZHN0OwogCiAgIEBJbmplY3QKLSAgTGlicmFyeURvd25sb2FkZXIoZmluYWwgUmVsb2FkU2l0ZUxpYnJhcnkgcmVsb2FkLCBmaW5hbCBDb25zb2xlVUkgdWksCi0gICAgICBmaW5hbCBTaXRlUGF0aHMgc2l0ZSkgeworICBMaWJyYXJ5RG93bmxvYWRlcihDb25zb2xlVUkgdWksIFNpdGVQYXRocyBzaXRlKSB7CiAgICAgdGhpcy51aSA9IHVpOwogICAgIHRoaXMubGliX2RpciA9IHNpdGUubGliX2RpcjsKLSAgICB0aGlzLnJlbG9hZCA9IHJlbG9hZDsKICAgfQogCiAgIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewpAQCAtNjgsNiArNjksMTAgQEAKICAgICB0aGlzLnNoYTEgPSBzaGExOwogICB9CiAKKyAgdm9pZCBzZXRSZW1vdmUoU3RyaW5nIHJlbW92ZSkgeworICAgIHRoaXMucmVtb3ZlID0gcmVtb3ZlOworICB9CisKICAgdm9pZCBkb3dubG9hZFJlcXVpcmVkKCkgewogICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlOwogICAgIGRvd25sb2FkKCk7CkBAIC0xMjMsNiArMTI4LDcgQEAKICAgICB9CiAKICAgICB0cnkgeworICAgICAgcmVtb3ZlU3RhbGVWZXJzaW9ucygpOwogICAgICAgZG9HZXRCeUh0dHAoKTsKICAgICAgIHZlcmlmeUZpbGVDaGVja3N1bSgpOwogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewpAQCAtMTU1LDcgKzE2MSwyOSBAQAogICAgICAgfQogICAgIH0KIAotICAgIHJlbG9hZC5yZWxvYWQoKTsKKyAgICBpZiAoZHN0LmV4aXN0cygpKSB7CisgICAgICBJb1V0aWwubG9hZEpBUnMoZHN0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVtb3ZlU3RhbGVWZXJzaW9ucygpIHsKKyAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShyZW1vdmUpKSB7CisgICAgICBTdHJpbmdbXSBuYW1lcyA9IGxpYl9kaXIubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgcmV0dXJuIG5hbWUubWF0Y2hlcygiXiIgKyByZW1vdmUgKyAiJCIpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIGlmIChuYW1lcyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoU3RyaW5nIG9sZCA6IG5hbWVzKSB7CisgICAgICAgICAgU3RyaW5nIGJhayA9ICIuIiArIG9sZCArICIuYmFja3VwIjsKKyAgICAgICAgICB1aS5tZXNzYWdlKCJSZW5hbWluZyAlcyB0byAlcyIsIG9sZCwgYmFrKTsKKyAgICAgICAgICBpZiAoIW5ldyBGaWxlKGxpYl9kaXIsIG9sZCkucmVuYW1lVG8obmV3IEZpbGUobGliX2RpciwgYmFrKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBEaWUoImNhbm5vdCByZW5hbWUgIiArIG9sZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGRvR2V0QnlIdHRwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9NeVNxbEluaXRpYWxpemVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTXlTcWxJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNmE0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTXlTcWxJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5wZ20uaW5pdC5Jbml0VXRpbC51c2VybmFtZTsKKworY2xhc3MgTXlTcWxJbml0aWFsaXplciBpbXBsZW1lbnRzIERhdGFiYXNlQ29uZmlnSW5pdGlhbGl6ZXIgeworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBpbml0Q29uZmlnKFNlY3Rpb24gZGF0YWJhc2VTZWN0aW9uKSB7CisgICAgZmluYWwgU3RyaW5nIGRlZlBvcnQgPSAiKG15c3FsIGRlZmF1bHQpIjsKKyAgICBkYXRhYmFzZVNlY3Rpb24uc3RyaW5nKCJTZXJ2ZXIgaG9zdG5hbWUiLCAiaG9zdG5hbWUiLCAibG9jYWxob3N0Iik7CisgICAgZGF0YWJhc2VTZWN0aW9uLnN0cmluZygiU2VydmVyIHBvcnQiLCAicG9ydCIsIGRlZlBvcnQsIHRydWUpOworICAgIGRhdGFiYXNlU2VjdGlvbi5zdHJpbmcoIkRhdGFiYXNlIG5hbWUiLCAiZGF0YWJhc2UiLCAicmV2aWV3ZGIiKTsKKyAgICBkYXRhYmFzZVNlY3Rpb24uc3RyaW5nKCJEYXRhYmFzZSB1c2VybmFtZSIsICJ1c2VybmFtZSIsIHVzZXJuYW1lKCkpOworICAgIGRhdGFiYXNlU2VjdGlvbi5wYXNzd29yZCgidXNlcm5hbWUiLCAicGFzc3dvcmQiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1Bvc3RncmVTUUxJbml0aWFsaXplci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1Bvc3RncmVTUUxJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjU2NjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvUG9zdGdyZVNRTEluaXRpYWxpemVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnBnbS5pbml0LkluaXRVdGlsLnVzZXJuYW1lOworCitjbGFzcyBQb3N0Z3JlU1FMSW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBEYXRhYmFzZUNvbmZpZ0luaXRpYWxpemVyIHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgaW5pdENvbmZpZyhTZWN0aW9uIGRhdGFiYXNlU2VjdGlvbikgeworICAgIGZpbmFsIFN0cmluZyBkZWZQb3J0ID0gIihwb3N0Z3Jlc3FsIGRlZmF1bHQpIjsKKyAgICBkYXRhYmFzZVNlY3Rpb24uc3RyaW5nKCJTZXJ2ZXIgaG9zdG5hbWUiLCAiaG9zdG5hbWUiLCAibG9jYWxob3N0Iik7CisgICAgZGF0YWJhc2VTZWN0aW9uLnN0cmluZygiU2VydmVyIHBvcnQiLCAicG9ydCIsIGRlZlBvcnQsIHRydWUpOworICAgIGRhdGFiYXNlU2VjdGlvbi5zdHJpbmcoIkRhdGFiYXNlIG5hbWUiLCAiZGF0YWJhc2UiLCAicmV2aWV3ZGIiKTsKKyAgICBkYXRhYmFzZVNlY3Rpb24uc3RyaW5nKCJEYXRhYmFzZSB1c2VybmFtZSIsICJ1c2VybmFtZSIsIHVzZXJuYW1lKCkpOworICAgIGRhdGFiYXNlU2VjdGlvbi5wYXNzd29yZCgidXNlcm5hbWUiLCAicGFzc3dvcmQiKTsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9SZWxvYWRTaXRlTGlicmFyeS5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1JlbG9hZFNpdGVMaWJyYXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMWQzYzAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1JlbG9hZFNpdGVMaWJyYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLmluaXQ7Ci0KLS8qKiBSZXF1ZXN0cyB0aGUgc2l0ZSdzIHtAY29kZSBsaWIvfSBkaXJlY3RvcnkgYmUgc2Nhbm5lZCBhZ2Fpbi4gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsb2FkU2l0ZUxpYnJhcnkgewotICBwdWJsaWMgdm9pZCByZWxvYWQoKTsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9TZWN0aW9uLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvU2VjdGlvbi5qYXZhCmluZGV4IDAyZWQ5OTEuLjM4N2I5M2EgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9TZWN0aW9uLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1NlY3Rpb24uamF2YQpAQCAtMjMsNTMgKzIzLDYwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogLyoqIEhlbHBlciB0byBlZGl0IGEgc2VjdGlvbiBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcy4gKi8KLWNsYXNzIFNlY3Rpb24gewotICBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgU2VjdGlvbiBnZXQoU3RyaW5nIG5hbWUpOworcHVibGljIGNsYXNzIFNlY3Rpb24geworICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgeworICAgIFNlY3Rpb24gZ2V0KEBBc3Npc3RlZCgic2VjdGlvbiIpIFN0cmluZyBzZWN0aW9uLAorICAgICAgICBAQXNzaXN0ZWQoInN1YnNlY3Rpb24iKSBTdHJpbmcgc3Vic2VjdGlvbik7CiAgIH0KIAogICBwcml2YXRlIGZpbmFsIEluaXRGbGFncyBmbGFnczsKICAgcHJpdmF0ZSBmaW5hbCBTaXRlUGF0aHMgc2l0ZTsKICAgcHJpdmF0ZSBmaW5hbCBDb25zb2xlVUkgdWk7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlY3Rpb247CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN1YnNlY3Rpb247CiAKICAgQEluamVjdAotICBTZWN0aW9uKGZpbmFsIEluaXRGbGFncyBmbGFncywgZmluYWwgU2l0ZVBhdGhzIHNpdGUsIGZpbmFsIENvbnNvbGVVSSB1aSwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBTdHJpbmcgc2VjdGlvbikgeworICBwdWJsaWMgU2VjdGlvbihmaW5hbCBJbml0RmxhZ3MgZmxhZ3MsIGZpbmFsIFNpdGVQYXRocyBzaXRlLAorICAgICAgZmluYWwgQ29uc29sZVVJIHVpLCBAQXNzaXN0ZWQoInNlY3Rpb24iKSBmaW5hbCBTdHJpbmcgc2VjdGlvbiwKKyAgICAgIEBBc3Npc3RlZCgic3Vic2VjdGlvbiIpIEBOdWxsYWJsZSBmaW5hbCBTdHJpbmcgc3Vic2VjdGlvbikgewogICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgICB0aGlzLnNpdGUgPSBzaXRlOwogICAgIHRoaXMudWkgPSB1aTsKICAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uOworICAgIHRoaXMuc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb247CiAgIH0KIAogICBTdHJpbmcgZ2V0KFN0cmluZyBuYW1lKSB7CiAgICAgcmV0dXJuIGZsYWdzLmNmZy5nZXRTdHJpbmcoc2VjdGlvbiwgbnVsbCwgbmFtZSk7CiAgIH0KIAotICB2b2lkIHNldChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CiAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gYWxsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgYWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KGZsYWdzLmNmZy5nZXRTdHJpbmdMaXN0KHNlY3Rpb24sIG51bGwsIG5hbWUpKSk7CisgICAgYWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KGZsYWdzLmNmZy5nZXRTdHJpbmdMaXN0KHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpKSk7CiAKICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgaWYgKGFsbC5zaXplKCkgPT0gMCB8fCBhbGwuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgZmxhZ3MuY2ZnLnNldFN0cmluZyhzZWN0aW9uLCBudWxsLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgIGZsYWdzLmNmZy5zZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSwgdmFsdWUpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgYWxsLnNldCgwLCB2YWx1ZSk7Ci0gICAgICAgIGZsYWdzLmNmZy5zZXRTdHJpbmdMaXN0KHNlY3Rpb24sIG51bGwsIG5hbWUsIGFsbCk7CisgICAgICAgIGZsYWdzLmNmZy5zZXRTdHJpbmdMaXN0KHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUsIGFsbCk7CiAgICAgICB9CiAKICAgICB9IGVsc2UgaWYgKGFsbC5zaXplKCkgPT0gMCkgewogICAgIH0gZWxzZSBpZiAoYWxsLnNpemUoKSA9PSAxKSB7Ci0gICAgICBmbGFncy5jZmcudW5zZXQoc2VjdGlvbiwgbnVsbCwgbmFtZSk7CisgICAgICBmbGFncy5jZmcudW5zZXQoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CiAgICAgfSBlbHNlIHsKICAgICAgIGFsbC5yZW1vdmUoMCk7Ci0gICAgICBmbGFncy5jZmcuc2V0U3RyaW5nTGlzdChzZWN0aW9uLCBudWxsLCBuYW1lLCBhbGwpOworICAgICAgZmxhZ3MuY2ZnLnNldFN0cmluZ0xpc3Qoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSwgYWxsKTsKICAgICB9CiAgIH0KIAotICA8VCBleHRlbmRzIEVudW08Pz4+IHZvaWQgc2V0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBUIHZhbHVlKSB7CisgIHB1YmxpYyA8VCBleHRlbmRzIEVudW08Pz4+IHZvaWQgc2V0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBUIHZhbHVlKSB7CiAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgIHNldChuYW1lLCB2YWx1ZS5uYW1lKCkpOwogICAgIH0gZWxzZSB7CkBAIC03NywxNSArODQsMTUgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIHVuc2V0KFN0cmluZyBuYW1lKSB7CisgIHB1YmxpYyB2b2lkIHVuc2V0KFN0cmluZyBuYW1lKSB7CiAgICAgc2V0KG5hbWUsIChTdHJpbmcpIG51bGwpOwogICB9CiAKLSAgU3RyaW5nIHN0cmluZyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZHYpIHsKKyAgcHVibGljIFN0cmluZyBzdHJpbmcoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGR2KSB7CiAgICAgcmV0dXJuIHN0cmluZyh0aXRsZSwgbmFtZSwgZHYsIGZhbHNlKTsKICAgfQogCi0gIFN0cmluZyBzdHJpbmcoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGR2LAorICBwdWJsaWMgU3RyaW5nIHN0cmluZyhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZHYsCiAgICAgICBmaW5hbCBib29sZWFuIG51bGxJZkRlZmF1bHQpIHsKICAgICBmaW5hbCBTdHJpbmcgb3YgPSBnZXQobmFtZSk7CiAgICAgU3RyaW5nIG52ID0gdWkucmVhZFN0cmluZyhvdiAhPSBudWxsID8gb3YgOiBkdiwgIiVzIiwgdGl0bGUpOwpAQCAtOTgsMTkgKzEwNSwxOSBAQAogICAgIHJldHVybiBudjsKICAgfQogCi0gIEZpbGUgcGF0aChmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVmVmFsdWUpIHsKKyAgcHVibGljIEZpbGUgcGF0aChmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVmVmFsdWUpIHsKICAgICByZXR1cm4gc2l0ZS5yZXNvbHZlKHN0cmluZyh0aXRsZSwgbmFtZSwgZGVmVmFsdWUpKTsKICAgfQogCi0gIDxUIGV4dGVuZHMgRW51bTw/Pj4gVCBzZWxlY3QoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgcHVibGljIDxUIGV4dGVuZHMgRW51bTw/Pj4gVCBzZWxlY3QoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgbmFtZSwKICAgICAgIGZpbmFsIFQgZGVmVmFsdWUpIHsKICAgICByZXR1cm4gc2VsZWN0KHRpdGxlLCBuYW1lLCBkZWZWYWx1ZSwgZmFsc2UpOwogICB9CiAKLSAgPFQgZXh0ZW5kcyBFbnVtPD8+PiBUIHNlbGVjdChmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBuYW1lLAorICBwdWJsaWMgPFQgZXh0ZW5kcyBFbnVtPD8+PiBUIHNlbGVjdChmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBuYW1lLAogICAgICAgZmluYWwgVCBkZWZWYWx1ZSwgZmluYWwgYm9vbGVhbiBudWxsSWZEZWZhdWx0KSB7CiAgICAgZmluYWwgYm9vbGVhbiBzZXQgPSBnZXQobmFtZSkgIT0gbnVsbDsKLSAgICBUIG9sZFZhbHVlID0gQ29uZmlnVXRpbC5nZXRFbnVtKGZsYWdzLmNmZywgc2VjdGlvbiwgbnVsbCwgbmFtZSwgZGVmVmFsdWUpOworICAgIFQgb2xkVmFsdWUgPSBDb25maWdVdGlsLmdldEVudW0oZmxhZ3MuY2ZnLCBzZWN0aW9uLCBzdWJzZWN0aW9uLCBuYW1lLCBkZWZWYWx1ZSk7CiAgICAgVCBuZXdWYWx1ZSA9IHVpLnJlYWRFbnVtKG9sZFZhbHVlLCAiJXMiLCB0aXRsZSk7CiAgICAgaWYgKG51bGxJZkRlZmF1bHQgJiYgbmV3VmFsdWUgPT0gZGVmVmFsdWUpIHsKICAgICAgIG5ld1ZhbHVlID0gbnVsbDsKQEAgLTEyNSwxNiArMTMyLDI2IEBACiAgICAgcmV0dXJuIG5ld1ZhbHVlOwogICB9CiAKLSAgU3RyaW5nIHBhc3N3b3JkKGZpbmFsIFN0cmluZyB1c2VybmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB7CisgIHB1YmxpYyBTdHJpbmcgc2VsZWN0KGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkdiwKKyAgICAgIFNldDxTdHJpbmc+IGFsbG93ZWRWYWx1ZXMpIHsKKyAgICBmaW5hbCBTdHJpbmcgb3YgPSBnZXQobmFtZSk7CisgICAgU3RyaW5nIG52ID0gdWkucmVhZFN0cmluZyhvdiAhPSBudWxsID8gb3YgOiBkdiwgYWxsb3dlZFZhbHVlcywgIiVzIiwgdGl0bGUpOworICAgIGlmICghZXEob3YsIG52KSkgeworICAgICAgc2V0KG5hbWUsIG52KTsKKyAgICB9CisgICAgcmV0dXJuIG52OworICB9CisKKyAgcHVibGljIFN0cmluZyBwYXNzd29yZChmaW5hbCBTdHJpbmcgdXNlcm5hbWUsIGZpbmFsIFN0cmluZyBwYXNzd29yZCkgewogICAgIGZpbmFsIFN0cmluZyBvdiA9IGdldFNlY3VyZShwYXNzd29yZCk7CiAKLSAgICBTdHJpbmcgdXNlciA9IGZsYWdzLnNlYy5nZXRTdHJpbmcoc2VjdGlvbiwgbnVsbCwgdXNlcm5hbWUpOworICAgIFN0cmluZyB1c2VyID0gZmxhZ3Muc2VjLmdldFN0cmluZyhzZWN0aW9uLCBzdWJzZWN0aW9uLCB1c2VybmFtZSk7CiAgICAgaWYgKHVzZXIgPT0gbnVsbCkgewogICAgICAgdXNlciA9IGdldCh1c2VybmFtZSk7CiAgICAgfQogCiAgICAgaWYgKHVzZXIgPT0gbnVsbCkgewotICAgICAgZmxhZ3Muc2VjLnVuc2V0KHNlY3Rpb24sIG51bGwsIHBhc3N3b3JkKTsKKyAgICAgIGZsYWdzLnNlYy51bnNldChzZWN0aW9uLCBzdWJzZWN0aW9uLCBwYXNzd29yZCk7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTE1NCwxOCArMTcxLDIyIEBACiAgICAgcmV0dXJuIG52OwogICB9CiAKLSAgU3RyaW5nIGdldFNlY3VyZShTdHJpbmcgbmFtZSkgewotICAgIHJldHVybiBmbGFncy5zZWMuZ2V0U3RyaW5nKHNlY3Rpb24sIG51bGwsIG5hbWUpOworICBwdWJsaWMgU3RyaW5nIGdldFNlY3VyZShTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBmbGFncy5zZWMuZ2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOwogICB9CiAKLSAgdm9pZCBzZXRTZWN1cmUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICBwdWJsaWMgdm9pZCBzZXRTZWN1cmUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewogICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICBmbGFncy5zZWMuc2V0U3RyaW5nKHNlY3Rpb24sIG51bGwsIG5hbWUsIHZhbHVlKTsKKyAgICAgIGZsYWdzLnNlYy5zZXRTdHJpbmcoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSwgdmFsdWUpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmbGFncy5zZWMudW5zZXQoc2VjdGlvbiwgbnVsbCwgbmFtZSk7CisgICAgICBmbGFncy5zZWMudW5zZXQoc2VjdGlvbiwgc3Vic2VjdGlvbiwgbmFtZSk7CiAgICAgfQogICB9CiAKKyAgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgcmV0dXJuIHNlY3Rpb247CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgewogICAgIGlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9TaXRlUGF0aEluaXRpYWxpemVyLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvU2l0ZVBhdGhJbml0aWFsaXplci5qYXZhCmluZGV4IGY4ZWY2MzcuLmJmMGFmN2YgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9TaXRlUGF0aEluaXRpYWxpemVyLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1NpdGVQYXRoSW5pdGlhbGl6ZXIuamF2YQpAQCAtODksNiArODksOCBAQAogICAgIGV4dHJhY3RNYWlsRXhhbXBsZSgiQ2hhbmdlRm9vdGVyLnZtIik7CiAgICAgZXh0cmFjdE1haWxFeGFtcGxlKCJDaGFuZ2VTdWJqZWN0LnZtIik7CiAgICAgZXh0cmFjdE1haWxFeGFtcGxlKCJDb21tZW50LnZtIik7CisgICAgZXh0cmFjdE1haWxFeGFtcGxlKCJDb21tZW50Rm9vdGVyLnZtIik7CisgICAgZXh0cmFjdE1haWxFeGFtcGxlKCJDb21taXRNZXNzYWdlRWRpdGVkLnZtIik7CiAgICAgZXh0cmFjdE1haWxFeGFtcGxlKCJNZXJnZWQudm0iKTsKICAgICBleHRyYWN0TWFpbEV4YW1wbGUoIk1lcmdlRmFpbC52bSIpOwogICAgIGV4dHJhY3RNYWlsRXhhbXBsZSgiTmV3Q2hhbmdlLnZtIik7CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvVXBncmFkZUZyb20yXzBfeC5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L1VwZ3JhZGVGcm9tMl8wX3guamF2YQppbmRleCA5ZjYyZmM1Li5iOTgyYWUxIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvVXBncmFkZUZyb20yXzBfeC5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9VcGdyYWRlRnJvbTJfMF94LmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsLkNvbnNvbGVVSTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5Tb2NrZXRVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CkBAIC0xMTgsMTEgKzExNywxMSBAQAogCiAgICAgZmluYWwgUHJvcGVydGllcyBvbGRwcm9wID0gcmVhZEdlcnJpdFNlcnZlclByb3BlcnRpZXMoKTsKICAgICBpZiAob2xkcHJvcCAhPSBudWxsKSB7Ci0gICAgICBmaW5hbCBTZWN0aW9uIGRhdGFiYXNlID0gc2VjdGlvbnMuZ2V0KCJkYXRhYmFzZSIpOworICAgICAgZmluYWwgU2VjdGlvbiBkYXRhYmFzZSA9IHNlY3Rpb25zLmdldCgiZGF0YWJhc2UiLCBudWxsKTsKIAogICAgICAgU3RyaW5nIHVybCA9IG9sZHByb3AuZ2V0UHJvcGVydHkoInVybCIpOwogICAgICAgaWYgKHVybCAhPSBudWxsICYmICFjb252ZXJ0VXJsKGRhdGFiYXNlLCB1cmwpKSB7Ci0gICAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsIERhdGFTb3VyY2VQcm92aWRlci5UeXBlLkpEQkMpOworICAgICAgICBkYXRhYmFzZS5zZXQoInR5cGUiLCAiamRiYyIpOwogICAgICAgICBkYXRhYmFzZS5zZXQoImRyaXZlciIsIG9sZHByb3AuZ2V0UHJvcGVydHkoImRyaXZlciIpKTsKICAgICAgICAgZGF0YWJhc2Uuc2V0KCJ1cmwiLCB1cmwpOwogICAgICAgfQpAQCAtMTg5LDcgKzE4OCw3IEBACiAKICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoImpkYmM6aDI6ZmlsZToiKSkgewogICAgICAgdXJsID0gdXJsLnN1YnN0cmluZygiamRiYzpoMjpmaWxlOiIubGVuZ3RoKCkpOwotICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgRGF0YVNvdXJjZVByb3ZpZGVyLlR5cGUuSDIpOworICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgImgyIik7CiAgICAgICBkYXRhYmFzZS5zZXQoImRhdGFiYXNlIiwgdXJsKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTIwMiw3ICsyMDEsNyBAQAogICAgICAgfQogCiAgICAgICBmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gU29ja2V0VXRpbC5wYXJzZSh1cmwuc3Vic3RyaW5nKDAsIHNsKSwgMCk7Ci0gICAgICBkYXRhYmFzZS5zZXQoInR5cGUiLCBEYXRhU291cmNlUHJvdmlkZXIuVHlwZS5QT1NUR1JFU1FMKTsKKyAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsICJwb3N0Z3Jlc3FsIik7CiAgICAgICBzZXRob3N0KGRhdGFiYXNlLCBhZGRyKTsKICAgICAgIGRhdGFiYXNlLnNldCgiZGF0YWJhc2UiLCB1cmwuc3Vic3RyaW5nKHNsICsgMSkpOwogICAgICAgc2V0dXNlcihkYXRhYmFzZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKQEAgLTIxMSw3ICsyMTAsNyBAQAogCiAgICAgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOnBvc3RncmVzcWw6IikpIHsKICAgICAgIHVybCA9IHVybC5zdWJzdHJpbmcoImpkYmM6cG9zdGdyZXNxbDoiLmxlbmd0aCgpKTsKLSAgICAgIGRhdGFiYXNlLnNldCgidHlwZSIsIERhdGFTb3VyY2VQcm92aWRlci5UeXBlLlBPU1RHUkVTUUwpOworICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgInBvc3RncmVzcWwiKTsKICAgICAgIGRhdGFiYXNlLnNldCgiaG9zdG5hbWUiLCAibG9jYWxob3N0Iik7CiAgICAgICBkYXRhYmFzZS5zZXQoImRhdGFiYXNlIiwgdXJsKTsKICAgICAgIHNldHVzZXIoZGF0YWJhc2UsIHVzZXJuYW1lLCBwYXNzd29yZCk7CkBAIC0yMjYsNyArMjI1LDcgQEAKICAgICAgIH0KIAogICAgICAgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgYWRkciA9IFNvY2tldFV0aWwucGFyc2UodXJsLnN1YnN0cmluZygwLCBzbCksIDApOwotICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgRGF0YVNvdXJjZVByb3ZpZGVyLlR5cGUuTVlTUUwpOworICAgICAgZGF0YWJhc2Uuc2V0KCJ0eXBlIiwgIm15c3FsIik7CiAgICAgICBzZXRob3N0KGRhdGFiYXNlLCBhZGRyKTsKICAgICAgIGRhdGFiYXNlLnNldCgiZGF0YWJhc2UiLCB1cmwuc3Vic3RyaW5nKHNsICsgMSkpOwogICAgICAgc2V0dXNlcihkYXRhYmFzZSwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Db25zb2xlVUkuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Db25zb2xlVUkuamF2YQppbmRleCBiNGUwZmFkLi5lOGNmMGFiIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvQ29uc29sZVVJLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0NvbnNvbGVVSS5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkNvbnNvbGU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKiogQ29uc29sZSBiYXNlZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBpbnZva2luZyB1c2VyLiAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnNvbGVVSSB7CkBAIC03Myw2ICs3NCwxMCBAQAogICAvKiogUHJvbXB0IHRoZSB1c2VyIGZvciBhIHN0cmluZywgc3VnZ2VzdGluZyBhIGRlZmF1bHQsIGFuZCByZXR1cm5pbmcgY2hvaWNlLiAqLwogICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHJlYWRTdHJpbmcoU3RyaW5nIGRlZiwgU3RyaW5nIGZtdCwgT2JqZWN0Li4uIGFyZ3MpOwogCisgIC8qKiBQcm9tcHQgdGhlIHVzZXIgdG8gbWFrZSBhIGNob2ljZSBmcm9tIGFuIGFsbG93ZWQgbGlzdCBvZiB2YWx1ZXMuICovCisgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcmVhZFN0cmluZyhTdHJpbmcgZGVmLCBTZXQ8U3RyaW5nPiBhbGxvd2VkVmFsdWVzLAorICAgICAgU3RyaW5nIGZtdCwgT2JqZWN0Li4uIGFyZ3MpOworCiAgIC8qKiBQcm9tcHQgdGhlIHVzZXIgZm9yIGFuIGludGVnZXIgdmFsdWUsIHN1Z2dlc3RpbmcgYSBkZWZhdWx0LiAqLwogICBwdWJsaWMgaW50IHJlYWRJbnQoaW50IGRlZiwgU3RyaW5nIGZtdCwgT2JqZWN0Li4uIGFyZ3MpIHsKICAgICBmb3IgKDs7KSB7CkBAIC0xNjIsNiArMTY3LDI0IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKFN0cmluZyBkZWYsIFNldDxTdHJpbmc+IGFsbG93ZWRWYWx1ZXMsIFN0cmluZyBmbXQsCisgICAgICAgIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIFN0cmluZyByID0gcmVhZFN0cmluZyhkZWYsIGZtdCwgYXJncyk7CisgICAgICAgIGlmIChhbGxvd2VkVmFsdWVzLmNvbnRhaW5zKHIudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICByZXR1cm4gci50b0xvd2VyQ2FzZSgpOworICAgICAgICB9CisgICAgICAgIGlmICghIj8iLmVxdWFscyhyKSkgeworICAgICAgICAgIGNvbnNvbGUucHJpbnRmKCJlcnJvcjogJyVzJyBpcyBub3QgYSB2YWxpZCBjaG9pY2VcbiIsIHIpOworICAgICAgICB9CisgICAgICAgIGNvbnNvbGUucHJpbnRmKCIgICAgICAgU3VwcG9ydGVkIG9wdGlvbnMgYXJlOlxuIik7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHYgOiBhbGxvd2VkVmFsdWVzKSB7CisgICAgICAgICAgY29uc29sZS5wcmludGYoIiAgICAgICAgICVzXG4iLCB2LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHBhc3N3b3JkKFN0cmluZyBmbXQsIE9iamVjdC4uLiBhcmdzKSB7CiAgICAgICBmaW5hbCBTdHJpbmcgcHJvbXB0ID0gU3RyaW5nLmZvcm1hdChmbXQsIGFyZ3MpOwogICAgICAgZm9yICg7OykgewpAQCAtMjQyLDYgKzI2NSwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZyhTdHJpbmcgZGVmLCBTZXQ8U3RyaW5nPiBhbGxvd2VkVmFsdWVzLCBTdHJpbmcgZm10LAorICAgICAgICBPYmplY3QuLi4gYXJncykgeworICAgICAgcmV0dXJuIGRlZjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yVXNlcigpIHsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9HYXJiYWdlQ29sbGVjdGlvbkxvZ0ZpbGUuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9HYXJiYWdlQ29sbGVjdGlvbkxvZ0ZpbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWU1NzYzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0dhcmJhZ2VDb2xsZWN0aW9uTG9nRmlsZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdhcmJhZ2VDb2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5BcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkRhaWx5Um9sbGluZ0ZpbGVBcHBlbmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5oZWxwZXJzLk9ubHlPbmNlRXJyb3JIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouc3BpLkVycm9ySGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIEdhcmJhZ2VDb2xsZWN0aW9uTG9nRmlsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5zbGY0ai5Mb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoR2FyYmFnZUNvbGxlY3Rpb25Mb2dGaWxlLmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIExpZmVjeWNsZUxpc3RlbmVyIHN0YXJ0KEZpbGUgc2l0ZVBhdGgpCisgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBGaWxlIGxvZ2RpciA9IG5ldyBTaXRlUGF0aHMoc2l0ZVBhdGgpLmxvZ3NfZGlyOworICAgIGlmICghbG9nZGlyLmV4aXN0cygpICYmICFsb2dkaXIubWtkaXJzKCkpIHsKKyAgICAgIHRocm93IG5ldyBEaWUoIkNhbm5vdCBjcmVhdGUgbG9nIGRpcmVjdG9yeTogIiArIGxvZ2Rpcik7CisgICAgfQorCisgICAgUGF0dGVybkxheW91dCBsYXlvdXQgPSBuZXcgUGF0dGVybkxheW91dCgpOworICAgIGxheW91dC5zZXRDb252ZXJzaW9uUGF0dGVybigiWyVkXSAlLTVwICV4OiAlbSVuIik7CisKKyAgICBEYWlseVJvbGxpbmdGaWxlQXBwZW5kZXIgZHN0ID0gbmV3IERhaWx5Um9sbGluZ0ZpbGVBcHBlbmRlcigpOworICAgIGRzdC5zZXROYW1lKEdhcmJhZ2VDb2xsZWN0aW9uLkxPR19OQU1FKTsKKyAgICBkc3Quc2V0TGF5b3V0KGxheW91dCk7CisgICAgZHN0LnNldEVuY29kaW5nKCJVVEYtOCIpOworICAgIGRzdC5zZXRGaWxlKG5ldyBGaWxlKHJlc29sdmUobG9nZGlyKSwgR2FyYmFnZUNvbGxlY3Rpb24uTE9HX05BTUUpLmdldFBhdGgoKSk7CisgICAgZHN0LnNldEltbWVkaWF0ZUZsdXNoKHRydWUpOworICAgIGRzdC5zZXRBcHBlbmQodHJ1ZSk7CisgICAgZHN0LnNldFRocmVzaG9sZChMZXZlbC5JTkZPKTsKKyAgICBkc3Quc2V0RXJyb3JIYW5kbGVyKG5ldyBMb2dFcnJvckhhbmRsZXIoKSk7CisgICAgZHN0LmFjdGl2YXRlT3B0aW9ucygpOworICAgIGRzdC5zZXRFcnJvckhhbmRsZXIobmV3IE9ubHlPbmNlRXJyb3JIYW5kbGVyKCkpOworCisgICAgTG9nZ2VyIGdjTG9nZ2VyID0gTG9nTWFuYWdlci5nZXRMb2dnZXIoR2FyYmFnZUNvbGxlY3Rpb24uTE9HX05BTUUpOworICAgIGdjTG9nZ2VyLnJlbW92ZUFsbEFwcGVuZGVycygpOworICAgIGdjTG9nZ2VyLmFkZEFwcGVuZGVyKGRzdCk7CisgICAgZ2NMb2dnZXIuc2V0QWRkaXRpdml0eShmYWxzZSk7CisKKyAgICByZXR1cm4gbmV3IExpZmVjeWNsZUxpc3RlbmVyKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBMb2dNYW5hZ2VyLmdldExvZ2dlcihHYXJiYWdlQ29sbGVjdGlvbi5MT0dfTkFNRSkucmVtb3ZlQWxsQXBwZW5kZXJzKCk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEZpbGUgcmVzb2x2ZShGaWxlIGxvZ3NfZGlyKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBsb2dzX2Rpci5nZXRDYW5vbmljYWxGaWxlKCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIGxvZ3NfZGlyLmdldEFic29sdXRlRmlsZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgR2FyYmFnZUNvbGxlY3Rpb25Mb2dGaWxlKCkgeworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTG9nRXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUsIGludCBlcnJvckNvZGUsCisgICAgICAgIExvZ2dpbmdFdmVudCBldmVudCkgeworICAgICAgZXJyb3IoZSAhPSBudWxsID8gZS5nZXRNZXNzYWdlKCkgOiBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSwgRXhjZXB0aW9uIGUsIGludCBlcnJvckNvZGUpIHsKKyAgICAgIGVycm9yKGUgIT0gbnVsbCA/IGUuZ2V0TWVzc2FnZSgpIDogbWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IG9wZW4gJyIgKyBHYXJiYWdlQ29sbGVjdGlvbi5MT0dfTkFNRSArICInIGxvZyBmaWxlOiAiCisgICAgICAgICAgKyBtZXNzYWdlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY3RpdmF0ZU9wdGlvbnMoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QXBwZW5kZXIoQXBwZW5kZXIgYXBwZW5kZXIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCYWNrdXBBcHBlbmRlcihBcHBlbmRlciBhcHBlbmRlcikgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldExvZ2dlcihMb2dnZXIgbG9nZ2VyKSB7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvSW9VdGlsLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvSW9VdGlsLmphdmEKaW5kZXggOTM5ODg1MS4uZjc1MDc0OGEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Jb1V0aWwuamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvSW9VdGlsLmphdmEKQEAgLTE0LDkgKzE0LDE5IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucGdtLnV0aWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgZmluYWwgY2xhc3MgSW9VdGlsIHsKICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlXaXRoVGhyZWFkKGZpbmFsIElucHV0U3RyZWFtIHNyYywKQEAgLTQyLDYgKzUyLDQ3IEBACiAgICAgfS5zdGFydCgpOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRKQVJzKEZpbGUuLi4gamFycykgeworICAgIENsYXNzTG9hZGVyIGNsID0gSW9VdGlsLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CisgICAgaWYgKCEoY2wgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikpIHsKKyAgICAgIHRocm93IG5vQWRkVVJMKCJOb3QgbG9hZGVkIGJ5IFVSTENsYXNzTG9hZGVyIiwgbnVsbCk7CisgICAgfQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgVVJMQ2xhc3NMb2FkZXIgdXJsQ2xhc3NMb2FkZXIgPSAoVVJMQ2xhc3NMb2FkZXIpIGNsOworCisgICAgTWV0aG9kIGFkZFVSTDsKKyAgICB0cnkgeworICAgICAgYWRkVVJMID0gVVJMQ2xhc3NMb2FkZXIuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoImFkZFVSTCIsIFVSTC5jbGFzcyk7CisgICAgICBhZGRVUkwuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBub0FkZFVSTCgiTWV0aG9kIGFkZFVSTCBub3QgYXZhaWxhYmxlIiwgZSk7CisgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5vQWRkVVJMKCJNZXRob2QgYWRkVVJMIG5vdCBhdmFpbGFibGUiLCBlKTsKKyAgICB9CisKKyAgICBTZXQ8VVJMPiBoYXZlID0gU2V0cy5uZXdIYXNoU2V0KEFycmF5cy5hc0xpc3QodXJsQ2xhc3NMb2FkZXIuZ2V0VVJMcygpKSk7CisgICAgZm9yIChGaWxlIHBhdGggOiBqYXJzKSB7CisgICAgICB0cnkgeworICAgICAgICBVUkwgdXJsID0gcGF0aC50b1VSSSgpLnRvVVJMKCk7CisgICAgICAgIGlmIChoYXZlLmFkZCh1cmwpKSB7CisgICAgICAgICAgYWRkVVJMLmludm9rZShjbCwgdXJsKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZSk7CisgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBub0FkZFVSTCgiYWRkVVJMICIgKyBwYXRoICsgIiBmYWlsZWQiLCBlKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBub0FkZFVSTCgiYWRkVVJMICIgKyBwYXRoICsgIiBmYWlsZWQiLCBlKTsKKyAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBub0FkZFVSTCgiYWRkVVJMICIgKyBwYXRoICsgIiBmYWlsZWQiLCBlLmdldENhdXNlKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vQWRkVVJMKFN0cmluZyBtLCBUaHJvd2FibGUgd2h5KSB7CisgICAgU3RyaW5nIHByZWZpeCA9ICJDYW5ub3QgZXh0ZW5kIGNsYXNzcGF0aDogIjsKKyAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHByZWZpeCArIG0sIHdoeSk7CisgIH0KICAgcHJpdmF0ZSBJb1V0aWwoKSB7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9Mb2dGaWxlQ29tcHJlc3Nvci5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0xvZ0ZpbGVDb21wcmVzc29yLmphdmEKaW5kZXggNTdjYzdjNC4uY2RhNjUzZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0xvZ0ZpbGVDb21wcmVzc29yLmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL0xvZ0ZpbGVDb21wcmVzc29yLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2FyYmFnZUNvbGxlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Xb3JrUXVldWU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC05Nyw2ICs5OCw3IEBACiAgIHByaXZhdGUgYm9vbGVhbiBpc0xpdmUoZmluYWwgRmlsZSBlbnRyeSkgewogICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwogICAgIHJldHVybiBFcnJvckxvZ0ZpbGUuTE9HX05BTUUuZXF1YWxzKG5hbWUpIC8vCisgICAgICAgIHx8IEdhcmJhZ2VDb2xsZWN0aW9uLkxPR19OQU1FLmVxdWFscyhuYW1lKSAvLwogICAgICAgICB8fCAic3NoZF9sb2ciLmVxdWFscyhuYW1lKSAvLwogICAgICAgICB8fCAiaHR0cGRfbG9nIi5lcXVhbHMobmFtZSkgLy8KICAgICAgICAgfHwgImdlcnJpdC5ydW4iLmVxdWFscyhuYW1lKSAvLwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1J1bnRpbWVTaHV0ZG93bi5qYXZhIGIvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1J1bnRpbWVTaHV0ZG93bi5qYXZhCmluZGV4IDE4YjcwNjQuLmMwMGFkN2YgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9SdW50aW1lU2h1dGRvd24uamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvUnVudGltZVNodXRkb3duLmphdmEKQEAgLTEwMyw5ICsxMDMsNyBAQAogICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3YWl0KCk7CiAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLndhcm4oIlRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICArICIgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgZ3JhY2VmdWwgc2h1dGRvd247IgotICAgICAgICAgICAgICAgICsgIiBpZ25vcmluZyBpbnRlcnJ1cHQgcmVxdWVzdCIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1NpdGVMaWJyYXJ5QmFzZWREYXRhU291cmNlUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9TaXRlTGlicmFyeUJhc2VkRGF0YVNvdXJjZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFiNzM5NQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wZ20vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vdXRpbC9TaXRlTGlicmFyeUJhc2VkRGF0YVNvdXJjZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnBnbS51dGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5Mb25nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBqYXZheC5zcWwuRGF0YVNvdXJjZTsKKworLyoqIExvYWRzIHRoZSBzaXRlIGxpYnJhcnkgaWYgbm90IHlldCBsb2FkZWQuICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgU2l0ZUxpYnJhcnlCYXNlZERhdGFTb3VyY2VQcm92aWRlciBleHRlbmRzIERhdGFTb3VyY2VQcm92aWRlciB7CisgIHByaXZhdGUgZmluYWwgRmlsZSBsaWJkaXI7CisgIHByaXZhdGUgYm9vbGVhbiBpbml0OworCisgIEBJbmplY3QKKyAgU2l0ZUxpYnJhcnlCYXNlZERhdGFTb3VyY2VQcm92aWRlcihTaXRlUGF0aHMgc2l0ZSwKKyAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZywKKyAgICAgIERhdGFTb3VyY2VQcm92aWRlci5Db250ZXh0IGN0eCwKKyAgICAgIERhdGFTb3VyY2VUeXBlIGRzdCkgeworICAgIHN1cGVyKHNpdGUsIGNmZywgY3R4LCBkc3QpOworICAgIGxpYmRpciA9IHNpdGUubGliX2RpcjsKKyAgfQorCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRGF0YVNvdXJjZSBnZXQoKSB7CisgICAgaWYgKCFpbml0KSB7CisgICAgICBsb2FkU2l0ZUxpYigpOworICAgICAgaW5pdCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdXBlci5nZXQoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBsb2FkU2l0ZUxpYigpIHsKKyAgICBGaWxlW10gamFycyA9IGxpYmRpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGgpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBwYXRoLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIChuYW1lLmVuZHNXaXRoKCIuamFyIikgfHwgbmFtZS5lbmRzV2l0aCgiLnppcCIpKQorICAgICAgICAgICAgJiYgcGF0aC5pc0ZpbGUoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICBpZiAoamFycyAhPSBudWxsICYmIDAgPCBqYXJzLmxlbmd0aCkgeworICAgICAgQXJyYXlzLnNvcnQoamFycywgbmV3IENvbXBhcmF0b3I8RmlsZT4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmlsZSBhLCBGaWxlIGIpIHsKKyAgICAgICAgICAvLyBTb3J0IGJ5IHJldmVyc2UgbGFzdC1tb2RpZmllZCB0aW1lIHNvIG5ld2VyIEpBUnMgYXJlIGZpcnN0LgorICAgICAgICAgIGludCBjbXAgPSBMb25ncy5jb21wYXJlKGIubGFzdE1vZGlmaWVkKCksIGEubGFzdE1vZGlmaWVkKCkpOworICAgICAgICAgIGlmIChjbXAgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhiLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgSW9VdGlsLmxvYWRKQVJzKGphcnMpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS91dGlsL1NpdGVQcm9ncmFtLmphdmEgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvU2l0ZVByb2dyYW0uamF2YQppbmRleCA0ODkzNTc5Li5hYWU1YjQ4IDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvU2l0ZVByb2dyYW0uamF2YQorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL3V0aWwvU2l0ZVByb2dyYW0uamF2YQpAQCAtMTgsMTAgKzE4LDEzIEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuaW5qZWN0LlN0YWdlLlBST0RVQ1RJT047CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGg7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlVHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFiYXNlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuU2NoZW1hTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CkBAIC0zNCwyMiArMzcsMTMgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNwaS5NZXNzYWdlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7CiBpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgamF2YXguc3FsLkRhdGFTb3VyY2U7CiAKQEAgLTc0LDk1ICs2OCw0NCBAQAogICAgIH0KICAgfQogCi0gIC8qKiBMb2FkIGV4dHJhIEpBUnMgZnJvbSB7QGNvZGUgbGliL30gc3ViZGlyZWN0b3J5IG9mIHtAbGluayAjZ2V0U2l0ZVBhdGgoKX0gKi8KLSAgcHJvdGVjdGVkIHZvaWQgbG9hZFNpdGVMaWIoKSB7Ci0gICAgZmluYWwgRmlsZSBsaWJkaXIgPSBuZXcgRmlsZShnZXRTaXRlUGF0aCgpLCAibGliIik7Ci0gICAgZmluYWwgRmlsZVtdIGxpc3QgPSBsaWJkaXIubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRoKSB7Ci0gICAgICAgIGlmICghcGF0aC5pc0ZpbGUoKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcGF0aC5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSAvLwotICAgICAgICAgICAgfHwgcGF0aC5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBpZiAobGlzdCAhPSBudWxsICYmIDAgPCBsaXN0Lmxlbmd0aCkgewotICAgICAgQXJyYXlzLnNvcnQobGlzdCwgbmV3IENvbXBhcmF0b3I8RmlsZT4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRmlsZSBhLCBGaWxlIGIpIHsKLSAgICAgICAgICByZXR1cm4gYS5nZXROYW1lKCkuY29tcGFyZVRvKGIuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICBhZGRUb0NsYXNzTG9hZGVyKGxpc3QpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhZGRUb0NsYXNzTG9hZGVyKGZpbmFsIEZpbGVbXSBhZGRpdGlvbmFsTG9jYXRpb25zKSB7Ci0gICAgZmluYWwgQ2xhc3NMb2FkZXIgY2wgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgaWYgKCEoY2wgaW5zdGFuY2VvZiBVUkxDbGFzc0xvYWRlcikpIHsKLSAgICAgIHRocm93IG5vQWRkVVJMKCJOb3QgbG9hZGVkIGJ5IFVSTENsYXNzTG9hZGVyIiwgbnVsbCk7Ci0gICAgfQotCi0gICAgZmluYWwgVVJMQ2xhc3NMb2FkZXIgdWNsID0gKFVSTENsYXNzTG9hZGVyKSBjbDsKLSAgICBmaW5hbCBTZXQ8VVJMPiBoYXZlID0gbmV3IEhhc2hTZXQ8VVJMPigpOwotICAgIGhhdmUuYWRkQWxsKEFycmF5cy5hc0xpc3QodWNsLmdldFVSTHMoKSkpOwotCi0gICAgZmluYWwgTWV0aG9kIG07Ci0gICAgdHJ5IHsKLSAgICAgIG0gPSBVUkxDbGFzc0xvYWRlci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiYWRkVVJMIiwgVVJMLmNsYXNzKTsKLSAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBub0FkZFVSTCgiTWV0aG9kIGFkZFVSTCBub3QgYXZhaWxhYmxlIiwgZSk7Ci0gICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5vQWRkVVJMKCJNZXRob2QgYWRkVVJMIG5vdCBhdmFpbGFibGUiLCBlKTsKLSAgICB9Ci0KLSAgICBmb3IgKGZpbmFsIEZpbGUgcGF0aCA6IGFkZGl0aW9uYWxMb2NhdGlvbnMpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsIFVSTCB1cmwgPSBwYXRoLnRvVVJJKCkudG9VUkwoKTsKLSAgICAgICAgaWYgKGhhdmUuYWRkKHVybCkpIHsKLSAgICAgICAgICBtLmludm9rZShjbCwgdXJsKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbm9BZGRVUkwoImFkZFVSTCAiICsgcGF0aCArICIgZmFpbGVkIiwgZSk7Ci0gICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBub0FkZFVSTCgiYWRkVVJMICIgKyBwYXRoICsgIiBmYWlsZWQiLCBlKTsKLSAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBub0FkZFVSTCgiYWRkVVJMICIgKyBwYXRoICsgIiBmYWlsZWQiLCBlKTsKLSAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBub0FkZFVSTCgiYWRkVVJMICIgKyBwYXRoICsgIiBmYWlsZWQiLCBlLmdldENhdXNlKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vQWRkVVJMKFN0cmluZyBtLCBUaHJvd2FibGUgd2h5KSB7Ci0gICAgZmluYWwgU3RyaW5nIHByZWZpeCA9ICJDYW5ub3QgZXh0ZW5kIGNsYXNzcGF0aDogIjsKLSAgICByZXR1cm4gbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHByZWZpeCArIG0sIHdoeSk7Ci0gIH0KLQogICAvKiogQHJldHVybiBwcm92aWRlcyBkYXRhYmFzZSBjb25uZWN0aXZpdHkgYW5kIHNpdGUgcGF0aC4gKi8KICAgcHJvdGVjdGVkIEluamVjdG9yIGNyZWF0ZURiSW5qZWN0b3IoZmluYWwgRGF0YVNvdXJjZVByb3ZpZGVyLkNvbnRleHQgY29udGV4dCkgewotICAgIGxvYWRTaXRlTGliKCk7Ci0KICAgICBmaW5hbCBGaWxlIHNpdGVQYXRoID0gZ2V0U2l0ZVBhdGgoKTsKICAgICBmaW5hbCBMaXN0PE1vZHVsZT4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlPigpOwotICAgIG1vZHVsZXMuYWRkKG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKKworICAgIE1vZHVsZSBzaXRlUGF0aE1vZHVsZSA9IG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgICAgICBiaW5kKEZpbGUuY2xhc3MpLmFubm90YXRlZFdpdGgoU2l0ZVBhdGguY2xhc3MpLnRvSW5zdGFuY2Uoc2l0ZVBhdGgpOwogICAgICAgfQotICAgIH0pOworICAgIH07CisgICAgbW9kdWxlcy5hZGQoc2l0ZVBhdGhNb2R1bGUpOworCiAgICAgbW9kdWxlcy5hZGQobmV3IExpZmVjeWNsZU1vZHVsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgICAgICBiaW5kKERhdGFTb3VyY2VQcm92aWRlci5Db250ZXh0LmNsYXNzKS50b0luc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBiaW5kKEtleS5nZXQoRGF0YVNvdXJjZS5jbGFzcywgTmFtZXMubmFtZWQoIlJldmlld0RiIikpKS50b1Byb3ZpZGVyKAotICAgICAgICAgICAgRGF0YVNvdXJjZVByb3ZpZGVyLmNsYXNzKS5pbihTSU5HTEVUT04pOwotICAgICAgICBsaXN0ZW5lcigpLnRvKERhdGFTb3VyY2VQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGJpbmQoS2V5LmdldChEYXRhU291cmNlLmNsYXNzLCBOYW1lcy5uYW1lZCgiUmV2aWV3RGIiKSkpCisgICAgICAgICAgLnRvUHJvdmlkZXIoU2l0ZUxpYnJhcnlCYXNlZERhdGFTb3VyY2VQcm92aWRlci5jbGFzcykKKyAgICAgICAgICAuaW4oU0lOR0xFVE9OKTsKKyAgICAgICAgbGlzdGVuZXIoKS50byhTaXRlTGlicmFyeUJhc2VkRGF0YVNvdXJjZVByb3ZpZGVyLmNsYXNzKTsKICAgICAgIH0KICAgICB9KTsKLSAgICBtb2R1bGVzLmFkZChuZXcgR2Vycml0U2VydmVyQ29uZmlnTW9kdWxlKCkpOworICAgIE1vZHVsZSBjb25maWdNb2R1bGUgPSBuZXcgR2Vycml0U2VydmVyQ29uZmlnTW9kdWxlKCk7CisgICAgbW9kdWxlcy5hZGQoY29uZmlnTW9kdWxlKTsKKyAgICBJbmplY3RvciBjZmdJbmplY3RvciA9IEd1aWNlLmNyZWF0ZUluamVjdG9yKHNpdGVQYXRoTW9kdWxlLCBjb25maWdNb2R1bGUpOworICAgIENvbmZpZyBjZmcgPSBjZmdJbmplY3Rvci5nZXRJbnN0YW5jZShLZXkuZ2V0KENvbmZpZy5jbGFzcywgR2Vycml0U2VydmVyQ29uZmlnLmNsYXNzKSk7CisgICAgU3RyaW5nIGRiVHlwZSA9IGNmZy5nZXRTdHJpbmcoImRhdGFiYXNlIiwgbnVsbCwgInR5cGUiKTsKKworICAgIGZpbmFsIERhdGFTb3VyY2VUeXBlIGRzdCA9IEd1aWNlLmNyZWF0ZUluamVjdG9yKG5ldyBEYXRhU291cmNlTW9kdWxlKCksIGNvbmZpZ01vZHVsZSwKKyAgICAgICAgICAgIHNpdGVQYXRoTW9kdWxlKS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgIEtleS5nZXQoRGF0YVNvdXJjZVR5cGUuY2xhc3MsIE5hbWVzLm5hbWVkKGRiVHlwZS50b0xvd2VyQ2FzZSgpKSkpOworCisgICAgbW9kdWxlcy5hZGQobmV3IEFic3RyYWN0TW9kdWxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoRGF0YVNvdXJjZVR5cGUuY2xhc3MpLnRvSW5zdGFuY2UoZHN0KTsKKyAgICAgIH19KTsKICAgICBtb2R1bGVzLmFkZChuZXcgRGF0YWJhc2VNb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IFNjaGVtYU1vZHVsZSgpKTsKICAgICBtb2R1bGVzLmFkZChuZXcgTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXIuTW9kdWxlKCkpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2dlcnJpdC5zaCBiL2dlcnJpdC1wZ20vc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9nZXJyaXQuc2gKaW5kZXggMzg1N2ViZC4uOWFhNGVhMyAxMDA3NTUKLS0tIGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2dlcnJpdC5zaAorKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vZ2Vycml0LnNoCkBAIC05LDYgKzksMTcgQEAKICMgcHJvY2Vzc25hbWU6IGdlcnJpdAogIyA9PT09PT09PT09PT09PT09PT09PT09PT0KIAorIyMjIEJFR0lOIElOSVQgSU5GTworIyBQcm92aWRlczogICAgICAgICAgZ2Vycml0CisjIFJlcXVpcmVkLVN0YXJ0OiAgICAkbmFtZWQgJHJlbW90ZV9mcyAkc3lzbG9nCisjIFJlcXVpcmVkLVN0b3A6ICAgICAkbmFtZWQgJHJlbW90ZV9mcyAkc3lzbG9nCisjIERlZmF1bHQtU3RhcnQ6ICAgICAyIDMgNCA1CisjIERlZmF1bHQtU3RvcDogICAgICAwIDEgNgorIyBTaG9ydC1EZXNjcmlwdGlvbjogU3RhcnQvc3RvcCBHZXJyaXQgQ29kZSBSZXZpZXcKKyMgRGVzY3JpcHRpb246ICAgICAgIEdlcnJpdCBpcyBhIHdlYiBiYXNlZCBjb2RlIHJldmlldyBzeXN0ZW0sIGZhY2lsaXRhdGluZyBvbmxpbmUgY29kZSByZXZpZXdzCisjICAgICAgICAgICAgICAgICAgICBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdpdCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtLgorIyMjIEVORCBJTklUIElORk8KKwogIyBDb25maWd1cmF0aW9uIGZpbGVzOgogIwogIyAvZXRjL2RlZmF1bHQvZ2Vycml0Y29kZXJldmlldwpAQCAtMzYsNyArNDcsNyBAQAogCiB1c2FnZSgpIHsKICAgICBtZT1gYmFzZW5hbWUgIiQwImAKLSAgICBlY2hvID4mMiAiVXNhZ2U6ICRtZSB7c3RhcnR8c3RvcHxyZXN0YXJ0fGNoZWNrfHJ1bnxzdXBlcnZpc2V9IFstZCBzaXRlXSIKKyAgICBlY2hvID4mMiAiVXNhZ2U6ICRtZSB7c3RhcnR8c3RvcHxyZXN0YXJ0fGNoZWNrfHN0YXR1c3xydW58c3VwZXJ2aXNlfSBbLWQgc2l0ZV0iCiAgICAgZXhpdCAxCiB9CiAKQEAgLTEwOCw3ICsxMTksNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgU2VlIGlmIHRoZXJlJ3MgYSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZQogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWlmIHRlc3QgLWYgL2V0Yy9kZWZhdWx0L2dlcnJpdGNvZGVyZXZpZXcgOyB0aGVuIAoraWYgdGVzdCAtZiAvZXRjL2RlZmF1bHQvZ2Vycml0Y29kZXJldmlldyA7IHRoZW4KICAgLiAvZXRjL2RlZmF1bHQvZ2Vycml0Y29kZXJldmlldwogZmkKIApAQCAtMTI2LDcgKzEzNyw3IEBACiBHRVJSSVRfSU5TVEFMTF9UUkFDRV9GSUxFPWV0Yy9nZXJyaXQuY29uZmlnCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5vIGdpdCBpbiBQQVRIPyBOZWVkZWQgZm9yIGdlcnJpdC5jb25mZyBwYXJzaW5nCisjIE5vIGdpdCBpbiBQQVRIPyBOZWVkZWQgZm9yIGdlcnJpdC5jb25maWcgcGFyc2luZwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGlmIHR5cGUgZ2l0ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KICAgOiBPSwpAQCAtMTM5LDEwICsxNTAsOSBAQAogIyBUcnkgdG8gZGV0ZXJtaW5lIEdFUlJJVF9TSVRFIGlmIG5vdCBzZXQKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBpZiB0ZXN0IC16ICIkR0VSUklUX1NJVEUiIDsgdGhlbgotICBHRVJSSVRfU0lURV8xPWBkaXJuYW1lICIkMCJgCi0gIEdFUlJJVF9TSVRFXzE9YGRpcm5hbWUgIiRHRVJSSVRfU0lURV8xImAKLSAgaWYgdGVzdCAtZiAiJHtHRVJSSVRfU0lURV8xfS8ke0dFUlJJVF9JTlNUQUxMX1RSQUNFX0ZJTEV9IiA7IHRoZW4gCi0gICAgR0VSUklUX1NJVEU9JHtHRVJSSVRfU0lURV8xfSAKKyAgR0VSUklUX1NJVEVfMT1gZGlybmFtZSAiJDAiYC8uLgorICBpZiB0ZXN0IC1mICIke0dFUlJJVF9TSVRFXzF9LyR7R0VSUklUX0lOU1RBTExfVFJBQ0VfRklMRX0iIDsgdGhlbgorICAgIEdFUlJJVF9TSVRFPSR7R0VSUklUX1NJVEVfMX0KICAgZmkKIGZpCiAKQEAgLTE1MCwxMCArMTYwLDExIEBACiAjIE5vIEdFUlJJVF9TSVRFIHlldD8gV2UncmUgb3V0IG9mIGx1Y2shCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWYgdGVzdCAteiAiJEdFUlJJVF9TSVRFIiA7IHRoZW4KLSAgICBlY2hvID4mMiAiKiogRVJST1I6IEdFUlJJVF9TSVRFIG5vdCBzZXQiIAorICAgIGVjaG8gPiYyICIqKiBFUlJPUjogR0VSUklUX1NJVEUgbm90IHNldCIKICAgICBleGl0IDEKIGZpCiAKK0lOSVRJQUxfRElSPWBwd2RgCiBpZiBjZCAiJEdFUlJJVF9TSVRFIiA7IHRoZW4KICAgR0VSUklUX1NJVEU9YHB3ZGAKIGVsc2UKQEAgLTIwNiw3ICsyMTcsNyBAQAogICAgICIKICAgICBmb3IgTiBpbiBqYXZhIGpkayBqcmUgOyBkbwogICAgICAgZm9yIEwgaW4gJEpBVkFfTE9DQVRJT05TIDsgZG8KLSAgICAgICAgdGVzdCAtZCAiJEwiIHx8IGNvbnRpbnVlIAorICAgICAgICB0ZXN0IC1kICIkTCIgfHwgY29udGludWUKICAgICAgICAgZmluZCAkTCAtbmFtZSAiJE4iICEgLXR5cGUgZCB8IGdyZXAgLXYgdGhyZWFkcyB8IHdoaWxlIHJlYWQgSiA7IGRvCiAgICAgICAgICAgdGVzdCAteCAiJEoiIHx8IGNvbnRpbnVlCiAgICAgICAgICAgVkVSU0lPTj1gZXZhbCAiJEoiIC12ZXJzaW9uIDI+JjFgCkBAIC0yNDEsNyArMjUyLDkgQEAKIGZpCiAKIGlmIHRlc3QgLXogIiRKQVZBIiA7IHRoZW4KLSAgZWNobyA+JjIgIkNhbm5vdCBmaW5kIGEgSlJFIG9yIEpESy4gUGxlYXNlIHNldCBKQVZBX0hPTUUgdG8gYSA+PTEuNiBKUkUiCisgIGVjaG8gPiYyICJDYW5ub3QgZmluZCBhIEpSRSBvciBKREsuIFBsZWFzZSBzZXQgSkFWQV9IT01FIG9yIgorICBlY2hvID4mMiAiY29udGFpbmVyLmphdmFIb21lIGluICRHRVJSSVRfU0lURS9ldGMvZ2Vycml0LmNvbmZpZyIKKyAgZWNobyA+JjIgInRvIGEgPj0xLjYgSlJFIgogICBleGl0IDEKIGZpCiAKQEAgLTM0MCw3ICszNTMsNyBAQAogICBzdGFydCkKICAgICBwcmludGYgJyVzJyAiU3RhcnRpbmcgR2Vycml0IENvZGUgUmV2aWV3OiAiCiAKLSAgICBpZiB0ZXN0IDEgPSAiJE5PX1NUQVJUIiA7IHRoZW4gCisgICAgaWYgdGVzdCAxID0gIiROT19TVEFSVCIgOyB0aGVuCiAgICAgICBlY2hvICJOb3Qgc3RhcnRpbmcgZ2Vycml0IC0gTk9fU1RBUlQ9MSBpbiAvZXRjL2RlZmF1bHQvZ2Vycml0Y29kZXJldmlldyIKICAgICAgIGV4aXQgMAogICAgIGZpCkBAIC0zNjUsMjIgKzM3OCwyMiBAQAogICAgICAgICAgIGVjaG8gPiYyICJmYXRhbDogc3RhcnQtc3RvcC1kYWVtb24gZmFpbGVkIgogICAgICAgICAgIHJjPTEKICAgICAgICAgZmkKLSAgICAgICAgZXhpdCAkcmMgCisgICAgICAgIGV4aXQgJHJjCiAgICAgICBmaQogICAgIGVsc2UKICAgICAgIGlmIHRlc3QgLWYgIiRHRVJSSVRfUElEIiA7IHRoZW4KICAgICAgICAgaWYgcnVubmluZyAiJEdFUlJJVF9QSUQiIDsgdGhlbgogICAgICAgICAgIGVjaG8gIkFscmVhZHkgUnVubmluZyEhIgotICAgICAgICAgIGV4aXQgMQorICAgICAgICAgIGV4aXQgMAogICAgICAgICBlbHNlCiAgICAgICAgICAgcm0gLWYgIiRHRVJSSVRfUElEIiAiJEdFUlJJVF9SVU4iCiAgICAgICAgIGZpCiAgICAgICBmaQogCi0gICAgICBpZiB0ZXN0ICRVSUQgPSAwIC1hIC1uICIkR0VSUklUX1VTRVIiIDsgdGhlbiAKKyAgICAgIGlmIHRlc3QgJFVJRCA9IDAgLWEgLW4gIiRHRVJSSVRfVVNFUiIgOyB0aGVuCiAgICAgICAgIHRvdWNoICIkR0VSUklUX1BJRCIKICAgICAgICAgY2hvd24gJEdFUlJJVF9VU0VSICIkR0VSUklUX1BJRCIKLSAgICAgICAgc3UgLSAkR0VSUklUX1VTRVIgLWMgIgorICAgICAgICBzdSAtICRHRVJSSVRfVVNFUiAtcyAvYmluL3NoIC1jICIKICAgICAgICAgICBKQVZBPSckSkFWQScgOyBleHBvcnQgSkFWQSA7CiAgICAgICAgICAgJFJVTl9FWEVDICRSVU5fQXJnMSAnJFJVTl9BcmcyJyAkUlVOX0FyZzMgJFJVTl9BUkdTIDwvZGV2L251bGwgPi9kZXYvbnVsbCAyPiYxICYKICAgICAgICAgICBQSUQ9XCQhIDsKQEAgLTQyNiw3ICs0MzksNyBAQAogCiAgICAgaWYgdGVzdCAxID0gIiRTVEFSVF9TVE9QX0RBRU1PTiIgJiYgdHlwZSBzdGFydC1zdG9wLWRhZW1vbiA+L2Rldi9udWxsIDI+JjEKICAgICB0aGVuCi0gICAgICBzdGFydC1zdG9wLWRhZW1vbiAtSyAtcCAiJEdFUlJJVF9QSUQiIC1zIEhVUCAKKyAgICAgIHN0YXJ0LXN0b3AtZGFlbW9uIC1LIC1wICIkR0VSUklUX1BJRCIgLXMgSFVQCiAgICAgICBzbGVlcCAxCiAgICAgICBpZiBydW5uaW5nICIkR0VSUklUX1BJRCIgOyB0aGVuCiAgICAgICAgIHNsZWVwIDMKQEAgLTQ1OCw4ICs0NzEsMTMgQEAKICAgICBpZiB0ZXN0IC1mICIkR0VSUklUX1NIIiA7IHRoZW4KICAgICAgIDogT0sKICAgICBlbHNlCi0gICAgICBlY2hvID4mMiAiKiogRVJST1I6IENhbm5vdCBsb2NhdGUgZ2Vycml0LnNoIgotICAgICAgZXhpdCAxCisgICAgICBHRVJSSVRfU0g9IiRJTklUSUFMX0RJUi8kR0VSUklUX1NIIgorICAgICAgaWYgdGVzdCAtZiAiJEdFUlJJVF9TSCIgOyB0aGVuCisgICAgICAgIDogT0sKKyAgICAgIGVsc2UKKyAgICAgICAgZWNobyA+JjIgIioqIEVSUk9SOiBDYW5ub3QgbG9jYXRlIGdlcnJpdC5zaCIKKyAgICAgICAgZXhpdCAxCisgICAgICBmaQogICAgIGZpCiAgICAgJEdFUlJJVF9TSCBzdG9wICQqCiAgICAgc2xlZXAgNQpAQCAtNDgwLDcgKzQ5OCw3IEBACiAgICAgaWYgdGVzdCAtZiAiJEdFUlJJVF9QSUQiIDsgdGhlbgogICAgICAgICBpZiBydW5uaW5nICIkR0VSUklUX1BJRCIgOyB0aGVuCiAgICAgICAgICAgZWNobyAiQWxyZWFkeSBSdW5uaW5nISEiCi0gICAgICAgICAgZXhpdCAxCisgICAgICAgICAgZXhpdCAwCiAgICAgICAgIGVsc2UKICAgICAgICAgICBybSAtZiAiJEdFUlJJVF9QSUQiCiAgICAgICAgIGZpCkBAIC00ODksNyArNTA3LDcgQEAKICAgICBleGVjICIkUlVOX0VYRUMiICRSVU5fQXJnMSAiJFJVTl9BcmcyIiAkUlVOX0FyZzMgJFJVTl9BUkdTIC0tY29uc29sZS1sb2cKICAgOzsKIAotICBjaGVjaykKKyAgY2hlY2t8c3RhdHVzKQogICAgIGVjaG8gIkNoZWNraW5nIGFyZ3VtZW50cyB0byBHZXJyaXQgQ29kZSBSZXZpZXc6IgogICAgIGVjaG8gIiAgR0VSUklUX1NJVEUgICAgID0gICRHRVJSSVRfU0lURSIKICAgICBlY2hvICIgIEdFUlJJVF9DT05GSUcgICA9ICAkR0VSUklUX0NPTkZJRyIKQEAgLTUxMCw3ICs1MjgsNyBAQAogICAgICAgICAgICAgZXhpdCAwCiAgICAgICAgIGZpCiAgICAgZmkKLSAgICBleGl0IDEKKyAgICBleGl0IDMKICAgOzsKIAogICAqKQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBnbS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2xpYnJhcmllcy5jb25maWcgYi9nZXJyaXQtcGdtL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vbGlicmFyaWVzLmNvbmZpZwppbmRleCBiOTkyNjdjLi5mMWVjYWRkIDEwMDY0NAotLS0gYS9nZXJyaXQtcGdtL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vbGlicmFyaWVzLmNvbmZpZworKysgYi9nZXJyaXQtcGdtL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vbGlicmFyaWVzLmNvbmZpZwpAQCAtMTcsOCArMTcsMTAgQEAKICAgbmFtZSA9IEJvdW5jeSBDYXN0bGUgQ3J5cHRvIHYxNDQKICAgdXJsID0gaHR0cDovL3d3dy5ib3VuY3ljYXN0bGUub3JnL2Rvd25sb2FkL2JjcHJvdi1qZGsxNi0xNDQuamFyCiAgIHNoYTEgPSA2MzI3YTVmN2EzZGM0NWUwZmQ3MzVhZGI1ZDA4YzVhNzRjMDVjMjBjCisgIHJlbW92ZSA9IGJjcHJvdi0uKlsuXWphcgogCiBbbGlicmFyeSAibXlzcWxEcml2ZXIiXQotICBuYW1lID0gTXlTUUwgQ29ubmVjdG9yL0ogNS4xLjEwCi0gIHVybCA9IGh0dHA6Ly9yZXBvMi5tYXZlbi5vcmcvbWF2ZW4yL215c3FsL215c3FsLWNvbm5lY3Rvci1qYXZhLzUuMS4xMC9teXNxbC1jb25uZWN0b3ItamF2YS01LjEuMTAuamFyCi0gIHNoYTEgPSBiODM1NzQxMjRmMWEwMGQ2ZjcwZDU2YmE2NGFhNTJiOGUxNTg4ZTZkCisgIG5hbWUgPSBNeVNRTCBDb25uZWN0b3IvSiA1LjEuMjEKKyAgdXJsID0gaHR0cDovL3JlcG8yLm1hdmVuLm9yZy9tYXZlbjIvbXlzcWwvbXlzcWwtY29ubmVjdG9yLWphdmEvNS4xLjIxL215c3FsLWNvbm5lY3Rvci1qYXZhLTUuMS4yMS5qYXIKKyAgc2hhMSA9IDdhYmJkMTlmYzJlMmQ1YjkyYzA4OTVhZjg1MjBmN2ZhMzAyNjZiZTkKKyAgcmVtb3ZlID0gbXlzcWwtY29ubmVjdG9yLWphdmEtLipbLl1qYXIKZGlmZiAtLWdpdCBhL2dlcnJpdC1wZ20vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9MaWJyYXJpZXNUZXN0LmphdmEgYi9nZXJyaXQtcGdtL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvTGlicmFyaWVzVGVzdC5qYXZhCmluZGV4IGU3MjM0NjMuLmRmMWY0NDcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9MaWJyYXJpZXNUZXN0LmphdmEKKysrIGIvZ2Vycml0LXBnbS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3BnbS9pbml0L0xpYnJhcmllc1Rlc3QuamF2YQpAQCAtMzAsMTYgKzMwLDE0IEBACiBwdWJsaWMgY2xhc3MgTGlicmFyaWVzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogICAgIGZpbmFsIFNpdGVQYXRocyBzaXRlID0gbmV3IFNpdGVQYXRocyhuZXcgRmlsZSgiLiIpKTsKLSAgICBmaW5hbCBSZWxvYWRTaXRlTGlicmFyeSByZWxvYWQgPSBjcmVhdGVTdHJpY3RNb2NrKFJlbG9hZFNpdGVMaWJyYXJ5LmNsYXNzKTsKICAgICBmaW5hbCBDb25zb2xlVUkgdWkgPSBjcmVhdGVTdHJpY3RNb2NrKENvbnNvbGVVSS5jbGFzcyk7CiAKICAgICByZXBsYXkodWkpOwotICAgIHJlcGxheShyZWxvYWQpOwogCiAgICAgTGlicmFyaWVzIGxpYiA9IG5ldyBMaWJyYXJpZXMobmV3IFByb3ZpZGVyPExpYnJhcnlEb3dubG9hZGVyPigpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIExpYnJhcnlEb3dubG9hZGVyIGdldCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaWJyYXJ5RG93bmxvYWRlcihyZWxvYWQsIHVpLCBzaXRlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBMaWJyYXJ5RG93bmxvYWRlcih1aSwgc2l0ZSk7CiAgICAgICB9CiAgICAgfSk7CiAKQEAgLTQ3LDYgKzQ1LDUgQEAKICAgICBhc3NlcnROb3ROdWxsKGxpYi5teXNxbERyaXZlcik7CiAKICAgICB2ZXJpZnkodWkpOwotICAgIHZlcmlmeShyZWxvYWQpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGdtL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcGdtL2luaXQvVXBncmFkZUZyb20yXzBfeFRlc3QuamF2YSBiL2dlcnJpdC1wZ20vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9VcGdyYWRlRnJvbTJfMF94VGVzdC5qYXZhCmluZGV4IDQ5M2E0NDAuLjg2ZjAyNjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wZ20vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9VcGdyYWRlRnJvbTJfMF94VGVzdC5qYXZhCisrKyBiL2dlcnJpdC1wZ20vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wZ20vaW5pdC9VcGdyYWRlRnJvbTJfMF94VGVzdC5qYXZhCkBAIC03Miw4ICs3Miw4IEBACiAgICAgZmluYWwgQ29uc29sZVVJIHVpID0gY3JlYXRlU3RyaWN0TW9jayhDb25zb2xlVUkuY2xhc3MpOwogICAgIFNlY3Rpb24uRmFjdG9yeSBzZWN0aW9ucyA9IG5ldyBTZWN0aW9uLkZhY3RvcnkoKSB7CiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBTZWN0aW9uIGdldChTdHJpbmcgbmFtZSkgewotICAgICAgICByZXR1cm4gbmV3IFNlY3Rpb24oZmxhZ3MsIHNpdGUsIHVpLCBuYW1lKTsKKyAgICAgIHB1YmxpYyBTZWN0aW9uIGdldChTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YnNlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWN0aW9uKGZsYWdzLCBzaXRlLCB1aSwgbmFtZSwgc3Vic2VjdGlvbik7CiAgICAgICB9CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1hcGkvcG9tLnhtbCBiL2dlcnJpdC1wbHVnaW4tYXBpL3BvbS54bWwKaW5kZXggODRmNmY3Yi4uMzE5MDM3OSAxMDA2NDQKLS0tIGEvZ2Vycml0LXBsdWdpbi1hcGkvcG9tLnhtbAorKysgYi9nZXJyaXQtcGx1Z2luLWFwaS9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KQEAgLTQ2LDYgKzQ2LDE4IEBACiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wZ208L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CiAgICAgPC9kZXBlbmRlbmN5PgpAQCAtNjYsOCArNzgsOCBAQAogICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uZ29vZ2xlLmdlcnJpdDpnZXJyaXQtcGF0Y2gtY29tbW9uc25ldDwvZXhjbHVkZT4KICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tLmdvb2dsZS5nZXJyaXQ6Z2Vycml0LXBhdGNoLWpnaXQ8L2V4Y2x1ZGU+CiAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5nb29nbGUuZ2Vycml0OmdlcnJpdC11dGlsLXNzbDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tLmdvb2dsZS5nZXJyaXQ6anVuaXZlcnNhbGNoYXJkZXQ8L2V4Y2x1ZGU+CiAKKyAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tLmdvb2dsZWNvZGUuanVuaXZlcnNhbGNoYXJkZXQ6anVuaXZlcnNhbGNoYXJkZXQ8L2V4Y2x1ZGU+CiAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5nb29nbGVjb2RlLnByb2xvZy1jYWZlOlByb2xvZ0NhZmU8L2V4Y2x1ZGU+CiAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5zbGY0ajpzbGY0ai1sb2c0ajEyPC9leGNsdWRlPgogICAgICAgICAgICAgICA8ZXhjbHVkZT5sb2c0ajpsb2c0ajwvZXhjbHVkZT4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tYXJjaGV0eXBlL3BvbS54bWwgYi9nZXJyaXQtcGx1Z2luLWFyY2hldHlwZS9wb20ueG1sCmluZGV4IGRkMTc5NGIuLjM0ZGRkNTAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wbHVnaW4tYXJjaGV0eXBlL3BvbS54bWwKKysrIGIvZ2Vycml0LXBsdWdpbi1hcmNoZXR5cGUvcG9tLnhtbApAQCAtMjEsNyArMjEsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBsdWdpbi1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvLmdpdGlnbm9yZSBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzVhMmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQgQEAKKy90YXJnZXQKKy8uY2xhc3NwYXRoCisvLnByb2plY3QKKy8uc2V0dGluZ3MKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9wb20ueG1sIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlOTEyOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9wb20ueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+Z2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlPC9hcnRpZmFjdElkPgorICA8bmFtZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBXZWIgVWkgR1dUIFBsdWdpbiBBcmNoZXR5cGU8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGRlZmF1bHRHZXJyaXRBcGlWZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvZGVmYXVsdEdlcnJpdEFwaVZlcnNpb24+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbCBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYyOTQxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhcmNoZXR5cGUtZGVzY3JpcHRvciBuYW1lPSJHZXJyaXQgUGx1Z2luIj4KKyAgPHJlcXVpcmVkUHJvcGVydGllcz4KKyAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9InBsdWdpbk5hbWUiLz4KKworICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0iSW1wbGVtZW50YXRpb24tVmVuZG9yIi8+CisgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJJbXBsZW1lbnRhdGlvbi1VcmwiLz4KKyAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9Ikd3dC1WZXJzaW9uIi8+CisKKyAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9ImdlcnJpdEFwaVZlcnNpb24iPgorICAgICAgPGRlZmF1bHRWYWx1ZT4ke2RlZmF1bHRHZXJyaXRBcGlWZXJzaW9ufTwvZGVmYXVsdFZhbHVlPgorICAgIDwvcmVxdWlyZWRQcm9wZXJ0eT4KKyAgPC9yZXF1aXJlZFByb3BlcnRpZXM+CisKKyAgPGZpbGVTZXRzPgorICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSI+CisgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+KiovKi5jc3M8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPioqLyoucG5nPC9pbmNsdWRlPgorICAgICAgICA8aW5jbHVkZT4qKi8qLmphdmE8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPioqLyouZ3d0LnhtbDwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorCisgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiPgorICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXMvRG9jdW1lbnRhdGlvbjwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi8qLm1kPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8ZmlsZVNldD4KKyAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPi5naXRpZ25vcmU8L2luY2x1ZGU+CisgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKyAgPC9maWxlU2V0cz4KKzwvYXJjaGV0eXBlLWRlc2NyaXB0b3I+CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvLmdpdGlnbm9yZSBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDYyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDUgQEAKKy90YXJnZXQKKy8uY2xhc3NwYXRoCisvLnByb2plY3QKKy8uc2V0dGluZ3Mvb3JnLm1hdmVuLmlkZS5lY2xpcHNlLnByZWZzCisvLnNldHRpbmdzL29yZy5lY2xpcHNlLm0yZS5jb3JlLnByZWZzCmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvTElDRU5TRSBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDY5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvTElDRU5TRQpAQCAtMCwwICsxLDIwMSBAQAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKzEuIERlZmluaXRpb25zLgorCisgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKzMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCis0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCis1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKzYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKzcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCis4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKzkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKK0FQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KKworICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKKyAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKKyAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCisgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQorICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCisgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCisgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKKyAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KKworQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWJhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApAQCAtMCwwICsxLDEyOSBAQAorPCEtLQorQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+CisgIDxuYW1lPiR7cGx1Z2luTmFtZX08L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPEdlcnJpdC1BcGlUeXBlPmV4dGVuc2lvbjwvR2Vycml0LUFwaVR5cGU+CisgICAgPEdlcnJpdC1BcGlWZXJzaW9uPiR7Z2Vycml0QXBpVmVyc2lvbn08L0dlcnJpdC1BcGlWZXJzaW9uPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPioqLyouKjwvaW5jbHVkZT4KKyAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlbmRvcj4ke0ltcGxlbWVudGF0aW9uLVZlbmRvcn08L0ltcGxlbWVudGF0aW9uLVZlbmRvcj4KKyAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVVSTD4ke0ltcGxlbWVudGF0aW9uLVVybH08L0ltcGxlbWVudGF0aW9uLVVSTD4KKworICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVGl0bGU+JHtHZXJyaXQtQXBpVHlwZX0gJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9JbXBsZW1lbnRhdGlvbi1UaXRsZT4KKyAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9JbXBsZW1lbnRhdGlvbi1WZXJzaW9uPgorCisgICAgICAgICAgICAgIDxHZXJyaXQtQXBpVHlwZT4ke0dlcnJpdC1BcGlUeXBlfTwvR2Vycml0LUFwaVR5cGU+CisgICAgICAgICAgICAgIDxHZXJyaXQtQXBpVmVyc2lvbj4ke0dlcnJpdC1BcGlWZXJzaW9ufTwvR2Vycml0LUFwaVZlcnNpb24+CisgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4zLjI8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjY8L3RhcmdldD4KKyAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmd3dC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7R3d0LVZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8bW9kdWxlPiR7cGFja2FnZX0uSGVsbG9QbHVnaW5zPC9tb2R1bGU+CisgICAgICAgICAgPGRpc2FibGVDbGFzc01ldGFkYXRhPnRydWU8L2Rpc2FibGVDbGFzc01ldGFkYXRhPgorICAgICAgICAgIDxkaXNhYmxlQ2FzdENoZWNraW5nPnRydWU8L2Rpc2FibGVDYXN0Q2hlY2tpbmc+CisgICAgICAgICAgPHdlYmFwcERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9jbGFzc2VzL3N0YXRpYzwvd2ViYXBwRGlyZWN0b3J5PgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKworICAgIDwvcGx1Z2lucz4KKyAgPC9idWlsZD4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtJHtHZXJyaXQtQXBpVHlwZX0tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtHZXJyaXQtQXBpVmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGx1Z2luLWd3dHVpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtHZXJyaXQtQXBpVmVyc2lvbn08L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd3dC11c2VyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtHd3QtVmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjQuOC4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgPHJlcG9zaXRvcmllcz4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxpZD5nZXJyaXQtYXBpLXJlcG9zaXRvcnk8L2lkPgorI2lmICgkZ2Vycml0QXBpVmVyc2lvbi5lbmRzV2l0aCgiU05BUFNIT1QiKSkKKyAgICAgIDx1cmw+aHR0cHM6Ly9nZXJyaXQtYXBpLmNvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tL3NuYXBzaG90LzwvdXJsPgorI2Vsc2UKKyAgICAgIDx1cmw+aHR0cHM6Ly9nZXJyaXQtYXBpLmNvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tL3JlbGVhc2UvPC91cmw+CisjZW5kCisgICAgPC9yZXBvc2l0b3J5PgorICA8L3JlcG9zaXRvcmllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvUGx1Z2lucy5nd3QueG1sIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9QbHVnaW5zLmd3dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3MGZjYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvUGx1Z2lucy5nd3QueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bW9kdWxlIHJlbmFtZS10bz0iaGVsbG9fZ3d0X3BsdWdpbnMiPgorICA8IS0tIEluaGVyaXQgdGhlIGNvcmUgV2ViIFRvb2xraXQgc3R1ZmYuICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgIDxpbmhlcml0cyBuYW1lPSJjb20uZ29vZ2xlLmd3dC51c2VyLlVzZXIiLz4KKyAgPCEtLSBPdGhlciBtb2R1bGUgaW5oZXJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8aW5oZXJpdHMgbmFtZT0iY29tLmdvb2dsZS5nZXJyaXQuUGx1Z2luIi8+CisgIDxpbmhlcml0cyBuYW1lPSJjb20uZ29vZ2xlLmd3dC5odHRwLkhUVFAiLz4KKyAgPCEtLSBVc2luZyBHV1QgYnVpbHQtaW4gdGhlbWVzIGFkZHMgYSBudW1iZXIgb2Ygc3RhdGljICAgICAgICAgIC0tPgorICA8IS0tIHJlc291cmNlcyB0byB0aGUgcGx1Z2luLiBObyB0aGVtZSBpbmhlcml0cyBsaW5lcyB3ZXJlICAgICAgLS0+CisgIDwhLS0gYWRkZWQgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIHBsdWdpbiBhcyBzaW1wbGUgYXMgcG9zc2libGUgICAtLT4KKyAgPCEtLSBTcGVjaWZ5IHRoZSBhcHAgZW50cnkgcG9pbnQgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICA8ZW50cnktcG9pbnQgY2xhc3M9IiR7cGFja2FnZX0uY2xpZW50LkhlbGxvUGx1Z2lucyIvPgorICA8c3R5bGVzaGVldCBzcmM9ImhlbGxvLmNzcyIvPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeUV4dGVuc2lvbi5qYXZhIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTXlFeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmRiYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTXlFeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSAke3BhY2thZ2V9OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aS5Hd3RQbHVnaW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5MaXN0ZW47CisKK0BMaXN0ZW4KK3B1YmxpYyBjbGFzcyBNeUV4dGVuc2lvbiBleHRlbmRzIEd3dFBsdWdpbiB7CisgIHB1YmxpYyBNeUV4dGVuc2lvbigpIHsKKyAgICBzdXBlcigiaGVsbG9fZ3d0X3BsdWdpbnMiKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvY2xpZW50L0hlbGxvUGx1Z2lucy5qYXZhIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvY2xpZW50L0hlbGxvUGx1Z2lucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODRkODUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9jbGllbnQvSGVsbG9QbHVnaW5zLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlICR7cGFja2FnZX0uY2xpZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50LlBsdWdpbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5ldmVudC5kb20uY2xpZW50LkNsaWNrRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuZXZlbnQuZG9tLmNsaWVudC5DbGlja0hhbmRsZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuQnV0dG9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LnVzZXIuY2xpZW50LnVpLkRpYWxvZ0JveDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5JbWFnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLmNsaWVudC51aS5Sb290UGFuZWw7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5jbGllbnQudWkuVmVydGljYWxQYW5lbDsKKworLyoqCisgKiBIZWxsb1dvcmxkIFBsdWdpbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1BsdWdpbnMgZXh0ZW5kcyBQbHVnaW4geworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBvbk1vZHVsZUxvYWQoKSB7CisgICAgSW1hZ2UgaW1nID0gbmV3IEltYWdlKCJodHRwOi8vY29kZS5nb29nbGUuY29tL3dlYnRvb2xraXQvbG9nby0xODV4MTc1LnBuZyIpOworICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKCJDbGljayBtZSIpOworCisgICAgVmVydGljYWxQYW5lbCB2UGFuZWwgPSBuZXcgVmVydGljYWxQYW5lbCgpOworICAgIHZQYW5lbC5zZXRXaWR0aCgiMTAwJSIpOworICAgIHZQYW5lbC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFZlcnRpY2FsUGFuZWwuQUxJR05fQ0VOVEVSKTsKKyAgICB2UGFuZWwuYWRkKGltZyk7CisgICAgdlBhbmVsLmFkZChidXR0b24pOworCisgICAgUm9vdFBhbmVsLmdldCgpLmFkZCh2UGFuZWwpOworCisgICAgLy8gQ3JlYXRlIHRoZSBkaWFsb2cgYm94CisgICAgZmluYWwgRGlhbG9nQm94IGRpYWxvZ0JveCA9IG5ldyBEaWFsb2dCb3goKTsKKworICAgIC8vIFRoZSBjb250ZW50IG9mIHRoZSBkaWFsb2cgY29tZXMgZnJvbSBhIFVzZXIgc3BlY2lmaWVkIFByZWZlcmVuY2UKKyAgICBkaWFsb2dCb3guc2V0VGV4dCgiSGVsbG8gZnJvbSBHV1QgR2Vycml0IFVJIHBsdWdpbiIpOworICAgIGRpYWxvZ0JveC5zZXRBbmltYXRpb25FbmFibGVkKHRydWUpOworICAgIEJ1dHRvbiBjbG9zZUJ1dHRvbiA9IG5ldyBCdXR0b24oIkNsb3NlIik7CisgICAgVmVydGljYWxQYW5lbCBkaWFsb2dWUGFuZWwgPSBuZXcgVmVydGljYWxQYW5lbCgpOworICAgIGRpYWxvZ1ZQYW5lbC5zZXRXaWR0aCgiMTAwJSIpOworICAgIGRpYWxvZ1ZQYW5lbC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFZlcnRpY2FsUGFuZWwuQUxJR05fQ0VOVEVSKTsKKyAgICBkaWFsb2dWUGFuZWwuYWRkKGNsb3NlQnV0dG9uKTsKKworICAgIGNsb3NlQnV0dG9uLmFkZENsaWNrSGFuZGxlcihuZXcgQ2xpY2tIYW5kbGVyKCkgeworICAgICAgcHVibGljIHZvaWQgb25DbGljayhDbGlja0V2ZW50IGV2ZW50KSB7CisgICAgICAgIGRpYWxvZ0JveC5oaWRlKCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICAvLyBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBXaWRnZXQKKyAgICBkaWFsb2dCb3guc2V0V2lkZ2V0KGRpYWxvZ1ZQYW5lbCk7CisKKyAgICBidXR0b24uYWRkQ2xpY2tIYW5kbGVyKG5ldyBDbGlja0hhbmRsZXIoKSB7CisgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKENsaWNrRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZGlhbG9nQm94LmNlbnRlcigpOworICAgICAgICBkaWFsb2dCb3guc2hvdygpOworICAgICAgfQorICAgIH0pOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9wdWJsaWMvZ3d0LWhlbGxvLWdhZGdldHMtaWdvb2dsZS10aHVtYi5wbmcgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9wdWJsaWMvZ3d0LWhlbGxvLWdhZGdldHMtaWdvb2dsZS10aHVtYi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3MDc3NAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL3B1YmxpYy9nd3QtaGVsbG8tZ2FkZ2V0cy1pZ29vZ2xlLXRodW1iLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9wdWJsaWMvZ3d0LWhlbGxvLWdhZGdldHMtaWdvb2dsZS5wbmcgYi9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9wdWJsaWMvZ3d0LWhlbGxvLWdhZGdldHMtaWdvb2dsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0MTE0OQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL3B1YmxpYy9nd3QtaGVsbG8tZ2FkZ2V0cy1pZ29vZ2xlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9wdWJsaWMvaGVsbG8uY3NzIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvcHVibGljL2hlbGxvLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODgwNTlkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvcHVibGljL2hlbGxvLmNzcwpAQCAtMCwwICsxLDEwMyBAQAorLyoqCisgKiBUaGUgZmlsZSBjb250YWlucyBzdHlsZXMgZm9yIGEgc2FtcGxlIHBsdWdpbiBkZXJpdmVkIGZyb20gdGhlCisgKiBHV1Qgc3RhbmRhcmQgdGhlbWUuCisgKiBJbWFnZXMgaW4gdGhlIHN0eWxlc2hlZXQgaGF2ZSBiZWVuIHJlbW92ZWQsIGFzIHdlbGwgYXMgc3R5bGVzIGZvciB3aWRnZXRzCisgKiBub3QgY3VycmVudGx5IGluIHVzZS4KKyAqLworCitib2R5LCB0YWJsZSB0ZCwgc2VsZWN0IHsKKyAgZm9udC1mYW1pbHk6IEFyaWFsIFVuaWNvZGUgTVMsIEFyaWFsLCBzYW5zLXNlcmlmOworICBmb250LXNpemU6IHNtYWxsOworfQorcHJlIHsKKyAgZm9udC1mYW1pbHk6ICJjb3VyaWVyIG5ldyIsIGNvdXJpZXI7CisgIGZvbnQtc2l6ZTogc21hbGw7Cit9Citib2R5IHsKKyAgY29sb3I6IGJsYWNrOworICBtYXJnaW46IDBweDsKKyAgYm9yZGVyOiAwcHg7CisgIHBhZGRpbmc6IDBweDsKKyAgYmFja2dyb3VuZDogI2ZmZjsKKyAgZGlyZWN0aW9uOiBsdHI7Cit9CithLCBhOnZpc2l0ZWQsIGE6aG92ZXIgeworICBjb2xvcjogIzAwMDBBQTsKK30KKworLyoqCisgKiBUaGUgcmVmZXJlbmNlIHRoZW1lIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIHRoaXMgc3R5bGUgc2hlZXQgaGFzCisgKiBsb2FkZWQuICBDcmVhdGUgYSBoaWRkZW4gZGl2IGVsZW1lbnQgd2l0aCBhYnNvbHV0ZSBwb3NpdGlvbiwgYXNzaWduIHRoZSBzdHlsZQorICogbmFtZSBiZWxvdywgYW5kIGF0dGFjaCBpdCB0byB0aGUgRE9NLiAgVXNlIGEgdGltZXIgdG8gZGV0ZWN0IHdoZW4gdGhlCisgKiBlbGVtZW50J3MgaGVpZ2h0IGFuZCB3aWR0aCBhcmUgc2V0IHRvIDVweC4KKyAqLworLmd3dC1SZWZlcmVuY2Utc3RhbmRhcmQgeworICBoZWlnaHQ6IDVweDsKKyAgd2lkdGg6IDVweDsKKyAgem9vbTogMTsKK30KKworLmd3dC1CdXR0b24geworICBtYXJnaW46IDA7CisgIHBhZGRpbmc6IDNweCA1cHg7CisgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKKyAgZm9udC1zaXplOiBzbWFsbDsKKyAgY3Vyc29yOiBwb2ludGVyOworICBjdXJzb3I6IGhhbmQ7CisgIGJvcmRlcjogMXB4IG91dHNldCAjY2NjOworfQorLmd3dC1CdXR0b246YWN0aXZlIHsKKyAgYm9yZGVyOiAxcHggaW5zZXQgI2NjYzsKK30KKy5nd3QtQnV0dG9uOmhvdmVyIHsKKyAgYm9yZGVyLWNvbG9yOiAjOWNmICM2OWUgIzY5ZSAjN2FmOworfQorLmd3dC1CdXR0b25bZGlzYWJsZWRdIHsKKyAgY3Vyc29yOiBkZWZhdWx0OworICBjb2xvcjogIzg4ODsKK30KKy5nd3QtQnV0dG9uW2Rpc2FibGVkXTpob3ZlciB7CisgIGJvcmRlcjogMXB4IG91dHNldCAjY2NjOworfQorCisuZ3d0LURpYWxvZ0JveCAuQ2FwdGlvbiB7CisgIGJhY2tncm91bmQ6ICNlM2U4ZjM7CisgIHBhZGRpbmc6IDRweCA0cHggNHB4IDhweDsKKyAgY3Vyc29yOiBkZWZhdWx0OworICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2JiYmJiYjsKKyAgYm9yZGVyLXRvcDogNXB4IHNvbGlkICNkMGU0ZjY7CisgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2QwZTRmNjsKKyAgYm9yZGVyLXJpZ2h0OiA1cHggc29saWQgI2QwZTRmNjsKK30KKworLmd3dC1EaWFsb2dCb3ggLmRpYWxvZ0NvbnRlbnQgeworfQorCisuZ3d0LURpYWxvZ0JveCAuZGlhbG9nTWlkZGxlQ2VudGVyIHsKKyAgcGFkZGluZzogM3B4OworICBiYWNrZ3JvdW5kOiB3aGl0ZTsKKyAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZDBlNGY2OworICBib3JkZXItcmlnaHQ6IDVweCBzb2xpZCAjZDBlNGY2OworICBib3JkZXItYm90dG9tOiA1cHggc29saWQgI2QwZTRmNjsKK30KKworLmd3dC1EaWFsb2dCb3ggLmRpYWxvZ1RvcExlZnRJbm5lciB7CisgIHdpZHRoOiA1cHg7CisgIHpvb206IDE7Cit9CisuZ3d0LURpYWxvZ0JveCAuZGlhbG9nVG9wUmlnaHRJbm5lciB7CisgIHdpZHRoOiA4cHg7CisgIHpvb206IDE7Cit9CisuZ3d0LURpYWxvZ0JveCAuZGlhbG9nQm90dG9tTGVmdElubmVyIHsKKyAgd2lkdGg6IDVweDsKKyAgaGVpZ2h0OiA4cHg7CisgIHpvb206IDE7Cit9CisKKy5nd3QtRGlhbG9nQm94IC5kaWFsb2dCb3R0b21SaWdodElubmVyIHsKKyAgd2lkdGg6IDVweDsKKyAgaGVpZ2h0OiA4cHg7CisgIHpvb206IDE7Cit9CisKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvLmdpdGlnbm9yZSBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNmMWVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorL3RhcmdldAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLy5zZXR0aW5ncy9vcmcubWF2ZW4uaWRlLmVjbGlwc2UucHJlZnMKKy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubTJlLmNvcmUucHJlZnMKKy9nZXJyaXQtZ3d0dWktcGx1Z2luLmltbApkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9nZXJyaXQtcGx1Z2luLWd3dHVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzlkNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKQEAgLTAsMCArMSw1IEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorZW5jb2RpbmcvL3NyYy9tYWluL2phdmE9VVRGLTgKK2VuY29kaW5nLy9zcmMvbWFpbi9yZXNvdXJjZXM9VVRGLTgKK2VuY29kaW5nLy9zcmMvdGVzdC9qYXZhPVVURi04CitlbmNvZGluZy88cHJvamVjdD49VVRGLTgKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ZTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0wLDAgKzEsMjk1IEBACitlY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmZpZWxkU3VmZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxQcmVmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5sb2NhbFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLnN0YXRpY0ZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmllbGRTdWZmaXhlcz0KK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaW5hbEZpZWxkUHJlZml4ZXM9CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuc3RhdGljRmluYWxGaWVsZFN1ZmZpeGVzPQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS42CitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS42CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbm5vdGF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Jlc291cmNlc19pbl90cnk9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3VuaW9uX3R5cGVfaW5fbXVsdGljYXRjaD0xNgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9ibG9ja19ib3VuZGFyaWVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lm5ld19saW5lc19hdF9qYXZhZG9jX2JvdW5kYXJpZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQucHJlc2VydmVfd2hpdGVfc3BhY2VfYmV0d2Vlbl9jb2RlX2FuZF9saW5lX2NvbW1lbnRzPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmRpc2FibGluZ190YWc9QGZvcm1hdHRlclw6b2ZmCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZW5hYmxpbmdfdGFnPUBmb3JtYXR0ZXJcOm9uCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9saW5lX2NvbW1lbnRfc3RhcnRpbmdfb25fZmlyc3RfY29sdW1uPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9maWVsZD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9sb2NhbF92YXJpYWJsZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9tZXRob2Q9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fcGFja2FnZT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX3R5cGU9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2xhYmVsPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl90cnk9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl90cnlfcmVzb3VyY2VzPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3RyeT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl90cnk9aW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX3RyeV9yZXNvdXJjZXM9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl9saW5lc19pbl9jb21tZW50cz10cnVlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuam9pbl93cmFwcGVkX2xpbmVzPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MAorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9Mworb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9c3BhY2UKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9Mgorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV9vbl9vZmZfdGFncz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9vcl9vcGVyYXRvcl9tdWx0aWNhdGNoPXRydWUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX291dGVyX2V4cHJlc3Npb25zX3doZW5fbmVzdGVkPXRydWUKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE4ODIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCkBAIC0wLDAgKzEsNyBAQAorZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKK2Zvcm1hdHRlcl9wcm9maWxlPV9Hb29nbGUgRm9ybWF0Citmb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMgorb3JnLmVjbGlwc2UuamR0LnVpLmV4Y2VwdGlvbi5uYW1lPWUKK29yZy5lY2xpcHNlLmpkdC51aS5nZXR0ZXJzZXR0ZXIudXNlLmlzPXRydWUKK29yZy5lY2xpcHNlLmpkdC51aS5rZXl3b3JkdGhpcz1mYWxzZQorb3JnLmVjbGlwc2UuamR0LnVpLm92ZXJyaWRlYW5ub3RhdGlvbj10cnVlCmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dHVpL3BvbS54bWwgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5NTgzMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvcG9tLnhtbApAQCAtMCwwICsxLDEyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KK0NvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKK2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGx1Z2luLWd3dHVpPC9hcnRpZmFjdElkPgorICA8bmFtZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBQbHVnaW4gR1dUIFVJPC9uYW1lPgorCisgIDxkZXNjcmlwdGlvbj4KKyAgICBBUEkgZm9yIFVJIHBsdWdpbnMgdG8gYnVpbGQgd2l0aCBHV1QgYW5kIGludGVncmF0ZSB3aXRoIEdlcnJpdAorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmd3dC11c2VyPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nd3Q8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5nd3QtZGV2PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgIDxidWlsZD4KKyAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgPHBsdWdpbnM+CisgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5tMmU8L2dyb3VwSWQ+CisgICAgICAgICAgIDxhcnRpZmFjdElkPmxpZmVjeWNsZS1tYXBwaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgPGxpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKyAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb25zPgorICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmd3dC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvblJhbmdlPlsyLjUuMCwpPC92ZXJzaW9uUmFuZ2U+CisgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlc291cmNlczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+aTE4bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGVBc3luYzwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICAgPGFjdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRlIC8+CisgICAgICAgICAgICAgICAgICAgPC9hY3Rpb24+CisgICAgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICA8cGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb25SYW5nZT5bMi4xLjEsKTwvdmVyc2lvblJhbmdlPgorICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5leHBsb2RlZDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisgICAgICAgICAgICAgICAgICAgPGFjdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRlIC8+CisgICAgICAgICAgICAgICAgICAgPC9hY3Rpb24+CisgICAgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uPgorICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25zPgorICAgICAgICAgICAgIDwvbGlmZWN5Y2xlTWFwcGluZ01ldGFkYXRhPgorICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPC9wbHVnaW4+CisgICAgICA8L3BsdWdpbnM+CisgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmd3dC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxtb2R1bGU+Y29tLmdvb2dsZS5nZXJyaXQuUGx1Z2luPC9tb2R1bGU+CisgICAgICAgICAgPGRpc2FibGVDbGFzc01ldGFkYXRhPnRydWU8L2Rpc2FibGVDbGFzc01ldGFkYXRhPgorICAgICAgICAgIDxkaXNhYmxlQ2FzdENoZWNraW5nPnRydWU8L2Rpc2FibGVDYXN0Q2hlY2tpbmc+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cmVzb3VyY2VzPC9nb2FsPgorICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorPC9wcm9qZWN0PgorCmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvUGx1Z2luLmd3dC54bWwgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvUGx1Z2luLmd3dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlZGY2NwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9QbHVnaW4uZ3d0LnhtbApAQCAtMCwwICsxLDIzIEBACis8IS0tCisgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8bW9kdWxlPgorICA8ZGVmaW5lLWxpbmtlciBuYW1lPSJnZXJyaXRfcGx1Z2luIiBjbGFzcz0iY29tLmdvb2dsZS5nZXJyaXQubGlua2VyLkdlcnJpdFBsdWdpbkxpbmtlciIvPgorICA8YWRkLWxpbmtlciBuYW1lPSJnZXJyaXRfcGx1Z2luIi8+CisgIDxnZW5lcmF0ZS13aXRoIGNsYXNzPSJjb20uZ29vZ2xlLmdlcnJpdC5yZWJpbmQuUGx1Z2luR2VuZXJhdG9yIj4KKyAgICA8d2hlbi10eXBlLWFzc2lnbmFibGUgY2xhc3M9ImNvbS5nb29nbGUuZ2Vycml0LmNsaWVudC5QbHVnaW4iLz4KKyAgPC9nZW5lcmF0ZS13aXRoPgorICA8c291cmNlIHBhdGg9ImNsaWVudCIvPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY2xpZW50L1BsdWdpbi5qYXZhIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9QbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkxYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9QbHVnaW4uamF2YQpAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY2xpZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5jbGllbnQuRW50cnlQb2ludDsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB3cml0aW5nIEdlcnJpdCBXZWIgVUkgcGx1Z2lucworICoKKyAqIFdyaXRpbmcgYSBwbHVnaW46CisgKiA8b2w+CisgKiA8bGk+RGVjbGFyZSBzdWJ0eXBlIG9mIFBsdWdpbjwvbGk+CisgKiA8bGk+QmluZCBXZWJVaVBsdWdpbiB0byBHd3RQbHVnaW4gaW1wbGVtZW50YXRpb24gaW4gR2Vycml0LU1vZHVsZTwvbGk+CisgKiA8L29sPgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGx1Z2luIGltcGxlbWVudHMgRW50cnlQb2ludCB7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvbGlua2VyL0dlcnJpdFBsdWdpbkxpbmtlci5qYXZhIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2xpbmtlci9HZXJyaXRQbHVnaW5MaW5rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTAzMzRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2xpbmtlci9HZXJyaXRQbHVnaW5MaW5rZXIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQubGlua2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5leHQuTGlua2VyQ29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmxpbmtlci5Dcm9zc1NpdGVJZnJhbWVMaW5rZXI7CisKKy8qKiBGaW5hbGl6ZXMgdGhlIG1vZHVsZSBtYW5pZmVzdCBmaWxlIHdpdGggdGhlIHNlbGVjdGlvbiBzY3JpcHQuICovCitwdWJsaWMgZmluYWwgY2xhc3MgR2Vycml0UGx1Z2luTGlua2VyIGV4dGVuZHMgQ3Jvc3NTaXRlSWZyYW1lTGlua2VyIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgcmV0dXJuICJHZXJyaXQgR1dUIFVJIHBsdWdpbiI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFN0cmluZyBnZXRKc0NvbXB1dGVVcmxGb3JSZXNvdXJjZShMaW5rZXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICByZXR1cm4gImNvbS9nb29nbGUvZ2Vycml0L2xpbmtlci9jb21wdXRlVXJsRm9yUGx1Z2luUmVzb3VyY2UuanMiOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmViaW5kL1BsdWdpbkdlbmVyYXRvci5qYXZhIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3JlYmluZC9QbHVnaW5HZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2MzZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3JlYmluZC9QbHVnaW5HZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDg5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJlYmluZDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmNsaWVudC5HV1Q7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5leHQuR2VuZXJhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuZXh0LkdlbmVyYXRvckNvbnRleHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5leHQuVHJlZUxvZ2dlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC5jb3JlLmV4dC5VbmFibGVUb0NvbXBsZXRlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0LmNvcmUuZXh0LnR5cGVpbmZvLkpDbGFzc1R5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QuY29yZS5leHQudHlwZWluZm8uVHlwZU9yYWNsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dC51c2VyLnJlYmluZC5DbGFzc1NvdXJjZUZpbGVDb21wb3NlckZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3QudXNlci5yZWJpbmQuU291cmNlV3JpdGVyOworCisvKioKKyAqIFdyaXRlIHRoZSB0b3AgbGF5ZXIgaW4gdGhlIEdhZGdldCBib290c3RyYXAgc2FuZHdpY2ggYW5kIGdlbmVyYXRlIGEgc3R1YgorICogbWFuaWZlc3QgdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCBieSB0aGUgbGlua2VyLgorICoKKyAqIEJhc2VkIG9uIGd3dC1nYWRnZXRzIEdhZGdldEdlbmVyYXRvciBjbGFzcworICovCitwdWJsaWMgY2xhc3MgUGx1Z2luR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoVHJlZUxvZ2dlciBsb2dnZXIsIEdlbmVyYXRvckNvbnRleHQgY29udGV4dCwKKyAgICAgIFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIFVuYWJsZVRvQ29tcGxldGVFeGNlcHRpb24geworCisgICAgLy8gVGhlIFR5cGVPcmFjbGUga25vd3MgYWJvdXQgYWxsIHR5cGVzIGluIHRoZSB0eXBlIHN5c3RlbQorICAgIFR5cGVPcmFjbGUgdHlwZU9yYWNsZSA9IGNvbnRleHQuZ2V0VHlwZU9yYWNsZSgpOworCisgICAgLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIHRoYXQgdGhlIGdlbmVyYXRvciBzaG91bGQgaW1wbGVtZW50CisgICAgSkNsYXNzVHlwZSBzb3VyY2VUeXBlID0gdHlwZU9yYWNsZS5maW5kVHlwZSh0eXBlTmFtZSk7CisKKyAgICAvLyBFbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHR5cGUgZXhpc3RzCisgICAgaWYgKHNvdXJjZVR5cGUgPT0gbnVsbCkgeworICAgICAgbG9nZ2VyLmxvZyhUcmVlTG9nZ2VyLkVSUk9SLCAiQ291bGQgbm90IGZpbmQgcmVxdWVzdGVkIHR5cGVOYW1lIiwgbnVsbCk7CisgICAgICB0aHJvdyBuZXcgVW5hYmxlVG9Db21wbGV0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgR2FkZ2V0IHR5cGUgaXMgY29ycmVjdGx5IGRlZmluZWQKKyAgICB2YWxpZGF0ZVR5cGUobG9nZ2VyLCBzb3VyY2VUeXBlKTsKKworICAgIC8vIFBpY2sgYSBuYW1lIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzIHRvIG5vdCBjb25mbGljdC4KKyAgICBTdHJpbmcgZ2VuZXJhdGVkU2ltcGxlU291cmNlTmFtZSA9IHNvdXJjZVR5cGUuZ2V0U2ltcGxlU291cmNlTmFtZSgpCisgICAgICAgICsgIlBsdWdpbkltcGwiOworCisgICAgLy8gQmVnaW4gd3JpdGluZyB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4KKyAgICBDbGFzc1NvdXJjZUZpbGVDb21wb3NlckZhY3RvcnkgZiA9IG5ldyBDbGFzc1NvdXJjZUZpbGVDb21wb3NlckZhY3RvcnkoCisgICAgICAgIHNvdXJjZVR5cGUuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgZ2VuZXJhdGVkU2ltcGxlU291cmNlTmFtZSk7CisgICAgZi5hZGRJbXBvcnQoR1dULmNsYXNzLmdldE5hbWUoKSk7CisgICAgZi5zZXRTdXBlcmNsYXNzKHR5cGVOYW1lKTsKKworICAgIC8vIEFsbCBzb3VyY2UgZ2V0cyB3cml0dGVuIHRocm91Z2ggdGhpcyBXcml0ZXIKKyAgICBQcmludFdyaXRlciBvdXQgPSBjb250ZXh0LnRyeUNyZWF0ZShsb2dnZXIsCisgICAgICAgIHNvdXJjZVR5cGUuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgZ2VuZXJhdGVkU2ltcGxlU291cmNlTmFtZSk7CisKKyAgICAvLyBJZiBhbiBpbXBsZW1lbnRhdGlvbiBhbHJlYWR5IGV4aXN0cywgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnkgd29yaworICAgIGlmIChvdXQgIT0gbnVsbCkgeworCisgICAgICAvLyBXZSByZWFsbHkgdXNlIGEgU291cmNlV3JpdGVyIHNpbmNlIGl0J3MgY29udmVuaWVudAorICAgICAgU291cmNlV3JpdGVyIHN3ID0gZi5jcmVhdGVTb3VyY2VXcml0ZXIoY29udGV4dCwgb3V0KTsKKyAgICAgIHN3LmNvbW1pdChsb2dnZXIpOworICAgIH0KKworICAgIHJldHVybiBmLmdldENyZWF0ZWRDbGFzc05hbWUoKTsKKyAgfQorCisgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVHlwZShUcmVlTG9nZ2VyIGxvZ2dlciwgSkNsYXNzVHlwZSB0eXBlKQorICAgICAgdGhyb3dzIFVuYWJsZVRvQ29tcGxldGVFeGNlcHRpb24geworICAgIGlmICghdHlwZS5pc0RlZmF1bHRJbnN0YW50aWFibGUoKSkgeworICAgICAgbG9nZ2VyLmxvZyhUcmVlTG9nZ2VyLkVSUk9SLCAiUGx1Z2luIHR5cGVzIG11c3QgYmUgZGVmYXVsdCBpbnN0YW50aWFibGUiLAorICAgICAgICAgIG51bGwpOworICAgICAgdGhyb3cgbmV3IFVuYWJsZVRvQ29tcGxldGVFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tZ3d0dWkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L2xpbmtlci9jb21wdXRlVXJsRm9yUGx1Z2luUmVzb3VyY2UuanMgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9saW5rZXIvY29tcHV0ZVVybEZvclBsdWdpblJlc291cmNlLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMjBlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWd3dHVpL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9saW5rZXIvY29tcHV0ZVVybEZvclBsdWdpblJlc291cmNlLmpzCkBAIC0wLDAgKzEsMyBAQAorZnVuY3Rpb24gY29tcHV0ZVVybEZvclJlc291cmNlKHJlc291cmNlKSB7CisgIHJldHVybiBfX01PRFVMRV9GVU5DX18uX19tb2R1bGVCYXNlICsgcmVzb3VyY2U7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS8uZ2l0aWdub3JlIGIvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDc1YTJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQgQEAKKy90YXJnZXQKKy8uY2xhc3NwYXRoCisvLnByb2plY3QKKy8uc2V0dGluZ3MKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3BvbS54bWwgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzYyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9wb20ueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPGFydGlmYWN0SWQ+Z2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkdlcnJpdCBDb2RlIFJldmlldyAtIFdlYiBVSSBKYXZhU2NyaXB0IFBsdWdpbiBBcmNoZXR5cGU8L25hbWU+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPGRlZmF1bHRHZXJyaXRBcGlWZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvZGVmYXVsdEdlcnJpdEFwaVZlcnNpb24+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgorICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CisgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sIGIvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0Y2FhZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxhcmNoZXR5cGUtZGVzY3JpcHRvciBuYW1lPSJHZXJyaXQgUGx1Z2luIj4KKyAgPHJlcXVpcmVkUHJvcGVydGllcz4KKyAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9InBsdWdpbk5hbWUiLz4KKworICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0iSW1wbGVtZW50YXRpb24tVmVuZG9yIi8+CisgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJJbXBsZW1lbnRhdGlvbi1VcmwiLz4KKworICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0iZ2Vycml0QXBpVHlwZSI+CisgICAgICA8ZGVmYXVsdFZhbHVlPmpzPC9kZWZhdWx0VmFsdWU+CisgICAgPC9yZXF1aXJlZFByb3BlcnR5PgorICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0iZ2Vycml0QXBpVmVyc2lvbiI+CisgICAgICA8ZGVmYXVsdFZhbHVlPiR7ZGVmYXVsdEdlcnJpdEFwaVZlcnNpb259PC9kZWZhdWx0VmFsdWU+CisgICAgPC9yZXF1aXJlZFByb3BlcnR5PgorICA8L3JlcXVpcmVkUHJvcGVydGllcz4KKworICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIj4KKyAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi8qLmphdmE8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKworICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qczwvZGlyZWN0b3J5PgorICAgICAgPGluY2x1ZGVzPgorICAgICAgICA8aW5jbHVkZT4qKi8qLmpzPC9pbmNsdWRlPgorICAgICAgPC9pbmNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisKKyAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSI+CisgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlcy9Eb2N1bWVudGF0aW9uPC9kaXJlY3Rvcnk+CisgICAgICA8aW5jbHVkZXM+CisgICAgICAgIDxpbmNsdWRlPioqLyoubWQ8L2luY2x1ZGU+CisgICAgICA8L2luY2x1ZGVzPgorICAgIDwvZmlsZVNldD4KKworICAgIDxmaWxlU2V0PgorICAgICAgPGRpcmVjdG9yeT48L2RpcmVjdG9yeT4KKyAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgPGluY2x1ZGU+LmdpdGlnbm9yZTwvaW5jbHVkZT4KKyAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgIDwvaW5jbHVkZXM+CisgICAgPC9maWxlU2V0PgorICA8L2ZpbGVTZXRzPgorPC9hcmNoZXR5cGUtZGVzY3JpcHRvcj4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzLy5naXRpZ25vcmUgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDYyNTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNSBAQAorL3RhcmdldAorLy5jbGFzc3BhdGgKKy8ucHJvamVjdAorLy5zZXR0aW5ncy9vcmcubWF2ZW4uaWRlLmVjbGlwc2UucHJlZnMKKy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubTJlLmNvcmUucHJlZnMKZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL0xJQ0VOU0UgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9MSUNFTlNFCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMDY5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9MSUNFTlNFCkBAIC0wLDAgKzEsMjAxIEBACisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQorICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAorICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KKworMS4gRGVmaW5pdGlvbnMuCisKKyAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCisgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KKworICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KKworICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAorICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgorICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKKyAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQorICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKKyAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQorICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KKworICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KKworICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCisgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCisgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAorICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAorICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAorICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgorCisgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgorICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQorICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCisgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgorCisgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0CisgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCisgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcworICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCisgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCisgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgorCisgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZworICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucworICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5CisgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCisgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKKyAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgorICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAorICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KKyAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCisgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQorICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0CisgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQorICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCisKKyAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKKyAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgorCisyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKKyAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQorICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KKworMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCisgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKKyAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCisgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgorICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQorICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKKyAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCisgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCisgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAorICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcworICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCisgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCisKKzQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCisgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91CisgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKKyAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAorCisgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCisKKyAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcworICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKKyAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAorICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKKyAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCisKKyAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cworICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKKyAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKKyAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKKyAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKKyAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAorICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKKyAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKKyAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCisgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCisgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAorICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCisgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKKyAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKKyAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKKyAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCisKKyAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAorICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgorICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCisgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKKyAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCisKKzUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKKyAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaworICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgorICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQorICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKKyAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KKworNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQorICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAorICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCisgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KKworNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCisgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCisgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKKyAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKKyAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CisgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCisKKzguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAorICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCisgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQorICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKKyAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQorICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQorICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAorICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKKyAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKKyAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZworICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKKyAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCisgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcworICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKKyAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCisgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCisgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKKyAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KKyAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgorCisgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZworICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgorICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKKyAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKKyAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKKyAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgorICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgorCitDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOGI0NjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCkBAIC0wLDAgKzEsMTIxIEBACis8IS0tCitDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCitodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgPG5hbWU+JHtwbHVnaW5OYW1lfTwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8R2Vycml0LUFwaVR5cGU+JHtnZXJyaXRBcGlUeXBlfTwvR2Vycml0LUFwaVR5cGU+CisgICAgPEdlcnJpdC1BcGlWZXJzaW9uPiR7Z2Vycml0QXBpVmVyc2lvbn08L0dlcnJpdC1BcGlWZXJzaW9uPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPioqLyouanM8L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmNsYXNzPC9pbmNsdWRlPgorICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVuZG9yPiR7SW1wbGVtZW50YXRpb24tVmVuZG9yfTwvSW1wbGVtZW50YXRpb24tVmVuZG9yPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVVJMPiR7SW1wbGVtZW50YXRpb24tVXJsfTwvSW1wbGVtZW50YXRpb24tVVJMPgorCisgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1UaXRsZT4ke0dlcnJpdC1BcGlUeXBlfSAke3Byb2plY3QuYXJ0aWZhY3RJZH08L0ltcGxlbWVudGF0aW9uLVRpdGxlPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L0ltcGxlbWVudGF0aW9uLVZlcnNpb24+CisKKyAgICAgICAgICAgICAgPEdlcnJpdC1BcGlUeXBlPiR7R2Vycml0LUFwaVR5cGV9PC9HZXJyaXQtQXBpVHlwZT4KKyAgICAgICAgICAgICAgPEdlcnJpdC1BcGlWZXJzaW9uPiR7R2Vycml0LUFwaVZlcnNpb259PC9HZXJyaXQtQXBpVmVyc2lvbj4KKyAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisKKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjMuMjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHNvdXJjZT4xLjY8L3NvdXJjZT4KKyAgICAgICAgICA8dGFyZ2V0PjEuNjwvdGFyZ2V0PgorICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS1yZXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtcmVzb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29weS1yZXNvdXJjZXM8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvY2xhc3Nlcy9zdGF0aWM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2pzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisKKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LWV4dGVuc2lvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke0dlcnJpdC1BcGlWZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+NC44LjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworICA8cmVwb3NpdG9yaWVzPgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmdlcnJpdC1hcGktcmVwb3NpdG9yeTwvaWQ+CisjaWYgKCRnZXJyaXRBcGlWZXJzaW9uLmVuZHNXaXRoKCJTTkFQU0hPVCIpKQorICAgICAgPHVybD5odHRwczovL2dlcnJpdC1hcGkuY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vc25hcHNob3QvPC91cmw+CisjZWxzZQorICAgICAgPHVybD5odHRwczovL2dlcnJpdC1hcGkuY29tbW9uZGF0YXN0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vcmVsZWFzZS88L3VybD4KKyNlbmQKKyAgICA8L3JlcG9zaXRvcnk+CisgIDwvcmVwb3NpdG9yaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeUpzRXh0ZW5zaW9uLmphdmEgYi9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015SnNFeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWM5MTRkZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wbHVnaW4tanMtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTXlKc0V4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSAke3BhY2thZ2V9OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5MaXN0ZW47CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aS5KYXZhU2NyaXB0UGx1Z2luOworCitATGlzdGVuCitwdWJsaWMgY2xhc3MgTXlKc0V4dGVuc2lvbiBleHRlbmRzIEphdmFTY3JpcHRQbHVnaW4geworICBwdWJsaWMgTXlKc0V4dGVuc2lvbigpIHsKKyAgICBzdXBlcigiaGVsbG8tanMtcGx1Z2lucy5qcyIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qcy9oZWxsby1qcy1wbHVnaW5zLmpzIGIvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vanMvaGVsbG8tanMtcGx1Z2lucy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDUxYTQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXBsdWdpbi1qcy1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vanMvaGVsbG8tanMtcGx1Z2lucy5qcwpAQCAtMCwwICsxIEBACithbGVydCgiR3JlZXRpbmcgZnJvbSBKYXZhU2NyaXB0IEdlcnJpdCBwbHVnaW4hIik7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3BvbS54bWwgYi9nZXJyaXQtcHJldHRpZnkvcG9tLnhtbAppbmRleCA5MzU0Mjc0Li5iMTUwYWMwIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvcG9tLnhtbAorKysgYi9nZXJyaXQtcHJldHRpZnkvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LXByZXR0aWZ5PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L0NsaWVudFNpZGVGb3JtYXR0ZXIuamF2YSBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9DbGllbnRTaWRlRm9ybWF0dGVyLmphdmEKaW5kZXggNGJjZTk1NC4uMTQzNmJiYSAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L0NsaWVudFNpZGVGb3JtYXR0ZXIuamF2YQorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvQ2xpZW50U2lkZUZvcm1hdHRlci5qYXZhCkBAIC0zOSwxNSArMzksMjUgQEAKICAgICBSb290UGFuZWwuZ2V0KCkuYWRkKHByZXR0aWZ5KTsKIAogICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkuY29yZSgpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfYXBvbGxvKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19jbGooKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX2NzcygpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfZGFydCgpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfZ28oKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX2hzKCkpOwogICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19saXNwKCkpOwogICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19sdWEoKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX21sKCkpOworICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19uKCkpOwogICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ19wcm90bygpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfc2NhbGEoKSk7CiAgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX3NxbCgpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfdGV4KCkpOwogICAgIHByZXR0aWZ5LmNvbXBpbGUoUmVzb3VyY2VzLkkubGFuZ192YigpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfdmhkbCgpKTsKICAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfd2lraSgpKTsKKyAgICBwcmV0dGlmeS5jb21waWxlKFJlc291cmNlcy5JLmxhbmdfeHEoKSk7CisgICAgcHJldHRpZnkuY29tcGlsZShSZXNvdXJjZXMuSS5sYW5nX3lhbWwoKSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9SZXNvdXJjZXMuamF2YSBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9SZXNvdXJjZXMuamF2YQppbmRleCA3NDVjOTIxLi5mNTNjOTFjIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvUmVzb3VyY2VzLmphdmEKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L1Jlc291cmNlcy5qYXZhCkBAIC0zMiwzMyArMzIsMjMgQEAKICAgQFNvdXJjZSgicHJldHRpZnkuanMiKQogICBUZXh0UmVzb3VyY2UgY29yZSgpOwogCi0gIEBTb3VyY2UoImxhbmctYXBvbGxvLmpzIikKLSAgVGV4dFJlc291cmNlIGxhbmdfYXBvbGxvKCk7Ci0KLSAgQFNvdXJjZSgibGFuZy1jc3MuanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ19jc3MoKTsKLQotICBAU291cmNlKCJsYW5nLWhzLmpzIikKLSAgVGV4dFJlc291cmNlIGxhbmdfaHMoKTsKLQotICBAU291cmNlKCJsYW5nLWxpc3AuanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ19saXNwKCk7Ci0KLSAgQFNvdXJjZSgibGFuZy1sdWEuanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ19sdWEoKTsKLQotICBAU291cmNlKCJsYW5nLW1sLmpzIikKLSAgVGV4dFJlc291cmNlIGxhbmdfbWwoKTsKLQotICBAU291cmNlKCJsYW5nLXByb3RvLmpzIikKLSAgVGV4dFJlc291cmNlIGxhbmdfcHJvdG8oKTsKLQotICBAU291cmNlKCJsYW5nLXNxbC5qcyIpCi0gIFRleHRSZXNvdXJjZSBsYW5nX3NxbCgpOwotCi0gIEBTb3VyY2UoImxhbmctdmIuanMiKQotICBUZXh0UmVzb3VyY2UgbGFuZ192YigpOwotCi0gIEBTb3VyY2UoImxhbmctd2lraS5qcyIpCi0gIFRleHRSZXNvdXJjZSBsYW5nX3dpa2koKTsKKyAgQFNvdXJjZSgibGFuZy1hcG9sbG8uanMiKSBUZXh0UmVzb3VyY2UgbGFuZ19hcG9sbG8oKTsKKyAgQFNvdXJjZSgibGFuZy1jbGouanMiKSBUZXh0UmVzb3VyY2UgbGFuZ19jbGooKTsKKyAgQFNvdXJjZSgibGFuZy1jc3MuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ19jc3MoKTsKKyAgQFNvdXJjZSgibGFuZy1kYXJ0LmpzIikgVGV4dFJlc291cmNlIGxhbmdfZGFydCgpOworICBAU291cmNlKCJsYW5nLWdvLmpzIikgVGV4dFJlc291cmNlIGxhbmdfZ28oKTsKKyAgQFNvdXJjZSgibGFuZy1ocy5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX2hzKCk7CisgIEBTb3VyY2UoImxhbmctbGlzcC5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX2xpc3AoKTsKKyAgQFNvdXJjZSgibGFuZy1sdWEuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ19sdWEoKTsKKyAgQFNvdXJjZSgibGFuZy1tbC5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX21sKCk7CisgIEBTb3VyY2UoImxhbmctbi5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX24oKTsKKyAgQFNvdXJjZSgibGFuZy1wcm90by5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX3Byb3RvKCk7CisgIEBTb3VyY2UoImxhbmctc2NhbGEuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ19zY2FsYSgpOworICBAU291cmNlKCJsYW5nLXNxbC5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX3NxbCgpOworICBAU291cmNlKCJsYW5nLXRleC5qcyIpIFRleHRSZXNvdXJjZSBsYW5nX3RleCgpOworICBAU291cmNlKCJsYW5nLXZiLmpzIikgVGV4dFJlc291cmNlIGxhbmdfdmIoKTsKKyAgQFNvdXJjZSgibGFuZy12aGRsLmpzIikgVGV4dFJlc291cmNlIGxhbmdfdmhkbCgpOworICBAU291cmNlKCJsYW5nLXdpa2kuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ193aWtpKCk7CisgIEBTb3VyY2UoImxhbmcteHEuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ194cSgpOworICBAU291cmNlKCJsYW5nLXlhbWwuanMiKSBUZXh0UmVzb3VyY2UgbGFuZ195YW1sKCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jb21tb24vUHJldHR5Rm9ybWF0dGVyLmphdmEgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jb21tb24vUHJldHR5Rm9ybWF0dGVyLmphdmEKaW5kZXggMTUxMTQ5Yi4uNTExYjA1NiAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY29tbW9uL1ByZXR0eUZvcm1hdHRlci5qYXZhCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NvbW1vbi9QcmV0dHlGb3JtYXR0ZXIuamF2YQpAQCAtMTM1LDExICsxMzUsMjEgQEAKICAgICAgIC8vIGNvbmZ1c2UgdGhlIHBhcnNlci4KICAgICAgIC8vCiAgICAgICBodG1sID0gaHRtbC5yZXBsYWNlQWxsKCImIzM5OyIsICInIik7Ci0gICAgICBodG1sID0gcHJldHRpZnkoaHRtbCwgZ2V0RmlsZVR5cGUoKSk7CiAKKyAgICAgIC8vIElmIGEgbGluZSBpcyBtb2RpZmllZCBhdCBpdHMgZW5kIGFuZCB0aGUgbGluZSBlbmRpbmcgaXMgY2hhbmdlZCBmcm9tCisgICAgICAvLyAnXG4nIHRvICdcclxuJyB0aGVuIHRoZSAnXHInIG9mIHRoZSBuZXcgbGluZSBpcyBwYXJ0IG9mIHRoZSBtb2RpZmllZAorICAgICAgLy8gdGV4dC4gSWYgaW50cmFsaW5lIGRpZmZzIGFyZSBoaWdobGlnaHRlZCB0aGUgbW9kaWZpZWQgdGV4dCBpcworICAgICAgLy8gc3Vycm91bmRlZCBieSBhICdzcGFuJyB0YWcuIEFzIHJlc3VsdCAnXHInIGFuZCAnXG4nIG9mIHRoZSBuZXcgbGluZSBnZXQKKyAgICAgIC8vIHNlcGFyYXRlZCBieSAnPC9zcGFuPicuIEZvciB0aGUgcHJldHRpZnkgcGFyc2VyIHRoaXMgbm93IGxvb2tzIGxpa2UgdHdvCisgICAgICAvLyBzZXBhcmF0ZSBsaW5lIGVuZGluZ3MuIFRoaXMgbWVzc2VzIHVwIHRoZSBsaW5lIGNvdW50aW5nIGJlbG93LgorICAgICAgLy8gRHJvcCBhbnkgJ1xyJyB0byBhdm9pZCB0aGlzIHByb2JsZW0uCisgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCJccjwvc3Bhbj5cbiIsICI8L3NwYW4+XG4iKTsKKworICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSgiXG4iLCAiIFxuIik7CisgICAgICBodG1sID0gcHJldHRpZnkoaHRtbCwgZ2V0RmlsZVR5cGUoKSk7CisgICAgICBodG1sID0gaHRtbC5yZXBsYWNlKCIgXG4iLCAiXG4iKTsKICAgICB9IGVsc2UgewogICAgICAgaHRtbCA9IGV4cGFuZFRhYnMoaHRtbCk7Ci0gICAgICBodG1sID0gaHRtbC5yZXBsYWNlQWxsKCJcbiIsICI8YnIgLz4iKTsKICAgICB9CiAKICAgICBpbnQgcG9zID0gMDsKQEAgLTE1Miw4ICsxNjIsOSBAQAogICAgIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgd2hpbGUgKHBvcyA8PSBodG1sLmxlbmd0aCgpKSB7CiAgICAgICBpbnQgdGFnU3RhcnQgPSBodG1sLmluZGV4T2YoJzwnLCBwb3MpOworICAgICAgaW50IGxmID0gaHRtbC5pbmRleE9mKCdcbicsIHBvcyk7CiAKLSAgICAgIGlmICh0YWdTdGFydCA8IDApIHsKKyAgICAgIGlmICh0YWdTdGFydCA8IDAgJiYgbGYgPCAwKSB7CiAgICAgICAgIC8vIE5vIG1vcmUgdGFncyByZW1haW5pbmcuIFdoYXQncyBsZWZ0IGlzIHBsYWluIHRleHQuCiAgICAgICAgIC8vCiAgICAgICAgIGFzc2VydCBsYXN0VGFnID09IFRhZy5OVUxMOwpAQCAtMTY3LDYgKzE3OCwyMiBAQAogICAgICAgICBicmVhazsKICAgICAgIH0KIAorICAgICAgLy8gTGluZSBlbmQgb2NjdXJzIGJlZm9yZSB0aGUgbmV4dCBIVE1MIHRhZy4gQnJlYWsgdGhlIGxpbmUuCisgICAgICBpZiAoMCA8PSBsZiAmJiAobGYgPCB0YWdTdGFydCB8fCB0YWdTdGFydCA8IDApKSB7CisgICAgICAgIGlmICh0ZXh0Q2h1bmtTdGFydCA8IGxmKSB7CisgICAgICAgICAgbGFzdFRhZy5vcGVuKGJ1ZiwgaHRtbCk7CisgICAgICAgICAgaHRtbFRleHQoaHRtbC5zdWJzdHJpbmcodGV4dENodW5rU3RhcnQsIGxmKSk7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gbGYgKyAxOworICAgICAgICB0ZXh0Q2h1bmtTdGFydCA9IHBvczsKKworICAgICAgICBsYXN0VGFnLmNsb3NlKGJ1ZiwgaHRtbCk7CisgICAgICAgIGNvbnRlbnQuYWRkTGluZShzcmMubWFwSW5kZXhUb0xpbmUobGluZUlkeCsrKSwgYnVmLnRvU3RyaW5nKCkpOworICAgICAgICBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBjb2wgPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKwogICAgICAgLy8gQXNzdW1lIG5vIGF0dHJpYnV0ZSBjb250YWlucyAnPicgYW5kIHRoYXQgYWxsIHRhZ3MKICAgICAgIC8vIHdpdGhpbiB0aGUgSFRNTCB3aWxsIGJlIHdlbGwtZm9ybWVkLgogICAgICAgLy8KQEAgLTE4MywxNCArMjEwLDcgQEAKICAgICAgIH0KICAgICAgIHRleHRDaHVua1N0YXJ0ID0gcG9zOwogCi0gICAgICBpZiAoaXNCUihodG1sLCB0YWdTdGFydCwgdGFnRW5kKSkgewotICAgICAgICBsYXN0VGFnLmNsb3NlKGJ1ZiwgaHRtbCk7Ci0gICAgICAgIGNvbnRlbnQuYWRkTGluZShzcmMubWFwSW5kZXhUb0xpbmUobGluZUlkeCksIGJ1Zi50b1N0cmluZygpKTsKLSAgICAgICAgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgY29sID0gMDsKLSAgICAgICAgbGluZUlkeCsrOwotCi0gICAgICB9IGVsc2UgaWYgKGh0bWwuY2hhckF0KHRhZ1N0YXJ0ICsgMSkgPT0gJy8nKSB7CisgICAgICBpZiAoaHRtbC5jaGFyQXQodGFnU3RhcnQgKyAxKSA9PSAnLycpIHsKICAgICAgICAgbGFzdFRhZyA9IGxhc3RUYWcucG9wKGJ1ZiwgaHRtbCk7CiAKICAgICAgIH0gZWxzZSBpZiAoaHRtbC5jaGFyQXQodGFnRW5kIC0gMSkgIT0gJy8nKSB7CkBAIC0yNDUsMTMgKzI2NSw2IEBACiAgIC8qKiBSdW4gdGhlIHByZXR0aWZ5IGVuZ2luZSBvdmVyIHRoZSB0ZXh0IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBwcmV0dGlmeShTdHJpbmcgaHRtbCwgU3RyaW5nIHR5cGUpOwogCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCUihTdHJpbmcgaHRtbCwgaW50IHRhZ1N0YXJ0LCBpbnQgdGFnRW5kKSB7Ci0gICAgcmV0dXJuIHRhZ0VuZCAtIHRhZ1N0YXJ0ID09IDUgLy8KLSAgICAgICAgJiYgaHRtbC5jaGFyQXQodGFnU3RhcnQgKyAxKSA9PSAnYicgLy8KLSAgICAgICAgJiYgaHRtbC5jaGFyQXQodGFnU3RhcnQgKyAyKSA9PSAncicgLy8KLSAgICAgICAgJiYgaHRtbC5jaGFyQXQodGFnU3RhcnQgKyAzKSA9PSAnICc7Ci0gIH0KLQogICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYWcgewogICAgIHN0YXRpYyBmaW5hbCBUYWcgTlVMTCA9IG5ldyBUYWcobnVsbCwgMCwgMCkgewogICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jb21tb24vU3BhcnNlRmlsZUNvbnRlbnQuamF2YSBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NvbW1vbi9TcGFyc2VGaWxlQ29udGVudC5qYXZhCmluZGV4IDFhNTQ2OGMuLjYwOWYwOTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NvbW1vbi9TcGFyc2VGaWxlQ29udGVudC5qYXZhCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NvbW1vbi9TcGFyc2VGaWxlQ29udGVudC5qYXZhCkBAIC0yOTYsNiArMjk2LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAvLyBVc2FnZSBvZiBbIGFuZCApIGlzIGludGVudGlvbmFsIHRvIGRlbm90ZSBpbmNsdXNpdmUvZXhjbHVzaXZlIHJhbmdlCiAgICAgICByZXR1cm4gIlJhbmdlWyIgKyBiYXNlICsgIiwiICsgZW5kKCkgKyAiKSI7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWFwb2xsby5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctYXBvbGxvLmpzCmluZGV4IDQwNDIwMzAuLjk5ZTRhOTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctYXBvbGxvLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctYXBvbGxvLmpzCkBAIC0xICsxLDIgQEAKLVBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1tQUi5QUl9DT01NRU5ULC9eI1teXHJcbl0qLyxudWxsLCcjJ10sW1BSLlBSX1BMQUlOLC9eW1x0XG5cciBceEEwXSsvLG51bGwsJwlcblxyIFx4YTAnXSxbUFIuUFJfU1RSSU5HLC9eXCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKS8sbnVsbCwnXCInXV0sW1tQUi5QUl9LRVlXT1JELC9eKD86QURTfEFEfEFVR3xCWkZ8QlpNRnxDQUV8Q0FGfENBfENDU3xDT018Q1N8REFTfERDQXxEQ09NfERDU3xERE9VQkx8RElNfERPVUJMRXxEVENCfERUQ0Z8RFZ8RFhDSHxFRFJVUFR8RVhURU5EfElOQ1J8SU5ERVh8TkRYfElOSElOVHxMWENIfE1BU0t8TVNLfE1QfE1TVXxOT09QfE9WU0t8UVhDSHxSQU5EfFJFQUR8UkVMSU5UfFJFU1VNRXxSRVRVUk58Uk9SfFJYT1J8U1FVQVJFfFNVfFRDUnxUQ0FBfE9WU0t8VENGfFRDfFRTfFdBTkR8V09SfFdSSVRFfFhDSHxYTFF8WFhBTFF8Wkx8WlF8QUREfEFEWnxTVUJ8U1VafE1QWXxNUFJ8TVBafERWUHxDT018QUJTfENMQXxDTFp8TERRfFNUT3xTVFF8QUxTfExMU3xMUlN8VFJBfFRTUXxUTUl8VE9WfEFYVHxUSVh8RExZfElOUHxPVVQpXHMvLG51bGxdLFtQUi5QUl9UWVBFLC9eKD86LT9HRU5BRFJ8PU1JTlVTfDJCQ0FEUnxWTnxCT0Z8TU18LT8yQ0FEUnwtP1sxLTZdRE5BRFJ8QURSRVN8QkJDT058W1NFXT9CQU5LXD0/fEJMT0NLfEJOS1NVTXxFP0NBRFJ8Q09VTlRcKj98Mj9ERUNcKj98LT9ETkNIQU58LT9ETlBUUnxFUVVBTFN8RVJBU0V8TUVNT1JZfDI/T0NUfFJFTUFEUnxTRVRMT0N8U1VCUk98T1JHfEJTU3xCRVN8U1lOfEVRVXxERUZJTkV8RU5EKVxzLyxudWxsXSxbUFIuUFJfTElURVJBTCwvXlwnKD86LSooPzpcd3xcXFtceDIxLVx4N2VdKSg/Oltcdy1dKnxcXFtceDIxLVx4N2VdKVs9IT9dPyk/L10sW1BSLlBSX1BMQUlOLC9eLSooPzpbIS16X118XFxbXHgyMS1ceDdlXSkoPzpbXHctXSp8XFxbXHgyMS1ceDdlXSlbPSE/XT8vaV0sW1BSLlBSX1BVTkNUVUFUSU9OLC9eW15cd1x0XG5cciBceEEwKClcIlxcXCc7XSsvXV0pLFsnYXBvbGxvJywnYWdjJywnYWVhJ10pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJjb20iLC9eI1teXG5ccl0qLyxudWxsLCIjIl0sWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciBcdTAwYTAiXSxbInN0ciIsL14iKD86W14iXFxdfFxcW1xTXHNdKSooPzoifCQpLyxudWxsLCciJ11dLFtbImt3ZCIsL14oPzpBRFN8QUR8QVVHfEJaRnxCWk1GfENBRXxDQUZ8Q0F8Q0NTfENPTXxDU3xEQVN8RENBfERDT018RENTfERET1VCTHxESU18RE9VQkxFfERUQ0J8RFRDRnxEVnxEWENIfEVEUlVQVHxFWFRFTkR8SU5DUnxJTkRFWHxORFh8SU5ISU5UfExYQ0h8TUFTS3xNU0t8TVB8TVNVfE5PT1B8T1ZTS3xRWENIfFJBTkR8UkVBRHxSRUxJTlR8UkVTVU1FfFJFVFVSTnxST1J8UlhPUnxTUVVBUkV8U1V8VENSfFRDQUF8T1ZTS3xUQ0Z8VEN8VFN8V0FORHxXT1J8V1JJVEV8WENIfFhMUXxYWEFMUXxaTHxaUXxBRER8QURafFNVQnxTVVp8TVBZfE1QUnxNUFp8RFZQfENPTXxBQlN8Q0xBfENMWnxMRFF8U1RPfFNUUXxBTFN8TExTfExSU3xUUkF8VFNRfFRNSXxUT1Z8QVhUfFRJWHxETFl8SU5QfE9VVClccy8sCitudWxsXSxbInR5cCIsL14oPzotP0dFTkFEUnw9TUlOVVN8MkJDQURSfFZOfEJPRnxNTXwtPzJDQURSfC0/WzEtNl1ETkFEUnxBRFJFU3xCQkNPTnxbRVNdP0JBTks9P3xCTE9DS3xCTktTVU18RT9DQURSfENPVU5UXCo/fDI/REVDXCo/fC0/RE5DSEFOfC0/RE5QVFJ8RVFVQUxTfEVSQVNFfE1FTU9SWXwyP09DVHxSRU1BRFJ8U0VUTE9DfFNVQlJPfE9SR3xCU1N8QkVTfFNZTnxFUVV8REVGSU5FfEVORClccy8sbnVsbF0sWyJsaXQiLC9eJyg/Oi0qKD86XHd8XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8pPy9dLFsicGxuIiwvXi0qKD86WyEtel18XFxbIS1+XSkoPzpbXHctXSp8XFxbIS1+XSlbIT0/XT8vXSxbInB1biIsL15bXlx3XHRcblxyICInLSk7XFxceGEwXSsvXV0pLFsiYXBvbGxvIiwiYWdjIiwiYWVhIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1jbGouanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWNsai5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI1MzljCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1jbGouanMKQEAgLTAsMCArMSwxOCBAQAorLyoKKyBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4KKworIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbIm9wbiIsL15bKFt7XSsvLGEsIihbeyJdLFsiY2xvIiwvXlspXF19XSsvLGEsIildfSJdLFsiY29tIiwvXjtbXlxuXHJdKi8sYSwiOyJdLFsicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxhLCJcdFxuXHIgXHUwMGEwIl0sWyJzdHIiLC9eIig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKS8sYSwnIiddXSxbWyJrd2QiLC9eKD86ZGVmfGlmfGRvfGxldHxxdW90ZXx2YXJ8Zm58bG9vcHxyZWN1cnx0aHJvd3x0cnl8bW9uaXRvci1lbnRlcnxtb25pdG9yLWV4aXR8ZGVmbWFjcm98ZGVmbnxkZWZuLXxtYWNyb2V4cGFuZHxtYWNyb2V4cGFuZC0xfGZvcnxkb3NlcXxkb3N5bmN8ZG90aW1lc3xhbmR8b3J8d2hlbnxub3R8YXNzZXJ0fGRvdG98cHJveHl8ZGVmc3RydWN0fGZpcnN0fHJlc3R8Y29uc3xkZWZwcm90b2NvbHxkZWZ0eXBlfGRlZnJlY29yZHxyZWlmeXxkZWZtdWx0aXxkZWZtZXRob2R8bWV0YXx3aXRoLW1ldGF8bnN8aW4tbnN8Y3JlYXRlLW5zfGltcG9ydHxpbnRlcm58cmVmZXJ8YWxpYXN8bmFtZXNwYWNlfHJlc29sdmV8cmVmfGRlcmVmfHJlZnNldHxuZXd8c2V0IXxtZW1mbnx0by1hcnJheXxpbnRvLWFycmF5fGFzZXR8Z2VuLWNsYXNzfHJlZHVjZXxtYXB8ZmlsdGVyfGZpbmR8bmlsP3xlbXB0eT98aGFzaC1tYXB8aGFzaC1zZXR8dmVjfHZlY3RvcnxzZXF8ZmxhdHRlbnxyZXZlcnNlfGFzc29jfGRpc3NvY3xsaXN0fGxpc3Q/fGRpc2p8Z2V0fHVuaW9ufGRpZmZlcmVuY2V8aW50ZXJzZWN0aW9ufGV4dGVuZHxleHRlbmQtdHlwZXxleHRlbmQtcHJvdG9jb2x8cHJuKVxiLyxhXSwKK1sidHlwIiwvXjpbXGRBLVphLXotXSsvXV0pLFsiY2xqIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1jc3MuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWNzcy5qcwppbmRleCBjNjUwZDhmLi4yMDg2YmQ1IDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWNzcy5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWNzcy5qcwpAQCAtMSArMSwyIEBACi1QUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbUFIuUFJfUExBSU4sL15bIFx0XHJcblxmXSsvLG51bGwsJyAJXHJcbgwnXV0sW1tQUi5QUl9TVFJJTkcsL15cIig/OlteXG5cclxmXFxcIl18XFwoPzpcclxuP3xcbnxcZil8XFxbXHNcU10pKlwiLyxudWxsXSxbUFIuUFJfU1RSSU5HLC9eXCcoPzpbXlxuXHJcZlxcXCddfFxcKD86XHJcbj98XG58XGYpfFxcW1xzXFNdKSpcJy8sbnVsbF0sWydsYW5nLWNzcy1zdHInLC9edXJsXCgoW15cKVwiXCddKilcKS9pXSxbUFIuUFJfS0VZV09SRCwvXig/OnVybHxyZ2J8XCFpbXBvcnRhbnR8QGltcG9ydHxAcGFnZXxAbWVkaWF8QGNoYXJzZXR8aW5oZXJpdCkoPz1bXlwtXHddfCQpL2ksbnVsbF0sWydsYW5nLWNzcy1rdycsL14oLT8oPzpbX2Etel18KD86XFxbMC05YS1mXSsgPykpKD86W19hLXowLTlcLV18XFwoPzpcXFswLTlhLWZdKyA/KSkqKVxzKjovaV0sW1BSLlBSX0NPTU1FTlQsL15cL1wqW14qXSpcKisoPzpbXlwvKl1bXipdKlwqKykqXC8vXSxbUFIuUFJfQ09NTUVOVCwvXig/OjwhLS18LS0+KS9dLFtQUi5QUl9MSVRFUkFMLC9eKD86XGQrfFxkKlwuXGQrKSg/OiV8W2Etel0rKT8vaV0sW1BSLlBSX0xJVEVSQUwsL14jKD86WzAtOWEtZl17M30pezEsMn0vaV0sW1BSLlBSX1BMQUlOLC9eLT8oPzpbX2Etel18KD86XFxbXGRhLWZdKyA/KSkoPzpbX2EtelxkXC1dfFxcKD86XFxbXGRhLWZdKyA/KSkqL2ldLFtQUi5QUl9QVU5DVFVBVElPTiwvXlteXHNcd1wnXCJdKy9dXSksWydjc3MnXSksUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbXSxbW1BSLlBSX0tFWVdPUkQsL14tPyg/OltfYS16XXwoPzpcXFtcZGEtZl0rID8pKSg/OltfYS16XGRcLV18XFwoPzpcXFtcZGEtZl0rID8pKSovaV1dKSxbJ2Nzcy1rdyddKSxQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtdLFtbUFIuUFJfU1RSSU5HLC9eW15cKVwiXCddKy9dXSksWydjc3Mtc3RyJ10pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cZlxyIF0rLyxudWxsLCIgXHRcclxuXHUwMDBjIl1dLFtbInN0ciIsL14iKD86W15cblxmXHIiXFxdfFxcKD86XHJcbj98XG58XGYpfFxcW1xTXHNdKSoiLyxudWxsXSxbInN0ciIsL14nKD86W15cblxmXHInXFxdfFxcKD86XHJcbj98XG58XGYpfFxcW1xTXHNdKSonLyxudWxsXSxbImxhbmctY3NzLXN0ciIsL151cmxcKChbXiInKV0rKVwpL2ldLFsia3dkIiwvXig/OnVybHxyZ2J8IWltcG9ydGFudHxAaW1wb3J0fEBwYWdlfEBtZWRpYXxAY2hhcnNldHxpbmhlcml0KSg/PVteXHctXXwkKS9pLG51bGxdLFsibGFuZy1jc3Mta3ciLC9eKC0/KD86W19hLXpdfFxcW1xkYS1mXSsgPykoPzpbXHctXXxcXFxcW1xkYS1mXSsgPykqKVxzKjovaV0sWyJjb20iLC9eXC9cKlteKl0qXCorKD86W14qL11bXipdKlwqKykqXC8vXSwKK1siY29tIiwvXig/OjxcIS0tfC0tXD4pL10sWyJsaXQiLC9eKD86XGQrfFxkKlwuXGQrKSg/OiV8W2Etel0rKT8vaV0sWyJsaXQiLC9eI1tcZGEtZl17Myw2fS9pXSxbInBsbiIsL14tPyg/OltfYS16XXxcXFtcZGEtZl0rID8pKD86W1x3LV18XFxcXFtcZGEtZl0rID8pKi9pXSxbInB1biIsL15bXlxzXHciJ10rL11dKSxbImNzcyJdKTtQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtdLFtbImt3ZCIsL14tPyg/OltfYS16XXxcXFtcZGEtZl0rID8pKD86W1x3LV18XFxcXFtcZGEtZl0rID8pKi9pXV0pLFsiY3NzLWt3Il0pO1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW10sW1sic3RyIiwvXlteIicpXSsvXV0pLFsiY3NzLXN0ciJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctZGFydC5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctZGFydC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZjY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1kYXJ0LmpzCkBAIC0wLDAgKzEsMyBAQAorUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvLG51bGwsIlx0XG5cciBcdTAwYTAiXV0sW1siY29tIiwvXiMhLiovXSxbImt3ZCIsL15cYig/OmltcG9ydHxsaWJyYXJ5fHBhcnQgb2Z8cGFydHxhc3xzaG93fGhpZGUpXGIvaV0sWyJjb20iLC9eXC9cLy4qL10sWyJjb20iLC9eXC9cKlteKl0qXCorKD86W14qL11bXipdKlwqKykqXC8vXSxbImt3ZCIsL15cYig/OmNsYXNzfGludGVyZmFjZSlcYi9pXSxbImt3ZCIsL15cYig/OmFzc2VydHxicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZG98ZWxzZXxmaW5hbGx5fGZvcnxpZnxpbnxpc3xuZXd8cmV0dXJufHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyeXx3aGlsZSlcYi9pXSxbImt3ZCIsL15cYig/OmFic3RyYWN0fGNvbnN0fGV4dGVuZHN8ZmFjdG9yeXxmaW5hbHxnZXR8aW1wbGVtZW50c3xuYXRpdmV8b3BlcmF0b3J8c2V0fHN0YXRpY3x0eXBlZGVmfHZhcilcYi9pXSwKK1sidHlwIiwvXlxiKD86Ym9vbHxkb3VibGV8ZHluYW1pY3xpbnR8bnVtfG9iamVjdHxzdHJpbmd8dm9pZClcYi9pXSxbImt3ZCIsL15cYig/OmZhbHNlfG51bGx8dHJ1ZSlcYi9pXSxbInN0ciIsL15yPycnJ1tcU1xzXSo/W15cXF0nJycvXSxbInN0ciIsL15yPyIiIltcU1xzXSo/W15cXF0iIiIvXSxbInN0ciIsL15yPycoJ3xbXlxuXGZccl0qP1teXFxdJykvXSxbInN0ciIsL15yPyIoInxbXlxuXGZccl0qP1teXFxdIikvXSxbInBsbiIsL15bJF9hLXpdXHcqL2ldLFsicHVuIiwvXlshJSYqKy86PC0/Xnx+LV0vXSxbImxpdCIsL15cYjB4W1xkYS1mXSsvaV0sWyJsaXQiLC9eXGJcZCsoPzpcLlxkKik/KD86ZVsrLV0/XGQrKT8vaV0sWyJsaXQiLC9eXGJcLlxkKyg/OmVbKy1dP1xkKyk/L2ldLFsicHVuIiwvXlsoKSwuO1tcXXt9XS9dXSksCitbImRhcnQiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWdvLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1nby5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FjYTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1nby5qcwpAQCAtMCwwICsxIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIFx1MDBhMCJdLFsicGxuIiwvXig/OiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkrKD86J3wkKXxgW15gXSooPzpgfCQpKS8sbnVsbCwiXCInIl1dLFtbImNvbSIsL14oPzpcL1wvW15cblxyXSp8XC9cKltcU1xzXSo/XCpcLykvXSxbInBsbiIsL14oPzpbXiInL2BdfFwvKD8hWyovXSkpKy9dXSksWyJnbyJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctaHMuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWhzLmpzCmluZGV4IDI3YjIyMWEuLmZmMzcyOWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctaHMuanMKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1ocy5qcwpAQCAtMSArMSwyIEBACi1QUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbUFIuUFJfUExBSU4sL15bXHRcblx4MEJceDBDXHIgXSsvLG51bGwsJwlcbgsMXHIgJ10sW1BSLlBSX1NUUklORywvXlwiKD86W15cIlxcXG5ceDBDXHJdfFxcW1xzXFNdKSooPzpcInwkKS8sbnVsbCwnXCInXSxbUFIuUFJfU1RSSU5HLC9eXCcoPzpbXlwnXFxcblx4MENccl18XFxbXiZdKVwnPy8sbnVsbCwnXCcnXSxbUFIuUFJfTElURVJBTCwvXig/OjBvWzAtN10rfDB4W1xkYS1mXSt8XGQrKD86XC5cZCspPyg/OmVbK1wtXT9cZCspPykvaSxudWxsLCcwMTIzNDU2Nzg5J11dLFtbUFIuUFJfQ09NTUVOVCwvXig/Oig/Oi0tKyg/OlteXHJcblx4MENdKik/KXwoPzpcey0oPzpbXi1dfC0rW14tXH1dKSotXH0pKS9dLFtQUi5QUl9LRVlXT1JELC9eKD86Y2FzZXxjbGFzc3xkYXRhfGRlZmF1bHR8ZGVyaXZpbmd8ZG98ZWxzZXxpZnxpbXBvcnR8aW58aW5maXh8aW5maXhsfGluZml4cnxpbnN0YW5jZXxsZXR8bW9kdWxlfG5ld3R5cGV8b2Z8dGhlbnx0eXBlfHdoZXJlfF8pKD89W15hLXpBLVowLTlcJ118JCkvLG51bGxdLFtQUi5QUl9QTEFJTiwvXig/OltBLVpdW1x3XCddKlwuKSpbYS16QS1aXVtcd1wnXSovXSxbUFIuUFJfUFVOQ1RVQVRJT04sL15bXlx0XG5ceDBCXHgwQ1xyIGEtekEtWjAtOVwnXCJdKy9dXSksWydocyddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdC1cciBdKy8sbnVsbCwiXHRcblx1MDAwYlx1MDAwY1xyICJdLFsic3RyIiwvXiIoPzpbXlxuXGZcciJcXF18XFxbXFNcc10pKig/OiJ8JCkvLG51bGwsJyInXSxbInN0ciIsL14nKD86W15cblxmXHInXFxdfFxcW14mXSknPy8sbnVsbCwiJyJdLFsibGl0IiwvXig/OjBvWzAtN10rfDB4W1xkYS1mXSt8XGQrKD86XC5cZCspPyg/OmVbKy1dP1xkKyk/KS9pLG51bGwsIjAxMjM0NTY3ODkiXV0sW1siY29tIiwvXig/Oi0tK1teXG5cZlxyXSp8ey0oPzpbXi1dfC0rW159LV0pKi19KS9dLFsia3dkIiwvXig/OmNhc2V8Y2xhc3N8ZGF0YXxkZWZhdWx0fGRlcml2aW5nfGRvfGVsc2V8aWZ8aW1wb3J0fGlufGluZml4fGluZml4bHxpbmZpeHJ8aW5zdGFuY2V8bGV0fG1vZHVsZXxuZXd0eXBlfG9mfHRoZW58dHlwZXx3aGVyZXxfKSg/PVteXGQnQS1aYS16XXwkKS8sCitudWxsXSxbInBsbiIsL14oPzpbQS1aXVtcdyddKlwuKSpbQS1aYS16XVtcdyddKi9dLFsicHVuIiwvXlteXGRcdC1cciAiJ0EtWmEtel0rL11dKSxbImhzIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1saXNwLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1saXNwLmpzCmluZGV4IDg1YzZjMjMuLjljOGNmYTUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbGlzcC5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLWxpc3AuanMKQEAgLTEgKzEsMyBAQAotUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbWydvcG4nLC9eXCgvLG51bGwsJygnXSxbJ2NsbycsL15cKS8sbnVsbCwnKSddLFtQUi5QUl9DT01NRU5ULC9eO1teXHJcbl0qLyxudWxsLCc7J10sW1BSLlBSX1BMQUlOLC9eW1x0XG5cciBceEEwXSsvLG51bGwsJwlcblxyIFx4YTAnXSxbUFIuUFJfU1RSSU5HLC9eXCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKS8sbnVsbCwnXCInXV0sW1tQUi5QUl9LRVlXT1JELC9eKD86YmxvY2t8Y1thZF0rcnxjYXRjaHxjb25zfGRlZnVufGRvfGVxfGVxbHxlcXVhbHxlcXVhbHB8ZXZhbC13aGVufGZsZXR8Zm9ybWF0fGdvfGlmfGxhYmVsc3xsYW1iZGF8bGV0fGxvYWQtdGltZS12YWx1ZXxsb2NhbGx5fG1hY3JvbGV0fG11bHRpcGxlLXZhbHVlLWNhbGx8bmlsfHByb2dufHByb2d2fHF1b3RlfHJlcXVpcmV8cmV0dXJuLWZyb218c2V0cXxzeW1ib2wtbWFjcm9sZXR8dHx0YWdib2R5fHRoZXx0aHJvd3x1bndpbmQpXGIvLG51bGxdLFtQUi5QUl9MSVRFUkFMLC9eWytcLV0/KD86MHhbMC05YS1mXSt8XGQrXC9cZCt8KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzpbZWRdWytcLV0/XGQrKT8pL2ldLFtQUi5QUl9MSVRFUkFMLC9eXCcoPzotKig/Olx3fFxcW1x4MjEtXHg3ZV0pKD86W1x3LV0qfFxcW1x4MjEtXHg3ZV0pWz0hP10/KT8vXSxbUFIuUFJfUExBSU4sL14tKig/OlthLXpfXXxcXFtceDIxLVx4N2VdKSg/Oltcdy1dKnxcXFtceDIxLVx4N2VdKVs9IT9dPy9pXSxbUFIuUFJfUFVOQ1RVQVRJT04sL15bXlx3XHRcblxyIFx4QTAoKVwiXFxcJztdKy9dXSksWydjbCcsJ2VsJywnbGlzcCcsJ3NjbSddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbIm9wbiIsL15cKCsvLGEsIigiXSxbImNsbyIsL15cKSsvLGEsIikiXSxbImNvbSIsL147W15cblxyXSovLGEsIjsiXSxbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sYSwiXHRcblxyIFx1MDBhMCJdLFsic3RyIiwvXiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCkvLGEsJyInXV0sW1sia3dkIiwvXig/OmJsb2NrfGNbYWRdK3J8Y2F0Y2h8Y29uW2RzXXxkZWYoPzppbmV8dW4pfGRvfGVxfGVxbHxlcXVhbHxlcXVhbHB8ZXZhbC13aGVufGZsZXR8Zm9ybWF0fGdvfGlmfGxhYmVsc3xsYW1iZGF8bGV0fGxvYWQtdGltZS12YWx1ZXxsb2NhbGx5fG1hY3JvbGV0fG11bHRpcGxlLXZhbHVlLWNhbGx8bmlsfHByb2dufHByb2d2fHF1b3RlfHJlcXVpcmV8cmV0dXJuLWZyb218c2V0cXxzeW1ib2wtbWFjcm9sZXR8dHx0YWdib2R5fHRoZXx0aHJvd3x1bndpbmQpXGIvLGFdLAorWyJsaXQiLC9eWystXT8oPzpbIzBdeFtcZGEtZl0rfFxkK1wvXGQrfCg/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86W2RlXVsrLV0/XGQrKT8pL2ldLFsibGl0IiwvXicoPzotKig/Olx3fFxcWyEtfl0pKD86W1x3LV0qfFxcWyEtfl0pWyE9P10/KT8vXSxbInBsbiIsL14tKig/OltfYS16XXxcXFshLX5dKSg/Oltcdy1dKnxcXFshLX5dKVshPT9dPy9pXSxbInB1biIsL15bXlx3XHRcblxyICInLSk7XFxceGEwXSsvXV0pLFsiY2wiLCJlbCIsImxpc3AiLCJsc3AiLCJzY20iLCJzcyIsInJrdCJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbHVhLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1sdWEuanMKaW5kZXggZDEwN2JhYi4uN2U0NGNjYSAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1sdWEuanMKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1sdWEuanMKQEAgLTEgKzEsMiBAQAotUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbW1BSLlBSX1BMQUlOLC9eW1x0XG5cciBceEEwXSsvLG51bGwsJwlcblxyIFx4YTAnXSxbUFIuUFJfU1RSSU5HLC9eKD86XCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKXxcJyg/OlteXCdcXF18XFxbXHNcU10pKig/OlwnfCQpKS8sbnVsbCwnXCJcJyddXSxbW1BSLlBSX0NPTU1FTlQsL14tLSg/OlxbKD0qKVxbW1xzXFNdKj8oPzpcXVwxXF18JCl8W15cclxuXSopL10sW1BSLlBSX1NUUklORywvXlxbKD0qKVxbW1xzXFNdKj8oPzpcXVwxXF18JCkvXSxbUFIuUFJfS0VZV09SRCwvXig/OmFuZHxicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8ZmFsc2V8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfG5pbHxub3R8b3J8cmVwZWF0fHJldHVybnx0aGVufHRydWV8dW50aWx8d2hpbGUpXGIvLG51bGxdLFtQUi5QUl9MSVRFUkFMLC9eWystXT8oPzoweFtcZGEtZl0rfCg/Oig/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrXC1dP1xkKyk/KSkvaV0sW1BSLlBSX1BMQUlOLC9eW2Etel9dXHcqL2ldLFtQUi5QUl9QVU5DVFVBVElPTiwvXlteXHdcdFxuXHIgXHhBMF1bXlx3XHRcblxyIFx4QTBcIlwnXC1cKz1dKi9dXSksWydsdWEnXSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIFx1MDBhMCJdLFsic3RyIiwvXig/OiIoPzpbXiJcXF18XFxbXFNcc10pKig/OiJ8JCl8Jyg/OlteJ1xcXXxcXFtcU1xzXSkqKD86J3wkKSkvLG51bGwsIlwiJyJdXSxbWyJjb20iLC9eLS0oPzpcWyg9KilcW1tcU1xzXSo/KD86XVwxXXwkKXxbXlxuXHJdKikvXSxbInN0ciIsL15cWyg9KilcW1tcU1xzXSo/KD86XVwxXXwkKS9dLFsia3dkIiwvXig/OmFuZHxicmVha3xkb3xlbHNlfGVsc2VpZnxlbmR8ZmFsc2V8Zm9yfGZ1bmN0aW9ufGlmfGlufGxvY2FsfG5pbHxub3R8b3J8cmVwZWF0fHJldHVybnx0aGVufHRydWV8dW50aWx8d2hpbGUpXGIvLG51bGxdLFsibGl0IiwvXlsrLV0/KD86MHhbXGRhLWZdK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbKy1dP1xkKyk/KS9pXSwKK1sicGxuIiwvXltfYS16XVx3Ki9pXSxbInB1biIsL15bXlx3XHRcblxyIFx4YTBdW15cd1x0XG5cciAiJys9XHhhMC1dKi9dXSksWyJsdWEiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLW1sLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1tbC5qcwppbmRleCA2OThkNmRlLi44ZWQyYjBjIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLW1sLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbWwuanMKQEAgLTEgKzEsMiBAQAotUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbW1BSLlBSX1BMQUlOLC9eW1x0XG5cciBceEEwXSsvLG51bGwsJwlcblxyIFx4YTAnXSxbUFIuUFJfQ09NTUVOVCwvXiMoPzppZltcdFxuXHIgXHhBMF0rKD86W2Etel8kXVtcd1wnXSp8YGBbXlxyXG5cdGBdKig/OmBgfCQpKXxlbHNlfGVuZGlmfGxpZ2h0KS9pLG51bGwsJyMnXSxbUFIuUFJfU1RSSU5HLC9eKD86XCIoPzpbXlwiXFxdfFxcW1xzXFNdKSooPzpcInwkKXxcJyg/OlteXCdcXF18XFxbXHNcU10pKig/OlwnfCQpKS8sbnVsbCwnXCJcJyddXSxbW1BSLlBSX0NPTU1FTlQsL14oPzpcL1wvW15cclxuXSp8XChcKltcc1xTXSo/XCpcKSkvXSxbUFIuUFJfS0VZV09SRCwvXig/OmFic3RyYWN0fGFuZHxhc3xhc3NlcnR8YmVnaW58Y2xhc3N8ZGVmYXVsdHxkZWxlZ2F0ZXxkb3xkb25lfGRvd25jYXN0fGRvd250b3xlbGlmfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm58ZmFsc2V8ZmluYWxseXxmb3J8ZnVufGZ1bmN0aW9ufGlmfGlufGluaGVyaXR8aW5saW5lfGludGVyZmFjZXxpbnRlcm5hbHxsYXp5fGxldHxtYXRjaHxtZW1iZXJ8bW9kdWxlfG11dGFibGV8bmFtZXNwYWNlfG5ld3xudWxsfG9mfG9wZW58b3J8b3ZlcnJpZGV8cHJpdmF0ZXxwdWJsaWN8cmVjfHJldHVybnxzdGF0aWN8c3RydWN0fHRoZW58dG98dHJ1ZXx0cnl8dHlwZXx1cGNhc3R8dXNlfHZhbHx2b2lkfHdoZW58d2hpbGV8d2l0aHx5aWVsZHxhc3J8bGFuZHxsb3J8bHNsfGxzcnxseG9yfG1vZHxzaWd8YXRvbWljfGJyZWFrfGNoZWNrZWR8Y29tcG9uZW50fGNvbnN0fGNvbnN0cmFpbnR8Y29uc3RydWN0b3J8Y29udGludWV8ZWFnZXJ8ZXZlbnR8ZXh0ZXJuYWx8Zml4ZWR8ZnVuY3RvcnxnbG9iYWx8aW5jbHVkZXxtZXRob2R8bWl4aW58b2JqZWN0fHBhcmFsbGVsfHByb2Nlc3N8cHJvdGVjdGVkfHB1cmV8c2VhbGVkfHRyYWl0fHZpcnR1YWx8dm9sYXRpbGUpXGIvXSxbUFIuUFJfTElURVJBTCwvXlsrXC1dPyg/OjB4W1xkYS1mXSt8KD86KD86XC5cZCt8XGQrKD86XC5cZCopPykoPzplWytcLV0/XGQrKT8pKS9pXSxbUFIuUFJfUExBSU4sL14oPzpbYS16X11cdypbIT8jXT98YGBbXlxyXG5cdGBdKig/OmBgfCQpKS9pXSxbUFIuUFJfUFVOQ1RVQVRJT04sL15bXlx0XG5cciBceEEwXCJcJ1x3XSsvXV0pLFsnZnMnLCdtbCddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgXHUwMGEwIl0sWyJjb20iLC9eIyg/OmlmW1x0XG5cciBceGEwXSsoPzpbJF9hLXpdW1x3J10qfGBgW15cdFxuXHJgXSooPzpgYHwkKSl8ZWxzZXxlbmRpZnxsaWdodCkvaSxudWxsLCIjIl0sWyJzdHIiLC9eKD86Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXwnKD86W14nXFxdfFxcW1xTXHNdKSg/Oid8JCkpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXig/OlwvXC9bXlxuXHJdKnxcKFwqW1xTXHNdKj9cKlwpKS9dLFsia3dkIiwvXig/OmFic3RyYWN0fGFuZHxhc3xhc3NlcnR8YmVnaW58Y2xhc3N8ZGVmYXVsdHxkZWxlZ2F0ZXxkb3xkb25lfGRvd25jYXN0fGRvd250b3xlbGlmfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm58ZmFsc2V8ZmluYWxseXxmb3J8ZnVufGZ1bmN0aW9ufGlmfGlufGluaGVyaXR8aW5saW5lfGludGVyZmFjZXxpbnRlcm5hbHxsYXp5fGxldHxtYXRjaHxtZW1iZXJ8bW9kdWxlfG11dGFibGV8bmFtZXNwYWNlfG5ld3xudWxsfG9mfG9wZW58b3J8b3ZlcnJpZGV8cHJpdmF0ZXxwdWJsaWN8cmVjfHJldHVybnxzdGF0aWN8c3RydWN0fHRoZW58dG98dHJ1ZXx0cnl8dHlwZXx1cGNhc3R8dXNlfHZhbHx2b2lkfHdoZW58d2hpbGV8d2l0aHx5aWVsZHxhc3J8bGFuZHxsb3J8bHNsfGxzcnxseG9yfG1vZHxzaWd8YXRvbWljfGJyZWFrfGNoZWNrZWR8Y29tcG9uZW50fGNvbnN0fGNvbnN0cmFpbnR8Y29uc3RydWN0b3J8Y29udGludWV8ZWFnZXJ8ZXZlbnR8ZXh0ZXJuYWx8Zml4ZWR8ZnVuY3RvcnxnbG9iYWx8aW5jbHVkZXxtZXRob2R8bWl4aW58b2JqZWN0fHBhcmFsbGVsfHByb2Nlc3N8cHJvdGVjdGVkfHB1cmV8c2VhbGVkfHRyYWl0fHZpcnR1YWx8dm9sYXRpbGUpXGIvXSwKK1sibGl0IiwvXlsrLV0/KD86MHhbXGRhLWZdK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbKy1dP1xkKyk/KS9pXSxbInBsbiIsL14oPzpbX2Etel1bXHcnXSpbISM/XT98YGBbXlx0XG5ccmBdKig/OmBgfCQpKS9pXSxbInB1biIsL15bXlx3XHRcblxyICInXHhhMF0rL11dKSxbImZzIiwibWwiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLW4uanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLW4uanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4MTJhNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctbi5qcwpAQCAtMCwwICsxLDQgQEAKK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInN0ciIsL14oPzonKD86W15cblxyJ1xcXXxcXC4pKid8Iig/OlteXG5cciJcXF18XFwuKSooPzoifCQpKS8sYSwnIiddLFsiY29tIiwvXiMoPzooPzpkZWZpbmV8ZWxpZnxlbHNlfGVuZGlmfGVycm9yfGlmZGVmfGluY2x1ZGV8aWZuZGVmfGxpbmV8cHJhZ21hfHVuZGVmfHdhcm5pbmcpXGJ8W15cblxyXSopLyxhLCIjIl0sWyJwbG4iLC9eXHMrLyxhLCIgXHJcblx0XHUwMGEwIl1dLFtbInN0ciIsL15AIig/OlteIl18IiIpKig/OiJ8JCkvLGFdLFsic3RyIiwvXjwjW14jPl0qKD86Iz58JCkvLGFdLFsic3RyIiwvXjwoPzooPzooPzpcLlwuXC8pKnxcLz8pKD86W1x3LV0rKD86XC9bXHctXSspKyk/W1x3LV0rXC5ofFthLXpdXHcqKT4vLGFdLFsiY29tIiwvXlwvXC9bXlxuXHJdKi8sYV0sWyJjb20iLC9eXC9cKltcU1xzXSo/KD86XCpcL3wkKS8sCithXSxbImt3ZCIsL14oPzphYnN0cmFjdHxhbmR8YXN8YmFzZXxjYXRjaHxjbGFzc3xkZWZ8ZGVsZWdhdGV8ZW51bXxldmVudHxleHRlcm58ZmFsc2V8ZmluYWxseXxmdW58aW1wbGVtZW50c3xpbnRlcmZhY2V8aW50ZXJuYWx8aXN8bWFjcm98bWF0Y2h8bWF0Y2hlc3xtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG51bGx8b3V0fG92ZXJyaWRlfHBhcmFtc3xwYXJ0aWFsfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZWZ8c2VhbGVkfHN0YXRpY3xzdHJ1Y3R8c3ludGF4fHRoaXN8dGhyb3d8dHJ1ZXx0cnl8dHlwZXx0eXBlb2Z8dXNpbmd8dmFyaWFudHx2aXJ0dWFsfHZvbGF0aWxlfHdoZW58d2hlcmV8d2l0aHxhc3NlcnR8YXNzZXJ0Mnxhc3luY3xicmVha3xjaGVja2VkfGNvbnRpbnVlfGRvfGVsc2V8ZW5zdXJlc3xmb3J8Zm9yZWFjaHxpZnxsYXRlfGxvY2t8bmV3fG5vbGF0ZXxvdGhlcndpc2V8cmVnZXhwfHJlcGVhdHxyZXF1aXJlc3xyZXR1cm58c3Vycm91bmR3aXRofHVuY2hlY2tlZHx1bmxlc3N8dXNpbmd8d2hpbGV8eWllbGQpXGIvLAorYV0sWyJ0eXAiLC9eKD86YXJyYXl8Ym9vbHxieXRlfGNoYXJ8ZGVjaW1hbHxkb3VibGV8ZmxvYXR8aW50fGxpc3R8bG9uZ3xvYmplY3R8c2J5dGV8c2hvcnR8c3RyaW5nfHVsb25nfHVpbnR8dWZsb2F0fHVsb25nfHVzaG9ydHx2b2lkKVxiLyxhXSxbImxpdCIsL15AWyRfYS16XVtcdyRAXSovaSxhXSxbInR5cCIsL15AW0EtWl0rW2Etel1bXHckQF0qLyxhXSxbInBsbiIsL14nP1skX2Etel1bXHckQF0qL2ksYV0sWyJsaXQiLC9eKD86MHhbXGRhLWZdK3woPzpcZCg/Ol9cZCspKlxkKig/OlwuXGQqKT98XC5cZFwrKSg/OmVbKy1dP1xkKyk/KVthLXpdKi9pLGEsIjAxMjM0NTY3ODkiXSxbInB1biIsL14uW15cc1x3Ii0kJy4vQGBdKi8sYV1dKSxbIm4iLCJuZW1lcmxlIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1wcm90by5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctcHJvdG8uanMKaW5kZXggZTY3OTY3Zi4uZjAwNmFkOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1wcm90by5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXByb3RvLmpzCkBAIC0xICsxIEBACi1QUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLnNvdXJjZURlY29yYXRvcih7a2V5d29yZHM6J2Jvb2wgYnl0ZXMgZGVmYXVsdCBkb3VibGUgZW51bSBleHRlbmQgZXh0ZW5zaW9ucyBmYWxzZSBmaXhlZDMyIGZpeGVkNjQgZmxvYXQgZ3JvdXAgaW1wb3J0IGludDMyIGludDY0IG1heCBtZXNzYWdlIG9wdGlvbiBvcHRpb25hbCBwYWNrYWdlIHJlcGVhdGVkIHJlcXVpcmVkIHJldHVybnMgcnBjIHNlcnZpY2Ugc2ZpeGVkMzIgc2ZpeGVkNjQgc2ludDMyIHNpbnQ2NCBzdHJpbmcgc3ludGF4IHRvIHRydWUgdWludDMyIHVpbnQ2NCcsY1N0eWxlQ29tbWVudHM6dHJ1ZX0pLFsncHJvdG8nXSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLnNvdXJjZURlY29yYXRvcih7a2V5d29yZHM6ImJ5dGVzLGRlZmF1bHQsZG91YmxlLGVudW0sZXh0ZW5kLGV4dGVuc2lvbnMsZmFsc2UsZ3JvdXAsaW1wb3J0LG1heCxtZXNzYWdlLG9wdGlvbixvcHRpb25hbCxwYWNrYWdlLHJlcGVhdGVkLHJlcXVpcmVkLHJldHVybnMscnBjLHNlcnZpY2Usc3ludGF4LHRvLHRydWUiLHR5cGVzOi9eKGJvb2x8KGRvdWJsZXxzP2ZpeGVkfFtzdV0/aW50KSgzMnw2NCl8ZmxvYXR8c3RyaW5nKVxiLyxjU3R5bGVDb21tZW50czohMH0pLFsicHJvdG8iXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXNjYWxhLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1zY2FsYS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk3ZGJhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1zY2FsYS5qcwpAQCAtMCwwICsxLDIgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgXHUwMGEwIl0sWyJzdHIiLC9eIig/OiIiKD86IiI/KD8hIil8W14iXFxdfFxcLikqInswLDN9fCg/OlteXG5cciJcXF18XFwuKSoiPykvLG51bGwsJyInXSxbImxpdCIsL15gKD86W15cblxyXFxgXXxcXC4pKmA/LyxudWxsLCJgIl0sWyJwdW4iLC9eWyEjJSYoLS06LUBbLV57LX5dKy8sbnVsbCwiISMlJigpKissLTo7PD0+P0BbXFxdXnt8fX4iXV0sW1sic3RyIiwvXicoPzpbXlxuXHInXFxdfFxcKD86J3xbXlxuXHInXSspKScvXSxbImxpdCIsL14nWyRBLVpfYS16XVtcdyRdKig/IVtcdyQnXSkvXSxbImt3ZCIsL14oPzphYnN0cmFjdHxjYXNlfGNhdGNofGNsYXNzfGRlZnxkb3xlbHNlfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmb3J8Zm9yU29tZXxpZnxpbXBsaWNpdHxpbXBvcnR8bGF6eXxtYXRjaHxuZXd8b2JqZWN0fG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cmVxdWlyZXN8cmV0dXJufHNlYWxlZHxzdXBlcnx0aHJvd3x0cmFpdHx0cnl8dHlwZXx2YWx8dmFyfHdoaWxlfHdpdGh8eWllbGQpXGIvXSwKK1sibGl0IiwvXig/OnRydWV8ZmFsc2V8bnVsbHx0aGlzKVxiL10sWyJsaXQiLC9eKD86MCg/OlswLTddK3x4W1xkYS1mXSspbD98KD86MHxbMS05XVxkKikoPzooPzpcLlxkKyk/KD86ZVsrLV0/XGQrKT9mP3xsPyl8XFwuXGQrKD86ZVsrLV0/XGQrKT9mPykvaV0sWyJ0eXAiLC9eWyRfXSpbQS1aXVtcZCRBLVpfXSpbYS16XVtcdyRdKi9dLFsicGxuIiwvXlskQS1aX2Etel1bXHckXSovXSxbImNvbSIsL15cLyg/OlwvLip8XCooPzpcL3xcKipbXiovXSkqKD86XCorXC8/KT8pL10sWyJwdW4iLC9eKD86XC4rfFwvKS9dXSksWyJzY2FsYSJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctc3FsLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy1zcWwuanMKaW5kZXggZmYzODFjZDQuLjJmZGRkM2UgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctc3FsLmpzCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctc3FsLmpzCkBAIC0xICsxLDIgQEAKLVBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1tQUi5QUl9QTEFJTiwvXltcdFxuXHIgXHhBMF0rLyxudWxsLCcJXG5cciBceGEwJ10sW1BSLlBSX1NUUklORywvXig/OiIoPzpbXlwiXFxdfFxcLikqInwnKD86W15cJ1xcXXxcXC4pKicpLyxudWxsLCdcIlwnJ11dLFtbUFIuUFJfQ09NTUVOVCwvXig/Oi0tW15cclxuXSp8XC9cKltcc1xTXSo/KD86XCpcL3wkKSkvXSxbUFIuUFJfS0VZV09SRCwvXig/OkFERHxBTEx8QUxURVJ8QU5EfEFOWXxBU3xBU0N8QVVUSE9SSVpBVElPTnxCQUNLVVB8QkVHSU58QkVUV0VFTnxCUkVBS3xCUk9XU0V8QlVMS3xCWXxDQVNDQURFfENBU0V8Q0hFQ0t8Q0hFQ0tQT0lOVHxDTE9TRXxDTFVTVEVSRUR8Q09BTEVTQ0V8Q09MTEFURXxDT0xVTU58Q09NTUlUfENPTVBVVEV8Q09OU1RSQUlOVHxDT05UQUlOU3xDT05UQUlOU1RBQkxFfENPTlRJTlVFfENPTlZFUlR8Q1JFQVRFfENST1NTfENVUlJFTlR8Q1VSUkVOVF9EQVRFfENVUlJFTlRfVElNRXxDVVJSRU5UX1RJTUVTVEFNUHxDVVJSRU5UX1VTRVJ8Q1VSU09SfERBVEFCQVNFfERCQ0N8REVBTExPQ0FURXxERUNMQVJFfERFRkFVTFR8REVMRVRFfERFTll8REVTQ3xESVNLfERJU1RJTkNUfERJU1RSSUJVVEVEfERPVUJMRXxEUk9QfERVTU1ZfERVTVB8RUxTRXxFTkR8RVJSTFZMfEVTQ0FQRXxFWENFUFR8RVhFQ3xFWEVDVVRFfEVYSVNUU3xFWElUfEZFVENIfEZJTEV8RklMTEZBQ1RPUnxGT1J8Rk9SRUlHTnxGUkVFVEVYVHxGUkVFVEVYVFRBQkxFfEZST018RlVMTHxGVU5DVElPTnxHT1RPfEdSQU5UfEdST1VQfEhBVklOR3xIT0xETE9DS3xJREVOVElUWXxJREVOVElUWUNPTHxJREVOVElUWV9JTlNFUlR8SUZ8SU58SU5ERVh8SU5ORVJ8SU5TRVJUfElOVEVSU0VDVHxJTlRPfElTfEpPSU58S0VZfEtJTEx8TEVGVHxMSUtFfExJTkVOT3xMT0FEfE5BVElPTkFMfE5PQ0hFQ0t8Tk9OQ0xVU1RFUkVEfE5PVHxOVUxMfE5VTExJRnxPRnxPRkZ8T0ZGU0VUU3xPTnxPUEVOfE9QRU5EQVRBU09VUkNFfE9QRU5RVUVSWXxPUEVOUk9XU0VUfE9QRU5YTUx8T1BUSU9OfE9SfE9SREVSfE9VVEVSfE9WRVJ8UEVSQ0VOVHxQTEFOfFBSRUNJU0lPTnxQUklNQVJZfFBSSU5UfFBST0N8UFJPQ0VEVVJFfFBVQkxJQ3xSQUlTRVJST1J8UkVBRHxSRUFEVEVYVHxSRUNPTkZJR1VSRXxSRUZFUkVOQ0VTfFJFUExJQ0FUSU9OfFJFU1RPUkV8UkVTVFJJQ1R8UkVUVVJOfFJFVk9LRXxSSUdIVHxST0xMQkFDS3xST1dDT1VOVHxST1dHVUlEQ09MfFJVTEV8U0FWRXxTQ0hFTUF8U0VMRUNUfFNFU1NJT05fVVNFUnxTRVR8U0VUVVNFUnxTSFVURE9XTnxTT01FfFNUQVRJU1RJQ1N8U1lTVEVNX1VTRVJ8VEFCTEV8VEVYVFNJWkV8VEhFTnxUT3xUT1B8VFJBTnxUUkFOU0FDVElPTnxUUklHR0VSfFRSVU5DQVRFfFRTRVFVQUx8VU5JT058VU5JUVVFfFVQREFURXxVUERBVEVURVhUfFVTRXxVU0VSfFZBTFVFU3xWQVJZSU5HfFZJRVd8V0FJVEZPUnxXSEVOfFdIRVJFfFdISUxFfFdJVEh8V1JJVEVURVhUKSg/PVteXHctXXwkKS9pLG51bGxdLFtQUi5QUl9MSVRFUkFMLC9eWystXT8oPzoweFtcZGEtZl0rfCg/Oig/OlwuXGQrfFxkKyg/OlwuXGQqKT8pKD86ZVsrXC1dP1xkKyk/KSkvaV0sW1BSLlBSX1BMQUlOLC9eW2Etel9dW1x3LV0qL2ldLFtQUi5QUl9QVU5DVFVBVElPTiwvXlteXHdcdFxuXHIgXHhBMFwiXCddW15cd1x0XG5cciBceEEwK1wtXCJcJ10qL11dKSxbJ3NxbCddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgXHUwMGEwIl0sWyJzdHIiLC9eKD86Iig/OlteIlxcXXxcXC4pKiJ8Jyg/OlteJ1xcXXxcXC4pKicpLyxudWxsLCJcIiciXV0sW1siY29tIiwvXig/Oi0tW15cblxyXSp8XC9cKltcU1xzXSo/KD86XCpcL3wkKSkvXSxbImt3ZCIsL14oPzphZGR8YWxsfGFsdGVyfGFuZHxhbnl8YXBwbHl8YXN8YXNjfGF1dGhvcml6YXRpb258YmFja3VwfGJlZ2lufGJldHdlZW58YnJlYWt8YnJvd3NlfGJ1bGt8Ynl8Y2FzY2FkZXxjYXNlfGNoZWNrfGNoZWNrcG9pbnR8Y2xvc2V8Y2x1c3RlcmVkfGNvYWxlc2NlfGNvbGxhdGV8Y29sdW1ufGNvbW1pdHxjb21wdXRlfGNvbnN0cmFpbnR8Y29udGFpbnN8Y29udGFpbnN0YWJsZXxjb250aW51ZXxjb252ZXJ0fGNyZWF0ZXxjcm9zc3xjdXJyZW50fGN1cnJlbnRfZGF0ZXxjdXJyZW50X3RpbWV8Y3VycmVudF90aW1lc3RhbXB8Y3VycmVudF91c2VyfGN1cnNvcnxkYXRhYmFzZXxkYmNjfGRlYWxsb2NhdGV8ZGVjbGFyZXxkZWZhdWx0fGRlbGV0ZXxkZW55fGRlc2N8ZGlza3xkaXN0aW5jdHxkaXN0cmlidXRlZHxkb3VibGV8ZHJvcHxkdW1teXxkdW1wfGVsc2V8ZW5kfGVycmx2bHxlc2NhcGV8ZXhjZXB0fGV4ZWN8ZXhlY3V0ZXxleGlzdHN8ZXhpdHxmZXRjaHxmaWxlfGZpbGxmYWN0b3J8Zm9sbG93aW5nfGZvcnxmb3JlaWdufGZyZWV0ZXh0fGZyZWV0ZXh0dGFibGV8ZnJvbXxmdWxsfGZ1bmN0aW9ufGdvdG98Z3JhbnR8Z3JvdXB8aGF2aW5nfGhvbGRsb2NrfGlkZW50aXR5fGlkZW50aXR5Y29sfGlkZW50aXR5X2luc2VydHxpZnxpbnxpbmRleHxpbm5lcnxpbnNlcnR8aW50ZXJzZWN0fGludG98aXN8am9pbnxrZXl8a2lsbHxsZWZ0fGxpa2V8bGluZW5vfGxvYWR8bWF0Y2h8bWVyZ2V8bmF0aW9uYWx8bm9jaGVja3xub25jbHVzdGVyZWR8bm90fG51bGx8bnVsbGlmfG9mfG9mZnxvZmZzZXRzfG9ufG9wZW58b3BlbmRhdGFzb3VyY2V8b3BlbnF1ZXJ5fG9wZW5yb3dzZXR8b3BlbnhtbHxvcHRpb258b3J8b3JkZXJ8b3V0ZXJ8b3ZlcnxwZXJjZW50fHBsYW58cHJlY2VkaW5nfHByZWNpc2lvbnxwcmltYXJ5fHByaW50fHByb2N8cHJvY2VkdXJlfHB1YmxpY3xyYWlzZXJyb3J8cmVhZHxyZWFkdGV4dHxyZWNvbmZpZ3VyZXxyZWZlcmVuY2VzfHJlcGxpY2F0aW9ufHJlc3RvcmV8cmVzdHJpY3R8cmV0dXJufHJldm9rZXxyaWdodHxyb2xsYmFja3xyb3djb3VudHxyb3dndWlkY29sfHJvd3M/fHJ1bGV8c2F2ZXxzY2hlbWF8c2VsZWN0fHNlc3Npb25fdXNlcnxzZXR8c2V0dXNlcnxzaHV0ZG93bnxzb21lfHN0YXRpc3RpY3N8c3lzdGVtX3VzZXJ8dGFibGV8dGV4dHNpemV8dGhlbnx0b3x0b3B8dHJhbnx0cmFuc2FjdGlvbnx0cmlnZ2VyfHRydW5jYXRlfHRzZXF1YWx8dW5ib3VuZGVkfHVuaW9ufHVuaXF1ZXx1cGRhdGV8dXBkYXRldGV4dHx1c2V8dXNlcnx1c2luZ3x2YWx1ZXN8dmFyeWluZ3x2aWV3fHdhaXRmb3J8d2hlbnx3aGVyZXx3aGlsZXx3aXRofHdyaXRldGV4dCkoPz1bXlx3LV18JCkvaSwKK251bGxdLFsibGl0IiwvXlsrLV0/KD86MHhbXGRhLWZdK3woPzpcLlxkK3xcZCsoPzpcLlxkKik/KSg/OmVbKy1dP1xkKyk/KS9pXSxbInBsbiIsL15bX2Etel1bXHctXSovaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJ1x4YTBdW15cd1x0XG5cciAiJytceGEwLV0qL11dKSxbInNxbCJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctdGV4LmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy10ZXguanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmZGFkZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctdGV4LmpzCkBAIC0wLDAgKzEgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMF0rLyxudWxsLCJcdFxuXHIgXHUwMGEwIl0sWyJjb20iLC9eJVteXG5ccl0qLyxudWxsLCIlIl1dLFtbImt3ZCIsL15cXFtALVphLXpdKy9dLFsia3dkIiwvXlxcLi9dLFsidHlwIiwvXlskJl0vXSxbImxpdCIsL1srLV0/KD86XC5cZCt8XGQrKD86XC5cZCopPykoY218ZW18ZXh8aW58cGN8cHR8YnB8bW0pL2ldLFsicHVuIiwvXlsoKT1bXF17fV0rL11dKSxbImxhdGV4IiwidGV4Il0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy12Yi5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctdmIuanMKaW5kZXggY2FiY2U4NS4uYjE1MWI3YyAxMDA2NDQKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy12Yi5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXZiLmpzCkBAIC0xICsxLDIgQEAKLVBSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1tQUi5QUl9QTEFJTiwvXltcdFxuXHIgXHhBMFx1MjAyOFx1MjAyOV0rLyxudWxsLCcJXG5cciBceGEwXHUyMDI4XHUyMDI5J10sW1BSLlBSX1NUUklORywvXig/OltcIlx1MjAxQ1x1MjAxRF0oPzpbXlwiXHUyMDFDXHUyMDFEXXxbXCJcdTIwMUNcdTIwMURdezJ9KSg/OltcIlx1MjAxQ1x1MjAxRF1jfCQpfFtcIlx1MjAxQ1x1MjAxRF0oPzpbXlwiXHUyMDFDXHUyMDFEXXxbXCJcdTIwMUNcdTIwMURdezJ9KSooPzpbXCJcdTIwMUNcdTIwMURdfCQpKS9pLG51bGwsJ1wiXHUyMDFjXHUyMDFkJ10sW1BSLlBSX0NPTU1FTlQsL15bXCdcdTIwMThcdTIwMTldW15cclxuXHUyMDI4XHUyMDI5XSovLG51bGwsJ1wnXHUyMDE4XHUyMDE5J11dLFtbUFIuUFJfS0VZV09SRCwvXig/OkFkZEhhbmRsZXJ8QWRkcmVzc09mfEFsaWFzfEFuZHxBbmRBbHNvfEFuc2l8QXN8QXNzZW1ibHl8QXV0b3xCb29sZWFufEJ5UmVmfEJ5dGV8QnlWYWx8Q2FsbHxDYXNlfENhdGNofENCb29sfENCeXRlfENDaGFyfENEYXRlfENEYmx8Q0RlY3xDaGFyfENJbnR8Q2xhc3N8Q0xuZ3xDT2JqfENvbnN0fENTaG9ydHxDU25nfENTdHJ8Q1R5cGV8RGF0ZXxEZWNpbWFsfERlY2xhcmV8RGVmYXVsdHxEZWxlZ2F0ZXxEaW18RGlyZWN0Q2FzdHxEb3xEb3VibGV8RWFjaHxFbHNlfEVsc2VJZnxFbmR8RW5kSWZ8RW51bXxFcmFzZXxFcnJvcnxFdmVudHxFeGl0fEZpbmFsbHl8Rm9yfEZyaWVuZHxGdW5jdGlvbnxHZXR8R2V0VHlwZXxHb1N1YnxHb1RvfEhhbmRsZXN8SWZ8SW1wbGVtZW50c3xJbXBvcnRzfElufEluaGVyaXRzfEludGVnZXJ8SW50ZXJmYWNlfElzfExldHxMaWJ8TGlrZXxMb25nfExvb3B8TWV8TW9kfE1vZHVsZXxNdXN0SW5oZXJpdHxNdXN0T3ZlcnJpZGV8TXlCYXNlfE15Q2xhc3N8TmFtZXNwYWNlfE5ld3xOZXh0fE5vdHxOb3RJbmhlcml0YWJsZXxOb3RPdmVycmlkYWJsZXxPYmplY3R8T258T3B0aW9ufE9wdGlvbmFsfE9yfE9yRWxzZXxPdmVybG9hZHN8T3ZlcnJpZGFibGV8T3ZlcnJpZGVzfFBhcmFtQXJyYXl8UHJlc2VydmV8UHJpdmF0ZXxQcm9wZXJ0eXxQcm90ZWN0ZWR8UHVibGljfFJhaXNlRXZlbnR8UmVhZE9ubHl8UmVEaW18UmVtb3ZlSGFuZGxlcnxSZXN1bWV8UmV0dXJufFNlbGVjdHxTZXR8U2hhZG93c3xTaGFyZWR8U2hvcnR8U2luZ2xlfFN0YXRpY3xTdGVwfFN0b3B8U3RyaW5nfFN0cnVjdHVyZXxTdWJ8U3luY0xvY2t8VGhlbnxUaHJvd3xUb3xUcnl8VHlwZU9mfFVuaWNvZGV8VW50aWx8VmFyaWFudHxXZW5kfFdoZW58V2hpbGV8V2l0aHxXaXRoRXZlbnRzfFdyaXRlT25seXxYb3J8RW5kSWZ8R29TdWJ8TGV0fFZhcmlhbnR8V2VuZClcYi9pLG51bGxdLFtQUi5QUl9DT01NRU5ULC9eUkVNW15cclxuXHUyMDI4XHUyMDI5XSovaV0sW1BSLlBSX0xJVEVSQUwsL14oPzpUcnVlXGJ8RmFsc2VcYnxOb3RoaW5nXGJ8XGQrKD86RVsrXC1dP1xkK1tGUkRdP3xbRlJEU0lMXSk/fCg/OiZIWzAtOUEtRl0rfCZPWzAtN10rKVtTSUxdP3xcZCpcLlxkKyg/OkVbK1wtXT9cZCspP1tGUkRdP3wjXHMrKD86XGQrW1wtXC9dXGQrW1wtXC9dXGQrKD86XHMrXGQrOlxkKyg/OjpcZCspPyhccyooPzpBTXxQTSkpPyk/fFxkKzpcZCsoPzo6XGQrKT8oXHMqKD86QU18UE0pKT8pXHMrIykvaV0sW1BSLlBSX1BMQUlOLC9eKD86KD86W2Etel18X1x3KVx3KnxcWyg/OlthLXpdfF9cdylcdypcXSkvaV0sW1BSLlBSX1BVTkNUVUFUSU9OLC9eW15cd1x0XG5cciBcIlwnXFtcXVx4QTBcdTIwMThcdTIwMTlcdTIwMUNcdTIwMURcdTIwMjhcdTIwMjldKy9dLFtQUi5QUl9QVU5DVFVBVElPTiwvXig/OlxbfFxdKS9dXSksWyd2YicsJ3ZicyddKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sicGxuIiwvXltcdFxuXHIgXHhhMFx1MjAyOFx1MjAyOV0rLyxudWxsLCJcdFxuXHIgXHUwMGEwXHUyMDI4XHUyMDI5Il0sWyJzdHIiLC9eKD86WyJcdTIwMWNcdTIwMWRdKD86W14iXHUyMDFjXHUyMDFkXXxbIlx1MjAxY1x1MjAxZF17Mn0pKD86WyJcdTIwMWNcdTIwMWRdY3wkKXxbIlx1MjAxY1x1MjAxZF0oPzpbXiJcdTIwMWNcdTIwMWRdfFsiXHUyMDFjXHUyMDFkXXsyfSkqKD86WyJcdTIwMWNcdTIwMWRdfCQpKS9pLG51bGwsJyJcdTIwMWNcdTIwMWQnXSxbImNvbSIsL15bJ1x1MjAxOFx1MjAxOV0oPzpfKD86XHJcbj98W15ccl0/KXxbXlxuXHJfXHUyMDI4XHUyMDI5XSkqLyxudWxsLCInXHUyMDE4XHUyMDE5Il1dLFtbImt3ZCIsL14oPzphZGRoYW5kbGVyfGFkZHJlc3NvZnxhbGlhc3xhbmR8YW5kYWxzb3xhbnNpfGFzfGFzc2VtYmx5fGF1dG98Ym9vbGVhbnxieXJlZnxieXRlfGJ5dmFsfGNhbGx8Y2FzZXxjYXRjaHxjYm9vbHxjYnl0ZXxjY2hhcnxjZGF0ZXxjZGJsfGNkZWN8Y2hhcnxjaW50fGNsYXNzfGNsbmd8Y29ianxjb25zdHxjc2hvcnR8Y3NuZ3xjc3RyfGN0eXBlfGRhdGV8ZGVjaW1hbHxkZWNsYXJlfGRlZmF1bHR8ZGVsZWdhdGV8ZGltfGRpcmVjdGNhc3R8ZG98ZG91YmxlfGVhY2h8ZWxzZXxlbHNlaWZ8ZW5kfGVuZGlmfGVudW18ZXJhc2V8ZXJyb3J8ZXZlbnR8ZXhpdHxmaW5hbGx5fGZvcnxmcmllbmR8ZnVuY3Rpb258Z2V0fGdldHR5cGV8Z29zdWJ8Z290b3xoYW5kbGVzfGlmfGltcGxlbWVudHN8aW1wb3J0c3xpbnxpbmhlcml0c3xpbnRlZ2VyfGludGVyZmFjZXxpc3xsZXR8bGlifGxpa2V8bG9uZ3xsb29wfG1lfG1vZHxtb2R1bGV8bXVzdGluaGVyaXR8bXVzdG92ZXJyaWRlfG15YmFzZXxteWNsYXNzfG5hbWVzcGFjZXxuZXd8bmV4dHxub3R8bm90aW5oZXJpdGFibGV8bm90b3ZlcnJpZGFibGV8b2JqZWN0fG9ufG9wdGlvbnxvcHRpb25hbHxvcnxvcmVsc2V8b3ZlcmxvYWRzfG92ZXJyaWRhYmxlfG92ZXJyaWRlc3xwYXJhbWFycmF5fHByZXNlcnZlfHByaXZhdGV8cHJvcGVydHl8cHJvdGVjdGVkfHB1YmxpY3xyYWlzZWV2ZW50fHJlYWRvbmx5fHJlZGltfHJlbW92ZWhhbmRsZXJ8cmVzdW1lfHJldHVybnxzZWxlY3R8c2V0fHNoYWRvd3N8c2hhcmVkfHNob3J0fHNpbmdsZXxzdGF0aWN8c3RlcHxzdG9wfHN0cmluZ3xzdHJ1Y3R1cmV8c3VifHN5bmNsb2NrfHRoZW58dGhyb3d8dG98dHJ5fHR5cGVvZnx1bmljb2RlfHVudGlsfHZhcmlhbnR8d2VuZHx3aGVufHdoaWxlfHdpdGh8d2l0aGV2ZW50c3x3cml0ZW9ubHl8eG9yfGVuZGlmfGdvc3VifGxldHx2YXJpYW50fHdlbmQpXGIvaSwKK251bGxdLFsiY29tIiwvXnJlbS4qL2ldLFsibGl0IiwvXig/OnRydWVcYnxmYWxzZVxifG5vdGhpbmdcYnxcZCsoPzplWystXT9cZCtbZGZyXT98W2RmaWxyc10pP3woPzomaFtcZGEtZl0rfCZvWzAtN10rKVtpbHNdP3xcZCpcLlxkKyg/OmVbKy1dP1xkKyk/W2Rmcl0/fCNccysoPzpcZCtbLy1dXGQrWy8tXVxkKyg/OlxzK1xkKzpcZCsoPzo6XGQrKT8oXHMqKD86YW18cG0pKT8pP3xcZCs6XGQrKD86OlxkKyk/KFxzKig/OmFtfHBtKSk/KVxzKyMpL2ldLFsicGxuIiwvXig/Oig/OlthLXpdfF9cdylcdyp8XFsoPzpbYS16XXxfXHcpXHcqXSkvaV0sWyJwdW4iLC9eW15cd1x0XG5cciAiJ1tcXVx4YTBcdTIwMThcdTIwMTlcdTIwMWNcdTIwMWRcdTIwMjhcdTIwMjldKy9dLFsicHVuIiwvXig/OlxbfF0pL11dKSxbInZiIiwidmJzIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy12aGRsLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy12aGRsLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjMwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXZoZGwuanMKQEAgLTAsMCArMSwzIEBACitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXHRcblxyIFx4YTBdKy8sbnVsbCwiXHRcblxyIFx1MDBhMCJdXSxbWyJzdHIiLC9eKD86W2JveF0/Iig/OlteIl18IiIpKiJ8Jy4nKS9pXSxbImNvbSIsL14tLVteXG5ccl0qL10sWyJrd2QiLC9eKD86YWJzfGFjY2Vzc3xhZnRlcnxhbGlhc3xhbGx8YW5kfGFyY2hpdGVjdHVyZXxhcnJheXxhc3NlcnR8YXR0cmlidXRlfGJlZ2lufGJsb2NrfGJvZHl8YnVmZmVyfGJ1c3xjYXNlfGNvbXBvbmVudHxjb25maWd1cmF0aW9ufGNvbnN0YW50fGRpc2Nvbm5lY3R8ZG93bnRvfGVsc2V8ZWxzaWZ8ZW5kfGVudGl0eXxleGl0fGZpbGV8Zm9yfGZ1bmN0aW9ufGdlbmVyYXRlfGdlbmVyaWN8Z3JvdXB8Z3VhcmRlZHxpZnxpbXB1cmV8aW58aW5lcnRpYWx8aW5vdXR8aXN8bGFiZWx8bGlicmFyeXxsaW5rYWdlfGxpdGVyYWx8bG9vcHxtYXB8bW9kfG5hbmR8bmV3fG5leHR8bm9yfG5vdHxudWxsfG9mfG9ufG9wZW58b3J8b3RoZXJzfG91dHxwYWNrYWdlfHBvcnR8cG9zdHBvbmVkfHByb2NlZHVyZXxwcm9jZXNzfHB1cmV8cmFuZ2V8cmVjb3JkfHJlZ2lzdGVyfHJlamVjdHxyZW18cmVwb3J0fHJldHVybnxyb2x8cm9yfHNlbGVjdHxzZXZlcml0eXxzaGFyZWR8c2lnbmFsfHNsYXxzbGx8c3JhfHNybHxzdWJ0eXBlfHRoZW58dG98dHJhbnNwb3J0fHR5cGV8dW5hZmZlY3RlZHx1bml0c3x1bnRpbHx1c2V8dmFyaWFibGV8d2FpdHx3aGVufHdoaWxlfHdpdGh8eG5vcnx4b3IpKD89W15cdy1dfCQpL2ksCitudWxsXSxbInR5cCIsL14oPzpiaXR8Yml0X3ZlY3RvcnxjaGFyYWN0ZXJ8Ym9vbGVhbnxpbnRlZ2VyfHJlYWx8dGltZXxzdHJpbmd8c2V2ZXJpdHlfbGV2ZWx8cG9zaXRpdmV8bmF0dXJhbHxzaWduZWR8dW5zaWduZWR8bGluZXx0ZXh0fHN0ZF91P2xvZ2ljKD86X3ZlY3Rvcik/KSg/PVteXHctXXwkKS9pLG51bGxdLFsidHlwIiwvXicoPzphY3RpdmV8YXNjZW5kaW5nfGJhc2V8ZGVsYXllZHxkcml2aW5nfGRyaXZpbmdfdmFsdWV8ZXZlbnR8aGlnaHxpbWFnZXxpbnN0YW5jZV9uYW1lfGxhc3RfYWN0aXZlfGxhc3RfZXZlbnR8bGFzdF92YWx1ZXxsZWZ0fGxlZnRvZnxsZW5ndGh8bG93fHBhdGhfbmFtZXxwb3N8cHJlZHxxdWlldHxyYW5nZXxyZXZlcnNlX3JhbmdlfHJpZ2h0fHJpZ2h0b2Z8c2ltcGxlX25hbWV8c3RhYmxlfHN1Y2N8dHJhbnNhY3Rpb258dmFsfHZhbHVlKSg/PVteXHctXXwkKS9pLG51bGxdLFsibGl0IiwvXlxkKyg/Ol9cZCspKig/OiNbXHcuXFxdKyMoPzpbKy1dP1xkKyg/Ol9cZCspKik/fCg/OlwuXGQrKD86X1xkKykqKT8oPzplWystXT9cZCsoPzpfXGQrKSopPykvaV0sCitbInBsbiIsL14oPzpbYS16XVx3KnxcXFteXFxdKlxcKS9pXSxbInB1biIsL15bXlx3XHRcblxyICInXHhhMF1bXlx3XHRcblxyICInXHhhMC1dKi9dXSksWyJ2aGRsIiwidmhkIl0pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy13aWtpLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy13aWtpLmpzCmluZGV4IDAwYTFiNmIuLjk2YzFlMzQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmctd2lraS5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXdpa2kuanMKQEAgLTEgKzEsMiBAQAotUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbW1BSLlBSX1BMQUlOLC9eW1x0IFx4QTBhLWdpLXowLTldKy8sbnVsbCwnCSBceGEwYWJjZGVmZ2lqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknXSxbUFIuUFJfUFVOQ1RVQVRJT04sL15bPSp+XF5cW1xdXSsvLG51bGwsJz0qfl5bXSddXSxbWydsYW5nLXdpa2kubWV0YScsLyg/Ol5efFxyXG4/fFxuKSgjW2Etel0rKVxiL10sW1BSLlBSX0xJVEVSQUwsL14oPzpbQS1aXVthLXpdW2EtejAtOV0rW0EtWl1bYS16XVthLXpBLVowLTldKylcYi9dLFsnbGFuZy0nLC9eXHtce1x7KFtcc1xTXSs/KVx9XH1cfS9dLFsnbGFuZy0nLC9eYChbXlxyXG5gXSspYC9dLFtQUi5QUl9TVFJJTkcsL15odHRwcz86XC9cL1teXC8/I1xzXSooPzpcL1tePyNcc10qKT8oPzpcP1teI1xzXSopPyg/OiNcUyopPy9pXSxbUFIuUFJfUExBSU4sL14oPzpcclxufFtcc1xTXSlbXiM9Kn5eQS1aaFx7YFxbXHJcbl0qL11dKSxbJ3dpa2knXSksUFIucmVnaXN0ZXJMYW5nSGFuZGxlcihQUi5jcmVhdGVTaW1wbGVMZXhlcihbW1BSLlBSX0tFWVdPUkQsL14jW2Etel0rL2ksbnVsbCwnIyddXSxbXSksWyd3aWtpLm1ldGEnXSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInBsbiIsL15bXGRcdCBhLWdpLXpceGEwXSsvLG51bGwsIlx0IFx1MDBhMGFiY2RlZmdpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Il0sWyJwdW4iLC9eWyo9W1xdXn5dKy8sbnVsbCwiPSp+XltdIl1dLFtbImxhbmctd2lraS5tZXRhIiwvKD86Xl58XHJcbj98XG4pKCNbYS16XSspXGIvXSxbImxpdCIsL15bQS1aXVthLXpdW1xkYS16XStbQS1aXVthLXpdW15cV19dK1xiL10sWyJsYW5nLSIsL157e3soW1xTXHNdKz8pfX19L10sWyJsYW5nLSIsL15gKFteXG5ccmBdKylgL10sWyJzdHIiLC9eaHR0cHM/OlwvXC9bXlxzIy8/XSooPzpcL1teXHMjP10qKT8oPzpcP1teXHMjXSopPyg/OiNcUyopPy9pXSxbInBsbiIsL14oPzpcclxufFtcU1xzXSlbXlxuXHIjKj1BLVteYGh7fl0qL11dKSxbIndpa2kiXSk7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbImt3ZCIsL14jW2Etel0rL2ksbnVsbCwiIyJdXSxbXSksWyJ3aWtpLm1ldGEiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXhxLmpzIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy14cS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzIzYWUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvbGFuZy14cS5qcwpAQCAtMCwwICsxLDMgQEAKK1BSLnJlZ2lzdGVyTGFuZ0hhbmRsZXIoUFIuY3JlYXRlU2ltcGxlTGV4ZXIoW1sidmFyIHBsbiIsL15cJFtcdy1dKy8sbnVsbCwiJCJdXSxbWyJwbG4iLC9eW1xzPV1bPD5dW1xzPV0vXSxbImxpdCIsL15AW1x3LV0rL10sWyJ0YWciLC9ePFwvP1thLXpdKD86W1x3LS46XSpcdyk/fFwvPz4kL2ldLFsiY29tIiwvXlwoOltcU1xzXSo/OlwpL10sWyJwbG4iLC9eWygpLC87W1xde31dJC9dLFsic3RyIiwvXig/OiIoPzpbXiJcXHtdfFxcW1xTXHNdKSooPzoifCQpfCcoPzpbXidcXHtdfFxcW1xTXHNdKSooPzonfCQpKS8sbnVsbCwiXCInIl0sWyJrd2QiLC9eKD86eHF1ZXJ5fHdoZXJlfHZlcnNpb258dmFyaWFibGV8dW5pb258dHlwZXN3aXRjaHx0cmVhdHx0b3x0aGVufHRleHR8c3RhYmxlfHNvcnRieXxzb21lfHNlbGZ8c2NoZW1hfHNhdGlzZmllc3xyZXR1cm5zfHJldHVybnxyZWZ8cHJvY2Vzc2luZy1pbnN0cnVjdGlvbnxwcmVjZWRpbmctc2libGluZ3xwcmVjZWRpbmd8cHJlY2VkZXN8cGFyZW50fG9ubHl8b2Z8bm9kZXxuYW1lc3BhY2V8bW9kdWxlfGxldHxpdGVtfGludGVyc2VjdHxpbnN0YW5jZXxpbnxpbXBvcnR8aWZ8ZnVuY3Rpb258Zm9yfGZvbGxvd3N8Zm9sbG93aW5nLXNpYmxpbmd8Zm9sbG93aW5nfGV4dGVybmFsfGV4Y2VwdHxldmVyeXxlbHNlfGVsZW1lbnR8ZGVzY2VuZGluZ3xkZXNjZW5kYW50LW9yLXNlbGZ8ZGVzY2VuZGFudHxkZWZpbmV8ZGVmYXVsdHxkZWNsYXJlfGNvbW1lbnR8Y2hpbGR8Y2FzdHxjYXNlfGJlZm9yZXxhdHRyaWJ1dGV8YXNzZXJ0fGFzY2VuZGluZ3xhc3xhbmNlc3Rvci1vci1zZWxmfGFuY2VzdG9yfGFmdGVyfGVxfG9yZGVyfGJ5fG9yfGFuZHxzY2hlbWEtZWxlbWVudHxkb2N1bWVudC1ub2RlfG5vZGV8YXQpXGIvXSwKK1sidHlwIiwvXig/OnhzOnllYXJNb250aER1cmF0aW9ufHhzOnVuc2lnbmVkTG9uZ3x4czp0aW1lfHhzOnN0cmluZ3x4czpzaG9ydHx4czpRTmFtZXx4czpOYW1lfHhzOmxvbmd8eHM6aW50ZWdlcnx4czppbnR8eHM6Z1llYXJNb250aHx4czpnWWVhcnx4czpnTW9udGhEYXl8eHM6Z0RheXx4czpmbG9hdHx4czpkdXJhdGlvbnx4czpkb3VibGV8eHM6ZGVjaW1hbHx4czpkYXlUaW1lRHVyYXRpb258eHM6ZGF0ZVRpbWV8eHM6ZGF0ZXx4czpieXRlfHhzOmJvb2xlYW58eHM6YW55VVJJfHhmOnllYXJNb250aER1cmF0aW9uKVxiLyxudWxsXSxbImZ1biBwbG4iLC9eKD86eHA6ZGVyZWZlcmVuY2V8eGluYzpub2RlLWV4cGFuZHx4aW5jOmxpbmstcmVmZXJlbmNlc3x4aW5jOmxpbmstZXhwYW5kfHhodG1sOnJlc3RydWN0dXJlfHhodG1sOmNsZWFufHhodG1sOmFkZC1saXN0c3x4ZG1wOnppcC1tYW5pZmVzdHx4ZG1wOnppcC1nZXR8eGRtcDp6aXAtY3JlYXRlfHhkbXA6eHF1ZXJ5LXZlcnNpb258eGRtcDp3b3JkLWNvbnZlcnR8eGRtcDp3aXRoLW5hbWVzcGFjZXN8eGRtcDp2ZXJzaW9ufHhkbXA6dmFsdWV8eGRtcDp1c2VyLXJvbGVzfHhkbXA6dXNlci1sYXN0LWxvZ2lufHhkbXA6dXNlcnx4ZG1wOnVybC1lbmNvZGV8eGRtcDp1cmwtZGVjb2RlfHhkbXA6dXJpLWlzLWZpbGV8eGRtcDp1cmktZm9ybWF0fHhkbXA6dXJpLWNvbnRlbnQtdHlwZXx4ZG1wOnVucXVvdGV8eGRtcDp1bnBhdGh8eGRtcDp0cmlnZ2Vycy1kYXRhYmFzZXx4ZG1wOnRyYWNlfHhkbXA6dG8tanNvbnx4ZG1wOnRpZHl8eGRtcDpzdWJiaW5hcnl8eGRtcDpzdHJmdGltZXx4ZG1wOnNwYXduLWlufHhkbXA6c3Bhd258eGRtcDpzbGVlcHx4ZG1wOnNodXRkb3dufHhkbXA6c2V0LXNlc3Npb24tZmllbGR8eGRtcDpzZXQtcmVzcG9uc2UtZW5jb2Rpbmd8eGRtcDpzZXQtcmVzcG9uc2UtY29udGVudC10eXBlfHhkbXA6c2V0LXJlc3BvbnNlLWNvZGV8eGRtcDpzZXQtcmVxdWVzdC10aW1lLWxpbWl0fHhkbXA6c2V0fHhkbXA6c2VydmVyc3x4ZG1wOnNlcnZlci1zdGF0dXN8eGRtcDpzZXJ2ZXItbmFtZXx4ZG1wOnNlcnZlcnx4ZG1wOnNlY3VyaXR5LWRhdGFiYXNlfHhkbXA6c2VjdXJpdHktYXNzZXJ0fHhkbXA6c2NoZW1hLWRhdGFiYXNlfHhkbXA6c2F2ZXx4ZG1wOnJvbGUtcm9sZXN8eGRtcDpyb2xlfHhkbXA6cmV0aHJvd3x4ZG1wOnJlc3RhcnR8eGRtcDpyZXF1ZXN0LXRpbWVzdGFtcHx4ZG1wOnJlcXVlc3Qtc3RhdHVzfHhkbXA6cmVxdWVzdC1jYW5jZWx8eGRtcDpyZXF1ZXN0fHhkbXA6cmVkaXJlY3QtcmVzcG9uc2V8eGRtcDpyYW5kb218eGRtcDpxdW90ZXx4ZG1wOnF1ZXJ5LXRyYWNlfHhkbXA6cXVlcnktbWV0ZXJzfHhkbXA6cHJvZHVjdC1lZGl0aW9ufHhkbXA6cHJpdmlsZWdlLXJvbGVzfHhkbXA6cHJpdmlsZWdlfHhkbXA6cHJldHR5LXByaW50fHhkbXA6cG93ZXJwb2ludC1jb252ZXJ0fHhkbXA6cGxhdGZvcm18eGRtcDpwZXJtaXNzaW9ufHhkbXA6cGRmLWNvbnZlcnR8eGRtcDpwYXRofHhkbXA6b2N0YWwtdG8taW50ZWdlcnx4ZG1wOm5vZGUtdXJpfHhkbXA6bm9kZS1yZXBsYWNlfHhkbXA6bm9kZS1raW5kfHhkbXA6bm9kZS1pbnNlcnQtY2hpbGR8eGRtcDpub2RlLWluc2VydC1iZWZvcmV8eGRtcDpub2RlLWluc2VydC1hZnRlcnx4ZG1wOm5vZGUtZGVsZXRlfHhkbXA6bm9kZS1kYXRhYmFzZXx4ZG1wOm11bDY0fHhkbXA6bW9kdWxlcy1yb290fHhkbXA6bW9kdWxlcy1kYXRhYmFzZXx4ZG1wOm1lcmdpbmd8eGRtcDptZXJnZS1jYW5jZWx8eGRtcDptZXJnZXx4ZG1wOm1kNXx4ZG1wOmxvZ291dHx4ZG1wOmxvZ2lufHhkbXA6bG9nLWxldmVsfHhkbXA6bG9nfHhkbXA6bG9jay1yZWxlYXNlfHhkbXA6bG9jay1hY3F1aXJlfHhkbXA6bG9hZHx4ZG1wOmludm9rZS1pbnx4ZG1wOmludm9rZXx4ZG1wOmludGVnZXItdG8tb2N0YWx8eGRtcDppbnRlZ2VyLXRvLWhleHx4ZG1wOmh0dHAtcHV0fHhkbXA6aHR0cC1wb3N0fHhkbXA6aHR0cC1vcHRpb25zfHhkbXA6aHR0cC1oZWFkfHhkbXA6aHR0cC1nZXR8eGRtcDpodHRwLWRlbGV0ZXx4ZG1wOmhvc3RzfHhkbXA6aG9zdC1zdGF0dXN8eGRtcDpob3N0LW5hbWV8eGRtcDpob3N0fHhkbXA6aGV4LXRvLWludGVnZXJ8eGRtcDpoYXNoNjR8eGRtcDpoYXNoMzJ8eGRtcDpoYXMtcHJpdmlsZWdlfHhkbXA6Z3JvdXBzfHhkbXA6Z3JvdXAtc2VydmVzfHhkbXA6Z3JvdXAtc2VydmVyc3x4ZG1wOmdyb3VwLW5hbWV8eGRtcDpncm91cC1ob3N0c3x4ZG1wOmdyb3VwfHhkbXA6Z2V0LXNlc3Npb24tZmllbGQtbmFtZXN8eGRtcDpnZXQtc2Vzc2lvbi1maWVsZHx4ZG1wOmdldC1yZXNwb25zZS1lbmNvZGluZ3x4ZG1wOmdldC1yZXNwb25zZS1jb2RlfHhkbXA6Z2V0LXJlcXVlc3QtdXNlcm5hbWV8eGRtcDpnZXQtcmVxdWVzdC11c2VyfHhkbXA6Z2V0LXJlcXVlc3QtdXJsfHhkbXA6Z2V0LXJlcXVlc3QtcHJvdG9jb2x8eGRtcDpnZXQtcmVxdWVzdC1wYXRofHhkbXA6Z2V0LXJlcXVlc3QtbWV0aG9kfHhkbXA6Z2V0LXJlcXVlc3QtaGVhZGVyLW5hbWVzfHhkbXA6Z2V0LXJlcXVlc3QtaGVhZGVyfHhkbXA6Z2V0LXJlcXVlc3QtZmllbGQtbmFtZXN8eGRtcDpnZXQtcmVxdWVzdC1maWVsZC1maWxlbmFtZXx4ZG1wOmdldC1yZXF1ZXN0LWZpZWxkLWNvbnRlbnQtdHlwZXx4ZG1wOmdldC1yZXF1ZXN0LWZpZWxkfHhkbXA6Z2V0LXJlcXVlc3QtY2xpZW50LWNlcnRpZmljYXRlfHhkbXA6Z2V0LXJlcXVlc3QtY2xpZW50LWFkZHJlc3N8eGRtcDpnZXQtcmVxdWVzdC1ib2R5fHhkbXA6Z2V0LWN1cnJlbnQtdXNlcnx4ZG1wOmdldC1jdXJyZW50LXJvbGVzfHhkbXA6Z2V0fHhkbXA6ZnVuY3Rpb24tbmFtZXx4ZG1wOmZ1bmN0aW9uLW1vZHVsZXx4ZG1wOmZ1bmN0aW9ufHhkbXA6ZnJvbS1qc29ufHhkbXA6Zm9yZXN0c3x4ZG1wOmZvcmVzdC1zdGF0dXN8eGRtcDpmb3Jlc3QtcmVzdG9yZXx4ZG1wOmZvcmVzdC1yZXN0YXJ0fHhkbXA6Zm9yZXN0LW5hbWV8eGRtcDpmb3Jlc3QtZGVsZXRlfHhkbXA6Zm9yZXN0LWRhdGFiYXNlc3x4ZG1wOmZvcmVzdC1jb3VudHN8eGRtcDpmb3Jlc3QtY2xlYXJ8eGRtcDpmb3Jlc3QtYmFja3VwfHhkbXA6Zm9yZXN0fHhkbXA6ZmlsZXN5c3RlbS1maWxlfHhkbXA6ZmlsZXN5c3RlbS1kaXJlY3Rvcnl8eGRtcDpleGlzdHN8eGRtcDpleGNlbC1jb252ZXJ0fHhkbXA6ZXZhbC1pbnx4ZG1wOmV2YWx8eGRtcDplc3RpbWF0ZXx4ZG1wOmVtYWlsfHhkbXA6ZWxlbWVudC1jb250ZW50LXR5cGV8eGRtcDplbGFwc2VkLXRpbWV8eGRtcDpkb2N1bWVudC1zZXQtcXVhbGl0eXx4ZG1wOmRvY3VtZW50LXNldC1wcm9wZXJ0eXx4ZG1wOmRvY3VtZW50LXNldC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtc2V0LXBlcm1pc3Npb25zfHhkbXA6ZG9jdW1lbnQtc2V0LWNvbGxlY3Rpb25zfHhkbXA6ZG9jdW1lbnQtcmVtb3ZlLXByb3BlcnRpZXN8eGRtcDpkb2N1bWVudC1yZW1vdmUtcGVybWlzc2lvbnN8eGRtcDpkb2N1bWVudC1yZW1vdmUtY29sbGVjdGlvbnN8eGRtcDpkb2N1bWVudC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtbG9ja3N8eGRtcDpkb2N1bWVudC1sb2FkfHhkbXA6ZG9jdW1lbnQtaW5zZXJ0fHhkbXA6ZG9jdW1lbnQtZ2V0LXF1YWxpdHl8eGRtcDpkb2N1bWVudC1nZXQtcHJvcGVydGllc3x4ZG1wOmRvY3VtZW50LWdldC1wZXJtaXNzaW9uc3x4ZG1wOmRvY3VtZW50LWdldC1jb2xsZWN0aW9uc3x4ZG1wOmRvY3VtZW50LWdldHx4ZG1wOmRvY3VtZW50LWZvcmVzdHx4ZG1wOmRvY3VtZW50LWRlbGV0ZXx4ZG1wOmRvY3VtZW50LWFkZC1wcm9wZXJ0aWVzfHhkbXA6ZG9jdW1lbnQtYWRkLXBlcm1pc3Npb25zfHhkbXA6ZG9jdW1lbnQtYWRkLWNvbGxlY3Rpb25zfHhkbXA6ZGlyZWN0b3J5LXByb3BlcnRpZXN8eGRtcDpkaXJlY3RvcnktbG9ja3N8eGRtcDpkaXJlY3RvcnktZGVsZXRlfHhkbXA6ZGlyZWN0b3J5LWNyZWF0ZXx4ZG1wOmRpcmVjdG9yeXx4ZG1wOmRpYWNyaXRpYy1sZXNzfHhkbXA6ZGVzY3JpYmV8eGRtcDpkZWZhdWx0LXBlcm1pc3Npb25zfHhkbXA6ZGVmYXVsdC1jb2xsZWN0aW9uc3x4ZG1wOmRhdGFiYXNlc3x4ZG1wOmRhdGFiYXNlLXJlc3RvcmUtdmFsaWRhdGV8eGRtcDpkYXRhYmFzZS1yZXN0b3JlLXN0YXR1c3x4ZG1wOmRhdGFiYXNlLXJlc3RvcmUtY2FuY2VsfHhkbXA6ZGF0YWJhc2UtcmVzdG9yZXx4ZG1wOmRhdGFiYXNlLW5hbWV8eGRtcDpkYXRhYmFzZS1mb3Jlc3RzfHhkbXA6ZGF0YWJhc2UtYmFja3VwLXZhbGlkYXRlfHhkbXA6ZGF0YWJhc2UtYmFja3VwLXN0YXR1c3x4ZG1wOmRhdGFiYXNlLWJhY2t1cC1wdXJnZXx4ZG1wOmRhdGFiYXNlLWJhY2t1cC1jYW5jZWx8eGRtcDpkYXRhYmFzZS1iYWNrdXB8eGRtcDpkYXRhYmFzZXx4ZG1wOmNvbGxlY3Rpb24tcHJvcGVydGllc3x4ZG1wOmNvbGxlY3Rpb24tbG9ja3N8eGRtcDpjb2xsZWN0aW9uLWRlbGV0ZXx4ZG1wOmNvbGxhdGlvbi1jYW5vbmljYWwtdXJpfHhkbXA6Y2FzdGFibGUtYXN8eGRtcDpjYW4tZ3JhbnQtcm9sZXN8eGRtcDpiYXNlNjQtZW5jb2RlfHhkbXA6YmFzZTY0LWRlY29kZXx4ZG1wOmFyY2hpdGVjdHVyZXx4ZG1wOmFwcGx5fHhkbXA6YW1wLXJvbGVzfHhkbXA6YW1wfHhkbXA6YWRkNjR8eGRtcDphZGQtcmVzcG9uc2UtaGVhZGVyfHhkbXA6YWNjZXNzfHRyZ3I6dHJpZ2dlci1zZXQtcmVjdXJzaXZlfHRyZ3I6dHJpZ2dlci1zZXQtcGVybWlzc2lvbnN8dHJncjp0cmlnZ2VyLXNldC1uYW1lfHRyZ3I6dHJpZ2dlci1zZXQtbW9kdWxlfHRyZ3I6dHJpZ2dlci1zZXQtZXZlbnR8dHJncjp0cmlnZ2VyLXNldC1kZXNjcmlwdGlvbnx0cmdyOnRyaWdnZXItcmVtb3ZlLXBlcm1pc3Npb25zfHRyZ3I6dHJpZ2dlci1tb2R1bGV8dHJncjp0cmlnZ2VyLWdldC1wZXJtaXNzaW9uc3x0cmdyOnRyaWdnZXItZW5hYmxlfHRyZ3I6dHJpZ2dlci1kaXNhYmxlfHRyZ3I6dHJpZ2dlci1kYXRhYmFzZS1vbmxpbmUtZXZlbnR8dHJncjp0cmlnZ2VyLWRhdGEtZXZlbnR8dHJncjp0cmlnZ2VyLWFkZC1wZXJtaXNzaW9uc3x0cmdyOnJlbW92ZS10cmlnZ2VyfHRyZ3I6cHJvcGVydHktY29udGVudHx0cmdyOnByZS1jb21taXR8dHJncjpwb3N0LWNvbW1pdHx0cmdyOmdldC10cmlnZ2VyLWJ5LWlkfHRyZ3I6Z2V0LXRyaWdnZXJ8dHJncjpkb2N1bWVudC1zY29wZXx0cmdyOmRvY3VtZW50LWNvbnRlbnR8dHJncjpkaXJlY3Rvcnktc2NvcGV8dHJncjpjcmVhdGUtdHJpZ2dlcnx0cmdyOmNvbGxlY3Rpb24tc2NvcGV8dHJncjphbnktcHJvcGVydHktY29udGVudHx0aHNyOnNldC1lbnRyeXx0aHNyOnJlbW92ZS10ZXJtfHRoc3I6cmVtb3ZlLXN5bm9ueW18dGhzcjpyZW1vdmUtZW50cnl8dGhzcjpxdWVyeS1sb29rdXB8dGhzcjpsb29rdXB8dGhzcjpsb2FkfHRoc3I6aW5zZXJ0fHRoc3I6ZXhwYW5kfHRoc3I6YWRkLXN5bm9ueW18c3BlbGw6c3VnZ2VzdC1kZXRhaWxlZHxzcGVsbDpzdWdnZXN0fHNwZWxsOnJlbW92ZS13b3JkfHNwZWxsOm1ha2UtZGljdGlvbmFyeXxzcGVsbDpsb2FkfHNwZWxsOmxldmVuc2h0ZWluLWRpc3RhbmNlfHNwZWxsOmlzLWNvcnJlY3R8c3BlbGw6aW5zZXJ0fHNwZWxsOmRvdWJsZS1tZXRhcGhvbmV8c3BlbGw6YWRkLXdvcmR8c2VjOnVzZXJzLWNvbGxlY3Rpb258c2VjOnVzZXItc2V0LXJvbGVzfHNlYzp1c2VyLXNldC1wYXNzd29yZHxzZWM6dXNlci1zZXQtbmFtZXxzZWM6dXNlci1zZXQtZGVzY3JpcHRpb258c2VjOnVzZXItc2V0LWRlZmF1bHQtcGVybWlzc2lvbnN8c2VjOnVzZXItc2V0LWRlZmF1bHQtY29sbGVjdGlvbnN8c2VjOnVzZXItcmVtb3ZlLXJvbGVzfHNlYzp1c2VyLXByaXZpbGVnZXN8c2VjOnVzZXItZ2V0LXJvbGVzfHNlYzp1c2VyLWdldC1kZXNjcmlwdGlvbnxzZWM6dXNlci1nZXQtZGVmYXVsdC1wZXJtaXNzaW9uc3xzZWM6dXNlci1nZXQtZGVmYXVsdC1jb2xsZWN0aW9uc3xzZWM6dXNlci1kb2MtcGVybWlzc2lvbnN8c2VjOnVzZXItZG9jLWNvbGxlY3Rpb25zfHNlYzp1c2VyLWFkZC1yb2xlc3xzZWM6dW5wcm90ZWN0LWNvbGxlY3Rpb258c2VjOnVpZC1mb3ItbmFtZXxzZWM6c2V0LXJlYWxtfHNlYzpzZWN1cml0eS12ZXJzaW9ufHNlYzpzZWN1cml0eS1uYW1lc3BhY2V8c2VjOnNlY3VyaXR5LWluc3RhbGxlZHxzZWM6c2VjdXJpdHktY29sbGVjdGlvbnxzZWM6cm9sZXMtY29sbGVjdGlvbnxzZWM6cm9sZS1zZXQtcm9sZXN8c2VjOnJvbGUtc2V0LW5hbWV8c2VjOnJvbGUtc2V0LWRlc2NyaXB0aW9ufHNlYzpyb2xlLXNldC1kZWZhdWx0LXBlcm1pc3Npb25zfHNlYzpyb2xlLXNldC1kZWZhdWx0LWNvbGxlY3Rpb25zfHNlYzpyb2xlLXJlbW92ZS1yb2xlc3xzZWM6cm9sZS1wcml2aWxlZ2VzfHNlYzpyb2xlLWdldC1yb2xlc3xzZWM6cm9sZS1nZXQtZGVzY3JpcHRpb258c2VjOnJvbGUtZ2V0LWRlZmF1bHQtcGVybWlzc2lvbnN8c2VjOnJvbGUtZ2V0LWRlZmF1bHQtY29sbGVjdGlvbnN8c2VjOnJvbGUtZG9jLXBlcm1pc3Npb25zfHNlYzpyb2xlLWRvYy1jb2xsZWN0aW9uc3xzZWM6cm9sZS1hZGQtcm9sZXN8c2VjOnJlbW92ZS11c2VyfHNlYzpyZW1vdmUtcm9sZS1mcm9tLXVzZXJzfHNlYzpyZW1vdmUtcm9sZS1mcm9tLXJvbGV8c2VjOnJlbW92ZS1yb2xlLWZyb20tcHJpdmlsZWdlc3xzZWM6cmVtb3ZlLXJvbGUtZnJvbS1hbXBzfHNlYzpyZW1vdmUtcm9sZXxzZWM6cmVtb3ZlLXByaXZpbGVnZXxzZWM6cmVtb3ZlLWFtcHxzZWM6cHJvdGVjdC1jb2xsZWN0aW9ufHNlYzpwcml2aWxlZ2VzLWNvbGxlY3Rpb258c2VjOnByaXZpbGVnZS1zZXQtcm9sZXN8c2VjOnByaXZpbGVnZS1zZXQtbmFtZXxzZWM6cHJpdmlsZWdlLXJlbW92ZS1yb2xlc3xzZWM6cHJpdmlsZWdlLWdldC1yb2xlc3xzZWM6cHJpdmlsZWdlLWFkZC1yb2xlc3xzZWM6cHJpdi1kb2MtcGVybWlzc2lvbnN8c2VjOnByaXYtZG9jLWNvbGxlY3Rpb25zfHNlYzpnZXQtdXNlci1uYW1lc3xzZWM6Z2V0LXVuaXF1ZS1lbGVtLWlkfHNlYzpnZXQtcm9sZS1uYW1lc3xzZWM6Z2V0LXJvbGUtaWRzfHNlYzpnZXQtcHJpdmlsZWdlfHNlYzpnZXQtZGlzdGluY3QtcGVybWlzc2lvbnN8c2VjOmdldC1jb2xsZWN0aW9ufHNlYzpnZXQtYW1wfHNlYzpjcmVhdGUtdXNlci13aXRoLXJvbGV8c2VjOmNyZWF0ZS11c2VyfHNlYzpjcmVhdGUtcm9sZXxzZWM6Y3JlYXRlLXByaXZpbGVnZXxzZWM6Y3JlYXRlLWFtcHxzZWM6Y29sbGVjdGlvbnMtY29sbGVjdGlvbnxzZWM6Y29sbGVjdGlvbi1zZXQtcGVybWlzc2lvbnN8c2VjOmNvbGxlY3Rpb24tcmVtb3ZlLXBlcm1pc3Npb25zfHNlYzpjb2xsZWN0aW9uLWdldC1wZXJtaXNzaW9uc3xzZWM6Y29sbGVjdGlvbi1hZGQtcGVybWlzc2lvbnN8c2VjOmNoZWNrLWFkbWlufHNlYzphbXBzLWNvbGxlY3Rpb258c2VjOmFtcC1zZXQtcm9sZXN8c2VjOmFtcC1yZW1vdmUtcm9sZXN8c2VjOmFtcC1nZXQtcm9sZXN8c2VjOmFtcC1kb2MtcGVybWlzc2lvbnN8c2VjOmFtcC1kb2MtY29sbGVjdGlvbnN8c2VjOmFtcC1hZGQtcm9sZXN8c2VhcmNoOnVucGFyc2V8c2VhcmNoOnN1Z2dlc3R8c2VhcmNoOnNuaXBwZXR8c2VhcmNoOnNlYXJjaHxzZWFyY2g6cmVzb2x2ZS1ub2Rlc3xzZWFyY2g6cmVzb2x2ZXxzZWFyY2g6cmVtb3ZlLWNvbnN0cmFpbnR8c2VhcmNoOnBhcnNlfHNlYXJjaDpnZXQtZGVmYXVsdC1vcHRpb25zfHNlYXJjaDplc3RpbWF0ZXxzZWFyY2g6Y2hlY2stb3B0aW9uc3xwcm9mOnZhbHVlfHByb2Y6cmVzZXR8cHJvZjpyZXBvcnR8cHJvZjppbnZva2V8cHJvZjpldmFsfHByb2Y6ZW5hYmxlfHByb2Y6ZGlzYWJsZXxwcm9mOmFsbG93ZWR8cHB0OmNsZWFufHBraTp0ZW1wbGF0ZS1zZXQtcmVxdWVzdHxwa2k6dGVtcGxhdGUtc2V0LW5hbWV8cGtpOnRlbXBsYXRlLXNldC1rZXktdHlwZXxwa2k6dGVtcGxhdGUtc2V0LWtleS1vcHRpb25zfHBraTp0ZW1wbGF0ZS1zZXQtZGVzY3JpcHRpb258cGtpOnRlbXBsYXRlLWluLXVzZXxwa2k6dGVtcGxhdGUtZ2V0LXZlcnNpb258cGtpOnRlbXBsYXRlLWdldC1yZXF1ZXN0fHBraTp0ZW1wbGF0ZS1nZXQtbmFtZXxwa2k6dGVtcGxhdGUtZ2V0LWtleS10eXBlfHBraTp0ZW1wbGF0ZS1nZXQta2V5LW9wdGlvbnN8cGtpOnRlbXBsYXRlLWdldC1pZHxwa2k6dGVtcGxhdGUtZ2V0LWRlc2NyaXB0aW9ufHBraTpuZWVkLWNlcnRpZmljYXRlfHBraTppcy10ZW1wb3Jhcnl8cGtpOmluc2VydC10cnVzdGVkLWNlcnRpZmljYXRlc3xwa2k6aW5zZXJ0LXRlbXBsYXRlfHBraTppbnNlcnQtc2lnbmVkLWNlcnRpZmljYXRlc3xwa2k6aW5zZXJ0LWNlcnRpZmljYXRlLXJldm9jYXRpb24tbGlzdHxwa2k6Z2V0LXRydXN0ZWQtY2VydGlmaWNhdGUtaWRzfHBraTpnZXQtdGVtcGxhdGUtaWRzfHBraTpnZXQtdGVtcGxhdGUtY2VydGlmaWNhdGUtYXV0aG9yaXR5fHBraTpnZXQtdGVtcGxhdGUtYnktbmFtZXxwa2k6Z2V0LXRlbXBsYXRlfHBraTpnZXQtcGVuZGluZy1jZXJ0aWZpY2F0ZS1yZXF1ZXN0cy14bWx8cGtpOmdldC1wZW5kaW5nLWNlcnRpZmljYXRlLXJlcXVlc3RzLXBlbXxwa2k6Z2V0LXBlbmRpbmctY2VydGlmaWNhdGUtcmVxdWVzdHxwa2k6Z2V0LWNlcnRpZmljYXRlcy1mb3ItdGVtcGxhdGUteG1sfHBraTpnZXQtY2VydGlmaWNhdGVzLWZvci10ZW1wbGF0ZXxwa2k6Z2V0LWNlcnRpZmljYXRlc3xwa2k6Z2V0LWNlcnRpZmljYXRlLXhtbHxwa2k6Z2V0LWNlcnRpZmljYXRlLXBlbXxwa2k6Z2V0LWNlcnRpZmljYXRlfHBraTpnZW5lcmF0ZS10ZW1wb3JhcnktY2VydGlmaWNhdGUtaWYtbmVjZXNzYXJ5fHBraTpnZW5lcmF0ZS10ZW1wb3JhcnktY2VydGlmaWNhdGV8cGtpOmdlbmVyYXRlLXRlbXBsYXRlLWNlcnRpZmljYXRlLWF1dGhvcml0eXxwa2k6Z2VuZXJhdGUtY2VydGlmaWNhdGUtcmVxdWVzdHxwa2k6ZGVsZXRlLXRlbXBsYXRlfHBraTpkZWxldGUtY2VydGlmaWNhdGV8cGtpOmNyZWF0ZS10ZW1wbGF0ZXxwZGY6bWFrZS10b2N8cGRmOmluc2VydC10b2MtaGVhZGVyc3xwZGY6Z2V0LXRvY3xwZGY6Y2xlYW58cDpzdGF0dXMtdHJhbnNpdGlvbnxwOnN0YXRlLXRyYW5zaXRpb258cDpyZW1vdmV8cDpwaXBlbGluZXN8cDppbnNlcnR8cDpnZXQtYnktaWR8cDpnZXR8cDpleGVjdXRlfHA6Y3JlYXRlfHA6Y29uZGl0aW9ufHA6Y29sbGVjdGlvbnxwOmFjdGlvbnxvb3htbDpydW5zLW1lcmdlfG9veG1sOnBhY2thZ2UtdXJpc3xvb3htbDpwYWNrYWdlLXBhcnRzLWluc2VydHxvb3htbDpwYWNrYWdlLXBhcnRzfG1zd29yZDpjbGVhbnxtY2dtOnBvbHlnb258bWNnbTpwb2ludHxtY2dtOmdlb3NwYXRpYWwtcXVlcnktZnJvbS1lbGVtZW50c3xtY2dtOmdlb3NwYXRpYWwtcXVlcnl8bWNnbTpjaXJjbGV8bWF0aDp0YW5ofG1hdGg6dGFufG1hdGg6c3FydHxtYXRoOnNpbmh8bWF0aDpzaW58bWF0aDpwb3d8bWF0aDptb2RmfG1hdGg6bG9nMTB8bWF0aDpsb2d8bWF0aDpsZGV4cHxtYXRoOmZyZXhwfG1hdGg6Zm1vZHxtYXRoOmZsb29yfG1hdGg6ZmFic3xtYXRoOmV4cHxtYXRoOmNvc2h8bWF0aDpjb3N8bWF0aDpjZWlsfG1hdGg6YXRhbjJ8bWF0aDphdGFufG1hdGg6YXNpbnxtYXRoOmFjb3N8bWFwOnB1dHxtYXA6bWFwfG1hcDprZXlzfG1hcDpnZXR8bWFwOmRlbGV0ZXxtYXA6Y291bnR8bWFwOmNsZWFyfGxuazp0b3xsbms6cmVtb3ZlfGxuazppbnNlcnR8bG5rOmdldHxsbms6ZnJvbXxsbms6Y3JlYXRlfGttbDpwb2x5Z29ufGttbDpwb2ludHxrbWw6aW50ZXJpb3ItcG9seWdvbnxrbWw6Z2Vvc3BhdGlhbC1xdWVyeS1mcm9tLWVsZW1lbnRzfGttbDpnZW9zcGF0aWFsLXF1ZXJ5fGttbDpjaXJjbGV8a21sOmJveHxnbWw6cG9seWdvbnxnbWw6cG9pbnR8Z21sOmludGVyaW9yLXBvbHlnb258Z21sOmdlb3NwYXRpYWwtcXVlcnktZnJvbS1lbGVtZW50c3xnbWw6Z2Vvc3BhdGlhbC1xdWVyeXxnbWw6Y2lyY2xlfGdtbDpib3h8Z2VvcnNzOnBvaW50fGdlb3JzczpnZW9zcGF0aWFsLXF1ZXJ5fGdlb3JzczpjaXJjbGV8Z2VvOnBvbHlnb258Z2VvOnBvaW50fGdlbzppbnRlcmlvci1wb2x5Z29ufGdlbzpnZW9zcGF0aWFsLXF1ZXJ5LWZyb20tZWxlbWVudHN8Z2VvOmdlb3NwYXRpYWwtcXVlcnl8Z2VvOmNpcmNsZXxnZW86Ym94fGZuOnplcm8tb3Itb25lfGZuOnllYXJzLWZyb20tZHVyYXRpb258Zm46eWVhci1mcm9tLWRhdGVUaW1lfGZuOnllYXItZnJvbS1kYXRlfGZuOnVwcGVyLWNhc2V8Zm46dW5vcmRlcmVkfGZuOnRydWV8Zm46dHJhbnNsYXRlfGZuOnRyYWNlfGZuOnRva2VuaXplfGZuOnRpbWV6b25lLWZyb20tdGltZXxmbjp0aW1lem9uZS1mcm9tLWRhdGVUaW1lfGZuOnRpbWV6b25lLWZyb20tZGF0ZXxmbjpzdW18Zm46c3VidHJhY3QtZGF0ZVRpbWVzLXlpZWxkaW5nLXllYXJNb250aER1cmF0aW9ufGZuOnN1YnRyYWN0LWRhdGVUaW1lcy15aWVsZGluZy1kYXlUaW1lRHVyYXRpb258Zm46c3Vic3RyaW5nLWJlZm9yZXxmbjpzdWJzdHJpbmctYWZ0ZXJ8Zm46c3Vic3RyaW5nfGZuOnN1YnNlcXVlbmNlfGZuOnN0cmluZy10by1jb2RlcG9pbnRzfGZuOnN0cmluZy1wYWR8Zm46c3RyaW5nLWxlbmd0aHxmbjpzdHJpbmctam9pbnxmbjpzdHJpbmd8Zm46c3RhdGljLWJhc2UtdXJpfGZuOnN0YXJ0cy13aXRofGZuOnNlY29uZHMtZnJvbS10aW1lfGZuOnNlY29uZHMtZnJvbS1kdXJhdGlvbnxmbjpzZWNvbmRzLWZyb20tZGF0ZVRpbWV8Zm46cm91bmQtaGFsZi10by1ldmVufGZuOnJvdW5kfGZuOnJvb3R8Zm46cmV2ZXJzZXxmbjpyZXNvbHZlLXVyaXxmbjpyZXNvbHZlLVFOYW1lfGZuOnJlcGxhY2V8Zm46cmVtb3ZlfGZuOlFOYW1lfGZuOnByZWZpeC1mcm9tLVFOYW1lfGZuOnBvc2l0aW9ufGZuOm9uZS1vci1tb3JlfGZuOm51bWJlcnxmbjpub3R8Zm46bm9ybWFsaXplLXVuaWNvZGV8Zm46bm9ybWFsaXplLXNwYWNlfGZuOm5vZGUtbmFtZXxmbjpub2RlLWtpbmR8Zm46bmlsbGVkfGZuOm5hbWVzcGFjZS11cmktZnJvbS1RTmFtZXxmbjpuYW1lc3BhY2UtdXJpLWZvci1wcmVmaXh8Zm46bmFtZXNwYWNlLXVyaXxmbjpuYW1lfGZuOm1vbnRocy1mcm9tLWR1cmF0aW9ufGZuOm1vbnRoLWZyb20tZGF0ZVRpbWV8Zm46bW9udGgtZnJvbS1kYXRlfGZuOm1pbnV0ZXMtZnJvbS10aW1lfGZuOm1pbnV0ZXMtZnJvbS1kdXJhdGlvbnxmbjptaW51dGVzLWZyb20tZGF0ZVRpbWV8Zm46bWlufGZuOm1heHxmbjptYXRjaGVzfGZuOmxvd2VyLWNhc2V8Zm46bG9jYWwtbmFtZS1mcm9tLVFOYW1lfGZuOmxvY2FsLW5hbWV8Zm46bGFzdHxmbjpsYW5nfGZuOmlyaS10by11cml8Zm46aW5zZXJ0LWJlZm9yZXxmbjppbmRleC1vZnxmbjppbi1zY29wZS1wcmVmaXhlc3xmbjppbXBsaWNpdC10aW1lem9uZXxmbjppZHJlZnxmbjppZHxmbjpob3Vycy1mcm9tLXRpbWV8Zm46aG91cnMtZnJvbS1kdXJhdGlvbnxmbjpob3Vycy1mcm9tLWRhdGVUaW1lfGZuOmZsb29yfGZuOmZhbHNlfGZuOmV4cGFuZGVkLVFOYW1lfGZuOmV4aXN0c3xmbjpleGFjdGx5LW9uZXxmbjplc2NhcGUtdXJpfGZuOmVzY2FwZS1odG1sLXVyaXxmbjplcnJvcnxmbjplbmRzLXdpdGh8Zm46ZW5jb2RlLWZvci11cml8Zm46ZW1wdHl8Zm46ZG9jdW1lbnQtdXJpfGZuOmRvYy1hdmFpbGFibGV8Zm46ZG9jfGZuOmRpc3RpbmN0LXZhbHVlc3xmbjpkaXN0aW5jdC1ub2Rlc3xmbjpkZWZhdWx0LWNvbGxhdGlvbnxmbjpkZWVwLWVxdWFsfGZuOmRheXMtZnJvbS1kdXJhdGlvbnxmbjpkYXktZnJvbS1kYXRlVGltZXxmbjpkYXktZnJvbS1kYXRlfGZuOmRhdGF8Zm46Y3VycmVudC10aW1lfGZuOmN1cnJlbnQtZGF0ZVRpbWV8Zm46Y3VycmVudC1kYXRlfGZuOmNvdW50fGZuOmNvbnRhaW5zfGZuOmNvbmNhdHxmbjpjb21wYXJlfGZuOmNvbGxlY3Rpb258Zm46Y29kZXBvaW50cy10by1zdHJpbmd8Zm46Y29kZXBvaW50LWVxdWFsfGZuOmNlaWxpbmd8Zm46Ym9vbGVhbnxmbjpiYXNlLXVyaXxmbjphdmd8Zm46YWRqdXN0LXRpbWUtdG8tdGltZXpvbmV8Zm46YWRqdXN0LWRhdGVUaW1lLXRvLXRpbWV6b25lfGZuOmFkanVzdC1kYXRlLXRvLXRpbWV6b25lfGZuOmFic3xmZWVkOnVuc3Vic2NyaWJlfGZlZWQ6c3Vic2NyaXB0aW9ufGZlZWQ6c3Vic2NyaWJlfGZlZWQ6cmVxdWVzdHxmZWVkOml0ZW18ZmVlZDpkZXNjcmlwdGlvbnxleGNlbDpjbGVhbnxlbnRpdHk6ZW5yaWNofGRvbTpzZXQtcGlwZWxpbmVzfGRvbTpzZXQtcGVybWlzc2lvbnN8ZG9tOnNldC1uYW1lfGRvbTpzZXQtZXZhbHVhdGlvbi1jb250ZXh0fGRvbTpzZXQtZG9tYWluLXNjb3BlfGRvbTpzZXQtZGVzY3JpcHRpb258ZG9tOnJlbW92ZS1waXBlbGluZXxkb206cmVtb3ZlLXBlcm1pc3Npb25zfGRvbTpyZW1vdmV8ZG9tOmdldHxkb206ZXZhbHVhdGlvbi1jb250ZXh0fGRvbTpkb21haW5zfGRvbTpkb21haW4tc2NvcGV8ZG9tOmNyZWF0ZXxkb206Y29uZmlndXJhdGlvbi1zZXQtcmVzdGFydC11c2VyfGRvbTpjb25maWd1cmF0aW9uLXNldC1wZXJtaXNzaW9uc3xkb206Y29uZmlndXJhdGlvbi1zZXQtZXZhbHVhdGlvbi1jb250ZXh0fGRvbTpjb25maWd1cmF0aW9uLXNldC1kZWZhdWx0LWRvbWFpbnxkb206Y29uZmlndXJhdGlvbi1nZXR8ZG9tOmNvbmZpZ3VyYXRpb24tY3JlYXRlfGRvbTpjb2xsZWN0aW9ufGRvbTphZGQtcGlwZWxpbmV8ZG9tOmFkZC1wZXJtaXNzaW9uc3xkbHM6cmV0ZW50aW9uLXJ1bGVzfGRsczpyZXRlbnRpb24tcnVsZS1yZW1vdmV8ZGxzOnJldGVudGlvbi1ydWxlLWluc2VydHxkbHM6cmV0ZW50aW9uLXJ1bGV8ZGxzOnB1cmdlfGRsczpub2RlLWV4cGFuZHxkbHM6bGluay1yZWZlcmVuY2VzfGRsczpsaW5rLWV4cGFuZHxkbHM6ZG9jdW1lbnRzLXF1ZXJ5fGRsczpkb2N1bWVudC12ZXJzaW9ucy1xdWVyeXxkbHM6ZG9jdW1lbnQtdmVyc2lvbi11cml8ZGxzOmRvY3VtZW50LXZlcnNpb24tcXVlcnl8ZGxzOmRvY3VtZW50LXZlcnNpb24tZGVsZXRlfGRsczpkb2N1bWVudC12ZXJzaW9uLWFzLW9mfGRsczpkb2N1bWVudC12ZXJzaW9ufGRsczpkb2N1bWVudC11cGRhdGV8ZGxzOmRvY3VtZW50LXVubWFuYWdlfGRsczpkb2N1bWVudC1zZXQtcXVhbGl0eXxkbHM6ZG9jdW1lbnQtc2V0LXByb3BlcnR5fGRsczpkb2N1bWVudC1zZXQtcHJvcGVydGllc3xkbHM6ZG9jdW1lbnQtc2V0LXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1zZXQtY29sbGVjdGlvbnN8ZGxzOmRvY3VtZW50LXJldGVudGlvbi1ydWxlc3xkbHM6ZG9jdW1lbnQtcmVtb3ZlLXByb3BlcnRpZXN8ZGxzOmRvY3VtZW50LXJlbW92ZS1wZXJtaXNzaW9uc3xkbHM6ZG9jdW1lbnQtcmVtb3ZlLWNvbGxlY3Rpb25zfGRsczpkb2N1bWVudC1wdXJnZXxkbHM6ZG9jdW1lbnQtbWFuYWdlfGRsczpkb2N1bWVudC1pcy1tYW5hZ2VkfGRsczpkb2N1bWVudC1pbnNlcnQtYW5kLW1hbmFnZXxkbHM6ZG9jdW1lbnQtaW5jbHVkZS1xdWVyeXxkbHM6ZG9jdW1lbnQtaGlzdG9yeXxkbHM6ZG9jdW1lbnQtZ2V0LXBlcm1pc3Npb25zfGRsczpkb2N1bWVudC1leHRyYWN0LXBhcnR8ZGxzOmRvY3VtZW50LWRlbGV0ZXxkbHM6ZG9jdW1lbnQtY2hlY2tvdXQtc3RhdHVzfGRsczpkb2N1bWVudC1jaGVja291dHxkbHM6ZG9jdW1lbnQtY2hlY2tpbnxkbHM6ZG9jdW1lbnQtYWRkLXByb3BlcnRpZXN8ZGxzOmRvY3VtZW50LWFkZC1wZXJtaXNzaW9uc3xkbHM6ZG9jdW1lbnQtYWRkLWNvbGxlY3Rpb25zfGRsczpicmVhay1jaGVja291dHxkbHM6YXV0aG9yLXF1ZXJ5fGRsczphcy1vZi1xdWVyeXxkYms6Y29udmVydHxkYmc6d2FpdHxkYmc6dmFsdWV8ZGJnOnN0b3BwZWR8ZGJnOnN0b3B8ZGJnOnN0ZXB8ZGJnOnN0YXR1c3xkYmc6c3RhY2t8ZGJnOm91dHxkYmc6bmV4dHxkYmc6bGluZXxkYmc6aW52b2tlfGRiZzpmdW5jdGlvbnxkYmc6ZmluaXNofGRiZzpleHByfGRiZzpldmFsfGRiZzpkaXNjb25uZWN0fGRiZzpkZXRhY2h8ZGJnOmNvbnRpbnVlfGRiZzpjb25uZWN0fGRiZzpjbGVhcnxkYmc6YnJlYWtwb2ludHN8ZGJnOmJyZWFrfGRiZzphdHRhY2hlZHxkYmc6YXR0YWNofGN2dDpzYXZlLWNvbnZlcnRlZC1kb2N1bWVudHN8Y3Z0OnBhcnQtdXJpfGN2dDpkZXN0aW5hdGlvbi11cml8Y3Z0OmJhc2VwYXRofGN2dDpiYXNlbmFtZXxjdHM6d29yZHN8Y3RzOndvcmQtcXVlcnktd2VpZ2h0fGN0czp3b3JkLXF1ZXJ5LXRleHR8Y3RzOndvcmQtcXVlcnktb3B0aW9uc3xjdHM6d29yZC1xdWVyeXxjdHM6d29yZC1tYXRjaHxjdHM6d2Fsa3xjdHM6dXJpc3xjdHM6dXJpLW1hdGNofGN0czp0cmFpbnxjdHM6dG9rZW5pemV8Y3RzOnRocmVzaG9sZHN8Y3RzOnN0ZW18Y3RzOnNpbWlsYXItcXVlcnktd2VpZ2h0fGN0czpzaW1pbGFyLXF1ZXJ5LW5vZGVzfGN0czpzaW1pbGFyLXF1ZXJ5fGN0czpzaG9ydGVzdC1kaXN0YW5jZXxjdHM6c2VhcmNofGN0czpzY29yZXxjdHM6cmV2ZXJzZS1xdWVyeS13ZWlnaHR8Y3RzOnJldmVyc2UtcXVlcnktbm9kZXN8Y3RzOnJldmVyc2UtcXVlcnl8Y3RzOnJlbWFpbmRlcnxjdHM6cmVnaXN0ZXJlZC1xdWVyeS13ZWlnaHR8Y3RzOnJlZ2lzdGVyZWQtcXVlcnktb3B0aW9uc3xjdHM6cmVnaXN0ZXJlZC1xdWVyeS1pZHN8Y3RzOnJlZ2lzdGVyZWQtcXVlcnl8Y3RzOnJlZ2lzdGVyfGN0czpxdWVyeXxjdHM6cXVhbGl0eXxjdHM6cHJvcGVydGllcy1xdWVyeS1xdWVyeXxjdHM6cHJvcGVydGllcy1xdWVyeXxjdHM6cG9seWdvbi12ZXJ0aWNlc3xjdHM6cG9seWdvbnxjdHM6cG9pbnQtbG9uZ2l0dWRlfGN0czpwb2ludC1sYXRpdHVkZXxjdHM6cG9pbnR8Y3RzOm9yLXF1ZXJ5LXF1ZXJpZXN8Y3RzOm9yLXF1ZXJ5fGN0czpub3QtcXVlcnktd2VpZ2h0fGN0czpub3QtcXVlcnktcXVlcnl8Y3RzOm5vdC1xdWVyeXxjdHM6bmVhci1xdWVyeS13ZWlnaHR8Y3RzOm5lYXItcXVlcnktcXVlcmllc3xjdHM6bmVhci1xdWVyeS1vcHRpb25zfGN0czpuZWFyLXF1ZXJ5LWRpc3RhbmNlfGN0czpuZWFyLXF1ZXJ5fGN0czpoaWdobGlnaHR8Y3RzOmdlb3NwYXRpYWwtY28tb2NjdXJyZW5jZXN8Y3RzOmZyZXF1ZW5jeXxjdHM6Zml0bmVzc3xjdHM6ZmllbGQtd29yZHN8Y3RzOmZpZWxkLXdvcmQtcXVlcnktd2VpZ2h0fGN0czpmaWVsZC13b3JkLXF1ZXJ5LXRleHR8Y3RzOmZpZWxkLXdvcmQtcXVlcnktb3B0aW9uc3xjdHM6ZmllbGQtd29yZC1xdWVyeS1maWVsZC1uYW1lfGN0czpmaWVsZC13b3JkLXF1ZXJ5fGN0czpmaWVsZC13b3JkLW1hdGNofGN0czplbnRpdHktaGlnaGxpZ2h0fGN0czplbGVtZW50LXdvcmRzfGN0czplbGVtZW50LXdvcmQtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LXdvcmQtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC13b3JkLXF1ZXJ5LW9wdGlvbnN8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtd29yZC1xdWVyeXxjdHM6ZWxlbWVudC13b3JkLW1hdGNofGN0czplbGVtZW50LXZhbHVlc3xjdHM6ZWxlbWVudC12YWx1ZS1yYW5nZXN8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LXZhbHVlLXF1ZXJ5LXRleHR8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC12YWx1ZS1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtdmFsdWUtcXVlcnl8Y3RzOmVsZW1lbnQtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtdmFsdWUtZ2Vvc3BhdGlhbC1jby1vY2N1cnJlbmNlc3xjdHM6ZWxlbWVudC12YWx1ZS1jby1vY2N1cnJlbmNlc3xjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnktdmFsdWV8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS1vcGVyYXRvcnxjdHM6ZWxlbWVudC1yYW5nZS1xdWVyeS1lbGVtZW50LW5hbWV8Y3RzOmVsZW1lbnQtcmFuZ2UtcXVlcnl8Y3RzOmVsZW1lbnQtcXVlcnktcXVlcnl8Y3RzOmVsZW1lbnQtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LXF1ZXJ5fGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC12YWx1ZXN8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXZhbHVlLW1hdGNofGN0czplbGVtZW50LXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LXJlZ2lvbnxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnktbG9uZ2l0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWxhdGl0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1wYWlyLWdlb3NwYXRpYWwtcXVlcnl8Y3RzOmVsZW1lbnQtcGFpci1nZW9zcGF0aWFsLWJveGVzfGN0czplbGVtZW50LWdlb3NwYXRpYWwtdmFsdWVzfGN0czplbGVtZW50LWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS1yZWdpb258Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWdlb3NwYXRpYWwtcXVlcnl8Y3RzOmVsZW1lbnQtZ2Vvc3BhdGlhbC1ib3hlc3xjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXZhbHVlc3xjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXZhbHVlLW1hdGNofGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktcmVnaW9ufGN0czplbGVtZW50LWNoaWxkLWdlb3NwYXRpYWwtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLXF1ZXJ5LWNoaWxkLW5hbWV8Y3RzOmVsZW1lbnQtY2hpbGQtZ2Vvc3BhdGlhbC1xdWVyeXxjdHM6ZWxlbWVudC1jaGlsZC1nZW9zcGF0aWFsLWJveGVzfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3Jkc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXdvcmQtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS13b3JkLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeS1hdHRyaWJ1dGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1xdWVyeXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtd29yZC1tYXRjaHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWVzfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1yYW5nZXN8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLXF1ZXJ5LXdlaWdodHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktdGV4dHxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1xdWVyeS1hdHRyaWJ1dGUtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtdmFsdWUtcXVlcnl8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXZhbHVlLW1hdGNofGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1nZW9zcGF0aWFsLWNvLW9jY3VycmVuY2VzfGN0czplbGVtZW50LWF0dHJpYnV0ZS12YWx1ZS1jby1vY2N1cnJlbmNlc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktd2VpZ2h0fGN0czplbGVtZW50LWF0dHJpYnV0ZS1yYW5nZS1xdWVyeS12YWx1ZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktb3B0aW9uc3xjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktb3BlcmF0b3J8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5LWVsZW1lbnQtbmFtZXxjdHM6ZWxlbWVudC1hdHRyaWJ1dGUtcmFuZ2UtcXVlcnktYXR0cmlidXRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXJhbmdlLXF1ZXJ5fGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtdmFsdWVzfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtdmFsdWUtbWF0Y2h8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS13ZWlnaHR8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1yZWdpb258Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1vcHRpb25zfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktbG9uZ2l0dWRlLW5hbWV8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1xdWVyeS1sYXRpdHVkZS1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnktZWxlbWVudC1uYW1lfGN0czplbGVtZW50LWF0dHJpYnV0ZS1wYWlyLWdlb3NwYXRpYWwtcXVlcnl8Y3RzOmVsZW1lbnQtYXR0cmlidXRlLXBhaXItZ2Vvc3BhdGlhbC1ib3hlc3xjdHM6ZG9jdW1lbnQtcXVlcnktdXJpc3xjdHM6ZG9jdW1lbnQtcXVlcnl8Y3RzOmRpc3RhbmNlfGN0czpkaXJlY3RvcnktcXVlcnktdXJpc3xjdHM6ZGlyZWN0b3J5LXF1ZXJ5LWRlcHRofGN0czpkaXJlY3RvcnktcXVlcnl8Y3RzOmRlc3RpbmF0aW9ufGN0czpkZXJlZ2lzdGVyfGN0czpjb250YWluc3xjdHM6Y29uZmlkZW5jZXxjdHM6Y29sbGVjdGlvbnN8Y3RzOmNvbGxlY3Rpb24tcXVlcnktdXJpc3xjdHM6Y29sbGVjdGlvbi1xdWVyeXxjdHM6Y29sbGVjdGlvbi1tYXRjaHxjdHM6Y2xhc3NpZnl8Y3RzOmNpcmNsZS1yYWRpdXN8Y3RzOmNpcmNsZS1jZW50ZXJ8Y3RzOmNpcmNsZXxjdHM6Ym94LXdlc3R8Y3RzOmJveC1zb3V0aHxjdHM6Ym94LW5vcnRofGN0czpib3gtZWFzdHxjdHM6Ym94fGN0czpiZWFyaW5nfGN0czphcmMtaW50ZXJzZWN0aW9ufGN0czphbmQtcXVlcnktcXVlcmllc3xjdHM6YW5kLXF1ZXJ5LW9wdGlvbnN8Y3RzOmFuZC1xdWVyeXxjdHM6YW5kLW5vdC1xdWVyeS1wb3NpdGl2ZS1xdWVyeXxjdHM6YW5kLW5vdC1xdWVyeS1uZWdhdGl2ZS1xdWVyeXxjdHM6YW5kLW5vdC1xdWVyeXxjc3M6Z2V0fGNzczpjb252ZXJ0fGNwZjpzdWNjZXNzfGNwZjpmYWlsdXJlfGNwZjpkb2N1bWVudC1zZXQtc3RhdGV8Y3BmOmRvY3VtZW50LXNldC1wcm9jZXNzaW5nLXN0YXR1c3xjcGY6ZG9jdW1lbnQtc2V0LWxhc3QtdXBkYXRlZHxjcGY6ZG9jdW1lbnQtc2V0LWVycm9yfGNwZjpkb2N1bWVudC1nZXQtc3RhdGV8Y3BmOmRvY3VtZW50LWdldC1wcm9jZXNzaW5nLXN0YXR1c3xjcGY6ZG9jdW1lbnQtZ2V0LWxhc3QtdXBkYXRlZHxjcGY6ZG9jdW1lbnQtZ2V0LWVycm9yfGNwZjpjaGVjay10cmFuc2l0aW9ufGFsZXJ0OnNwYXduLW1hdGNoaW5nLWFjdGlvbnN8YWxlcnQ6cnVsZS11c2VyLWlkLXF1ZXJ5fGFsZXJ0OnJ1bGUtc2V0LXVzZXItaWR8YWxlcnQ6cnVsZS1zZXQtcXVlcnl8YWxlcnQ6cnVsZS1zZXQtb3B0aW9uc3xhbGVydDpydWxlLXNldC1uYW1lfGFsZXJ0OnJ1bGUtc2V0LWRlc2NyaXB0aW9ufGFsZXJ0OnJ1bGUtc2V0LWFjdGlvbnxhbGVydDpydWxlLXJlbW92ZXxhbGVydDpydWxlLW5hbWUtcXVlcnl8YWxlcnQ6cnVsZS1pbnNlcnR8YWxlcnQ6cnVsZS1pZC1xdWVyeXxhbGVydDpydWxlLWdldC11c2VyLWlkfGFsZXJ0OnJ1bGUtZ2V0LXF1ZXJ5fGFsZXJ0OnJ1bGUtZ2V0LW9wdGlvbnN8YWxlcnQ6cnVsZS1nZXQtbmFtZXxhbGVydDpydWxlLWdldC1pZHxhbGVydDpydWxlLWdldC1kZXNjcmlwdGlvbnxhbGVydDpydWxlLWdldC1hY3Rpb258YWxlcnQ6cnVsZS1hY3Rpb24tcXVlcnl8YWxlcnQ6cmVtb3ZlLXRyaWdnZXJzfGFsZXJ0Om1ha2UtcnVsZXxhbGVydDptYWtlLWxvZy1hY3Rpb258YWxlcnQ6bWFrZS1jb25maWd8YWxlcnQ6bWFrZS1hY3Rpb258YWxlcnQ6aW52b2tlLW1hdGNoaW5nLWFjdGlvbnN8YWxlcnQ6Z2V0LW15LXJ1bGVzfGFsZXJ0OmdldC1hbGwtcnVsZXN8YWxlcnQ6Z2V0LWFjdGlvbnN8YWxlcnQ6ZmluZC1tYXRjaGluZy1ydWxlc3xhbGVydDpjcmVhdGUtdHJpZ2dlcnN8YWxlcnQ6Y29uZmlnLXNldC11cml8YWxlcnQ6Y29uZmlnLXNldC10cmlnZ2VyLWlkc3xhbGVydDpjb25maWctc2V0LW9wdGlvbnN8YWxlcnQ6Y29uZmlnLXNldC1uYW1lfGFsZXJ0OmNvbmZpZy1zZXQtZGVzY3JpcHRpb258YWxlcnQ6Y29uZmlnLXNldC1jcGYtZG9tYWluLW5hbWVzfGFsZXJ0OmNvbmZpZy1zZXQtY3BmLWRvbWFpbi1pZHN8YWxlcnQ6Y29uZmlnLWluc2VydHxhbGVydDpjb25maWctZ2V0LXVyaXxhbGVydDpjb25maWctZ2V0LXRyaWdnZXItaWRzfGFsZXJ0OmNvbmZpZy1nZXQtb3B0aW9uc3xhbGVydDpjb25maWctZ2V0LW5hbWV8YWxlcnQ6Y29uZmlnLWdldC1pZHxhbGVydDpjb25maWctZ2V0LWRlc2NyaXB0aW9ufGFsZXJ0OmNvbmZpZy1nZXQtY3BmLWRvbWFpbi1uYW1lc3xhbGVydDpjb25maWctZ2V0LWNwZi1kb21haW4taWRzfGFsZXJ0OmNvbmZpZy1nZXR8YWxlcnQ6Y29uZmlnLWRlbGV0ZXxhbGVydDphY3Rpb24tc2V0LW9wdGlvbnN8YWxlcnQ6YWN0aW9uLXNldC1uYW1lfGFsZXJ0OmFjdGlvbi1zZXQtbW9kdWxlLXJvb3R8YWxlcnQ6YWN0aW9uLXNldC1tb2R1bGUtZGJ8YWxlcnQ6YWN0aW9uLXNldC1tb2R1bGV8YWxlcnQ6YWN0aW9uLXNldC1kZXNjcmlwdGlvbnxhbGVydDphY3Rpb24tcmVtb3ZlfGFsZXJ0OmFjdGlvbi1pbnNlcnR8YWxlcnQ6YWN0aW9uLWdldC1vcHRpb25zfGFsZXJ0OmFjdGlvbi1nZXQtbmFtZXxhbGVydDphY3Rpb24tZ2V0LW1vZHVsZS1yb290fGFsZXJ0OmFjdGlvbi1nZXQtbW9kdWxlLWRifGFsZXJ0OmFjdGlvbi1nZXQtbW9kdWxlfGFsZXJ0OmFjdGlvbi1nZXQtZGVzY3JpcHRpb258emVyby1vci1vbmV8eWVhcnMtZnJvbS1kdXJhdGlvbnx5ZWFyLWZyb20tZGF0ZVRpbWV8eWVhci1mcm9tLWRhdGV8dXBwZXItY2FzZXx1bm9yZGVyZWR8dHJ1ZXx0cmFuc2xhdGV8dHJhY2V8dG9rZW5pemV8dGltZXpvbmUtZnJvbS10aW1lfHRpbWV6b25lLWZyb20tZGF0ZVRpbWV8dGltZXpvbmUtZnJvbS1kYXRlfHN1bXxzdWJ0cmFjdC1kYXRlVGltZXMteWllbGRpbmcteWVhck1vbnRoRHVyYXRpb258c3VidHJhY3QtZGF0ZVRpbWVzLXlpZWxkaW5nLWRheVRpbWVEdXJhdGlvbnxzdWJzdHJpbmctYmVmb3JlfHN1YnN0cmluZy1hZnRlcnxzdWJzdHJpbmd8c3Vic2VxdWVuY2V8c3RyaW5nLXRvLWNvZGVwb2ludHN8c3RyaW5nLXBhZHxzdHJpbmctbGVuZ3RofHN0cmluZy1qb2lufHN0cmluZ3xzdGF0aWMtYmFzZS11cml8c3RhcnRzLXdpdGh8c2Vjb25kcy1mcm9tLXRpbWV8c2Vjb25kcy1mcm9tLWR1cmF0aW9ufHNlY29uZHMtZnJvbS1kYXRlVGltZXxyb3VuZC1oYWxmLXRvLWV2ZW58cm91bmR8cm9vdHxyZXZlcnNlfHJlc29sdmUtdXJpfHJlc29sdmUtUU5hbWV8cmVwbGFjZXxyZW1vdmV8UU5hbWV8cHJlZml4LWZyb20tUU5hbWV8cG9zaXRpb258b25lLW9yLW1vcmV8bnVtYmVyfG5vdHxub3JtYWxpemUtdW5pY29kZXxub3JtYWxpemUtc3BhY2V8bm9kZS1uYW1lfG5vZGUta2luZHxuaWxsZWR8bmFtZXNwYWNlLXVyaS1mcm9tLVFOYW1lfG5hbWVzcGFjZS11cmktZm9yLXByZWZpeHxuYW1lc3BhY2UtdXJpfG5hbWV8bW9udGhzLWZyb20tZHVyYXRpb258bW9udGgtZnJvbS1kYXRlVGltZXxtb250aC1mcm9tLWRhdGV8bWludXRlcy1mcm9tLXRpbWV8bWludXRlcy1mcm9tLWR1cmF0aW9ufG1pbnV0ZXMtZnJvbS1kYXRlVGltZXxtaW58bWF4fG1hdGNoZXN8bG93ZXItY2FzZXxsb2NhbC1uYW1lLWZyb20tUU5hbWV8bG9jYWwtbmFtZXxsYXN0fGxhbmd8aXJpLXRvLXVyaXxpbnNlcnQtYmVmb3JlfGluZGV4LW9mfGluLXNjb3BlLXByZWZpeGVzfGltcGxpY2l0LXRpbWV6b25lfGlkcmVmfGlkfGhvdXJzLWZyb20tdGltZXxob3Vycy1mcm9tLWR1cmF0aW9ufGhvdXJzLWZyb20tZGF0ZVRpbWV8Zmxvb3J8ZmFsc2V8ZXhwYW5kZWQtUU5hbWV8ZXhpc3RzfGV4YWN0bHktb25lfGVzY2FwZS11cml8ZXNjYXBlLWh0bWwtdXJpfGVycm9yfGVuZHMtd2l0aHxlbmNvZGUtZm9yLXVyaXxlbXB0eXxkb2N1bWVudC11cml8ZG9jLWF2YWlsYWJsZXxkb2N8ZGlzdGluY3QtdmFsdWVzfGRpc3RpbmN0LW5vZGVzfGRlZmF1bHQtY29sbGF0aW9ufGRlZXAtZXF1YWx8ZGF5cy1mcm9tLWR1cmF0aW9ufGRheS1mcm9tLWRhdGVUaW1lfGRheS1mcm9tLWRhdGV8ZGF0YXxjdXJyZW50LXRpbWV8Y3VycmVudC1kYXRlVGltZXxjdXJyZW50LWRhdGV8Y291bnR8Y29udGFpbnN8Y29uY2F0fGNvbXBhcmV8Y29sbGVjdGlvbnxjb2RlcG9pbnRzLXRvLXN0cmluZ3xjb2RlcG9pbnQtZXF1YWx8Y2VpbGluZ3xib29sZWFufGJhc2UtdXJpfGF2Z3xhZGp1c3QtdGltZS10by10aW1lem9uZXxhZGp1c3QtZGF0ZVRpbWUtdG8tdGltZXpvbmV8YWRqdXN0LWRhdGUtdG8tdGltZXpvbmV8YWJzKVxiL10sCitbInBsbiIsL15bXHc6LV0rL10sWyJwbG4iLC9eW1x0XG5cciBceGEwXSsvXV0pLFsieHEiLCJ4cXVlcnkiXSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXlhbWwuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9sYW5nLXlhbWwuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4NzI5YgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L2xhbmcteWFtbC5qcwpAQCAtMCwwICsxLDIgQEAKK3ZhciBhPW51bGw7CitQUi5yZWdpc3RlckxhbmdIYW5kbGVyKFBSLmNyZWF0ZVNpbXBsZUxleGVyKFtbInB1biIsL15bOj4/fF0rLyxhLCI6fD4/Il0sWyJkZWMiLC9eJSg/OllBTUx8VEFHKVteXG5cciNdKy8sYSwiJSJdLFsidHlwIiwvXiZcUysvLGEsIiYiXSxbInR5cCIsL14hXFMqLyxhLCIhIl0sWyJzdHIiLC9eIig/OlteIlxcXXxcXC4pKig/OiJ8JCkvLGEsJyInXSxbInN0ciIsL14nKD86W14nXXwnJykqKD86J3wkKS8sYSwiJyJdLFsiY29tIiwvXiNbXlxuXHJdKi8sYSwiIyJdLFsicGxuIiwvXlxzKy8sYSwiIFx0XHJcbiJdXSxbWyJkZWMiLC9eKD86LS0tfFwuXC5cLikoPzpbXG5ccl18JCkvXSxbInB1biIsL14tL10sWyJrd2QiLC9eXHcrOltcblxyIF0vXSxbInBsbiIsL15cdysvXV0pLFsieWFtbCIsInltbCJdKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L3ByZXR0aWZ5LmNzcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L3ByZXR0aWZ5LmNzcwppbmRleCAyNmUzZTI2Li40YmZkYThlIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9wcmV0dGlmeS5jc3MKKysrIGIvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvcHJldHRpZnkuY3NzCkBAIC0xLDQwICsxLDUzIEBACiAvKiBQcmV0dHkgcHJpbnRpbmcgc3R5bGVzLiBVc2VkIHdpdGggcHJldHRpZnkuanMuICovCitAZXh0ZXJuYWwgLio7CiAKLUBleHRlcm5hbCAuc3RyOwotQGV4dGVybmFsIC5rd2Q7Ci1AZXh0ZXJuYWwgLmNvbTsKLUBleHRlcm5hbCAudHlwOwotQGV4dGVybmFsIC5saXQ7Ci1AZXh0ZXJuYWwgLnB1bjsKLUBleHRlcm5hbCAucGxuOwotQGV4dGVybmFsIC50YWc7Ci1AZXh0ZXJuYWwgLmF0bjsKLUBleHRlcm5hbCAuYXR2OwotQGV4dGVybmFsIC5kZWM7Ci1AZXh0ZXJuYWwgLnByZXR0eXByaW50OworLyogU1BBTiBlbGVtZW50cyB3aXRoIHRoZSBjbGFzc2VzIGJlbG93IGFyZSBhZGRlZCBieSBwcmV0dHlwcmludC4gKi8KKy5wbG4geyBjb2xvcjogIzAwMCB9ICAvKiBwbGFpbiB0ZXh0ICovCiAKLS5zdHIgeyBjb2xvcjogIzA4MDsgfQotLmt3ZCB7IGNvbG9yOiAjMDA4OyB9Ci0uY29tIHsgY29sb3I6ICM4MDA7IH0KLS50eXAgeyBjb2xvcjogIzYwNjsgfQotLmxpdCB7IGNvbG9yOiAjMDY2OyB9Ci0ucHVuIHsgY29sb3I6ICM2NjA7IH0KLS5wbG4geyBjb2xvcjogIzAwMDsgfQotLnRhZyB7IGNvbG9yOiAjMDA4OyB9Ci0uYXRuIHsgY29sb3I6ICM2MDY7IH0KLS5hdHYgeyBjb2xvcjogIzA4MDsgfQotLmRlYyB7IGNvbG9yOiAjNjA2OyB9Ci1wcmUucHJldHR5cHJpbnQgeyBwYWRkaW5nOiAycHg7IGJvcmRlcjogMXB4IHNvbGlkICM4ODg7IH0KLQotQG1lZGlhIHByaW50IHsKLSAgLnN0ciB7IGNvbG9yOiAjMDYwOyB9Ci0gIC5rd2QgeyBjb2xvcjogIzAwNjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLSAgLmNvbSB7IGNvbG9yOiAjNjAwOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLSAgLnR5cCB7IGNvbG9yOiAjNDA0OyBmb250LXdlaWdodDogYm9sZDsgfQotICAubGl0IHsgY29sb3I6ICMwNDQ7IH0KLSAgLnB1biB7IGNvbG9yOiAjNDQwOyB9Ci0gIC5wbG4geyBjb2xvcjogIzAwMDsgfQotICAudGFnIHsgY29sb3I6ICMwMDY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0gIC5hdG4geyBjb2xvcjogIzQwNDsgfQotICAuYXR2IHsgY29sb3I6ICMwNjA7IH0KK0BtZWRpYSBzY3JlZW4geworICAuc3RyIHsgY29sb3I6ICMwODAgfSAgLyogc3RyaW5nIGNvbnRlbnQgKi8KKyAgLmt3ZCB7IGNvbG9yOiAjMDA4IH0gIC8qIGEga2V5d29yZCAqLworICAuY29tIHsgY29sb3I6ICM4MDAgfSAgLyogYSBjb21tZW50ICovCisgIC50eXAgeyBjb2xvcjogIzYwNiB9ICAvKiBhIHR5cGUgbmFtZSAqLworICAubGl0IHsgY29sb3I6ICMwNjYgfSAgLyogYSBsaXRlcmFsIHZhbHVlICovCisgIC8qIHB1bmN0dWF0aW9uLCBsaXNwIG9wZW4gYnJhY2tldCwgbGlzcCBjbG9zZSBicmFja2V0ICovCisgIC5wdW4sIC5vcG4sIC5jbG8geyBjb2xvcjogIzY2MCB9CisgIC50YWcgeyBjb2xvcjogIzAwOCB9ICAvKiBhIG1hcmt1cCB0YWcgbmFtZSAqLworICAuYXRuIHsgY29sb3I6ICM2MDYgfSAgLyogYSBtYXJrdXAgYXR0cmlidXRlIG5hbWUgKi8KKyAgLmF0diB7IGNvbG9yOiAjMDgwIH0gIC8qIGEgbWFya3VwIGF0dHJpYnV0ZSB2YWx1ZSAqLworICAuZGVjLCAudmFyIHsgY29sb3I6ICM2MDYgfSAgLyogYSBkZWNsYXJhdGlvbjsgYSB2YXJpYWJsZSBuYW1lICovCisgIC5mdW4geyBjb2xvcjogcmVkIH0gIC8qIGEgZnVuY3Rpb24gbmFtZSAqLwogfQorCisvKiBVc2UgaGlnaGVyIGNvbnRyYXN0IGFuZCB0ZXh0LXdlaWdodCBmb3IgcHJpbnRhYmxlIGZvcm0uICovCitAbWVkaWEgcHJpbnQsIHByb2plY3Rpb24geworICAuc3RyIHsgY29sb3I6ICMwNjAgfQorICAua3dkIHsgY29sb3I6ICMwMDY7IGZvbnQtd2VpZ2h0OiBib2xkIH0KKyAgLmNvbSB7IGNvbG9yOiAjNjAwOyBmb250LXN0eWxlOiBpdGFsaWMgfQorICAudHlwIHsgY29sb3I6ICM0MDQ7IGZvbnQtd2VpZ2h0OiBib2xkIH0KKyAgLmxpdCB7IGNvbG9yOiAjMDQ0IH0KKyAgLnB1biwgLm9wbiwgLmNsbyB7IGNvbG9yOiAjNDQwIH0KKyAgLnRhZyB7IGNvbG9yOiAjMDA2OyBmb250LXdlaWdodDogYm9sZCB9CisgIC5hdG4geyBjb2xvcjogIzQwNCB9CisgIC5hdHYgeyBjb2xvcjogIzA2MCB9Cit9CisKKy8qIFB1dCBhIGJvcmRlciBhcm91bmQgcHJldHR5cHJpbnRlZCBjb2RlIHNuaXBwZXRzLiAqLworcHJlLnByZXR0eXByaW50IHsgcGFkZGluZzogMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjODg4IH0KKworLyogU3BlY2lmeSBjbGFzcz1saW5lbnVtcyBvbiBhIHByZSB0byBnZXQgbGluZSBudW1iZXJpbmcgKi8KK29sLmxpbmVudW1zIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IC8qIElFIGluZGVudHMgdmlhIG1hcmdpbi1sZWZ0ICovCitsaS5MMCwKK2xpLkwxLAorbGkuTDIsCitsaS5MMywKK2xpLkw1LAorbGkuTDYsCitsaS5MNywKK2xpLkw4IHsgbGlzdC1zdHlsZS10eXBlOiBub25lIH0KKy8qIEFsdGVybmF0ZSBzaGFkaW5nIGZvciBsaW5lcyAqLworbGkuTDEsCitsaS5MMywKK2xpLkw1LAorbGkuTDcsCitsaS5MOSB7IGJhY2tncm91bmQ6ICNlZWUgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvcHJldHRpZnkuanMgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9wcmV0dGlmeS5qcwppbmRleCAyOWI1ZTczLi40ODI3YmMzIDEwMDY0NAotLS0gYS9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9wcmV0dGlmeS5qcworKysgYi9nZXJyaXQtcHJldHRpZnkvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3ByZXR0aWZ5L2NsaWVudC9wcmV0dGlmeS5qcwpAQCAtMSw0NiArMSwyOCBAQAotd2luZG93LlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OPXRydWUsd2luZG93LlBSX1RBQl9XSURUSD04LHdpbmRvdy5QUl9ub3JtYWxpemVkSHRtbD13aW5kb3cuUFI9d2luZG93LnByZXR0eVByaW50T25lPXdpbmRvdy5wcmV0dHlQcmludD12b2lkCi0wLHdpbmRvdy5fcHJfaXNJRTY9ZnVuY3Rpb24oKXt2YXIgYT1uYXZpZ2F0b3ImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1xiTVNJRSAoWzY3OF0pXC4vKTtyZXR1cm4gYT1hPythWzFdOmZhbHNlLHdpbmRvdy5fcHJfaXNJRTY9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sYX0sKGZ1bmN0aW9uKCl7dmFyCi1hPXRydWUsYj1udWxsLGM9J2JyZWFrIGNvbnRpbnVlIGRvIGVsc2UgZm9yIGlmIHJldHVybiB3aGlsZSBhdXRvIGNhc2UgY2hhciBjb25zdCBkZWZhdWx0IGRvdWJsZSBlbnVtIGV4dGVybiBmbG9hdCBnb3RvIGludCBsb25nIHJlZ2lzdGVyIHNob3J0IHNpZ25lZCBzaXplb2Ygc3RhdGljIHN0cnVjdCBzd2l0Y2ggdHlwZWRlZiB1bmlvbiB1bnNpZ25lZCB2b2lkIHZvbGF0aWxlIGNhdGNoIGNsYXNzIGRlbGV0ZSBmYWxzZSBpbXBvcnQgbmV3IG9wZXJhdG9yIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyB0aGlzIHRocm93IHRydWUgdHJ5IHR5cGVvZiAnLGQ9YysnYWxpZ25vZiBhbGlnbl91bmlvbiBhc20gYXhpb20gYm9vbCAnKydjb25jZXB0IGNvbmNlcHRfbWFwIGNvbnN0X2Nhc3QgY29uc3RleHByIGRlY2x0eXBlICcrJ2R5bmFtaWNfY2FzdCBleHBsaWNpdCBleHBvcnQgZnJpZW5kIGlubGluZSBsYXRlX2NoZWNrICcrJ211dGFibGUgbmFtZXNwYWNlIG51bGxwdHIgcmVpbnRlcnByZXRfY2FzdCBzdGF0aWNfYXNzZXJ0IHN0YXRpY19jYXN0ICcrJ3RlbXBsYXRlIHR5cGVpZCB0eXBlbmFtZSB1c2luZyB2aXJ0dWFsIHdjaGFyX3Qgd2hlcmUgJyxlPWMrJ2Fic3RyYWN0IGJvb2xlYW4gYnl0ZSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgaW1wbGVtZW50cyBpbXBvcnQgJysnaW5zdGFuY2VvZiBudWxsIG5hdGl2ZSBwYWNrYWdlIHN0cmljdGZwIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MgJysndHJhbnNpZW50ICcsZj1lKydhcyBiYXNlIGJ5IGNoZWNrZWQgZGVjaW1hbCBkZWxlZ2F0ZSBkZXNjZW5kaW5nIGV2ZW50ICcrJ2ZpeGVkIGZvcmVhY2ggZnJvbSBncm91cCBpbXBsaWNpdCBpbiBpbnRlcmZhY2UgaW50ZXJuYWwgaW50byBpcyBsb2NrICcrJ29iamVjdCBvdXQgb3ZlcnJpZGUgb3JkZXJieSBwYXJhbXMgcGFydGlhbCByZWFkb25seSByZWYgc2J5dGUgc2VhbGVkICcrJ3N0YWNrYWxsb2Mgc3RyaW5nIHNlbGVjdCB1aW50IHVsb25nIHVuY2hlY2tlZCB1bnNhZmUgdXNob3J0IHZhciAnLGc9YysnZGVidWdnZXIgZXZhbCBleHBvcnQgZnVuY3Rpb24gZ2V0IG51bGwgc2V0IHVuZGVmaW5lZCB2YXIgd2l0aCAnKydJbmZpbml0eSBOYU4gJyxoPSdjYWxsZXIgZGVsZXRlIGRpZSBkbyBkdW1wIGVsc2lmIGV2YWwgZXhpdCBmb3JlYWNoIGZvciBnb3RvIGlmIGltcG9ydCBsYXN0IGxvY2FsIG15IG5leHQgbm8gb3VyIHByaW50IHBhY2thZ2UgcmVkbyByZXF1aXJlIHN1YiB1bmRlZiB1bmxlc3MgdW50aWwgdXNlIHdhbnRhcnJheSB3aGlsZSBCRUdJTiBFTkQgJyxpPSdicmVhayBjb250aW51ZSBkbyBlbHNlIGZvciBpZiByZXR1cm4gd2hpbGUgYW5kIGFzIGFzc2VydCBjbGFzcyBkZWYgZGVsIGVsaWYgZXhjZXB0IGV4ZWMgZmluYWxseSBmcm9tIGdsb2JhbCBpbXBvcnQgaW4gaXMgbGFtYmRhIG5vbmxvY2FsIG5vdCBvciBwYXNzIHByaW50IHJhaXNlIHRyeSB3aXRoIHlpZWxkIEZhbHNlIFRydWUgTm9uZSAnLGo9J2JyZWFrIGNvbnRpbnVlIGRvIGVsc2UgZm9yIGlmIHJldHVybiB3aGlsZSBhbGlhcyBhbmQgYmVnaW4gY2FzZSBjbGFzcyBkZWYgZGVmaW5lZCBlbHNpZiBlbmQgZW5zdXJlIGZhbHNlIGluIG1vZHVsZSBuZXh0IG5pbCBub3Qgb3IgcmVkbyByZXNjdWUgcmV0cnkgc2VsZiBzdXBlciB0aGVuIHRydWUgdW5kZWYgdW5sZXNzIHVudGlsIHdoZW4geWllbGQgQkVHSU4gRU5EICcsaz0nYnJlYWsgY29udGludWUgZG8gZWxzZSBmb3IgaWYgcmV0dXJuIHdoaWxlIGNhc2UgZG9uZSBlbGlmIGVzYWMgZXZhbCBmaSBmdW5jdGlvbiBpbiBsb2NhbCBzZXQgdGhlbiB1bnRpbCAnLGw9ZCtmK2craCtpK2orayxtPShmdW5jdGlvbigpe3ZhcgotYT1bJyEnLCchPScsJyE9PScsJyMnLCclJywnJT0nLCcmJywnJiYnLCcmJj0nLCcmPScsJygnLCcqJywnKj0nLCcrPScsJywnLCctPScsJy0+JywnLycsJy89JywnOicsJzo6JywnOycsJzwnLCc8PCcsJzw8PScsJzw9JywnPScsJz09JywnPT09JywnPicsJz49JywnPj4nLCc+Pj0nLCc+Pj4nLCc+Pj49JywnPycsJ0AnLCdbJywnXicsJ149JywnXl4nLCdeXj0nLCd7JywnfCcsJ3w9JywnfHwnLCd8fD0nLCd+JywnYnJlYWsnLCdjYXNlJywnY29udGludWUnLCdkZWxldGUnLCdkbycsJ2Vsc2UnLCdmaW5hbGx5JywnaW5zdGFuY2VvZicsJ3JldHVybicsJ3Rocm93JywndHJ5JywndHlwZW9mJ10sYj0nKD86Xl58WystXScsYztmb3IoYz0wO2M8YS5sZW5ndGg7KytjKWIrPSd8JythW2NdLnJlcGxhY2UoLyhbXj08PjomYS16XSkvZywnXFwkMScpO3JldHVybiBiKz0nKVxccyonLGJ9KSgpLG49LyYvZyxvPS88L2cscD0vPi9nLHE9L1wiL2cscixzLHQsdSx2LHcseCx5LHosQSxCLEMsRCxFLEY7ZnVuY3Rpb24KLUcoYSl7cmV0dXJuIGEucmVwbGFjZShuLCcmYW1wOycpLnJlcGxhY2UobywnJmx0OycpLnJlcGxhY2UocCwnJmd0OycpLnJlcGxhY2UocSwnJnF1b3Q7Jyl9ZnVuY3Rpb24KLUgoYSl7cmV0dXJuIGEucmVwbGFjZShuLCcmYW1wOycpLnJlcGxhY2UobywnJmx0OycpLnJlcGxhY2UocCwnJmd0OycpfUM9LyZsdDsvZyxCPS8mZ3Q7L2csdz0vJmFwb3M7L2csRT0vJnF1b3Q7L2csdj0vJmFtcDsvZyxEPS8mbmJzcDsvZztmdW5jdGlvbgotSShhKXt2YXIgYj1hLmluZGV4T2YoJyYnKSxjLGQsZSxmO2lmKGI8MClyZXR1cm4gYTtmb3IoLS1iOyhiPWEuaW5kZXhPZignJiMnLGIrMSkpPj0wOylkPWEuaW5kZXhPZignOycsYiksZD49MCYmKGU9YS5zdWJzdHJpbmcoYiszLGQpLGY9MTAsZSYmZS5jaGFyQXQoMCk9PT0neCcmJihlPWUuc3Vic3RyaW5nKDEpLGY9MTYpLGM9cGFyc2VJbnQoZSxmKSxpc05hTihjKXx8KGE9YS5zdWJzdHJpbmcoMCxiKStTdHJpbmcuZnJvbUNoYXJDb2RlKGMpK2Euc3Vic3RyaW5nKGQrMSkpKTtyZXR1cm4gYS5yZXBsYWNlKEMsJzwnKS5yZXBsYWNlKEIsJz4nKS5yZXBsYWNlKHcsJ1wnJykucmVwbGFjZShFLCdcIicpLnJlcGxhY2UoRCwnICcpLnJlcGxhY2UodiwnJicpfWZ1bmN0aW9uCi1KKGEpe3JldHVybidYTVAnPT09YS50YWdOYW1lfXU9L1tcclxuXS9nO2Z1bmN0aW9uIEsoYyxkKXt2YXIgZTtyZXR1cm4nUFJFJz09PWMudGFnTmFtZT9hOnUudGVzdChkKT8oZT0nJyxjLmN1cnJlbnRTdHlsZT8oZT1jLmN1cnJlbnRTdHlsZS53aGl0ZVNwYWNlKTp3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUoYyxiKS53aGl0ZVNwYWNlKSwhZXx8ZT09PSdwcmUnKTphfWZ1bmN0aW9uCi1MKGEsYil7dmFyIGMsZCxlLGY7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTpmPWEudGFnTmFtZS50b0xvd2VyQ2FzZSgpLGIucHVzaCgnPCcsZik7Zm9yKGU9MDtlPGEuYXR0cmlidXRlcy5sZW5ndGg7KytlKXtjPWEuYXR0cmlidXRlc1tlXTtpZighYy5zcGVjaWZpZWQpY29udGludWU7Yi5wdXNoKCcgJyksTChjLGIpfWIucHVzaCgnPicpO2ZvcihkPWEuZmlyc3RDaGlsZDtkO2Q9ZC5uZXh0U2libGluZylMKGQsYik7KGEuZmlyc3RDaGlsZHx8IS9eKD86YnJ8bGlua3xpbWcpJC8udGVzdChmKSkmJmIucHVzaCgnPC8nLGYsJz4nKTticmVhaztjYXNlCi0yOmIucHVzaChhLm5hbWUudG9Mb3dlckNhc2UoKSwnPVwiJyxHKGEudmFsdWUpLCdcIicpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6Yi5wdXNoKEgoYS5ub2RlVmFsdWUpKX19ZnVuY3Rpb24KLU0oYil7dmFyIGM9MCxkPWZhbHNlLGU9ZmFsc2UsZixnLGgsaTtmb3IoZj0wLGc9Yi5sZW5ndGg7ZjxnOysrZil7aD1iW2ZdO2lmKGguaWdub3JlQ2FzZSllPWE7ZWxzZQotaWYoL1thLXpdL2kudGVzdChoLnNvdXJjZS5yZXBsYWNlKC9cXHVbMC05YS1mXXs0fXxcXHhbMC05YS1mXXsyfXxcXFtedXhdL2dpLCcnKSkpe2Q9YSxlPWZhbHNlO2JyZWFrfX1mdW5jdGlvbgotaihhKXtpZihhLmNoYXJBdCgwKSE9PSdcXCcpcmV0dXJuIGEuY2hhckNvZGVBdCgwKTtzd2l0Y2goYS5jaGFyQXQoMSkpe2Nhc2UnYic6cmV0dXJuIDg7Y2FzZSd0JzpyZXR1cm4gOTtjYXNlJ24nOnJldHVybiAxMDtjYXNlJ3YnOnJldHVybiAxMTtjYXNlJ2YnOnJldHVybiAxMjtjYXNlJ3InOnJldHVybiAxMztjYXNlJ3UnOmNhc2UneCc6cmV0dXJuIHBhcnNlSW50KGEuc3Vic3RyaW5nKDIpLDE2KXx8YS5jaGFyQ29kZUF0KDEpO2Nhc2UnMCc6Y2FzZScxJzpjYXNlJzInOmNhc2UnMyc6Y2FzZSc0JzpjYXNlJzUnOmNhc2UnNic6Y2FzZSc3JzpyZXR1cm4gcGFyc2VJbnQoYS5zdWJzdHJpbmcoMSksOCk7ZGVmYXVsdDpyZXR1cm4gYS5jaGFyQ29kZUF0KDEpfX1mdW5jdGlvbgotayhhKXt2YXIgYjtyZXR1cm4gYTwzMj8oYTwxNj8nXFx4MCc6J1xceCcpK2EudG9TdHJpbmcoMTYpOihiPVN0cmluZy5mcm9tQ2hhckNvZGUoYSksKGI9PT0nXFwnfHxiPT09Jy0nfHxiPT09J1snfHxiPT09J10nKSYmKGI9J1xcJytiKSxiKX1mdW5jdGlvbgotbChhKXt2YXIgYj1hLnN1YnN0cmluZygxLGEubGVuZ3RoLTEpLm1hdGNoKG5ldyBSZWdFeHAoJ1xcXFx1WzAtOUEtRmEtZl17NH18XFxcXHhbMC05QS1GYS1mXXsyfXxcXFxcWzAtM11bMC03XXswLDJ9fFxcXFxbMC03XXsxLDJ9fFxcXFxbXFxzXFxTXXwtfFteLVxcXFxdJywnZycpKSxjPVtdLGQ9W10sZT1iWzBdPT09J14nLGYsZyxoLGksbSxuLG8scCxxO2ZvcihoPWU/MTowLG09Yi5sZW5ndGg7aDxtOysraCl7bz1iW2hdO3N3aXRjaChvKXtjYXNlJ1xcQic6Y2FzZSdcXGInOmNhc2UnXFxEJzpjYXNlJ1xcZCc6Y2FzZSdcXFMnOmNhc2UnXFxzJzpjYXNlJ1xcVyc6Y2FzZSdcXHcnOmMucHVzaChvKTtjb250aW51ZX1xPWoobyksaCsyPG0mJictJz09PWJbaCsxXT8oZz1qKGJbaCsyXSksaCs9Mik6KGc9cSksZC5wdXNoKFtxLGddKSxnPDY1fHxxPjEyMnx8KGc8NjV8fHE+OTB8fGQucHVzaChbTWF0aC5tYXgoNjUscSl8MzIsTWF0aC5taW4oZyw5MCl8MzJdKSxnPDk3fHxxPjEyMnx8ZC5wdXNoKFtNYXRoLm1heCg5NyxxKSYtMzMsTWF0aC5taW4oZywxMjIpJi0zM10pKX1kLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYVswXS1iWzBdfHxiWzFdLWFbMV19KSxmPVtdLGk9W05hTixOYU5dO2ZvcihoPTA7aDxkLmxlbmd0aDsrK2gpcD1kW2hdLHBbMF08PWlbMV0rMT8oaVsxXT1NYXRoLm1heChpWzFdLHBbMV0pKTpmLnB1c2goaT1wKTtuPVsnWyddLGUmJm4ucHVzaCgnXicpLG4ucHVzaC5hcHBseShuLGMpO2ZvcihoPTA7aDxmLmxlbmd0aDsrK2gpcD1mW2hdLG4ucHVzaChrKHBbMF0pKSxwWzFdCi0+cFswXSYmKHBbMV0rMT5wWzBdJiZuLnB1c2goJy0nKSxuLnB1c2goayhwWzFdKSkpO3JldHVybiBuLnB1c2goJ10nKSxuLmpvaW4oJycpfWZ1bmN0aW9uCi1tKGEpe3ZhciBiPWEuc291cmNlLm1hdGNoKG5ldyBSZWdFeHAoJyg/OlxcWyg/OlteXFx4NUNcXHg1RF18XFxcXFtcXHNcXFNdKSpcXF18XFxcXHVbQS1GYS1mMC05XXs0fXxcXFxceFtBLUZhLWYwLTldezJ9fFxcXFxbMC05XSt8XFxcXFtedXgwLTldfFxcKFxcP1s6IT1dfFtcXChcXClcXF5dfFteXFx4NUJcXHg1Q1xcKFxcKVxcXl0rKScsJ2cnKSksZT1iLmxlbmd0aCxmPVtdLGcsaCxpLGosaztmb3Ioaj0wLGk9MDtqPGU7KytqKWs9YltqXSxrPT09JygnPysraTonXFwnPT09ay5jaGFyQXQoMCkmJihoPStrLnN1YnN0cmluZygxKSxoJiZoPD1pJiYoZltoXT0tMSkpO2ZvcihqPTE7ajxmLmxlbmd0aDsrK2opLTE9PT1mW2pdJiYoZltqXT0rK2MpO2ZvcihqPTAsaT0wO2o8ZTsrK2opaz1iW2pdLGs9PT0nKCc/KCsraSxmW2ldPT09dm9pZAotMCYmKGJbal09Jyg/OicpKTonXFwnPT09ay5jaGFyQXQoMCkmJihoPStrLnN1YnN0cmluZygxKSxoJiZoPD1pJiYoYltqXT0nXFwnK2ZbaV0pKTtmb3Ioaj0wLGk9MDtqPGU7KytqKSdeJz09PWJbal0mJideJyE9PWJbaisxXSYmKGJbal09JycpO2lmKGEuaWdub3JlQ2FzZSYmZClmb3Ioaj0wO2o8ZTsrK2opaz1iW2pdLGc9ay5jaGFyQXQoMCksay5sZW5ndGg+PTImJmc9PT0nWyc/KGJbal09bChrKSk6ZyE9PSdcXCcmJihiW2pdPWsucmVwbGFjZSgvW2EtekEtWl0vZyxmdW5jdGlvbihhKXt2YXIKLWI9YS5jaGFyQ29kZUF0KDApO3JldHVybidbJytTdHJpbmcuZnJvbUNoYXJDb2RlKGImLTMzLGJ8MzIpKyddJ30pKTtyZXR1cm4gYi5qb2luKCcnKX1pPVtdO2ZvcihmPTAsZz1iLmxlbmd0aDtmPGc7KytmKXtoPWJbZl07aWYoaC5nbG9iYWx8fGgubXVsdGlsaW5lKXRocm93IG5ldwotRXJyb3IoJycraCk7aS5wdXNoKCcoPzonK20oaCkrJyknKX1yZXR1cm4gbmV3IFJlZ0V4cChpLmpvaW4oJ3wnKSxlPydnaSc6J2cnKX1yPWI7ZnVuY3Rpb24KLU4oYSl7dmFyIGMsZCxlLGY7Yj09PXImJihmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1BSRScpLGYuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJzwhRE9DVFlQRSBmb28gUFVCTElDIFwiZm9vIGJhclwiPlxuPGZvbyAvPicpKSxyPSEvPC8udGVzdChmLmlubmVySFRNTCkpO2lmKHIpcmV0dXJuIGQ9YS5pbm5lckhUTUwsSihhKT8oZD1IKGQpKTpLKGEsZCl8fChkPWQucmVwbGFjZSgvKDxiclxzKlwvPz4pW1xyXG5dKy9nLCckMScpLnJlcGxhY2UoLyg/OltcclxuXStbIFx0XSopKy9nLCcgJykpLGQ7ZT1bXTtmb3IoYz1hLmZpcnN0Q2hpbGQ7YztjPWMubmV4dFNpYmxpbmcpTChjLGUpO3JldHVybiBlLmpvaW4oJycpfWZ1bmN0aW9uCi1PKGEpe3ZhciBjPTA7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWIsZj0wLGcsaCxpLGo7Zm9yKGg9MCxpPWQubGVuZ3RoO2g8aTsrK2gpe2c9ZC5jaGFyQXQoaCk7c3dpdGNoKGcpe2Nhc2UnCSc6ZXx8KGU9W10pLGUucHVzaChkLnN1YnN0cmluZyhmLGgpKSxqPWEtYyVhLGMrPWo7Zm9yKDtqPj0wO2otPScgICAgICAgICAgICAgICAgJy5sZW5ndGgpZS5wdXNoKCcgICAgICAgICAgICAgICAgJy5zdWJzdHJpbmcoMCxqKSk7Zj1oKzE7YnJlYWs7Y2FzZSdcbic6Yz0wO2JyZWFrO2RlZmF1bHQ6KytjfX1yZXR1cm4gZT8oZS5wdXNoKGQuc3Vic3RyaW5nKGYpKSxlLmpvaW4oJycpKTpkfX16PW5ldwotUmVnRXhwKCdbXjxdK3w8IS0tW1xcc1xcU10qPy0tPnw8IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT58PC8/W2EtekEtWl0oPzpbXj5cIlwnXXxcJ1teXCddKlwnfFwiW15cIl0qXCIpKj58PCcsJ2cnKSxBPS9ePFwhLS0vLHk9L148IVxbQ0RBVEFcWy8seD0vXjxiclxiL2ksRj0vXjwoXC8/KShbYS16QS1aXVthLXpBLVowLTldKikvO2Z1bmN0aW9uCi1QKGEpe3ZhciBiPWEubWF0Y2goeiksYz1bXSxkPTAsZT1bXSxmLGcsaCxpLGosayxsLG07aWYoYilmb3IoZz0wLGs9Yi5sZW5ndGg7ZzxrOysrZyl7aj1iW2ddO2lmKGoubGVuZ3RoPjEmJmouY2hhckF0KDApPT09JzwnKXtpZihBLnRlc3QoaikpY29udGludWU7aWYoeS50ZXN0KGopKWMucHVzaChqLnN1YnN0cmluZyg5LGoubGVuZ3RoLTMpKSxkKz1qLmxlbmd0aC0xMjtlbHNlCi1pZih4LnRlc3QoaikpYy5wdXNoKCdcbicpLCsrZDtlbHNlIGlmKGouaW5kZXhPZignbm9jb2RlJyk+PTAmJlEoaikpe2w9KGoubWF0Y2goRikpWzJdLGY9MTtmb3IoaD1nKzE7aDxrOysraCl7bT1iW2hdLm1hdGNoKEYpO2lmKG0mJm1bMl09PT1sKWlmKG1bMV09PT0nLycpe2lmKC0tZj09PTApYnJlYWt9ZWxzZSsrZn1oPGs/KGUucHVzaChkLGIuc2xpY2UoZyxoKzEpLmpvaW4oJycpKSxnPWgpOmUucHVzaChkLGopfWVsc2UKLWUucHVzaChkLGopfWVsc2UgaT1JKGopLGMucHVzaChpKSxkKz1pLmxlbmd0aH1yZXR1cm57c291cmNlOmMuam9pbignJyksdGFnczplfX1mdW5jdGlvbgotUShhKXtyZXR1cm4hIWEucmVwbGFjZSgvXHMoXHcrKVxzKj1ccyooPzpcIihbXlwiXSopXCJ8JyhbXlwnXSopJ3woXFMrKSkvZywnICQxPVwiJDIkMyQ0XCInKS5tYXRjaCgvW2NDXVtsTF1bYUFdW3NTXVtzU109XCJbXlwiXSpcYm5vY29kZVxiLyl9ZnVuY3Rpb24KLVIoYSxiLGMsZCl7dmFyIGU7aWYoIWIpcmV0dXJuO2U9e3NvdXJjZTpiLGJhc2VQb3M6YX0sYyhlKSxkLnB1c2guYXBwbHkoZCxlLmRlY29yYXRpb25zKX1mdW5jdGlvbgotUyhhLGMpe3ZhciBkPXt9LGUsZixnLGg7cmV0dXJuKGZ1bmN0aW9uKCl7dmFyIGU9YS5jb25jYXQoYyksZj1bXSxnPXt9LGksaixrLGwsbSxuLG87Zm9yKGo9MCxsPWUubGVuZ3RoO2o8bDsrK2ope209ZVtqXSxvPW1bM107aWYobylmb3IoaT1vLmxlbmd0aDstLWk+PTA7KWRbby5jaGFyQXQoaSldPW07bj1tWzFdLGs9JycrbixnLmhhc093blByb3BlcnR5KGspfHwoZi5wdXNoKG4pLGdba109Yil9Zi5wdXNoKC9bXDAtXHVmZmZmXS8pLGg9TShmKX0pKCksZj1jLmxlbmd0aCxnPS9cUy8sZT1mdW5jdGlvbihhKXt2YXIKLWI9YS5zb3VyY2UsZz1hLmJhc2VQb3MsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdSx2LHcseCx5O2k9W2csJ3BsbiddLHM9MCx5PWIubWF0Y2goaCl8fFtdLHU9e307Zm9yKHY9MCxxPXkubGVuZ3RoO3Y8cTsrK3Ype3c9eVt2XSx0PXVbd10scD12b2lkCi0wO2lmKHR5cGVvZiB0PT09J3N0cmluZycpbj1mYWxzZTtlbHNle3I9ZFt3LmNoYXJBdCgwKV07aWYocilwPXcubWF0Y2goclsxXSksdD1yWzBdO2Vsc2V7Zm9yKG09MDttPGY7KyttKXtyPWNbbV0scD13Lm1hdGNoKHJbMV0pO2lmKHApe3Q9clswXTticmVha319cHx8KHQ9J3BsbicpfW49dC5sZW5ndGg+PTUmJidsYW5nLSc9PT10LnN1YnN0cmluZygwLDUpLG4mJiEocCYmdHlwZW9mCi1wWzFdPT09J3N0cmluZycpJiYobj1mYWxzZSx0PSdzcmMnKSxufHwodVt3XT10KX14PXMscys9dy5sZW5ndGgsbj8oaj1wWzFdLGw9dy5pbmRleE9mKGopLGs9bCtqLmxlbmd0aCxwWzJdJiYoaz13Lmxlbmd0aC1wWzJdLmxlbmd0aCxsPWstai5sZW5ndGgpLG89dC5zdWJzdHJpbmcoNSksUihnK3gsdy5zdWJzdHJpbmcoMCxsKSxlLGkpLFIoZyt4K2wsaixXKG8saiksaSksUihnK3grayx3LnN1YnN0cmluZyhrKSxlLGkpKTppLnB1c2goZyt4LHQpfWEuZGVjb3JhdGlvbnM9aX0sZX1mdW5jdGlvbgotVChhKXt2YXIgYz1bXSxkPVtdLGUsZjtyZXR1cm4gYS50cmlwbGVRdW90ZWRTdHJpbmdzP2MucHVzaChbJ3N0cicsL14oPzpcJ1wnXCcoPzpbXlwnXFxdfFxcW1xzXFNdfFwnezEsMn0oPz1bXlwnXSkpKig/OlwnXCdcJ3wkKXxcIlwiXCIoPzpbXlwiXFxdfFxcW1xzXFNdfFwiezEsMn0oPz1bXlwiXSkpKig/OlwiXCJcInwkKXxcJyg/OlteXFxcJ118XFxbXHNcU10pKig/OlwnfCQpfFwiKD86W15cXFwiXXxcXFtcc1xTXSkqKD86XCJ8JCkpLyxiLCdcJ1wiJ10pOmEubXVsdGlMaW5lU3RyaW5ncz9jLnB1c2goWydzdHInLC9eKD86XCcoPzpbXlxcXCddfFxcW1xzXFNdKSooPzpcJ3wkKXxcIig/OlteXFxcIl18XFxbXHNcU10pKig/OlwifCQpfFxgKD86W15cXFxgXXxcXFtcc1xTXSkqKD86XGB8JCkpLyxiLCdcJ1wiYCddKTpjLnB1c2goWydzdHInLC9eKD86XCcoPzpbXlxcXCdcclxuXXxcXC4pKig/OlwnfCQpfFwiKD86W15cXFwiXHJcbl18XFwuKSooPzpcInwkKSkvLGIsJ1wiXCcnXSksYS52ZXJiYXRpbVN0cmluZ3MmJmQucHVzaChbJ3N0cicsL15AXCIoPzpbXlwiXXxcIlwiKSooPzpcInwkKS8sYl0pLGEuaGFzaENvbW1lbnRzJiYoYS5jU3R5bGVDb21tZW50cz8oYy5wdXNoKFsnY29tJywvXiMoPzooPzpkZWZpbmV8ZWxpZnxlbHNlfGVuZGlmfGVycm9yfGlmZGVmfGluY2x1ZGV8aWZuZGVmfGxpbmV8cHJhZ21hfHVuZGVmfHdhcm5pbmcpXGJ8W15cclxuXSopLyxiLCcjJ10pLGQucHVzaChbJ3N0cicsL148KD86KD86KD86XC5cLlwvKSp8XC8/KSg/Oltcdy1dKyg/OlwvW1x3LV0rKSspP1tcdy1dK1wuaHxbYS16XVx3Kik+LyxiXSkpOmMucHVzaChbJ2NvbScsL14jW15cclxuXSovLGIsJyMnXSkpLGEuY1N0eWxlQ29tbWVudHMmJihkLnB1c2goWydjb20nLC9eXC9cL1teXHJcbl0qLyxiXSksZC5wdXNoKFsnY29tJywvXlwvXCpbXHNcU10qPyg/OlwqXC98JCkvLGJdKSksYS5yZWdleExpdGVyYWxzJiYoZT0nLyg/PVteLypdKSg/OlteL1xceDVCXFx4NUNdfFxceDVDW1xcc1xcU118XFx4NUIoPzpbXlxceDVDXFx4NURdfFxceDVDW1xcc1xcU10pKig/OlxceDVEfCQpKSsvJyxkLnB1c2goWydsYW5nLXJlZ2V4JyxuZXcKLVJlZ0V4cCgnXicrbSsnKCcrZSsnKScpXSkpLGY9YS5rZXl3b3Jkcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywnJyksZi5sZW5ndGgmJmQucHVzaChbJ2t3ZCcsbmV3Ci1SZWdFeHAoJ14oPzonK2YucmVwbGFjZSgvXHMrL2csJ3wnKSsnKVxcYicpLGJdKSxjLnB1c2goWydwbG4nLC9eXHMrLyxiLCcgXHJcbglceGEwJ10pLGQucHVzaChbJ2xpdCcsL15AW2Etel8kXVthLXpfJEAwLTldKi9pLGJdLFsndHlwJywvXkA/W0EtWl0rW2Etel1bQS1aYS16XyRAMC05XSovLGJdLFsncGxuJywvXlthLXpfJF1bYS16XyRAMC05XSovaSxiXSxbJ2xpdCcsbmV3Ci1SZWdFeHAoJ14oPzoweFthLWYwLTldK3woPzpcXGQoPzpfXFxkKykqXFxkKig/OlxcLlxcZCopP3xcXC5cXGRcXCspKD86ZVsrXFwtXT9cXGQrKT8pW2Etel0qJywnaScpLGIsJzAxMjM0NTY3ODknXSxbJ3B1bicsL14uW15cc1x3XC4kQFwnXCJcYFwvXCNdKi8sYl0pLFMoYyxkKX1zPVQoe2tleXdvcmRzOmwsaGFzaENvbW1lbnRzOmEsY1N0eWxlQ29tbWVudHM6YSxtdWx0aUxpbmVTdHJpbmdzOmEscmVnZXhMaXRlcmFsczphfSk7ZnVuY3Rpb24KLVUoYyl7dmFyIGQ9Yy5zb3VyY2UsZT1jLmV4dHJhY3RlZFRhZ3MsZj1jLmRlY29yYXRpb25zLGc9W10saD0wLGk9YixqPWIsaz0wLGw9MCxtPU8od2luZG93LlBSX1RBQl9XSURUSCksbj0vKFtcclxuIF0pIC9nLG89LyhefCApIC9nbSxwPS9cclxuP3xcbi9nLHE9L1sgXHJcbl0kLyxyPWEscztmdW5jdGlvbgotdChhKXt2YXIgYyxlO2E+aCYmKGkmJmkhPT1qJiYoZy5wdXNoKCc8L3NwYW4+JyksaT1iKSwhaSYmaiYmKGk9aixnLnB1c2goJzxzcGFuIGNsYXNzPVwiJyxpLCdcIj4nKSksYz1IKG0oZC5zdWJzdHJpbmcoaCxhKSkpLnJlcGxhY2Uocj9vOm4sJyQxJm5ic3A7Jykscj1xLnRlc3QoYyksZT13aW5kb3cuX3ByX2lzSUU2KCk/JyZuYnNwOzxiciAvPic6JzxiciAvPicsZy5wdXNoKGMucmVwbGFjZShwLGUpKSxoPWEpfXdoaWxlKGEpe2s8ZS5sZW5ndGg/bDxmLmxlbmd0aD8ocz1lW2tdPD1mW2xdKToocz1hKToocz1mYWxzZSk7aWYocyl0KGVba10pLGkmJihnLnB1c2goJzwvc3Bhbj4nKSxpPWIpLGcucHVzaChlW2srMV0pLGsrPTI7ZWxzZQotaWYobDxmLmxlbmd0aCl0KGZbbF0pLGo9ZltsKzFdLGwrPTI7ZWxzZSBicmVha310KGQubGVuZ3RoKSxpJiZnLnB1c2goJzwvc3Bhbj4nKSxjLnByZXR0eVByaW50ZWRIdG1sPWcuam9pbignJyl9dD17fTtmdW5jdGlvbgotVihhLGIpe3ZhciBjLGQ7Zm9yKGQ9Yi5sZW5ndGg7LS1kPj0wOyljPWJbZF0sdC5oYXNPd25Qcm9wZXJ0eShjKT8nY29uc29sZSdpbiB3aW5kb3cmJmNvbnNvbGUud2FybignY2Fubm90IG92ZXJyaWRlIGxhbmd1YWdlIGhhbmRsZXIgJXMnLGMpOih0W2NdPWEpfWZ1bmN0aW9uCi1XKGEsYil7cmV0dXJuIGEmJnQuaGFzT3duUHJvcGVydHkoYSl8fChhPS9eXHMqPC8udGVzdChiKT8nZGVmYXVsdC1tYXJrdXAnOidkZWZhdWx0LWNvZGUnKSx0W2FdfVYocyxbJ2RlZmF1bHQtY29kZSddKSxWKFMoW10sW1sncGxuJywvXltePD9dKy9dLFsnZGVjJywvXjwhXHdbXj5dKig/Oj58JCkvXSxbJ2NvbScsL148XCEtLVtcc1xTXSo/KD86LVwtPnwkKS9dLFsnbGFuZy0nLC9ePFw/KFtcc1xTXSs/KSg/Olw/PnwkKS9dLFsnbGFuZy0nLC9ePCUoW1xzXFNdKz8pKD86JT58JCkvXSxbJ3B1bicsL14oPzo8WyU/XXxbJT9dPikvXSxbJ2xhbmctJywvXjx4bXBcYltePl0qPihbXHNcU10rPyk8XC94bXBcYltePl0qPi9pXSxbJ2xhbmctanMnLC9ePHNjcmlwdFxiW14+XSo+KFtcc1xTXSo/KSg8XC9zY3JpcHRcYltePl0qPikvaV0sWydsYW5nLWNzcycsL148c3R5bGVcYltePl0qPihbXHNcU10qPykoPFwvc3R5bGVcYltePl0qPikvaV0sWydsYW5nLWluLnRhZycsL14oPFwvP1thLXpdW148Pl0qPikvaV1dKSxbJ2RlZmF1bHQtbWFya3VwJywnaHRtJywnaHRtbCcsJ214bWwnLCd4aHRtbCcsJ3htbCcsJ3hzbCddKSxWKFMoW1sncGxuJywvXltcc10rLyxiLCcgCVxyXG4nXSxbJ2F0dicsL14oPzpcIlteXCJdKlwiP3xcJ1teXCddKlwnPykvLGIsJ1wiXCcnXV0sW1sndGFnJywvXl48XC8/W2Etel0oPzpbXHcuOi1dKlx3KT98XC8/PiQvaV0sWydhdG4nLC9eKD8hc3R5bGVbXHM9XXxvbilbYS16XSg/OltcdzotXSpcdyk/L2ldLFsnbGFuZy11cS52YWwnLC9ePVxzKihbXj5cJ1wiXHNdKig/OltePlwnXCJcc1wvXXxcLyg/PVxzKSkpL10sWydwdW4nLC9eWz08PlwvXSsvXSxbJ2xhbmctanMnLC9eb25cdytccyo9XHMqXCIoW15cIl0rKVwiL2ldLFsnbGFuZy1qcycsL15vblx3K1xzKj1ccypcJyhbXlwnXSspXCcvaV0sWydsYW5nLWpzJywvXm9uXHcrXHMqPVxzKihbXlwiXCc+XHNdKykvaV0sWydsYW5nLWNzcycsL15zdHlsZVxzKj1ccypcIihbXlwiXSspXCIvaV0sWydsYW5nLWNzcycsL15zdHlsZVxzKj1ccypcJyhbXlwnXSspXCcvaV0sWydsYW5nLWNzcycsL15zdHlsZVxzKj1ccyooW15cIlwnPlxzXSspL2ldXSksWydpbi50YWcnXSksVihTKFtdLFtbJ2F0dicsL15bXHNcU10rL11dKSxbJ3VxLnZhbCddKSxWKFQoe2tleXdvcmRzOmQsaGFzaENvbW1lbnRzOmEsY1N0eWxlQ29tbWVudHM6YX0pLFsnYycsJ2NjJywnY3BwJywnY3h4JywnY3ljJywnbSddKSxWKFQoe2tleXdvcmRzOidudWxsIHRydWUgZmFsc2UnfSksWydqc29uJ10pLFYoVCh7a2V5d29yZHM6ZixoYXNoQ29tbWVudHM6YSxjU3R5bGVDb21tZW50czphLHZlcmJhdGltU3RyaW5nczphfSksWydjcyddKSxWKFQoe2tleXdvcmRzOmUsY1N0eWxlQ29tbWVudHM6YX0pLFsnamF2YSddKSxWKFQoe2tleXdvcmRzOmssaGFzaENvbW1lbnRzOmEsbXVsdGlMaW5lU3RyaW5nczphfSksWydic2gnLCdjc2gnLCdzaCddKSxWKFQoe2tleXdvcmRzOmksaGFzaENvbW1lbnRzOmEsbXVsdGlMaW5lU3RyaW5nczphLHRyaXBsZVF1b3RlZFN0cmluZ3M6YX0pLFsnY3YnLCdweSddKSxWKFQoe2tleXdvcmRzOmgsaGFzaENvbW1lbnRzOmEsbXVsdGlMaW5lU3RyaW5nczphLHJlZ2V4TGl0ZXJhbHM6YX0pLFsncGVybCcsJ3BsJywncG0nXSksVihUKHtrZXl3b3JkczpqLGhhc2hDb21tZW50czphLG11bHRpTGluZVN0cmluZ3M6YSxyZWdleExpdGVyYWxzOmF9KSxbJ3JiJ10pLFYoVCh7a2V5d29yZHM6ZyxjU3R5bGVDb21tZW50czphLHJlZ2V4TGl0ZXJhbHM6YX0pLFsnanMnXSksVihTKFtdLFtbJ3N0cicsL15bXHNcU10rL11dKSxbJ3JlZ2V4J10pO2Z1bmN0aW9uCi1YKGEpe3ZhciBiPWEuc291cmNlQ29kZUh0bWwsYz1hLmxhbmdFeHRlbnNpb24sZCxlO2EucHJldHR5UHJpbnRlZEh0bWw9Yjt0cnl7ZT1QKGIpLGQ9ZS5zb3VyY2UsYS5zb3VyY2U9ZCxhLmJhc2VQb3M9MCxhLmV4dHJhY3RlZFRhZ3M9ZS50YWdzLFcoYyxkKShhKSxVKGEpfWNhdGNoKGYpeydjb25zb2xlJ2luCi13aW5kb3cmJihjb25zb2xlLmxvZyhmKSxjb25zb2xlLnRyYWNlKCkpfX1mdW5jdGlvbiBZKGEsYil7dmFyIGM9e3NvdXJjZUNvZGVIdG1sOmEsbGFuZ0V4dGVuc2lvbjpifTtyZXR1cm4gWChjKSxjLnByZXR0eVByaW50ZWRIdG1sfWZ1bmN0aW9uCi1aKGMpe3ZhciBkPXdpbmRvdy5fcHJfaXNJRTYoKSxlPWQ9PT02PydcclxuJzonXHInLGY9W2RvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwcmUnKSxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnY29kZScpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd4bXAnKV0sZz1bXSxoLGksaixrLGwsbTtmb3IoaT0wO2k8Zi5sZW5ndGg7KytpKWZvcihqPTAsbD1mW2ldLmxlbmd0aDtqPGw7KytqKWcucHVzaChmW2ldW2pdKTtmPWIsaD1EYXRlLGgubm93fHwoaD17bm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldwotRGF0ZSkuZ2V0VGltZSgpfX0pLGs9MDtmdW5jdGlvbiBuKCl7dmFyIGI9d2luZG93LlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OP2gubm93KCkrMjUwOkluZmluaXR5LGQsZSxmLGksajtmb3IoO2s8Zy5sZW5ndGgmJmgubm93KCk8YjsrK2spe2U9Z1trXTtpZihlLmNsYXNzTmFtZSYmZS5jbGFzc05hbWUuaW5kZXhPZigncHJldHR5cHJpbnQnKT49MCl7Zj1lLmNsYXNzTmFtZS5tYXRjaCgvXGJsYW5nLShcdyspXGIvKSxmJiYoZj1mWzFdKSxpPWZhbHNlO2ZvcihqPWUucGFyZW50Tm9kZTtqO2o9ai5wYXJlbnROb2RlKWlmKChqLnRhZ05hbWU9PT0ncHJlJ3x8ai50YWdOYW1lPT09J2NvZGUnfHxqLnRhZ05hbWU9PT0neG1wJykmJmouY2xhc3NOYW1lJiZqLmNsYXNzTmFtZS5pbmRleE9mKCdwcmV0dHlwcmludCcpPj0wKXtpPWE7YnJlYWt9aXx8KGQ9TihlKSxkPWQucmVwbGFjZSgvKD86XHJcbj98XG4pJC8sJycpLG09e3NvdXJjZUNvZGVIdG1sOmQsbGFuZ0V4dGVuc2lvbjpmLHNvdXJjZU5vZGU6ZX0sWChtKSxvKCkpfX1rPGcubGVuZ3RoP3NldFRpbWVvdXQobiwyNTApOmMmJmMoKX1mdW5jdGlvbgotbygpe3ZhciBhPW0ucHJldHR5UHJpbnRlZEh0bWwsYixjLGYsZyxoLGksaixrO2lmKCFhKXJldHVybjtmPW0uc291cmNlTm9kZTtpZighSihmKSlmLmlubmVySFRNTD1hO2Vsc2V7az1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdQUkUnKTtmb3IoZz0wO2c8Zi5hdHRyaWJ1dGVzLmxlbmd0aDsrK2cpYj1mLmF0dHJpYnV0ZXNbZ10sYi5zcGVjaWZpZWQmJihjPWIubmFtZS50b0xvd2VyQ2FzZSgpLGM9PT0nY2xhc3MnPyhrLmNsYXNzTmFtZT1iLnZhbHVlKTprLnNldEF0dHJpYnV0ZShiLm5hbWUsYi52YWx1ZSkpO2suaW5uZXJIVE1MPWEsZi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChrLGYpLGY9a31pZihkJiZmLnRhZ05hbWU9PT0nUFJFJyl7aj1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdicicpO2ZvcihoPWoubGVuZ3RoOy0taD49MDspaT1qW2hdLGkucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSksaSl9fW4oKX13aW5kb3cuUFJfbm9ybWFsaXplZEh0bWw9TCx3aW5kb3cucHJldHR5UHJpbnRPbmU9WSx3aW5kb3cucHJldHR5UHJpbnQ9Wix3aW5kb3cuUFI9e2NvbWJpbmVQcmVmaXhQYXR0ZXJuczpNLGNyZWF0ZVNpbXBsZUxleGVyOlMscmVnaXN0ZXJMYW5nSGFuZGxlcjpWLHNvdXJjZURlY29yYXRvcjpULFBSX0FUVFJJQl9OQU1FOidhdG4nLFBSX0FUVFJJQl9WQUxVRTonYXR2JyxQUl9DT01NRU5UOidjb20nLFBSX0RFQ0xBUkFUSU9OOidkZWMnLFBSX0tFWVdPUkQ6J2t3ZCcsUFJfTElURVJBTDonbGl0JyxQUl9OT0NPREU6J25vY29kZScsUFJfUExBSU46J3BsbicsUFJfUFVOQ1RVQVRJT046J3B1bicsUFJfU09VUkNFOidzcmMnLFBSX1NUUklORzonc3RyJyxQUl9UQUc6J3RhZycsUFJfVFlQRTondHlwJ319KSgpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQordmFyIHI9bnVsbDt3aW5kb3cuUFJfU0hPVUxEX1VTRV9DT05USU5VQVRJT049ITA7CisoZnVuY3Rpb24oKXtmdW5jdGlvbiBPKGEpe2Z1bmN0aW9uIGkoZCl7dmFyIGE9ZC5jaGFyQ29kZUF0KDApO2lmKGEhPT05MilyZXR1cm4gYTt2YXIgZj1kLmNoYXJBdCgxKTtyZXR1cm4oYT1zW2ZdKT9hOiIwIjw9ZiYmZjw9IjciP3BhcnNlSW50KGQuc3Vic3RyaW5nKDEpLDgpOmY9PT0idSJ8fGY9PT0ieCI/cGFyc2VJbnQoZC5zdWJzdHJpbmcoMiksMTYpOmQuY2hhckNvZGVBdCgxKX1mdW5jdGlvbiBnKGQpe2lmKGQ8MzIpcmV0dXJuKGQ8MTY/IlxceDAiOiJcXHgiKStkLnRvU3RyaW5nKDE2KTtkPVN0cmluZy5mcm9tQ2hhckNvZGUoZCk7cmV0dXJuIGQ9PT0iXFwifHxkPT09Ii0ifHxkPT09Il0ifHxkPT09Il4iPyJcXCIrZDpkfWZ1bmN0aW9uIGooZCl7dmFyIGE9ZC5zdWJzdHJpbmcoMSxkLmxlbmd0aC0xKS5tYXRjaCgvXFx1W1xkQS1GYS1mXXs0fXxcXHhbXGRBLUZhLWZdezJ9fFxcWzAtM11bMC03XXswLDJ9fFxcWzAtN117MSwyfXxcXFtcU1xzXXxbXlxcXS9nKSxkPVtdLGY9CithWzBdPT09Il4iLGI9WyJbIl07ZiYmYi5wdXNoKCJeIik7Zm9yKHZhciBmPWY/MTowLGM9YS5sZW5ndGg7ZjxjOysrZil7dmFyIGg9YVtmXTtpZigvXFxbYmRzd10vaS50ZXN0KGgpKWIucHVzaChoKTtlbHNle3ZhciBoPWkoaCksZTtmKzI8YyYmIi0iPT09YVtmKzFdPyhlPWkoYVtmKzJdKSxmKz0yKTplPWg7ZC5wdXNoKFtoLGVdKTtlPDY1fHxoPjEyMnx8KGU8NjV8fGg+OTB8fGQucHVzaChbTWF0aC5tYXgoNjUsaCl8MzIsTWF0aC5taW4oZSw5MCl8MzJdKSxlPDk3fHxoPjEyMnx8ZC5wdXNoKFtNYXRoLm1heCg5NyxoKSYtMzMsTWF0aC5taW4oZSwxMjIpJi0zM10pKX19ZC5zb3J0KGZ1bmN0aW9uKGQsYSl7cmV0dXJuIGRbMF0tYVswXXx8YVsxXS1kWzFdfSk7YT1bXTtjPVtdO2ZvcihmPTA7ZjxkLmxlbmd0aDsrK2YpaD1kW2ZdLGhbMF08PWNbMV0rMT9jWzFdPU1hdGgubWF4KGNbMV0saFsxXSk6YS5wdXNoKGM9aCk7Zm9yKGY9MDtmPGEubGVuZ3RoOysrZiloPWFbZl0sYi5wdXNoKGcoaFswXSkpLAoraFsxXT5oWzBdJiYoaFsxXSsxPmhbMF0mJmIucHVzaCgiLSIpLGIucHVzaChnKGhbMV0pKSk7Yi5wdXNoKCJdIik7cmV0dXJuIGIuam9pbigiIil9ZnVuY3Rpb24gdChkKXtmb3IodmFyIGE9ZC5zb3VyY2UubWF0Y2goL1xbKD86W15cXFxdXXxcXFtcU1xzXSkqXXxcXHVbXGRBLUZhLWZdezR9fFxceFtcZEEtRmEtZl17Mn18XFxcZCt8XFxbXlxkdXhdfFwoXD9bITo9XXxbKCleXXxbXigpW1xcXl0rL2cpLGI9YS5sZW5ndGgsaT1bXSxjPTAsaD0wO2M8YjsrK2Mpe3ZhciBlPWFbY107ZT09PSIoIj8rK2g6IlxcIj09PWUuY2hhckF0KDApJiYoZT0rZS5zdWJzdHJpbmcoMSkpJiYoZTw9aD9pW2VdPS0xOmFbY109ZyhlKSl9Zm9yKGM9MTtjPGkubGVuZ3RoOysrYyktMT09PWlbY10mJihpW2NdPSsreik7Zm9yKGg9Yz0wO2M8YjsrK2MpZT1hW2NdLGU9PT0iKCI/KCsraCxpW2hdfHwoYVtjXT0iKD86IikpOiJcXCI9PT1lLmNoYXJBdCgwKSYmKGU9K2Uuc3Vic3RyaW5nKDEpKSYmZTw9aCYmCisoYVtjXT0iXFwiK2lbZV0pO2ZvcihjPTA7YzxiOysrYykiXiI9PT1hW2NdJiYiXiIhPT1hW2MrMV0mJihhW2NdPSIiKTtpZihkLmlnbm9yZUNhc2UmJncpZm9yKGM9MDtjPGI7KytjKWU9YVtjXSxkPWUuY2hhckF0KDApLGUubGVuZ3RoPj0yJiZkPT09IlsiP2FbY109aihlKTpkIT09IlxcIiYmKGFbY109ZS5yZXBsYWNlKC9bQS1aYS16XS9nLGZ1bmN0aW9uKGQpe2Q9ZC5jaGFyQ29kZUF0KDApO3JldHVybiJbIitTdHJpbmcuZnJvbUNoYXJDb2RlKGQmLTMzLGR8MzIpKyJdIn0pKTtyZXR1cm4gYS5qb2luKCIiKX1mb3IodmFyIHo9MCx3PSExLGs9ITEsbT0wLGI9YS5sZW5ndGg7bTxiOysrbSl7dmFyIG89YVttXTtpZihvLmlnbm9yZUNhc2Upaz0hMDtlbHNlIGlmKC9bYS16XS9pLnRlc3Qoby5zb3VyY2UucmVwbGFjZSgvXFx1W1xkYS1mXXs0fXxcXHhbXGRhLWZdezJ9fFxcW15VWHV4XS9naSwiIikpKXt3PSEwO2s9ITE7YnJlYWt9fWZvcih2YXIgcz17Yjo4LHQ6OSxuOjEwLHY6MTEsCitmOjEyLHI6MTN9LHE9W10sbT0wLGI9YS5sZW5ndGg7bTxiOysrbSl7bz1hW21dO2lmKG8uZ2xvYmFsfHxvLm11bHRpbGluZSl0aHJvdyBFcnJvcigiIitvKTtxLnB1c2goIig/OiIrdChvKSsiKSIpfXJldHVybiBSZWdFeHAocS5qb2luKCJ8Iiksaz8iZ2kiOiJnIil9ZnVuY3Rpb24gUChhLGkpe2Z1bmN0aW9uIGcoYSl7c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgMTppZihqLnRlc3QoYS5jbGFzc05hbWUpKWJyZWFrO2Zvcih2YXIgYj1hLmZpcnN0Q2hpbGQ7YjtiPWIubmV4dFNpYmxpbmcpZyhiKTtiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZigiYnIiPT09Ynx8ImxpIj09PWIpdFtrXT0iXG4iLHdbazw8MV09eisrLHdbaysrPDwxfDFdPWE7YnJlYWs7Y2FzZSAzOmNhc2UgNDpiPWEubm9kZVZhbHVlLGIubGVuZ3RoJiYoYj1pP2IucmVwbGFjZSgvXHJcbj8vZywiXG4iKTpiLnJlcGxhY2UoL1tcdFxuXHIgXSsvZywiICIpLHRba109Yix3W2s8PDFdPXoseis9Yi5sZW5ndGgsd1trKys8PAorMXwxXT1hKX19dmFyIGo9Lyg/Ol58XHMpbm9jb2RlKD86XHN8JCkvLHQ9W10sej0wLHc9W10saz0wO2coYSk7cmV0dXJue2E6dC5qb2luKCIiKS5yZXBsYWNlKC9cbiQvLCIiKSxkOnd9fWZ1bmN0aW9uIEUoYSxpLGcsail7aSYmKGE9e2E6aSxlOmF9LGcoYSksai5wdXNoLmFwcGx5KGosYS5nKSl9ZnVuY3Rpb24geChhLGkpe2Z1bmN0aW9uIGcoYSl7Zm9yKHZhciBrPWEuZSxtPVtrLCJwbG4iXSxiPTAsbz1hLmEubWF0Y2godCl8fFtdLHM9e30scT0wLGQ9by5sZW5ndGg7cTxkOysrcSl7dmFyIHY9b1txXSxmPXNbdl0sdT12b2lkIDAsYztpZih0eXBlb2YgZj09PSJzdHJpbmciKWM9ITE7ZWxzZXt2YXIgaD1qW3YuY2hhckF0KDApXTtpZihoKXU9di5tYXRjaChoWzFdKSxmPWhbMF07ZWxzZXtmb3IoYz0wO2M8ejsrK2MpaWYoaD1pW2NdLHU9di5tYXRjaChoWzFdKSl7Zj1oWzBdO2JyZWFrfXV8fChmPSJwbG4iKX1pZigoYz1mLmxlbmd0aD49NSYmImxhbmctIj09PWYuc3Vic3RyaW5nKDAsCis1KSkmJiEodSYmdHlwZW9mIHVbMV09PT0ic3RyaW5nIikpYz0hMSxmPSJzcmMiO2N8fChzW3ZdPWYpfWg9YjtiKz12Lmxlbmd0aDtpZihjKXtjPXVbMV07dmFyIGU9di5pbmRleE9mKGMpLHA9ZStjLmxlbmd0aDt1WzJdJiYocD12Lmxlbmd0aC11WzJdLmxlbmd0aCxlPXAtYy5sZW5ndGgpO2Y9Zi5zdWJzdHJpbmcoNSk7RShrK2gsdi5zdWJzdHJpbmcoMCxlKSxnLG0pO0UoaytoK2UsYyxGKGYsYyksbSk7RShrK2grcCx2LnN1YnN0cmluZyhwKSxnLG0pfWVsc2UgbS5wdXNoKGsraCxmKX1hLmc9bX12YXIgaj17fSx0OyhmdW5jdGlvbigpe2Zvcih2YXIgZz1hLmNvbmNhdChpKSxrPVtdLG09e30sYj0wLG89Zy5sZW5ndGg7YjxvOysrYil7dmFyIHM9Z1tiXSxxPXNbM107aWYocSlmb3IodmFyIGQ9cS5sZW5ndGg7LS1kPj0wOylqW3EuY2hhckF0KGQpXT1zO3M9c1sxXTtxPSIiK3M7bS5oYXNPd25Qcm9wZXJ0eShxKXx8KGsucHVzaChzKSxtW3FdPXIpfWsucHVzaCgvW1xTXHNdLyk7dD0KK08oayl9KSgpO3ZhciB6PWkubGVuZ3RoO3JldHVybiBnfWZ1bmN0aW9uIGwoYSl7dmFyIGk9W10sZz1bXTthLnRyaXBsZVF1b3RlZFN0cmluZ3M/aS5wdXNoKFsic3RyIiwvXig/OicnJyg/OlteJ1xcXXxcXFtcU1xzXXwnJz8oPz1bXiddKSkqKD86JycnfCQpfCIiIig/OlteIlxcXXxcXFtcU1xzXXwiIj8oPz1bXiJdKSkqKD86IiIifCQpfCcoPzpbXidcXF18XFxbXFNcc10pKig/Oid8JCl8Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKSkvLHIsIidcIiJdKTphLm11bHRpTGluZVN0cmluZ3M/aS5wdXNoKFsic3RyIiwvXig/OicoPzpbXidcXF18XFxbXFNcc10pKig/Oid8JCl8Iig/OlteIlxcXXxcXFtcU1xzXSkqKD86InwkKXxgKD86W15cXGBdfFxcW1xTXHNdKSooPzpgfCQpKS8sciwiJ1wiYCJdKTppLnB1c2goWyJzdHIiLC9eKD86Jyg/OlteXG5ccidcXF18XFwuKSooPzonfCQpfCIoPzpbXlxuXHIiXFxdfFxcLikqKD86InwkKSkvLHIsIlwiJyJdKTthLnZlcmJhdGltU3RyaW5ncyYmCitnLnB1c2goWyJzdHIiLC9eQCIoPzpbXiJdfCIiKSooPzoifCQpLyxyXSk7dmFyIGo9YS5oYXNoQ29tbWVudHM7aiYmKGEuY1N0eWxlQ29tbWVudHM/KGo+MT9pLnB1c2goWyJjb20iLC9eIyg/OiMjKD86W14jXXwjKD8hIyMpKSooPzojIyN8JCl8LiopLyxyLCIjIl0pOmkucHVzaChbImNvbSIsL14jKD86KD86ZGVmaW5lfGUoPzpsfG5kKWlmfGVsc2V8ZXJyb3J8aWZuP2RlZnxpbmNsdWRlfGxpbmV8cHJhZ21hfHVuZGVmfHdhcm5pbmcpXGJ8W15cblxyXSopLyxyLCIjIl0pLGcucHVzaChbInN0ciIsL148KD86KD86KD86XC5cLlwvKSp8XC8/KSg/Oltcdy1dKyg/OlwvW1x3LV0rKSspP1tcdy1dK1wuaCg/Omh8cHB8XCtcKyk/fFthLXpdXHcqKT4vLHJdKSk6aS5wdXNoKFsiY29tIiwvXiNbXlxuXHJdKi8sciwiIyJdKSk7YS5jU3R5bGVDb21tZW50cyYmKGcucHVzaChbImNvbSIsL15cL1wvW15cblxyXSovLHJdKSxnLnB1c2goWyJjb20iLC9eXC9cKltcU1xzXSo/KD86XCpcL3wkKS8sCityXSkpO2EucmVnZXhMaXRlcmFscyYmZy5wdXNoKFsibGFuZy1yZWdleCIsL14oPzpeXlwuP3xbKy1dfFshPV09ezAsMn18I3wlPT98JiY/PT98XCh8XCo9P3xbKy1dPXwtPnxcLz0/fDo6P3w8PD89P3w+ezEsM309P3xbLDs/QFt7fl18XF5cXj89P3xcfFx8Pz0/fGJyZWFrfGNhc2V8Y29udGludWV8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mKVxzKihcLyg/PVteKi9dKSg/OlteL1tcXF18XFxbXFNcc118XFsoPzpbXlxcXF1dfFxcW1xTXHNdKSooPzpdfCQpKStcLykvXSk7KGo9YS50eXBlcykmJmcucHVzaChbInR5cCIsal0pO2E9KCIiK2Eua2V5d29yZHMpLnJlcGxhY2UoL14gfCAkL2csIiIpO2EubGVuZ3RoJiZnLnB1c2goWyJrd2QiLFJlZ0V4cCgiXig/OiIrYS5yZXBsYWNlKC9bXHMsXSsvZywifCIpKyIpXFxiIikscl0pO2kucHVzaChbInBsbiIsL15ccysvLHIsIiBcclxuXHRcdTAwYTAiXSk7Zy5wdXNoKFsibGl0IiwKKy9eQFskX2Etel1bXHckQF0qL2kscl0sWyJ0eXAiLC9eKD86W0BfXT9bQS1aXStbYS16XVtcdyRAXSp8XHcrX3RcYikvLHJdLFsicGxuIiwvXlskX2Etel1bXHckQF0qL2kscl0sWyJsaXQiLC9eKD86MHhbXGRhLWZdK3woPzpcZCg/Ol9cZCspKlxkKig/OlwuXGQqKT98XC5cZFwrKSg/OmVbKy1dP1xkKyk/KVthLXpdKi9pLHIsIjAxMjM0NTY3ODkiXSxbInBsbiIsL15cXFtcU1xzXT8vLHJdLFsicHVuIiwvXi5bXlxzXHciJCcuL0BcXGBdKi8scl0pO3JldHVybiB4KGksZyl9ZnVuY3Rpb24gRyhhLGksZyl7ZnVuY3Rpb24gaihhKXtzd2l0Y2goYS5ub2RlVHlwZSl7Y2FzZSAxOmlmKHoudGVzdChhLmNsYXNzTmFtZSkpYnJlYWs7aWYoImJyIj09PWEubm9kZU5hbWUpdChhKSxhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKTtlbHNlIGZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZylqKGEpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6aWYoZyl7dmFyIGI9CithLm5vZGVWYWx1ZSxmPWIubWF0Y2gobik7aWYoZil7dmFyIGk9Yi5zdWJzdHJpbmcoMCxmLmluZGV4KTthLm5vZGVWYWx1ZT1pOyhiPWIuc3Vic3RyaW5nKGYuaW5kZXgrZlswXS5sZW5ndGgpKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShrLmNyZWF0ZVRleHROb2RlKGIpLGEubmV4dFNpYmxpbmcpO3QoYSk7aXx8YS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpfX19fWZ1bmN0aW9uIHQoYSl7ZnVuY3Rpb24gaShhLGIpe3ZhciBkPWI/YS5jbG9uZU5vZGUoITEpOmEsZT1hLnBhcmVudE5vZGU7aWYoZSl7dmFyIGU9aShlLDEpLGY9YS5uZXh0U2libGluZztlLmFwcGVuZENoaWxkKGQpO2Zvcih2YXIgZz1mO2c7Zz1mKWY9Zy5uZXh0U2libGluZyxlLmFwcGVuZENoaWxkKGcpfXJldHVybiBkfWZvcig7IWEubmV4dFNpYmxpbmc7KWlmKGE9YS5wYXJlbnROb2RlLCFhKXJldHVybjtmb3IodmFyIGE9aShhLm5leHRTaWJsaW5nLDApLGY7KGY9YS5wYXJlbnROb2RlKSYmZi5ub2RlVHlwZT09PQorMTspYT1mO2IucHVzaChhKX1mb3IodmFyIHo9Lyg/Ol58XHMpbm9jb2RlKD86XHN8JCkvLG49L1xyXG4/fFxuLyxrPWEub3duZXJEb2N1bWVudCxtPWsuY3JlYXRlRWxlbWVudCgibGkiKTthLmZpcnN0Q2hpbGQ7KW0uYXBwZW5kQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IodmFyIGI9W21dLG89MDtvPGIubGVuZ3RoOysrbylqKGJbb10pO2k9PT0oaXwwKSYmYlswXS5zZXRBdHRyaWJ1dGUoInZhbHVlIixpKTt2YXIgcz1rLmNyZWF0ZUVsZW1lbnQoIm9sIik7cy5jbGFzc05hbWU9ImxpbmVudW1zIjtmb3IodmFyIGk9TWF0aC5tYXgoMCxpLTF8MCl8fDAsbz0wLHE9Yi5sZW5ndGg7bzxxOysrbyltPWJbb10sbS5jbGFzc05hbWU9IkwiKyhvK2kpJTEwLG0uZmlyc3RDaGlsZHx8bS5hcHBlbmRDaGlsZChrLmNyZWF0ZVRleHROb2RlKCJcdTAwYTAiKSkscy5hcHBlbmRDaGlsZChtKTthLmFwcGVuZENoaWxkKHMpfWZ1bmN0aW9uIG4oYSxpKXtmb3IodmFyIGc9aS5sZW5ndGg7LS1nPj0wOyl7dmFyIGo9CitpW2ddO0EuaGFzT3duUHJvcGVydHkoaik/Qy5jb25zb2xlJiZjb25zb2xlLndhcm4oImNhbm5vdCBvdmVycmlkZSBsYW5ndWFnZSBoYW5kbGVyICVzIixqKTpBW2pdPWF9fWZ1bmN0aW9uIEYoYSxpKXtpZighYXx8IUEuaGFzT3duUHJvcGVydHkoYSkpYT0vXlxzKjwvLnRlc3QoaSk/ImRlZmF1bHQtbWFya3VwIjoiZGVmYXVsdC1jb2RlIjtyZXR1cm4gQVthXX1mdW5jdGlvbiBIKGEpe3ZhciBpPWEuaDt0cnl7dmFyIGc9UChhLmMsYS5pKSxqPWcuYTthLmE9ajthLmQ9Zy5kO2EuZT0wO0YoaSxqKShhKTt2YXIgdD0vXGJNU0lFXHMoXGQrKS8uZXhlYyhuYXZpZ2F0b3IudXNlckFnZW50KSx0PXQmJit0WzFdPD04LGk9L1xuL2csbj1hLmEsdz1uLmxlbmd0aCxnPTAsaz1hLmQsbT1rLmxlbmd0aCxqPTAsYj1hLmcsbz1iLmxlbmd0aCxzPTA7YltvXT13O3ZhciBxLGQ7Zm9yKGQ9cT0wO2Q8bzspYltkXSE9PWJbZCsyXT8oYltxKytdPWJbZCsrXSxiW3ErK109YltkKytdKTpkKz0yO289cTsKK2ZvcihkPXE9MDtkPG87KXtmb3IodmFyIHY9YltkXSxmPWJbZCsxXSx1PWQrMjt1KzI8PW8mJmJbdSsxXT09PWY7KXUrPTI7YltxKytdPXY7YltxKytdPWY7ZD11fWIubGVuZ3RoPXE7dmFyIGM9YS5jLGg7aWYoYyloPWMuc3R5bGUuZGlzcGxheSxjLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RyeXtmb3IoO2o8bTspe3ZhciBlPWtbaisyXXx8dyxwPWJbcysyXXx8dyx1PU1hdGgubWluKGUscCksbD1rW2orMV0sRDtpZihsLm5vZGVUeXBlIT09MSYmKEQ9bi5zdWJzdHJpbmcoZyx1KSkpe3QmJihEPUQucmVwbGFjZShpLCJcciIpKTtsLm5vZGVWYWx1ZT1EO3ZhciB5PWwub3duZXJEb2N1bWVudCx4PXkuY3JlYXRlRWxlbWVudCgic3BhbiIpO3guY2xhc3NOYW1lPWJbcysxXTt2YXIgQj1sLnBhcmVudE5vZGU7Qi5yZXBsYWNlQ2hpbGQoeCxsKTt4LmFwcGVuZENoaWxkKGwpO2c8ZSYmKGtbaisxXT1sPXkuY3JlYXRlVGV4dE5vZGUobi5zdWJzdHJpbmcodSxlKSksQi5pbnNlcnRCZWZvcmUobCwKK3gubmV4dFNpYmxpbmcpKX1nPXU7Zz49ZSYmKGorPTIpO2c+PXAmJihzKz0yKX19ZmluYWxseXtpZihjKWMuc3R5bGUuZGlzcGxheT1ofX1jYXRjaChBKXtDLmNvbnNvbGUmJmNvbnNvbGUubG9nKEEmJkEuc3RhY2s/QS5zdGFjazpBKX19dmFyIEM9d2luZG93LHk9WyJicmVhayxjb250aW51ZSxkbyxlbHNlLGZvcixpZixyZXR1cm4sd2hpbGUiXSxCPVtbeSwiYXV0byxjYXNlLGNoYXIsY29uc3QsZGVmYXVsdCxkb3VibGUsZW51bSxleHRlcm4sZmxvYXQsZ290byxpbnQsbG9uZyxyZWdpc3RlcixzaG9ydCxzaWduZWQsc2l6ZW9mLHN0YXRpYyxzdHJ1Y3Qsc3dpdGNoLHR5cGVkZWYsdW5pb24sdW5zaWduZWQsdm9pZCx2b2xhdGlsZSJdLCJjYXRjaCxjbGFzcyxkZWxldGUsZmFsc2UsaW1wb3J0LG5ldyxvcGVyYXRvcixwcml2YXRlLHByb3RlY3RlZCxwdWJsaWMsdGhpcyx0aHJvdyx0cnVlLHRyeSx0eXBlb2YiXSxJPVtCLCJhbGlnbm9mLGFsaWduX3VuaW9uLGFzbSxheGlvbSxib29sLGNvbmNlcHQsY29uY2VwdF9tYXAsY29uc3RfY2FzdCxjb25zdGV4cHIsZGVjbHR5cGUsZHluYW1pY19jYXN0LGV4cGxpY2l0LGV4cG9ydCxmcmllbmQsaW5saW5lLGxhdGVfY2hlY2ssbXV0YWJsZSxuYW1lc3BhY2UsbnVsbHB0cixyZWludGVycHJldF9jYXN0LHN0YXRpY19hc3NlcnQsc3RhdGljX2Nhc3QsdGVtcGxhdGUsdHlwZWlkLHR5cGVuYW1lLHVzaW5nLHZpcnR1YWwsd2hlcmUiXSwKK0o9W0IsImFic3RyYWN0LGJvb2xlYW4sYnl0ZSxleHRlbmRzLGZpbmFsLGZpbmFsbHksaW1wbGVtZW50cyxpbXBvcnQsaW5zdGFuY2VvZixudWxsLG5hdGl2ZSxwYWNrYWdlLHN0cmljdGZwLHN1cGVyLHN5bmNocm9uaXplZCx0aHJvd3MsdHJhbnNpZW50Il0sSz1bSiwiYXMsYmFzZSxieSxjaGVja2VkLGRlY2ltYWwsZGVsZWdhdGUsZGVzY2VuZGluZyxkeW5hbWljLGV2ZW50LGZpeGVkLGZvcmVhY2gsZnJvbSxncm91cCxpbXBsaWNpdCxpbixpbnRlcmZhY2UsaW50ZXJuYWwsaW50byxpcyxsZXQsbG9jayxvYmplY3Qsb3V0LG92ZXJyaWRlLG9yZGVyYnkscGFyYW1zLHBhcnRpYWwscmVhZG9ubHkscmVmLHNieXRlLHNlYWxlZCxzdGFja2FsbG9jLHN0cmluZyxzZWxlY3QsdWludCx1bG9uZyx1bmNoZWNrZWQsdW5zYWZlLHVzaG9ydCx2YXIsdmlydHVhbCx3aGVyZSJdLEI9W0IsImRlYnVnZ2VyLGV2YWwsZXhwb3J0LGZ1bmN0aW9uLGdldCxudWxsLHNldCx1bmRlZmluZWQsdmFyLHdpdGgsSW5maW5pdHksTmFOIl0sCitMPVt5LCJhbmQsYXMsYXNzZXJ0LGNsYXNzLGRlZixkZWwsZWxpZixleGNlcHQsZXhlYyxmaW5hbGx5LGZyb20sZ2xvYmFsLGltcG9ydCxpbixpcyxsYW1iZGEsbm9ubG9jYWwsbm90LG9yLHBhc3MscHJpbnQscmFpc2UsdHJ5LHdpdGgseWllbGQsRmFsc2UsVHJ1ZSxOb25lIl0sTT1beSwiYWxpYXMsYW5kLGJlZ2luLGNhc2UsY2xhc3MsZGVmLGRlZmluZWQsZWxzaWYsZW5kLGVuc3VyZSxmYWxzZSxpbixtb2R1bGUsbmV4dCxuaWwsbm90LG9yLHJlZG8scmVzY3VlLHJldHJ5LHNlbGYsc3VwZXIsdGhlbix0cnVlLHVuZGVmLHVubGVzcyx1bnRpbCx3aGVuLHlpZWxkLEJFR0lOLEVORCJdLHk9W3ksImNhc2UsZG9uZSxlbGlmLGVzYWMsZXZhbCxmaSxmdW5jdGlvbixpbixsb2NhbCxzZXQsdGhlbix1bnRpbCJdLE49L14oRElSfEZJTEV8dmVjdG9yfChkZXxwcmlvcml0eV8pP3F1ZXVlfGxpc3R8c3RhY2t8KGNvbnN0Xyk/aXRlcmF0b3J8KG11bHRpKT8oc2V0fG1hcCl8Yml0c2V0fHU/KGludHxmbG9hdClcZCopXGIvLAorUT0vXFMvLFI9bCh7a2V5d29yZHM6W0ksSyxCLCJjYWxsZXIsZGVsZXRlLGRpZSxkbyxkdW1wLGVsc2lmLGV2YWwsZXhpdCxmb3JlYWNoLGZvcixnb3RvLGlmLGltcG9ydCxsYXN0LGxvY2FsLG15LG5leHQsbm8sb3VyLHByaW50LHBhY2thZ2UscmVkbyxyZXF1aXJlLHN1Yix1bmRlZix1bmxlc3MsdW50aWwsdXNlLHdhbnRhcnJheSx3aGlsZSxCRUdJTixFTkQiK0wsTSx5XSxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksQT17fTtuKFIsWyJkZWZhdWx0LWNvZGUiXSk7bih4KFtdLFtbInBsbiIsL15bXjw/XSsvXSxbImRlYyIsL148IVx3W14+XSooPzo+fCQpL10sWyJjb20iLC9ePFwhLS1bXFNcc10qPyg/Oi0tXD58JCkvXSxbImxhbmctIiwvXjxcPyhbXFNcc10rPykoPzpcPz58JCkvXSxbImxhbmctIiwvXjwlKFtcU1xzXSs/KSg/OiU+fCQpL10sWyJwdW4iLC9eKD86PFslP118WyU/XT4pL10sWyJsYW5nLSIsCisvXjx4bXBcYltePl0qPihbXFNcc10rPyk8XC94bXBcYltePl0qPi9pXSxbImxhbmctanMiLC9ePHNjcmlwdFxiW14+XSo+KFtcU1xzXSo/KSg8XC9zY3JpcHRcYltePl0qPikvaV0sWyJsYW5nLWNzcyIsL148c3R5bGVcYltePl0qPihbXFNcc10qPykoPFwvc3R5bGVcYltePl0qPikvaV0sWyJsYW5nLWluLnRhZyIsL14oPFwvP1thLXpdW148Pl0qPikvaV1dKSxbImRlZmF1bHQtbWFya3VwIiwiaHRtIiwiaHRtbCIsIm14bWwiLCJ4aHRtbCIsInhtbCIsInhzbCJdKTtuKHgoW1sicGxuIiwvXlxzKy8sciwiIFx0XHJcbiJdLFsiYXR2IiwvXig/OiJbXiJdKiI/fCdbXiddKic/KS8sciwiXCInIl1dLFtbInRhZyIsL15ePFwvP1thLXpdKD86W1x3LS46XSpcdyk/fFwvPz4kL2ldLFsiYXRuIiwvXig/IXN0eWxlW1xzPV18b24pW2Etel0oPzpbXHc6LV0qXHcpPy9pXSxbImxhbmctdXEudmFsIiwvXj1ccyooW15ccyInPl0qKD86W15ccyInLz5dfFwvKD89XHMpKSkvXSxbInB1biIsL15bLzwtPl0rL10sCitbImxhbmctanMiLC9eb25cdytccyo9XHMqIihbXiJdKykiL2ldLFsibGFuZy1qcyIsL15vblx3K1xzKj1ccyonKFteJ10rKScvaV0sWyJsYW5nLWpzIiwvXm9uXHcrXHMqPVxzKihbXlxzIic+XSspL2ldLFsibGFuZy1jc3MiLC9ec3R5bGVccyo9XHMqIihbXiJdKykiL2ldLFsibGFuZy1jc3MiLC9ec3R5bGVccyo9XHMqJyhbXiddKyknL2ldLFsibGFuZy1jc3MiLC9ec3R5bGVccyo9XHMqKFteXHMiJz5dKykvaV1dKSxbImluLnRhZyJdKTtuKHgoW10sW1siYXR2IiwvXltcU1xzXSsvXV0pLFsidXEudmFsIl0pO24obCh7a2V5d29yZHM6SSxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdHlwZXM6Tn0pLFsiYyIsImNjIiwiY3BwIiwiY3h4IiwiY3ljIiwibSJdKTtuKGwoe2tleXdvcmRzOiJudWxsLHRydWUsZmFsc2UifSksWyJqc29uIl0pO24obCh7a2V5d29yZHM6SyxoYXNoQ29tbWVudHM6ITAsY1N0eWxlQ29tbWVudHM6ITAsdmVyYmF0aW1TdHJpbmdzOiEwLHR5cGVzOk59KSwKK1siY3MiXSk7bihsKHtrZXl3b3JkczpKLGNTdHlsZUNvbW1lbnRzOiEwfSksWyJqYXZhIl0pO24obCh7a2V5d29yZHM6eSxoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMH0pLFsiYnNoIiwiY3NoIiwic2giXSk7bihsKHtrZXl3b3JkczpMLGhhc2hDb21tZW50czohMCxtdWx0aUxpbmVTdHJpbmdzOiEwLHRyaXBsZVF1b3RlZFN0cmluZ3M6ITB9KSxbImN2IiwicHkiXSk7bihsKHtrZXl3b3JkczoiY2FsbGVyLGRlbGV0ZSxkaWUsZG8sZHVtcCxlbHNpZixldmFsLGV4aXQsZm9yZWFjaCxmb3IsZ290byxpZixpbXBvcnQsbGFzdCxsb2NhbCxteSxuZXh0LG5vLG91cixwcmludCxwYWNrYWdlLHJlZG8scmVxdWlyZSxzdWIsdW5kZWYsdW5sZXNzLHVudGlsLHVzZSx3YW50YXJyYXksd2hpbGUsQkVHSU4sRU5EIixoYXNoQ29tbWVudHM6ITAsbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJwZXJsIiwicGwiLCJwbSJdKTtuKGwoe2tleXdvcmRzOk0saGFzaENvbW1lbnRzOiEwLAorbXVsdGlMaW5lU3RyaW5nczohMCxyZWdleExpdGVyYWxzOiEwfSksWyJyYiJdKTtuKGwoe2tleXdvcmRzOkIsY1N0eWxlQ29tbWVudHM6ITAscmVnZXhMaXRlcmFsczohMH0pLFsianMiXSk7bihsKHtrZXl3b3JkczoiYWxsLGFuZCxieSxjYXRjaCxjbGFzcyxlbHNlLGV4dGVuZHMsZmFsc2UsZmluYWxseSxmb3IsaWYsaW4saXMsaXNudCxsb29wLG5ldyxubyxub3QsbnVsbCxvZixvZmYsb24sb3IscmV0dXJuLHN1cGVyLHRoZW4sdGhyb3csdHJ1ZSx0cnksdW5sZXNzLHVudGlsLHdoZW4sd2hpbGUseWVzIixoYXNoQ29tbWVudHM6MyxjU3R5bGVDb21tZW50czohMCxtdWx0aWxpbmVTdHJpbmdzOiEwLHRyaXBsZVF1b3RlZFN0cmluZ3M6ITAscmVnZXhMaXRlcmFsczohMH0pLFsiY29mZmVlIl0pO24oeChbXSxbWyJzdHIiLC9eW1xTXHNdKy9dXSksWyJyZWdleCJdKTt2YXIgUz1DLlBSPXtjcmVhdGVTaW1wbGVMZXhlcjp4LHJlZ2lzdGVyTGFuZ0hhbmRsZXI6bixzb3VyY2VEZWNvcmF0b3I6bCwKK1BSX0FUVFJJQl9OQU1FOiJhdG4iLFBSX0FUVFJJQl9WQUxVRToiYXR2IixQUl9DT01NRU5UOiJjb20iLFBSX0RFQ0xBUkFUSU9OOiJkZWMiLFBSX0tFWVdPUkQ6Imt3ZCIsUFJfTElURVJBTDoibGl0IixQUl9OT0NPREU6Im5vY29kZSIsUFJfUExBSU46InBsbiIsUFJfUFVOQ1RVQVRJT046InB1biIsUFJfU09VUkNFOiJzcmMiLFBSX1NUUklORzoic3RyIixQUl9UQUc6InRhZyIsUFJfVFlQRToidHlwIixwcmV0dHlQcmludE9uZTpDLnByZXR0eVByaW50T25lPWZ1bmN0aW9uKGEsaSxnKXt2YXIgaj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwcmUiKTtqLmlubmVySFRNTD1hO2cmJkcoaixnLCEwKTtIKHtoOmksajpnLGM6aixpOjF9KTtyZXR1cm4gai5pbm5lckhUTUx9LHByZXR0eVByaW50OkMucHJldHR5UHJpbnQ9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gaSgpe3ZhciB1O2Zvcih2YXIgZz1DLlBSX1NIT1VMRF9VU0VfQ09OVElOVUFUSU9OP2subm93KCkrMjUwOkluZmluaXR5O208ai5sZW5ndGgmJgoray5ub3coKTxnO20rKyl7dmFyIGM9alttXSxoPWMuY2xhc3NOYW1lO2lmKHMudGVzdChoKSYmIXEudGVzdChoKSl7Zm9yKHZhciBlPSExLHA9Yy5wYXJlbnROb2RlO3A7cD1wLnBhcmVudE5vZGUpaWYoZi50ZXN0KHAudGFnTmFtZSkmJnAuY2xhc3NOYW1lJiZzLnRlc3QocC5jbGFzc05hbWUpKXtlPSEwO2JyZWFrfWlmKCFlKXtjLmNsYXNzTmFtZSs9IiBwcmV0dHlwcmludGVkIjt2YXIgaD1oLm1hdGNoKG8pLG47aWYoZT0haCl7Zm9yKHZhciBlPWMscD12b2lkIDAsbD1lLmZpcnN0Q2hpbGQ7bDtsPWwubmV4dFNpYmxpbmcpdmFyIHQ9bC5ub2RlVHlwZSxwPXQ9PT0xP3A/ZTpsOnQ9PT0zP1EudGVzdChsLm5vZGVWYWx1ZSk/ZTpwOnA7ZT0obj1wPT09ZT92b2lkIDA6cCkmJnYudGVzdChuLnRhZ05hbWUpfWUmJihoPW4uY2xhc3NOYW1lLm1hdGNoKG8pKTtoJiYoaD1oWzFdKTt1PWQudGVzdChjLnRhZ05hbWUpPzE6KGU9KGU9Yy5jdXJyZW50U3R5bGUpP2Uud2hpdGVTcGFjZTpkb2N1bWVudC5kZWZhdWx0VmlldyYmCitkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlP2RvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoYyxyKS5nZXRQcm9wZXJ0eVZhbHVlKCJ3aGl0ZS1zcGFjZSIpOjApJiYicHJlIj09PWUuc3Vic3RyaW5nKDAsMyksZT11OyhwPShwPWMuY2xhc3NOYW1lLm1hdGNoKC9cYmxpbmVudW1zXGIoPzo6KFxkKykpPy8pKT9wWzFdJiZwWzFdLmxlbmd0aD8rcFsxXTohMDohMSkmJkcoYyxwLGUpO2I9e2g6aCxjOmMsajpwLGk6ZX07SChiKX19fW08ai5sZW5ndGg/c2V0VGltZW91dChpLDI1MCk6YSYmYSgpfWZvcih2YXIgZz1bZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByZSIpLGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjb2RlIiksZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInhtcCIpXSxqPVtdLG49MDtuPGcubGVuZ3RoOysrbilmb3IodmFyIGw9MCx3PWdbbl0ubGVuZ3RoO2w8dzsrK2wpai5wdXNoKGdbbl1bbF0pO3ZhciBnPQorcixrPURhdGU7ay5ub3d8fChrPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9fSk7dmFyIG09MCxiLG89L1xibGFuZyg/OnVhZ2UpPy0oW1x3Ll0rKSg/IVxTKS8scz0vXGJwcmV0dHlwcmludFxiLyxxPS9cYnByZXR0eXByaW50ZWRcYi8sZD0vcHJlfHhtcC9pLHY9L15jb2RlJC9pLGY9L14oPzpwcmV8Y29kZXx4bXApJC9pO2koKX19O3R5cGVvZiBkZWZpbmU9PT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUoImdvb2dsZS1jb2RlLXByZXR0aWZ5IixbXSxmdW5jdGlvbigpe3JldHVybiBTfSl9KSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvc2VydmVyLWVudi5qcyBiL2dlcnJpdC1wcmV0dGlmeS9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcHJldHRpZnkvY2xpZW50L3NlcnZlci1lbnYuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDQ5YzAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXByZXR0aWZ5L3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9wcmV0dGlmeS9jbGllbnQvc2VydmVyLWVudi5qcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotLy8gTW96aWxsYSBSaGlubyBpcyBub3QgSUUgNi4KLS8vCi13aW5kb3cuX3ByX2lzSUU2ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gZmFsc2U7IH07Ci0KLS8vIEV4cG9zZSB0aGUgZnVuY3Rpb24gYXQgdGhlIHRvcCBsZXZlbCB0byBzaW1wbGlmeSBjYWxscy4KLS8vCi1wcmV0dHlQcmludE9uZSA9IHdpbmRvdy5wcmV0dHlQcmludE9uZTsKLVBSID0gd2luZG93LlBSOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3BvbS54bWwgYi9nZXJyaXQtcmV2aWV3ZGIvcG9tLnhtbAppbmRleCBmOWZiNDllLi4wNDgyYTRhIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvcG9tLnhtbAorKysgYi9nZXJyaXQtcmV2aWV3ZGIvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LXJldmlld2RiPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnQuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50LmphdmEKaW5kZXggYjIzYWE4Ni4uOTRiMzdlMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnQuamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudC5qYXZhCkBAIC0xNjksNyArMTY5LDExIEBACiAKICAgLyoqIFNldCB0aGUgZnVsbCBuYW1lIG9mIHRoZSB1c2VyICgiR2l2ZW4tbmFtZSBTdXJuYW1lIiBzdHlsZSkuICovCiAgIHB1YmxpYyB2b2lkIHNldEZ1bGxOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgZnVsbE5hbWUgPSBuYW1lOworICAgIGlmIChuYW1lICE9IG51bGwgJiYgIW5hbWUudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgZnVsbE5hbWUgPSBuYW1lLnRyaW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgZnVsbE5hbWUgPSBudWxsOworICAgIH0KICAgfQogCiAgIC8qKiBFbWFpbCBhZGRyZXNzIHRoZSB1c2VyIHByZWZlcnMgdG8gYmUgY29udGFjdGVkIHRocm91Z2guICovCmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwLmphdmEKaW5kZXggMDYxZWYzZS4uZWE5YzUyZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cC5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50R3JvdXAuamF2YQpAQCAtODUsNiArODUsMTEgQEAKICAgICAgICAgfHwgdXVpZC5nZXQoKS5tYXRjaGVzKCJeWzAtOWEtZl17NDB9JCIpOwogICB9CiAKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgVVVJRCBpcyBmb3IgYSBzeXN0ZW0gZ3JvdXAgbWFuYWdlZCB3aXRoaW4gR2Vycml0LiAqLworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeXN0ZW1Hcm91cChBY2NvdW50R3JvdXAuVVVJRCB1dWlkKSB7CisgICAgcmV0dXJuIHV1aWQuZ2V0KCkuc3RhcnRzV2l0aCgiZ2xvYmFsOiIpOworICB9CisKICAgLyoqIFN5bnRoZXRpYyBrZXkgdG8gbGluayB0byB3aXRoaW4gdGhlIGRhdGFiYXNlICovCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWQgZXh0ZW5kcyBJbnRLZXk8Y29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleTw/Pj4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGUuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50R3JvdXBJbmNsdWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTg2ODkuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29sdW1uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db21wb3VuZEtleTsKLQotLyoqIE1lbWJlcnNoaXAgb2YgYW4ge0BsaW5rIEFjY291bnRHcm91cH0gaW4gYW4ge0BsaW5rIEFjY291bnRHcm91cH0uICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWNjb3VudEdyb3VwSW5jbHVkZSB7Ci0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5IGV4dGVuZHMgQ29tcG91bmRLZXk8QWNjb3VudEdyb3VwLklkPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBAQ29sdW1uKGlkID0gMSkKLSAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQ7Ci0KLSAgICBAQ29sdW1uKGlkID0gMikKLSAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLklkIGluY2x1ZGVJZDsKLQotICAgIHByb3RlY3RlZCBLZXkoKSB7Ci0gICAgICBncm91cElkID0gbmV3IEFjY291bnRHcm91cC5JZCgpOwotICAgICAgaW5jbHVkZUlkID0gbmV3IEFjY291bnRHcm91cC5JZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBLZXkoZmluYWwgQWNjb3VudEdyb3VwLklkIGcsIGZpbmFsIEFjY291bnRHcm91cC5JZCBpKSB7Ci0gICAgICBncm91cElkID0gZzsKLSAgICAgIGluY2x1ZGVJZCA9IGk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRQYXJlbnRLZXkoKSB7Ci0gICAgICByZXR1cm4gZ3JvdXBJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldEdyb3VwSWQoKSB7Ci0gICAgICByZXR1cm4gZ3JvdXBJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldEluY2x1ZGVJZCgpIHsKLSAgICAgIHJldHVybiBpbmNsdWRlSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXk8Pz5bXSBtZW1iZXJzKCkgewotICAgICAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5PD8+W10ge2luY2x1ZGVJZH07Ci0gICAgfQotICB9Ci0KLSAgQENvbHVtbihpZCA9IDEsIG5hbWUgPSBDb2x1bW4uTk9ORSkKLSAgcHJvdGVjdGVkIEtleSBrZXk7Ci0KLSAgcHJvdGVjdGVkIEFjY291bnRHcm91cEluY2x1ZGUoKSB7Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudEdyb3VwSW5jbHVkZShmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlLktleSBrKSB7Ci0gICAga2V5ID0gazsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlLktleSBnZXRLZXkoKSB7Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgZ2V0R3JvdXBJZCgpIHsKLSAgICByZXR1cm4ga2V5Lmdyb3VwSWQ7Ci0gIH0KLQotICBwdWJsaWMgQWNjb3VudEdyb3VwLklkIGdldEluY2x1ZGVJZCgpIHsKLSAgICByZXR1cm4ga2V5LmluY2x1ZGVJZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGVBdWRpdC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGVBdWRpdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzVjM2MzLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LkNvbHVtbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29tcG91bmRLZXk7Ci0KLWltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7Ci0KLS8qKiBJbmNsdXNpb24gb2YgYW4ge0BsaW5rIEFjY291bnRHcm91cH0gaW4gYW5vdGhlciB7QGxpbmsgQWNjb3VudEdyb3VwfS4gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQgewotICBwdWJsaWMgc3RhdGljIGNsYXNzIEtleSBleHRlbmRzIENvbXBvdW5kS2V5PEFjY291bnRHcm91cC5JZD4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQENvbHVtbihpZCA9IDEpCi0gICAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5JZCBncm91cElkOwotCi0gICAgQENvbHVtbihpZCA9IDIpCi0gICAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5JZCBpbmNsdWRlSWQ7Ci0KLSAgICBAQ29sdW1uKGlkID0gMykKLSAgICBwcm90ZWN0ZWQgVGltZXN0YW1wIGFkZGVkT247Ci0KLSAgICBwcm90ZWN0ZWQgS2V5KCkgewotICAgICAgZ3JvdXBJZCA9IG5ldyBBY2NvdW50R3JvdXAuSWQoKTsKLSAgICAgIGluY2x1ZGVJZCA9IG5ldyBBY2NvdW50R3JvdXAuSWQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgS2V5KGZpbmFsIEFjY291bnRHcm91cC5JZCBnLCBmaW5hbCBBY2NvdW50R3JvdXAuSWQgaSwgZmluYWwgVGltZXN0YW1wIHQpIHsKLSAgICAgIGdyb3VwSWQgPSBnOwotICAgICAgaW5jbHVkZUlkID0gaTsKLSAgICAgIGFkZGVkT24gPSB0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgZ2V0UGFyZW50S2V5KCkgewotICAgICAgcmV0dXJuIGdyb3VwSWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRJbmNsdWRlZElkKCkgewotICAgICAgcmV0dXJuIGluY2x1ZGVJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGltZXN0YW1wIGdldEFkZGVkT24oKSB7Ci0gICAgICByZXR1cm4gYWRkZWRPbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleTw/PltdIG1lbWJlcnMoKSB7Ci0gICAgICByZXR1cm4gbmV3IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXk8Pz5bXSB7aW5jbHVkZUlkfTsKLSAgICB9Ci0gIH0KLQotICBAQ29sdW1uKGlkID0gMSwgbmFtZSA9IENvbHVtbi5OT05FKQotICBwcm90ZWN0ZWQgS2V5IGtleTsKLQotICBAQ29sdW1uKGlkID0gMikKLSAgcHJvdGVjdGVkIEFjY291bnQuSWQgYWRkZWRCeTsKLQotICBAQ29sdW1uKGlkID0gMywgbm90TnVsbCA9IGZhbHNlKQotICBwcm90ZWN0ZWQgQWNjb3VudC5JZCByZW1vdmVkQnk7Ci0KLSAgQENvbHVtbihpZCA9IDQsIG5vdE51bGwgPSBmYWxzZSkKLSAgcHJvdGVjdGVkIFRpbWVzdGFtcCByZW1vdmVkT247Ci0KLSAgcHJvdGVjdGVkIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCgpIHsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZSBtLAotICAgICAgZmluYWwgQWNjb3VudC5JZCBhZGRlcikgewotICAgIGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cCA9IG0uZ2V0R3JvdXBJZCgpOwotICAgIGZpbmFsIEFjY291bnRHcm91cC5JZCBpbmNsdWRlID0gbS5nZXRJbmNsdWRlSWQoKTsKLSAgICBrZXkgPSBuZXcgQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0LktleShncm91cCwgaW5jbHVkZSwgbm93KCkpOwotICAgIGFkZGVkQnkgPSBhZGRlcjsKLSAgfQotCi0gIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQuS2V5IGdldEtleSgpIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0gICAgcmV0dXJuIHJlbW92ZWRPbiA9PSBudWxsOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlZChmaW5hbCBBY2NvdW50LklkIGRlbGV0ZXIpIHsKLSAgICByZW1vdmVkQnkgPSBkZWxldGVyOwotICAgIHJlbW92ZWRPbiA9IG5vdygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgVGltZXN0YW1wIG5vdygpIHsKLSAgICByZXR1cm4gbmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWIzNWVkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuamF2YQpAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50OworCitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LkNvbHVtbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29tcG91bmRLZXk7CisKKy8qKiBNZW1iZXJzaGlwIG9mIGFuIHtAbGluayBBY2NvdW50R3JvdXB9IGluIGFuIHtAbGluayBBY2NvdW50R3JvdXB9LiAqLworcHVibGljIGZpbmFsIGNsYXNzIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIEtleSBleHRlbmRzIENvbXBvdW5kS2V5PEFjY291bnRHcm91cC5JZD4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgQENvbHVtbihpZCA9IDEpCisgICAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5JZCBncm91cElkOworCisgICAgQENvbHVtbihpZCA9IDIpCisgICAgcHJvdGVjdGVkIEFjY291bnRHcm91cC5VVUlEIGluY2x1ZGVVVUlEOworCisgICAgcHJvdGVjdGVkIEtleSgpIHsKKyAgICAgIGdyb3VwSWQgPSBuZXcgQWNjb3VudEdyb3VwLklkKCk7CisgICAgICBpbmNsdWRlVVVJRCA9IG5ldyBBY2NvdW50R3JvdXAuVVVJRCgpOworICAgIH0KKworICAgIHB1YmxpYyBLZXkoZmluYWwgQWNjb3VudEdyb3VwLklkIGcsIGZpbmFsIEFjY291bnRHcm91cC5VVUlEIHUpIHsKKyAgICAgIGdyb3VwSWQgPSBnOworICAgICAgaW5jbHVkZVVVSUQgPSB1OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgZ2V0UGFyZW50S2V5KCkgeworICAgICAgcmV0dXJuIGdyb3VwSWQ7CisgICAgfQorCisgICAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRHcm91cElkKCkgeworICAgICAgcmV0dXJuIGdyb3VwSWQ7CisgICAgfQorCisgICAgcHVibGljIEFjY291bnRHcm91cC5VVUlEIGdldEluY2x1ZGVVVUlEKCkgeworICAgICAgcmV0dXJuIGluY2x1ZGVVVUlEOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5PD8+W10gbWVtYmVycygpIHsKKyAgICAgIHJldHVybiBuZXcgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleTw/PltdIHtpbmNsdWRlVVVJRH07CisgICAgfQorICB9CisKKyAgQENvbHVtbihpZCA9IDEsIG5hbWUgPSBDb2x1bW4uTk9ORSkKKyAgcHJvdGVjdGVkIEtleSBrZXk7CisKKyAgcHJvdGVjdGVkIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQoKSB7CisgIH0KKworICBwdWJsaWMgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleSBrKSB7CisgICAga2V5ID0gazsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleSBnZXRLZXkoKSB7CisgICAgcmV0dXJuIGtleTsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXAuSWQgZ2V0R3JvdXBJZCgpIHsKKyAgICByZXR1cm4ga2V5Lmdyb3VwSWQ7CisgIH0KKworICBwdWJsaWMgQWNjb3VudEdyb3VwLlVVSUQgZ2V0SW5jbHVkZVVVSUQoKSB7CisgICAgcmV0dXJuIGtleS5pbmNsdWRlVVVJRDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjUxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29sdW1uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5Db21wb3VuZEtleTsKKworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKKworLyoqIEluY2x1c2lvbiBvZiBhbiB7QGxpbmsgQWNjb3VudEdyb3VwfSBpbiBhbm90aGVyIHtAbGluayBBY2NvdW50R3JvdXB9LiAqLworcHVibGljIGZpbmFsIGNsYXNzIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5IGV4dGVuZHMgQ29tcG91bmRLZXk8QWNjb3VudEdyb3VwLklkPiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBAQ29sdW1uKGlkID0gMSkKKyAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQ7CisKKyAgICBAQ29sdW1uKGlkID0gMikKKyAgICBwcm90ZWN0ZWQgQWNjb3VudEdyb3VwLlVVSUQgaW5jbHVkZVVVSUQ7CisKKyAgICBAQ29sdW1uKGlkID0gMykKKyAgICBwcm90ZWN0ZWQgVGltZXN0YW1wIGFkZGVkT247CisKKyAgICBwcm90ZWN0ZWQgS2V5KCkgeworICAgICAgZ3JvdXBJZCA9IG5ldyBBY2NvdW50R3JvdXAuSWQoKTsKKyAgICAgIGluY2x1ZGVVVUlEID0gbmV3IEFjY291bnRHcm91cC5VVUlEKCk7CisgICAgfQorCisgICAgcHVibGljIEtleShmaW5hbCBBY2NvdW50R3JvdXAuSWQgZywgZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgdSwgZmluYWwgVGltZXN0YW1wIHQpIHsKKyAgICAgIGdyb3VwSWQgPSBnOworICAgICAgaW5jbHVkZVVVSUQgPSB1OworICAgICAgYWRkZWRPbiA9IHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFjY291bnRHcm91cC5JZCBnZXRQYXJlbnRLZXkoKSB7CisgICAgICByZXR1cm4gZ3JvdXBJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgQWNjb3VudEdyb3VwLlVVSUQgZ2V0SW5jbHVkZVVVSUQoKSB7CisgICAgICByZXR1cm4gaW5jbHVkZVVVSUQ7CisgICAgfQorCisgICAgcHVibGljIFRpbWVzdGFtcCBnZXRBZGRlZE9uKCkgeworICAgICAgcmV0dXJuIGFkZGVkT247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5LZXk8Pz5bXSBtZW1iZXJzKCkgeworICAgICAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5PD8+W10ge2luY2x1ZGVVVUlEfTsKKyAgICB9CisgIH0KKworICBAQ29sdW1uKGlkID0gMSwgbmFtZSA9IENvbHVtbi5OT05FKQorICBwcm90ZWN0ZWQgS2V5IGtleTsKKworICBAQ29sdW1uKGlkID0gMikKKyAgcHJvdGVjdGVkIEFjY291bnQuSWQgYWRkZWRCeTsKKworICBAQ29sdW1uKGlkID0gMywgbm90TnVsbCA9IGZhbHNlKQorICBwcm90ZWN0ZWQgQWNjb3VudC5JZCByZW1vdmVkQnk7CisKKyAgQENvbHVtbihpZCA9IDQsIG5vdE51bGwgPSBmYWxzZSkKKyAgcHJvdGVjdGVkIFRpbWVzdGFtcCByZW1vdmVkT247CisKKyAgcHJvdGVjdGVkIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdCgpIHsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBtLAorICAgICAgZmluYWwgQWNjb3VudC5JZCBhZGRlciwgZmluYWwgVGltZXN0YW1wIHdoZW4pIHsKKyAgICBmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXAgPSBtLmdldEdyb3VwSWQoKTsKKyAgICBmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBpbmNsdWRlID0gbS5nZXRJbmNsdWRlVVVJRCgpOworICAgIGtleSA9IG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQuS2V5KGdyb3VwLCBpbmNsdWRlLCB3aGVuKTsKKyAgICBhZGRlZEJ5ID0gYWRkZXI7CisgIH0KKworICBwdWJsaWMgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0KGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgbSwKKyAgICAgIGZpbmFsIEFjY291bnQuSWQgYWRkZXIpIHsKKyAgICB0aGlzKG0sIGFkZGVyLCBub3coKSk7CisgIH0KKworICBwdWJsaWMgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0LktleSBnZXRLZXkoKSB7CisgICAgcmV0dXJuIGtleTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgeworICAgIHJldHVybiByZW1vdmVkT24gPT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlbW92ZWQoZmluYWwgQWNjb3VudC5JZCBkZWxldGVyKSB7CisgICAgcmVtb3ZlZEJ5ID0gZGVsZXRlcjsKKyAgICByZW1vdmVkT24gPSBub3coKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlbW92ZWQoZmluYWwgQWNjb3VudC5JZCBkZWxldGVyLCBmaW5hbCBUaW1lc3RhbXAgd2hlbikgeworICAgIHJlbW92ZWRCeSA9IGRlbGV0ZXI7CisgICAgcmVtb3ZlZE9uID0gd2hlbjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFRpbWVzdGFtcCBub3coKSB7CisgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudFByb2plY3RXYXRjaC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FjY291bnRQcm9qZWN0V2F0Y2guamF2YQppbmRleCBlNTkyMTAxLi5jN2Y1MmIwIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQWNjb3VudFByb2plY3RXYXRjaC5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BY2NvdW50UHJvamVjdFdhdGNoLmphdmEKQEAgLTIyLDcgKzIyLDggQEAKIHB1YmxpYyBmaW5hbCBjbGFzcyBBY2NvdW50UHJvamVjdFdhdGNoIHsKIAogICBwdWJsaWMgZW51bSBOb3RpZnlUeXBlIHsKLSAgICBORVdfQ0hBTkdFUywgQUxMX0NPTU1FTlRTLCBTVUJNSVRURURfQ0hBTkdFUywgQUxMCisgICAgTkVXX0NIQU5HRVMsIE5FV19QQVRDSFNFVFMsIEFMTF9DT01NRU5UUywgU1VCTUlUVEVEX0NIQU5HRVMsCisgICAgQUJBTkRPTkVEX0NIQU5HRVMsIEFMTAogICB9CiAKICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0FMTCA9ICIqIjsKQEAgLTEwOSw2ICsxMTAsMTIgQEAKICAgQENvbHVtbihpZCA9IDQpCiAgIHByb3RlY3RlZCBib29sZWFuIG5vdGlmeVN1Ym1pdHRlZENoYW5nZXM7CiAKKyAgQENvbHVtbihpZCA9IDUpCisgIHByb3RlY3RlZCBib29sZWFuIG5vdGlmeU5ld1BhdGNoU2V0czsKKworICBAQ29sdW1uKGlkID0gNikKKyAgcHJvdGVjdGVkIGJvb2xlYW4gbm90aWZ5QWJhbmRvbmVkQ2hhbmdlczsKKwogICBwcm90ZWN0ZWQgQWNjb3VudFByb2plY3RXYXRjaCgpIHsKICAgfQogCkBAIC0xMzcsMTEgKzE0NCwyMCBAQAogICAgICAgY2FzZSBORVdfQ0hBTkdFUzoKICAgICAgICAgcmV0dXJuIG5vdGlmeU5ld0NoYW5nZXM7CiAKKyAgICAgIGNhc2UgTkVXX1BBVENIU0VUUzoKKyAgICAgICAgcmV0dXJuIG5vdGlmeU5ld1BhdGNoU2V0czsKKwogICAgICAgY2FzZSBBTExfQ09NTUVOVFM6CiAgICAgICAgIHJldHVybiBub3RpZnlBbGxDb21tZW50czsKIAogICAgICAgY2FzZSBTVUJNSVRURURfQ0hBTkdFUzoKICAgICAgICAgcmV0dXJuIG5vdGlmeVN1Ym1pdHRlZENoYW5nZXM7CisKKyAgICAgIGNhc2UgQUJBTkRPTkVEX0NIQU5HRVM6CisgICAgICAgIHJldHVybiBub3RpZnlBYmFuZG9uZWRDaGFuZ2VzOworCisgICAgICBjYXNlIEFMTDoKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMTUyLDYgKzE2OCwxMCBAQAogICAgICAgICBub3RpZnlOZXdDaGFuZ2VzID0gdjsKICAgICAgICAgYnJlYWs7CiAKKyAgICAgIGNhc2UgTkVXX1BBVENIU0VUUzoKKyAgICAgICAgbm90aWZ5TmV3UGF0Y2hTZXRzID0gdjsKKyAgICAgICAgYnJlYWs7CisKICAgICAgIGNhc2UgQUxMX0NPTU1FTlRTOgogICAgICAgICBub3RpZnlBbGxDb21tZW50cyA9IHY7CiAgICAgICAgIGJyZWFrOwpAQCAtMTYwLDEwICsxODAsMTYgQEAKICAgICAgICAgbm90aWZ5U3VibWl0dGVkQ2hhbmdlcyA9IHY7CiAgICAgICAgIGJyZWFrOwogCisgICAgICBjYXNlIEFCQU5ET05FRF9DSEFOR0VTOgorICAgICAgICBub3RpZnlBYmFuZG9uZWRDaGFuZ2VzID0gdjsKKyAgICAgICAgYnJlYWs7CisKICAgICAgIGNhc2UgQUxMOgogICAgICAgICBub3RpZnlOZXdDaGFuZ2VzID0gdjsKKyAgICAgICAgbm90aWZ5TmV3UGF0Y2hTZXRzID0gdjsKICAgICAgICAgbm90aWZ5QWxsQ29tbWVudHMgPSB2OwogICAgICAgICBub3RpZnlTdWJtaXR0ZWRDaGFuZ2VzID0gdjsKKyAgICAgICAgbm90aWZ5QWJhbmRvbmVkQ2hhbmdlcyA9IHY7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FwcHJvdmFsQ2F0ZWdvcnkuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9BcHByb3ZhbENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjE5NzUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FwcHJvdmFsQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LkNvbHVtbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5TdHJpbmdLZXk7Ci0KLS8qKiBUeXBlcyBvZiBhcHByb3ZhbHMgdGhhdCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIENoYW5nZX0uICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBwcm92YWxDYXRlZ29yeSB7Ci0gIC8qKiBJZCBvZiB0aGUgc3BlY2lhbCAiU3VibWl0IiBhY3Rpb24gKGFuZCBjYXRlZ29yeSkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBTVUJNSVQgPQotICAgICAgbmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoIlNVQk0iKTsKLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIElkIGV4dGVuZHMgU3RyaW5nS2V5PEtleTw/Pj4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQENvbHVtbihpZCA9IDEsIGxlbmd0aCA9IDQpCi0gICAgcHJvdGVjdGVkIFN0cmluZyBpZDsKLQotICAgIHByb3RlY3RlZCBJZCgpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSWQoZmluYWwgU3RyaW5nIGEpIHsKLSAgICAgIGlkID0gYTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKLSAgICAgIHJldHVybiBpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0gICAgICBpZCA9IG5ld1ZhbHVlOwotICAgIH0KLSAgfQotCi0gIC8qKiBJbnRlcm5hbCBzaG9ydCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBjYXRlZ29yeS4gKi8KLSAgQENvbHVtbihpZCA9IDEpCi0gIHByb3RlY3RlZCBJZCBjYXRlZ29yeUlkOwotCi0gIC8qKiBVbmlxdWUgbmFtZSBmb3IgdGhpcyBjYXRlZ29yeSwgc2hvd24gaW4gdGhlIHdlYiBpbnRlcmZhY2UgdG8gdXNlcnMuICovCi0gIEBDb2x1bW4oaWQgPSAyLCBsZW5ndGggPSAyMCkKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gIC8qKiBBYmJyZXZpYXRlZCBmb3JtIG9mIHtAbGluayAjbmFtZX0gZm9yIGRpc3BsYXkgaW4gdmVyeSB3aWRlIHRhYmxlcy4gKi8KLSAgQENvbHVtbihpZCA9IDMsIGxlbmd0aCA9IDQsIG5vdE51bGwgPSBmYWxzZSkKLSAgcHJvdGVjdGVkIFN0cmluZyBhYmJyZXZpYXRlZE5hbWU7Ci0KLSAgLyoqIE9yZGVyIG9mIHRoaXMgY2F0ZWdvcnkgd2l0aGluIHRoZSBBcHByb3ZhbHMgdGFibGUgd2hlbiBwcmVzZW50ZWQuICovCi0gIEBDb2x1bW4oaWQgPSA0KQotICBwcm90ZWN0ZWQgc2hvcnQgcG9zaXRpb247Ci0KLSAgLyoqIElkZW50aXR5IG9mIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGFnZ3JlZ2F0ZSB0aGUgY2F0ZWdvcnkncyB2YWx1ZS4gKi8KLSAgQENvbHVtbihpZCA9IDUpCi0gIHByb3RlY3RlZCBTdHJpbmcgZnVuY3Rpb25OYW1lOwotCi0gIC8qKiBJZiBzZXQsIHRoZSBtaW5pbXVtIHNjb3JlIGlzIGNvcGllZCBkdXJpbmcgcGF0Y2ggc2V0IHJlcGxhY2VtZW50LiAqLwotICBAQ29sdW1uKGlkID0gNikKLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29weU1pblNjb3JlOwotCi0gIC8qKiBDb21wdXRlZCBuYW1lIGRlcml2ZWQgZnJvbSB7QGxpbmsgI25hbWV9LiAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGxhYmVsTmFtZTsKLQotICBwcm90ZWN0ZWQgQXBwcm92YWxDYXRlZ29yeSgpIHsKLSAgfQotCi0gIHB1YmxpYyBBcHByb3ZhbENhdGVnb3J5KGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgaWQsIGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgdGhpcy5jYXRlZ29yeUlkID0gaWQ7Ci0gICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9ICJNYXhXaXRoQmxvY2siOwotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgZ2V0SWQoKSB7Ci0gICAgcmV0dXJuIGNhdGVnb3J5SWQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuKSB7Ci0gICAgbmFtZSA9IG47Ci0gICAgbGFiZWxOYW1lID0gbnVsbDsKLSAgfQotCi0gIC8qKiBDbGVhbiB2ZXJzaW9uIG9mIHtAbGluayAjZ2V0TmFtZSgpfSwgZS5nLiAiQ29kZSBSZXZpZXciIGlzICJDb2RlLVJldmlldyIuICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxOYW1lKCkgewotICAgIGlmIChsYWJlbE5hbWUgPT0gbnVsbCkgewotICAgICAgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIGNoYXIgYyA9IG5hbWUuY2hhckF0KGkpOwotICAgICAgICBpZiAoKCcwJyA8PSBjICYmIGMgPD0gJzknKSAvLwotICAgICAgICAgICAgfHwgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSAvLwotICAgICAgICAgICAgfHwgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSAvLwotICAgICAgICAgICAgfHwgKGMgPT0gJy0nKSkgewotICAgICAgICAgIHIuYXBwZW5kKGMpOwotICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyAnKSB7Ci0gICAgICAgICAgci5hcHBlbmQoJy0nKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbGFiZWxOYW1lID0gci50b1N0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gbGFiZWxOYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRBYmJyZXZpYXRlZE5hbWUoKSB7Ci0gICAgcmV0dXJuIGFiYnJldmlhdGVkTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEFiYnJldmlhdGVkTmFtZShmaW5hbCBTdHJpbmcgbikgewotICAgIGFiYnJldmlhdGVkTmFtZSA9IG47Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgZ2V0UG9zaXRpb24oKSB7Ci0gICAgcmV0dXJuIHBvc2l0aW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oZmluYWwgc2hvcnQgcCkgewotICAgIHBvc2l0aW9uID0gcDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKCkgewotICAgIHJldHVybiBmdW5jdGlvbk5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRGdW5jdGlvbk5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICBmdW5jdGlvbk5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNDb3B5TWluU2NvcmUoKSB7Ci0gICAgcmV0dXJuIGNvcHlNaW5TY29yZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENvcHlNaW5TY29yZShmaW5hbCBib29sZWFuIGNvcHkpIHsKLSAgICBjb3B5TWluU2NvcmUgPSBjb3B5OwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQXBwcm92YWxDYXRlZ29yeVZhbHVlLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQXBwcm92YWxDYXRlZ29yeVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzYxYzUuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0FwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29sdW1uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmNsaWVudC5TaG9ydEtleTsKLQotLyoqIFZhbGlkIHZhbHVlIGZvciBhIHtAbGluayBBcHByb3ZhbENhdGVnb3J5fS4gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcHByb3ZhbENhdGVnb3J5VmFsdWUgewotICBwdWJsaWMgc3RhdGljIGNsYXNzIElkIGV4dGVuZHMgU2hvcnRLZXk8QXBwcm92YWxDYXRlZ29yeS5JZD4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgQENvbHVtbihpZCA9IDEpCi0gICAgcHJvdGVjdGVkIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0ZWdvcnlJZDsKLQotICAgIEBDb2x1bW4oaWQgPSAyKQotICAgIHByb3RlY3RlZCBzaG9ydCB2YWx1ZTsKLQotICAgIHByb3RlY3RlZCBJZCgpIHsKLSAgICAgIGNhdGVnb3J5SWQgPSBuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJZChmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIGNhdCwgZmluYWwgc2hvcnQgdikgewotICAgICAgY2F0ZWdvcnlJZCA9IGNhdDsKLSAgICAgIHZhbHVlID0gdjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeS5JZCBnZXRQYXJlbnRLZXkoKSB7Ci0gICAgICByZXR1cm4gY2F0ZWdvcnlJZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc2hvcnQgZ2V0KCkgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIHNldChzaG9ydCBuZXdWYWx1ZSkgewotICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKLSAgICB9Ci0gIH0KLQotICBAQ29sdW1uKGlkID0gMSwgbmFtZSA9IENvbHVtbi5OT05FKQotICBwcm90ZWN0ZWQgSWQga2V5OwotCi0gIEBDb2x1bW4oaWQgPSAyLCBsZW5ndGggPSA1MCkKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0gIHByb3RlY3RlZCBBcHByb3ZhbENhdGVnb3J5VmFsdWUoKSB7Ci0gIH0KLQotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeVZhbHVlKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZCBpZCwKLSAgICAgIGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgdGhpcy5rZXkgPSBpZDsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZCBnZXRJZCgpIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0KLSAgcHVibGljIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgZ2V0Q2F0ZWdvcnlJZCgpIHsKLSAgICByZXR1cm4ga2V5LmNhdGVnb3J5SWQ7Ci0gIH0KLQotICBwdWJsaWMgc2hvcnQgZ2V0VmFsdWUoKSB7Ci0gICAgcmV0dXJuIGtleS52YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG4pIHsKLSAgICBuYW1lID0gbjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZm9ybWF0VmFsdWUoKSB7Ci0gICAgaWYgKGdldFZhbHVlKCkgPCAwKSB7Ci0gICAgICByZXR1cm4gU2hvcnQudG9TdHJpbmcoZ2V0VmFsdWUoKSk7Ci0gICAgfSBlbHNlIGlmIChnZXRWYWx1ZSgpID09IDApIHsKLSAgICAgIHJldHVybiAiIDAiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gIisiICsgU2hvcnQudG9TdHJpbmcoZ2V0VmFsdWUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFN0cmluZyBmb3JtYXQoKSB7Ci0gICAgZmluYWwgU3RyaW5nQnVpbGRlciBtID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBtLmFwcGVuZChmb3JtYXRWYWx1ZSgpKTsKLSAgICBtLmFwcGVuZCgnICcpOwotICAgIG0uYXBwZW5kKGdldE5hbWUoKSk7Ci0gICAgcmV0dXJuIG0udG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0NoYW5nZS5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L0NoYW5nZS5qYXZhCmluZGV4IGJmYmFjYzAuLjJhNTE4NzIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9DaGFuZ2UuamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvQ2hhbmdlLmphdmEKQEAgLTE5Myw2ICsxOTMsOSBAQAogICAvKiogRGF0YWJhc2UgY29uc3RhbnQgZm9yIHtAbGluayBTdGF0dXMjTUVSR0VEfS4gKi8KICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNUQVRVU19NRVJHRUQgPSAnTSc7CiAKKyAgLyoqIElEIG51bWJlciBvZiB0aGUgZmlyc3QgcGF0Y2ggc2V0IGluIGEgY2hhbmdlLiAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1BBVENIX1NFVF9JRCA9IDE7CisKICAgLyoqCiAgICAqIEN1cnJlbnQgc3RhdGUgd2l0aGluIHRoZSBiYXNpYyB3b3JrZmxvdyBvZiB0aGUgY2hhbmdlLgogICAgKgpAQCAtMzU5LDEwICszNjIsNiBAQAogICBAQ29sdW1uKGlkID0gMTApCiAgIHByb3RlY3RlZCBjaGFyIHN0YXR1czsKIAotICAvKiogVGhlIHRvdGFsIG51bWJlciBvZiB7QGxpbmsgUGF0Y2hTZXR9IGNoaWxkcmVuIGluIHRoaXMgQ2hhbmdlLiAqLwotICBAQ29sdW1uKGlkID0gMTEpCi0gIHByb3RlY3RlZCBpbnQgbmJyUGF0Y2hTZXRzOwotCiAgIC8qKiBUaGUgY3VycmVudCBwYXRjaCBzZXQuICovCiAgIEBDb2x1bW4oaWQgPSAxMikKICAgcHJvdGVjdGVkIGludCBjdXJyZW50UGF0Y2hTZXRJZDsKQEAgLTQyOCwxMiArNDI3LDEyIEBACiAgICAgcmV0dXJuIGxhc3RVcGRhdGVkT247CiAgIH0KIAotICBwdWJsaWMgdm9pZCByZXNldExhc3RVcGRhdGVkT24oKSB7Ci0gICAgbGFzdFVwZGF0ZWRPbiA9IG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICBwdWJsaWMgdm9pZCBzZXRMYXN0VXBkYXRlZE9uKFRpbWVzdGFtcCBub3cpIHsKKyAgICBsYXN0VXBkYXRlZE9uID0gbm93OwogICB9CiAKLSAgcHVibGljIGludCBnZXROdW1iZXJPZlBhdGNoU2V0cygpIHsKLSAgICByZXR1cm4gbmJyUGF0Y2hTZXRzOworICBwdWJsaWMgdm9pZCByZXNldExhc3RVcGRhdGVkT24oKSB7CisgICAgbGFzdFVwZGF0ZWRPbiA9IG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICB9CiAKICAgcHVibGljIFN0cmluZyBnZXRTb3J0S2V5KCkgewpAQCAtNDczLDMyICs0NzIsNiBAQAogICAgIHN1YmplY3QgPSBwcy5nZXRTdWJqZWN0KCk7CiAgIH0KIAotICAvKioKLSAgICogQWxsb2NhdGUgYSBuZXcgUGF0Y2hTZXQgaWQgd2l0aGluIHRoaXMgY2hhbmdlLgotICAgKiA8cD4KLSAgICogPGI+Tm90ZTogVGhpcyBtYWtlcyB0aGUgY2hhbmdlIGRpcnR5LiBDYWxsIHVwZGF0ZSgpIGFmdGVyLjwvYj4KLSAgICovCi0gIHB1YmxpYyB2b2lkIG5leHRQYXRjaFNldElkKCkgewotICAgICsrbmJyUGF0Y2hTZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldmVydHMgdG8gYW4gb2xkZXIgUGF0Y2hTZXQgaWQgd2l0aGluIHRoaXMgY2hhbmdlLgotICAgKiA8cD4KLSAgICogPGI+Tm90ZTogVGhpcyBtYWtlcyB0aGUgY2hhbmdlIGRpcnR5LiBDYWxsIHVwZGF0ZSgpIGFmdGVyLjwvYj4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxhc3RQYXRjaFNldElkKCkgewotICAgIC0tbmJyUGF0Y2hTZXRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdXBkYXRlTnVtYmVyT2ZQYXRjaFNldHMoaW50IG1heCkgewotICAgIG5iclBhdGNoU2V0cyA9IE1hdGgubWF4KG5iclBhdGNoU2V0cywgbWF4KTsKLSAgfQotCi0gIHB1YmxpYyBQYXRjaFNldC5JZCBjdXJyUGF0Y2hTZXRJZCgpIHsKLSAgICByZXR1cm4gbmV3IFBhdGNoU2V0LklkKGNoYW5nZUlkLCBuYnJQYXRjaFNldHMpOwotICB9Ci0KICAgcHVibGljIFN0YXR1cyBnZXRTdGF0dXMoKSB7CiAgICAgcmV0dXJuIFN0YXR1cy5mb3JDb2RlKHN0YXR1cyk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9Jbmhlcml0ZWRCb29sZWFuLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvSW5oZXJpdGVkQm9vbGVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NGI0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvSW5oZXJpdGVkQm9vbGVhbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5Jbmhlcml0YWJsZUJvb2xlYW47CisKK3B1YmxpYyBjbGFzcyBJbmhlcml0ZWRCb29sZWFuIHsKKworICBwdWJsaWMgSW5oZXJpdGFibGVCb29sZWFuIHZhbHVlOworICBwdWJsaWMgYm9vbGVhbiBpbmhlcml0ZWRWYWx1ZTsKKworICBwdWJsaWMgSW5oZXJpdGVkQm9vbGVhbigpIHsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIEluaGVyaXRhYmxlQm9vbGVhbiB2YWx1ZSkgeworICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEluaGVyaXRlZFZhbHVlKGZpbmFsIGJvb2xlYW4gaW5oZXJpdGVkVmFsdWUpIHsKKyAgICB0aGlzLmluaGVyaXRlZFZhbHVlID0gaW5oZXJpdGVkVmFsdWU7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoLmphdmEKaW5kZXggMDBlMjgyYi4uNmRkZDZkMiAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoLmphdmEKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAvKiogUGF0aCB3YXMgY29waWVkIGZyb20ge0BsaW5rIFBhdGNoI2dldFNvdXJjZUZpbGVOYW1lKCl9LiAqLwogICAgIENPUElFRCgnQycpLAogCi0gICAgLyoqIFN1ZmZpY2llbnQgYW1vdW50IG9mIGNvbnRlbnQgY2hhbmdlZCB0byBjbGFpbSB0aGUgZmlsZSB3YXMgd3JpdHRlbi4gKi8KKyAgICAvKiogU3VmZmljaWVudCBhbW91bnQgb2YgY29udGVudCBjaGFuZ2VkIHRvIGNsYWltIHRoZSBmaWxlIHdhcyByZXdyaXR0ZW4uICovCiAgICAgUkVXUklURSgnVycpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBjaGFyIGNvZGU7CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hMaW5lQ29tbWVudC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoTGluZUNvbW1lbnQuamF2YQppbmRleCBjOGE5NzBkLi5hZjM1ZTUyZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoTGluZUNvbW1lbnQuamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hMaW5lQ29tbWVudC5qYXZhCkBAIC0xMzgsNiArMTM4LDEwIEBACiAgICAgcmV0dXJuIGxpbmVOYnI7CiAgIH0KIAorICBwdWJsaWMgdm9pZCBzZXRMaW5lKGludCBsaW5lKSB7CisgICAgbGluZU5iciA9IGxpbmU7CisgIH0KKwogICBwdWJsaWMgQWNjb3VudC5JZCBnZXRBdXRob3IoKSB7CiAgICAgcmV0dXJuIGF1dGhvcjsKICAgfQpAQCAtMTc0LDcgKzE3OCwxNSBAQAogICAgIHdyaXR0ZW5PbiA9IG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICB9CiAKKyAgcHVibGljIHZvaWQgc2V0V3JpdHRlbk9uKFRpbWVzdGFtcCB0cykgeworICAgIHdyaXR0ZW5PbiA9IHRzOworICB9CisKICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRVdWlkKCkgewogICAgIHJldHVybiBwYXJlbnRVdWlkOwogICB9CisKKyAgcHVibGljIHZvaWQgc2V0UGFyZW50VXVpZChTdHJpbmcgaW5SZXBseVRvKSB7CisgICAgcGFyZW50VXVpZCA9IGluUmVwbHlUbzsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoU2V0LmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hTZXQuamF2YQppbmRleCA4M2NlODI4Li41NGM1NTZkIDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hTZXQuamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hTZXQuamF2YQpAQCAtMjUsNyArMjUsMjcgQEAKIAogICAvKiogSXMgdGhlIHJlZmVyZW5jZSBuYW1lIGEgY2hhbmdlIHJlZmVyZW5jZT8gKi8KICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIG5hbWUubWF0Y2hlcygiXnJlZnMvY2hhbmdlcy8uKi9bMS05XVswLTldKi9bMS05XVswLTldKiQiKTsKKyAgICBpZiAobmFtZSA9PSBudWxsIHx8ICFuYW1lLnN0YXJ0c1dpdGgoUkVGU19DSEFOR0VTKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sZWFuIGFjY2VwdGVkID0gZmFsc2U7CisgICAgaW50IG51bXNGb3VuZCA9IDA7CisgICAgZm9yIChpbnQgaSA9IG5hbWUubGVuZ3RoKCkgLSAxOyBpID49IFJFRlNfQ0hBTkdFUy5sZW5ndGgoKSAtIDE7IGktLSkgeworICAgICAgY2hhciBjID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgYWNjZXB0ZWQgPSAoYyAhPSAnMCcpOworICAgICAgfSBlbHNlIGlmIChjID09ICcvJykgeworICAgICAgICBpZiAoYWNjZXB0ZWQpIHsKKyAgICAgICAgICBpZiAoKytudW1zRm91bmQgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGFjY2VwdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBJZCBleHRlbmRzIEludEtleTxDaGFuZ2UuSWQ+IHsKQEAgLTYxLDYgKzgxLDIyIEBACiAgICAgICBwYXRjaFNldElkID0gbmV3VmFsdWU7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZyB0b1JlZk5hbWUoKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgci5hcHBlbmQoUkVGU19DSEFOR0VTKTsKKyAgICAgIGludCBjaGFuZ2UgPSBjaGFuZ2VJZC5nZXQoKTsKKyAgICAgIGludCBtID0gY2hhbmdlICUgMTAwOworICAgICAgaWYgKG0gPCAxMCkgeworICAgICAgICByLmFwcGVuZCgnMCcpOworICAgICAgfQorICAgICAgci5hcHBlbmQobSk7CisgICAgICByLmFwcGVuZCgnLycpOworICAgICAgci5hcHBlbmQoY2hhbmdlKTsKKyAgICAgIHIuYXBwZW5kKCcvJyk7CisgICAgICByLmFwcGVuZChwYXRjaFNldElkKTsKKyAgICAgIHJldHVybiByLnRvU3RyaW5nKCk7CisgICAgfQorCiAgICAgLyoqIFBhcnNlIGEgUGF0Y2hTZXQuSWQgb3V0IG9mIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiAqLwogICAgIHB1YmxpYyBzdGF0aWMgSWQgcGFyc2UoZmluYWwgU3RyaW5nIHN0cikgewogICAgICAgZmluYWwgSWQgciA9IG5ldyBJZCgpOwpAQCAtMTQ4LDE5ICsxODQsNyBAQAogICB9CiAKICAgcHVibGljIFN0cmluZyBnZXRSZWZOYW1lKCkgewotICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgci5hcHBlbmQoUkVGU19DSEFOR0VTKTsKLSAgICBmaW5hbCBpbnQgY2hhbmdlSWQgPSBpZC5nZXRQYXJlbnRLZXkoKS5nZXQoKTsKLSAgICBmaW5hbCBpbnQgbSA9IGNoYW5nZUlkICUgMTAwOwotICAgIGlmIChtIDwgMTApIHsKLSAgICAgIHIuYXBwZW5kKCcwJyk7Ci0gICAgfQotICAgIHIuYXBwZW5kKG0pOwotICAgIHIuYXBwZW5kKCcvJyk7Ci0gICAgci5hcHBlbmQoY2hhbmdlSWQpOwotICAgIHIuYXBwZW5kKCcvJyk7Ci0gICAgci5hcHBlbmQoaWQuZ2V0KCkpOwotICAgIHJldHVybiByLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIGlkLnRvUmVmTmFtZSgpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hTZXRBcHByb3ZhbC5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1BhdGNoU2V0QXBwcm92YWwuamF2YQppbmRleCAwNGIyYjZmLi44ZDc5ZDY2IDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUGF0Y2hTZXRBcHByb3ZhbC5qYXZhCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9QYXRjaFNldEFwcHJvdmFsLmphdmEKQEAgLTE2LDExICsxNiw1MiBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LkNvbHVtbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuQ29tcG91bmRLZXk7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LlN0cmluZ0tleTsKIAogaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKIAogLyoqIEFuIGFwcHJvdmFsIChvciBuZWdhdGl2ZSBhcHByb3ZhbCkgb24gYSBwYXRjaCBzZXQuICovCiBwdWJsaWMgZmluYWwgY2xhc3MgUGF0Y2hTZXRBcHByb3ZhbCB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGFiZWxJZCBleHRlbmRzCisgICAgICBTdHJpbmdLZXk8Y29tLmdvb2dsZS5nd3Rvcm0uY2xpZW50LktleTw/Pj4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMYWJlbElkIFNVQk1JVCA9IG5ldyBMYWJlbElkKCJTVUJNIik7CisKKyAgICBAQ29sdW1uKGlkID0gMSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkOworCisgICAgcHJvdGVjdGVkIExhYmVsSWQoKSB7CisgICAgfQorCisgICAgcHVibGljIExhYmVsSWQoZmluYWwgU3RyaW5nIG4pIHsKKyAgICAgIGlkID0gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXQoU3RyaW5nIG5ld1ZhbHVlKSB7CisgICAgICBpZCA9IG5ld1ZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICByZXR1cm4gZ2V0KCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGIpIHsKKyAgICAgIGlmIChiIGluc3RhbmNlb2YgTGFiZWxJZCkgeworICAgICAgICByZXR1cm4gZ2V0KCkuZXF1YWxzKCgoTGFiZWxJZCkgYikuZ2V0KCkpOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgS2V5IGV4dGVuZHMgQ29tcG91bmRLZXk8UGF0Y2hTZXQuSWQ+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIApAQCAtMzEsMTYgKzcyLDE2IEBACiAgICAgcHJvdGVjdGVkIEFjY291bnQuSWQgYWNjb3VudElkOwogCiAgICAgQENvbHVtbihpZCA9IDMpCi0gICAgcHJvdGVjdGVkIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0ZWdvcnlJZDsKKyAgICBwcm90ZWN0ZWQgTGFiZWxJZCBjYXRlZ29yeUlkOwogCiAgICAgcHJvdGVjdGVkIEtleSgpIHsKICAgICAgIHBhdGNoU2V0SWQgPSBuZXcgUGF0Y2hTZXQuSWQoKTsKICAgICAgIGFjY291bnRJZCA9IG5ldyBBY2NvdW50LklkKCk7Ci0gICAgICBjYXRlZ29yeUlkID0gbmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoKTsKKyAgICAgIGNhdGVnb3J5SWQgPSBuZXcgTGFiZWxJZCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBLZXkoZmluYWwgUGF0Y2hTZXQuSWQgcHMsIGZpbmFsIEFjY291bnQuSWQgYSwKLSAgICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBjKSB7CisgICAgICAgIGZpbmFsIExhYmVsSWQgYykgewogICAgICAgdGhpcy5wYXRjaFNldElkID0gcHM7CiAgICAgICB0aGlzLmFjY291bnRJZCA9IGE7CiAgICAgICB0aGlzLmNhdGVnb3J5SWQgPSBjOwpAQCAtNTUsNyArOTYsNyBAQAogICAgICAgcmV0dXJuIGFjY291bnRJZDsKICAgICB9CiAKLSAgICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeS5JZCBnZXRDYXRlZ29yeUlkKCkgeworICAgIHB1YmxpYyBMYWJlbElkIGdldExhYmVsSWQoKSB7CiAgICAgICByZXR1cm4gY2F0ZWdvcnlJZDsKICAgICB9CiAKQEAgLTEwOCw3ICsxNDksNyBAQAogCiAgIHB1YmxpYyBQYXRjaFNldEFwcHJvdmFsKGZpbmFsIFBhdGNoU2V0LklkIHBzSWQsIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgc3JjKSB7CiAgICAga2V5ID0KLSAgICAgICAgbmV3IFBhdGNoU2V0QXBwcm92YWwuS2V5KHBzSWQsIHNyYy5nZXRBY2NvdW50SWQoKSwgc3JjLmdldENhdGVnb3J5SWQoKSk7CisgICAgICAgIG5ldyBQYXRjaFNldEFwcHJvdmFsLktleShwc0lkLCBzcmMuZ2V0QWNjb3VudElkKCksIHNyYy5nZXRMYWJlbElkKCkpOwogICAgIGNoYW5nZU9wZW4gPSB0cnVlOwogICAgIHZhbHVlID0gc3JjLmdldFZhbHVlKCk7CiAgICAgZ3JhbnRlZCA9IHNyYy5ncmFudGVkOwpAQCAtMTI2LDcgKzE2Nyw3IEBACiAgICAgcmV0dXJuIGtleS5hY2NvdW50SWQ7CiAgIH0KIAotICBwdWJsaWMgQXBwcm92YWxDYXRlZ29yeS5JZCBnZXRDYXRlZ29yeUlkKCkgeworICBwdWJsaWMgTGFiZWxJZCBnZXRMYWJlbElkKCkgewogICAgIHJldHVybiBrZXkuY2F0ZWdvcnlJZDsKICAgfQogCkBAIC0xNDYsOCArMTg3LDI2IEBACiAgICAgZ3JhbnRlZCA9IG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICB9CiAKKyAgcHVibGljIHZvaWQgc2V0R3JhbnRlZChUaW1lc3RhbXAgdHMpIHsKKyAgICBncmFudGVkID0gdHM7CisgIH0KKwogICBwdWJsaWMgdm9pZCBjYWNoZShmaW5hbCBDaGFuZ2UgYykgewogICAgIGNoYW5nZU9wZW4gPSBjLm9wZW47CiAgICAgY2hhbmdlU29ydEtleSA9IGMuc29ydEtleTsKICAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7CisgICAgcmV0dXJuIGdldExhYmVsSWQoKS5nZXQoKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzU3VibWl0KCkgeworICAgIHJldHVybiBMYWJlbElkLlNVQk1JVC5nZXQoKS5lcXVhbHMoZ2V0TGFiZWwoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoJ1snKS5hcHBlbmQoa2V5KS5hcHBlbmQoIjogIikKKyAgICAgICAgLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCddJykudG9TdHJpbmcoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1Byb2plY3QuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL2NsaWVudC9Qcm9qZWN0LmphdmEKaW5kZXggYTJmYzQ2Zi4uYzA3MGUzZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvY2xpZW50L1Byb2plY3QuamF2YQorKysgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9jbGllbnQvUHJvamVjdC5qYXZhCkBAIC03MCw2ICs3MCw4IEBACiAKICAgICBNRVJHRV9JRl9ORUNFU1NBUlksCiAKKyAgICBSRUJBU0VfSUZfTkVDRVNTQVJZLAorCiAgICAgTUVSR0VfQUxXQVlTLAogCiAgICAgQ0hFUlJZX1BJQ0s7CkBAIC04MywxMyArODUsMTkgQEAKICAgICBISURERU47CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIGVudW0gSW5oZXJpdGFibGVCb29sZWFuIHsKKyAgICBUUlVFLAorICAgIEZBTFNFLAorICAgIElOSEVSSVQ7CisgIH0KKwogICBwcm90ZWN0ZWQgTmFtZUtleSBuYW1lOwogCiAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247CiAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzOworICBwcm90ZWN0ZWQgSW5oZXJpdGFibGVCb29sZWFuIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50czsKIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VTaWduZWRPZmZCeTsKKyAgcHJvdGVjdGVkIEluaGVyaXRhYmxlQm9vbGVhbiB1c2VTaWduZWRPZmZCeTsKIAogICBwcm90ZWN0ZWQgU3VibWl0VHlwZSBzdWJtaXRUeXBlOwogCkBAIC05Nyw5ICsxMDUsMTMgQEAKIAogICBwcm90ZWN0ZWQgTmFtZUtleSBwYXJlbnQ7CiAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZUNoYW5nZUlEOworICBwcm90ZWN0ZWQgSW5oZXJpdGFibGVCb29sZWFuIHJlcXVpcmVDaGFuZ2VJRDsKIAotICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VDb250ZW50TWVyZ2U7CisgIHByb3RlY3RlZCBJbmhlcml0YWJsZUJvb2xlYW4gdXNlQ29udGVudE1lcmdlOworCisgIHByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdERhc2hib2FyZElkOworCisgIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxEZWZhdWx0RGFzaGJvYXJkSWQ7CiAKICAgcHJvdGVjdGVkIFByb2plY3QoKSB7CiAgIH0KQEAgLTEwOCw2ICsxMjAsMTAgQEAKICAgICBuYW1lID0gbmFtZUtleTsKICAgICBzdWJtaXRUeXBlID0gU3VibWl0VHlwZS5NRVJHRV9JRl9ORUNFU1NBUlk7CiAgICAgc3RhdGUgPSBTdGF0ZS5BQ1RJVkU7CisgICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzID0gSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQ7CisgICAgdXNlU2lnbmVkT2ZmQnkgPSBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgICByZXF1aXJlQ2hhbmdlSUQgPSBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgICB1c2VDb250ZW50TWVyZ2UgPSBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKICAgfQogCiAgIHB1YmxpYyBQcm9qZWN0Lk5hbWVLZXkgZ2V0TmFtZUtleSgpIHsKQEAgLTEyNiwzNSArMTQyLDM1IEBACiAgICAgZGVzY3JpcHRpb24gPSBkOwogICB9CiAKLSAgcHVibGljIGJvb2xlYW4gaXNVc2VDb250cmlidXRvckFncmVlbWVudHMoKSB7CisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gZ2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkgewogICAgIHJldHVybiB1c2VDb250cmlidXRvckFncmVlbWVudHM7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoZmluYWwgYm9vbGVhbiB1KSB7Ci0gICAgdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzID0gdTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVXNlU2lnbmVkT2ZmQnkoKSB7CisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gZ2V0VXNlU2lnbmVkT2ZmQnkoKSB7CiAgICAgcmV0dXJuIHVzZVNpZ25lZE9mZkJ5OwogICB9CiAKLSAgcHVibGljIGJvb2xlYW4gaXNVc2VDb250ZW50TWVyZ2UoKSB7CisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gZ2V0VXNlQ29udGVudE1lcmdlKCkgewogICAgIHJldHVybiB1c2VDb250ZW50TWVyZ2U7CiAgIH0KIAotICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVpcmVDaGFuZ2VJRCgpIHsKKyAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBnZXRSZXF1aXJlQ2hhbmdlSUQoKSB7CiAgICAgcmV0dXJuIHJlcXVpcmVDaGFuZ2VJRDsKICAgfQogCi0gIHB1YmxpYyB2b2lkIHNldFVzZVNpZ25lZE9mZkJ5KGZpbmFsIGJvb2xlYW4gc2JvKSB7CisgIHB1YmxpYyB2b2lkIHNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhmaW5hbCBJbmhlcml0YWJsZUJvb2xlYW4gdSkgeworICAgIHVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9IHU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRVc2VTaWduZWRPZmZCeShmaW5hbCBJbmhlcml0YWJsZUJvb2xlYW4gc2JvKSB7CiAgICAgdXNlU2lnbmVkT2ZmQnkgPSBzYm87CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRVc2VDb250ZW50TWVyZ2UoZmluYWwgYm9vbGVhbiBjbSkgeworICBwdWJsaWMgdm9pZCBzZXRVc2VDb250ZW50TWVyZ2UoZmluYWwgSW5oZXJpdGFibGVCb29sZWFuIGNtKSB7CiAgICAgdXNlQ29udGVudE1lcmdlID0gY207CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlQ2hhbmdlSUQoZmluYWwgYm9vbGVhbiBjaWQpIHsKKyAgcHVibGljIHZvaWQgc2V0UmVxdWlyZUNoYW5nZUlEKGZpbmFsIEluaGVyaXRhYmxlQm9vbGVhbiBjaWQpIHsKICAgICByZXF1aXJlQ2hhbmdlSUQgPSBjaWQ7CiAgIH0KIApAQCAtMTc0LDYgKzE5MCwyMiBAQAogICAgIHN0YXRlID0gbmV3U3RhdGU7CiAgIH0KIAorICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREYXNoYm9hcmQoKSB7CisgICAgcmV0dXJuIGRlZmF1bHREYXNoYm9hcmRJZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldERlZmF1bHREYXNoYm9hcmQoZmluYWwgU3RyaW5nIGRlZmF1bHREYXNoYm9hcmRJZCkgeworICAgIHRoaXMuZGVmYXVsdERhc2hib2FyZElkID0gZGVmYXVsdERhc2hib2FyZElkOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRMb2NhbERlZmF1bHREYXNoYm9hcmQoKSB7CisgICAgcmV0dXJuIGxvY2FsRGVmYXVsdERhc2hib2FyZElkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0TG9jYWxEZWZhdWx0RGFzaGJvYXJkKGZpbmFsIFN0cmluZyBsb2NhbERlZmF1bHREYXNoYm9hcmRJZCkgeworICAgIHRoaXMubG9jYWxEZWZhdWx0RGFzaGJvYXJkSWQgPSBsb2NhbERlZmF1bHREYXNoYm9hcmRJZDsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIGNvcHlTZXR0aW5nc0Zyb20oZmluYWwgUHJvamVjdCB1cGRhdGUpIHsKICAgICBkZXNjcmlwdGlvbiA9IHVwZGF0ZS5kZXNjcmlwdGlvbjsKICAgICB1c2VDb250cmlidXRvckFncmVlbWVudHMgPSB1cGRhdGUudXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVBY2Nlc3MuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BY2NvdW50R3JvdXBJbmNsdWRlQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZTRiYTAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BY2Nlc3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUHJpbWFyeUtleTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUXVlcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlJlc3VsdFNldDsKLQotcHVibGljIGludGVyZmFjZSBBY2NvdW50R3JvdXBJbmNsdWRlQWNjZXNzIGV4dGVuZHMKLSAgICBBY2Nlc3M8QWNjb3VudEdyb3VwSW5jbHVkZSwgQWNjb3VudEdyb3VwSW5jbHVkZS5LZXk+IHsKLSAgQFByaW1hcnlLZXkoImtleSIpCi0gIEFjY291bnRHcm91cEluY2x1ZGUgZ2V0KEFjY291bnRHcm91cEluY2x1ZGUuS2V5IGtleSkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLQotICBAUXVlcnkoIldIRVJFIGtleS5pbmNsdWRlSWQgPSA/IikKLSAgUmVzdWx0U2V0PEFjY291bnRHcm91cEluY2x1ZGU+IGJ5SW5jbHVkZShBY2NvdW50R3JvdXAuSWQgaWQpIHRocm93cyBPcm1FeGNlcHRpb247Ci0KLSAgQFF1ZXJ5KCJXSEVSRSBrZXkuZ3JvdXBJZCA9ID8iKQotICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZT4gYnlHcm91cChBY2NvdW50R3JvdXAuSWQgaWQpIHRocm93cyBPcm1FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0QWNjZXNzLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0QWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjRmODguLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVBdWRpdEFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVBdWRpdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQWNjZXNzOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlByaW1hcnlLZXk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlF1ZXJ5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0QWNjZXNzIGV4dGVuZHMKLSAgICBBY2Nlc3M8QWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0LCBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQuS2V5PiB7Ci0gIEBQcmltYXJ5S2V5KCJrZXkiKQotICBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQgZ2V0KEFjY291bnRHcm91cEluY2x1ZGVBdWRpdC5LZXkga2V5KQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLQotICBAUXVlcnkoIldIRVJFIGtleS5ncm91cElkID0gPyBBTkQga2V5LmluY2x1ZGVJZCA9ID8iKQotICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0PiBieUdyb3VwSW5jbHVkZShBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKLSAgICAgIEFjY291bnRHcm91cC5JZCBpbmNHcm91cElkKSB0aHJvd3MgT3JtRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBY2Nlc3MuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQWNjZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlMjNlYgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQWNjZXNzLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkFjY2VzczsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5QcmltYXJ5S2V5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5RdWVyeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OworCitwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBY2Nlc3MgZXh0ZW5kcworICAgIEFjY2VzczxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleT4geworICBAUHJpbWFyeUtleSgia2V5IikKKyAgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBnZXQoQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZC5LZXkga2V5KSB0aHJvd3MgT3JtRXhjZXB0aW9uOworCisgIEBRdWVyeSgiV0hFUkUga2V5LmluY2x1ZGVVVUlEID0gPyIpCisgIFJlc3VsdFNldDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBieUluY2x1ZGVVVUlEKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHRocm93cyBPcm1FeGNlcHRpb247CisKKyAgQFF1ZXJ5KCJXSEVSRSBrZXkuZ3JvdXBJZCA9ID8iKQorICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gYnlHcm91cChBY2NvdW50R3JvdXAuSWQgaWQpIHRocm93cyBPcm1FeGNlcHRpb247CisKKyAgQFF1ZXJ5KCIiKQorICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gYWxsKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXRBY2Nlc3MuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXRBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzk1Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdEFjY2Vzcy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkFjY2VzczsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5QcmltYXJ5S2V5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5RdWVyeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OworCitwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdEFjY2VzcyBleHRlbmRzCisgICAgQWNjZXNzPEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdCwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0LktleT4geworICBAUHJpbWFyeUtleSgia2V5IikKKyAgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0IGdldChBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQuS2V5IGtleSkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb247CisKKyAgQFF1ZXJ5KCJXSEVSRSBrZXkuZ3JvdXBJZCA9ID8gQU5EIGtleS5pbmNsdWRlVVVJRCA9ID8iKQorICBSZXN1bHRTZXQ8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0PiBieUdyb3VwSW5jbHVkZShBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKKyAgICAgIEFjY291bnRHcm91cC5VVUlEIGluY0dyb3VwVVVJRCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BcHByb3ZhbENhdGVnb3J5QWNjZXNzLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQXBwcm92YWxDYXRlZ29yeUFjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjk4ODZlLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9BcHByb3ZhbENhdGVnb3J5QWNjZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkFjY2VzczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5QcmltYXJ5S2V5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5RdWVyeTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFwcHJvdmFsQ2F0ZWdvcnlBY2Nlc3MgZXh0ZW5kcwotICAgIEFjY2VzczxBcHByb3ZhbENhdGVnb3J5LCBBcHByb3ZhbENhdGVnb3J5LklkPiB7Ci0gIEBQcmltYXJ5S2V5KCJjYXRlZ29yeUlkIikKLSAgQXBwcm92YWxDYXRlZ29yeSBnZXQoQXBwcm92YWxDYXRlZ29yeS5JZCBpZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLQotICBAUXVlcnkoIk9SREVSIEJZIHBvc2l0aW9uLCBuYW1lIikKLSAgUmVzdWx0U2V0PEFwcHJvdmFsQ2F0ZWdvcnk+IGFsbCgpIHRocm93cyBPcm1FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQXBwcm92YWxDYXRlZ29yeVZhbHVlQWNjZXNzLmphdmEgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvQXBwcm92YWxDYXRlZ29yeVZhbHVlQWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYzk5ODEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL0FwcHJvdmFsQ2F0ZWdvcnlWYWx1ZUFjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkFjY2VzczsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5QcmltYXJ5S2V5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5RdWVyeTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZUFjY2VzcyBleHRlbmRzCi0gICAgQWNjZXNzPEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiB7Ci0gIEBQcmltYXJ5S2V5KCJrZXkiKQotICBBcHByb3ZhbENhdGVnb3J5VmFsdWUgZ2V0KEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZCBrZXkpIHRocm93cyBPcm1FeGNlcHRpb247Ci0KLSAgQFF1ZXJ5KCJXSEVSRSBrZXkuY2F0ZWdvcnlJZCA9ID8gT1JERVIgQlkga2V5LnZhbHVlIikKLSAgUmVzdWx0U2V0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gYnlDYXRlZ29yeShBcHByb3ZhbENhdGVnb3J5LklkIGlkKQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9SZXZpZXdEYi5qYXZhIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL1Jldmlld0RiLmphdmEKaW5kZXggMTQ5NjI2Yi4uZjFhYjc1MiAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL1Jldmlld0RiLmphdmEKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL1Jldmlld0RiLmphdmEKQEAgLTQzLDExICs0Myw5IEBACiAgIEBSZWxhdGlvbihpZCA9IDIpCiAgIFN5c3RlbUNvbmZpZ0FjY2VzcyBzeXN0ZW1Db25maWcoKTsKIAotICBAUmVsYXRpb24oaWQgPSAzKQotICBBcHByb3ZhbENhdGVnb3J5QWNjZXNzIGFwcHJvdmFsQ2F0ZWdvcmllcygpOworICAvLyBEZWxldGVkIEBSZWxhdGlvbihpZCA9IDMpCiAKLSAgQFJlbGF0aW9uKGlkID0gNCkKLSAgQXBwcm92YWxDYXRlZ29yeVZhbHVlQWNjZXNzIGFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZXMoKTsKKyAgLy8gRGVsZXRlZCBAUmVsYXRpb24oaWQgPSA0KQogCiAgIEBSZWxhdGlvbihpZCA9IDYpCiAgIEFjY291bnRBY2Nlc3MgYWNjb3VudHMoKTsKQEAgLTcwLDEyICs2OCw2IEBACiAgIEBSZWxhdGlvbihpZCA9IDEzKQogICBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdEFjY2VzcyBhY2NvdW50R3JvdXBNZW1iZXJzQXVkaXQoKTsKIAotICBAUmVsYXRpb24oaWQgPSAxNCkKLSAgQWNjb3VudEdyb3VwSW5jbHVkZUFjY2VzcyBhY2NvdW50R3JvdXBJbmNsdWRlcygpOwotCi0gIEBSZWxhdGlvbihpZCA9IDE1KQotICBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXRBY2Nlc3MgYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpOwotCiAgIEBSZWxhdGlvbihpZCA9IDE3KQogICBBY2NvdW50RGlmZlByZWZlcmVuY2VBY2Nlc3MgYWNjb3VudERpZmZQcmVmZXJlbmNlcygpOwogCkBAIC0xMTIsNiArMTA0LDEyIEBACiAgIEBSZWxhdGlvbihpZCA9IDI4KQogICBTdWJtb2R1bGVTdWJzY3JpcHRpb25BY2Nlc3Mgc3VibW9kdWxlU3Vic2NyaXB0aW9ucygpOwogCisgIEBSZWxhdGlvbihpZCA9IDI5KQorICBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQWNjZXNzIGFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCk7CisKKyAgQFJlbGF0aW9uKGlkID0gMzApCisgIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdEFjY2VzcyBhY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZEF1ZGl0KCk7CisKICAgLyoqIENyZWF0ZSB0aGUgbmV4dCB1bmlxdWUgaWQgZm9yIGFuIHtAbGluayBBY2NvdW50fS4gKi8KICAgQFNlcXVlbmNlKHN0YXJ0V2l0aCA9IDEwMDAwMDApCiAgIGludCBuZXh0QWNjb3VudElkKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9TdWJtb2R1bGVTdWJzY3JpcHRpb25BY2Nlc3MuamF2YSBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9TdWJtb2R1bGVTdWJzY3JpcHRpb25BY2Nlc3MuamF2YQppbmRleCAwMDkwZGY4Li5jMGUxZWI2IDEwMDY0NAotLS0gYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvU3VibW9kdWxlU3Vic2NyaXB0aW9uQWNjZXNzLmphdmEKKysrIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL1N1Ym1vZHVsZVN1YnNjcmlwdGlvbkFjY2Vzcy5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlcjsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlN1Ym1vZHVsZVN1YnNjcmlwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQWNjZXNzOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CkBAIC0zMSw3ICszMiwzOSBAQAogICBSZXN1bHRTZXQ8U3VibW9kdWxlU3Vic2NyaXB0aW9uPiBieVN1cGVyUHJvamVjdChCcmFuY2guTmFtZUtleSBzdXBlclByb2plY3QpCiAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uOwogCisgIC8qKgorICAgKiBGZXRjaGVzIGFsbCA8Y29kZT5TdWJtb2R1bGVTdWJzY3JpcHRpb248L2NvZGU+cyBpbiB3aGljaCBzb21lIGJyYW5jaCBvZgorICAgKiA8Y29kZT5zdXBlclByb2plY3Q8L2NvZGU+IHN1YnNjcmliZXMgYSBicmFuY2guCisgICAqCisgICAqIFVzZSB7QGxpbmsgI2J5U3VwZXJwcm9qZWN0KEJyYW5jaC5OYW1lS2V5KX0gdG8gZmV0Y2ggZm9yIGEgYnJhbmNoIGluc3RlYWQKKyAgICogb2YgYSBwcm9qZWN0LgorICAgKgorICAgKiBAcGFyYW0gc3VwZXJQcm9qZWN0IHRoZSBwcm9qZWN0IHRvIGZldGNoIHN1YnNjcmlwdGlvbnMgZm9yCisgICAqIEByZXR1cm4gPGNvZGU+U3VibW9kdWxlU3Vic2NyaXB0aW9uPC9jb2RlPnMgdGhhdCBhcmUgc3Vic2NyaWJlZCBieSBzb21lCisgICAqIGJyYW5jaCBvZiA8Y29kZT5zdXBlclByb2plY3Q8L2NvZGU+LgorICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbgorICAgKi8KKyAgQFF1ZXJ5KCJXSEVSRSBrZXkuc3VwZXJQcm9qZWN0LnByb2plY3ROYW1lID0gPyIpCisgIFJlc3VsdFNldDxTdWJtb2R1bGVTdWJzY3JpcHRpb24+IGJ5U3VwZXJQcm9qZWN0UHJvamVjdChQcm9qZWN0Lk5hbWVLZXkgc3VwZXJQcm9qZWN0KQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKKwogICBAUXVlcnkoIldIRVJFIHN1Ym1vZHVsZSA9ID8iKQogICBSZXN1bHRTZXQ8U3VibW9kdWxlU3Vic2NyaXB0aW9uPiBieVN1Ym1vZHVsZShCcmFuY2guTmFtZUtleSBzdWJtb2R1bGUpCiAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uOworCisgIC8qKgorICAgKiBGZXRjaGVzIGFsbCA8Y29kZT5TdWJtb2R1bGVTdWJzY3JpcHRpb248L2NvZGU+cyBpbiB3aGljaCBzb21lIGJyYW5jaCBvZgorICAgKiA8Y29kZT5zdWJtb2R1bGU8L2NvZGU+IGlzIHN1YnNjcmliZWQuCisgICAqCisgICAqIFVzZSB7QGxpbmsgI2J5U3VibW9kdWxlKEJyYW5jaC5OYW1lS2V5KX0gdG8gZmV0Y2ggZm9yIGEgYnJhbmNoIGluc3RlYWQgb2YKKyAgICogYSBwcm9qZWN0LgorICAgKgorICAgKiBAcGFyYW0gc3VibW9kdWxlIHRoZSBwcm9qZWN0IHRvIGZldGNoIHN1YnNjcmlwdGlvbnMgZm9yLgorICAgKiBAcmV0dXJuIDxjb2RlPlN1Ym1vZHVsZVN1YnNjcmlwdGlvbjwvY29kZT5zIHRoYXQgc3Vic2NyaWJlIHNvbWUgYnJhbmNoIG9mCisgICAqIDxjb2RlPnN1Ym1vZHVsZTwvY29kZT4uCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uCisgICAqLworICBAUXVlcnkoIldIRVJFIHN1Ym1vZHVsZS5wcm9qZWN0TmFtZSA9ID8iKQorICBSZXN1bHRTZXQ8U3VibW9kdWxlU3Vic2NyaXB0aW9uPiBieVN1Ym1vZHVsZVByb2plY3QoUHJvamVjdC5OYW1lS2V5IHN1Ym1vZHVsZSkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9pbmRleF9nZW5lcmljLnNxbCBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL2luZGV4X2dlbmVyaWMuc3FsCmluZGV4IDlkNDUzZmMuLmQ2NjA5ZTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL2luZGV4X2dlbmVyaWMuc3FsCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL2luZGV4X2dlbmVyaWMuc3FsCkBAIC0zNCwxMCArMzQsMTAgQEAKIAogCiAtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS0tIEFjY291bnRHcm91cEluY2x1ZGVBY2Nlc3MKKy0tIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBY2Nlc3MKIC0tICAgIEBQcmltYXJ5S2V5IGNvdmVyczogYnlHcm91cAotQ1JFQVRFIElOREVYIGFjY291bnRfZ3JvdXBfaW5jbHVkZXNfYnlJbmNsdWRlCi1PTiBhY2NvdW50X2dyb3VwX2luY2x1ZGVzIChpbmNsdWRlX2lkKTsKK0NSRUFURSBJTkRFWCBhY2NvdW50X2dyb3VwX2luY2x1ZGVzX2J5X3V1aWRfYnlJbmNsdWRlCitPTiBhY2NvdW50X2dyb3VwX2luY2x1ZGVzX2J5X3V1aWQgKGluY2x1ZGVfdXVpZCk7CiAKIAogLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9pbmRleF9wb3N0Z3Jlcy5zcWwgYi9nZXJyaXQtcmV2aWV3ZGIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3Jldmlld2RiL3NlcnZlci9pbmRleF9wb3N0Z3Jlcy5zcWwKaW5kZXggMmM5MWRiNC4uM2I2MmU4NCAxMDA2NDQKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvaW5kZXhfcG9zdGdyZXMuc3FsCisrKyBiL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL2luZGV4X3Bvc3RncmVzLnNxbApAQCAtNDcsMzAgKzQ3LDYgQEAKIAogRFJPUCBGVU5DVElPTiBtYWtlX3BscGdzcWwoKTsKIAotLS0gRGVmaW5lIG91ciBzY2hlbWEgdXBncmFkZSBzdXBwb3J0IGZ1bmN0aW9uLgotLS0KLQotZGVsaW1pdGVyIC8vCi0KLUNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OCi1jaGVja19zY2hlbWFfdmVyc2lvbiAoZXhwIElOVCkKLVJFVFVSTlMgVkFSQ0hBUigyNTUpCi1BUyAkJAotREVDTEFSRQotICBsX2FjdCBJTlQ7Ci1CRUdJTgotICBTRUxFQ1QgdmVyc2lvbl9uYnIgSU5UTyBsX2FjdAotICBGUk9NIHNjaGVtYV92ZXJzaW9uOwotCi0gIElGIGxfYWN0IDw+IGV4cAotICBUSEVOCi0gICAgUkFJU0UgRVhDRVBUSU9OICdleHBlY3RlZCBzY2hlbWEgJSwgZm91bmQgJScsIGV4cCwgbF9hY3Q7Ci0gIEVORCBJRjsKLSAgUkVUVVJOICdPSyc7Ci1FTkQ7Ci0kJCBMQU5HVUFHRSBwbHBnc3FsOwotLy8KLQogZGVsaW1pdGVyIDsKIAogLS0gSW5kZXhlcyB0byBzdXBwb3J0IEBRdWVyeQpAQCAtMTA2LDEwICs4MiwxMCBAQAogCiAKIC0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLS0gQWNjb3VudEdyb3VwSW5jbHVkZUFjY2VzcworLS0gQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEFjY2VzcwogLS0gICAgQFByaW1hcnlLZXkgY292ZXJzOiBieUdyb3VwCi1DUkVBVEUgSU5ERVggYWNjb3VudF9ncm91cF9pbmNsdWRlc19ieUluY2x1ZGUKLU9OIGFjY291bnRfZ3JvdXBfaW5jbHVkZXMgKGluY2x1ZGVfaWQpOworQ1JFQVRFIElOREVYIGFjY291bnRfZ3JvdXBfaW5jbHVkZXNfYnlfdXVpZF9ieUluY2x1ZGUKK09OIGFjY291bnRfZ3JvdXBfaW5jbHVkZXNfYnlfdXVpZCAoaW5jbHVkZV91dWlkKTsKIAogCiAtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2dlcnJpdC1yZXZpZXdkYi9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcmV2aWV3ZGIvc2VydmVyL215c3FsX25leHR2YWwuc3FsIGIvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvbXlzcWxfbmV4dHZhbC5zcWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzkwMTAuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXJldmlld2RiL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9yZXZpZXdkYi9zZXJ2ZXIvbXlzcWxfbmV4dHZhbC5zcWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0tLSBHZXJyaXQgMiA6IE15U1FMCi0tLQotZGVsaW1pdGVyIC8vCi0KLUNSRUFURSBGVU5DVElPTiBuZXh0dmFsX2FjY291bnRfaWQgKCkKLSAgUkVUVVJOUyBCSUdJTlQKLSAgTEFOR1VBR0UgU1FMCi0gIE5PVCBERVRFUk1JTklTVElDCi0gIE1PRElGSUVTIFNRTCBEQVRBCi1CRUdJTgotICBJTlNFUlQgSU5UTyBhY2NvdW50X2lkIChzKSBWQUxVRVMgKE5VTEwpOwotICBSRVRVUk4gTEFTVF9JTlNFUlRfSUQoKTsKLUVORDsKLS8vCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3BvbS54bWwgYi9nZXJyaXQtc2VydmVyL3BvbS54bWwKaW5kZXggYWYxODE3My4uYTg5MzBkNSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9wb20ueG1sCisrKyBiL2dlcnJpdC1zZXJ2ZXIvcG9tLnhtbApAQCAtMjIsNyArMjIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmdlcnJpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi41LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+Z2Vycml0LXNlcnZlcjwvYXJ0aWZhY3RJZD4KQEAgLTgwLDcgKzgwLDYgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmJvdW5jeWNhc3RsZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmJjcGctamRrMTU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xNDA8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KIApAQCAtMTYyLDcgKzE2MSw3IEBACiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KKyAgICAgIDxncm91cElkPmNvbS5nb29nbGVjb2RlLmp1bml2ZXJzYWxjaGFyZGV0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+anVuaXZlcnNhbGNoYXJkZXQ8L2FydGlmYWN0SWQ+CiAgICAgPC9kZXBlbmRlbmN5PgogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvQXVkaXRFdmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L0F1ZGl0RXZlbnQuamF2YQppbmRleCAzNjRkZjgwLi4xNzNjZWQ2IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvQXVkaXRFdmVudC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9BdWRpdEV2ZW50LmphdmEKQEAgLTE0LDIyICsxNCwyMiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQogcHVibGljIGNsYXNzIEF1ZGl0RXZlbnQgewogCiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fU0VTU0lPTl9JRCA9ICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgVU5LTk9XTl9SRVNVTFQgPSAiTi9BIjsKKyAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNdWx0aW1hcDxTdHJpbmcsID8+IEVNUFRZX1BBUkFNUyA9IEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKIAogICBwdWJsaWMgZmluYWwgU3RyaW5nIHNlc3Npb25JZDsKICAgcHVibGljIGZpbmFsIEN1cnJlbnRVc2VyIHdobzsKICAgcHVibGljIGZpbmFsIGxvbmcgd2hlbjsKICAgcHVibGljIGZpbmFsIFN0cmluZyB3aGF0OwotICBwdWJsaWMgZmluYWwgTGlzdDw/PiBwYXJhbXM7CisgIHB1YmxpYyBmaW5hbCBNdWx0aW1hcDxTdHJpbmcsID8+IHBhcmFtczsKICAgcHVibGljIGZpbmFsIE9iamVjdCByZXN1bHQ7CiAgIHB1YmxpYyBmaW5hbCBsb25nIHRpbWVBdFN0YXJ0OwogICBwdWJsaWMgZmluYWwgbG9uZyBlbGFwc2VkOwpAQCAtNzMsMTkgKzczLDYgQEAKICAgfQogCiAgIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IGF1ZGl0IGV2ZW50LgotICAgKgotICAgKiBAcGFyYW0gc2Vzc2lvbklkIHNlc3Npb24gaWQgdGhlIGV2ZW50IGJlbG9uZ3MgdG8KLSAgICogQHBhcmFtIHdobyBwcmluY2lwYWwgdGhhdCBoYXMgZ2VuZXJhdGVkIHRoZSBldmVudAotICAgKiBAcGFyYW0gd2hhdCBvYmplY3Qgb2YgdGhlIGV2ZW50Ci0gICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBvZiB0aGUgZXZlbnQKLSAgICovCi0gIHB1YmxpYyBBdWRpdEV2ZW50KFN0cmluZyBzZXNzaW9uSWQsIEN1cnJlbnRVc2VyIHdobywgU3RyaW5nIHdoYXQsIExpc3Q8Pz4gcGFyYW1zKSB7Ci0gICAgdGhpcyhzZXNzaW9uSWQsIHdobywgd2hhdCwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIHBhcmFtcywKLSAgICAgICAgVU5LTk9XTl9SRVNVTFQpOwotICB9Ci0KLSAgLyoqCiAgICAqIENyZWF0ZXMgYSBuZXcgYXVkaXQgZXZlbnQgd2l0aCByZXN1bHRzCiAgICAqCiAgICAqIEBwYXJhbSBzZXNzaW9uSWQgc2Vzc2lvbiBpZCB0aGUgZXZlbnQgYmVsb25ncyB0bwpAQCAtOTYsMjggKzgzLDIwIEBACiAgICAqIEBwYXJhbSByZXN1bHQgcmVzdWx0IG9mIHRoZSBldmVudAogICAgKi8KICAgcHVibGljIEF1ZGl0RXZlbnQoU3RyaW5nIHNlc3Npb25JZCwgQ3VycmVudFVzZXIgd2hvLCBTdHJpbmcgd2hhdCwgbG9uZyB3aGVuLAotICAgICAgTGlzdDw/PiBwYXJhbXMsIE9iamVjdCByZXN1bHQpIHsKKyAgICAgIE11bHRpbWFwPFN0cmluZywgPz4gcGFyYW1zLCBPYmplY3QgcmVzdWx0KSB7CiAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwod2hhdCwgIndoYXQgaXMgYSBtYW5kYXRvcnkgbm90IG51bGwgcGFyYW0gISIpOwogCi0gICAgdGhpcy5zZXNzaW9uSWQgPSBnZXRWYWx1ZVdpdGhEZWZhdWx0KHNlc3Npb25JZCwgVU5LTk9XTl9TRVNTSU9OX0lEKTsKKyAgICB0aGlzLnNlc3Npb25JZCA9IE9iamVjdHMuZmlyc3ROb25OdWxsKHNlc3Npb25JZCwgVU5LTk9XTl9TRVNTSU9OX0lEKTsKICAgICB0aGlzLndobyA9IHdobzsKICAgICB0aGlzLndoYXQgPSB3aGF0OwogICAgIHRoaXMud2hlbiA9IHdoZW47CiAgICAgdGhpcy50aW1lQXRTdGFydCA9IHRoaXMud2hlbjsKLSAgICB0aGlzLnBhcmFtcyA9IGdldFZhbHVlV2l0aERlZmF1bHQocGFyYW1zLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgdGhpcy5wYXJhbXMgPSBPYmplY3RzLmZpcnN0Tm9uTnVsbChwYXJhbXMsIEVNUFRZX1BBUkFNUyk7CiAgICAgdGhpcy51dWlkID0gbmV3IFVVSUQoKTsKICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKICAgICB0aGlzLmVsYXBzZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWVBdFN0YXJ0OwogICB9CiAKLSAgcHJpdmF0ZSA8VD4gVCBnZXRWYWx1ZVdpdGhEZWZhdWx0KFQgdmFsdWUsIFQgZGVmYXVsdFZhbHVlSWZOdWxsKSB7Ci0gICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgIHJldHVybiBkZWZhdWx0VmFsdWVJZk51bGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gIH0KLQogICBAT3ZlcnJpZGUKICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICByZXR1cm4gdXVpZC5oYXNoQ29kZSgpOwpAQCAtMTM1LDM4ICsxMTQsNyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIHNiLmFwcGVuZCh1dWlkLnRvU3RyaW5nKCkpOwotICAgIHNiLmFwcGVuZCgifCIpOwotICAgIHNiLmFwcGVuZChzZXNzaW9uSWQpOwotICAgIHNiLmFwcGVuZCgnfCcpOwotICAgIHNiLmFwcGVuZCh3aG8pOwotICAgIHNiLmFwcGVuZCgnfCcpOwotICAgIHNiLmFwcGVuZCh3aGVuKTsKLSAgICBzYi5hcHBlbmQoJ3wnKTsKLSAgICBzYi5hcHBlbmQod2hhdCk7Ci0gICAgc2IuYXBwZW5kKCd8Jyk7Ci0gICAgc2IuYXBwZW5kKGVsYXBzZWQpOwotICAgIHNiLmFwcGVuZCgnfCcpOwotICAgIGlmIChwYXJhbXMgIT0gbnVsbCkgewotICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgnLCcpOwotCi0gICAgICAgIE9iamVjdCBwYXJhbSA9IHBhcmFtcy5nZXQoaSk7Ci0gICAgICAgIGlmIChwYXJhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2IuYXBwZW5kKHBhcmFtKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgfQotICAgIHNiLmFwcGVuZCgnfCcpOwotICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgc2IuYXBwZW5kKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkF1ZGl0RXZlbnQgVVVJRDolcywgU0lEOiVzLCBUUzolZCwgd2hvOiVzLCB3aGF0OiVzIiwKKyAgICAgICAgdXVpZC5nZXQoKSwgc2Vzc2lvbklkLCB3aGVuLCB3aG8sIHdoYXQpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvSHR0cEF1ZGl0RXZlbnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9IdHRwQXVkaXRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZjk3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvSHR0cEF1ZGl0RXZlbnQuamF2YQpAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CisKK3B1YmxpYyBjbGFzcyBIdHRwQXVkaXRFdmVudCBleHRlbmRzIEF1ZGl0RXZlbnQgeworICBwdWJsaWMgZmluYWwgU3RyaW5nIGh0dHBNZXRob2Q7CisgIHB1YmxpYyBmaW5hbCBpbnQgaHR0cFN0YXR1czsKKyAgcHVibGljIGZpbmFsIE9iamVjdCBpbnB1dDsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIG5ldyBhdWRpdCBldmVudCB3aXRoIHJlc3VsdHMKKyAgICoKKyAgICogQHBhcmFtIHNlc3Npb25JZCBzZXNzaW9uIGlkIHRoZSBldmVudCBiZWxvbmdzIHRvCisgICAqIEBwYXJhbSB3aG8gcHJpbmNpcGFsIHRoYXQgaGFzIGdlbmVyYXRlZCB0aGUgZXZlbnQKKyAgICogQHBhcmFtIHdoYXQgb2JqZWN0IG9mIHRoZSBldmVudAorICAgKiBAcGFyYW0gd2hlbiB0aW1lLXN0YW1wIG9mIHdoZW4gdGhlIGV2ZW50IHN0YXJ0ZWQKKyAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzIG9mIHRoZSBldmVudAorICAgKiBAcGFyYW0gcmVzdWx0IHJlc3VsdCBvZiB0aGUgZXZlbnQKKyAgICovCisgIHB1YmxpYyBIdHRwQXVkaXRFdmVudChTdHJpbmcgc2Vzc2lvbklkLCBDdXJyZW50VXNlciB3aG8sIFN0cmluZyB3aGF0LCBsb25nIHdoZW4sCisgICAgICBNdWx0aW1hcDxTdHJpbmcsID8+IHBhcmFtcywgU3RyaW5nIGh0dHBNZXRob2QsIE9iamVjdCBpbnB1dCwgaW50IHN0YXR1cywgT2JqZWN0IHJlc3VsdCkgeworICAgIHN1cGVyKHNlc3Npb25JZCwgd2hvLCB3aGF0LCB3aGVuLCBwYXJhbXMsIHJlc3VsdCk7CisgICAgdGhpcy5odHRwTWV0aG9kID0gaHR0cE1ldGhvZDsKKyAgICB0aGlzLmlucHV0ID0gaW5wdXQ7CisgICAgdGhpcy5odHRwU3RhdHVzID0gc3RhdHVzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvYXVkaXQvUnBjQXVkaXRFdmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L1JwY0F1ZGl0RXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFhYjNhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L1JwY0F1ZGl0RXZlbnQuamF2YQpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CisKK3B1YmxpYyBjbGFzcyBScGNBdWRpdEV2ZW50IGV4dGVuZHMgSHR0cEF1ZGl0RXZlbnQgeworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgbmV3IGF1ZGl0IGV2ZW50IHdpdGggcmVzdWx0cworICAgKgorICAgKiBAcGFyYW0gc2Vzc2lvbklkIHNlc3Npb24gaWQgdGhlIGV2ZW50IGJlbG9uZ3MgdG8KKyAgICogQHBhcmFtIHdobyBwcmluY2lwYWwgdGhhdCBoYXMgZ2VuZXJhdGVkIHRoZSBldmVudAorICAgKiBAcGFyYW0gd2hhdCBvYmplY3Qgb2YgdGhlIGV2ZW50CisgICAqIEBwYXJhbSB3aGVuIHRpbWUtc3RhbXAgb2Ygd2hlbiB0aGUgZXZlbnQgc3RhcnRlZAorICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgb2YgdGhlIGV2ZW50CisgICAqIEBwYXJhbSByZXN1bHQgcmVzdWx0IG9mIHRoZSBldmVudAorICAgKi8KKyAgcHVibGljIFJwY0F1ZGl0RXZlbnQoU3RyaW5nIHNlc3Npb25JZCwgQ3VycmVudFVzZXIgd2hvLCBTdHJpbmcgd2hhdCwKKyAgICAgIGxvbmcgd2hlbiwgTXVsdGltYXA8U3RyaW5nLCA/PiBwYXJhbXMsIFN0cmluZyBodHRwTWV0aG9kLCBPYmplY3QgaW5wdXQsCisgICAgICBpbnQgc3RhdHVzLCBPYmplY3QgcmVzdWx0KSB7CisgICAgc3VwZXIoc2Vzc2lvbklkLCB3aG8sIHdoYXQsIHdoZW4sIHBhcmFtcywgaHR0cE1ldGhvZCwgaW5wdXQsIHN0YXR1cywgcmVzdWx0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2F1ZGl0L1NzaEF1ZGl0RXZlbnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9Tc2hBdWRpdEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4NjRjOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9hdWRpdC9Tc2hBdWRpdEV2ZW50LmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5hdWRpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworCitwdWJsaWMgY2xhc3MgU3NoQXVkaXRFdmVudCBleHRlbmRzIEF1ZGl0RXZlbnQgeworCisgIHB1YmxpYyBTc2hBdWRpdEV2ZW50KFN0cmluZyBzZXNzaW9uSWQsIEN1cnJlbnRVc2VyIHdobywgU3RyaW5nIHdoYXQsCisgICAgICBsb25nIHdoZW4sIE11bHRpbWFwPFN0cmluZywgPz4gcGFyYW1zLCBPYmplY3QgcmVzdWx0KSB7CisgICAgc3VwZXIoc2Vzc2lvbklkLCB3aG8sIHdoYXQsIHdoZW4sIHBhcmFtcywgcmVzdWx0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9DaGFuZ2VIb29rUnVubmVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0NoYW5nZUhvb2tSdW5uZXIuamF2YQppbmRleCAzN2JlMjkzLi40MTE2NjMzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0NoYW5nZUhvb2tSdW5uZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0NoYW5nZUhvb2tSdW5uZXIuamF2YQpAQCAtMTQsMTIgKzE0LDEzIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ29udHJpYnV0b3JBZ3JlZW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKQEAgLTM5LDE1ICs0MCwxNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuQ29tbWVudEFkZGVkRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5EcmFmdFB1Ymxpc2hlZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuRXZlbnRGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuTWVyZ2VGYWlsZWRFdmVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLlBhdGNoU2V0Q3JlYXRlZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuUmVmVXBkYXRlZEV2ZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuUmV2aWV3ZXJBZGRlZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Xb3JrUXVldWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKQEAgLTYxLDI0ICs2MywzNCBAQAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogCiAvKiogU3Bhd25zIGxvY2FsIGV4ZWN1dGFibGVzIHdoZW4gYSBob29rIGFjdGlvbiBvY2N1cnMuICovCiBAU2luZ2xldG9uCi1wdWJsaWMgY2xhc3MgQ2hhbmdlSG9va1J1bm5lciBpbXBsZW1lbnRzIENoYW5nZUhvb2tzIHsKK3B1YmxpYyBjbGFzcyBDaGFuZ2VIb29rUnVubmVyIGltcGxlbWVudHMgQ2hhbmdlSG9va3MsIExpZmVjeWNsZUxpc3RlbmVyIHsKICAgICAvKiogQSBsb2dnZXIgZm9yIHRoaXMgY2xhc3MuICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENoYW5nZUhvb2tSdW5uZXIuY2xhc3MpOwogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2R1bGUgZXh0ZW5kcyBMaWZlY3ljbGVNb2R1bGUgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CiAgICAgICAgIGJpbmQoQ2hhbmdlSG9va1J1bm5lci5jbGFzcyk7CiAgICAgICAgIGJpbmQoQ2hhbmdlSG9va3MuY2xhc3MpLnRvKENoYW5nZUhvb2tSdW5uZXIuY2xhc3MpOworICAgICAgICBsaXN0ZW5lcigpLnRvKENoYW5nZUhvb2tSdW5uZXIuY2xhc3MpOwogICAgICAgfQogICAgIH0KIApAQCAtOTIsMTAgKzEwNCw2MSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqIExpc3RlbmVycyB0byByZWNlaXZlIGNoYW5nZXMgYXMgdGhleSBoYXBwZW4uICovCisgICAgLyoqIENvbnRhaW5lciBjbGFzcyB1c2VkIHRvIGhvbGQgdGhlIHJldHVybiBjb2RlIGFuZCBvdXRwdXQgb2Ygc2NyaXB0IGhvb2sgZXhlY3V0aW9uICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIb29rUmVzdWx0IHsKKyAgICAgIHByaXZhdGUgaW50IGV4aXRWYWx1ZSA9IC0xOworICAgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0OworICAgICAgcHJpdmF0ZSBTdHJpbmcgZXhlY3V0aW9uRXJyb3I7CisKKyAgICAgIHByaXZhdGUgSG9va1Jlc3VsdChpbnQgZXhpdFZhbHVlLCBTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgIHRoaXMuZXhpdFZhbHVlID0gZXhpdFZhbHVlOworICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBIb29rUmVzdWx0KFN0cmluZyBvdXRwdXQsIFN0cmluZyBleGVjdXRpb25FcnJvcikgeworICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKKyAgICAgICAgdGhpcy5leGVjdXRpb25FcnJvciA9IGV4ZWN1dGlvbkVycm9yOworICAgICAgfQorCisgICAgICBwdWJsaWMgaW50IGdldEV4aXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4aXRWYWx1ZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc2V0RXhpdFZhbHVlKGludCBleGl0VmFsdWUpIHsKKyAgICAgICAgdGhpcy5leGl0VmFsdWUgPSBleGl0VmFsdWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0KCkgeworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwgJiYgb3V0cHV0Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICBzYi5hcHBlbmQob3V0cHV0KTsKKworICAgICAgICAgIGlmIChleGVjdXRpb25FcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiAtICIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGVjdXRpb25FcnJvciAhPSBudWxsICkgeworICAgICAgICAgIHNiLmFwcGVuZChleGVjdXRpb25FcnJvcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiogTGlzdGVuZXJzIHRvIHJlY2VpdmUgY2hhbmdlcyBhcyB0aGV5IGhhcHBlbiAobGltaXRlZCBieSB2aXNpYmlsaXR5CisgICAgICogIG9mIGhvbGRlcidzIHVzZXIpLiAqLwogICAgIHByaXZhdGUgZmluYWwgTWFwPENoYW5nZUxpc3RlbmVyLCBDaGFuZ2VMaXN0ZW5lckhvbGRlcj4gbGlzdGVuZXJzID0KICAgICAgIG5ldyBDb25jdXJyZW50SGFzaE1hcDxDaGFuZ2VMaXN0ZW5lciwgQ2hhbmdlTGlzdGVuZXJIb2xkZXI+KCk7CiAKKyAgICAvKiogTGlzdGVuZXJzIHRvIHJlY2VpdmUgYWxsIGNoYW5nZXMgYXMgdGhleSBoYXBwZW4uICovCisgICAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljU2V0PENoYW5nZUxpc3RlbmVyPiB1bnJlc3RyaWN0ZWRMaXN0ZW5lcnM7CisKICAgICAvKiogRmlsZW5hbWUgb2YgdGhlIG5ldyBwYXRjaHNldCBob29rLiAqLwogICAgIHByaXZhdGUgZmluYWwgRmlsZSBwYXRjaHNldENyZWF0ZWRIb29rOwogCkBAIC0xMDgsNiArMTcxLDkgQEAKICAgICAvKiogRmlsZW5hbWUgb2YgdGhlIGNoYW5nZSBtZXJnZWQgaG9vay4gKi8KICAgICBwcml2YXRlIGZpbmFsIEZpbGUgY2hhbmdlTWVyZ2VkSG9vazsKIAorICAgIC8qKiBGaWxlbmFtZSBvZiB0aGUgbWVyZ2UgZmFpbGVkIGhvb2suICovCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIG1lcmdlRmFpbGVkSG9vazsKKwogICAgIC8qKiBGaWxlbmFtZSBvZiB0aGUgY2hhbmdlIGFiYW5kb25lZCBob29rLiAqLwogICAgIHByaXZhdGUgZmluYWwgRmlsZSBjaGFuZ2VBYmFuZG9uZWRIb29rOwogCkBAIC0xMTcsOSArMTgzLDE1IEBACiAgICAgLyoqIEZpbGVuYW1lIG9mIHRoZSByZWYgdXBkYXRlZCBob29rLiAqLwogICAgIHByaXZhdGUgZmluYWwgRmlsZSByZWZVcGRhdGVkSG9vazsKIAorICAgIC8qKiBGaWxlbmFtZSBvZiB0aGUgcmV2aWV3ZXIgYWRkZWQgaG9vay4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgcmV2aWV3ZXJBZGRlZEhvb2s7CisKICAgICAvKiogRmlsZW5hbWUgb2YgdGhlIGNsYSBzaWduZWQgaG9vay4gKi8KICAgICBwcml2YXRlIGZpbmFsIEZpbGUgY2xhU2lnbmVkSG9vazsKIAorICAgIC8qKiBGaWxlbmFtZSBvZiB0aGUgdXBkYXRlIGhvb2suICovCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIHJlZlVwZGF0ZUhvb2s7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lOwogCiAgICAgLyoqIFJlcG9zaXRvcnkgTWFuYWdlci4gKi8KQEAgLTEzMiwxMiArMjA0LDE2IEBACiAKICAgICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CiAKLSAgICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKLQogICAgIHByaXZhdGUgZmluYWwgRXZlbnRGYWN0b3J5IGV2ZW50RmFjdG9yeTsKIAogICAgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGVQYXRoczsKIAorICAgIC8qKiBUaHJlYWQgcG9vbCB1c2VkIHRvIG1vbml0b3Igc3luYyBob29rcyAqLworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIHN5bmNIb29rVGhyZWFkUG9vbCA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisKKyAgICAvKiogVGltZW91dCB2YWx1ZSBmb3Igc3luY2hyb25vdXMgaG9va3MgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBzeW5jSG9va1RpbWVvdXQ7CisKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgQ2hhbmdlSG9va1J1bm5lci4KICAgICAgKgpAQCAtMTUyLDE3ICsyMjgsMjAgQEAKICAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAogICAgICAgZmluYWwgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnLAogICAgICAgZmluYWwgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsCi0gICAgICBmaW5hbCBTaXRlUGF0aHMgc2l0ZVBhdGgsIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCi0gICAgICBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLCBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBFdmVudEZhY3RvcnkgZXZlbnRGYWN0b3J5LCBmaW5hbCBTaXRlUGF0aHMgc2l0ZVBhdGhzKSB7CisgICAgICBmaW5hbCBTaXRlUGF0aHMgc2l0ZVBhdGgsCisgICAgICBmaW5hbCBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlLAorICAgICAgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKKyAgICAgIGZpbmFsIEV2ZW50RmFjdG9yeSBldmVudEZhY3RvcnksCisgICAgICBmaW5hbCBTaXRlUGF0aHMgc2l0ZVBhdGhzLAorICAgICAgZmluYWwgRHluYW1pY1NldDxDaGFuZ2VMaXN0ZW5lcj4gdW5yZXN0cmljdGVkTGlzdGVuZXJzKSB7CiAgICAgICAgIHRoaXMuYW5vbnltb3VzQ293YXJkTmFtZSA9IGFub255bW91c0Nvd2FyZE5hbWU7CiAgICAgICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKICAgICAgICAgdGhpcy5ob29rUXVldWUgPSBxdWV1ZS5jcmVhdGVRdWV1ZSgxLCAiaG9vayIpOwogICAgICAgICB0aGlzLnByb2plY3RDYWNoZSA9IHByb2plY3RDYWNoZTsKICAgICAgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7Ci0gICAgICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsVHlwZXM7CiAgICAgICAgIHRoaXMuZXZlbnRGYWN0b3J5ID0gZXZlbnRGYWN0b3J5OwogICAgICAgICB0aGlzLnNpdGVQYXRocyA9IHNpdGVQYXRoOworICAgICAgICB0aGlzLnVucmVzdHJpY3RlZExpc3RlbmVycyA9IHVucmVzdHJpY3RlZExpc3RlbmVyczsKIAogICAgICAgICBmaW5hbCBGaWxlIGhvb2tzUGF0aCA9IHNpdGVQYXRoLnJlc29sdmUoZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAicGF0aCIsIHNpdGVQYXRoLmhvb2tzX2Rpci5nZXRBYnNvbHV0ZVBhdGgoKSkpOwogCkBAIC0xNzAsMTAgKzI0OSwxNCBAQAogICAgICAgICBkcmFmdFB1Ymxpc2hlZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAiZHJhZnRQdWJsaXNoZWRIb29rIiwgImRyYWZ0LXB1Ymxpc2hlZCIpKS5nZXRQYXRoKCkpOwogICAgICAgICBjb21tZW50QWRkZWRIb29rID0gc2l0ZVBhdGgucmVzb2x2ZShuZXcgRmlsZShob29rc1BhdGgsIGdldFZhbHVlKGNvbmZpZywgImhvb2tzIiwgImNvbW1lbnRBZGRlZEhvb2siLCAiY29tbWVudC1hZGRlZCIpKS5nZXRQYXRoKCkpOwogICAgICAgICBjaGFuZ2VNZXJnZWRIb29rID0gc2l0ZVBhdGgucmVzb2x2ZShuZXcgRmlsZShob29rc1BhdGgsIGdldFZhbHVlKGNvbmZpZywgImhvb2tzIiwgImNoYW5nZU1lcmdlZEhvb2siLCAiY2hhbmdlLW1lcmdlZCIpKS5nZXRQYXRoKCkpOworICAgICAgICBtZXJnZUZhaWxlZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAibWVyZ2VGYWlsZWQiLCAibWVyZ2UtZmFpbGVkIikpLmdldFBhdGgoKSk7CiAgICAgICAgIGNoYW5nZUFiYW5kb25lZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAiY2hhbmdlQWJhbmRvbmVkSG9vayIsICJjaGFuZ2UtYWJhbmRvbmVkIikpLmdldFBhdGgoKSk7CiAgICAgICAgIGNoYW5nZVJlc3RvcmVkSG9vayA9IHNpdGVQYXRoLnJlc29sdmUobmV3IEZpbGUoaG9va3NQYXRoLCBnZXRWYWx1ZShjb25maWcsICJob29rcyIsICJjaGFuZ2VSZXN0b3JlZEhvb2siLCAiY2hhbmdlLXJlc3RvcmVkIikpLmdldFBhdGgoKSk7CiAgICAgICAgIHJlZlVwZGF0ZWRIb29rID0gc2l0ZVBhdGgucmVzb2x2ZShuZXcgRmlsZShob29rc1BhdGgsIGdldFZhbHVlKGNvbmZpZywgImhvb2tzIiwgInJlZlVwZGF0ZWRIb29rIiwgInJlZi11cGRhdGVkIikpLmdldFBhdGgoKSk7CisgICAgICAgIHJldmlld2VyQWRkZWRIb29rID0gc2l0ZVBhdGgucmVzb2x2ZShuZXcgRmlsZShob29rc1BhdGgsIGdldFZhbHVlKGNvbmZpZywgImhvb2tzIiwgInJldmlld2VyQWRkZWRIb29rIiwgInJldmlld2VyLWFkZGVkIikpLmdldFBhdGgoKSk7CiAgICAgICAgIGNsYVNpZ25lZEhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAiY2xhU2lnbmVkSG9vayIsICJjbGEtc2lnbmVkIikpLmdldFBhdGgoKSk7CisgICAgICAgIHJlZlVwZGF0ZUhvb2sgPSBzaXRlUGF0aC5yZXNvbHZlKG5ldyBGaWxlKGhvb2tzUGF0aCwgZ2V0VmFsdWUoY29uZmlnLCAiaG9va3MiLCAicmVmVXBkYXRlSG9vayIsICJyZWYtdXBkYXRlIikpLmdldFBhdGgoKSk7CisgICAgICAgIHN5bmNIb29rVGltZW91dCA9IGNvbmZpZy5nZXRJbnQoImhvb2tzIiwgInN5bmNIb29rVGltZW91dCIsIDMwKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciwgSWRlbnRpZmllZFVzZXIgdXNlcikgewpAQCAtMjIwLDYgKzMwMywzOCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogRmlyZSB0aGUgdXBkYXRlIGhvb2sKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBIb29rUmVzdWx0IGRvUmVmVXBkYXRlSG9vayhmaW5hbCBQcm9qZWN0IHByb2plY3QsIGZpbmFsIFN0cmluZyByZWZuYW1lLAorICAgICAgICBmaW5hbCBBY2NvdW50IHVwbG9hZGVyLCBmaW5hbCBPYmplY3RJZCBvbGRJZCwgZmluYWwgT2JqZWN0SWQgbmV3SWQpIHsKKworICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgIGFkZEFyZyhhcmdzLCAiLS1wcm9qZWN0IiwgcHJvamVjdC5nZXROYW1lKCkpOworICAgICAgYWRkQXJnKGFyZ3MsICItLXJlZm5hbWUiLCByZWZuYW1lKTsKKyAgICAgIGFkZEFyZyhhcmdzLCAiLS11cGxvYWRlciIsIGdldERpc3BsYXlOYW1lKHVwbG9hZGVyKSk7CisgICAgICBhZGRBcmcoYXJncywgIi0tb2xkcmV2Iiwgb2xkSWQuZ2V0TmFtZSgpKTsKKyAgICAgIGFkZEFyZyhhcmdzLCAiLS1uZXdyZXYiLCBuZXdJZC5nZXROYW1lKCkpOworCisgICAgICBIb29rUmVzdWx0IGhvb2tSZXN1bHQ7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGhvb2tSZXN1bHQgPSBydW5TeW5jSG9vayhwcm9qZWN0LmdldE5hbWVLZXkoKSwgcmVmVXBkYXRlSG9vaywgYXJncyk7CisgICAgICB9IGNhdGNoIChUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaG9va1Jlc3VsdCA9IG5ldyBIb29rUmVzdWx0KC0xLCAiU3luY2hyb25vdXMgaG9vayB0aW1lZCBvdXQiKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGhvb2tSZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlyZSB0aGUgUGF0Y2hzZXQgQ3JlYXRlZCBIb29rLgorICAgICAqCisgICAgICogQHBhcmFtIGNoYW5nZSBUaGUgY2hhbmdlIGl0c2VsZi4KKyAgICAgKiBAcGFyYW0gcGF0Y2hTZXQgVGhlIFBhdGNoc2V0IHRoYXQgd2FzIGNyZWF0ZWQuCisgICAgICogQHRocm93cyBPcm1FeGNlcHRpb24KKyAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkb1BhdGNoc2V0Q3JlYXRlZEhvb2soZmluYWwgQ2hhbmdlIGNoYW5nZSwgZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQsCiAgICAgICAgICAgZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBQYXRjaFNldENyZWF0ZWRFdmVudCBldmVudCA9IG5ldyBQYXRjaFNldENyZWF0ZWRFdmVudCgpOwpAQCAtMjY4LDggKzM4Myw4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZG9Db21tZW50QWRkZWRIb29rKGZpbmFsIENoYW5nZSBjaGFuZ2UsIGZpbmFsIEFjY291bnQgYWNjb3VudCwKLSAgICAgICAgICBmaW5hbCBQYXRjaFNldCBwYXRjaFNldCwgZmluYWwgU3RyaW5nIGNvbW1lbnQsIGZpbmFsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLAotICAgICAgICAgIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYXBwcm92YWxzLCBmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgICAgICAgZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQsIGZpbmFsIFN0cmluZyBjb21tZW50LCBmaW5hbCBNYXA8U3RyaW5nLCBTaG9ydD4gYXBwcm92YWxzLAorICAgICAgICAgIGZpbmFsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ29tbWVudEFkZGVkRXZlbnQgZXZlbnQgPSBuZXcgQ29tbWVudEFkZGVkRXZlbnQoKTsKIAogICAgICAgICBldmVudC5jaGFuZ2UgPSBldmVudEZhY3RvcnkuYXNDaGFuZ2VBdHRyaWJ1dGUoY2hhbmdlKTsKQEAgLTI3NywxMSArMzkyLDEyIEBACiAgICAgICAgIGV2ZW50LnBhdGNoU2V0ID0gZXZlbnRGYWN0b3J5LmFzUGF0Y2hTZXRBdHRyaWJ1dGUocGF0Y2hTZXQpOwogICAgICAgICBldmVudC5jb21tZW50ID0gY29tbWVudDsKIAorICAgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSBwcm9qZWN0Q2FjaGUuZ2V0KGNoYW5nZS5nZXRQcm9qZWN0KCkpLmdldExhYmVsVHlwZXMoKTsKICAgICAgICAgaWYgKGFwcHJvdmFscy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICBldmVudC5hcHByb3ZhbHMgPSBuZXcgQXBwcm92YWxBdHRyaWJ1dGVbYXBwcm92YWxzLnNpemUoKV07CiAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGFwcHJvdmFsIDogYXBwcm92YWxzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBldmVudC5hcHByb3ZhbHNbaSsrXSA9IGdldEFwcHJvdmFsQXR0cmlidXRlKGFwcHJvdmFsKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU2hvcnQ+IGFwcHJvdmFsIDogYXBwcm92YWxzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBldmVudC5hcHByb3ZhbHNbaSsrXSA9IGdldEFwcHJvdmFsQXR0cmlidXRlKGxhYmVsVHlwZXMsIGFwcHJvdmFsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yODksNiArNDA1LDcgQEAKIAogICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwogICAgICAgICBhZGRBcmcoYXJncywgIi0tY2hhbmdlIiwgZXZlbnQuY2hhbmdlLmlkKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLWlzLWRyYWZ0IiwgcGF0Y2hTZXQuaXNEcmFmdCgpID8gInRydWUiIDogImZhbHNlIik7CiAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1jaGFuZ2UtdXJsIiwgZXZlbnQuY2hhbmdlLnVybCk7CiAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1wcm9qZWN0IiwgZXZlbnQuY2hhbmdlLnByb2plY3QpOwogICAgICAgICBhZGRBcmcoYXJncywgIi0tYnJhbmNoIiwgZXZlbnQuY2hhbmdlLmJyYW5jaCk7CkBAIC0yOTYsOCArNDEzLDExIEBACiAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1hdXRob3IiLCBnZXREaXNwbGF5TmFtZShhY2NvdW50KSk7CiAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1jb21taXQiLCBldmVudC5wYXRjaFNldC5yZXZpc2lvbik7CiAgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1jb21tZW50IiwgY29tbWVudCA9PSBudWxsID8gIiIgOiBjb21tZW50KTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHByb3ZhbCA6IGFwcHJvdmFscy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBhZGRBcmcoYXJncywgIi0tIiArIGFwcHJvdmFsLmdldEtleSgpLmdldCgpLCBTaG9ydC50b1N0cmluZyhhcHByb3ZhbC5nZXRWYWx1ZSgpLmdldCgpKSk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU2hvcnQ+IGFwcHJvdmFsIDogYXBwcm92YWxzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICBMYWJlbFR5cGUgbHQgPSBsYWJlbFR5cGVzLmJ5TGFiZWwoYXBwcm92YWwuZ2V0S2V5KCkpOworICAgICAgICAgIGlmIChsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRBcmcoYXJncywgIi0tIiArIGx0LmdldE5hbWUoKSwgU2hvcnQudG9TdHJpbmcoYXBwcm92YWwuZ2V0VmFsdWUoKSkpOworICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHJ1bkhvb2soY2hhbmdlLmdldFByb2plY3QoKSwgY29tbWVudEFkZGVkSG9vaywgYXJncyk7CkBAIC0zMjQsNiArNDQ0LDMwIEBACiAgICAgICAgIHJ1bkhvb2soY2hhbmdlLmdldFByb2plY3QoKSwgY2hhbmdlTWVyZ2VkSG9vaywgYXJncyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZG9NZXJnZUZhaWxlZEhvb2soZmluYWwgQ2hhbmdlIGNoYW5nZSwgZmluYWwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICAgIGZpbmFsIFBhdGNoU2V0IHBhdGNoU2V0LCBmaW5hbCBTdHJpbmcgcmVhc29uLAorICAgICAgICAgIGZpbmFsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVyZ2VGYWlsZWRFdmVudCBldmVudCA9IG5ldyBNZXJnZUZhaWxlZEV2ZW50KCk7CisKKyAgICAgICAgZXZlbnQuY2hhbmdlID0gZXZlbnRGYWN0b3J5LmFzQ2hhbmdlQXR0cmlidXRlKGNoYW5nZSk7CisgICAgICAgIGV2ZW50LnN1Ym1pdHRlciA9IGV2ZW50RmFjdG9yeS5hc0FjY291bnRBdHRyaWJ1dGUoYWNjb3VudCk7CisgICAgICAgIGV2ZW50LnBhdGNoU2V0ID0gZXZlbnRGYWN0b3J5LmFzUGF0Y2hTZXRBdHRyaWJ1dGUocGF0Y2hTZXQpOworICAgICAgICBldmVudC5yZWFzb24gPSByZWFzb247CisgICAgICAgIGZpcmVFdmVudChjaGFuZ2UsIGV2ZW50LCBkYik7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgYWRkQXJnKGFyZ3MsICItLWNoYW5nZSIsIGV2ZW50LmNoYW5nZS5pZCk7CisgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1jaGFuZ2UtdXJsIiwgZXZlbnQuY2hhbmdlLnVybCk7CisgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1wcm9qZWN0IiwgZXZlbnQuY2hhbmdlLnByb2plY3QpOworICAgICAgICBhZGRBcmcoYXJncywgIi0tYnJhbmNoIiwgZXZlbnQuY2hhbmdlLmJyYW5jaCk7CisgICAgICAgIGFkZEFyZyhhcmdzLCAiLS10b3BpYyIsIGV2ZW50LmNoYW5nZS50b3BpYyk7CisgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1zdWJtaXR0ZXIiLCBnZXREaXNwbGF5TmFtZShhY2NvdW50KSk7CisgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1jb21taXQiLCBldmVudC5wYXRjaFNldC5yZXZpc2lvbik7CisgICAgICAgIGFkZEFyZyhhcmdzLCAiLS1yZWFzb24iLCAgcmVhc29uID09IG51bGwgPyAiIiA6IHJlYXNvbik7CisKKyAgICAgICAgcnVuSG9vayhjaGFuZ2UuZ2V0UHJvamVjdCgpLCBtZXJnZUZhaWxlZEhvb2ssIGFyZ3MpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRvQ2hhbmdlQWJhbmRvbmVkSG9vayhmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBBY2NvdW50IGFjY291bnQsCiAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlYXNvbiwgZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBDaGFuZ2VBYmFuZG9uZWRFdmVudCBldmVudCA9IG5ldyBDaGFuZ2VBYmFuZG9uZWRFdmVudCgpOwpAQCAtMzkxLDYgKzUzNSwyNSBAQAogICAgICAgcnVuSG9vayhyZWZOYW1lLmdldFBhcmVudEtleSgpLCByZWZVcGRhdGVkSG9vaywgYXJncyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgZG9SZXZpZXdlckFkZGVkSG9vayhmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBBY2NvdW50IGFjY291bnQsCisgICAgICAgIGZpbmFsIFBhdGNoU2V0IHBhdGNoU2V0LCBmaW5hbCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBSZXZpZXdlckFkZGVkRXZlbnQgZXZlbnQgPSBuZXcgUmV2aWV3ZXJBZGRlZEV2ZW50KCk7CisKKyAgICAgIGV2ZW50LmNoYW5nZSA9IGV2ZW50RmFjdG9yeS5hc0NoYW5nZUF0dHJpYnV0ZShjaGFuZ2UpOworICAgICAgZXZlbnQucGF0Y2hTZXQgPSBldmVudEZhY3RvcnkuYXNQYXRjaFNldEF0dHJpYnV0ZShwYXRjaFNldCk7CisgICAgICBldmVudC5yZXZpZXdlciA9IGV2ZW50RmFjdG9yeS5hc0FjY291bnRBdHRyaWJ1dGUoYWNjb3VudCk7CisgICAgICBmaXJlRXZlbnQoY2hhbmdlLCBldmVudCwgZGIpOworCisgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgYWRkQXJnKGFyZ3MsICItLWNoYW5nZSIsIGV2ZW50LmNoYW5nZS5pZCk7CisgICAgICBhZGRBcmcoYXJncywgIi0tY2hhbmdlLXVybCIsIGV2ZW50LmNoYW5nZS51cmwpOworICAgICAgYWRkQXJnKGFyZ3MsICItLXByb2plY3QiLCBldmVudC5jaGFuZ2UucHJvamVjdCk7CisgICAgICBhZGRBcmcoYXJncywgIi0tYnJhbmNoIiwgZXZlbnQuY2hhbmdlLmJyYW5jaCk7CisgICAgICBhZGRBcmcoYXJncywgIi0tcmV2aWV3ZXIiLCBnZXREaXNwbGF5TmFtZShhY2NvdW50KSk7CisKKyAgICAgIHJ1bkhvb2soY2hhbmdlLmdldFByb2plY3QoKSwgcmV2aWV3ZXJBZGRlZEhvb2ssIGFyZ3MpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRvQ2xhU2lnbnVwSG9vayhBY2NvdW50IGFjY291bnQsIENvbnRyaWJ1dG9yQWdyZWVtZW50IGNsYSkgewogICAgICAgaWYgKGFjY291bnQgIT0gbnVsbCkgewogICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwpAQCAtNDAyLDEyICs1NjUsMjAgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZmlyZUV2ZW50Rm9yVW5yZXN0cmljdGVkTGlzdGVuZXJzKGZpbmFsIENoYW5nZUV2ZW50IGV2ZW50KSB7CisgICAgICBmb3IgKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogdW5yZXN0cmljdGVkTGlzdGVuZXJzKSB7CisgICAgICAgICAgbGlzdGVuZXIub25DaGFuZ2VFdmVudChldmVudCk7CisgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGZpcmVFdmVudChmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBDaGFuZ2VFdmVudCBldmVudCwgZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgICAgZm9yIChDaGFuZ2VMaXN0ZW5lckhvbGRlciBob2xkZXIgOiBsaXN0ZW5lcnMudmFsdWVzKCkpIHsKICAgICAgICAgICBpZiAoaXNWaXNpYmxlVG8oY2hhbmdlLCBob2xkZXIudXNlciwgZGIpKSB7CiAgICAgICAgICAgICAgIGhvbGRlci5saXN0ZW5lci5vbkNoYW5nZUV2ZW50KGV2ZW50KTsKICAgICAgICAgICB9CiAgICAgICB9CisKKyAgICAgIGZpcmVFdmVudEZvclVucmVzdHJpY3RlZExpc3RlbmVycyggZXZlbnQgKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZmlyZUV2ZW50KEJyYW5jaC5OYW1lS2V5IGJyYW5jaE5hbWUsIGZpbmFsIENoYW5nZUV2ZW50IGV2ZW50KSB7CkBAIC00MTYsNiArNTg3LDggQEAKICAgICAgICAgICAgICAgaG9sZGVyLmxpc3RlbmVyLm9uQ2hhbmdlRXZlbnQoZXZlbnQpOwogICAgICAgICAgIH0KICAgICAgIH0KKworICAgICAgZmlyZUV2ZW50Rm9yVW5yZXN0cmljdGVkTGlzdGVuZXJzKCBldmVudCApOwogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBpc1Zpc2libGVUbyhDaGFuZ2UgY2hhbmdlLCBJZGVudGlmaWVkVXNlciB1c2VyLCBSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CkBAIC00NDEsMTUgKzYxNCwxNSBAQAogICAgICAqIEBwYXJhbSBhcHByb3ZhbAogICAgICAqIEByZXR1cm4gb2JqZWN0IHN1aXRhYmxlIGZvciBzZXJpYWxpemF0aW9uIHRvIEpTT04KICAgICAgKi8KLSAgICBwcml2YXRlIEFwcHJvdmFsQXR0cmlidXRlIGdldEFwcHJvdmFsQXR0cmlidXRlKAotICAgICAgICAgICAgRW50cnk8QXBwcm92YWxDYXRlZ29yeS5JZCwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHByb3ZhbCkgeworICAgIHByaXZhdGUgQXBwcm92YWxBdHRyaWJ1dGUgZ2V0QXBwcm92YWxBdHRyaWJ1dGUoTGFiZWxUeXBlcyBsYWJlbFR5cGVzLAorICAgICAgICAgICAgRW50cnk8U3RyaW5nLCBTaG9ydD4gYXBwcm92YWwpIHsKICAgICAgICAgQXBwcm92YWxBdHRyaWJ1dGUgYSA9IG5ldyBBcHByb3ZhbEF0dHJpYnV0ZSgpOwotICAgICAgICBhLnR5cGUgPSBhcHByb3ZhbC5nZXRLZXkoKS5nZXQoKTsKLSAgICAgICAgQXBwcm92YWxUeXBlIGF0ID0gYXBwcm92YWxUeXBlcy5ieUlkKGFwcHJvdmFsLmdldEtleSgpKTsKLSAgICAgICAgaWYgKGF0ICE9IG51bGwpIHsKLSAgICAgICAgICBhLmRlc2NyaXB0aW9uID0gYXQuZ2V0Q2F0ZWdvcnkoKS5nZXROYW1lKCk7CisgICAgICAgIGEudHlwZSA9IGFwcHJvdmFsLmdldEtleSgpOworICAgICAgICBMYWJlbFR5cGUgbHQgPSBsYWJlbFR5cGVzLmJ5TGFiZWwoYXBwcm92YWwuZ2V0S2V5KCkpOworICAgICAgICBpZiAobHQgIT0gbnVsbCkgeworICAgICAgICAgIGEuZGVzY3JpcHRpb24gPSBsdC5nZXROYW1lKCk7CiAgICAgICAgIH0KLSAgICAgICAgYS52YWx1ZSA9IFNob3J0LnRvU3RyaW5nKGFwcHJvdmFsLmdldFZhbHVlKCkuZ2V0KCkpOworICAgICAgICBhLnZhbHVlID0gU2hvcnQudG9TdHJpbmcoYXBwcm92YWwuZ2V0VmFsdWUoKSk7CiAgICAgICAgIHJldHVybiBhOwogICAgIH0KIApAQCAtNDgxLDMxICs2NTQsODQgQEAKICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBydW5Ib29rKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBGaWxlIGhvb2ssCiAgICAgICBMaXN0PFN0cmluZz4gYXJncykgewogICAgIGlmIChwcm9qZWN0ICE9IG51bGwgJiYgaG9vay5leGlzdHMoKSkgewotICAgICAgaG9va1F1ZXVlLmV4ZWN1dGUobmV3IEhvb2tUYXNrKHByb2plY3QsIGhvb2ssIGFyZ3MpKTsKKyAgICAgIGhvb2tRdWV1ZS5leGVjdXRlKG5ldyBBc3luY0hvb2tUYXNrKHByb2plY3QsIGhvb2ssIGFyZ3MpKTsKICAgICB9CiAgIH0KIAogICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJ1bkhvb2soRmlsZSBob29rLCBMaXN0PFN0cmluZz4gYXJncykgewogICAgIGlmIChob29rLmV4aXN0cygpKSB7Ci0gICAgICBob29rUXVldWUuZXhlY3V0ZShuZXcgSG9va1Rhc2sobnVsbCwgaG9vaywgYXJncykpOworICAgICAgaG9va1F1ZXVlLmV4ZWN1dGUobmV3IEFzeW5jSG9va1Rhc2sobnVsbCwgaG9vaywgYXJncykpOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgZmluYWwgY2xhc3MgSG9va1Rhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgIHByaXZhdGUgSG9va1Jlc3VsdCBydW5TeW5jSG9vayhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwKKyAgICAgIEZpbGUgaG9vaywgTGlzdDxTdHJpbmc+IGFyZ3MpIHRocm93cyBUaW1lb3V0RXhjZXB0aW9uIHsKKworICAgIGlmICghaG9vay5leGlzdHMoKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgU3luY0hvb2tUYXNrIHN5bmNIb29rID0gbmV3IFN5bmNIb29rVGFzayhwcm9qZWN0LCBob29rLCBhcmdzKTsKKyAgICBGdXR1cmVUYXNrPEhvb2tSZXN1bHQ+IHRhc2sgPSBuZXcgRnV0dXJlVGFzazxIb29rUmVzdWx0PihzeW5jSG9vayk7CisKKyAgICBzeW5jSG9va1RocmVhZFBvb2wuZXhlY3V0ZSh0YXNrKTsKKworICAgIFN0cmluZyBtZXNzYWdlOworCisgICAgdHJ5IHsKKyAgICAgIHJldHVybiB0YXNrLmdldChzeW5jSG9va1RpbWVvdXQsIFRpbWVVbml0LlNFQ09ORFMpOworICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgbWVzc2FnZSA9ICJTeW5jaHJvbm91cyBob29rIHRpbWVkIG91dCAiICArIGhvb2suZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICBsb2cuZXJyb3IobWVzc2FnZSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIG1lc3NhZ2UgPSAiRXJyb3IgcnVubmluZyBob29rICIgKyBob29rLmdldEFic29sdXRlUGF0aCgpOworICAgICAgbG9nLmVycm9yKG1lc3NhZ2UsIGUpOworICAgIH0KKworICAgIHRhc2suY2FuY2VsKHRydWUpOworICAgIHN5bmNIb29rLmNhbmNlbCgpOworICAgIHJldHVybiAgbmV3IEhvb2tSZXN1bHQoc3luY0hvb2suZ2V0T3V0cHV0KCksIG1lc3NhZ2UpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgc3luY0hvb2tUaHJlYWRQb29sLnNodXRkb3duKCk7CisgICAgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQ7CisgICAgZG8geworICAgICAgdHJ5IHsKKyAgICAgICAgaXNUZXJtaW5hdGVkID0gc3luY0hvb2tUaHJlYWRQb29sLmF3YWl0VGVybWluYXRpb24oMTAsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgaXNUZXJtaW5hdGVkID0gZmFsc2U7CisgICAgICB9CisgICAgfSB3aGlsZSAoIWlzVGVybWluYXRlZCk7CisgIH0KKworICBwcml2YXRlIGNsYXNzIEhvb2tUYXNrIHsKICAgICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0OwogICAgIHByaXZhdGUgZmluYWwgRmlsZSBob29rOwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ3M7CisgICAgcHJpdmF0ZSBTdHJpbmdXcml0ZXIgb3V0cHV0OworICAgIHByaXZhdGUgUHJvY2VzcyBwczsKIAotICAgIHByaXZhdGUgSG9va1Rhc2soUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIEZpbGUgaG9vaywgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICBwcm90ZWN0ZWQgSG9va1Rhc2soUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIEZpbGUgaG9vaywgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICB0aGlzLmhvb2sgPSBob29rOwogICAgICAgdGhpcy5hcmdzID0gYXJnczsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXQoKSB7CisgICAgICByZXR1cm4gb3V0cHV0ICE9IG51bGwgPyBvdXRwdXQudG9TdHJpbmcoKSA6IG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEhvb2tSZXN1bHQgcnVuSG9vaygpIHsKICAgICAgIFJlcG9zaXRvcnkgcmVwbyA9IG51bGw7CisgICAgICBIb29rUmVzdWx0IHJlc3VsdCA9IG51bGw7CiAgICAgICB0cnkgeworCiAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhcmd2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEgKyBhcmdzLnNpemUoKSk7CiAgICAgICAgIGFyZ3YuYWRkKGhvb2suZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICBhcmd2LmFkZEFsbChhcmdzKTsKQEAgLTUyNiwyMyArNzUyLDIyIEBACiAgICAgICAgICAgZW52LnB1dCgiR0lUX0RJUiIsIHJlcG8uZ2V0RGlyZWN0b3J5KCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgUHJvY2VzcyBwcyA9IHBiLnN0YXJ0KCk7CisgICAgICAgIHBzID0gcGIuc3RhcnQoKTsKICAgICAgICAgcHMuZ2V0T3V0cHV0U3RyZWFtKCkuY2xvc2UoKTsKLQotICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9Ci0gICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHBzLmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBwcy5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBTdHJpbmcgbGluZTsKLSAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiaG9va1siICsgaG9vay5nZXROYW1lKCkgKyAiXSBvdXRwdXQ6ICIgKyBsaW5lKTsKLSAgICAgICAgICB9CisgICAgICAgICAgb3V0cHV0ID0gcmVhZE91dHB1dChpcyk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyLmNsb3NlKCk7CisgICAgICAgICAgICBpcy5jbG9zZSgpOwogICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXJyKSB7CiAgICAgICAgICAgfQogICAgICAgICAgIHBzLndhaXRGb3IoKTsKKyAgICAgICAgICByZXN1bHQgPSBuZXcgSG9va1Jlc3VsdChwcy5leGl0VmFsdWUoKSwgb3V0cHV0KTsKICAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWV4KSB7CisgICAgICAgIC8vIEludGVycnVwdGVkRXhlY2VwdGlvbiAtIHRpbWVvdXQgb3IgY2FuY2VsCiAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXJyKSB7CiAgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgcnVubmluZyBob29rICIgKyBob29rLmdldEFic29sdXRlUGF0aCgpLCBlcnIpOwogICAgICAgfSBmaW5hbGx5IHsKQEAgLTU1MCwxMSArNzc1LDc5IEBACiAgICAgICAgICAgcmVwby5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICB9CisKKyAgICAgIGZpbmFsIGludCBleGl0VmFsdWUgPSByZXN1bHQuZ2V0RXhpdFZhbHVlKCk7CisgICAgICBpZiAoZXhpdFZhbHVlID09IDApIHsKKyAgICAgICAgbG9nLmRlYnVnKCJob29rWyIgKyBnZXROYW1lKCkgKyAiXSBleGl0VmFsdWU6IiArIGV4aXRWYWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2cuaW5mbygiaG9va1siICsgZ2V0TmFtZSgpICsgIl0gZXhpdFZhbHVlOiIgKyBleGl0VmFsdWUpOworICAgICAgfQorCisgICAgICBCdWZmZXJlZFJlYWRlciBiciA9CisgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIocmVzdWx0LmdldE91dHB1dCgpKSk7CisgICAgICB0cnkgeworICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgIGxvZy5pbmZvKCJob29rWyIgKyBnZXROYW1lKCkgKyAiXSBvdXRwdXQ6ICIgKyBsaW5lKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2F0Y2goSU9FeGNlcHRpb24gIGlveCkgeworICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHdyaXRpbmcgaG9vayBvdXRwdXQiLCBpb3gpOworICAgICAgfQorCisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJlYWRPdXRwdXQoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICBvdXRwdXQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dCA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7CisgICAgICBjaGFyW10gYnVmZmVyID0gbmV3IGNoYXJbNDA5Nl07CisgICAgICBpbnQgbiA9IDA7CisgICAgICB3aGlsZSAoKG4gPSBpbnB1dC5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIG4pOworICAgICAgfQorCisgICAgICByZXR1cm4gb3V0cHV0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgcmV0dXJuIGhvb2suZ2V0TmFtZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICByZXR1cm4gImhvb2sgIiArIGhvb2suZ2V0TmFtZSgpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgIHBzLmRlc3Ryb3koKTsKKyAgICB9CisgIH0KKworICAvKiogQ2FsbGFibGUgdHlwZSB1c2VkIHRvIHJ1biBzeW5jaHJvbm91cyBob29rcyAqLworICBwcml2YXRlIGZpbmFsIGNsYXNzIFN5bmNIb29rVGFzayBleHRlbmRzIEhvb2tUYXNrCisgICAgICBpbXBsZW1lbnRzIENhbGxhYmxlPEhvb2tSZXN1bHQ+IHsKKworICAgIHByaXZhdGUgU3luY0hvb2tUYXNrKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBGaWxlIGhvb2ssIExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgICAgICBzdXBlcihwcm9qZWN0LCBob29rLCBhcmdzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSG9va1Jlc3VsdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gc3VwZXIucnVuSG9vaygpOworICAgIH0KKyAgfQorCisgIC8qKiBSdW5hYmxlIHR5cGUgdXNlZCB0byBydW4gYXN5bmMgaG9va3MgKi8KKyAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBBc3luY0hvb2tUYXNrIGV4dGVuZHMgSG9va1Rhc2sgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICBwcml2YXRlIEFzeW5jSG9va1Rhc2soUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIEZpbGUgaG9vaywgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgIHN1cGVyKHByb2plY3QsIGhvb2ssIGFyZ3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIHN1cGVyLnJ1bkhvb2soKTsKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vQ2hhbmdlSG9va3MuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9jb21tb24vQ2hhbmdlSG9va3MuamF2YQppbmRleCAxMzQwNTdkLi40OGE1MmEwIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0NoYW5nZUhvb2tzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9DaGFuZ2VIb29rcy5qYXZhCkBAIC0xNCwxMyArMTQsMTMgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb247CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va1J1bm5lci5Ib29rUmVzdWx0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNvbnRyaWJ1dG9yQWdyZWVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CkBAIC01MCw3ICs1MCw3IEBACiAgICAqIEZpcmUgdGhlIERyYWZ0IFB1Ymxpc2hlZCBIb29rLgogICAgKgogICAgKiBAcGFyYW0gY2hhbmdlIFRoZSBjaGFuZ2UgaXRzZWxmLgotICAgKiBAcGFyYW0gcGF0Y2hTZXQgVGhlIFBhdGNoc2V0IHRoYXQgd2FzIGNyZWF0ZWQuCisgICAqIEBwYXJhbSBwYXRjaFNldCBUaGUgUGF0Y2hzZXQgdGhhdCB3YXMgcHVibGlzaGVkLgogICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbgogICAgKi8KICAgcHVibGljIHZvaWQgZG9EcmFmdFB1Ymxpc2hlZEhvb2soQ2hhbmdlIGNoYW5nZSwgUGF0Y2hTZXQgcGF0Y2hTZXQsCkBAIC02MywxMiArNjMsMTIgQEAKICAgICogQHBhcmFtIHBhdGNoU2V0IFRoZSBwYXRjaHNldCB0aGlzIGNvbW1lbnQgaXMgcmVsYXRlZCB0by4KICAgICogQHBhcmFtIGFjY291bnQgVGhlIGdlcnJpdCB1c2VyIHdobyBhZGRlZCB0aGUgY29tbWVudC4KICAgICogQHBhcmFtIGNvbW1lbnQgVGhlIGNvbW1lbnQgZ2l2ZW4uCi0gICAqIEBwYXJhbSBhcHByb3ZhbHMgTWFwIG9mIEFwcHJvdmFsIENhdGVnb3JpZXMgYW5kIFNjb3JlcworICAgKiBAcGFyYW0gYXBwcm92YWxzIE1hcCBvZiBsYWJlbCBJRHMgdG8gc2NvcmVzCiAgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uCiAgICAqLwogICBwdWJsaWMgdm9pZCBkb0NvbW1lbnRBZGRlZEhvb2soQ2hhbmdlIGNoYW5nZSwgQWNjb3VudCBhY2NvdW50LAogICAgICAgUGF0Y2hTZXQgcGF0Y2hTZXQsIFN0cmluZyBjb21tZW50LAotICAgICAgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYXBwcm92YWxzLCBSZXZpZXdEYiBkYikKKyAgICAgIE1hcDxTdHJpbmcsIFNob3J0PiBhcHByb3ZhbHMsIFJldmlld0RiIGRiKQogICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbjsKIAogICAvKioKQEAgLTgzLDYgKzgzLDE4IEBACiAgICAgICBQYXRjaFNldCBwYXRjaFNldCwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb247CiAKICAgLyoqCisgICAqIEZpcmUgdGhlIE1lcmdlIEZhaWxlZCBIb29rLgorICAgKgorICAgKiBAcGFyYW0gY2hhbmdlIFRoZSBjaGFuZ2UgaXRzZWxmLgorICAgKiBAcGFyYW0gYWNjb3VudCBUaGUgZ2Vycml0IHVzZXIgd2hvIGF0dGVtcHRlZCB0byBzdWJtaXQgdGhlIGNoYW5nZS4KKyAgICogQHBhcmFtIHBhdGNoU2V0IFRoZSBwYXRjaHNldCB0aGF0IGZhaWxlZCB0byBtZXJnZS4KKyAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIHRoYXQgdGhlIGNoYW5nZSBmYWlsZWQgdG8gbWVyZ2UuCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgdm9pZCBkb01lcmdlRmFpbGVkSG9vayhDaGFuZ2UgY2hhbmdlLCBBY2NvdW50IGFjY291bnQsCisgICAgICBQYXRjaFNldCBwYXRjaFNldCwgU3RyaW5nIHJlYXNvbiwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb247CisKKyAgLyoqCiAgICAqIEZpcmUgdGhlIENoYW5nZSBBYmFuZG9uZWQgSG9vay4KICAgICoKICAgICogQHBhcmFtIGNoYW5nZSBUaGUgY2hhbmdlIGl0c2VsZi4KQEAgLTEyNSw1ICsxMzcsMjggQEAKICAgcHVibGljIHZvaWQgZG9SZWZVcGRhdGVkSG9vayhCcmFuY2guTmFtZUtleSByZWZOYW1lLCBPYmplY3RJZCBvbGRJZCwKICAgICAgIE9iamVjdElkIG5ld0lkLCBBY2NvdW50IGFjY291bnQpOwogCisgIC8qKgorICAgKiBGaXJlIHRoZSBSZXZpZXdlciBBZGRlZCBIb29rCisgICAqCisgICAqIEBwYXJhbSBjaGFuZ2UgVGhlIGNoYW5nZSBpdHNlbGYuCisgICAqIEBwYXJhbSBwYXRjaFNldCBUaGUgcGF0Y2hzZXQgdGhhdCB0aGUgcmV2aWV3ZXIgd2FzIGFkZGVkIG9uLgorICAgKiBAcGFyYW0gYWNjb3VudCBUaGUgZ2Vycml0IHVzZXIgd2hvIHdhcyBhZGRlZCBhcyByZXZpZXdlci4KKyAgICovCisgIHB1YmxpYyB2b2lkIGRvUmV2aWV3ZXJBZGRlZEhvb2soQ2hhbmdlIGNoYW5nZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgUGF0Y2hTZXQgcGF0Y2hTZXQsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uOworCiAgIHB1YmxpYyB2b2lkIGRvQ2xhU2lnbnVwSG9vayhBY2NvdW50IGFjY291bnQsIENvbnRyaWJ1dG9yQWdyZWVtZW50IGNsYSk7CisKKyAgLyoqCisgICAqIEZpcmUgdGhlIFJlZiB1cGRhdGUgSG9vaworICAgKgorICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgdGFyZ2V0IHByb2plY3QKKyAgICogQHBhcmFtIHJlZk5hbWUgVGhlIEJyYW5jaC5OYW1lS2V5IG9mIHRoZSByZWYgcHJvdmlkZWQgYnkgY2xpZW50CisgICAqIEBwYXJhbSB1cGxvYWRlciBUaGUgZ2Vycml0IHVzZXIgcnVubmluZyB0aGUgY29tbWFuZAorICAgKiBAcGFyYW0gb2xkSWQgVGhlIHJlZidzIG9sZCBpZAorICAgKiBAcGFyYW0gbmV3SWQgVGhlIHJlZidzIG5ldyBpZAorICAgKiBAcGFyYW0gYWNjb3VudCBUaGUgZ2Vycml0IHVzZXIgd2hvIG1vdmVkIHRoZSByZWYKKyAgICovCisgIHB1YmxpYyBIb29rUmVzdWx0IGRvUmVmVXBkYXRlSG9vayhQcm9qZWN0IHByb2plY3QsICBTdHJpbmcgcmVmTmFtZSwKKyAgICAgICBBY2NvdW50IHVwbG9hZGVyLCBPYmplY3RJZCBvbGRJZCwgT2JqZWN0SWQgbmV3SWQpOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NvbW1vbi9EaXNhYmxlZENoYW5nZUhvb2tzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0Rpc2FibGVkQ2hhbmdlSG9va3MuamF2YQppbmRleCBmMzBmNWVhLi42MDExYWIwIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0Rpc2FibGVkQ2hhbmdlSG9va3MuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvY29tbW9uL0Rpc2FibGVkQ2hhbmdlSG9va3MuamF2YQpAQCAtMTQsMTMgKzE0LDEzIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXIuSG9va1Jlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Db250cmlidXRvckFncmVlbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2guTmFtZUtleTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoLk5hbWVLZXk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIApAQCAtNDYsNiArNDYsMTEgQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb01lcmdlRmFpbGVkSG9vayhDaGFuZ2UgY2hhbmdlLCBBY2NvdW50IGFjY291bnQsCisgICAgICBQYXRjaFNldCBwYXRjaFNldCwgU3RyaW5nIHJlYXNvbiwgUmV2aWV3RGIgZGIpIHsKKyAgfQorCisgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBkb0NoYW5nZVJlc3RvcmVkSG9vayhDaGFuZ2UgY2hhbmdlLCBBY2NvdW50IGFjY291bnQsCiAgICAgICBTdHJpbmcgcmVhc29uLCBSZXZpZXdEYiBkYikgewogICB9CkBAIC01Nyw3ICs2Miw3IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBkb0NvbW1lbnRBZGRlZEhvb2soQ2hhbmdlIGNoYW5nZSwgQWNjb3VudCBhY2NvdW50LAogICAgICAgUGF0Y2hTZXQgcGF0Y2hTZXQsIFN0cmluZyBjb21tZW50LAotICAgICAgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYXBwcm92YWxzLCBSZXZpZXdEYiBkYikgeworICAgICAgTWFwPFN0cmluZywgU2hvcnQ+IGFwcHJvdmFscywgUmV2aWV3RGIgZGIpIHsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtODEsNiArODYsMTcgQEAKICAgfQogCiAgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBkb1Jldmlld2VyQWRkZWRIb29rKENoYW5nZSBjaGFuZ2UsIEFjY291bnQgYWNjb3VudCwgUGF0Y2hTZXQgcGF0Y2hTZXQsCisgICAgICBSZXZpZXdEYiBkYikgeworICB9CisKKyAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CiAgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEhvb2tSZXN1bHQgZG9SZWZVcGRhdGVIb29rKFByb2plY3QgcHJvamVjdCwgU3RyaW5nIHJlZk5hbWUsCisgICAgICBBY2NvdW50IHVwbG9hZGVyLCBPYmplY3RJZCBvbGRJZCwgT2JqZWN0SWQgbmV3SWQpIHsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1ByZWRpY2F0ZUNsYXNzTG9hZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJlZGljYXRlQ2xhc3NMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJkMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1ByZWRpY2F0ZUNsYXNzTG9hZGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkSGFzaE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCisvKioKKyAqIExvYWRzIHRoZSBjbGFzc2VzIGZvciBQcm9sb2cgcHJlZGljYXRlcy4KKyAqLworcHVibGljIGNsYXNzIFByZWRpY2F0ZUNsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIgeworCisgIHByaXZhdGUgZmluYWwgTXVsdGltYXA8U3RyaW5nLCBDbGFzc0xvYWRlcj4gcGFja2FnZUNsYXNzTG9hZGVyTWFwID0KKyAgICAgIExpbmtlZEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKKworICBwdWJsaWMgUHJlZGljYXRlQ2xhc3NMb2FkZXIoCisgICAgICBmaW5hbCBEeW5hbWljU2V0PFByZWRpY2F0ZVByb3ZpZGVyPiBwcmVkaWNhdGVQcm92aWRlcnMsCisgICAgICBmaW5hbCBDbGFzc0xvYWRlciBwYXJlbnQpIHsKKyAgICBzdXBlcihwYXJlbnQpOworCisgICAgZm9yIChQcmVkaWNhdGVQcm92aWRlciBwcmVkaWNhdGVQcm92aWRlciA6IHByZWRpY2F0ZVByb3ZpZGVycykgeworICAgICAgZm9yIChTdHJpbmcgcGtnIDogcHJlZGljYXRlUHJvdmlkZXIuZ2V0UGFja2FnZXMoKSkgeworICAgICAgICBwYWNrYWdlQ2xhc3NMb2FkZXJNYXAucHV0KHBrZywgcHJlZGljYXRlUHJvdmlkZXIuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZmluZENsYXNzKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpCisgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ29sbGVjdGlvbjxDbGFzc0xvYWRlcj4gY2xhc3NMb2FkZXJzID0KKyAgICAgICAgcGFja2FnZUNsYXNzTG9hZGVyTWFwLmdldChnZXRQYWNrYWdlTmFtZShjbGFzc05hbWUpKTsKKyAgICBmb3IgKGZpbmFsIENsYXNzTG9hZGVyIGNsIDogY2xhc3NMb2FkZXJzKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsKTsKKyAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBpZ25vcmUKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oY2xhc3NOYW1lKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgZmluYWwgaW50IHBvcyA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgIGlmIChwb3MgPCAwKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIHBvcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9QcmVkaWNhdGVQcm92aWRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1ByZWRpY2F0ZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkOTQyMwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9QcmVkaWNhdGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQucnVsZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4dGVuc2lvblBvaW50OworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5QcmVkaWNhdGU7CisKKy8qKgorICogUHJvdmlkZXMgYWRkaXRpb25hbCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gUHJvbG9nIHByZWRpY2F0ZXMgdGhhdCBzaG91bGQgYmUKKyAqIG1hZGUgYXZhaWxhYmxlIGluIHRoZSBQcm9sb2cgZW52aXJvbm1lbnQuIFRoZSBwcmVkaWNhdGVzIGNhbiBlLmcuIGJlIHVzZWQgaW4KKyAqIHRoZSBwcm9qZWN0IHN1Ym1pdCBydWxlcy4KKyAqCisgKiBFYWNoIEphdmEgY2xhc3MgZGVmaW5pbmcgYSBQcm9sb2cgcHJlZGljYXRlIG11c3QgYmUgaW4gb25lIG9mIHRoZSBwcm92aWRlZAorICogcGFja2FnZXMgYW5kIGl0cyBuYW1lIG11c3QgYXBwbHkgdG8gdGhlICdQUkVEX1tmdW5jdG9yXV9bYXJpdHldJyBmb3JtYXQuIEluCisgKiBhZGRpdGlvbiBpdCBtdXN0IGV4dGVuZCB7QGxpbmsgUHJlZGljYXRlfS4KKyAqLworQEV4dGVuc2lvblBvaW50CitwdWJsaWMgaW50ZXJmYWNlIFByZWRpY2F0ZVByb3ZpZGVyIHsKKyAgLyoqIFJldHVybiBzZXQgb2YgcGFja2FnZXMgdGhhdCBjb250YWluIFByb2xvZyBwcmVkaWNhdGVzICovCisgIHB1YmxpYyBJbW11dGFibGVTZXQ8U3RyaW5nPiBnZXRQYWNrYWdlcygpOworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1Byb2xvZ01vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1Byb2xvZ01vZHVsZS5qYXZhCmluZGV4IGQzNjE3OTAuLjkyYjhiMWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9Qcm9sb2dNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUHJvbG9nTW9kdWxlLmphdmEKQEAgLTE0LDExICsxNCwxMyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkZhY3RvcnlNb2R1bGU7CiAKIHB1YmxpYyBjbGFzcyBQcm9sb2dNb2R1bGUgZXh0ZW5kcyBGYWN0b3J5TW9kdWxlIHsKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICBEeW5hbWljU2V0LnNldE9mKGJpbmRlcigpLCBQcmVkaWNhdGVQcm92aWRlci5jbGFzcyk7CiAgICAgZmFjdG9yeShQcm9sb2dFbnZpcm9ubWVudC5GYWN0b3J5LmNsYXNzKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1J1bGVzQ2FjaGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9SdWxlc0NhY2hlLmphdmEKaW5kZXggZmJlZTE0NS4uZGFkNTNiOSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1J1bGVzQ2FjaGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvUnVsZXNDYWNoZS5qYXZhCkBAIC0xNiw2ICsxNiw5IEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2dNYWNoaW5lQ29weS5zYXZlOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKQEAgLTQyLDcgKzQ1LDEwIEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5QdXNoYmFja1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlOwpAQCAtNTIsNiArNTgsNyBAQAogaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwogaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgpAQCAtNjksMTAgKzc2LDggQEAKICAgLyoqIERlZmF1bHQgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgUHJvbG9nIGRhdGFiYXNlIHdpdGhpbiBlYWNoIGludGVycHJldGVyLiAqLwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREJfTUFYID0gMjU2OwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBBQ0tBR0VfTElTVCA9IHsKLSAgICAgIFByb2xvZy5CVUlMVElOLAotICAgICAgImdlcnJpdCIsCi0gICAgfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFBBQ0tBR0VfTElTVCA9IEltbXV0YWJsZUxpc3Qub2YoCisgICAgICBQcm9sb2cuQlVJTFRJTiwgImdlcnJpdCIpOwogCiAgIHByaXZhdGUgZmluYWwgTWFwPE9iamVjdElkLCBNYWNoaW5lUmVmPiBtYWNoaW5lQ2FjaGUgPQogICAgICAgbmV3IEhhc2hNYXA8T2JqZWN0SWQsIE1hY2hpbmVSZWY+KCk7CkBAIC05NCwyMSArOTksMjcgQEAKICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGNhY2hlRGlyOwogICBwcml2YXRlIGZpbmFsIEZpbGUgcnVsZXNEaXI7CiAgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWdyOworICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8UHJlZGljYXRlUHJvdmlkZXI+IHByZWRpY2F0ZVByb3ZpZGVyczsKICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlciBzeXN0ZW1Mb2FkZXI7CiAgIHByaXZhdGUgZmluYWwgUHJvbG9nTWFjaGluZUNvcHkgZGVmYXVsdE1hY2hpbmU7CiAKICAgQEluamVjdAogICBwcm90ZWN0ZWQgUnVsZXNDYWNoZShAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjb25maWcsIFNpdGVQYXRocyBzaXRlLAotICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ20pIHsKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdtLCBEeW5hbWljU2V0PFByZWRpY2F0ZVByb3ZpZGVyPiBwcmVkaWNhdGVQcm92aWRlcnMpIHsKICAgICBlbmFibGVQcm9qZWN0UnVsZXMgPSBjb25maWcuZ2V0Qm9vbGVhbigicnVsZXMiLCBudWxsLCAiZW5hYmxlIiwgdHJ1ZSk7CiAgICAgY2FjaGVEaXIgPSBzaXRlLnJlc29sdmUoY29uZmlnLmdldFN0cmluZygiY2FjaGUiLCBudWxsLCAiZGlyZWN0b3J5IikpOwogICAgIHJ1bGVzRGlyID0gY2FjaGVEaXIgIT0gbnVsbCA/IG5ldyBGaWxlKGNhY2hlRGlyLCAicnVsZXMiKSA6IG51bGw7CiAgICAgZ2l0TWdyID0gZ207CisgICAgdGhpcy5wcmVkaWNhdGVQcm92aWRlcnMgPSBwcmVkaWNhdGVQcm92aWRlcnM7CiAKICAgICBzeXN0ZW1Mb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CiAgICAgZGVmYXVsdE1hY2hpbmUgPSBzYXZlKG5ld0VtcHR5TWFjaGluZShzeXN0ZW1Mb2FkZXIpKTsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIGlzUHJvamVjdFJ1bGVzRW5hYmxlZCgpIHsKKyAgICByZXR1cm4gZW5hYmxlUHJvamVjdFJ1bGVzOworICB9CisKICAgLyoqCiAgICAqIExvY2F0ZSBhIGNhY2hlZCBQcm9sb2cgbWFjaGluZSBzdGF0ZSwgb3IgY3JlYXRlIG9uZSBpZiBub3QgYXZhaWxhYmxlLgogICAgKgpAQCAtMTQyLDYgKzE1MywxNSBAQAogICAgIHJldHVybiBwY207CiAgIH0KIAorICBwdWJsaWMgUHJvbG9nTWFjaGluZUNvcHkgbG9hZE1hY2hpbmUoU3RyaW5nIG5hbWUsIElucHV0U3RyZWFtIGluKQorICAgICAgdGhyb3dzIENvbXBpbGVFeGNlcHRpb24geworICAgIFByb2xvZ01hY2hpbmVDb3B5IHBtYyA9IGNvbnN1bHRSdWxlcyhuYW1lLCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKKyAgICBpZiAocG1jID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBDb21waWxlRXhjZXB0aW9uKCJDYW5ub3QgY29uc3VsdCBydWxlcyBmcm9tIHRoZSBzdHJlYW0gIiArIG5hbWUpOworICAgIH0KKyAgICByZXR1cm4gcG1jOworICB9CisKICAgcHJpdmF0ZSB2b2lkIGdjKCkgewogICAgIFJlZmVyZW5jZTw/PiByZWY7CiAgICAgd2hpbGUgKChyZWYgPSBkZWFkLnBvbGwoKSkgIT0gbnVsbCkgewpAQCAtMTY4LDE2ICsxODgsMjEgQEAKICAgICAvLyBEeW5hbWljYWxseSBjb25zdWx0IHRoZSBydWxlcyBpbnRvIHRoZSBtYWNoaW5lJ3MgaW50ZXJuYWwgZGF0YWJhc2UuCiAgICAgLy8KICAgICBTdHJpbmcgcnVsZXMgPSByZWFkKHByb2plY3QsIHJ1bGVzSWQpOwotICAgIEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2wgY3RsID0gbmV3RW1wdHlNYWNoaW5lKHN5c3RlbUxvYWRlcik7Ci0gICAgUHVzaGJhY2tSZWFkZXIgaW4gPSBuZXcgUHVzaGJhY2tSZWFkZXIoCi0gICAgICAgIG5ldyBTdHJpbmdSZWFkZXIocnVsZXMpLAotICAgICAgICBQcm9sb2cuUFVTSEJBQ0tfU0laRSk7CisgICAgUHJvbG9nTWFjaGluZUNvcHkgcG1jID0gY29uc3VsdFJ1bGVzKCJydWxlcy5wbCIsIG5ldyBTdHJpbmdSZWFkZXIocnVsZXMpKTsKKyAgICBpZiAocG1jID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBDb21waWxlRXhjZXB0aW9uKCJDYW5ub3QgY29uc3VsdCBydWxlcyBvZiAiICsgcHJvamVjdCk7CisgICAgfQorICAgIHJldHVybiBwbWM7CisgIH0KIAorICBwcml2YXRlIFByb2xvZ01hY2hpbmVDb3B5IGNvbnN1bHRSdWxlcyhTdHJpbmcgbmFtZSwgUmVhZGVyIHJ1bGVzKSB7CisgICAgQnVmZmVyaW5nUHJvbG9nQ29udHJvbCBjdGwgPSBuZXdFbXB0eU1hY2hpbmUoc3lzdGVtTG9hZGVyKTsKKyAgICBQdXNoYmFja1JlYWRlciBpbiA9IG5ldyBQdXNoYmFja1JlYWRlcihydWxlcywgUHJvbG9nLlBVU0hCQUNLX1NJWkUpOwogICAgIGlmICghY3RsLmV4ZWN1dGUoCiAgICAgICAgIFByb2xvZy5CVUlMVElOLCAiY29uc3VsdF9zdHJlYW0iLAotICAgICAgICBTeW1ib2xUZXJtLmludGVybigicnVsZXMucGwiKSwKKyAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4obmFtZSksCiAgICAgICAgIG5ldyBKYXZhT2JqZWN0VGVybShpbikpKSB7Ci0gICAgICB0aHJvdyBuZXcgQ29tcGlsZUV4Y2VwdGlvbigiQ2Fubm90IGNvbnN1bHQgcnVsZXMgb2YgIiArIHByb2plY3QpOworICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICAgIHJldHVybiBzYXZlKGN0bCk7CiAgIH0KQEAgLTIwNywxNSArMjMyLDIyIEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyaW5nUHJvbG9nQ29udHJvbCBuZXdFbXB0eU1hY2hpbmUoQ2xhc3NMb2FkZXIgY2wpIHsKKyAgcHJpdmF0ZSBCdWZmZXJpbmdQcm9sb2dDb250cm9sIG5ld0VtcHR5TWFjaGluZShDbGFzc0xvYWRlciBjbCkgewogICAgIEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2wgY3RsID0gbmV3IEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2woKTsKICAgICBjdGwuc2V0TWF4QXJpdHkoUHJvbG9nRW52aXJvbm1lbnQuTUFYX0FSSVRZKTsKICAgICBjdGwuc2V0TWF4RGF0YWJhc2VTaXplKERCX01BWCk7Ci0gICAgY3RsLnNldFByb2xvZ0NsYXNzTG9hZGVyKG5ldyBQcm9sb2dDbGFzc0xvYWRlcihjbCkpOworICAgIGN0bC5zZXRQcm9sb2dDbGFzc0xvYWRlcihuZXcgUHJvbG9nQ2xhc3NMb2FkZXIobmV3IFByZWRpY2F0ZUNsYXNzTG9hZGVyKAorICAgICAgICBwcmVkaWNhdGVQcm92aWRlcnMsIGNsKSkpOwogICAgIGN0bC5zZXRFbmFibGVkKEVudW1TZXQuYWxsT2YoUHJvbG9nLkZlYXR1cmUuY2xhc3MpLCBmYWxzZSk7CiAKKyAgICBMaXN0PFN0cmluZz4gcGFja2FnZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBwYWNrYWdlcy5hZGRBbGwoUEFDS0FHRV9MSVNUKTsKKyAgICBmb3IgKFByZWRpY2F0ZVByb3ZpZGVyIHByZWRpY2F0ZVByb3ZpZGVyIDogcHJlZGljYXRlUHJvdmlkZXJzKSB7CisgICAgICBwYWNrYWdlcy5hZGRBbGwocHJlZGljYXRlUHJvdmlkZXIuZ2V0UGFja2FnZXMoKSk7CisgICAgfQorCiAgICAgLy8gQm9vdHN0cmFwIHRoZSBpbnRlcnByZXRlciBhbmQgZW5zdXJlIHRoZXJlIGlzIGNsZWFuIHN0YXRlLgotICAgIGN0bC5pbml0aWFsaXplKFBBQ0tBR0VfTElTVCk7CisgICAgY3RsLmluaXRpYWxpemUocGFja2FnZXMudG9BcnJheShuZXcgU3RyaW5nW3BhY2thZ2VzLnNpemUoKV0pKTsKICAgICByZXR1cm4gY3RsOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQWNjZXNzUGF0aC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9BY2Nlc3NQYXRoLmphdmEKaW5kZXggYWU3NmE2ZS4uMzFkZjg3NSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9BY2Nlc3NQYXRoLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9BY2Nlc3NQYXRoLmphdmEKQEAgLTE5LDggKzE5LDE0IEBACiAgIC8qKiBBbiB1bmtub3duIGFjY2VzcyBwYXRoLCBwcm9iYWJseSBzaG91bGQgbm90IGJlIHNwZWNpYWwuICovCiAgIFVOS05PV04sCiAKLSAgLyoqIEFjY2VzcyB0aHJvdWdoIHRoZSB3ZWIgVUkuICovCi0gIFdFQl9VSSwKKyAgLyoqIEFjY2VzcyB0aHJvdWdoIHRoZSBSRVNUIEFQSS4gKi8KKyAgUkVTVF9BUEksCisKKyAgLyoqIEFjY2VzcyB0aHJvdWdoIHRoZSBvbGQgSlNPTi1SUEMgaW50ZXJmYWNlLiAqLworICBKU09OX1JQQywKKworICAvKiogQWNjZXNzIGJ5IGEgd2ViIGNvb2tpZS4gVGhpcyBwYXRoIGlzIG5vdCBwcm90ZWN0ZWQgbGlrZSBSRVNUX0FQSS4gKi8KKyAgV0VCX0JST1dTRVIsCiAKICAgLyoqIEFjY2VzcyB0aHJvdWdoIGFuIFNTSCBjb21tYW5kIHRoYXQgaXMgbm90IGludm9rZWQgYnkgR2l0LiAqLwogICBTU0hfQ09NTUFORCwKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQW5vbnltb3VzVXNlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9Bbm9ueW1vdXNVc2VyLmphdmEKaW5kZXggNWQzNmIzMy4uZjFmZTcyZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9Bbm9ueW1vdXNVc2VyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9Bbm9ueW1vdXNVc2VyLmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIHB1YmxpYyBjbGFzcyBBbm9ueW1vdXNVc2VyIGV4dGVuZHMgQ3VycmVudFVzZXIgewogICBASW5qZWN0CiAgIEFub255bW91c1VzZXIoQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpIHsKLSAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksIEFjY2Vzc1BhdGguVU5LTk9XTik7CisgICAgc3VwZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5KTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9BcHByb3ZhbHNVdGlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0FwcHJvdmFsc1V0aWwuamF2YQppbmRleCBhMjk1YzQ5Li4wY2U2ODkyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0FwcHJvdmFsc1V0aWwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0FwcHJvdmFsc1V0aWwuamF2YQpAQCAtMTQsMjIgKzE0LDIyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQuSWQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC00NiwyMCArNDYsMTcgQEAKICAqLwogcHVibGljIGNsYXNzIEFwcHJvdmFsc1V0aWwgewogICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKIAogICBASW5qZWN0Ci0gIEFwcHJvdmFsc1V0aWwoUmV2aWV3RGIgZGIsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlcykgeworICBwdWJsaWMgQXBwcm92YWxzVXRpbChSZXZpZXdEYiBkYikgewogICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwogICB9CiAKICAgLyoqCiAgICAqIFJlc3luYyB0aGUgY2hhbmdlT3BlbiBzdGF0dXMgd2hpY2ggaXMgY2FjaGVkIGluIHRoZSBhcHByb3ZhbHMgdGFibGUgZm9yCiAgICAqIHBlcmZvcm1hbmNlIHJlYXNvbnMKICAgICovCi0gIHB1YmxpYyB2b2lkIHN5bmNDaGFuZ2VTdGF0dXMoZmluYWwgQ2hhbmdlIGNoYW5nZSkKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICBwdWJsaWMgdm9pZCBzeW5jQ2hhbmdlU3RhdHVzKGZpbmFsIENoYW5nZSBjaGFuZ2UpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzID0KICAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2UuZ2V0SWQoKSkudG9MaXN0KCk7CiAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhcHByb3ZhbHMpIHsKQEAgLTY5LDUzICs2Niw0MSBAQAogICB9CiAKICAgLyoqCi0gICAqIE1vdmVzIHRoZSBQYXRjaFNldEFwcHJvdmFscyB0byB0aGUgbGFzdCBQYXRjaFNldCBvbiB0aGUgY2hhbmdlIHdoaWxlCi0gICAqIGtlZXBpbmcgdGhlIHZldG9zLgorICAgKiBNb3ZlcyB0aGUgUGF0Y2hTZXRBcHByb3ZhbHMgdG8gdGhlIHNwZWNpZmllZCBQYXRjaFNldCBvbiB0aGUgY2hhbmdlIGZyb20KKyAgICogdGhlIHByaW9yIFBhdGNoU2V0LCB3aGlsZSBrZWVwaW5nIHRoZSB2ZXRvcy4KICAgICoKLSAgICogQHBhcmFtIGNoYW5nZSBDaGFuZ2UgdG8gdXBkYXRlCisgICAqIEBwYXJhbSBkYiBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSBmb3IgdXBkYXRlcy4KKyAgICogQHBhcmFtIGRlc3QgUGF0Y2hTZXQgdG8gY29weSB0bwogICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbgotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAqIEByZXR1cm4gTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBUaGUgcHJldmlvdXMgYXBwcm92YWxzCiAgICAqLwotICBwdWJsaWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBjb3B5VmV0b3NUb0xhdGVzdFBhdGNoU2V0KENoYW5nZSBjaGFuZ2UpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGNvcHlWZXRvc1RvUGF0Y2hTZXQoUmV2aWV3RGIgZGIsCisgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMsIFBhdGNoU2V0LklkIGRlc3QpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIFBhdGNoU2V0LklkIHNvdXJjZTsKLSAgICBpZiAoY2hhbmdlLmdldE51bWJlck9mUGF0Y2hTZXRzKCkgPiAxKSB7Ci0gICAgICBzb3VyY2UgPSBuZXcgUGF0Y2hTZXQuSWQoY2hhbmdlLmdldElkKCksIGNoYW5nZS5nZXROdW1iZXJPZlBhdGNoU2V0cygpIC0gMSk7CisgICAgaWYgKGRlc3QuZ2V0KCkgPiAxKSB7CisgICAgICBzb3VyY2UgPSBuZXcgUGF0Y2hTZXQuSWQoZGVzdC5nZXRQYXJlbnRLZXkoKSwgZGVzdC5nZXQoKSAtIDEpOwogICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlByZXZpb3VzIHBhdGNoIHNldCBjb3VsZCBub3QgYmUgZm91bmQiKTsKKyAgICAgIHRocm93IG5ldyBPcm1FeGNlcHRpb24oIlByZXZpb3VzIHBhdGNoIHNldCBjb3VsZCBub3QgYmUgZm91bmQiKTsKICAgICB9CiAKLSAgICBQYXRjaFNldC5JZCBkZXN0ID0gY2hhbmdlLmN1cnJQYXRjaFNldElkKCk7Ci0gICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBwYXRjaFNldEFwcHJvdmFscyA9IGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlDaGFuZ2UoY2hhbmdlLmdldElkKCkpLnRvTGlzdCgpOworICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gcGF0Y2hTZXRBcHByb3ZhbHMgPQorICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKGRlc3QuZ2V0UGFyZW50S2V5KCkpLnRvTGlzdCgpOwogICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogcGF0Y2hTZXRBcHByb3ZhbHMpIHsKLSAgICAgIC8vIEFwcHJvdmFsQ2F0ZWdvcnkuU1VCTUlUIGlzIHN0aWxsIGluIGRiIGJ1dCBub3QgcmVsZXZhbnQgaW4gZ2l0LXN0b3JlCi0gICAgICBpZiAoIUFwcHJvdmFsQ2F0ZWdvcnkuU1VCTUlULmVxdWFscyhhLmdldENhdGVnb3J5SWQoKSkpIHsKLSAgICAgICAgZmluYWwgQXBwcm92YWxUeXBlIHR5cGUgPSBhcHByb3ZhbFR5cGVzLmJ5SWQoYS5nZXRDYXRlZ29yeUlkKCkpOwotICAgICAgICBpZiAoYS5nZXRQYXRjaFNldElkKCkuZXF1YWxzKHNvdXJjZSkgJiYKLSAgICAgICAgICAgIHR5cGUuZ2V0Q2F0ZWdvcnkoKS5pc0NvcHlNaW5TY29yZSgpICYmCi0gICAgICAgICAgICB0eXBlLmlzTWF4TmVnYXRpdmUoYSkpIHsKLSAgICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmluc2VydCgKLSAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ldyBQYXRjaFNldEFwcHJvdmFsKGRlc3QsIGEpKSk7Ci0gICAgICAgIH0KKyAgICAgIExhYmVsVHlwZSB0eXBlID0gbGFiZWxUeXBlcy5ieUxhYmVsKGEuZ2V0TGFiZWxJZCgpKTsKKyAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgYS5nZXRQYXRjaFNldElkKCkuZXF1YWxzKHNvdXJjZSkgJiYKKyAgICAgICAgICB0eXBlLmlzQ29weU1pblNjb3JlKCkgJiYKKyAgICAgICAgICB0eXBlLmlzTWF4TmVnYXRpdmUoYSkpIHsKKyAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5pbnNlcnQoCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IFBhdGNoU2V0QXBwcm92YWwoZGVzdCwgYSkpKTsKICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHBhdGNoU2V0QXBwcm92YWxzOwogICB9CiAKLQotICAvKiogQXR0YWNoIHJldmlld2VycyB0byBhIGNoYW5nZS4gKi8KLSAgcHVibGljIHZvaWQgYWRkUmV2aWV3ZXJzKENoYW5nZSBjaGFuZ2UsIFBhdGNoU2V0IHBzLCBQYXRjaFNldEluZm8gaW5mbywKLSAgICAgIFNldDxBY2NvdW50LklkPiB3YW50UmV2aWV3ZXJzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBTZXQ8SWQ+IGV4aXN0aW5nID0gU2V0cy48QWNjb3VudC5JZD4gbmV3SGFzaFNldCgpOwotICAgIGFkZFJldmlld2VycyhjaGFuZ2UsIHBzLCBpbmZvLCB3YW50UmV2aWV3ZXJzLCBleGlzdGluZyk7Ci0gIH0KLQotICAvKiogQXR0YWNoIHJldmlld2VycyB0byBhIGNoYW5nZS4gKi8KLSAgcHVibGljIHZvaWQgYWRkUmV2aWV3ZXJzKENoYW5nZSBjaGFuZ2UsIFBhdGNoU2V0IHBzLCBQYXRjaFNldEluZm8gaW5mbywKLSAgICAgIFNldDxBY2NvdW50LklkPiB3YW50UmV2aWV3ZXJzLCBTZXQ8QWNjb3VudC5JZD4gZXhpc3RpbmdSZXZpZXdlcnMpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBMaXN0PEFwcHJvdmFsVHlwZT4gYWxsVHlwZXMgPSBhcHByb3ZhbFR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKTsKKyAgcHVibGljIHZvaWQgYWRkUmV2aWV3ZXJzKFJldmlld0RiIGRiLCBMYWJlbFR5cGVzIGxhYmVsVHlwZXMsIENoYW5nZSBjaGFuZ2UsCisgICAgICBQYXRjaFNldCBwcywgUGF0Y2hTZXRJbmZvIGluZm8sIFNldDxJZD4gd2FudFJldmlld2VycywKKyAgICAgIFNldDxBY2NvdW50LklkPiBleGlzdGluZ1Jldmlld2VycykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgTGlzdDxMYWJlbFR5cGU+IGFsbFR5cGVzID0gbGFiZWxUeXBlcy5nZXRMYWJlbFR5cGVzKCk7CiAgICAgaWYgKGFsbFR5cGVzLmlzRW1wdHkoKSkgewogICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEzOCwxMCArMTIzLDEwIEBACiAgICAgbmVlZC5yZW1vdmVBbGwoZXhpc3RpbmdSZXZpZXdlcnMpOwogCiAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBjZWxscyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShuZWVkLnNpemUoKSk7Ci0gICAgQXBwcm92YWxDYXRlZ29yeS5JZCBjYXRJZCA9IGFsbFR5cGVzLmdldChhbGxUeXBlcy5zaXplKCkgLSAxKS5nZXRDYXRlZ29yeSgpLmdldElkKCk7CisgICAgTGFiZWxJZCBsYWJlbElkID0gSXRlcmFibGVzLmdldExhc3QoYWxsVHlwZXMpLmdldExhYmVsSWQoKTsKICAgICBmb3IgKEFjY291bnQuSWQgYWNjb3VudCA6IG5lZWQpIHsKICAgICAgIFBhdGNoU2V0QXBwcm92YWwgcHNhID0gbmV3IFBhdGNoU2V0QXBwcm92YWwoCi0gICAgICAgICAgbmV3IFBhdGNoU2V0QXBwcm92YWwuS2V5KHBzLmdldElkKCksIGFjY291bnQsIGNhdElkKSwKKyAgICAgICAgICBuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkocHMuZ2V0SWQoKSwgYWNjb3VudCwgbGFiZWxJZCksCiAgICAgICAgICAgKHNob3J0KSAwKTsKICAgICAgIHBzYS5jYWNoZShjaGFuZ2UpOwogICAgICAgY2VsbHMuYWRkKHBzYSk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0NoYW5nZVV0aWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQ2hhbmdlVXRpbC5qYXZhCmluZGV4IDUzNWFkOGUuLjk1NjlhOTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQ2hhbmdlVXRpbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQ2hhbmdlVXRpbC5qYXZhCkBAIC0xNCw0MSArMTQsNDEgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlLlN0YXR1czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUmV2SWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlRyYWNraW5nSWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlTWVzc2FnZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5UcmFja2luZ0Zvb3RlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlRyYWNraW5nRm9vdGVyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkNvbW1pdFJlY2VpdmVkRXZlbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV4dGVuc2lvbnMuZXZlbnRzLkdpdFJlZmVyZW5jZVVwZGF0ZWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1lcmdlT3A7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmViYXNlZFBhdGNoU2V0U2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlcGxhY2VQYXRjaFNldFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBseVRvQ2hhbmdlU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQudmFsaWRhdG9ycy5Db21taXRWYWxpZGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQudmFsaWRhdG9ycy5Db21taXRWYWxpZGF0b3JzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkNvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmV2ZXJ0ZWRTZW5kZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUmVmQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5JZEdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5NYWdpY0JyYW5jaDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQXRvbWljVXBkYXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1Db25jdXJyZW5jeUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOwpAQCAtNTYsMzEgKzU2LDI3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuTWVyZ2VTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlRocmVlV2F5TWVyZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJMaW5lOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkJhc2U2NDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQ2hhbmdlSWRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5OQjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiAKIHB1YmxpYyBjbGFzcyBDaGFuZ2VVdGlsIHsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2hhbmdlVXRpbC5jbGFzcyk7Ci0KKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHV1aWRMb2NrID0gbmV3IE9iamVjdCgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VFRCA9IDB4MjQxOGU2Zjk7CiAgIHByaXZhdGUgc3RhdGljIGludCB1dWlkUHJlZml4OwogICBwcml2YXRlIHN0YXRpYyBpbnQgdXVpZFNlcTsKIApAQCAtOTIsMjAgKzg4LDE5IEBACiAgICAqIEByZXR1cm4gdGhlIG5ldyB1bmlxdWUgaWRlbnRpZmllci4KICAgICogQHRocm93cyBPcm1FeGNlcHRpb24gdGhlIGRhdGFiYXNlIGNvdWxkbid0IGJlIGluY3JlbWVudGVkLgogICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWVzc2FnZVVVSUQoZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIGJ5dGVbXSByYXcgPSBuZXcgYnl0ZVs4XTsKLSAgICBmaWxsKHJhdywgZGIpOwotICAgIHJldHVybiBCYXNlNjQuZW5jb2RlQnl0ZXMocmF3KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGZpbGwoYnl0ZVtdIHJhdywgUmV2aWV3RGIgZGIpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBpZiAodXVpZFNlcSA9PSAwKSB7Ci0gICAgICB1dWlkUHJlZml4ID0gZGIubmV4dENoYW5nZU1lc3NhZ2VJZCgpOwotICAgICAgdXVpZFNlcSA9IEludGVnZXIuTUFYX1ZBTFVFOworICBwdWJsaWMgc3RhdGljIFN0cmluZyBtZXNzYWdlVVVJRChSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaW50IHAsIHM7CisgICAgc3luY2hyb25pemVkICh1dWlkTG9jaykgeworICAgICAgaWYgKHV1aWRTZXEgPT0gMCkgeworICAgICAgICB1dWlkUHJlZml4ID0gZGIubmV4dENoYW5nZU1lc3NhZ2VJZCgpOworICAgICAgICB1dWlkU2VxID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICB9CisgICAgICBwID0gdXVpZFByZWZpeDsKKyAgICAgIHMgPSB1dWlkU2VxLS07CiAgICAgfQotICAgIE5CLmVuY29kZUludDMyKHJhdywgMCwgdXVpZFByZWZpeCk7Ci0gICAgTkIuZW5jb2RlSW50MzIocmF3LCA0LCB1dWlkU2VxLS0pOworICAgIFN0cmluZyB1ID0gSWRHZW5lcmF0b3IuZm9ybWF0KElkR2VuZXJhdG9yLm1peChTRUVELCBwKSk7CisgICAgU3RyaW5nIGwgPSBJZEdlbmVyYXRvci5mb3JtYXQoSWRHZW5lcmF0b3IubWl4KHAsIHMpKTsKKyAgICByZXR1cm4gdSArICdfJyArIGw7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIHZvaWQgdG91Y2goZmluYWwgQ2hhbmdlIGNoYW5nZSwgUmV2aWV3RGIgZGIpCkBAIC0xNzYsNyArMTcxLDggQEAKICAgICBkYi50cmFja2luZ0lkcygpLmRlbGV0ZSh0b0RlbGV0ZSk7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdE1lcmdlKE1lcmdlT3AuRmFjdG9yeSBvcEZhY3RvcnksIENoYW5nZSBjaGFuZ2UpIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RNZXJnZShNZXJnZU9wLkZhY3Rvcnkgb3BGYWN0b3J5LCBDaGFuZ2UgY2hhbmdlKQorICAgICAgdGhyb3dzIE5vU3VjaFByb2plY3RFeGNlcHRpb24gewogICAgIG9wRmFjdG9yeS5jcmVhdGUoY2hhbmdlLmdldERlc3QoKSkudmVyaWZ5TWVyZ2VhYmlsaXR5KGNoYW5nZSk7CiAgIH0KIApAQCAtMTkzLDI5MCArMTg5LDIxIEBACiAgICAgZGIucGF0Y2hTZXRBbmNlc3RvcnMoKS5pbnNlcnQodG9JbnNlcnQpOwogICB9CiAKLSAgLyoqCi0gICAqIFJlYmFzZXMgYSBjb21taXQKLSAgICoKLSAgICogQHBhcmFtIGdpdCBSZXBvc2l0b3J5IHRvIGZpbmQgY29tbWl0cyBpbgotICAgKiBAcGFyYW0gaW5zZXJ0ZXIgaW5zZXJ0ZXIgdG8gaGFuZGxlIG5ldyB0cmVlcyBhbmQgYmxvYnMuCi0gICAqIEBwYXJhbSBvcmlnaW5hbCBUaGUgY29tbWl0IHRvIHJlYmFzZQotICAgKiBAcGFyYW0gYmFzZSBCYXNlIHRvIHJlYmFzZSBhZ2FpbnN0Ci0gICAqIEByZXR1cm4gQ29tbWl0QnVpbGRlciB0aGUgbmV3bHkgcmViYXNlZCBjb21taXQKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBNZXJnZWQgZmFpbGVkCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENvbW1pdEJ1aWxkZXIgcmViYXNlQ29tbWl0KFJlcG9zaXRvcnkgZ2l0LAotICAgICAgZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIFJldkNvbW1pdCBvcmlnaW5hbCwgUmV2Q29tbWl0IGJhc2UsCi0gICAgICBQZXJzb25JZGVudCBjb21taXR0ZXJJZGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgIGlmIChvcmlnaW5hbC5nZXRQYXJlbnRDb3VudCgpID09IDApIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAiQ29tbWl0cyB3aXRoIG5vIHBhcmVudHMgY2Fubm90IGJlIHJlYmFzZWQgKGlzIHRoaXMgdGhlIGluaXRpYWwgY29tbWl0PykuIik7Ci0gICAgfQotCi0gICAgaWYgKG9yaWdpbmFsLmdldFBhcmVudENvdW50KCkgPiAxKSB7Ci0gICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0gICAgICAgICAgIlBhdGNoIHNldHMgd2l0aCBtdWx0aXBsZSBwYXJlbnRzIGNhbm5vdCBiZSByZWJhc2VkIChtZXJnZSBjb21taXRzKS4iCi0gICAgICAgICAgICAgICsgIiBQYXJlbnRzOiAiICsgQXJyYXlzLnRvU3RyaW5nKG9yaWdpbmFsLmdldFBhcmVudHMoKSkpOwotICAgIH0KLQotICAgIGZpbmFsIFJldkNvbW1pdCBwYXJlbnRDb21taXQgPSBvcmlnaW5hbC5nZXRQYXJlbnQoMCk7Ci0KLSAgICBpZiAoYmFzZS5lcXVhbHMocGFyZW50Q29tbWl0KSkgewotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDaGFuZ2UgaXMgYWxyZWFkeSB1cCB0byBkYXRlLiIpOwotICAgIH0KLQotICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG1lcmdlciA9IE1lcmdlU3RyYXRlZ3kuUkVTT0xWRS5uZXdNZXJnZXIoZ2l0LCB0cnVlKTsKLSAgICBtZXJnZXIuc2V0T2JqZWN0SW5zZXJ0ZXIobmV3IE9iamVjdEluc2VydGVyLkZpbHRlcigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHJvdGVjdGVkIE9iamVjdEluc2VydGVyIGRlbGVnYXRlKCkgewotICAgICAgICByZXR1cm4gaW5zZXJ0ZXI7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBtZXJnZXIuc2V0QmFzZShwYXJlbnRDb21taXQpOwotICAgIG1lcmdlci5tZXJnZShvcmlnaW5hbCwgYmFzZSk7Ci0KLSAgICBpZiAobWVyZ2VyLmdldFJlc3VsdFRyZWVJZCgpID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAiVGhlIHJlYmFzZSBmYWlsZWQgc2luY2UgY29uZmxpY3RzIG9jY3VyZWQgZHVyaW5nIHRoZSBtZXJnZS4iKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBDb21taXRCdWlsZGVyIHJlYmFzZWRDb21taXRCdWlsZGVyID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKLQotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldFRyZWVJZChtZXJnZXIuZ2V0UmVzdWx0VHJlZUlkKCkpOwotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldFBhcmVudElkKGJhc2UpOwotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldEF1dGhvcihvcmlnaW5hbC5nZXRBdXRob3JJZGVudCgpKTsKLSAgICByZWJhc2VkQ29tbWl0QnVpbGRlci5zZXRNZXNzYWdlKG9yaWdpbmFsLmdldEZ1bGxNZXNzYWdlKCkpOwotICAgIHJlYmFzZWRDb21taXRCdWlsZGVyLnNldENvbW1pdHRlcihjb21taXR0ZXJJZGVudCk7Ci0KLSAgICByZXR1cm4gcmViYXNlZENvbW1pdEJ1aWxkZXI7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmViYXNlQ2hhbmdlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyLCBmaW5hbCBSZXZpZXdEYiBkYiwKLSAgICAgIFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5IHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3RvcnksCi0gICAgICBmaW5hbCBDaGFuZ2VIb29rUnVubmVyIGhvb2tzLCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwgUGVyc29uSWRlbnQgbXlJZGVudCwKLSAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwKLSAgICAgIEVtYWlsRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCi0gICAgICBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24gewotCi0gICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKLSAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2wgPQotICAgICAgICBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihjaGFuZ2VJZCk7Ci0KLSAgICBpZiAoIWNoYW5nZUNvbnRyb2wuY2FuUmViYXNlKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJDYW5ub3QgcmViYXNlOiBOZXcgcGF0Y2ggc2V0cyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgYWRkZWQgdG8gY2hhbmdlOiAiCi0gICAgICAgICAgICAgICsgY2hhbmdlSWQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgQ2hhbmdlIGNoYW5nZSA9IGNoYW5nZUNvbnRyb2wuZ2V0Q2hhbmdlKCk7Ci0gICAgZmluYWwgUmVwb3NpdG9yeSBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGNoYW5nZS5nZXRQcm9qZWN0KCkpOwotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBSZXZXYWxrIHJldldhbGsgPSBuZXcgUmV2V2FsayhnaXQpOwotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgUGF0Y2hTZXQgb3JpZ2luYWxQYXRjaFNldCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKLSAgICAgICAgUmV2Q29tbWl0IGJyYW5jaFRpcENvbW1pdCA9IG51bGw7Ci0KLSAgICAgICAgTGlzdDxQYXRjaFNldEFuY2VzdG9yPiBwYXRjaFNldEFuY2VzdG9ycyA9Ci0gICAgICAgICAgICBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmFuY2VzdG9yc09mKHBhdGNoU2V0SWQpLnRvTGlzdCgpOwotICAgICAgICBpZiAocGF0Y2hTZXRBbmNlc3RvcnMuc2l6ZSgpID4gMSkgewotICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlRoZSBwYXRjaCBzZXQgeW91IGFyZSB0cnlpbmcgdG8gcmViYXNlIGlzIGRlcGVuZGVudCBvbiBzZXZlcmFsIG90aGVyIHBhdGNoIHNldHM6ICIKLSAgICAgICAgICAgICAgICAgICsgcGF0Y2hTZXRBbmNlc3RvcnMudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhdGNoU2V0QW5jZXN0b3JzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgTGlzdDxQYXRjaFNldD4gZGVwUGF0Y2hTZXRMaXN0ID0gZGIucGF0Y2hTZXRzKCkKLSAgICAgICAgICAgICAgICAgIC5ieVJldmlzaW9uKHBhdGNoU2V0QW5jZXN0b3JzLmdldCgwKS5nZXRBbmNlc3RvclJldmlzaW9uKCkpCi0gICAgICAgICAgICAgICAgICAudG9MaXN0KCk7Ci0gICAgICAgICAgaWYgKCFkZXBQYXRjaFNldExpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBQYXRjaFNldCBkZXBQYXRjaFNldCA9IGRlcFBhdGNoU2V0TGlzdC5nZXQoMCk7Ci0KLSAgICAgICAgICAgIENoYW5nZS5JZCBkZXBDaGFuZ2VJZCA9IGRlcFBhdGNoU2V0LmdldElkKCkuZ2V0UGFyZW50S2V5KCk7Ci0gICAgICAgICAgICBDaGFuZ2UgZGVwQ2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChkZXBDaGFuZ2VJZCk7Ci0KLSAgICAgICAgICAgIGlmIChkZXBDaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLkFCQU5ET05FRCkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCByZWJhc2UgYWdhaW5zdCBhbiBhYmFuZG9uZWQgY2hhbmdlOiAiCi0gICAgICAgICAgICAgICAgICArIGRlcENoYW5nZS5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXBDaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgUGF0Y2hTZXQgbGF0ZXN0RGVwUGF0Y2hTZXQgPQotICAgICAgICAgICAgICAgICAgZGIucGF0Y2hTZXRzKCkuZ2V0KGRlcENoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgICAgICAgaWYgKCFkZXBQYXRjaFNldC5nZXRJZCgpLmVxdWFscyhkZXBDaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICBicmFuY2hUaXBDb21taXQgPQotICAgICAgICAgICAgICAgICAgICByZXZXYWxrLnBhcnNlQ29tbWl0KE9iamVjdElkCi0gICAgICAgICAgICAgICAgICAgICAgICAuZnJvbVN0cmluZyhsYXRlc3REZXBQYXRjaFNldC5nZXRSZXZpc2lvbigpLmdldCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2hhbmdlIGlzIGFscmVhZHkgYmFzZWQgb24gdGhlIGxhdGVzdCBwYXRjaCBzZXQgb2YgdGhlIGRlcGVuZGVudCBjaGFuZ2UuIik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYnJhbmNoVGlwQ29tbWl0ID09IG51bGwpIHsKLSAgICAgICAgICAvLyBXZSBhcmUgZGVwZW5kZW50IG9uIGEgbWVyZ2VkIFBhdGNoU2V0IG9yIGhhdmUgbm8gUGF0Y2hTZXQKLSAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgYXQgYWxsLgotICAgICAgICAgIFJlZiBkZXN0UmVmID0gZ2l0LmdldFJlZihjaGFuZ2UuZ2V0RGVzdCgpLmdldCgpKTsKLSAgICAgICAgICBpZiAoZGVzdFJlZiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlRoZSBkZXN0aW5hdGlvbiBicmFuY2ggZG9lcyBub3QgZXhpc3Q6ICIKLSAgICAgICAgICAgICAgICAgICAgKyBjaGFuZ2UuZ2V0RGVzdCgpLmdldCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJhbmNoVGlwQ29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChkZXN0UmVmLmdldE9iamVjdElkKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgUmV2Q29tbWl0IHJlYmFzZWRDb21taXQ7Ci0gICAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIG9pID0gZ2l0Lm5ld09iamVjdEluc2VydGVyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgT2JqZWN0SWQgb2xkSWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKG9yaWdpbmFsUGF0Y2hTZXQuZ2V0UmV2aXNpb24oKS5nZXQoKSk7Ci0gICAgICAgICAgT2JqZWN0SWQgbmV3SWQgPSBvaS5pbnNlcnQocmViYXNlQ29tbWl0KAotICAgICAgICAgICAgICBnaXQsIG9pLCByZXZXYWxrLnBhcnNlQ29tbWl0KG9sZElkKSwgYnJhbmNoVGlwQ29tbWl0LCBteUlkZW50KSk7Ci0gICAgICAgICAgb2kuZmx1c2goKTsKLSAgICAgICAgICByZWJhc2VkQ29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChuZXdJZCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgb2kucmVsZWFzZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2hhbmdlLm5leHRQYXRjaFNldElkKCk7Ci0gICAgICAgIGZpbmFsIFBhdGNoU2V0IG5ld1BhdGNoU2V0ID0gbmV3IFBhdGNoU2V0KGNoYW5nZS5jdXJyUGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgbmV3UGF0Y2hTZXQuc2V0Q3JlYXRlZE9uKG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLSAgICAgICAgbmV3UGF0Y2hTZXQuc2V0VXBsb2FkZXIodXNlci5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICAgIG5ld1BhdGNoU2V0LnNldFJldmlzaW9uKG5ldyBSZXZJZChyZWJhc2VkQ29tbWl0Lm5hbWUoKSkpOwotICAgICAgICBuZXdQYXRjaFNldC5zZXREcmFmdChvcmlnaW5hbFBhdGNoU2V0LmlzRHJhZnQoKSk7Ci0KLSAgICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvIGluZm8gPQotICAgICAgICAgICAgcGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQocmViYXNlZENvbW1pdCwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSk7Ci0KLSAgICAgICAgUmVmVXBkYXRlIHJ1ID0gZ2l0LnVwZGF0ZVJlZihuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCkpOwotICAgICAgICBydS5zZXRFeHBlY3RlZE9sZE9iamVjdElkKE9iamVjdElkLnplcm9JZCgpKTsKLSAgICAgICAgcnUuc2V0TmV3T2JqZWN0SWQocmViYXNlZENvbW1pdCk7Ci0gICAgICAgIHJ1LmRpc2FibGVSZWZMb2coKTsKLSAgICAgICAgaWYgKHJ1LnVwZGF0ZShyZXZXYWxrKSAhPSBSZWZVcGRhdGUuUmVzdWx0Lk5FVykgewotICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZWYgJXMgaW4gJXM6ICVzIiwgbmV3UGF0Y2hTZXQuZ2V0UmVmTmFtZSgpLAotICAgICAgICAgICAgICBjaGFuZ2UuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpLmdldCgpLCBydS5nZXRSZXN1bHQoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJlcGxpY2F0aW9uLmZpcmUoY2hhbmdlLmdldFByb2plY3QoKSwgcnUuZ2V0TmFtZSgpKTsKLQotICAgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gb2xkUmV2aWV3ZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7Ci0gICAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBvbGRDQyA9IFNldHMubmV3SGFzaFNldCgpOwotICAgICAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihjaGFuZ2UuZ2V0SWQoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgQ2hhbmdlIHVwZGF0ZWRDaGFuZ2U7Ci0KLSAgICAgICAgICB1cGRhdGVkQ2hhbmdlID0gZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2VJZCwKLSAgICAgICAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnVwZGF0ZU51bWJlck9mUGF0Y2hTZXRzKG5ld1BhdGNoU2V0LmdldFBhdGNoU2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotICAgICAgICAgIGlmICh1cGRhdGVkQ2hhbmdlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoYW5nZSA9IHVwZGF0ZWRDaGFuZ2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkNoYW5nZSAlcyBpcyBjbG9zZWQiLCBjaGFuZ2UuZ2V0SWQoKSkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGluc2VydEFuY2VzdG9ycyhkYiwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSwgcmViYXNlZENvbW1pdCk7Ci0gICAgICAgICAgZGIucGF0Y2hTZXRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXdQYXRjaFNldCkpOwotICAgICAgICAgIHVwZGF0ZWRDaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKGNoYW5nZUlkLAotICAgICAgICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMocGF0Y2hTZXRJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpICE9IENoYW5nZS5TdGF0dXMuRFJBRlQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLk5FVyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFNoYTFNZXJnZVRlc3RlZChudWxsKTsKLSAgICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRDdXJyZW50UGF0Y2hTZXQoaW5mbyk7Ci0gICAgICAgICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICBpZiAodXBkYXRlZENoYW5nZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaGFuZ2UgPSB1cGRhdGVkQ2hhbmdlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJDaGFuZ2UgJXMgd2FzIG1vZGlmaWVkIiwgY2hhbmdlLmdldElkKCkpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFsc1V0aWwuY29weVZldG9zVG9MYXRlc3RQYXRjaFNldChjaGFuZ2UpKSB7Ci0gICAgICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpICE9IDApIHsKLSAgICAgICAgICAgICAgb2xkUmV2aWV3ZXJzLmFkZChhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG9sZENDLmFkZChhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGNtc2cgPQotICAgICAgICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZShuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoY2hhbmdlSWQsCi0gICAgICAgICAgICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksIHVzZXIuZ2V0QWNjb3VudElkKCksIHBhdGNoU2V0SWQpOwotICAgICAgICAgIGNtc2cuc2V0TWVzc2FnZSgiUGF0Y2ggU2V0ICIgKyBwYXRjaFNldElkLmdldCgpICsgIjogUmViYXNlZCIpOwotICAgICAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjbXNnKSk7Ci0gICAgICAgICAgZGIuY29tbWl0KCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgZGIucm9sbGJhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFJlcGxhY2VQYXRjaFNldFNlbmRlciBjbSA9Ci0gICAgICAgICAgICByZWJhc2VkUGF0Y2hTZXRTZW5kZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2UpOwotICAgICAgICBjbS5zZXRGcm9tKHVzZXIuZ2V0QWNjb3VudElkKCkpOwotICAgICAgICBjbS5zZXRQYXRjaFNldChuZXdQYXRjaFNldCk7Ci0gICAgICAgIGNtLmFkZFJldmlld2VycyhvbGRSZXZpZXdlcnMpOwotICAgICAgICBjbS5hZGRFeHRyYUNDKG9sZENDKTsKLSAgICAgICAgY20uc2VuZCgpOwotCi0gICAgICAgIGhvb2tzLmRvUGF0Y2hzZXRDcmVhdGVkSG9vayhjaGFuZ2UsIG5ld1BhdGNoU2V0LCBkYik7Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICByZXZXYWxrLnJlbGVhc2UoKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgZ2l0LmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBDaGFuZ2UuSWQgcmV2ZXJ0KGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgUmV2aWV3RGIgZGIsCi0gICAgICBmaW5hbCBSZXZlcnRlZFNlbmRlci5GYWN0b3J5IHJldmVydGVkU2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAotICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwgUGVyc29uSWRlbnQgbXlJZGVudCkKLSAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCi0gICAgICBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgIHB1YmxpYyBzdGF0aWMgQ2hhbmdlLklkIHJldmVydChSZWZDb250cm9sIHJlZkNvbnRyb2wsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCisgICAgICBJZGVudGlmaWVkVXNlciB1c2VyLCBDb21taXRWYWxpZGF0b3JzIGNvbW1pdFZhbGlkYXRvcnMsIFN0cmluZyBtZXNzYWdlLAorICAgICAgUmV2aWV3RGIgZGIsIFJldmVydGVkU2VuZGVyLkZhY3RvcnkgcmV2ZXJ0ZWRTZW5kZXJGYWN0b3J5LAorICAgICAgQ2hhbmdlSG9va3MgaG9va3MsIFJlcG9zaXRvcnkgZ2l0LAorICAgICAgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgU3RyaW5nIGNhbm9uaWNhbFdlYlVybCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgRW1haWxFeGNlcHRpb24sCisgICAgICBPcm1FeGNlcHRpb24sIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCisgICAgICBJT0V4Y2VwdGlvbiwgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CiAgICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKICAgICBmaW5hbCBQYXRjaFNldCBwYXRjaCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKICAgICBpZiAocGF0Y2ggPT0gbnVsbCkgewogICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7CiAgICAgfQotCi0gICAgZmluYWwgUmVwb3NpdG9yeSBnaXQ7Ci0gICAgdHJ5IHsKLSAgICAgIGdpdCA9IGdpdE1hbmFnZXIub3BlblJlcG9zaXRvcnkoZGIuY2hhbmdlcygpLmdldChjaGFuZ2VJZCkuZ2V0UHJvamVjdCgpKTsKLSAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCwgZSk7Ci0gICAgfQorICAgIGZpbmFsIENoYW5nZSBjaGFuZ2VUb1JldmVydCA9IGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpOwogCiAgICAgZmluYWwgUmV2V2FsayByZXZXYWxrID0gbmV3IFJldldhbGsoZ2l0KTsKICAgICB0cnkgewpAQCAtNDk1LDYgKzIyMiwxMiBAQAogICAgICAgcmV2ZXJ0Q29tbWl0QnVpbGRlci5zZXRBdXRob3IoYXV0aG9ySWRlbnQpOwogICAgICAgcmV2ZXJ0Q29tbWl0QnVpbGRlci5zZXRDb21taXR0ZXIobXlJZGVudCk7CiAKKyAgICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKKyAgICAgICAgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgICAgQ2hhbmdlTWVzc2FnZXMuZ2V0KCkucmV2ZXJ0Q2hhbmdlRGVmYXVsdE1lc3NhZ2UsCisgICAgICAgICAgICBjaGFuZ2VUb1JldmVydC5nZXRTdWJqZWN0KCksIHBhdGNoLmdldFJldmlzaW9uKCkuZ2V0KCkpOworICAgICAgfQorCiAgICAgICBmaW5hbCBPYmplY3RJZCBjb21wdXRlZENoYW5nZUlkID0KICAgICAgICAgICBDaGFuZ2VJZFV0aWwuY29tcHV0ZUNoYW5nZUlkKHBhcmVudFRvQ29tbWl0VG9SZXZlcnQuZ2V0VHJlZSgpLAogICAgICAgICAgICAgICBjb21taXRUb1JldmVydCwgYXV0aG9ySWRlbnQsIG15SWRlbnQsIG1lc3NhZ2UpOwpAQCAtNTE0LDE0ICsyNDcsMzEgQEAKICAgICAgICAgICBuZXcgQ2hhbmdlLktleSgiSSIgKyBjb21wdXRlZENoYW5nZUlkLm5hbWUoKSksCiAgICAgICAgICAgbmV3IENoYW5nZS5JZChkYi5uZXh0Q2hhbmdlSWQoKSksCiAgICAgICAgICAgdXNlci5nZXRBY2NvdW50SWQoKSwKLSAgICAgICAgICBkYi5jaGFuZ2VzKCkuZ2V0KGNoYW5nZUlkKS5nZXREZXN0KCkpOwotICAgICAgY2hhbmdlLm5leHRQYXRjaFNldElkKCk7CisgICAgICAgICAgY2hhbmdlVG9SZXZlcnQuZ2V0RGVzdCgpKTsKKyAgICAgIGNoYW5nZS5zZXRUb3BpYyhjaGFuZ2VUb1JldmVydC5nZXRUb3BpYygpKTsKIAotICAgICAgZmluYWwgUGF0Y2hTZXQgcHMgPSBuZXcgUGF0Y2hTZXQoY2hhbmdlLmN1cnJQYXRjaFNldElkKCkpOworICAgICAgUGF0Y2hTZXQuSWQgaWQgPQorICAgICAgICAgIG5ldyBQYXRjaFNldC5JZChjaGFuZ2UuZ2V0SWQoKSwgQ2hhbmdlLklOSVRJQUxfUEFUQ0hfU0VUX0lEKTsKKyAgICAgIGZpbmFsIFBhdGNoU2V0IHBzID0gbmV3IFBhdGNoU2V0KGlkKTsKICAgICAgIHBzLnNldENyZWF0ZWRPbihjaGFuZ2UuZ2V0Q3JlYXRlZE9uKCkpOwogICAgICAgcHMuc2V0VXBsb2FkZXIoY2hhbmdlLmdldE93bmVyKCkpOwogICAgICAgcHMuc2V0UmV2aXNpb24obmV3IFJldklkKHJldmVydENvbW1pdC5uYW1lKCkpKTsKIAorICAgICAgU3RyaW5nIHJlZiA9IHJlZkNvbnRyb2wuZ2V0UmVmTmFtZSgpOworICAgICAgZmluYWwgU3RyaW5nIGNtZFJlZiA9CisgICAgICAgICAgTWFnaWNCcmFuY2guTkVXX1BVQkxJU0hfQ0hBTkdFCisgICAgICAgICAgICAgICsgcmVmLnN1YnN0cmluZyhyZWYubGFzdEluZGV4T2YoIi8iKSArIDEpOworICAgICAgQ29tbWl0UmVjZWl2ZWRFdmVudCBjb21taXRSZWNlaXZlZEV2ZW50ID0KKyAgICAgICAgICBuZXcgQ29tbWl0UmVjZWl2ZWRFdmVudChuZXcgUmVjZWl2ZUNvbW1hbmQoT2JqZWN0SWQuemVyb0lkKCksCisgICAgICAgICAgICAgIHJldmVydENvbW1pdC5nZXRJZCgpLCBjbWRSZWYpLCByZWZDb250cm9sLmdldFByb2plY3RDb250cm9sKCkKKyAgICAgICAgICAgICAgLmdldFByb2plY3QoKSwgcmVmQ29udHJvbC5nZXRSZWZOYW1lKCksIHJldmVydENvbW1pdCwgdXNlcik7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbW1pdFZhbGlkYXRvcnMudmFsaWRhdGVGb3JHZXJyaXRDb21taXRzKGNvbW1pdFJlY2VpdmVkRXZlbnQpOworICAgICAgfSBjYXRjaCAoQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0KKwogICAgICAgY2hhbmdlLnNldEN1cnJlbnRQYXRjaFNldChwYXRjaFNldEluZm9GYWN0b3J5LmdldChyZXZlcnRDb21taXQsIHBzLmdldElkKCkpKTsKICAgICAgIENoYW5nZVV0aWwudXBkYXRlZChjaGFuZ2UpOwogCkBAIC01MzQsNyArMjg0LDcgQEAKICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHJlZiAlcyBpbiAlczogJXMiLCBwcy5nZXRSZWZOYW1lKCksCiAgICAgICAgICAgICBjaGFuZ2UuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpLmdldCgpLCBydS5nZXRSZXN1bHQoKSkpOwogICAgICAgfQotICAgICAgcmVwbGljYXRpb24uZmlyZShjaGFuZ2UuZ2V0UHJvamVjdCgpLCBydS5nZXROYW1lKCkpOworICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGNoYW5nZS5nZXRQcm9qZWN0KCksIHJ1KTsKIAogICAgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOwogICAgICAgdHJ5IHsKQEAgLTU2NywxMyArMzE3LDE2NyBAQAogICAgICAgcmV0dXJuIGNoYW5nZS5nZXRJZCgpOwogICAgIH0gZmluYWxseSB7CiAgICAgICByZXZXYWxrLnJlbGVhc2UoKTsKLSAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgQ2hhbmdlLklkIGVkaXRDb21taXRNZXNzYWdlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCisgICAgICBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2wsIENvbW1pdFZhbGlkYXRvcnMgY29tbWl0VmFsaWRhdG9ycywKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIsIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBSZXZpZXdEYiBkYiwKKyAgICAgIGZpbmFsIENvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIuRmFjdG9yeSBjb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyRmFjdG9yeSwKKyAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLCBSZXBvc2l0b3J5IGdpdCwKKyAgICAgIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwgUGVyc29uSWRlbnQgbXlJZGVudCwKKyAgICAgIGZpbmFsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbCwgZmluYWwgVHJhY2tpbmdGb290ZXJzIHRyYWNraW5nRm9vdGVycykKKyAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIEVtYWlsRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKKyAgICBmaW5hbCBQYXRjaFNldCBvcmlnaW5hbFBTID0gZGIucGF0Y2hTZXRzKCkuZ2V0KHBhdGNoU2V0SWQpOworICAgIGlmIChvcmlnaW5hbFBTID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOworICAgIH0KKworICAgIGlmIChtZXNzYWdlID09IG51bGwgfHwgbWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGNvbW1pdCBtZXNzYWdlIGNhbm5vdCBiZSBlbXB0eSIpOworICAgIH0KKworICAgIGZpbmFsIFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGdpdCk7CisgICAgdHJ5IHsKKyAgICAgIFJldkNvbW1pdCBjb21taXQgPQorICAgICAgICAgIHJldldhbGsucGFyc2VDb21taXQoT2JqZWN0SWQuZnJvbVN0cmluZyhvcmlnaW5hbFBTLmdldFJldmlzaW9uKCkuZ2V0KCkpKTsKKyAgICAgIGlmIChjb21taXQuZ2V0RnVsbE1lc3NhZ2UoKS5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oIk5ldyBjb21taXQgbWVzc2FnZSBjYW5ub3QgYmUgc2FtZSBhcyBleGlzdGluZyBjb21taXQgbWVzc2FnZSIpOworICAgICAgfQorCisgICAgICBEYXRlIG5vdyA9IG15SWRlbnQuZ2V0V2hlbigpOworICAgICAgQ2hhbmdlIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpOworICAgICAgUGVyc29uSWRlbnQgYXV0aG9ySWRlbnQgPQorICAgICAgICAgIHVzZXIubmV3Q29tbWl0dGVySWRlbnQobm93LCBteUlkZW50LmdldFRpbWVab25lKCkpOworCisgICAgICBDb21taXRCdWlsZGVyIGNvbW1pdEJ1aWxkZXIgPSBuZXcgQ29tbWl0QnVpbGRlcigpOworICAgICAgY29tbWl0QnVpbGRlci5zZXRUcmVlSWQoY29tbWl0LmdldFRyZWUoKSk7CisgICAgICBjb21taXRCdWlsZGVyLnNldFBhcmVudElkcyhjb21taXQuZ2V0UGFyZW50cygpKTsKKyAgICAgIGNvbW1pdEJ1aWxkZXIuc2V0QXV0aG9yKGNvbW1pdC5nZXRBdXRob3JJZGVudCgpKTsKKyAgICAgIGNvbW1pdEJ1aWxkZXIuc2V0Q29tbWl0dGVyKGF1dGhvcklkZW50KTsKKyAgICAgIGNvbW1pdEJ1aWxkZXIuc2V0TWVzc2FnZShtZXNzYWdlKTsKKworICAgICAgUmV2Q29tbWl0IG5ld0NvbW1pdDsKKyAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIG9pID0gZ2l0Lm5ld09iamVjdEluc2VydGVyKCk7CisgICAgICB0cnkgeworICAgICAgICBPYmplY3RJZCBpZCA9IG9pLmluc2VydChjb21taXRCdWlsZGVyKTsKKyAgICAgICAgb2kuZmx1c2goKTsKKyAgICAgICAgbmV3Q29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChpZCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBvaS5yZWxlYXNlKCk7CisgICAgICB9CisKKyAgICAgIFBhdGNoU2V0LklkIGlkID0gbmV4dFBhdGNoU2V0SWQoZ2l0LCBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgICBmaW5hbCBQYXRjaFNldCBuZXdQYXRjaFNldCA9IG5ldyBQYXRjaFNldChpZCk7CisgICAgICBuZXdQYXRjaFNldC5zZXRDcmVhdGVkT24obmV3IFRpbWVzdGFtcChub3cuZ2V0VGltZSgpKSk7CisgICAgICBuZXdQYXRjaFNldC5zZXRVcGxvYWRlcih1c2VyLmdldEFjY291bnRJZCgpKTsKKyAgICAgIG5ld1BhdGNoU2V0LnNldFJldmlzaW9uKG5ldyBSZXZJZChuZXdDb21taXQubmFtZSgpKSk7CisgICAgICBuZXdQYXRjaFNldC5zZXREcmFmdChvcmlnaW5hbFBTLmlzRHJhZnQoKSk7CisKKyAgICAgIGZpbmFsIFBhdGNoU2V0SW5mbyBpbmZvID0KKyAgICAgICAgICBwYXRjaFNldEluZm9GYWN0b3J5LmdldChuZXdDb21taXQsIG5ld1BhdGNoU2V0LmdldElkKCkpOworCisgICAgICBmaW5hbCBTdHJpbmcgcmVmTmFtZSA9IG5ld1BhdGNoU2V0LmdldFJlZk5hbWUoKTsKKyAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgY29tbWl0UmVjZWl2ZWRFdmVudCA9CisgICAgICAgICAgbmV3IENvbW1pdFJlY2VpdmVkRXZlbnQobmV3IFJlY2VpdmVDb21tYW5kKE9iamVjdElkLnplcm9JZCgpLAorICAgICAgICAgICAgICBuZXdDb21taXQuZ2V0SWQoKSwgcmVmTmFtZS5zdWJzdHJpbmcoMCwKKyAgICAgICAgICAgICAgICAgIHJlZk5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEpICsgIm5ldyIpLCByZWZDb250cm9sCisgICAgICAgICAgICAgIC5nZXRQcm9qZWN0Q29udHJvbCgpLmdldFByb2plY3QoKSwgcmVmQ29udHJvbC5nZXRSZWZOYW1lKCksCisgICAgICAgICAgICAgIG5ld0NvbW1pdCwgdXNlcik7CisKKyAgICAgIHRyeSB7CisgICAgICAgIGNvbW1pdFZhbGlkYXRvcnMudmFsaWRhdGVGb3JSZWNlaXZlQ29tbWl0cyhjb21taXRSZWNlaXZlZEV2ZW50KTsKKyAgICAgIH0gY2F0Y2ggKENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9CisKKyAgICAgIGZpbmFsIFJlZlVwZGF0ZSBydSA9IGdpdC51cGRhdGVSZWYobmV3UGF0Y2hTZXQuZ2V0UmVmTmFtZSgpKTsKKyAgICAgIHJ1LnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoT2JqZWN0SWQuemVyb0lkKCkpOworICAgICAgcnUuc2V0TmV3T2JqZWN0SWQobmV3Q29tbWl0KTsKKyAgICAgIHJ1LmRpc2FibGVSZWZMb2coKTsKKyAgICAgIGlmIChydS51cGRhdGUocmV2V2FsaykgIT0gUmVmVXBkYXRlLlJlc3VsdC5ORVcpIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZWYgJXMgaW4gJXM6ICVzIiwgbmV3UGF0Y2hTZXQuZ2V0UmVmTmFtZSgpLAorICAgICAgICAgICAgY2hhbmdlLmdldERlc3QoKS5nZXRQYXJlbnRLZXkoKS5nZXQoKSwgcnUuZ2V0UmVzdWx0KCkpKTsKKyAgICAgIH0KKyAgICAgIGdpdFJlZlVwZGF0ZWQuZmlyZShjaGFuZ2UuZ2V0UHJvamVjdCgpLCBydSk7CisKKyAgICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZS5nZXRJZCgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIENoYW5nZSB1cGRhdGVkQ2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChjaGFuZ2UuZ2V0SWQoKSk7CisgICAgICAgIGlmICh1cGRhdGVkQ2hhbmdlICE9IG51bGwgJiYgdXBkYXRlZENoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSkgeworICAgICAgICAgIGNoYW5nZSA9IHVwZGF0ZWRDaGFuZ2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgIkNoYW5nZSAlcyBpcyBjbG9zZWQiLCBjaGFuZ2UuZ2V0SWQoKSkpOworICAgICAgICB9CisKKyAgICAgICAgQ2hhbmdlVXRpbC5pbnNlcnRBbmNlc3RvcnMoZGIsIG5ld1BhdGNoU2V0LmdldElkKCksIGNvbW1pdCk7CisgICAgICAgIGRiLnBhdGNoU2V0cygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3UGF0Y2hTZXQpKTsKKyAgICAgICAgdXBkYXRlZENoYW5nZSA9CisgICAgICAgICAgICBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKGNoYW5nZS5nZXRJZCgpLCBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7CisgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMocGF0Y2hTZXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpICE9IENoYW5nZS5TdGF0dXMuRFJBRlQpIHsKKyAgICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5ORVcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFNoYTFNZXJnZVRlc3RlZChudWxsKTsKKyAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0Q3VycmVudFBhdGNoU2V0KGluZm8pOworICAgICAgICAgICAgICAgIENoYW5nZVV0aWwudXBkYXRlZChjaGFuZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAodXBkYXRlZENoYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgY2hhbmdlID0gdXBkYXRlZENoYW5nZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiQ2hhbmdlICVzIHdhcyBtb2RpZmllZCIsIGNoYW5nZS5nZXRJZCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBhcHByb3ZhbHNVdGlsLmNvcHlWZXRvc1RvUGF0Y2hTZXQoZGIsCisgICAgICAgICAgICByZWZDb250cm9sLmdldFByb2plY3RDb250cm9sKCkuZ2V0TGFiZWxUeXBlcygpLAorICAgICAgICAgICAgY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworCisgICAgICAgIGZpbmFsIExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVyTGluZXMgPSBuZXdDb21taXQuZ2V0Rm9vdGVyTGluZXMoKTsKKyAgICAgICAgdXBkYXRlVHJhY2tpbmdJZHMoZGIsIGNoYW5nZSwgdHJhY2tpbmdGb290ZXJzLCBmb290ZXJMaW5lcyk7CisKKyAgICAgICAgZmluYWwgQ2hhbmdlTWVzc2FnZSBjbXNnID0KKyAgICAgICAgICAgIG5ldyBDaGFuZ2VNZXNzYWdlKG5ldyBDaGFuZ2VNZXNzYWdlLktleShjaGFuZ2VJZCwKKyAgICAgICAgICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksIHVzZXIuZ2V0QWNjb3VudElkKCksIHBhdGNoU2V0SWQpOworICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIlBhdGNoIFNldCAiICsgbmV3UGF0Y2hTZXQuZ2V0UGF0Y2hTZXRJZCgpICsgIjogQ29tbWl0IG1lc3NhZ2Ugd2FzIHVwZGF0ZWQiOworICAgICAgICBjbXNnLnNldE1lc3NhZ2UobXNnKTsKKyAgICAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNtc2cpKTsKKyAgICAgICAgZGIuY29tbWl0KCk7CisKKyAgICAgICAgZmluYWwgQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlciBjbSA9IGNvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2UpOworICAgICAgICBjbS5zZXRGcm9tKHVzZXIuZ2V0QWNjb3VudElkKCkpOworICAgICAgICBjbS5zZXRDaGFuZ2VNZXNzYWdlKGNtc2cpOworICAgICAgICBjbS5zZW5kKCk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBkYi5yb2xsYmFjaygpOworICAgICAgfQorCisgICAgICBob29rcy5kb1BhdGNoc2V0Q3JlYXRlZEhvb2soY2hhbmdlLCBuZXdQYXRjaFNldCwgZGIpOworCisgICAgICByZXR1cm4gY2hhbmdlLmdldElkKCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJldldhbGsucmVsZWFzZSgpOwogICAgIH0KICAgfQogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEcmFmdENoYW5nZShmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAogICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlciwKLSAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sIGZpbmFsIFJldmlld0RiIGRiKQorICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLCBmaW5hbCBSZXZpZXdEYiBkYikKICAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZCA9IHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCk7CiAgICAgZmluYWwgQ2hhbmdlIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQoY2hhbmdlSWQpOwpAQCAtNTgzLDcgKzQ4Nyw3IEBACiAKICAgICBmb3IgKFBhdGNoU2V0IHBzIDogZGIucGF0Y2hTZXRzKCkuYnlDaGFuZ2UoY2hhbmdlSWQpKSB7CiAgICAgICAvLyBUaGVzZSBzaG91bGQgYWxsIGJlIGRyYWZ0IHBhdGNoIHNldHMuCi0gICAgICBkZWxldGVPbmx5RHJhZnRQYXRjaFNldChwcywgY2hhbmdlLCBnaXRNYW5hZ2VyLCByZXBsaWNhdGlvbiwgZGIpOworICAgICAgZGVsZXRlT25seURyYWZ0UGF0Y2hTZXQocHMsIGNoYW5nZSwgZ2l0TWFuYWdlciwgZ2l0UmVmVXBkYXRlZCwgZGIpOwogICAgIH0KIAogICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuZGVsZXRlKGRiLmNoYW5nZU1lc3NhZ2VzKCkuYnlDaGFuZ2UoY2hhbmdlSWQpKTsKQEAgLTU5NCw3ICs0OTgsNyBAQAogCiAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVPbmx5RHJhZnRQYXRjaFNldChmaW5hbCBQYXRjaFNldCBwYXRjaCwKICAgICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXIsCi0gICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uLCBmaW5hbCBSZXZpZXdEYiBkYikKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwgZmluYWwgUmV2aWV3RGIgZGIpCiAgICAgICB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkID0gcGF0Y2guZ2V0SWQoKTsKICAgICBpZiAocGF0Y2ggPT0gbnVsbCB8fCAhcGF0Y2guaXNEcmFmdCgpKSB7CkBAIC02MTcsNyArNTIxLDcgQEAKICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBkZWxldGUgcmVmICIgKyBwYXRjaC5nZXRSZWZOYW1lKCkgKwogICAgICAgICAgICAgICAiIGluICIgKyByZXBvLmdldERpcmVjdG9yeSgpICsgIjogIiArIHVwZGF0ZS5nZXRSZXN1bHQoKSk7CiAgICAgICB9Ci0gICAgICByZXBsaWNhdGlvbi5maXJlKGNoYW5nZS5nZXRQcm9qZWN0KCksIHVwZGF0ZS5nZXROYW1lKCkpOworICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGNoYW5nZS5nZXRQcm9qZWN0KCksIHVwZGF0ZSk7CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIHJlcG8uY2xvc2UoKTsKICAgICB9CkBAIC02MzEsMjUgKzUzNSw2IEBACiAgICAgZGIucGF0Y2hTZXRzKCkuZGVsZXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihwYXRjaCkpOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFJlcGx5VG9DaGFuZ2VTZW5kZXI+IHZvaWQgdXBkYXRlZENoYW5nZSgKLSAgICAgIGZpbmFsIFJldmlld0RiIGRiLCBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyLCBmaW5hbCBDaGFuZ2UgY2hhbmdlLAotICAgICAgZmluYWwgQ2hhbmdlTWVzc2FnZSBjbXNnLCBSZXBseVRvQ2hhbmdlU2VuZGVyLkZhY3Rvcnk8VD4gc2VuZGVyRmFjdG9yeSkKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjbXNnKSk7Ci0KLSAgICBuZXcgQXBwcm92YWxzVXRpbChkYiwgbnVsbCkuc3luY0NoYW5nZVN0YXR1cyhjaGFuZ2UpOwotCi0gICAgLy8gRW1haWwgdGhlIHJldmlld2VycwotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBSZXBseVRvQ2hhbmdlU2VuZGVyIGNtID0gc2VuZGVyRmFjdG9yeS5jcmVhdGUoY2hhbmdlKTsKLSAgICAgIGNtLnNldEZyb20odXNlci5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICBjbS5zZXRDaGFuZ2VNZXNzYWdlKGNtc2cpOwotICAgICAgY20uc2VuZCgpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBsb2cuZXJyb3IoIkNhbm5vdCBlbWFpbCB1cGRhdGUgZm9yIGNoYW5nZSAiICsgY2hhbmdlLmdldENoYW5nZUlkKCksIGUpOwotICAgIH0KLSAgfQotCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNvcnRLZXkobG9uZyBsYXN0VXBkYXRlZCwgaW50IGlkKXsKICAgICAvLyBUaGUgZW5jb2RpbmcgdXNlcyBtaW51dGVzIHNpbmNlIFdlZCBPY3QgMSAwMDowMDowMCAyMDA4IFVUQy4KICAgICAvLyBXZSBvdmVycnVuIGFwcHJveGltYXRlbHkgNCwwODUgeWVhcnMgbGF0ZXIsIHNvIH42MDkzLgpAQCAtNjY4LDYgKzU1MywyMyBAQAogICAgIGMuc2V0U29ydEtleShzb3J0S2V5KGxhc3RVcGRhdGVkLCBpZCkpOwogICB9CiAKKyAgcHVibGljIHN0YXRpYyBQYXRjaFNldC5JZCBuZXh0UGF0Y2hTZXRJZChNYXA8U3RyaW5nLCBSZWY+IGFsbFJlZnMsCisgICAgICBQYXRjaFNldC5JZCBpZCkgeworICAgIFBhdGNoU2V0LklkIG5leHQgPSBuZXh0UGF0Y2hTZXRJZChpZCk7CisgICAgd2hpbGUgKGFsbFJlZnMuY29udGFpbnNLZXkobmV4dC50b1JlZk5hbWUoKSkpIHsKKyAgICAgIG5leHQgPSBuZXh0UGF0Y2hTZXRJZChuZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIG5leHQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFBhdGNoU2V0LklkIG5leHRQYXRjaFNldElkKFJlcG9zaXRvcnkgZ2l0LCBQYXRjaFNldC5JZCBpZCkgeworICAgIHJldHVybiBuZXh0UGF0Y2hTZXRJZChnaXQuZ2V0QWxsUmVmcygpLCBpZCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBQYXRjaFNldC5JZCBuZXh0UGF0Y2hTZXRJZChQYXRjaFNldC5JZCBpZCkgeworICAgIHJldHVybiBuZXcgUGF0Y2hTZXQuSWQoaWQuZ2V0UGFyZW50S2V5KCksIGlkLmdldCgpICsgMSk7CisgIH0KKwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9CiAgICAgICB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAvLwogICAgICAgICAgICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZid9OwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9DdXJyZW50VXNlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9DdXJyZW50VXNlci5qYXZhCmluZGV4IGYwNTdjM2EuLjg2YTZlZjggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvQ3VycmVudFVzZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0N1cnJlbnRVc2VyLmphdmEKQEAgLTMzLDE1ICszMywxMiBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ3VycmVudFVzZXIgewogICBwcml2YXRlIGZpbmFsIENhcGFiaWxpdHlDb250cm9sLkZhY3RvcnkgY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIEFjY2Vzc1BhdGggYWNjZXNzUGF0aDsKKyAgcHJpdmF0ZSBBY2Nlc3NQYXRoIGFjY2Vzc1BhdGggPSBBY2Nlc3NQYXRoLlVOS05PV047CiAKICAgcHJpdmF0ZSBDYXBhYmlsaXR5Q29udHJvbCBjYXBhYmlsaXRpZXM7CiAKLSAgcHJvdGVjdGVkIEN1cnJlbnRVc2VyKAotICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCi0gICAgICBBY2Nlc3NQYXRoIGFjY2Vzc1BhdGgpIHsKKyAgcHJvdGVjdGVkIEN1cnJlbnRVc2VyKENhcGFiaWxpdHlDb250cm9sLkZhY3RvcnkgY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5KSB7CiAgICAgdGhpcy5jYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkgPSBjYXBhYmlsaXR5Q29udHJvbEZhY3Rvcnk7Ci0gICAgdGhpcy5hY2Nlc3NQYXRoID0gYWNjZXNzUGF0aDsKICAgfQogCiAgIC8qKiBIb3cgdGhpcyB1c2VyIGlzIGFjY2Vzc2luZyB0aGUgR2Vycml0IENvZGUgUmV2aWV3IGFwcGxpY2F0aW9uLiAqLwpAQCAtNDksNiArNDYsMTAgQEAKICAgICByZXR1cm4gYWNjZXNzUGF0aDsKICAgfQogCisgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc1BhdGgoQWNjZXNzUGF0aCBwYXRoKSB7CisgICAgYWNjZXNzUGF0aCA9IHBhdGg7CisgIH0KKwogICAvKioKICAgICogR2V0IHRoZSBzZXQgb2YgZ3JvdXBzIHRoZSB1c2VyIGlzIGN1cnJlbnRseSBhIG1lbWJlciBvZi4KICAgICogPHA+CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0lkZW50aWZpZWRVc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0lkZW50aWZpZWRVc2VyLmphdmEKaW5kZXggODljYmFjMS4uMzgyNjI5MyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9JZGVudGlmaWVkVXNlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvSWRlbnRpZmllZFVzZXIuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk91dE9mU2NvcGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnV0aWwuUHJvdmlkZXJzOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKQEAgLTkwLDIwICs5MSwxOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBJZGVudGlmaWVkVXNlciBjcmVhdGUoZmluYWwgQWNjb3VudC5JZCBpZCkgewotICAgICAgcmV0dXJuIGNyZWF0ZShBY2Nlc3NQYXRoLlVOS05PV04sIG51bGwsIGlkKTsKKyAgICAgIHJldHVybiBjcmVhdGUoKFNvY2tldEFkZHJlc3MpIG51bGwsIGlkKTsKICAgICB9CiAKICAgICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgY3JlYXRlKFByb3ZpZGVyPFJldmlld0RiPiBkYiwgQWNjb3VudC5JZCBpZCkgewotICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVkVXNlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksIEFjY2Vzc1BhdGguVU5LTk9XTiwKKyAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllZFVzZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LAogICAgICAgICAgIGF1dGhDb25maWcsIGFub255bW91c0Nvd2FyZE5hbWUsIGNhbm9uaWNhbFVybCwgcmVhbG0sIGFjY291bnRDYWNoZSwKICAgICAgICAgICBncm91cEJhY2tlbmQsIG51bGwsIGRiLCBpZCk7CiAgICAgfQogCi0gICAgcHVibGljIElkZW50aWZpZWRVc2VyIGNyZWF0ZShBY2Nlc3NQYXRoIGFjY2Vzc1BhdGgsCi0gICAgICAgIFByb3ZpZGVyPFNvY2tldEFkZHJlc3M+IHJlbW90ZVBlZXJQcm92aWRlciwgQWNjb3VudC5JZCBpZCkgewotICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVkVXNlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksIGFjY2Vzc1BhdGgsCisgICAgcHVibGljIElkZW50aWZpZWRVc2VyIGNyZWF0ZShTb2NrZXRBZGRyZXNzIHJlbW90ZVBlZXIsIEFjY291bnQuSWQgaWQpIHsKKyAgICAgIHJldHVybiBuZXcgSWRlbnRpZmllZFVzZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LAogICAgICAgICAgIGF1dGhDb25maWcsIGFub255bW91c0Nvd2FyZE5hbWUsIGNhbm9uaWNhbFVybCwgcmVhbG0sIGFjY291bnRDYWNoZSwKLSAgICAgICAgICBncm91cEJhY2tlbmQsIHJlbW90ZVBlZXJQcm92aWRlciwgbnVsbCwgaWQpOworICAgICAgICAgIGdyb3VwQmFja2VuZCwgUHJvdmlkZXJzLm9mKHJlbW90ZVBlZXIpLCBudWxsLCBpZCk7CiAgICAgfQogICB9CiAKQEAgLTE0OSw5ICsxNDksOCBAQAogICAgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKICAgICB9CiAKLSAgICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgY3JlYXRlKGZpbmFsIEFjY2Vzc1BhdGggYWNjZXNzUGF0aCwKLSAgICAgICAgZmluYWwgQWNjb3VudC5JZCBpZCkgewotICAgICAgcmV0dXJuIG5ldyBJZGVudGlmaWVkVXNlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksIGFjY2Vzc1BhdGgsCisgICAgcHVibGljIElkZW50aWZpZWRVc2VyIGNyZWF0ZShBY2NvdW50LklkIGlkKSB7CisgICAgICByZXR1cm4gbmV3IElkZW50aWZpZWRVc2VyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKICAgICAgICAgICBhdXRoQ29uZmlnLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBjYW5vbmljYWxVcmwsIHJlYWxtLCBhY2NvdW50Q2FjaGUsCiAgICAgICAgICAgZ3JvdXBCYWNrZW5kLCByZW1vdGVQZWVyUHJvdmlkZXIsIGRiUHJvdmlkZXIsIGlkKTsKICAgICB9CkBAIC0xODcsNyArMTg2LDYgQEAKIAogICBwcml2YXRlIElkZW50aWZpZWRVc2VyKAogICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCi0gICAgICBmaW5hbCBBY2Nlc3NQYXRoIGFjY2Vzc1BhdGgsCiAgICAgICBmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWcsCiAgICAgICBmaW5hbCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKICAgICAgIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gY2Fub25pY2FsVXJsLApAQCAtMTk1LDcgKzE5Myw3IEBACiAgICAgICBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLAogICAgICAgQE51bGxhYmxlIGZpbmFsIFByb3ZpZGVyPFNvY2tldEFkZHJlc3M+IHJlbW90ZVBlZXJQcm92aWRlciwKICAgICAgIEBOdWxsYWJsZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwgZmluYWwgQWNjb3VudC5JZCBpZCkgewotICAgIHN1cGVyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwgYWNjZXNzUGF0aCk7CisgICAgc3VwZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5KTsKICAgICB0aGlzLmNhbm9uaWNhbFVybCA9IGNhbm9uaWNhbFVybDsKICAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKICAgICB0aGlzLmdyb3VwQmFja2VuZCA9IGdyb3VwQmFja2VuZDsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvSW50ZXJuYWxVc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL0ludGVybmFsVXNlci5qYXZhCmluZGV4IGViYTU5YzguLjZmNTYxOGIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvSW50ZXJuYWxVc2VyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9JbnRlcm5hbFVzZXIuamF2YQpAQCAtMzEsNiArMzEsOCBAQAogICogYW55dGhpbmcgaXQgd2FudHMsIGFueXRpbWUgaXQgd2FudHMsIGdpdmVuIHRoZSBKVk0ncyBvd24gZGlyZWN0IGFjY2VzcyB0bwogICogZGF0YS4gUGx1Z2lucyBtYXkgdXNlIHRoaXMgd2hlbiB0aGV5IG5lZWQgdG8gaGF2ZSBhIEN1cnJlbnRVc2VyIHdpdGggcmVhZAogICogcGVybWlzc2lvbiBvbiBhbnl0aGluZy4KKyAqCisgKiBAc2VlIFBsdWdpblVzZXIKICAqLwogcHVibGljIGNsYXNzIEludGVybmFsVXNlciBleHRlbmRzIEN1cnJlbnRVc2VyIHsKICAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKQEAgLTM5LDcgKzQxLDcgQEAKIAogICBASW5qZWN0CiAgIHByb3RlY3RlZCBJbnRlcm5hbFVzZXIoQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpIHsKLSAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksIEFjY2Vzc1BhdGguVU5LTk9XTik7CisgICAgc3VwZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5KTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9QZWVyRGFlbW9uVXNlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9QZWVyRGFlbW9uVXNlci5qYXZhCmluZGV4IDc1YmEwZDcuLjRkMjZmMDIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvUGVlckRhZW1vblVzZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1BlZXJEYWVtb25Vc2VyLmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKICAgQEluamVjdAogICBwcm90ZWN0ZWQgUGVlckRhZW1vblVzZXIoQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCiAgICAgICBAQXNzaXN0ZWQgU29ja2V0QWRkcmVzcyBwZWVyKSB7Ci0gICAgc3VwZXIoY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LCBBY2Nlc3NQYXRoLlNTSF9DT01NQU5EKTsKKyAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpOwogICAgIHRoaXMucGVlciA9IHBlZXI7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9QbHVnaW5Vc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1BsdWdpblVzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBhYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9QbHVnaW5Vc2VyLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkNhcGFiaWxpdHlDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKKworLyoqIFVzZXIgaWRlbnRpdHkgZm9yIHBsdWdpbiBjb2RlIHRoYXQgbmVlZHMgYW4gaWRlbnRpdHkuICovCitwdWJsaWMgY2xhc3MgUGx1Z2luVXNlciBleHRlbmRzIEludGVybmFsVXNlciB7CisgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgUGx1Z2luVXNlciBjcmVhdGUoU3RyaW5nIHBsdWdpbk5hbWUpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGx1Z2luTmFtZTsKKworICBASW5qZWN0CisgIHByb3RlY3RlZCBQbHVnaW5Vc2VyKAorICAgICAgQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCisgICAgICBAQXNzaXN0ZWQgU3RyaW5nIHBsdWdpbk5hbWUpIHsKKyAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpOworICAgIHRoaXMucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKKyAgICByZXR1cm4gInBsdWdpbiAiICsgcGx1Z2luTmFtZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiUGx1Z2luVXNlclsiICsgcGx1Z2luTmFtZSArICJdIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9VcmxFbmNvZGVkLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1VybEVuY29kZWQuamF2YQppbmRleCBmMWY2ZGNkLi4zYWM2Yzk4IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1VybEVuY29kZWQuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL1VybEVuY29kZWQuamF2YQpAQCAtMTUsOCArMTUsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlcjsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkxFbmNvZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CisKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC00NiwyMSArNDYsMTMgQEAKICAgICAgIGlmIChzZXBhcmF0b3IgIT0gMCkgewogICAgICAgICBidWZmZXIuYXBwZW5kKHNlcGFyYXRvcik7CiAgICAgICB9Ci0gICAgICBidWZmZXIuYXBwZW5kKGVuY29kZShrZXkpKTsKKyAgICAgIGJ1ZmZlci5hcHBlbmQoVXJsLmVuY29kZShrZXkpKTsKICAgICAgIGJ1ZmZlci5hcHBlbmQoJz0nKTsKICAgICAgIGlmICh2YWwgIT0gbnVsbCkgewotICAgICAgICBidWZmZXIuYXBwZW5kKGVuY29kZSh2YWwpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChVcmwuZW5jb2RlKHZhbCkpOwogICAgICAgfQogICAgICAgc2VwYXJhdG9yID0gJyYnOwogICAgIH0KICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CiAgIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlKGZpbmFsIFN0cmluZyBzdHIpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIFVSTEVuY29kZXIuZW5jb2RlKHN0ciwgIlVURi04Iik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q2FjaGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q2FjaGUuamF2YQppbmRleCAwNTZiYWJkLi44NjMwOGE5IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudENhY2hlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDYWNoZS5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiBwdWJsaWMgaW50ZXJmYWNlIEFjY291bnRDYWNoZSB7CiAgIHB1YmxpYyBBY2NvdW50U3RhdGUgZ2V0KEFjY291bnQuSWQgYWNjb3VudElkKTsKIAorICBwdWJsaWMgQWNjb3VudFN0YXRlIGdldElmUHJlc2VudChBY2NvdW50LklkIGFjY291bnRJZCk7CisKICAgcHVibGljIEFjY291bnRTdGF0ZSBnZXRCeVVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSk7CiAKICAgcHVibGljIHZvaWQgZXZpY3QoQWNjb3VudC5JZCBhY2NvdW50SWQpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDYWNoZUltcGwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q2FjaGVJbXBsLmphdmEKaW5kZXggNDIxN2Y5Zi4uYjc0ZGFhNSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRDYWNoZUltcGwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudENhY2hlSW1wbC5qYXZhCkBAIC04Nyw2ICs4NywxMCBAQAogICAgIH0KICAgfQogCisgIHB1YmxpYyBBY2NvdW50U3RhdGUgZ2V0SWZQcmVzZW50KEFjY291bnQuSWQgYWNjb3VudElkKSB7CisgICAgcmV0dXJuIGJ5SWQuZ2V0SWZQcmVzZW50KGFjY291bnRJZCk7CisgIH0KKwogICBAT3ZlcnJpZGUKICAgcHVibGljIEFjY291bnRTdGF0ZSBnZXRCeVVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgewogICAgIHRyeSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudENvbnRyb2wuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q29udHJvbC5qYXZhCmluZGV4IDMyYjRlMmMuLmYxNDhiMzEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q29udHJvbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50Q29udHJvbC5qYXZhCkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkJhZCBBY2NvdW50VmlzaWJpbGl0eSAiICsgYWNjb3VudFZpc2liaWxpdHkpOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGN1cnJlbnRVc2VyLmdldENhcGFiaWxpdGllcygpLmNhbkFkbWluaXN0cmF0ZVNlcnZlcigpOwogICB9CiAKICAgcHJpdmF0ZSBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3Vwc09mKEFjY291bnQuSWQgYWNjb3VudCkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRJbmZvLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk2NzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRJbmZvLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgQWNjb3VudEluZm8geworICBwdWJsaWMgc3RhdGljIGNsYXNzIExvYWRlciB7CisgICAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICAgIExvYWRlciBjcmVhdGUoYm9vbGVhbiBkZXRhaWxlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CisgICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkZXRhaWxlZDsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxBY2NvdW50LklkLCBBY2NvdW50SW5mbz4gY3JlYXRlZDsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8QWNjb3VudEluZm8+IHByb3ZpZGVkOworCisgICAgQEluamVjdAorICAgIExvYWRlcihQcm92aWRlcjxSZXZpZXdEYj4gZGIsCisgICAgICAgIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCisgICAgICAgIEBBc3Npc3RlZCBib29sZWFuIGRldGFpbGVkKSB7CisgICAgICB0aGlzLmRiID0gZGI7CisgICAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKKyAgICAgIHRoaXMuZGV0YWlsZWQgPSBkZXRhaWxlZDsKKyAgICAgIGNyZWF0ZWQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIHByb3ZpZGVkID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgfQorCisgICAgcHVibGljIEFjY291bnRJbmZvIGdldChBY2NvdW50LklkIGlkKSB7CisgICAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIEFjY291bnRJbmZvIGluZm8gPSBjcmVhdGVkLmdldChpZCk7CisgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CisgICAgICAgIGluZm8gPSBuZXcgQWNjb3VudEluZm8oaWQpOworICAgICAgICBjcmVhdGVkLnB1dChpZCwgaW5mbyk7CisgICAgICB9CisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwdXQoQWNjb3VudEluZm8gaW5mbykgeworICAgICAgcHJvdmlkZWQuYWRkKGluZm8pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIE11bHRpbWFwPEFjY291bnQuSWQsIEFjY291bnRJbmZvPiBtaXNzaW5nID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICBmb3IgKEFjY291bnRJbmZvIGluZm8gOiBJdGVyYWJsZXMuY29uY2F0KGNyZWF0ZWQudmFsdWVzKCksIHByb3ZpZGVkKSkgeworICAgICAgICBBY2NvdW50U3RhdGUgc3RhdGUgPSBhY2NvdW50Q2FjaGUuZ2V0SWZQcmVzZW50KGluZm8uX2lkKTsKKyAgICAgICAgaWYgKHN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICBpbmZvLmZpbGwoc3RhdGUuZ2V0QWNjb3VudCgpLCBkZXRhaWxlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWlzc2luZy5wdXQoaW5mby5faWQsIGluZm8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIW1pc3NpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgIGZvciAoQWNjb3VudCBhY2NvdW50IDogZGIuZ2V0KCkuYWNjb3VudHMoKS5nZXQobWlzc2luZy5rZXlTZXQoKSkpIHsKKyAgICAgICAgICBmb3IgKEFjY291bnRJbmZvIGluZm8gOiBtaXNzaW5nLmdldChhY2NvdW50LmdldElkKCkpKSB7CisgICAgICAgICAgICBpbmZvLmZpbGwoYWNjb3VudCwgZGV0YWlsZWQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWNjb3VudEluZm8+IGluZm9zKQorICAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIGZvciAoQWNjb3VudEluZm8gaW5mbyA6IGluZm9zKSB7CisgICAgICAgIHB1dChpbmZvKTsKKyAgICAgIH0KKyAgICAgIGZpbGwoKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIEFjY291bnRJbmZvIHBhcnNlKEFjY291bnQgYSwgYm9vbGVhbiBkZXRhaWxlZCkgeworICAgIEFjY291bnRJbmZvIGFpID0gbmV3IEFjY291bnRJbmZvKGEuZ2V0SWQoKSk7CisgICAgYWkuZmlsbChhLCBkZXRhaWxlZCk7CisgICAgcmV0dXJuIGFpOworICB9CisKKyAgcHVibGljIHRyYW5zaWVudCBBY2NvdW50LklkIF9pZDsKKworICBwdWJsaWMgQWNjb3VudEluZm8oQWNjb3VudC5JZCBpZCkgeworICAgIF9pZCA9IGlkOworICB9CisKKyAgcHVibGljIEludGVnZXIgX2FjY291bnRfaWQ7CisgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgcHVibGljIFN0cmluZyBlbWFpbDsKKworICBwcml2YXRlIHZvaWQgZmlsbChBY2NvdW50IGFjY291bnQsIGJvb2xlYW4gZGV0YWlsZWQpIHsKKyAgICBuYW1lID0gYWNjb3VudC5nZXRGdWxsTmFtZSgpOworICAgIGlmIChkZXRhaWxlZCkgeworICAgICAgX2FjY291bnRfaWQgPSBhY2NvdW50LmdldElkKCkuZ2V0KCk7CisgICAgICBlbWFpbCA9IGFjY291bnQuZ2V0UHJlZmVycmVkRW1haWwoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50UmVzb2x2ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50UmVzb2x2ZXIuamF2YQppbmRleCBhYmRmMjllLi42N2Q4N2IzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudFJlc29sdmVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRSZXNvbHZlci5qYXZhCkBAIC02MCw3ICs2MCw3IEBACiAgIH0KIAogICAvKioKLSAgICogTG9jYXRlIGV4YWN0bHkgb25lIGFjY291bnQgbWF0Y2hpbmcgdGhlIG5hbWUgb3IgbmFtZS9lbWFpbCBzdHJpbmcuCisgICAqIEZpbmQgYWxsIGFjY291bnRzIG1hdGNoaW5nIHRoZSBuYW1lIG9yIG5hbWUvZW1haWwgc3RyaW5nLgogICAgKgogICAgKiBAcGFyYW0gbmFtZU9yRW1haWwgYSBzdHJpbmcgb2YgdGhlIGZvcm1hdAogICAgKiAgICAgICAgIkZ1bGwgTmFtZSAmbHQ7ZW1haWxAZXhhbXBsZSZndDsiLCBqdXN0IHRoZSBlbWFpbCBhZGRyZXNzCkBAIC03MSwxMSArNzEsMjEgQEAKICAgcHVibGljIFNldDxBY2NvdW50LklkPiBmaW5kQWxsKFN0cmluZyBuYW1lT3JFbWFpbCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgTWF0Y2hlciBtID0gUGF0dGVybi5jb21waWxlKCJeLiogXFwoKFsxLTldWzAtOV0qKVxcKSQiKS5tYXRjaGVyKG5hbWVPckVtYWlsKTsKICAgICBpZiAobS5tYXRjaGVzKCkpIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oQWNjb3VudC5JZC5wYXJzZShtLmdyb3VwKDEpKSk7CisgICAgICBBY2NvdW50LklkIGlkID0gQWNjb3VudC5JZC5wYXJzZShtLmdyb3VwKDEpKTsKKyAgICAgIGlmIChleGlzdHMoaWQpKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oaWQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG5hbWVPckVtYWlsLm1hdGNoZXMoIl5bMS05XVswLTldKiQiKSkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihBY2NvdW50LklkLnBhcnNlKG5hbWVPckVtYWlsKSk7CisgICAgICBBY2NvdW50LklkIGlkID0gQWNjb3VudC5JZC5wYXJzZShuYW1lT3JFbWFpbCk7CisgICAgICBpZiAoZXhpc3RzKGlkKSkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKGlkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgfQogICAgIH0KIAogICAgIGlmIChuYW1lT3JFbWFpbC5tYXRjaGVzKEFjY291bnQuVVNFUl9OQU1FX1BBVFRFUk4pKSB7CkBAIC04OCw2ICs5OCwxMCBAQAogICAgIHJldHVybiBmaW5kQWxsQnlOYW1lT3JFbWFpbChuYW1lT3JFbWFpbCk7CiAgIH0KIAorICBwcml2YXRlIGJvb2xlYW4gZXhpc3RzKEFjY291bnQuSWQgaWQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBzY2hlbWEuZ2V0KCkuYWNjb3VudHMoKS5nZXQoaWQpICE9IG51bGw7CisgIH0KKwogICAvKioKICAgICogTG9jYXRlIGV4YWN0bHkgb25lIGFjY291bnQgbWF0Y2hpbmcgdGhlIG5hbWUgb3IgbmFtZS9lbWFpbCBzdHJpbmcuCiAgICAqCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudFJlc291cmNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQWNjb3VudFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjNDIzYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBBY2NvdW50UmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PEFjY291bnRSZXNvdXJjZT4+IEFDQ09VTlRfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8QWNjb3VudFJlc291cmNlPj4oKSB7fTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PENhcGFiaWxpdHk+PiBDQVBBQklMSVRZX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PENhcGFiaWxpdHk+PigpIHt9OworCisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKKworICBwdWJsaWMgQWNjb3VudFJlc291cmNlKElkZW50aWZpZWRVc2VyIHVzZXIpIHsKKyAgICB0aGlzLnVzZXIgPSB1c2VyOworICB9CisKKyAgcHVibGljIElkZW50aWZpZWRVc2VyIGdldFVzZXIoKSB7CisgICAgcmV0dXJuIHVzZXI7CisgIH0KKworICBzdGF0aWMgY2xhc3MgQ2FwYWJpbGl0eSBpbXBsZW1lbnRzIFJlc3RSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhcGFiaWxpdHk7CisKKyAgICBDYXBhYmlsaXR5KElkZW50aWZpZWRVc2VyIHVzZXIsIFN0cmluZyBjYXBhYmlsaXR5KSB7CisgICAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgICAgdGhpcy5jYXBhYmlsaXR5ID0gY2FwYWJpbGl0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgZ2V0VXNlcigpIHsKKyAgICAgIHJldHVybiB1c2VyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FwYWJpbGl0eSgpIHsKKyAgICAgIHJldHVybiBjYXBhYmlsaXR5OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhcygpIHsKKyAgICAgIHJldHVybiB1c2VyLmdldENhcGFiaWxpdGllcygpLmNhblBlcmZvcm0oZ2V0Q2FwYWJpbGl0eSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50c0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BY2NvdW50c0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQwNDZjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0FjY291bnRzQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5Bbm9ueW1vdXNVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgQWNjb3VudHNDb2xsZWN0aW9uIGltcGxlbWVudHMKKyAgICBSZXN0Q29sbGVjdGlvbjxUb3BMZXZlbFJlc291cmNlLCBBY2NvdW50UmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZjsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgcmVzb2x2ZXI7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudENvbnRyb2wuRmFjdG9yeSBhY2NvdW50Q29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgdXNlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxBY2NvdW50UmVzb3VyY2U+PiB2aWV3czsKKworICBASW5qZWN0CisgIEFjY291bnRzQ29sbGVjdGlvbihQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZiwKKyAgICAgIEFjY291bnRSZXNvbHZlciByZXNvbHZlciwKKyAgICAgIEFjY291bnRDb250cm9sLkZhY3RvcnkgYWNjb3VudENvbnRyb2xGYWN0b3J5LAorICAgICAgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgdXNlckZhY3RvcnksCisgICAgICBEeW5hbWljTWFwPFJlc3RWaWV3PEFjY291bnRSZXNvdXJjZT4+IHZpZXdzKSB7CisgICAgdGhpcy5zZWxmID0gc2VsZjsKKyAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgdGhpcy5hY2NvdW50Q29udHJvbEZhY3RvcnkgPSBhY2NvdW50Q29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy51c2VyRmFjdG9yeSA9IHVzZXJGYWN0b3J5OworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQWNjb3VudFJlc291cmNlIHBhcnNlKFRvcExldmVsUmVzb3VyY2Ugcm9vdCwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gX3BhcnNlKGlkLmdldCgpKTsKKyAgICBpZiAodXNlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfSBlbHNlIGlmICghYWNjb3VudENvbnRyb2xGYWN0b3J5LmdldCgpLmNhblNlZSh1c2VyLmdldEFjY291bnQoKSkpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBBY2NvdW50UmVzb3VyY2UodXNlcik7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIGEgYWNjb3VudCBJRCBmcm9tIGEgcmVxdWVzdCBib2R5IGFuZCByZXR1cm5zIHRoZSB1c2VyLgorICAgKgorICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIGFjY291bnQsIGNhbiBiZSBhIHN0cmluZyBvZiB0aGUgZm9ybWF0CisgICAqICAgICAgICAiRnVsbCBOYW1lIDxlbWFpbEBleGFtcGxlLmNvbT4iLCBqdXN0IHRoZSBlbWFpbCBhZGRyZXNzLCBhIGZ1bGwgbmFtZQorICAgKiAgICAgICAgaWYgaXQgaXMgdW5pcXVlLCBhbiBhY2NvdW50IElELCBhIHVzZXIgbmFtZSBvciAnc2VsZicgZm9yIHRoZQorICAgKiAgICAgICAgY2FsbGluZyB1c2VyCisgICAqIEByZXR1cm4gdGhlIHByb2plY3QKKyAgICogQHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHRocm93biBpZiB0aGUgYWNjb3VudCBJRCBjYW5ub3QgYmUKKyAgICogICAgICAgICByZXNvbHZlZCBvciBpZiB0aGUgYWNjb3VudCBpcyBub3QgdmlzaWJsZSB0byB0aGUgY2FsbGluZyB1c2VyCisgICAqLworICBwdWJsaWMgSWRlbnRpZmllZFVzZXIgcGFyc2UoU3RyaW5nIGlkKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgSWRlbnRpZmllZFVzZXIgdXNlciA9IF9wYXJzZShpZCk7CisgICAgaWYgKHVzZXIgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiQWNjb3VudCBOb3QgRm91bmQ6ICVzIiwgaWQpKTsKKyAgICB9CisgICAgcmV0dXJuIHVzZXI7CisgIH0KKworICBwcml2YXRlIElkZW50aWZpZWRVc2VyIF9wYXJzZShTdHJpbmcgaWQpIHRocm93cyBBdXRoRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIEN1cnJlbnRVc2VyIHVzZXIgPSBzZWxmLmdldCgpOworCisgICAgaWYgKGlkLmVxdWFscygic2VsZiIpKSB7CisgICAgICBpZiAodXNlciBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSB7CisgICAgICAgIHJldHVybiAoSWRlbnRpZmllZFVzZXIpIHVzZXI7CisgICAgICB9IGVsc2UgaWYgKHVzZXIgaW5zdGFuY2VvZiBBbm9ueW1vdXNVc2VyKSB7CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJBdXRoZW50aWNhdGlvbiByZXF1aXJlZCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgU2V0PEFjY291bnQuSWQ+IG1hdGNoZXMgPSByZXNvbHZlci5maW5kQWxsKGlkKTsKKyAgICBpZiAobWF0Y2hlcy5zaXplKCkgIT0gMSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiB1c2VyRmFjdG9yeS5jcmVhdGUoSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KG1hdGNoZXMpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzdFZpZXc8VG9wTGV2ZWxSZXNvdXJjZT4gbGlzdCgpIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PEFjY291bnRSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0F1dGhNZXRob2QuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9BdXRoTWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWFiZDIuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0F1dGhNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKLQotLyoqIE1ldGhvZCBieSB3aGljaCBhIHVzZXIgaGFzIGF1dGhlbnRpY2F0ZWQgZm9yIGEgZ2l2ZW4gcmVxdWVzdC4gKi8KLXB1YmxpYyBlbnVtIEF1dGhNZXRob2QgewotICAvKiogVGhlIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQgKi8KLSAgTk9ORSwKLQotICAvKiogVGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCB2aWEgYSBjb29raWUuICovCi0gIENPT0tJRSwKLQotICAvKiogVGhlIHVzZXIgYXV0aGVudGljYXRlZCB3aXRoIGEgcGFzc3dvcmQgZm9yIHRoaXMgcmVxdWVzdC4gKi8KLSAgUEFTU1dPUkQsCi0KLSAgLyoqIFRoZSB1c2VyIGhhcyB1c2VkIGEgY3JlZGVudGlhbGVzcyBkZXZlbG9wbWVudCBmZWF0dXJlIHRvIGxvZ2luLiAqLwotICBCQUNLRE9PUjsKLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9DYXBhYmlsaXRpZXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9DYXBhYmlsaXRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGU1MDEzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NhcGFiaWxpdGllcy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQ2hpbGRDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvdXJjZS5DYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworY2xhc3MgQ2FwYWJpbGl0aWVzIGltcGxlbWVudHMKKyAgICBDaGlsZENvbGxlY3Rpb248QWNjb3VudFJlc291cmNlLCBBY2NvdW50UmVzb3VyY2UuQ2FwYWJpbGl0eT4geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmOworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8QWNjb3VudFJlc291cmNlLkNhcGFiaWxpdHk+PiB2aWV3czsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxHZXRDYXBhYmlsaXRpZXM+IGdldDsKKworICBASW5qZWN0CisgIENhcGFiaWxpdGllcygKKyAgICAgIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmLAorICAgICAgRHluYW1pY01hcDxSZXN0VmlldzxBY2NvdW50UmVzb3VyY2UuQ2FwYWJpbGl0eT4+IHZpZXdzLAorICAgICAgUHJvdmlkZXI8R2V0Q2FwYWJpbGl0aWVzPiBnZXQpIHsKKyAgICB0aGlzLnNlbGYgPSBzZWxmOworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLmdldCA9IGdldDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR2V0Q2FwYWJpbGl0aWVzIGxpc3QoKSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldC5nZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2FwYWJpbGl0eSBwYXJzZShBY2NvdW50UmVzb3VyY2UgcGFyZW50LCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICBpZiAoc2VsZi5nZXQoKSAhPSBwYXJlbnQuZ2V0VXNlcigpCisgICAgICAgICYmICFzZWxmLmdldCgpLmdldENhcGFiaWxpdGllcygpLmNhbkFkbWluaXN0cmF0ZVNlcnZlcigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigicmVzdHJpY3RlZCB0byBhZG1pbmlzdHJhdG9yIik7CisgICAgfQorCisgICAgU3RyaW5nIG5hbWUgPSBpZC5nZXQoKTsKKyAgICBDYXBhYmlsaXR5Q29udHJvbCBjYXAgPSBwYXJlbnQuZ2V0VXNlcigpLmdldENhcGFiaWxpdGllcygpOworICAgIGlmIChjYXAuY2FuUGVyZm9ybShuYW1lKQorICAgICAgICB8fCAoY2FwLmNhbkFkbWluaXN0cmF0ZVNlcnZlcigpICYmIEdsb2JhbENhcGFiaWxpdHkuaXNDYXBhYmlsaXR5KG5hbWUpKSkgeworICAgICAgcmV0dXJuIG5ldyBBY2NvdW50UmVzb3VyY2UuQ2FwYWJpbGl0eShwYXJlbnQuZ2V0VXNlcigpLCBuYW1lKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PENhcGFiaWxpdHk+PiB2aWV3cygpIHsKKyAgICByZXR1cm4gdmlld3M7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9DYXBhYmlsaXR5Q29udHJvbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NhcGFiaWxpdHlDb250cm9sLmphdmEKaW5kZXggMTUyNDE4NS4uOTQyYjBkNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NhcGFiaWxpdHlDb250cm9sLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0NhcGFiaWxpdHlDb250cm9sLmphdmEKQEAgLTEzMCwxMiArMTMwLDI0IEBACiAgICAgICB8fCBjYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKTsKICAgfQogCisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlciBjYW4gYWNjZXNzIHRoZSBkYXRhYmFzZSAod2l0aCBnc3FsKS4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuQWNjZXNzRGF0YWJhc2UoKSB7CisgICAgcmV0dXJuIGNhblBlcmZvcm0oR2xvYmFsQ2FwYWJpbGl0eS5BQ0NFU1NfREFUQUJBU0UpOworICB9CisKICAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdXNlciBjYW4gZm9yY2UgcmVwbGljYXRpb24gdG8gYW55IGNvbmZpZ3VyZWQgZGVzdGluYXRpb24uICovCiAgIHB1YmxpYyBib29sZWFuIGNhblN0YXJ0UmVwbGljYXRpb24oKSB7CiAgICAgcmV0dXJuIGNhblBlcmZvcm0oR2xvYmFsQ2FwYWJpbGl0eS5TVEFSVF9SRVBMSUNBVElPTikKICAgICAgICAgfHwgY2FuQWRtaW5pc3RyYXRlU2VydmVyKCk7CiAgIH0KIAorICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGNhbiBydW4gdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24uICovCisgIHB1YmxpYyBib29sZWFuIGNhblJ1bkdDKCkgeworICAgIHJldHVybiBjYW5QZXJmb3JtKEdsb2JhbENhcGFiaWxpdHkuUlVOX0dDKQorICAgICAgICB8fCBjYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKTsKKyAgfQorCiAgIC8qKiBAcmV0dXJuIHdoaWNoIHByaW9yaXR5IHF1ZXVlIHRoZSB1c2VyJ3MgdGFza3Mgc2hvdWxkIGJlIHN1Ym1pdHRlZCB0by4gKi8KICAgcHVibGljIFF1ZXVlUHJvdmlkZXIuUXVldWVUeXBlIGdldFF1ZXVlVHlwZSgpIHsKICAgICAvLyBJZiBhIG5vbi1nZW5lcmljIGdyb3VwICh0aGF0IGlzIG5vdCBBbm9ueW1vdXMgVXNlcnMgb3IgUmVnaXN0ZXJlZCBVc2VycykKQEAgLTE1OSw2ICsxNzEsMTEgQEAKICAgICAgICAgICBjYXNlIEJBVENIOgogICAgICAgICAgICAgYmF0Y2ggPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEFMTE9XOgorICAgICAgICAgIGNhc2UgQkxPQ0s6CisgICAgICAgICAgY2FzZSBERU5ZOgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvQ2hhbmdlVXNlck5hbWUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9DaGFuZ2VVc2VyTmFtZS5qYXZhCmluZGV4IGQ2ZjQ1ZjUuLjFiNzNjNTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9DaGFuZ2VVc2VyTmFtZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9DaGFuZ2VVc2VyTmFtZS5qYXZhCkBAIC0xMjMsNyArMTIzLDcgQEAKIAogICAgICAgICAvLyBPdGhlcndpc2UsIHNvbWVvbmUgZWxzZSBoYXMgdGhpcyBpZGVudGl0eS4KICAgICAgICAgLy8KLSAgICAgICAgdGhyb3cgbmV3IE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbigpOworICAgICAgICB0aHJvdyBuZXcgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKG5ld1VzZXJuYW1lKTsKICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRBY2NvdW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR2V0QWNjb3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjI0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR2V0QWNjb3VudC5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CisKK3B1YmxpYyBjbGFzcyBHZXRBY2NvdW50IGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEFjY291bnRSZXNvdXJjZT4geworICBAT3ZlcnJpZGUKKyAgcHVibGljIEFjY291bnRJbmZvIGFwcGx5KEFjY291bnRSZXNvdXJjZSByc3JjKSB7CisgICAgcmV0dXJuIEFjY291bnRJbmZvLnBhcnNlKHJzcmMuZ2V0VXNlcigpLmdldEFjY291bnQoKSwgdHJ1ZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRBdmF0YXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRBdmF0YXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY2NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldEF2YXRhci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljSXRlbTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXZhdGFyLkF2YXRhclByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2NsYXNzIEdldEF2YXRhciBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxBY2NvdW50UmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljSXRlbTxBdmF0YXJQcm92aWRlcj4gYXZhdGFyUHJvdmlkZXI7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tc2l6ZSIsIGFsaWFzZXMgPSB7Ii1zIn0sCisgICAgICB1c2FnZSA9ICJyZWNvbW1lbmRlZCBzaXplIGluIHBpeGVscywgaGVpZ2h0IGFuZCB3aWR0aCIpCisgIHByaXZhdGUgaW50IHNpemU7CisKKyAgQEluamVjdAorICBHZXRBdmF0YXIoRHluYW1pY0l0ZW08QXZhdGFyUHJvdmlkZXI+IGF2YXRhclByb3ZpZGVyKSB7CisgICAgdGhpcy5hdmF0YXJQcm92aWRlciA9IGF2YXRhclByb3ZpZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXNwb25zZS5SZWRpcmVjdCBhcHBseShBY2NvdW50UmVzb3VyY2UgcnNyYykKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICBBdmF0YXJQcm92aWRlciBpbXBsID0gYXZhdGFyUHJvdmlkZXIuZ2V0KCk7CisgICAgaWYgKGltcGwgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBTdHJpbmcgdXJsID0gaW1wbC5nZXRVcmwocnNyYy5nZXRVc2VyKCksIHNpemUpOworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkodXJsKSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFJlc3BvbnNlLnJlZGlyZWN0KHVybCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR2V0Q2FwYWJpbGl0aWVzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR2V0Q2FwYWJpbGl0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyMjFhYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRDYXBhYmlsaXRpZXMuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuQUNDRVNTX0RBVEFCQVNFOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LkNSRUFURV9BQ0NPVU5UOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LkNSRUFURV9HUk9VUDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfUFJPSkVDVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5FTUFJTF9SRVZJRVdFUlM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuRkxVU0hfQ0FDSEVTOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5LktJTExfVEFTSzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5QUklPUklUWTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5SVU5fR0M7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuU1RBUlRfUkVQTElDQVRJT047CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuVklFV19DQUNIRVM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHkuVklFV19DT05ORUNUSU9OUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eS5WSUVXX1FVRVVFOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJpbmFyeVJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvdXJjZS5DYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUXVldWVQcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2NsYXNzIEdldENhcGFiaWxpdGllcyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxBY2NvdW50UmVzb3VyY2U+IHsKKyAgQERlcHJlY2F0ZWQKKyAgQE9wdGlvbihuYW1lID0gIi0tZm9ybWF0IiwgdXNhZ2UgPSAiKGRlcHJlY2F0ZWQpIG91dHB1dCBmb3JtYXQiKQorICBwcml2YXRlIE91dHB1dEZvcm1hdCBmb3JtYXQ7CisKKyAgQE9wdGlvbihuYW1lID0gIi1xIiwgbWV0YVZhciA9ICJDQVAiLCBtdWx0aVZhbHVlZCA9IHRydWUsIHVzYWdlID0gIkNhcGFiaWxpdHkgdG8gaW5zcGVjdCIpCisgIHZvaWQgYWRkUXVlcnkoU3RyaW5nIG5hbWUpIHsKKyAgICBpZiAocXVlcnkgPT0gbnVsbCkgeworICAgICAgcXVlcnkgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICB9CisgICAgSXRlcmFibGVzLmFkZEFsbChxdWVyeSwgSXRlcmFibGVzLnRyYW5zZm9ybSgKKyAgICAgICAgU3BsaXR0ZXIub25QYXR0ZXJuKCJbLCBdIikub21pdEVtcHR5U3RyaW5ncygpLnRyaW1SZXN1bHRzKCkuc3BsaXQobmFtZSksCisgICAgICAgIG5ldyBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4oKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dC50b0xvd2VyQ2FzZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfSkpOworICB9CisgIHByaXZhdGUgU2V0PFN0cmluZz4gcXVlcnk7CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZjsKKworICBASW5qZWN0CisgIEdldENhcGFiaWxpdGllcyhQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZikgeworICAgIHRoaXMuc2VsZiA9IHNlbGY7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShBY2NvdW50UmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKyAgICBpZiAoc2VsZi5nZXQoKSAhPSByZXNvdXJjZS5nZXRVc2VyKCkKKyAgICAgICAgJiYgIXNlbGYuZ2V0KCkuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJyZXN0cmljdGVkIHRvIGFkbWluaXN0cmF0b3IiKTsKKyAgICB9CisKKyAgICBDYXBhYmlsaXR5Q29udHJvbCBjYyA9IHJlc291cmNlLmdldFVzZXIoKS5nZXRDYXBhYmlsaXRpZXMoKTsKKyAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGhhdmUgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogR2xvYmFsQ2FwYWJpbGl0eS5nZXRBbGxOYW1lcygpKSB7CisgICAgICBpZiAoIW5hbWUuZXF1YWxzKFBSSU9SSVRZKSAmJiB3YW50KG5hbWUpICYmIGNjLmNhblBlcmZvcm0obmFtZSkpIHsKKyAgICAgICAgaWYgKEdsb2JhbENhcGFiaWxpdHkuaGFzUmFuZ2UobmFtZSkpIHsKKyAgICAgICAgICBoYXZlLnB1dChuYW1lLCBuZXcgUmFuZ2UoY2MuZ2V0UmFuZ2UobmFtZSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBoYXZlLnB1dChuYW1lLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGhhdmUucHV0KENSRUFURV9BQ0NPVU5ULCBjYy5jYW5DcmVhdGVBY2NvdW50KCkpOworICAgIGhhdmUucHV0KENSRUFURV9HUk9VUCwgY2MuY2FuQ3JlYXRlR3JvdXAoKSk7CisgICAgaGF2ZS5wdXQoQ1JFQVRFX1BST0pFQ1QsIGNjLmNhbkNyZWF0ZVByb2plY3QoKSk7CisgICAgaGF2ZS5wdXQoRU1BSUxfUkVWSUVXRVJTLCBjYy5jYW5FbWFpbFJldmlld2VycygpKTsKKyAgICBoYXZlLnB1dChLSUxMX1RBU0ssIGNjLmNhbktpbGxUYXNrKCkpOworICAgIGhhdmUucHV0KFZJRVdfQ0FDSEVTLCBjYy5jYW5WaWV3Q2FjaGVzKCkpOworICAgIGhhdmUucHV0KEZMVVNIX0NBQ0hFUywgY2MuY2FuRmx1c2hDYWNoZXMoKSk7CisgICAgaGF2ZS5wdXQoVklFV19DT05ORUNUSU9OUywgY2MuY2FuVmlld0Nvbm5lY3Rpb25zKCkpOworICAgIGhhdmUucHV0KFZJRVdfUVVFVUUsIGNjLmNhblZpZXdRdWV1ZSgpKTsKKyAgICBoYXZlLnB1dChSVU5fR0MsIGNjLmNhblJ1bkdDKCkpOworICAgIGhhdmUucHV0KFNUQVJUX1JFUExJQ0FUSU9OLCBjYy5jYW5TdGFydFJlcGxpY2F0aW9uKCkpOworICAgIGhhdmUucHV0KEFDQ0VTU19EQVRBQkFTRSwgY2MuY2FuQWNjZXNzRGF0YWJhc2UoKSk7CisKKyAgICBRdWV1ZVByb3ZpZGVyLlF1ZXVlVHlwZSBxdWV1ZSA9IGNjLmdldFF1ZXVlVHlwZSgpOworICAgIGlmIChxdWV1ZSAhPSBRdWV1ZVByb3ZpZGVyLlF1ZXVlVHlwZS5JTlRFUkFDVElWRQorICAgICAgICB8fCAocXVlcnkgIT0gbnVsbCAmJiBxdWVyeS5jb250YWlucyhQUklPUklUWSkpKSB7CisgICAgICBoYXZlLnB1dChQUklPUklUWSwgcXVldWUpOworICAgIH0KKworICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGl0ciA9IGhhdmUuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisgICAgICBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGUgPSBpdHIubmV4dCgpOworICAgICAgaWYgKCF3YW50KGUuZ2V0S2V5KCkpKSB7CisgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgIH0gZWxzZSBpZiAoZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQm9vbGVhbiAmJiAhKChCb29sZWFuKSBlLmdldFZhbHVlKCkpKSB7CisgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm9ybWF0ID09IE91dHB1dEZvcm1hdC5URVhUKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlIDogaGF2ZS5lbnRyeVNldCgpKSB7CisgICAgICAgIHNiLmFwcGVuZChlLmdldEtleSgpKTsKKyAgICAgICAgaWYgKCEoZS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgQm9vbGVhbikpIHsKKyAgICAgICAgICBzYi5hcHBlbmQoIjogIik7CisgICAgICAgICAgc2IuYXBwZW5kKGUuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICB9CisgICAgICByZXR1cm4gQmluYXJ5UmVzdWx0LmNyZWF0ZShzYi50b1N0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIE91dHB1dEZvcm1hdC5KU09OLm5ld0dzb24oKS50b0pzb25UcmVlKAorICAgICAgICBoYXZlLAorICAgICAgICBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIE9iamVjdD4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gd2FudChTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBxdWVyeSA9PSBudWxsIHx8IHF1ZXJ5LmNvbnRhaW5zKG5hbWUudG9Mb3dlckNhc2UoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSYW5nZSB7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgUGVybWlzc2lvblJhbmdlIHJhbmdlOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHByaXZhdGUgaW50IG1pbjsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIGludCBtYXg7CisKKyAgICBSYW5nZShQZXJtaXNzaW9uUmFuZ2UgcikgeworICAgICAgcmFuZ2UgPSByOworICAgICAgbWluID0gci5nZXRNaW4oKTsKKyAgICAgIG1heCA9IHIuZ2V0TWF4KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiByYW5nZS50b1N0cmluZygpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBDaGVja09uZSBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxBY2NvdW50UmVzb3VyY2UuQ2FwYWJpbGl0eT4geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2FwYWJpbGl0eSByZXNvdXJjZSkgeworICAgICAgcmV0dXJuIEJpbmFyeVJlc3VsdC5jcmVhdGUoIm9rXG4iKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRHcm91cHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9HZXRHcm91cHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U0ZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dldEdyb3Vwcy5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cEpzb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEdldEdyb3VwcyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxBY2NvdW50UmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEdyb3VwSnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgR2V0R3JvdXBzKEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3RvcnksIEdyb3VwSnNvbiBqc29uKSB7CisgICAgdGhpcy5ncm91cENvbnRyb2xGYWN0b3J5ID0gZ3JvdXBDb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PEdyb3VwSW5mbz4gYXBwbHkoQWNjb3VudFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gcmVzb3VyY2UuZ2V0VXNlcigpOworICAgIEFjY291bnQuSWQgdXNlcklkID0gdXNlci5nZXRBY2NvdW50SWQoKTsKKyAgICBMaXN0PEdyb3VwSW5mbz4gZ3JvdXBzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCB1dWlkIDogdXNlci5nZXRFZmZlY3RpdmVHcm91cHMoKS5nZXRLbm93bkdyb3VwcygpKSB7CisgICAgICBHcm91cENvbnRyb2wgY3RsOworICAgICAgdHJ5IHsKKyAgICAgICAgY3RsID0gZ3JvdXBDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKHV1aWQpOworICAgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjdGwuaXNWaXNpYmxlKCkgJiYgY3RsLmNhblNlZU1lbWJlcih1c2VySWQpKSB7CisgICAgICAgIGdyb3Vwcy5hZGQoanNvbi5mb3JtYXQoY3RsLmdldEdyb3VwKCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGdyb3VwczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwQ29udHJvbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwQ29udHJvbC5qYXZhCmluZGV4IGQ5YjEyYWMuLjJhOGU3YzkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cENvbnRyb2wuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBDb250cm9sLmphdmEKQEAgLTIxLDExICsyMSwzNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSW50ZXJuYWxVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKIC8qKiBBY2Nlc3MgY29udHJvbCBtYW5hZ2VtZW50IGZvciBhIGdyb3VwIG9mIGFjY291bnRzIG1hbmFnZWQgaW4gR2Vycml0LiAqLwogcHVibGljIGNsYXNzIEdyb3VwQ29udHJvbCB7CisKKyAgQFNpbmdsZXRvbgorICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNGYWN0b3J5IHsKKyAgICBwcml2YXRlIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQ7CisKKyAgICBASW5qZWN0CisgICAgR2VuZXJpY0ZhY3RvcnkoZmluYWwgR3JvdXBCYWNrZW5kIGdiKSB7CisgICAgICBncm91cEJhY2tlbmQgPSBnYjsKKyAgICB9CisKKyAgICBwdWJsaWMgR3JvdXBDb250cm9sIGNvbnRyb2xGb3IoZmluYWwgQ3VycmVudFVzZXIgd2hvLAorICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKQorICAgICAgICB0aHJvd3MgTm9TdWNoR3JvdXBFeGNlcHRpb24geworICAgICAgZmluYWwgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBncm91cCA9IGdyb3VwQmFja2VuZC5nZXQoZ3JvdXBJZCk7CisgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgTm9TdWNoR3JvdXBFeGNlcHRpb24oZ3JvdXBJZCk7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3IEdyb3VwQ29udHJvbCh3aG8sIGdyb3VwKTsKKyAgICB9CisgIH0KKwogICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgewogICAgIHByaXZhdGUgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlOwogICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHVzZXI7CkBAIC00NSw3ICs2OCw3IEBACiAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgewogICAgICAgICB0aHJvdyBuZXcgTm9TdWNoR3JvdXBFeGNlcHRpb24oZ3JvdXBJZCk7CiAgICAgICB9Ci0gICAgICByZXR1cm4gbmV3IEdyb3VwQ29udHJvbCh1c2VyLmdldCgpLCBncm91cCk7CisgICAgICByZXR1cm4gY29udHJvbEZvcihHcm91cERlc2NyaXB0aW9ucy5mb3JBY2NvdW50R3JvdXAoZ3JvdXApKTsKICAgICB9CiAKICAgICBwdWJsaWMgR3JvdXBDb250cm9sIGNvbnRyb2xGb3IoZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCkKQEAgLTU0LDEwICs3NywxNCBAQAogICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEdyb3VwRXhjZXB0aW9uKGdyb3VwSWQpOwogICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBHcm91cENvbnRyb2wodXNlci5nZXQoKSwgZ3JvdXApOworICAgICAgcmV0dXJuIGNvbnRyb2xGb3IoZ3JvdXApOwogICAgIH0KIAotICAgIHB1YmxpYyBHcm91cENvbnRyb2wgY29udHJvbEZvcihmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXApIHsKKyAgICBwdWJsaWMgR3JvdXBDb250cm9sIGNvbnRyb2xGb3IoQWNjb3VudEdyb3VwIGdyb3VwKSB7CisgICAgICByZXR1cm4gY29udHJvbEZvcihHcm91cERlc2NyaXB0aW9ucy5mb3JBY2NvdW50R3JvdXAoZ3JvdXApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgR3JvdXBDb250cm9sIGNvbnRyb2xGb3IoR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBncm91cCkgewogICAgICAgcmV0dXJuIG5ldyBHcm91cENvbnRyb2wodXNlci5nZXQoKSwgZ3JvdXApOwogICAgIH0KIApAQCAtNjksNiArOTYsMTUgQEAKICAgICAgIH0KICAgICAgIHJldHVybiBjOwogICAgIH0KKworICAgIHB1YmxpYyBHcm91cENvbnRyb2wgdmFsaWRhdGVGb3IoZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVVUlEKQorICAgICAgICB0aHJvd3MgTm9TdWNoR3JvdXBFeGNlcHRpb24geworICAgICAgZmluYWwgR3JvdXBDb250cm9sIGMgPSBjb250cm9sRm9yKGdyb3VwVVVJRCk7CisgICAgICBpZiAoIWMuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEdyb3VwRXhjZXB0aW9uKGdyb3VwVVVJRCk7CisgICAgICB9CisgICAgICByZXR1cm4gYzsKKyAgICB9CiAgIH0KIAogICBwcml2YXRlIGZpbmFsIEN1cnJlbnRVc2VyIHVzZXI7CkBAIC04MCw4ICsxMTYsOCBAQAogICAgIGdyb3VwID0gIGdkOwogICB9CiAKLSAgR3JvdXBDb250cm9sKEN1cnJlbnRVc2VyIHdobywgQWNjb3VudEdyb3VwIGFnKSB7Ci0gICAgdGhpcyh3aG8sIEdyb3VwRGVzY3JpcHRpb25zLmZvckFjY291bnRHcm91cChhZykpOworICBwdWJsaWMgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBnZXRHcm91cCgpIHsKKyAgICByZXR1cm4gZ3JvdXA7CiAgIH0KIAogICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKSB7CkBAIC05MCw3ICsxMjYsOSBAQAogCiAgIC8qKiBDYW4gdGhpcyB1c2VyIHNlZSB0aGlzIGdyb3VwIGV4aXN0cz8gKi8KICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgIHJldHVybiBncm91cC5pc1Zpc2libGVUb0FsbCgpCisgICAgQWNjb3VudEdyb3VwIGFjY291bnRHcm91cCA9IEdyb3VwRGVzY3JpcHRpb25zLnRvQWNjb3VudEdyb3VwKGdyb3VwKTsKKyAgICByZXR1cm4gKGFjY291bnRHcm91cCAhPSBudWxsICYmIGFjY291bnRHcm91cC5pc1Zpc2libGVUb0FsbCgpKQorICAgICAgfHwgdXNlciBpbnN0YW5jZW9mIEludGVybmFsVXNlcgogICAgICAgfHwgdXNlci5nZXRFZmZlY3RpdmVHcm91cHMoKS5jb250YWlucyhncm91cC5nZXRHcm91cFVVSUQoKSkKICAgICAgIHx8IGlzT3duZXIoKTsKICAgfQpAQCAtMTIzLDE5ICsxNjEsMjEgQEAKICAgICByZXR1cm4gY2FuU2VlTWVtYmVycygpOwogICB9CiAKLSAgcHVibGljIGJvb2xlYW4gY2FuQWRkR3JvdXAoQWNjb3VudEdyb3VwLklkIGlkKSB7CisgIHB1YmxpYyBib29sZWFuIGNhbkFkZEdyb3VwKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKICAgICByZXR1cm4gaXNPd25lcigpOwogICB9CiAKLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlR3JvdXAoQWNjb3VudEdyb3VwLklkIGlkKSB7CisgIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZUdyb3VwKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKICAgICByZXR1cm4gaXNPd25lcigpOwogICB9CiAKLSAgcHVibGljIGJvb2xlYW4gY2FuU2VlR3JvdXAoQWNjb3VudEdyb3VwLklkIGlkKSB7CisgIHB1YmxpYyBib29sZWFuIGNhblNlZUdyb3VwKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKICAgICByZXR1cm4gY2FuU2VlTWVtYmVycygpOwogICB9CiAKICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZU1lbWJlcnMoKSB7Ci0gICAgcmV0dXJuIGdyb3VwLmlzVmlzaWJsZVRvQWxsKCkgfHwgaXNPd25lcigpOworICAgIEFjY291bnRHcm91cCBhY2NvdW50R3JvdXAgPSBHcm91cERlc2NyaXB0aW9ucy50b0FjY291bnRHcm91cChncm91cCk7CisgICAgcmV0dXJuIChhY2NvdW50R3JvdXAgIT0gbnVsbCAmJiBhY2NvdW50R3JvdXAuaXNWaXNpYmxlVG9BbGwoKSkKKyAgICAgICAgfHwgaXNPd25lcigpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBEZXRhaWxGYWN0b3J5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBEZXRhaWxGYWN0b3J5LmphdmEKaW5kZXggMmU1MDBiZC4uY2FkZTljNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwRGV0YWlsRmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cERldGFpbEZhY3RvcnkuamF2YQpAQCAtMjAsNyArMjAsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwpAQCAtODAsMTAgKzgwLDExIEBACiAgICAgICAgIGRldGFpbC5zZXRNZW1iZXJzKGxvYWRNZW1iZXJzKCkpOwogICAgICAgICBkZXRhaWwuc2V0SW5jbHVkZXMobG9hZEluY2x1ZGVzKCkpOwogICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1lTVEVNOgorICAgICAgICBicmVhazsKICAgICB9CiAgICAgZGV0YWlsLnNldEFjY291bnRzKGFpYy5jcmVhdGUoKSk7CiAgICAgZGV0YWlsLnNldENhbk1vZGlmeShjb250cm9sLmlzT3duZXIoKSk7Ci0gICAgZGV0YWlsLnNldEdyb3VwcyhnaWMuY3JlYXRlKCkpOwogICAgIHJldHVybiBkZXRhaWw7CiAgIH0KIApAQCAtMTIxLDM2ICsxMjIsMzQgQEAKICAgICByZXR1cm4gbWVtYmVyczsKICAgfQogCi0gIHByaXZhdGUgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlPiBsb2FkSW5jbHVkZXMoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBMaXN0PEFjY291bnRHcm91cEluY2x1ZGU+IGdyb3VwcyA9IG5ldyBBcnJheUxpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZT4oKTsKKyAgcHJpdmF0ZSBMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IGxvYWRJbmNsdWRlcygpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPigpOwogCi0gICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlIG0gOiBkYi5hY2NvdW50R3JvdXBJbmNsdWRlcygpLmJ5R3JvdXAoZ3JvdXBJZCkpIHsKLSAgICAgIGlmIChjb250cm9sLmNhblNlZUdyb3VwKG0uZ2V0SW5jbHVkZUlkKCkpKSB7Ci0gICAgICAgIGdpYy53YW50KG0uZ2V0SW5jbHVkZUlkKCkpOworICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBtIDogZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5ieUdyb3VwKGdyb3VwSWQpKSB7CisgICAgICBpZiAoY29udHJvbC5jYW5TZWVHcm91cChtLmdldEluY2x1ZGVVVUlEKCkpKSB7CisgICAgICAgIGdpYy53YW50KG0uZ2V0SW5jbHVkZVVVSUQoKSk7CiAgICAgICAgIGdyb3Vwcy5hZGQobSk7CiAgICAgICB9CiAgICAgfQogCi0gICAgQ29sbGVjdGlvbnMuc29ydChncm91cHMsIG5ldyBDb21wYXJhdG9yPEFjY291bnRHcm91cEluY2x1ZGU+KCkgewotICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGUgbzEsCi0gICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZSBvMikgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgYSA9IGdpYy5nZXQobzEuZ2V0SW5jbHVkZUlkKCkpOwotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgYiA9IGdpYy5nZXQobzIuZ2V0SW5jbHVkZUlkKCkpOworICAgIENvbGxlY3Rpb25zLnNvcnQoZ3JvdXBzLCBuZXcgQ29tcGFyYXRvcjxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPigpIHsKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIG8xLAorICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgbzIpIHsKKyAgICAgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBhID0gZ2ljLmdldChvMS5nZXRJbmNsdWRlVVVJRCgpKTsKKyAgICAgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBiID0gZ2ljLmdldChvMi5nZXRJbmNsdWRlVVVJRCgpKTsKICAgICAgICAgcmV0dXJuIG4oYSkuY29tcGFyZVRvKG4oYikpOwogICAgICAgfQogCi0gICAgICBwcml2YXRlIFN0cmluZyBuKGZpbmFsIEFjY291bnRHcm91cCBhKSB7CisgICAgICBwcml2YXRlIFN0cmluZyBuIChHcm91cERlc2NyaXB0aW9uLkJhc2ljIGEpIHsKKyAgICAgICAgaWYgKGEgPT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCiAgICAgICAgIFN0cmluZyBuID0gYS5nZXROYW1lKCk7CiAgICAgICAgIGlmIChuICE9IG51bGwgJiYgbi5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgfQotCi0gICAgICAgIG4gPSBhLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGlmIChuICE9IG51bGwgJiYgbi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhLmdldElkKCkudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGEuZ2V0R3JvdXBVVUlEKCkuZ2V0KCk7CiAgICAgICB9CiAgICAgfSk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cEluY2x1ZGVDYWNoZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5jbHVkZUNhY2hlLmphdmEKaW5kZXggNDMyYThiOC4uZDEzMDI0MyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5jbHVkZUNhY2hlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5jbHVkZUNhY2hlLmphdmEKQEAgLTE2LDEyICsxNiwxOSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKiBUcmFja3MgZ3JvdXAgaW5jbHVzaW9ucyBpbiBtZW1vcnkgZm9yIGVmZmljaWVudCBhY2Nlc3MuICovCiBwdWJsaWMgaW50ZXJmYWNlIEdyb3VwSW5jbHVkZUNhY2hlIHsKLSAgcHVibGljIENvbGxlY3Rpb248QWNjb3VudEdyb3VwLlVVSUQ+IGdldEJ5SW5jbHVkZShBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKTsKKyAgLyoqIEByZXR1cm4gZ3JvdXBzIGRpcmVjdGx5IGEgbWVtYmVyIG9mIHRoZSBwYXNzZWQgZ3JvdXAuICovCisgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IG1lbWJlcnNPZihBY2NvdW50R3JvdXAuVVVJRCBncm91cCk7CiAKLSAgcHVibGljIHZvaWQgZXZpY3RJbmNsdWRlKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpOworICAvKiogQHJldHVybiBhbnkgZ3JvdXBzIHRoZSBwYXNzZWQgZ3JvdXAgYmVsb25ncyB0by4gKi8KKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gbWVtYmVySW4oQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCk7CisKKyAgLyoqIEByZXR1cm4gc2V0IG9mIGFueSBVVUlEcyB0aGF0IGFyZSBub3QgaW50ZXJuYWwgZ3JvdXBzLiAqLworICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBhbGxFeHRlcm5hbE1lbWJlcnMoKTsKKworICBwdWJsaWMgdm9pZCBldmljdE1lbWJlcnNPZihBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKTsKKyAgcHVibGljIHZvaWQgZXZpY3RNZW1iZXJJbihBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5jbHVkZUNhY2hlSW1wbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5jbHVkZUNhY2hlSW1wbC5qYXZhCmluZGV4IDdmYmJhNDUuLmJiY2RmYWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cEluY2x1ZGVDYWNoZUltcGwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmNsdWRlQ2FjaGVJbXBsLmphdmEKQEAgLTE5LDcgKzE5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNhY2hlLkNhY2hlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwpAQCAtMzIsNyArMzIsNiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTQ0LDYgKzQzLDggQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkKICAgICAgIC5nZXRMb2dnZXIoR3JvdXBJbmNsdWRlQ2FjaGVJbXBsLmNsYXNzKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJZSU5DTFVERV9OQU1FID0gImdyb3Vwc19ieWluY2x1ZGUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVNQkVSU19OQU1FID0gImdyb3Vwc19tZW1iZXJzIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX05BTUUgPSAiZ3JvdXBzX2V4dGVybmFsIjsKIAogICBwdWJsaWMgc3RhdGljIE1vZHVsZSBtb2R1bGUoKSB7CiAgICAgcmV0dXJuIG5ldyBDYWNoZU1vZHVsZSgpIHsKQEAgLTUyLDcgKzUzLDE3IEBACiAgICAgICAgIGNhY2hlKEJZSU5DTFVERV9OQU1FLAogICAgICAgICAgICAgQWNjb3VudEdyb3VwLlVVSUQuY2xhc3MsCiAgICAgICAgICAgICBuZXcgVHlwZUxpdGVyYWw8U2V0PEFjY291bnRHcm91cC5VVUlEPj4oKSB7fSkKLSAgICAgICAgICAubG9hZGVyKEJ5SW5jbHVkZUxvYWRlci5jbGFzcyk7CisgICAgICAgICAgLmxvYWRlcihNZW1iZXJJbkxvYWRlci5jbGFzcyk7CisKKyAgICAgICAgY2FjaGUoTUVNQkVSU19OQU1FLAorICAgICAgICAgICAgQWNjb3VudEdyb3VwLlVVSUQuY2xhc3MsCisgICAgICAgICAgICBuZXcgVHlwZUxpdGVyYWw8U2V0PEFjY291bnRHcm91cC5VVUlEPj4oKSB7fSkKKyAgICAgICAgICAubG9hZGVyKE1lbWJlcnNPZkxvYWRlci5jbGFzcyk7CisKKyAgICAgICAgY2FjaGUoRVhURVJOQUxfTkFNRSwKKyAgICAgICAgICAgIFN0cmluZy5jbGFzcywKKyAgICAgICAgICAgIG5ldyBUeXBlTGl0ZXJhbDxTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PigpIHt9KQorICAgICAgICAgIC5sb2FkZXIoQWxsRXh0ZXJuYWxMb2FkZXIuY2xhc3MpOwogCiAgICAgICAgIGJpbmQoR3JvdXBJbmNsdWRlQ2FjaGVJbXBsLmNsYXNzKTsKICAgICAgICAgYmluZChHcm91cEluY2x1ZGVDYWNoZS5jbGFzcykudG8oR3JvdXBJbmNsdWRlQ2FjaGVJbXBsLmNsYXNzKTsKQEAgLTYwLDM1ICs3MSw3NCBAQAogICAgIH07CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIExvYWRpbmdDYWNoZTxBY2NvdW50R3JvdXAuVVVJRCwgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gYnlJbmNsdWRlOworICBwcml2YXRlIGZpbmFsIExvYWRpbmdDYWNoZTxBY2NvdW50R3JvdXAuVVVJRCwgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gbWVtYmVyc09mOworICBwcml2YXRlIGZpbmFsIExvYWRpbmdDYWNoZTxBY2NvdW50R3JvdXAuVVVJRCwgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gbWVtYmVySW47CisgIHByaXZhdGUgZmluYWwgTG9hZGluZ0NhY2hlPFN0cmluZywgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gZXh0ZXJuYWw7CiAKICAgQEluamVjdAogICBHcm91cEluY2x1ZGVDYWNoZUltcGwoCi0gICAgICBATmFtZWQoQllJTkNMVURFX05BTUUpIExvYWRpbmdDYWNoZTxBY2NvdW50R3JvdXAuVVVJRCwgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gYnlJbmNsdWRlKSB7Ci0gICAgdGhpcy5ieUluY2x1ZGUgPSBieUluY2x1ZGU7CisgICAgICBATmFtZWQoTUVNQkVSU19OQU1FKSBMb2FkaW5nQ2FjaGU8QWNjb3VudEdyb3VwLlVVSUQsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4+IG1lbWJlcnNPZiwKKyAgICAgIEBOYW1lZChCWUlOQ0xVREVfTkFNRSkgTG9hZGluZ0NhY2hlPEFjY291bnRHcm91cC5VVUlELCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBtZW1iZXJJbiwKKyAgICAgIEBOYW1lZChFWFRFUk5BTF9OQU1FKSBMb2FkaW5nQ2FjaGU8U3RyaW5nLCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+PiBleHRlcm5hbCkgeworICAgIHRoaXMubWVtYmVyc09mID0gbWVtYmVyc09mOworICAgIHRoaXMubWVtYmVySW4gPSBtZW1iZXJJbjsKKyAgICB0aGlzLmV4dGVybmFsID0gZXh0ZXJuYWw7CiAgIH0KIAotICBwdWJsaWMgQ29sbGVjdGlvbjxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0QnlJbmNsdWRlKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpIHsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IG1lbWJlcnNPZihBY2NvdW50R3JvdXAuVVVJRCBncm91cElkKSB7CiAgICAgdHJ5IHsKLSAgICAgIHJldHVybiBieUluY2x1ZGUuZ2V0KGdyb3VwSWQpOworICAgICAgcmV0dXJuIG1lbWJlcnNPZi5nZXQoZ3JvdXBJZCk7CisgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy53YXJuKCJDYW5ub3QgbG9hZCBtZW1iZXJzIG9mIGdyb3VwIiwgZSk7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gbWVtYmVySW4oQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gbWVtYmVySW4uZ2V0KGdyb3VwSWQpOwogICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cud2FybigiQ2Fubm90IGxvYWQgaW5jbHVkZWQgZ3JvdXBzIiwgZSk7CiAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKICAgICB9CiAgIH0KIAotICBwdWJsaWMgdm9pZCBldmljdEluY2x1ZGUoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCkgeworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZXZpY3RNZW1iZXJzT2YoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCkgewogICAgIGlmIChncm91cElkICE9IG51bGwpIHsKLSAgICAgIGJ5SW5jbHVkZS5pbnZhbGlkYXRlKGdyb3VwSWQpOworICAgICAgbWVtYmVyc09mLmludmFsaWRhdGUoZ3JvdXBJZCk7CiAgICAgfQogICB9CiAKLSAgc3RhdGljIGNsYXNzIEJ5SW5jbHVkZUxvYWRlciBleHRlbmRzCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBldmljdE1lbWJlckluKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQpIHsKKyAgICBpZiAoZ3JvdXBJZCAhPSBudWxsKSB7CisgICAgICBtZW1iZXJJbi5pbnZhbGlkYXRlKGdyb3VwSWQpOworCisgICAgICBpZiAoIUFjY291bnRHcm91cC5pc0ludGVybmFsR3JvdXAoZ3JvdXBJZCkpIHsKKyAgICAgICAgZXh0ZXJuYWwuaW52YWxpZGF0ZShFWFRFUk5BTF9OQU1FKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gYWxsRXh0ZXJuYWxNZW1iZXJzKCkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gZXh0ZXJuYWwuZ2V0KEVYVEVSTkFMX05BTUUpOworICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cud2FybigiQ2Fubm90IGxvYWQgc2V0IG9mIG5vbi1pbnRlcm5hbCBncm91cHMiLCBlKTsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBNZW1iZXJzT2ZMb2FkZXIgZXh0ZW5kcwogICAgICAgQ2FjaGVMb2FkZXI8QWNjb3VudEdyb3VwLlVVSUQsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4+IHsKICAgICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYTsKIAogICAgIEBJbmplY3QKLSAgICBCeUluY2x1ZGVMb2FkZXIoZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YpIHsKKyAgICBNZW1iZXJzT2ZMb2FkZXIoZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YpIHsKICAgICAgIHNjaGVtYSA9IHNmOwogICAgIH0KIApAQCAtMTAxLDkgKzE1MSwzNCBAQAogICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICAgICAgICB9CiAKKyAgICAgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpZHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgICAgZm9yIChBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGFnaSA6IGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkKKyAgICAgICAgICAgIC5ieUdyb3VwKGdyb3VwLmdldCgwKS5nZXRJZCgpKSkgeworICAgICAgICAgIGlkcy5hZGQoYWdpLmdldEluY2x1ZGVVVUlEKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKGlkcyk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBNZW1iZXJJbkxvYWRlciBleHRlbmRzCisgICAgICBDYWNoZUxvYWRlcjxBY2NvdW50R3JvdXAuVVVJRCwgU2V0PEFjY291bnRHcm91cC5VVUlEPj4geworICAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOworCisgICAgQEluamVjdAorICAgIE1lbWJlckluTG9hZGVyKGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNmKSB7CisgICAgICBzY2hlbWEgPSBzZjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBsb2FkKEFjY291bnRHcm91cC5VVUlEIGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBSZXZpZXdEYiBkYiA9IHNjaGVtYS5vcGVuKCk7CisgICAgICB0cnkgewogICAgICAgICBTZXQ8QWNjb3VudEdyb3VwLklkPiBpZHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKLSAgICAgICAgZm9yIChBY2NvdW50R3JvdXBJbmNsdWRlIGFnaSA6IGRiLmFjY291bnRHcm91cEluY2x1ZGVzKCkKLSAgICAgICAgICAgIC5ieUluY2x1ZGUoZ3JvdXAuZ2V0KDApLmdldElkKCkpKSB7CisgICAgICAgIGZvciAoQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBhZ2kgOiBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpCisgICAgICAgICAgICAuYnlJbmNsdWRlVVVJRChrZXkpKSB7CiAgICAgICAgICAgaWRzLmFkZChhZ2kuZ2V0R3JvdXBJZCgpKTsKICAgICAgICAgfQogCkBAIC0xMTcsNCArMTkyLDMwIEBACiAgICAgICB9CiAgICAgfQogICB9CisKKyAgc3RhdGljIGNsYXNzIEFsbEV4dGVybmFsTG9hZGVyIGV4dGVuZHMKKyAgICAgIENhY2hlTG9hZGVyPFN0cmluZywgU2V0PEFjY291bnRHcm91cC5VVUlEPj4geworICAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOworCisgICAgQEluamVjdAorICAgIEFsbEV4dGVybmFsTG9hZGVyKGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNmKSB7CisgICAgICBzY2hlbWEgPSBzZjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBsb2FkKFN0cmluZyBrZXkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgZmluYWwgUmV2aWV3RGIgZGIgPSBzY2hlbWEub3BlbigpOworICAgICAgdHJ5IHsKKyAgICAgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpZHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgICAgZm9yIChBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGFnaSA6IGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkuYWxsKCkpIHsKKyAgICAgICAgICBpZiAoIUFjY291bnRHcm91cC5pc0ludGVybmFsR3JvdXAoYWdpLmdldEluY2x1ZGVVVUlEKCkpKSB7CisgICAgICAgICAgICBpZHMuYWRkKGFnaS5nZXRJbmNsdWRlVVVJRCgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoaWRzKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICB9CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmZvQ2FjaGVGYWN0b3J5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBJbmZvQ2FjaGVGYWN0b3J5LmphdmEKaW5kZXggMTlkOTUzZC4uZTM0NjgwMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwSW5mb0NhY2hlRmFjdG9yeS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cEluZm9DYWNoZUZhY3RvcnkuamF2YQpAQCAtMTQsMTQgKzE0LDEyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBJbmZvQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKiBFZmZpY2llbnRseSBidWlsZHMgYSB7QGxpbmsgR3JvdXBJbmZvQ2FjaGV9LiAqLwpAQCAtMzAsNDYgKzI4LDM1IEBACiAgICAgR3JvdXBJbmZvQ2FjaGVGYWN0b3J5IGNyZWF0ZSgpOwogICB9CiAKLSAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7Ci0gIHByaXZhdGUgZmluYWwgTWFwPEFjY291bnRHcm91cC5JZCwgQWNjb3VudEdyb3VwPiBvdXQ7CisgIHByaXZhdGUgZmluYWwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZDsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEdyb3VwRGVzY3JpcHRpb24uQmFzaWM+IG91dDsKIAogICBASW5qZWN0Ci0gIEdyb3VwSW5mb0NhY2hlRmFjdG9yeShmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUpIHsKLSAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOwotICAgIHRoaXMub3V0ID0gbmV3IEhhc2hNYXA8QWNjb3VudEdyb3VwLklkLCBBY2NvdW50R3JvdXA+KCk7CisgIEdyb3VwSW5mb0NhY2hlRmFjdG9yeShHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kKSB7CisgICAgdGhpcy5ncm91cEJhY2tlbmQgPSBncm91cEJhY2tlbmQ7CisgICAgdGhpcy5vdXQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKICAgfQogCiAgIC8qKgogICAgKiBJbmRpY2F0ZSBhIGdyb3VwIHdpbGwgYmUgbmVlZGVkIGxhdGVyIG9uLgogICAgKgotICAgKiBAcGFyYW0gaWQgaWRlbnRpdHkgdGhhdCB3aWxsIGJlIG5lZWRlZCBpbiB0aGUgZnV0dXJlOyBtYXkgYmUgbnVsbC4KKyAgICogQHBhcmFtIHV1aWQgaWRlbnRpdHkgdGhhdCB3aWxsIGJlIG5lZWRlZCBpbiB0aGUgZnV0dXJlOyBtYXkgYmUgbnVsbC4KICAgICovCi0gIHB1YmxpYyB2b2lkIHdhbnQoZmluYWwgQWNjb3VudEdyb3VwLklkIGlkKSB7Ci0gICAgaWYgKGlkICE9IG51bGwgJiYgIW91dC5jb250YWluc0tleShpZCkpIHsKLSAgICAgIG91dC5wdXQoaWQsIGdyb3VwQ2FjaGUuZ2V0KGlkKSk7CisgIHB1YmxpYyB2b2lkIHdhbnQoZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkgeworICAgIGlmICh1dWlkICE9IG51bGwgJiYgIW91dC5jb250YWluc0tleSh1dWlkKSkgeworICAgICAgb3V0LnB1dCh1dWlkLCBncm91cEJhY2tlbmQuZ2V0KHV1aWQpKTsKICAgICB9CiAgIH0KIAogICAvKiogSW5kaWNhdGUgb25lIG9yIG1vcmUgZ3JvdXBzIHdpbGwgYmUgbmVlZGVkIGxhdGVyIG9uLiAqLwotICBwdWJsaWMgdm9pZCB3YW50KGZpbmFsIEl0ZXJhYmxlPEFjY291bnRHcm91cC5JZD4gaWRzKSB7Ci0gICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXAuSWQgaWQgOiBpZHMpIHsKLSAgICAgIHdhbnQoaWQpOworICBwdWJsaWMgdm9pZCB3YW50KGZpbmFsIEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiB1dWlkcykgeworICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA6IHV1aWRzKSB7CisgICAgICB3YW50KHV1aWQpOwogICAgIH0KICAgfQogCi0gIHB1YmxpYyBBY2NvdW50R3JvdXAgZ2V0KGZpbmFsIEFjY291bnRHcm91cC5JZCBpZCkgewotICAgIHdhbnQoaWQpOwotICAgIHJldHVybiBvdXQuZ2V0KGlkKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYW4gR3JvdXBJbmZvQ2FjaGUgd2l0aCB0aGUgY3VycmVudGx5IGxvYWRlZCBBY2NvdW50R3JvdXAgZW50aXRpZXMuCi0gICAqICovCi0gIHB1YmxpYyBHcm91cEluZm9DYWNoZSBjcmVhdGUoKSB7Ci0gICAgZmluYWwgTGlzdDxHcm91cEluZm8+IHIgPSBuZXcgQXJyYXlMaXN0PEdyb3VwSW5mbz4ob3V0LnNpemUoKSk7Ci0gICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXAgYSA6IG91dC52YWx1ZXMoKSkgewotICAgICAgci5hZGQobmV3IEdyb3VwSW5mbyhhKSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgR3JvdXBJbmZvQ2FjaGUocik7CisgIHB1YmxpYyBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdldChmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCB1dWlkKSB7CisgICAgd2FudCh1dWlkKTsKKyAgICByZXR1cm4gb3V0LmdldCh1dWlkKTsKICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cE1lbWJlcnMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cE1lbWJlcnMuamF2YQppbmRleCA4NDI4MmI1Li4wOGNmMWE3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBNZW1iZXJzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwTWVtYmVycy5qYXZhCkBAIC0xOCwxNCArMTgsMTUgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0zMywyMSArMzQsMjEgQEAKIAogcHVibGljIGNsYXNzIEdyb3VwTWVtYmVycyB7CiAgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgR3JvdXBNZW1iZXJzIGNyZWF0ZSgpOworICAgIEdyb3VwTWVtYmVycyBjcmVhdGUoQ3VycmVudFVzZXIgY3VycmVudFVzZXIpOwogICB9CiAKICAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CiAgIHByaXZhdGUgZmluYWwgR3JvdXBEZXRhaWxGYWN0b3J5LkZhY3RvcnkgZ3JvdXBEZXRhaWxGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CiAgIHByaXZhdGUgZmluYWwgUHJvamVjdENvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgcHJvamVjdENvbnRyb2w7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7CisgIHByaXZhdGUgZmluYWwgQ3VycmVudFVzZXIgY3VycmVudFVzZXI7CiAKICAgQEluamVjdAogICBHcm91cE1lbWJlcnMoZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlLAogICAgICAgZmluYWwgR3JvdXBEZXRhaWxGYWN0b3J5LkZhY3RvcnkgZ3JvdXBEZXRhaWxGYWN0b3J5LAogICAgICAgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKICAgICAgIGZpbmFsIFByb2plY3RDb250cm9sLkdlbmVyaWNGYWN0b3J5IHByb2plY3RDb250cm9sLAotICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIpIHsKKyAgICAgIEBBc3Npc3RlZCBmaW5hbCBDdXJyZW50VXNlciBjdXJyZW50VXNlcikgewogICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7CiAgICAgdGhpcy5ncm91cERldGFpbEZhY3RvcnkgPSBncm91cERldGFpbEZhY3Rvcnk7CiAgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7CkBAIC0xMTEsMTAgKzExMiwxMCBAQAogICAgICAgfQogICAgIH0KICAgICBpZiAoZ3JvdXBEZXRhaWwuaW5jbHVkZXMgIT0gbnVsbCkgewotICAgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlIGdyb3VwSW5jbHVkZSA6IGdyb3VwRGV0YWlsLmluY2x1ZGVzKSB7CisgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgZ3JvdXBJbmNsdWRlIDogZ3JvdXBEZXRhaWwuaW5jbHVkZXMpIHsKICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwIGluY2x1ZGVkR3JvdXAgPQotICAgICAgICAgICAgZ3JvdXBDYWNoZS5nZXQoZ3JvdXBJbmNsdWRlLmdldEluY2x1ZGVJZCgpKTsKLSAgICAgICAgaWYgKCFzZWVuLmNvbnRhaW5zKGluY2x1ZGVkR3JvdXAuZ2V0R3JvdXBVVUlEKCkpKSB7CisgICAgICAgICAgICBncm91cENhY2hlLmdldChncm91cEluY2x1ZGUuZ2V0SW5jbHVkZVVVSUQoKSk7CisgICAgICAgIGlmIChpbmNsdWRlZEdyb3VwICE9IG51bGwgJiYgIXNlZW4uY29udGFpbnMoaW5jbHVkZWRHcm91cC5nZXRHcm91cFVVSUQoKSkpIHsKICAgICAgICAgICBtZW1iZXJzLmFkZEFsbChsaXN0QWNjb3VudHMoaW5jbHVkZWRHcm91cC5nZXRHcm91cFVVSUQoKSwgcHJvamVjdCwgc2VlbikpOwogICAgICAgICB9CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBNZW1iZXJzaGlwLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvR3JvdXBNZW1iZXJzaGlwLmphdmEKaW5kZXggZDUzNmMwOS4uZDdhOTdmYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0dyb3VwTWVtYmVyc2hpcC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Hcm91cE1lbWJlcnNoaXAuamF2YQpAQCAtNDAsNiArNDAsMjAgQEAKICAgYm9vbGVhbiBjb250YWluc0FueU9mKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiBncm91cElkcyk7CiAKICAgLyoqCisgICAqIFJldHVybnMgYSBzZXQgY29udGFpbmluZyBhbiBpbnB1dCBtZW1iZXIgb2Yge0Bjb2RlIGNvbnRhaW5zKGlkKX0gaXMgdHJ1ZS4KKyAgICogPHA+CisgICAqIFRoaXMgaXMgYmF0Y2ggZm9ybSBvZiBjb250YWlucyB0aGF0IHJldHVybnMgc3BlY2lmaWMgZ3JvdXAgaW5mb3JtYXRpb24uCisgICAqIEltcGxlbWVudG9ycyBtYXkgaW1wbGVtZW50IHRoZSBtZXRob2QgYXM6CisgICAqCisgICAqIDxwcmU+CisgICAqIFNldCZsdDtBY2NvdW50R3JvdXAuVVVJRCZndDsgciA9IFNldHMubmV3SGFzaFNldCgpOworICAgKiBmb3IgKEFjY291bnRHcm91cC5VVUlEIGlkIDogZ3JvdXBJZHMpCisgICAqICAgaWYgKGNvbnRhaW5zKGlkKSkgci5hZGQoaWQpOworICAgKiA8L3ByZT4KKyAgICovCisgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gaW50ZXJzZWN0aW9uKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiBncm91cElkcyk7CisKKyAgLyoqCiAgICAqIFJldHVybnMgdGhlIHNldCBvZiBncm91cHMgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW1wbGVtZW50YXRpb24uCiAgICAqIFRoaXMgbWF5IG5vdCByZXR1cm4gYWxsIGdyb3VwcyB0aGUge0BsaW5rICNjb250YWlucyhBY2NvdW50R3JvdXAuVVVJRCl9CiAgICAqIHdvdWxkIHJldHVybiB7QGNvZGUgdHJ1ZX0gZm9yLCBidXQgd2lsbCBhdCBsZWFzdCBjb250YWluIGFsbCB0b3AgbGV2ZWwKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9JbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9JbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAuamF2YQppbmRleCBkNDQ4ZmZmLi5iMDIwZTIyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0luY2x1ZGluZ0dyb3VwTWVtYmVyc2hpcC5qYXZhCkBAIC0xNCwzNiArMTQsNDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqCi0gKiBDcmVhdGVzIGEgR3JvdXBNZW1iZXJzaGlwIGNoZWNrZXIgZm9yIHRoZSBpbnRlcm5hbCBncm91cCBzeXN0ZW0sIHdoaWNoCi0gKiBzdGFydHMgd2l0aCB0aGUgc2VlZCBncm91cHMgYW5kIGluY2x1ZGVzIGFsbCBjaGlsZCBncm91cHMuCisgKiBHcm91cCBtZW1iZXJzaGlwIGNoZWNrZXIgZm9yIHRoZSBpbnRlcm5hbCBncm91cCBzeXN0ZW0uCisgKiA8cD4KKyAqIEdyb3VwcyB0aGUgdXNlciBpcyBkaXJlY3RseSBhIG1lbWJlciBvZiBhcmUgcHVsbGVkIGZyb20gdGhlIGluLW1lbW9yeQorICogQWNjb3VudENhY2hlIGJ5IHdheSBvZiB0aGUgSWRlbnRpZmllZFVzZXIuIFRyYW5zaXRpdmUgZ3JvdXAgbWVtYmVyaGlwcyBhcmUKKyAqIHJlc29sdmVkIG9uIGRlbWFuZCBzdGFydGluZyBmcm9tIHRoZSByZXF1ZXN0ZWQgZ3JvdXAgYW5kIGxvb2tpbmcgZm9yIGEgcGF0aAorICogdG8gYSBncm91cCB0aGUgdXNlciBpcyBhIG1lbWJlciBvZi4gT3RoZXIgZ3JvdXAgYmFja2VuZHMgYXJlIHN1cHBvcnRlZCBieQorICogcmVjdXJzaXZlbHkgaW52b2tpbmcgdGhlIHVuaXZlcnNhbCBHcm91cE1lbWJlcnNoaXAuCiAgKi8KIHB1YmxpYyBjbGFzcyBJbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAgaW1wbGVtZW50cyBHcm91cE1lbWJlcnNoaXAgewogICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIEluY2x1ZGluZ0dyb3VwTWVtYmVyc2hpcCBjcmVhdGUoSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwSWRzKTsKKyAgICBJbmNsdWRpbmdHcm91cE1lbWJlcnNoaXAgY3JlYXRlKElkZW50aWZpZWRVc2VyIHVzZXIpOwogICB9CiAKLSAgcHJpdmF0ZSBmaW5hbCBHcm91cEluY2x1ZGVDYWNoZSBncm91cEluY2x1ZGVDYWNoZTsKLSAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGluY2x1ZGVzOwotICBwcml2YXRlIGZpbmFsIFF1ZXVlPEFjY291bnRHcm91cC5VVUlEPiBncm91cFF1ZXVlOworICBwcml2YXRlIGZpbmFsIEdyb3VwSW5jbHVkZUNhY2hlIGluY2x1ZGVDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyOworICBwcml2YXRlIGZpbmFsIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgQm9vbGVhbj4gbWVtYmVyT2Y7CisgIHByaXZhdGUgU2V0PEFjY291bnRHcm91cC5VVUlEPiBrbm93bkdyb3VwczsKIAogICBASW5qZWN0Ci0gIEluY2x1ZGluZ0dyb3VwTWVtYmVyc2hpcCgKLSAgICAgIEdyb3VwSW5jbHVkZUNhY2hlIGdyb3VwSW5jbHVkZUNhY2hlLAotICAgICAgQEFzc2lzdGVkIEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiBzZWVkR3JvdXBzKSB7Ci0gICAgdGhpcy5ncm91cEluY2x1ZGVDYWNoZSA9IGdyb3VwSW5jbHVkZUNhY2hlOwotICAgIHRoaXMuaW5jbHVkZXMgPSBTZXRzLm5ld0hhc2hTZXQoc2VlZEdyb3Vwcyk7Ci0gICAgdGhpcy5ncm91cFF1ZXVlID0gTGlzdHMubmV3TGlua2VkTGlzdChzZWVkR3JvdXBzKTsKKyAgSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwKEdyb3VwSW5jbHVkZUNhY2hlIGluY2x1ZGVDYWNoZSwKKyAgICAgIEBBc3Npc3RlZCBJZGVudGlmaWVkVXNlciB1c2VyKSB7CisgICAgdGhpcy5pbmNsdWRlQ2FjaGUgPSBpbmNsdWRlQ2FjaGU7CisgICAgdGhpcy51c2VyID0gdXNlcjsKKworICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzID0gdXNlci5zdGF0ZSgpLmdldEludGVybmFsR3JvdXBzKCk7CisgICAgbWVtYmVyT2YgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKGdyb3Vwcy5zaXplKCkpOworICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgZyA6IGdyb3VwcykgeworICAgICAgbWVtYmVyT2YucHV0KGcsIHRydWUpOworICAgIH0KICAgfQogCiAgIEBPdmVycmlkZQpAQCAtNTEsNDQgKzY0LDg3IEBACiAgICAgaWYgKGlkID09IG51bGwpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKGluY2x1ZGVzLmNvbnRhaW5zKGlkKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmaW5kSW5jbHVkZWRHcm91cChDb2xsZWN0aW9ucy5zaW5nbGV0b24oaWQpKTsKKworICAgIEJvb2xlYW4gYiA9IG1lbWJlck9mLmdldChpZCk7CisgICAgcmV0dXJuIGIgIT0gbnVsbCA/IGIgOiBjb250YWluc0FueU9mKEltbXV0YWJsZVNldC5vZihpZCkpOwogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQW55T2YoSXRlcmFibGU8QWNjb3VudEdyb3VwLlVVSUQ+IGlkcykgewotICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gcXVlcnkgPSBTZXRzLm5ld0hhc2hTZXQoKTsKLSAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIGdyb3VwSWQgOiBpZHMpIHsKLSAgICAgIGlmIChpbmNsdWRlcy5jb250YWlucyhncm91cElkKSkgeworICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FueU9mKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiBxdWVyeUlkcykgeworICAgIC8vIFByZWZlciBsb29rdXAgb2YgYSBjYWNoZWQgcmVzdWx0IG92ZXIgZXhwYW5kaW5nIGluY2x1ZGVzLgorICAgIGJvb2xlYW4gdHJ5RXhwYW5kaW5nID0gZmFsc2U7CisgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBpZCA6IHF1ZXJ5SWRzKSB7CisgICAgICBCb29sZWFuIGIgPSBtZW1iZXJPZi5nZXQoaWQpOworICAgICAgaWYgKGIgPT0gbnVsbCkgeworICAgICAgICB0cnlFeHBhbmRpbmcgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQotICAgICAgcXVlcnkuYWRkKGdyb3VwSWQpOwogICAgIH0KIAotICAgIHJldHVybiBmaW5kSW5jbHVkZWRHcm91cChxdWVyeSk7Ci0gIH0KKyAgICBpZiAodHJ5RXhwYW5kaW5nKSB7CisgICAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIGlkIDogcXVlcnlJZHMpIHsKKyAgICAgICAgaWYgKG1lbWJlck9mLmNvbnRhaW5zS2V5KGlkKSkgeworICAgICAgICAgIC8vIE1lbWJlcnNoaXAgd2FzIGVhcmxpZXIgcHJvdmVuIHRvIGJlIGZhbHNlLgorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLSAgcHJpdmF0ZSBib29sZWFuIGZpbmRJbmNsdWRlZEdyb3VwKFNldDxBY2NvdW50R3JvdXAuVVVJRD4gcXVlcnkpIHsKLSAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgd2hpbGUgKCFmb3VuZCAmJiAhZ3JvdXBRdWV1ZS5pc0VtcHR5KCkpIHsKLSAgICAgIEFjY291bnRHcm91cC5VVUlEIGlkID0gZ3JvdXBRdWV1ZS5yZW1vdmUoKTsKLQotICAgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBncm91cElkIDogZ3JvdXBJbmNsdWRlQ2FjaGUuZ2V0QnlJbmNsdWRlKGlkKSkgewotICAgICAgICBpZiAoaW5jbHVkZXMuYWRkKGdyb3VwSWQpKSB7Ci0gICAgICAgICAgZ3JvdXBRdWV1ZS5hZGQoZ3JvdXBJZCk7Ci0gICAgICAgICAgZm91bmQgfD0gcXVlcnkuY29udGFpbnMoZ3JvdXBJZCk7CisgICAgICAgIG1lbWJlck9mLnB1dChpZCwgZmFsc2UpOworICAgICAgICBpZiAoc2VhcmNoKGluY2x1ZGVDYWNoZS5tZW1iZXJzT2YoaWQpKSkgeworICAgICAgICAgIG1lbWJlck9mLnB1dChpZCwgdHJ1ZSk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gZm91bmQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGludGVyc2VjdGlvbihJdGVyYWJsZTxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBJZHMpIHsKKyAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IHIgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIGlkIDogZ3JvdXBJZHMpIHsKKyAgICAgIGlmIChjb250YWlucyhpZCkpIHsKKyAgICAgICAgci5hZGQoaWQpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBzZWFyY2goU2V0PEFjY291bnRHcm91cC5VVUlEPiBpZHMpIHsKKyAgICByZXR1cm4gdXNlci5nZXRFZmZlY3RpdmVHcm91cHMoKS5jb250YWluc0FueU9mKGlkcyk7CisgIH0KKworICBwcml2YXRlIEltbXV0YWJsZVNldDxBY2NvdW50R3JvdXAuVVVJRD4gY29tcHV0ZUtub3duR3JvdXBzKCkgeworICAgIEdyb3VwTWVtYmVyc2hpcCBtZW1iZXJzaGlwID0gdXNlci5nZXRFZmZlY3RpdmVHcm91cHMoKTsKKyAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGRpcmVjdCA9IHVzZXIuc3RhdGUoKS5nZXRJbnRlcm5hbEdyb3VwcygpOworICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gciA9IFNldHMubmV3SGFzaFNldChkaXJlY3QpOworICAgIExpc3Q8QWNjb3VudEdyb3VwLlVVSUQ+IHEgPSBMaXN0cy5uZXdBcnJheUxpc3Qocik7CisKKyAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIGcgOiBtZW1iZXJzaGlwLmludGVyc2VjdGlvbigKKyAgICAgICAgaW5jbHVkZUNhY2hlLmFsbEV4dGVybmFsTWVtYmVycygpKSkgeworICAgICAgaWYgKHIuYWRkKGcpKSB7CisgICAgICAgIHEuYWRkKGcpOworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICghcS5pc0VtcHR5KCkpIHsKKyAgICAgIEFjY291bnRHcm91cC5VVUlEIGlkID0gcS5yZW1vdmUocS5zaXplKCkgLSAxKTsKKyAgICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgZyA6IGluY2x1ZGVDYWNoZS5tZW1iZXJJbihpZCkpIHsKKyAgICAgICAgaWYgKHIuYWRkKGcpKSB7CisgICAgICAgICAgcS5hZGQoZyk7CisgICAgICAgICAgbWVtYmVyT2YucHV0KGcsIHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKHIpOwogICB9CiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdldEtub3duR3JvdXBzKCkgewotICAgIGZpbmRJbmNsdWRlZEdyb3VwKENvbGxlY3Rpb25zLjxBY2NvdW50R3JvdXAuVVVJRD5lbXB0eVNldCgpKTsgLy8gZmluZCBhbGwKLSAgICByZXR1cm4gU2V0cy5uZXdIYXNoU2V0KGluY2x1ZGVzKTsKKyAgICBpZiAoa25vd25Hcm91cHMgPT0gbnVsbCkgeworICAgICAga25vd25Hcm91cHMgPSBjb21wdXRlS25vd25Hcm91cHMoKTsKKyAgICB9CisgICAgcmV0dXJuIGtub3duR3JvdXBzOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvSW50ZXJuYWxHcm91cEJhY2tlbmQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9JbnRlcm5hbEdyb3VwQmFja2VuZC5qYXZhCmluZGV4IGFkNjU0OTkuLmQwNmRiNGQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9JbnRlcm5hbEdyb3VwQmFja2VuZC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9JbnRlcm5hbEdyb3VwQmFja2VuZC5qYXZhCkBAIC0yOCw5ICsyOCw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBHcm91cEJhY2tlbmQgZm9yIHRoZSBpbnRlcm5hbCBncm91cCBzeXN0ZW0uCi0gKi8KKy8qKiBJbXBsZW1lbnRhdGlvbiBvZiBHcm91cEJhY2tlbmQgZm9yIHRoZSBpbnRlcm5hbCBncm91cCBzeXN0ZW0uICovCiBAU2luZ2xldG9uCiBwdWJsaWMgY2xhc3MgSW50ZXJuYWxHcm91cEJhY2tlbmQgaW1wbGVtZW50cyBHcm91cEJhY2tlbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbjxBY2NvdW50R3JvdXAsIEdyb3VwUmVmZXJlbmNlPiBBQ1RfR1JPVVBfVE9fR1JPVVBfUkVGID0KQEAgLTQ1LDcgKzQzLDYgQEAKICAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CiAgIHByaXZhdGUgZmluYWwgSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwLkZhY3RvcnkgZ3JvdXBNZW1iZXJzaGlwRmFjdG9yeTsKIAotCiAgIEBJbmplY3QKICAgSW50ZXJuYWxHcm91cEJhY2tlbmQoR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSwKICAgICAgIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZSwKQEAgLTg5LDYgKzg2LDYgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIEdyb3VwTWVtYmVyc2hpcCBtZW1iZXJzaGlwc09mKElkZW50aWZpZWRVc2VyIHVzZXIpIHsKLSAgICByZXR1cm4gZ3JvdXBNZW1iZXJzaGlwRmFjdG9yeS5jcmVhdGUodXNlci5zdGF0ZSgpLmdldEludGVybmFsR3JvdXBzKCkpOworICAgIHJldHVybiBncm91cE1lbWJlcnNoaXBGYWN0b3J5LmNyZWF0ZSh1c2VyKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0xpc3RHcm91cE1lbWJlcnNoaXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9MaXN0R3JvdXBNZW1iZXJzaGlwLmphdmEKaW5kZXggMzQ2ZjQwNi4uMTE4OTQwZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L0xpc3RHcm91cE1lbWJlcnNoaXAuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvTGlzdEdyb3VwTWVtYmVyc2hpcC5qYXZhCkBAIC0yNCw3ICsyNCw2IEBACiAgKiBHcm91cE1lbWJlcnNoaXAgb3ZlciBhbiBleHBsaWNpdCBsaXN0LgogICovCiBwdWJsaWMgY2xhc3MgTGlzdEdyb3VwTWVtYmVyc2hpcCBpbXBsZW1lbnRzIEdyb3VwTWVtYmVyc2hpcCB7Ci0KICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwczsKIAogICBwdWJsaWMgTGlzdEdyb3VwTWVtYmVyc2hpcChJdGVyYWJsZTxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBJZHMpIHsKQEAgLTQ3LDYgKzQ2LDExIEBACiAgIH0KIAogICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gaW50ZXJzZWN0aW9uKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiBncm91cElkcykgeworICAgIHJldHVybiBTZXRzLmludGVyc2VjdGlvbihJbW11dGFibGVTZXQuY29weU9mKGdyb3VwSWRzKSwgZ3JvdXBzKTsKKyAgfQorCisgIEBPdmVycmlkZQogICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBnZXRLbm93bkdyb3VwcygpIHsKICAgICByZXR1cm4gU2V0cy5uZXdIYXNoU2V0KGdyb3Vwcyk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Nb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Nb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA0NWY3NWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L01vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50UmVzb3VyY2UuQUNDT1VOVF9LSU5EOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50UmVzb3VyY2UuQ0FQQUJJTElUWV9LSU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdEFwaU1vZHVsZTsKKworcHVibGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIFJlc3RBcGlNb2R1bGUgeworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgIGJpbmQoQWNjb3VudHNDb2xsZWN0aW9uLmNsYXNzKTsKKyAgICBiaW5kKENhcGFiaWxpdGllcy5jbGFzcyk7CisKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBBQ0NPVU5UX0tJTkQpOworICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIENBUEFCSUxJVFlfS0lORCk7CisKKyAgICBnZXQoQUNDT1VOVF9LSU5EKS50byhHZXRBY2NvdW50LmNsYXNzKTsKKyAgICBnZXQoQUNDT1VOVF9LSU5ELCAiYXZhdGFyIikudG8oR2V0QXZhdGFyLmNsYXNzKTsKKyAgICBjaGlsZChBQ0NPVU5UX0tJTkQsICJjYXBhYmlsaXRpZXMiKS50byhDYXBhYmlsaXRpZXMuY2xhc3MpOworICAgIGdldChBQ0NPVU5UX0tJTkQsICJncm91cHMiKS50byhHZXRHcm91cHMuY2xhc3MpOworICAgIGdldChDQVBBQklMSVRZX0tJTkQpLnRvKEdldENhcGFiaWxpdGllcy5DaGVja09uZS5jbGFzcyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9QZXJmb3JtQ3JlYXRlR3JvdXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9QZXJmb3JtQ3JlYXRlR3JvdXAuamF2YQppbmRleCAxZmYxYTNlLi44Yjk2NmNiIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvUGVyZm9ybUNyZWF0ZUdyb3VwLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1BlcmZvcm1DcmVhdGVHcm91cC5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5QZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVBdWRpdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlckF1ZGl0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBOYW1lOwpAQCAtMzUsNyArMzUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBwdWJsaWMgY2xhc3MgUGVyZm9ybUNyZWF0ZUdyb3VwIHsKQEAgLTg1LDExICs4NCwxMSBAQAogICAgKiAgICAgICAgIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgICogQHRocm93cyBQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIHVzZXIgY2Fubm90IGNyZWF0ZSBhIGdyb3VwLgogICAgKi8KLSAgcHVibGljIEFjY291bnRHcm91cC5JZCBjcmVhdGVHcm91cChmaW5hbCBTdHJpbmcgZ3JvdXBOYW1lLAorICBwdWJsaWMgQWNjb3VudEdyb3VwIGNyZWF0ZUdyb3VwKGZpbmFsIFN0cmluZyBncm91cE5hbWUsCiAgICAgICBmaW5hbCBTdHJpbmcgZ3JvdXBEZXNjcmlwdGlvbiwgZmluYWwgYm9vbGVhbiB2aXNpYmxlVG9BbGwsCiAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAuSWQgb3duZXJHcm91cElkLAogICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWNjb3VudC5JZD4gaW5pdGlhbE1lbWJlcnMsCi0gICAgICBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY2NvdW50R3JvdXAuSWQ+IGluaXRpYWxHcm91cHMpCisgICAgICBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY2NvdW50R3JvdXAuVVVJRD4gaW5pdGlhbEdyb3VwcykKICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbiwgUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiB7CiAgICAgaWYgKCFjdXJyZW50VXNlci5nZXRDYXBhYmlsaXRpZXMoKS5jYW5DcmVhdGVHcm91cCgpKSB7CiAgICAgICB0aHJvdyBuZXcgUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KApAQCAtMTIxLDcgKzEyMCw3IEBACiAgICAgdHJ5IHsKICAgICAgIGRiLmFjY291bnRHcm91cE5hbWVzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihnbikpOwogICAgIH0gY2F0Y2ggKE9ybUR1cGxpY2F0ZUtleUV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKCk7CisgICAgICB0aHJvdyBuZXcgTmFtZUFscmVhZHlVc2VkRXhjZXB0aW9uKGdyb3VwTmFtZSk7CiAgICAgfQogICAgIGRiLmFjY291bnRHcm91cHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGdyb3VwKSk7CiAKQEAgLTEyOSwxMSArMTI4LDEyIEBACiAKICAgICBpZiAoaW5pdGlhbEdyb3VwcyAhPSBudWxsKSB7CiAgICAgICBhZGRHcm91cHMoZ3JvdXBJZCwgaW5pdGlhbEdyb3Vwcyk7CisgICAgICBncm91cEluY2x1ZGVDYWNoZS5ldmljdE1lbWJlcnNPZih1dWlkKTsKICAgICB9CiAKICAgICBncm91cENhY2hlLm9uQ3JlYXRlR3JvdXAobmFtZUtleSk7CiAKLSAgICByZXR1cm4gZ3JvdXBJZDsKKyAgICByZXR1cm4gZ3JvdXA7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgYWRkTWVtYmVycyhmaW5hbCBBY2NvdW50R3JvdXAuSWQgZ3JvdXBJZCwKQEAgLTE2MCwyNiArMTYwLDI1IEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgYWRkR3JvdXBzKGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkLAotICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQWNjb3VudEdyb3VwLklkPiBncm91cHMpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZT4gaW5jbHVkZUxpc3QgPQotICAgICAgbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlPigpOwotICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0PiBpbmNsdWRlc0F1ZGl0ID0KLSAgICAgIG5ldyBBcnJheUxpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUF1ZGl0PigpOwotICAgIGZvciAoQWNjb3VudEdyb3VwLklkIGluY2x1ZGVJZCA6IGdyb3VwcykgewotICAgICAgZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZSBncm91cEluY2x1ZGUgPQotICAgICAgICBuZXcgQWNjb3VudEdyb3VwSW5jbHVkZShuZXcgQWNjb3VudEdyb3VwSW5jbHVkZS5LZXkoZ3JvdXBJZCwgaW5jbHVkZUlkKSk7CisgICAgICBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IGluY2x1ZGVMaXN0ID0KKyAgICAgIG5ldyBBcnJheUxpc3Q8QWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4oKTsKKyAgICBmaW5hbCBMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdD4gaW5jbHVkZXNBdWRpdCA9CisgICAgICBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdD4oKTsKKyAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIGluY2x1ZGVVVUlEIDogZ3JvdXBzKSB7CisgICAgICBmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGdyb3VwSW5jbHVkZSA9CisgICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkKG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleShncm91cElkLCBpbmNsdWRlVVVJRCkpOwogICAgICAgaW5jbHVkZUxpc3QuYWRkKGdyb3VwSW5jbHVkZSk7CiAKLSAgICAgIGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVBdWRpdCBhdWRpdCA9Ci0gICAgICAgIG5ldyBBY2NvdW50R3JvdXBJbmNsdWRlQXVkaXQoZ3JvdXBJbmNsdWRlLCBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CisgICAgICBmaW5hbCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQgYXVkaXQgPQorICAgICAgICBuZXcgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0KGdyb3VwSW5jbHVkZSwgY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCkpOwogICAgICAgaW5jbHVkZXNBdWRpdC5hZGQoYXVkaXQpOwogICAgIH0KLSAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlcygpLmluc2VydChpbmNsdWRlTGlzdCk7Ci0gICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNBdWRpdCgpLmluc2VydChpbmNsdWRlc0F1ZGl0KTsKKyAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpLmluc2VydChpbmNsdWRlTGlzdCk7CisgICAgZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWRBdWRpdCgpLmluc2VydChpbmNsdWRlc0F1ZGl0KTsKIAotICAgIGZvciAoQWNjb3VudEdyb3VwIGdyb3VwIDogZGIuYWNjb3VudEdyb3VwcygpLmdldCgKLSAgICAgICAgbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwLklkPihncm91cHMpKSkgewotICAgICAgZ3JvdXBJbmNsdWRlQ2FjaGUuZXZpY3RJbmNsdWRlKGdyb3VwLmdldEdyb3VwVVVJRCgpKTsKKyAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIHV1aWQgOiBncm91cHMpIHsKKyAgICAgIGdyb3VwSW5jbHVkZUNhY2hlLmV2aWN0TWVtYmVySW4odXVpZCk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvUGVyZm9ybVJlbmFtZUdyb3VwLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvUGVyZm9ybVJlbmFtZUdyb3VwLmphdmEKaW5kZXggNGM3MmQ0OS4uMzYyM2NjMyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1BlcmZvcm1SZW5hbWVHcm91cC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9QZXJmb3JtUmVuYW1lR3JvdXAuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZW5hbWVHcm91cE9wOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1EdXBsaWNhdGVLZXlFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTg5LDE3ICs4OCwyMSBAQAogICAgIHRyeSB7CiAgICAgICBmaW5hbCBBY2NvdW50R3JvdXBOYW1lIGlkID0gbmV3IEFjY291bnRHcm91cE5hbWUoa2V5LCBncm91cElkKTsKICAgICAgIGRiLmFjY291bnRHcm91cE5hbWVzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihpZCkpOwotICAgIH0gY2F0Y2ggKE9ybUR1cGxpY2F0ZUtleUV4Y2VwdGlvbiBkdXBlRXJyKSB7Ci0gICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhpcyBpZGVudGl0eSwgZG9uJ3QgcmVwb3J0IHRoZSBleGNlcHRpb24uCi0gICAgICAvLworICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CiAgICAgICBBY2NvdW50R3JvdXBOYW1lIG90aGVyID0gZGIuYWNjb3VudEdyb3VwTmFtZXMoKS5nZXQoa2V5KTsKLSAgICAgIGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyLmdldElkKCkuZXF1YWxzKGdyb3VwSWQpKSB7Ci0gICAgICAgIHJldHVybiBncm91cERldGFpbEZhY3RvcnkuY3JlYXRlKGdyb3VwSWQpLmNhbGwoKTsKLSAgICAgIH0KKyAgICAgIGlmIChvdGhlciAhPSBudWxsKSB7CisgICAgICAgIC8vIElmIHdlIGFyZSB1c2luZyB0aGlzIGlkZW50aXR5LCBkb24ndCByZXBvcnQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKG90aGVyLmdldElkKCkuZXF1YWxzKGdyb3VwSWQpKSB7CisgICAgICAgICAgcmV0dXJuIGdyb3VwRGV0YWlsRmFjdG9yeS5jcmVhdGUoZ3JvdXBJZCkuY2FsbCgpOworICAgICAgICB9CiAKLSAgICAgIC8vIE90aGVyd2lzZSwgc29tZW9uZSBlbHNlIGhhcyB0aGlzIGlkZW50aXR5LgotICAgICAgLy8KLSAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24oKTsKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBzb21lb25lIGVsc2UgaGFzIHRoaXMgaWRlbnRpdHkuCisgICAgICAgIC8vCisgICAgICAgIHRocm93IG5ldyBOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24obmV3TmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBlOworICAgICAgfQogICAgIH0KIAogICAgIGdyb3VwLnNldE5hbWVLZXkoa2V5KTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Vbml2ZXJzYWxHcm91cEJhY2tlbmQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYWNjb3VudC9Vbml2ZXJzYWxHcm91cEJhY2tlbmQuamF2YQppbmRleCAxOTc0OTYxLi5kOWM5MjU3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvVW5pdmVyc2FsR3JvdXBCYWNrZW5kLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1VuaXZlcnNhbEdyb3VwQmFja2VuZC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFycmF5TGlzdE11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CkBAIC0xMjgsMzQgKzEyOSw2MCBAQAogICAgICByZXR1cm4gbS5jb250YWlucyh1dWlkKTsKICAgIH0KIAotICAgQE92ZXJyaWRlCi0gICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FueU9mKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiB1dWlkcykgewotICAgICBNdWx0aW1hcDxHcm91cE1lbWJlcnNoaXAsIEFjY291bnRHcm91cC5VVUlEPiBsb29rdXBzID0KLSAgICAgICAgIEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOwotICAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIHV1aWQgOiB1dWlkcykgewotICAgICAgIEdyb3VwTWVtYmVyc2hpcCBtID0gbWVtYmVyc2hpcCh1dWlkKTsKLSAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICBsb2cud2FybigiVW5rbm93biBHcm91cE1lbWJlcnNoaXAgZm9yIFVVSUQ6ICIgKyB1dWlkKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgIH0KLSAgICAgICBsb29rdXBzLnB1dChtLCB1dWlkKTsKLSAgICAgfQotICAgICBmb3IgKE1hcC5FbnRyeTxHcm91cE1lbWJlcnNoaXAsIENvbGxlY3Rpb248QWNjb3VudEdyb3VwLlVVSUQ+PiBlbnRyeSA6Ci0gICAgICAgICAgbG9va3Vwcy5hc01hcCgpLmVudHJ5U2V0KCkpIHsKLSAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkuY29udGFpbnNBbnlPZihlbnRyeS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgfQotICAgICB9Ci0gICAgIHJldHVybiBmYWxzZTsKLSAgIH0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FueU9mKEl0ZXJhYmxlPEFjY291bnRHcm91cC5VVUlEPiB1dWlkcykgeworICAgICAgTXVsdGltYXA8R3JvdXBNZW1iZXJzaGlwLCBBY2NvdW50R3JvdXAuVVVJRD4gbG9va3VwcyA9CisgICAgICAgICAgQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICBmb3IgKEFjY291bnRHcm91cC5VVUlEIHV1aWQgOiB1dWlkcykgeworICAgICAgICBHcm91cE1lbWJlcnNoaXAgbSA9IG1lbWJlcnNoaXAodXVpZCk7CisgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICBsb2cud2FybigiVW5rbm93biBHcm91cE1lbWJlcnNoaXAgZm9yIFVVSUQ6ICIgKyB1dWlkKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsb29rdXBzLnB1dChtLCB1dWlkKTsKKyAgICAgIH0KKyAgICAgIGZvciAoTWFwLkVudHJ5PEdyb3VwTWVtYmVyc2hpcCwgQ29sbGVjdGlvbjxBY2NvdW50R3JvdXAuVVVJRD4+IGVudHJ5CisgICAgICAgICAgOiBsb29rdXBzIC5hc01hcCgpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgR3JvdXBNZW1iZXJzaGlwIG0gPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxBY2NvdW50R3JvdXAuVVVJRD4gaWRzID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgaWYgKGlkcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgIGlmIChtLmNvbnRhaW5zKEl0ZXJhYmxlcy5nZXRPbmx5RWxlbWVudChpZHMpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG0uY29udGFpbnNBbnlPZihpZHMpKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgIEBPdmVycmlkZQotICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0S25vd25Hcm91cHMoKSB7Ci0gICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3JvdXBzID0gU2V0cy5uZXdIYXNoU2V0KCk7Ci0gICAgIGZvciAoR3JvdXBNZW1iZXJzaGlwIG0gOiBtZW1iZXJzaGlwcy52YWx1ZXMoKSkgewotICAgICAgIGdyb3Vwcy5hZGRBbGwobS5nZXRLbm93bkdyb3VwcygpKTsKLSAgICAgfQotICAgICByZXR1cm4gZ3JvdXBzOwotICAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGludGVyc2VjdGlvbihJdGVyYWJsZTxBY2NvdW50R3JvdXAuVVVJRD4gdXVpZHMpIHsKKyAgICAgIE11bHRpbWFwPEdyb3VwTWVtYmVyc2hpcCwgQWNjb3VudEdyb3VwLlVVSUQ+IGxvb2t1cHMgPQorICAgICAgICAgIEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCB1dWlkIDogdXVpZHMpIHsKKyAgICAgICAgR3JvdXBNZW1iZXJzaGlwIG0gPSBtZW1iZXJzaGlwKHV1aWQpOworICAgICAgICBpZiAobSA9PSBudWxsKSB7CisgICAgICAgICAgbG9nLndhcm4oIlVua25vd24gR3JvdXBNZW1iZXJzaGlwIGZvciBVVUlEOiAiICsgdXVpZCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbG9va3Vwcy5wdXQobSwgdXVpZCk7CisgICAgICB9CisgICAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgZm9yIChNYXAuRW50cnk8R3JvdXBNZW1iZXJzaGlwLCBDb2xsZWN0aW9uPEFjY291bnRHcm91cC5VVUlEPj4gZW50cnkKKyAgICAgICAgICA6IGxvb2t1cHMuYXNNYXAoKS5lbnRyeVNldCgpKSB7CisgICAgICAgIGdyb3Vwcy5hZGRBbGwoZW50cnkuZ2V0S2V5KCkuaW50ZXJzZWN0aW9uKGVudHJ5LmdldFZhbHVlKCkpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBncm91cHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0S25vd25Hcm91cHMoKSB7CisgICAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgZm9yIChHcm91cE1lbWJlcnNoaXAgbSA6IG1lbWJlcnNoaXBzLnZhbHVlcygpKSB7CisgICAgICAgIGdyb3Vwcy5hZGRBbGwobS5nZXRLbm93bkdyb3VwcygpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBncm91cHM7CisgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvVmlzaWJsZUdyb3Vwcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hY2NvdW50L1Zpc2libGVHcm91cHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiMmM4My4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FjY291bnQvVmlzaWJsZUdyb3Vwcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50OwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBMaXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwUmVmZXJlbmNlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIFZpc2libGVHcm91cHMgewotCi0gIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgVmlzaWJsZUdyb3VwcyBjcmVhdGUoKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8SWRlbnRpZmllZFVzZXI+IGlkZW50aWZpZWRVc2VyOwotICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKLSAgcHJpdmF0ZSBmaW5hbCBHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5OwotCi0gIHByaXZhdGUgYm9vbGVhbiBvbmx5VmlzaWJsZVRvQWxsOwotICBwcml2YXRlIEFjY291bnRHcm91cC5UeXBlIGdyb3VwVHlwZTsKLQotICBASW5qZWN0Ci0gIFZpc2libGVHcm91cHMoZmluYWwgUHJvdmlkZXI8SWRlbnRpZmllZFVzZXI+IGN1cnJlbnRVc2VyLAotICAgICAgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlLAotICAgICAgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSkgewotICAgIHRoaXMuaWRlbnRpZmllZFVzZXIgPSBjdXJyZW50VXNlcjsKLSAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOwotICAgIHRoaXMuZ3JvdXBDb250cm9sRmFjdG9yeSA9IGdyb3VwQ29udHJvbEZhY3Rvcnk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPbmx5VmlzaWJsZVRvQWxsKGZpbmFsIGJvb2xlYW4gb25seVZpc2libGVUb0FsbCkgewotICAgIHRoaXMub25seVZpc2libGVUb0FsbCA9IG9ubHlWaXNpYmxlVG9BbGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRHcm91cFR5cGUoZmluYWwgQWNjb3VudEdyb3VwLlR5cGUgZ3JvdXBUeXBlKSB7Ci0gICAgdGhpcy5ncm91cFR5cGUgPSBncm91cFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgR3JvdXBMaXN0IGdldCgpIHsKLSAgICByZXR1cm4gY3JlYXRlR3JvdXBMaXN0KGZpbHRlckdyb3Vwcyhncm91cENhY2hlLmFsbCgpKSk7Ci0gIH0KLQotICBwdWJsaWMgR3JvdXBMaXN0IGdldChmaW5hbCBDb2xsZWN0aW9uPFByb2plY3RDb250cm9sPiBwcm9qZWN0cykKLSAgICAgIHRocm93cyBOb1N1Y2hHcm91cEV4Y2VwdGlvbiB7Ci0gICAgTWFwPEFjY291bnRHcm91cC5VVUlELCBBY2NvdW50R3JvdXA+IGdyb3VwcyA9IE1hcHMubmV3SGFzaE1hcCgpOwotICAgIGZvciAoZmluYWwgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wgOiBwcm9qZWN0cykgewotICAgICAgZmluYWwgU2V0PEdyb3VwUmVmZXJlbmNlPiBncm91cHNSZWZzID0gcHJvamVjdENvbnRyb2wuZ2V0QWxsR3JvdXBzKCk7Ci0gICAgICBmb3IgKGZpbmFsIEdyb3VwUmVmZXJlbmNlIGdyb3VwUmVmIDogZ3JvdXBzUmVmcykgewotICAgICAgICBmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXAgPSBncm91cENhY2hlLmdldChncm91cFJlZi5nZXRVVUlEKCkpOwotICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hHcm91cEV4Y2VwdGlvbihncm91cFJlZi5nZXRVVUlEKCkpOwotICAgICAgICB9Ci0gICAgICAgIGdyb3Vwcy5wdXQoZ3JvdXAuZ2V0R3JvdXBVVUlEKCksIGdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNyZWF0ZUdyb3VwTGlzdChmaWx0ZXJHcm91cHMoZ3JvdXBzLnZhbHVlcygpKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB2aXNpYmxlIGxpc3Qgb2Yga25vd24gZ3JvdXBzIGZvciB0aGUgdXNlci4gRGVwZW5kaW5nIG9uIHRoZSBncm91cAotICAgKiBtZW1iZXJzaGlwIHJlYWxtcyBzdXBwb3J0ZWQsIHRoaXMgbWF5IG9ubHkgcmV0dXJuIGEgc3Vic2V0IG9mIHRoZSBlZmZlY3RpdmUKLSAgICogZ3JvdXBzLgotICAgKiBAU2VlIEdyb3VwTWVtYmVyc2hpcCNnZXRLbm93bkdyb3VwcygpCi0gICAqLwotICBwdWJsaWMgR3JvdXBMaXN0IGdldChmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyKSB0aHJvd3MgTm9TdWNoR3JvdXBFeGNlcHRpb24gewotICAgIGlmIChpZGVudGlmaWVkVXNlci5nZXQoKS5nZXRBY2NvdW50SWQoKS5lcXVhbHModXNlci5nZXRBY2NvdW50SWQoKSkKLSAgICAgICAgfHwgaWRlbnRpZmllZFVzZXIuZ2V0KCkuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCkpIHsKLSAgICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gbWluZSA9IHVzZXIuZ2V0RWZmZWN0aXZlR3JvdXBzKCkuZ2V0S25vd25Hcm91cHMoKTsKLSAgICAgIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgQWNjb3VudEdyb3VwPiBncm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBJZCA6IG1pbmUpIHsKLSAgICAgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoZ3JvdXBJZCk7Ci0gICAgICAgIGlmIChncm91cCAhPSBudWxsKSB7Ci0gICAgICAgICAgZ3JvdXBzLnB1dChncm91cElkLCBncm91cCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjcmVhdGVHcm91cExpc3QoZmlsdGVyR3JvdXBzKGdyb3Vwcy52YWx1ZXMoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoR3JvdXBFeGNlcHRpb24oIkdyb3VwcyBvZiB1c2VyICciICsgdXNlci5nZXRBY2NvdW50SWQoKQotICAgICAgICAgICsgIicgYXJlIG5vdCB2aXNpYmxlLiIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdDxBY2NvdW50R3JvdXA+IGZpbHRlckdyb3VwcyhmaW5hbCBJdGVyYWJsZTxBY2NvdW50R3JvdXA+IGdyb3VwcykgewotICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwPiBmaWx0ZXJlZEdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgIGZpbmFsIGJvb2xlYW4gaXNBZG1pbiA9Ci0gICAgICAgIGlkZW50aWZpZWRVc2VyLmdldCgpLmdldENhcGFiaWxpdGllcygpLmNhbkFkbWluaXN0cmF0ZVNlcnZlcigpOwotICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwIGdyb3VwIDogZ3JvdXBzKSB7Ci0gICAgICBpZiAoIWlzQWRtaW4pIHsKLSAgICAgICAgZmluYWwgR3JvdXBDb250cm9sIGMgPSBncm91cENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoZ3JvdXApOwotICAgICAgICBpZiAoIWMuaXNWaXNpYmxlKCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKChvbmx5VmlzaWJsZVRvQWxsICYmICFncm91cC5pc1Zpc2libGVUb0FsbCgpKQotICAgICAgICAgIHx8IChncm91cFR5cGUgIT0gbnVsbCAmJiAhZ3JvdXBUeXBlLmVxdWFscyhncm91cC5nZXRUeXBlKCkpKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGZpbHRlcmVkR3JvdXBzLmFkZChncm91cCk7Ci0gICAgfQotICAgIENvbGxlY3Rpb25zLnNvcnQoZmlsdGVyZWRHcm91cHMsIG5ldyBHcm91cENvbXBhcmF0b3IoKSk7Ci0gICAgcmV0dXJuIGZpbHRlcmVkR3JvdXBzOwotICB9Ci0KLSAgcHJpdmF0ZSBHcm91cExpc3QgY3JlYXRlR3JvdXBMaXN0KGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwPiBncm91cHMpIHsKLSAgICByZXR1cm4gbmV3IEdyb3VwTGlzdChncm91cHMsIGlkZW50aWZpZWRVc2VyLmdldCgpCi0gICAgICAgIC5nZXRDYXBhYmlsaXRpZXMoKS5jYW5DcmVhdGVHcm91cCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hcmdzNGovUHJvamVjdENvbnRyb2xIYW5kbGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FyZ3M0ai9Qcm9qZWN0Q29udHJvbEhhbmRsZXIuamF2YQppbmRleCBkYTAzM2U3Li43YjQ0YzAyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FyZ3M0ai9Qcm9qZWN0Q29udHJvbEhhbmRsZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2FyZ3M0ai9Qcm9qZWN0Q29udHJvbEhhbmRsZXIuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hcmdzNGo7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUHJvamVjdFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoUHJvamVjdEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKQEAgLTQyLDIzICs0MywxMiBAQAogICBAT3ZlcnJpZGUKICAgcHVibGljIGZpbmFsIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykKICAgICAgIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBTdHJpbmcgdG9rZW4gPSBwYXJhbXMuZ2V0UGFyYW1ldGVyKDApOwotICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IHRva2VuOworICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAKICAgICB3aGlsZSAocHJvamVjdE5hbWUuZW5kc1dpdGgoIi8iKSkgewogICAgICAgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZS5zdWJzdHJpbmcoMCwgcHJvamVjdE5hbWUubGVuZ3RoKCkgLSAxKTsKICAgICB9CiAKLSAgICBpZiAocHJvamVjdE5hbWUuZW5kc1dpdGgoIi5naXQiKSkgewotICAgICAgLy8gQmUgbmljZSBhbmQgZHJvcCB0aGUgdHJhaWxpbmcgIi5naXQiIHN1ZmZpeCwgd2hpY2ggd2UgbmV2ZXIga2VlcAotICAgICAgLy8gaW4gb3VyIGRhdGFiYXNlLCBidXQgY2xpZW50cyBtaWdodCBtaXN0YWtlbmx5IHByb3ZpZGUgYW55d2F5LgotICAgICAgLy8KLSAgICAgIHByb2plY3ROYW1lID0gcHJvamVjdE5hbWUuc3Vic3RyaW5nKDAsIHByb2plY3ROYW1lLmxlbmd0aCgpIC0gNCk7Ci0gICAgICB3aGlsZSAocHJvamVjdE5hbWUuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lLnN1YnN0cmluZygwLCBwcm9qZWN0TmFtZS5sZW5ndGgoKSAtIDEpOwotICAgICAgfQotICAgIH0KLQogICAgIHdoaWxlIChwcm9qZWN0TmFtZS5zdGFydHNXaXRoKCIvIikpIHsKICAgICAgIC8vIEJlIG5pY2UgYW5kIGRyb3AgdGhlIGxlYWRpbmcgIi8iIGlmIHN1cHBsaWVkIGJ5IGFuIGFic29sdXRlIHBhdGguCiAgICAgICAvLyBXZSBkb24ndCBoYXZlIGEgZmlsZSBzeXN0ZW0gaGllcmFyY2h5LCBqdXN0IGEgZmxhdCBuYW1lc3BhY2UgaW4KQEAgLTY4LDEyICs1OCwxNCBAQAogICAgICAgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZS5zdWJzdHJpbmcoMSk7CiAgICAgfQogCisgICAgU3RyaW5nIG5hbWVXaXRob3V0U3VmZml4ID0gUHJvamVjdFV0aWwuc3RyaXBHaXRTdWZmaXgocHJvamVjdE5hbWUpOworCiAgICAgZmluYWwgUHJvamVjdENvbnRyb2wgY29udHJvbDsKICAgICB0cnkgewotICAgICAgUHJvamVjdC5OYW1lS2V5IG5hbWVLZXkgPSBuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3ROYW1lKTsKKyAgICAgIFByb2plY3QuTmFtZUtleSBuYW1lS2V5ID0gbmV3IFByb2plY3QuTmFtZUtleShuYW1lV2l0aG91dFN1ZmZpeCk7CiAgICAgICBjb250cm9sID0gcHJvamVjdENvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKG5hbWVLZXksIFByb2plY3RDb250cm9sLk9XTkVSIHwgUHJvamVjdENvbnRyb2wuVklTSUJMRSk7CiAgICAgfSBjYXRjaCAoTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgQ21kTGluZUV4Y2VwdGlvbihvd25lciwgIiciICsgdG9rZW4gKyAiJzogbm90IGEgR2Vycml0IHByb2plY3QiKTsKKyAgICAgIHRocm93IG5ldyBDbWRMaW5lRXhjZXB0aW9uKG93bmVyLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgfQogCiAgICAgc2V0dGVyLmFkZFZhbHVlKGNvbnRyb2wpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhCYWNrZW5kLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aEJhY2tlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDUwOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhCYWNrZW5kLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5FeHRlbnNpb25Qb2ludDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbnMgb2YgQXV0aEJhY2tlbmQgYXV0aGVudGljYXRlIHVzZXJzIGZvciBpbmNvbWluZyByZXF1ZXN0LgorICovCitARXh0ZW5zaW9uUG9pbnQKK3B1YmxpYyBpbnRlcmZhY2UgQXV0aEJhY2tlbmQgeworCisgIC8qKiBAcmV0dXJuIGFuIGlkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBkZXNjcmliZXMgdGhlIGJhY2tlbmQuICovCisgIFN0cmluZyBnZXREb21haW4oKTsKKworICAvKioKKyAgICogQXV0aGVudGljYXRlIGluc3BlY3RzIHRoZSBBdXRoUmVxdWVzdCBhbmQgcmV0dXJucyBhdXRoZW50aWNhdGVkIHVzZXIuIElmCisgICAqIHRoZSByZXF1ZXN0IGlzIHVuYWJsZSB0byBiZSBhdXRoZW50aWNhdGVkLCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIFRoZQorICAgKiB7QGxpbmsgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9ufSBtdXN0IGJlIHRocm93biB3aGVuIHRoZXJlIGFyZSBubworICAgKiBjcmVkZW50aWFscyBmb3IgdGhlIHJlcXVlc3QuIEl0IGlzIGV4cGVjdGVkIHRoYXQgYXQgbW9zdCBvbmUgQXV0aEJhY2tlbmQKKyAgICogd2lsbCBlaXRoZXIgcmV0dXJuIGFuIEF1dGhVc2VyIG9yIHRocm93IGEgbm9uLU1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbi4KKyAgICoKKyAgICogQHBhcmFtIHJlcSB0aGUgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHJlcXVlc3QuCisgICAqIEByZXR1cm4gdGhlIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVkIHVzZXIuCisgICAqIEB0aHJvd3MgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uIHdoZW4gdGhlcmUgYXJlIG5vIGNyZWRlbnRpYWxzLgorICAgKiBAdGhyb3dzIEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbiB3aGVuIHRoZSBjcmVkZW50aWFscyBhcmUgcHJlc2VudCBhbmQKKyAgICogICAgICAgICBpbnZhbGlkLgorICAgKiBAdGhyb3dzIFVua25vd25Vc2VyRXhjZXB0aW9uIHdoZW4gdGhlIGNyZWRlbnRpYWxzIGFyZSB2YWxpZCBidXQgdGhlcmUgaXMKKyAgICogICAgICAgICBubyBtYXRjaGluZyB1c2VyLgorICAgKiBAdGhyb3dzIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uIHdoZW4gdGhlIGNyZWRlbnRpYWxzIGFyZSB2YWxpZCBidXQgdGhlIHVzZXIKKyAgICogICAgICAgICBpcyBub3QgYWxsb3dlZC4KKyAgICogQHRocm93cyBBdXRoRXhjZXB0aW9uIHdoZW4gYW55IG90aGVyIGVycm9yIG9jY3Vycy4KKyAgICovCisgIEF1dGhVc2VyIGF1dGhlbnRpY2F0ZShBdXRoUmVxdWVzdCByZXEpIHRocm93cyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24sCisgICAgICBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24sIFVua25vd25Vc2VyRXhjZXB0aW9uLAorICAgICAgVXNlck5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvQXV0aEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2Y0YTBhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGg7CisKKy8qKgorICogQmFzZSB0eXBlIGZvciBhdXRoZW50aWNhdGlvbiBleGNlcHRpb25zLgorICovCitwdWJsaWMgY2xhc3MgQXV0aEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04OTQ2MzAyNjc2NTI1NTgwMzcyTDsKKworICBwdWJsaWMgQXV0aEV4Y2VwdGlvbigpIHsKKyAgfQorCisgIHB1YmxpYyBBdXRoRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9CisKKyAgcHVibGljIEF1dGhFeGNlcHRpb24oVGhyb3dhYmxlIGV4KSB7CisgICAgc3VwZXIoZXgpOworICB9CisKKyAgcHVibGljIEF1dGhFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7CisgICAgc3VwZXIobXNnLCBleCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9BdXRoUmVxdWVzdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3OWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9BdXRoUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogRGVmaW5lcyBhbiBhYnN0cmFjdCByZXF1ZXN0IGZvciB1c2VyIGF1dGhlbnRpY2F0aW9uIHRvIEdlcnJpdC4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEF1dGhSZXF1ZXN0IHsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXNlcm5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhc3N3b3JkOworCisgIHByb3RlY3RlZCBBdXRoUmVxdWVzdChTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICB0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyB0aGUgdXNlcm5hbWUgdG8gYmUgYXV0aGVudGljYXRlZC4KKyAgICoKKyAgICogQHJldHVybiB1c2VybmFtZSBmb3IgYXV0aGVudGljYXRpb24gb3IgbnVsbCBmb3IgYW5vbnltb3VzIGFjY2Vzcy4KKyAgICovCisgIEBOdWxsYWJsZQorICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgIHJldHVybiB1c2VybmFtZTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSB1c2VyJ3MgY3JlZGVudGlhbHMKKyAgICoKKyAgICogQHJldHVybiB1c2VyJ3MgY3JlZGVudGlhbHMgb3IgbnVsbAorICAgKi8KKyAgQE51bGxhYmxlCisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgcmV0dXJuIHBhc3N3b3JkOworICB9CisKKyAgcHVibGljIHZvaWQgY2hlY2tQYXNzd29yZChTdHJpbmcgcHdkKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB7CisgICAgaWYgKCFPYmplY3RzLmVxdWFsKGdldFBhc3N3b3JkKCksIHB3ZCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9BdXRoVXNlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0F1dGhVc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwODE3MwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9BdXRoVXNlci5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGg7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogQW4gYXV0aGVudGljYXRlZCB1c2VyIGFzIHNwZWNpZmllZCBieSB0aGUgQXV0aEJhY2tlbmQuCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoVXNlciB7CisKKyAgLyoqCisgICAqIEdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlci4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBzdGF0aWMgY2xhc3MgVVVJRCB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXVpZDsKKworICAgIC8qKgorICAgICAqIEEgbmV3IHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHV1aWQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICAqLworICAgIHB1YmxpYyBVVUlEKFN0cmluZyB1dWlkKSB7CisgICAgICB0aGlzLnV1aWQgPSBjaGVja05vdE51bGwodXVpZCk7CisgICAgfQorCisgICAgLyoqIEByZXR1cm4gdGhlIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyLiAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgcmV0dXJuIHV1aWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBVVUlEKSB7CisgICAgICAgIHJldHVybiBnZXQoKS5lcXVhbHMoKChVVUlEKSBvYmopLmdldCgpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgcmV0dXJuIGdldCgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJBdXRoVXNlci5VVUlEWyVzXSIsIGdldCgpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIFVVSUQgdXVpZDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXNlcm5hbWU7CisKKyAgLyoqCisgICAqIEFuIGF1dGhlbnRpY2F0ZWQgdXNlci4KKyAgICoKKyAgICogQHBhcmFtIHV1aWQgdGhlIGdsb2JhbGx5IHVuaXF1ZSBJRC4KKyAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdXRoZW50aWNhdGVkIHVzZXIuCisgICAqLworICBwdWJsaWMgQXV0aFVzZXIoVVVJRCB1dWlkLCBATnVsbGFibGUgU3RyaW5nIHVzZXJuYW1lKSB7CisgICAgdGhpcy51dWlkID0gY2hlY2tOb3ROdWxsKHV1aWQpOworICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRoZSBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllci4gKi8KKyAgcHVibGljIGZpbmFsIFVVSUQgZ2V0VVVJRCgpIHsKKyAgICByZXR1cm4gdXVpZDsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRoZSBiYWNrZW5kIHNwZWNpZmljIHVzZXIgbmFtZSwgb3IgbnVsbCBpZiBvbmUgZG9lcyBub3QgZXhpc3QuICovCisgIEBOdWxsYWJsZQorICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFVzZXJuYW1lKCkgeworICAgIHJldHVybiB1c2VybmFtZTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGxpbmsgI2dldFVzZXJuYW1lKCl9IGlzIG5vdCBudWxsLiAqLworICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNVc2VybmFtZSgpIHsKKyAgICByZXR1cm4gZ2V0VXNlcm5hbWUoKSAhPSBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEF1dGhVc2VyKSB7CisgICAgICByZXR1cm4gZ2V0VVVJRCgpLmVxdWFscygoKEF1dGhVc2VyKSBvYmopLmdldFVVSUQoKSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIHJldHVybiBnZXRVVUlEKCkuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJBdXRoVXNlclt1dWlkPSVzLCB1c2VybmFtZT0lc10iLCBnZXRVVUlEKCksCisgICAgICAgIGdldFVzZXJuYW1lKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvSW50ZXJuYWxBdXRoQmFja2VuZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0ludGVybmFsQXV0aEJhY2tlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTllNzFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0ludGVybmFsQXV0aEJhY2tlbmQuamF2YQpAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGg7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFN0YXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEludGVybmFsQXV0aEJhY2tlbmQgaW1wbGVtZW50cyBBdXRoQmFja2VuZCB7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWc7CisKKyAgQEluamVjdAorICBJbnRlcm5hbEF1dGhCYWNrZW5kKEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsIEF1dGhDb25maWcgYXV0aENvbmZpZykgeworICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOworICAgIHRoaXMuYXV0aENvbmZpZyA9IGF1dGhDb25maWc7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXREb21haW4oKSB7CisgICAgcmV0dXJuICJnZXJyaXQiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBdXRoVXNlciBhdXRoZW50aWNhdGUoQXV0aFJlcXVlc3QgcmVxKQorICAgICAgdGhyb3dzIE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbiwgSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uLAorICAgICAgVW5rbm93blVzZXJFeGNlcHRpb24sIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICBpZiAocmVxLmdldFVzZXJuYW1lKCkgPT0gbnVsbCB8fCByZXEuZ2V0UGFzc3dvcmQoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgU3RyaW5nIHVzZXJuYW1lOworICAgIGlmIChhdXRoQ29uZmlnLmlzVXNlck5hbWVUb0xvd2VyQ2FzZSgpKSB7CisgICAgICB1c2VybmFtZSA9IHJlcS5nZXRVc2VybmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVzZXJuYW1lID0gcmVxLmdldFVzZXJuYW1lKCk7CisgICAgfQorCisgICAgZmluYWwgQWNjb3VudFN0YXRlIHdobyA9IGFjY291bnRDYWNoZS5nZXRCeVVzZXJuYW1lKHVzZXJuYW1lKTsKKyAgICBpZiAod2hvID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBVbmtub3duVXNlckV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAoIXdoby5nZXRBY2NvdW50KCkuaXNBY3RpdmUoKSkgeworICAgICAgdGhyb3cgbmV3IFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgZm9yICIgKyB1c2VybmFtZQorICAgICAgICAgICsgIjogYWNjb3VudCBpbmFjdGl2ZSBvciBub3QgcHJvdmlzaW9uZWQgaW4gR2Vycml0Iik7CisgICAgfQorCisgICAgcmVxLmNoZWNrUGFzc3dvcmQod2hvLmdldFBhc3N3b3JkKHVzZXJuYW1lKSk7CisgICAgcmV0dXJuIG5ldyBBdXRoVXNlcihuZXcgQXV0aFVzZXIuVVVJRCh1c2VybmFtZSksIHVzZXJuYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0ludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL0ludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYTg1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoOworCisvKioKKyAqIEFuIGF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbiB0aGF0IGlzIHRocm93biB3aGVuIHRoZSBjcmVkZW50aWFscyBhcmUgcHJlc2VudAorICogYW5kIGFyZSB1bmFibGUgdG8gYmUgdmVyaWZpZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24gZXh0ZW5kcyBBdXRoRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzcwOTIwMTA0MjA4MDQ0NDI3Nkw7CisKKyAgcHVibGljIEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbigpIHsKKyAgfQorCisgIHB1YmxpYyBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24oU3RyaW5nIG1zZykgeworICAgIHN1cGVyKG1zZyk7CisgIH0KKworICBwdWJsaWMgSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uKFRocm93YWJsZSBleCkgeworICAgIHN1cGVyKGV4KTsKKyAgfQorCisgIHB1YmxpYyBJbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7CisgICAgc3VwZXIobXNnLCBleCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9NaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9NaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjI3MjhhCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL01pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworLyoqCisgKiBBbiBhdXRoZW50aWNhdGlvbiBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiB0aGUgY3JlZGVudGlhbHMgYXJlIG5vdAorICogcHJlc2VudC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgQXV0aEJhY2tlbmQgaGFzIG5vbmUgb2YgdGhlIG5lZWRlZAorICogaW5mb3JtYXRpb24gaW4gdGhlIHJlcXVlc3QgdG8gcGVyZm9ybSBhdXRoZW50aWNhdGlvbi4gSWYgcGFydHMgb2YgdGhlCisgKiBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIGJhY2tlbmQsIHRoZW4gYSBkaWZmZXJlbnQKKyAqIEF1dGhFeGNlcHRpb24gc2hvdWxkIGJlIHVzZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24gZXh0ZW5kcyBBdXRoRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY0OTk4NjY5Nzc1MTM1MDgwNTFMOworCisgIHB1YmxpYyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24oKSB7CisgIH0KKworICBwdWJsaWMgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9CisKKyAgcHVibGljIE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbihUaHJvd2FibGUgZXgpIHsKKyAgICBzdXBlcihleCk7CisgIH0KKworICBwdWJsaWMgTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSBleCkgeworICAgIHN1cGVyKG1zZywgZXgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvVW5pdmVyc2FsQXV0aEJhY2tlbmQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vbml2ZXJzYWxBdXRoQmFja2VuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OWM5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvVW5pdmVyc2FsQXV0aEJhY2tlbmQuamF2YQpAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGg7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIFVuaXZlcnNhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQXV0aEJhY2tlbmQgdGhhdCB3b3JrcyB3aXRoIHRoZSBpbmplY3RlZAorICogc2V0IG9mIEF1dGhCYWNrZW5kcy4KKyAqLworQFNpbmdsZXRvbgorcHVibGljIGZpbmFsIGNsYXNzIFVuaXZlcnNhbEF1dGhCYWNrZW5kIGltcGxlbWVudHMgQXV0aEJhY2tlbmQgeworICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8QXV0aEJhY2tlbmQ+IGF1dGhCYWNrZW5kczsKKworICBASW5qZWN0CisgIFVuaXZlcnNhbEF1dGhCYWNrZW5kKER5bmFtaWNTZXQ8QXV0aEJhY2tlbmQ+IGF1dGhCYWNrZW5kcykgeworICAgIHRoaXMuYXV0aEJhY2tlbmRzID0gYXV0aEJhY2tlbmRzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBdXRoVXNlciBhdXRoZW50aWNhdGUoZmluYWwgQXV0aFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEF1dGhFeGNlcHRpb24geworICAgIExpc3Q8QXV0aFVzZXI+IGF1dGhVc2VycyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8QXV0aEV4Y2VwdGlvbj4gYXV0aEV4cyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoQXV0aEJhY2tlbmQgYmFja2VuZCA6IGF1dGhCYWNrZW5kcykgeworICAgICAgdHJ5IHsKKyAgICAgICAgYXV0aFVzZXJzLmFkZChjaGVja05vdE51bGwoYmFja2VuZC5hdXRoZW50aWNhdGUocmVxdWVzdCkpKTsKKyAgICAgIH0gY2F0Y2ggKE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAvLyBOb3QgaGFuZGxlZCBieSB0aGlzIGJhY2tlbmQuCisgICAgICB9IGNhdGNoIChBdXRoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIGF1dGhFeHMuYWRkKGV4KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBIYW5kbGUgdGhlIHZhbGlkIHJlc3BvbnNlcworICAgIGlmIChhdXRoVXNlcnMuc2l6ZSgpID09IDEpIHsKKyAgICAgIHJldHVybiBhdXRoVXNlcnMuZ2V0KDApOworICAgIH0gZWxzZSBpZiAoYXV0aFVzZXJzLmlzRW1wdHkoKSAmJiBhdXRoRXhzLnNpemUoKSA9PSAxKSB7CisgICAgICB0aHJvdyBhdXRoRXhzLmdldCgwKTsKKyAgICB9IGVsc2UgaWYgKGF1dGhFeHMuaXNFbXB0eSgpICYmIGF1dGhVc2Vycy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBNaXNzaW5nQ3JlZGVudGlhbHNFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiTXVsdGlwbGUgQXV0aEJhY2tlbmRzIGF0dGVtcHRlZCB0byBoYW5kbGUgcmVxdWVzdDoiCisgICAgICAgICsgIiBhdXRoVXNlcnM9JXMgYXV0aEV4cz0lcyIsIGF1dGhVc2VycywgYXV0aEV4cyk7CisgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24obXNnKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICJVbml2ZXJzYWxBdXRoQmFja2VuZCBkb2Vzbid0IHN1cHBvcnQgZG9tYWluLiIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvVW5rbm93blVzZXJFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vbmtub3duVXNlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDkxMmEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvVW5rbm93blVzZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGg7CisKKy8qKgorICogQW4gYXV0aGVudGljYXRpb24gZXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duIHdoZW4gY3JlZGVudGlhbHMgYXJlIHByZXNlbnRlZCBmb3IKKyAqIGFuIHVua25vd24gdXNlci4KKyAqLworcHVibGljIGNsYXNzIFVua25vd25Vc2VyRXhjZXB0aW9uIGV4dGVuZHMgQXV0aEV4Y2VwdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE2MjYxODYxNjY5MjQ2NzA3NTRMOworCisgIHB1YmxpYyBVbmtub3duVXNlckV4Y2VwdGlvbigpIHsKKyAgfQorCisgIHB1YmxpYyBVbmtub3duVXNlckV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CisgICAgc3VwZXIobXNnKTsKKyAgfQorCisgIHB1YmxpYyBVbmtub3duVXNlckV4Y2VwdGlvbihUaHJvd2FibGUgZXgpIHsKKyAgICBzdXBlcihleCk7CisgIH0KKworICBwdWJsaWMgVW5rbm93blVzZXJFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4KSB7CisgICAgc3VwZXIobXNnLCBleCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vc2VyTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL1VzZXJOb3RBbGxvd2VkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyMDMzMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9Vc2VyTm90QWxsb3dlZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aDsKKworLyoqCisgKiBBbiBhdXRoZW50aWNhdGlvbiBleGNlcHRpb24gdGhhdCBpcyB0aHJvd24gd2hlbiB0aGUgdXNlciBjcmVkZW50aWFscyBhcmUKKyAqIHZhbGlkLCBidXQgbm90IGFsbG93ZWQgdG8gYXV0aGVudGljYXRlIGZvciBvdGhlciByZWFzb25zIGkuZS4gYWNjb3VudAorICogZGlzYWJsZWQuCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyTm90QWxsb3dlZEV4Y2VwdGlvbiBleHRlbmRzIEF1dGhFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTUzMTQxMTk5OTkzMjkyMjU1OEw7CisKKyAgcHVibGljIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uKCkgeworICB9CisKKyAgcHVibGljIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9CisKKyAgcHVibGljIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uKFRocm93YWJsZSBleCkgeworICAgIHN1cGVyKGV4KTsKKyAgfQorCisgIHB1YmxpYyBVc2VyTm90QWxsb3dlZEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgZXgpIHsKKyAgICBzdXBlcihtc2csIGV4KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvSGVscGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9IZWxwZXIuamF2YQppbmRleCA2NDRmNWRmLi4wMTUxZGRlIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9IZWxwZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9IZWxwZXIuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLmxkYXA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGFyYW1ldGVyaXplZFN0cmluZzsKQEAgLTI4LDYgKzI5LDggQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKIAoraW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC00Nyw2ICs1MCw5IEBACiBpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OwogaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuSW5pdGlhbERpckNvbnRleHQ7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTb2NrZXRGYWN0b3J5OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOwogCiBAU2luZ2xldG9uIGNsYXNzIEhlbHBlciB7CiAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERBUF9VVUlEID0gImxkYXA6IjsKQEAgLTU4LDYgKzY0LDcgQEAKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFzc3dvcmQ7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlZmVycmFsOwogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3NsVmVyaWZ5OworICBwcml2YXRlIGZpbmFsIFN0cmluZyBhdXRoZW50aWNhdGlvbjsKICAgcHJpdmF0ZSB2b2xhdGlsZSBMZGFwU2NoZW1hIGxkYXBTY2hlbWE7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlYWRUaW1lT3V0TWlsbGlzOwogCkBAIC02NiwxMSArNzMsMTIgQEAKICAgICAgIEBOYW1lZChMZGFwTW9kdWxlLkdST1VQU19CWUlOQ0xVREVfQ0FDSEUpCiAgICAgICBDYWNoZTxTdHJpbmcsIEltbXV0YWJsZVNldDxTdHJpbmc+PiBncm91cHNCeUluY2x1ZGUpIHsKICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKLSAgICB0aGlzLnNlcnZlciA9IExkYXBSZWFsbS5yZXF1aXJlZChjb25maWcsICJzZXJ2ZXIiKTsKKyAgICB0aGlzLnNlcnZlciA9IExkYXBSZWFsbS5vcHRpb25hbChjb25maWcsICJzZXJ2ZXIiKTsKICAgICB0aGlzLnVzZXJuYW1lID0gTGRhcFJlYWxtLm9wdGlvbmFsKGNvbmZpZywgInVzZXJuYW1lIik7CiAgICAgdGhpcy5wYXNzd29yZCA9IExkYXBSZWFsbS5vcHRpb25hbChjb25maWcsICJwYXNzd29yZCIpOwogICAgIHRoaXMucmVmZXJyYWwgPSBMZGFwUmVhbG0ub3B0aW9uYWwoY29uZmlnLCAicmVmZXJyYWwiKTsKICAgICB0aGlzLnNzbFZlcmlmeSA9IGNvbmZpZy5nZXRCb29sZWFuKCJsZGFwIiwgInNzbHZlcmlmeSIsIHRydWUpOworICAgIHRoaXMuYXV0aGVudGljYXRpb24gPSBMZGFwUmVhbG0ub3B0aW9uYWwoY29uZmlnLCAiYXV0aGVudGljYXRpb24iKTsKICAgICBTdHJpbmcgdGltZW91dCA9IExkYXBSZWFsbS5vcHRpb25hbChjb25maWcsICJyZWFkVGltZW91dCIpOwogICAgIGlmICh0aW1lb3V0ICE9IG51bGwpIHsKICAgICAgIHJlYWRUaW1lT3V0TWlsbGlzID0KQEAgLTk2LDE1ICsxMDQsNDEgQEAKICAgICByZXR1cm4gZW52OwogICB9CiAKLSAgRGlyQ29udGV4dCBvcGVuKCkgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgIERpckNvbnRleHQgb3BlbigpIHRocm93cyBOYW1pbmdFeGNlcHRpb24sIExvZ2luRXhjZXB0aW9uIHsKICAgICBmaW5hbCBQcm9wZXJ0aWVzIGVudiA9IGNyZWF0ZUNvbnRleHRQcm9wZXJ0aWVzKCk7Ci0gICAgaWYgKHVzZXJuYW1lICE9IG51bGwpIHsKLSAgICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9BVVRIRU5USUNBVElPTiwgInNpbXBsZSIpOwotICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX1BSSU5DSVBBTCwgdXNlcm5hbWUpOwotICAgICAgZW52LnB1dChDb250ZXh0LlNFQ1VSSVRZX0NSRURFTlRJQUxTLCBwYXNzd29yZCAhPSBudWxsID8gcGFzc3dvcmQgOiAiIik7Ci0gICAgICBlbnYucHV0KENvbnRleHQuUkVGRVJSQUwsIHJlZmVycmFsICE9IG51bGwgPyByZWZlcnJhbCA6ICJpZ25vcmUiKTsKKyAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfQVVUSEVOVElDQVRJT04sIGF1dGhlbnRpY2F0aW9uICE9IG51bGwgPyBhdXRoZW50aWNhdGlvbiA6ICJzaW1wbGUiKTsKKyAgICBlbnYucHV0KENvbnRleHQuUkVGRVJSQUwsIHJlZmVycmFsICE9IG51bGwgPyByZWZlcnJhbCA6ICJpZ25vcmUiKTsKKyAgICBpZiAoIkdTU0FQSSIuZXF1YWxzKGF1dGhlbnRpY2F0aW9uKSkgeworICAgICAgcmV0dXJuIGtlcmJlcm9zT3BlbihlbnYpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodXNlcm5hbWUgIT0gbnVsbCkgeworICAgICAgICBlbnYucHV0KENvbnRleHQuU0VDVVJJVFlfUFJJTkNJUEFMLCB1c2VybmFtZSk7CisgICAgICAgIGVudi5wdXQoQ29udGV4dC5TRUNVUklUWV9DUkVERU5USUFMUywgcGFzc3dvcmQgIT0gbnVsbCA/IHBhc3N3b3JkIDogIiIpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyBJbml0aWFsRGlyQ29udGV4dChlbnYpOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEluaXRpYWxEaXJDb250ZXh0KGVudik7CisgIH0KKworICBwcml2YXRlIERpckNvbnRleHQga2VyYmVyb3NPcGVuKGZpbmFsIFByb3BlcnRpZXMgZW52KSB0aHJvd3MgTG9naW5FeGNlcHRpb24sCisgICAgICBOYW1pbmdFeGNlcHRpb24geworICAgIExvZ2luQ29udGV4dCBjdHggPSBuZXcgTG9naW5Db250ZXh0KCJLZXJiZXJvc0xvZ2luIik7CisgICAgY3R4LmxvZ2luKCk7CisgICAgU3ViamVjdCBzdWJqZWN0ID0gY3R4LmdldFN1YmplY3QoKTsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIFN1YmplY3QuZG9BcyhzdWJqZWN0LCBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxEaXJDb250ZXh0PigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgRGlyQ29udGV4dCBydW4oKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5pdGlhbERpckNvbnRleHQoZW52KTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGVJZlBvc3NpYmxlKGUuZ2V0RXhjZXB0aW9uKCksIE5hbWluZ0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZUlmUG9zc2libGUoZS5nZXRFeGNlcHRpb24oKSwgUnVudGltZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICBMZGFwUmVhbG0ubG9nLndhcm4oIkludGVybmFsIGVycm9yIiwgZS5nZXRFeGNlcHRpb24oKSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9IGZpbmFsbHkgeworICAgICAgY3R4LmxvZ291dCgpOworICAgIH0KICAgfQogCiAgIERpckNvbnRleHQgYXV0aGVudGljYXRlKFN0cmluZyBkbiwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgQWNjb3VudEV4Y2VwdGlvbiB7CkBAIC0yMDcsNyArMjQxLDcgQEAKICAgICBpZiAoYWN0dWFsLmlzRW1wdHkoKSkgewogICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoYWN0dWFsKTsKKyAgICAgIHJldHVybiBJbW11dGFibGVTZXQuY29weU9mKGFjdHVhbCk7CiAgICAgfQogICB9CiAKQEAgLTI1Niw2ICsyOTAsNyBAQAogICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBncm91cEJhc2VzOwogICAgIGZpbmFsIFNlYXJjaFNjb3BlIGdyb3VwU2NvcGU7CiAgICAgZmluYWwgUGFyYW1ldGVyaXplZFN0cmluZyBncm91cFBhdHRlcm47CisgICAgZmluYWwgUGFyYW1ldGVyaXplZFN0cmluZyBncm91cE5hbWU7CiAgICAgZmluYWwgTGlzdDxMZGFwUXVlcnk+IGdyb3VwTWVtYmVyUXVlcnlMaXN0OwogCiAgICAgTGRhcFNjaGVtYShmaW5hbCBEaXJDb250ZXh0IGN0eCkgewpAQCAtMjcxLDYgKzMwNiw3IEBACiAgICAgICBncm91cEJhc2VzID0gTGRhcFJlYWxtLm9wdGlvbmFsTGlzdChjb25maWcsICJncm91cEJhc2UiKTsKICAgICAgIGdyb3VwU2NvcGUgPSBMZGFwUmVhbG0uc2NvcGUoY29uZmlnLCAiZ3JvdXBTY29wZSIpOwogICAgICAgZ3JvdXBQYXR0ZXJuID0gTGRhcFJlYWxtLnBhcmFtU3RyaW5nKGNvbmZpZywgImdyb3VwUGF0dGVybiIsIHR5cGUuZ3JvdXBQYXR0ZXJuKCkpOworICAgICAgZ3JvdXBOYW1lID0gTGRhcFJlYWxtLnBhcmFtU3RyaW5nKGNvbmZpZywgImdyb3VwTmFtZSIsIHR5cGUuZ3JvdXBOYW1lKCkpOwogICAgICAgZmluYWwgU3RyaW5nIGdyb3VwTWVtYmVyUGF0dGVybiA9CiAgICAgICAgICAgTGRhcFJlYWxtLm9wdGRlZihjb25maWcsICJncm91cE1lbWJlclBhdHRlcm4iLCB0eXBlLmdyb3VwTWVtYmVyUGF0dGVybigpKTsKIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcEF1dGhCYWNrZW5kLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwQXV0aEJhY2tlbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjY4YThiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcEF1dGhCYWNrZW5kLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5sZGFwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguQXV0aEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5BdXRoUmVxdWVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5BdXRoVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5JbnZhbGlkQ3JlZGVudGlhbHNFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguTWlzc2luZ0NyZWRlbnRpYWxzRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLlVua25vd25Vc2VyRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLlVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQXV0aENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5kaXJlY3RvcnkuRGlyQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIEF1dGhCYWNrZW5kIGZvciB0aGUgTERBUCBhdXRoZW50aWNhdGlvbiBzeXN0ZW0uCisgKi8KK3B1YmxpYyBjbGFzcyBMZGFwQXV0aEJhY2tlbmQgaW1wbGVtZW50cyBBdXRoQmFja2VuZCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMZGFwQXV0aEJhY2tlbmQuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgSGVscGVyIGhlbHBlcjsKKyAgcHJpdmF0ZSBmaW5hbCBBdXRoQ29uZmlnIGF1dGhDb25maWc7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBsb3dlckNhc2VVc2VybmFtZTsKKworICBASW5qZWN0CisgIHB1YmxpYyBMZGFwQXV0aEJhY2tlbmQoSGVscGVyIGhlbHBlciwKKyAgICAgIEF1dGhDb25maWcgYXV0aENvbmZpZywKKyAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNvbmZpZykgeworICAgIHRoaXMuaGVscGVyID0gaGVscGVyOworICAgIHRoaXMuYXV0aENvbmZpZyA9IGF1dGhDb25maWc7CisgICAgdGhpcy5sb3dlckNhc2VVc2VybmFtZSA9CisgICAgICAgIGNvbmZpZy5nZXRCb29sZWFuKCJsZGFwIiwgImxvY2FsVXNlcm5hbWVUb0xvd2VyQ2FzZSIsIGZhbHNlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldERvbWFpbigpIHsKKyAgICByZXR1cm4gImxkYXAiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBBdXRoVXNlciBhdXRoZW50aWNhdGUoQXV0aFJlcXVlc3QgcmVxKQorICAgICAgdGhyb3dzIE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbiwgSW52YWxpZENyZWRlbnRpYWxzRXhjZXB0aW9uLAorICAgICAgVW5rbm93blVzZXJFeGNlcHRpb24sIFVzZXJOb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICBpZiAocmVxLmdldFVzZXJuYW1lKCkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1pc3NpbmdDcmVkZW50aWFsc0V4Y2VwdGlvbigpOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyB1c2VybmFtZSA9IGxvd2VyQ2FzZVVzZXJuYW1lCisgICAgICAgID8gcmVxLmdldFVzZXJuYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKQorICAgICAgICA6IHJlcS5nZXRVc2VybmFtZSgpOworICAgIHRyeSB7CisgICAgICBmaW5hbCBEaXJDb250ZXh0IGN0eDsKKyAgICAgIGlmIChhdXRoQ29uZmlnLmdldEF1dGhUeXBlKCkgPT0gQXV0aFR5cGUuTERBUF9CSU5EKSB7CisgICAgICAgIGN0eCA9IGhlbHBlci5hdXRoZW50aWNhdGUodXNlcm5hbWUsIHJlcS5nZXRQYXNzd29yZCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN0eCA9IGhlbHBlci5vcGVuKCk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBIZWxwZXIuTGRhcFNjaGVtYSBzY2hlbWEgPSBoZWxwZXIuZ2V0U2NoZW1hKGN0eCk7CisgICAgICAgIGZpbmFsIExkYXBRdWVyeS5SZXN1bHQgbSA9IGhlbHBlci5maW5kQWNjb3VudChzY2hlbWEsIGN0eCwgdXNlcm5hbWUpOworCisgICAgICAgIGlmIChhdXRoQ29uZmlnLmdldEF1dGhUeXBlKCkgPT0gQXV0aFR5cGUuTERBUCkgeworICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSB1c2VyIGFjY291bnQsIGJ1dCB3ZSBuZWVkIHRvIHZlcmlmeQorICAgICAgICAgIC8vIHRoZSBwYXNzd29yZCBtYXRjaGVzIGl0IGJlZm9yZSB3ZSBjYW4gY29udGludWUuCisgICAgICAgICAgLy8KKyAgICAgICAgICBoZWxwZXIuYXV0aGVudGljYXRlKG0uZ2V0RE4oKSwgcmVxLmdldFBhc3N3b3JkKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQXV0aFVzZXIobmV3IEF1dGhVc2VyLlVVSUQodXNlcm5hbWUpLCB1c2VybmFtZSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICB0cnkgeworICAgICAgICAgIGN0eC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgIGxvZy53YXJuKCJDYW5ub3QgY2xvc2UgTERBUCBxdWVyeSBoYW5kbGUiLCBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKEFjY291bnRFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcXVlcnkgTERBUCB0byBhdXRoZW50aWNhdGUgdXNlciIsIGUpOworICAgICAgdGhyb3cgbmV3IEludmFsaWRDcmVkZW50aWFsc0V4Y2VwdGlvbigiQ2Fubm90IHF1ZXJ5IExEQVAgZm9yIGFjY291bnQiLCBlKTsKKyAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcXVlcnkgTERBUCB0byBhdXRoZW50aWNhdGUgdXNlciIsIGUpOworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkNhbm5vdCBxdWVyeSBMREFQIGZvciBhY2NvdW50IiwgZSk7CisgICAgfSBjYXRjaCAoTG9naW5FeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJDYW5ub3QgYXV0aGVudGljYXRlIHNlcnZlciB2aWEgSkFBUyIsIGUpOworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkNhbm5vdCBxdWVyeSBMREFQIGZvciBhY2NvdW50IiwgZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwR3JvdXBCYWNrZW5kLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwR3JvdXBCYWNrZW5kLmphdmEKaW5kZXggNWMzMGU1Yy4uMmNmMzcyYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcEdyb3VwQmFja2VuZC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBHcm91cEJhY2tlbmQuamF2YQpAQCAtMzIsNiArMzIsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwTWVtYmVyc2hpcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5MaXN0R3JvdXBNZW1iZXJzaGlwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLmxkYXAuSGVscGVyLkxkYXBTY2hlbWE7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVkOwpAQCAtNDEsMTUgKzQyLDE4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgamF2YXgubmFtaW5nLkludmFsaWROYW1lRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubmFtaW5nLmRpcmVjdG9yeS5EaXJDb250ZXh0OwogaW1wb3J0IGphdmF4Lm5hbWluZy5sZGFwLkxkYXBOYW1lOwogaW1wb3J0IGphdmF4Lm5hbWluZy5sZGFwLlJkbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOwogCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIEdyb3VwQmFja2VuZCBmb3IgdGhlIExEQVAgZ3JvdXAgc3lzdGVtLgpAQCAtNjMsNiArNjcsNyBAQAogICBwcml2YXRlIGZpbmFsIEhlbHBlciBoZWxwZXI7CiAgIHByaXZhdGUgZmluYWwgTG9hZGluZ0NhY2hlPFN0cmluZywgU2V0PEFjY291bnRHcm91cC5VVUlEPj4gbWVtYmVyc2hpcENhY2hlOwogICBwcml2YXRlIGZpbmFsIExvYWRpbmdDYWNoZTxTdHJpbmcsIEJvb2xlYW4+IGV4aXN0c0NhY2hlOworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHVzZXJQcm92aWRlcjsKIAogICBASW5qZWN0CkBAIC03MCwyMiArNzUsMjQgQEAKICAgICAgIEhlbHBlciBoZWxwZXIsCiAgICAgICBATmFtZWQoR1JPVVBfQ0FDSEUpIExvYWRpbmdDYWNoZTxTdHJpbmcsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4+IG1lbWJlcnNoaXBDYWNoZSwKICAgICAgIEBOYW1lZChHUk9VUF9FWElTVF9DQUNIRSkgTG9hZGluZ0NhY2hlPFN0cmluZywgQm9vbGVhbj4gZXhpc3RzQ2FjaGUsCisgICAgICBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlLAogICAgICAgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHVzZXJQcm92aWRlcikgewogICAgIHRoaXMuaGVscGVyID0gaGVscGVyOwogICAgIHRoaXMubWVtYmVyc2hpcENhY2hlID0gbWVtYmVyc2hpcENhY2hlOworICAgIHRoaXMucHJvamVjdENhY2hlID0gcHJvamVjdENhY2hlOwogICAgIHRoaXMuZXhpc3RzQ2FjaGUgPSBleGlzdHNDYWNoZTsKICAgICB0aGlzLnVzZXJQcm92aWRlciA9IHVzZXJQcm92aWRlcjsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMZGFwVVVJRChBY2NvdW50R3JvdXAuVVVJRCB1dWlkKSB7CisgIHByaXZhdGUgYm9vbGVhbiBpc0xkYXBVVUlEKEFjY291bnRHcm91cC5VVUlEIHV1aWQpIHsKICAgICByZXR1cm4gdXVpZC5nZXQoKS5zdGFydHNXaXRoKExEQVBfVVVJRCk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBHcm91cFJlZmVyZW5jZSBncm91cFJlZmVyZW5jZShMZGFwUXVlcnkuUmVzdWx0IHJlcykKLSAgICAgIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBHcm91cFJlZmVyZW5jZSBncm91cFJlZmVyZW5jZShQYXJhbWV0ZXJpemVkU3RyaW5nIHAsCisgICAgICBMZGFwUXVlcnkuUmVzdWx0IHJlcykgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAgICAgcmV0dXJuIG5ldyBHcm91cFJlZmVyZW5jZSgKICAgICAgICAgbmV3IEFjY291bnRHcm91cC5VVUlEKExEQVBfVVVJRCArIHJlcy5nZXRETigpKSwKLSAgICAgICAgTERBUF9OQU1FICsgY25Gb3IocmVzLmdldEROKCkpKTsKKyAgICAgICAgTERBUF9OQU1FICsgTGRhcFJlYWxtLmFwcGx5KHAsIHJlcykpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNuRm9yKFN0cmluZyBkbikgewpAQCAtMTQzLDggKzE1MCwxNSBAQAogICAgICAgfQogCiAgICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZVRvQWxsKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBATnVsbGFibGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWxBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBATnVsbGFibGUKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KICAgICB9OwogICB9CkBAIC0xNzIsNyArMTg2LDE1IEBACiAgICAgfQogCiAgICAgdHJ5IHsKLSAgICAgIHJldHVybiBuZXcgTGlzdEdyb3VwTWVtYmVyc2hpcChtZW1iZXJzaGlwQ2FjaGUuZ2V0KGlkKSk7CisgICAgICBmaW5hbCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwcyA9IG1lbWJlcnNoaXBDYWNoZS5nZXQoaWQpOworICAgICAgcmV0dXJuIG5ldyBMaXN0R3JvdXBNZW1iZXJzaGlwKGdyb3VwcykgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0S25vd25Hcm91cHMoKSB7CisgICAgICAgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBnID0gU2V0cy5uZXdIYXNoU2V0KGdyb3Vwcyk7CisgICAgICAgICAgZy5yZXRhaW5BbGwocHJvamVjdENhY2hlLmd1ZXNzUmVsZXZhbnRHcm91cFVVSURzKCkpOworICAgICAgICAgIHJldHVybiBnOworICAgICAgICB9CisgICAgICB9OwogICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgbG9va3VwIG1lbWJlcnNoaXBzT2YgJXMgaW4gTERBUCIsIGlkKSwgZSk7CiAgICAgICByZXR1cm4gR3JvdXBNZW1iZXJzaGlwLkVNUFRZOwpAQCAtMjAzLDEzICsyMjUsMTQgQEAKICAgICAgICAgTGRhcFNjaGVtYSBzY2hlbWEgPSBoZWxwZXIuZ2V0U2NoZW1hKGN0eCk7CiAgICAgICAgIFBhcmFtZXRlcml6ZWRTdHJpbmcgZmlsdGVyID0gUGFyYW1ldGVyaXplZFN0cmluZy5hc2lzKAogICAgICAgICAgICAgc2NoZW1hLmdyb3VwUGF0dGVybi5yZXBsYWNlKEdST1VQTkFNRSwgbmFtZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHJldHVybkF0dHJzID0gQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpOworICAgICAgICBTZXQ8U3RyaW5nPiByZXR1cm5BdHRycyA9CisgICAgICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KHNjaGVtYS5ncm91cE5hbWUuZ2V0UGFyYW1ldGVyTmFtZXMoKSk7CiAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBCYXNlIDogc2NoZW1hLmdyb3VwQmFzZXMpIHsKICAgICAgICAgICBMZGFwUXVlcnkgcXVlcnkgPSBuZXcgTGRhcFF1ZXJ5KAogICAgICAgICAgICAgICBncm91cEJhc2UsIHNjaGVtYS5ncm91cFNjb3BlLCBmaWx0ZXIsIHJldHVybkF0dHJzKTsKICAgICAgICAgICBmb3IgKExkYXBRdWVyeS5SZXN1bHQgcmVzIDogcXVlcnkucXVlcnkoY3R4LCBwYXJhbXMpKSB7Ci0gICAgICAgICAgICBvdXQuYWRkKGdyb3VwUmVmZXJlbmNlKHJlcykpOworICAgICAgICAgICAgb3V0LmFkZChncm91cFJlZmVyZW5jZShzY2hlbWEuZ3JvdXBOYW1lLCByZXMpKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gZmluYWxseSB7CkBAIC0yMjEsNiArMjQ0LDggQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgewogICAgICAgbG9nLndhcm4oIkNhbm5vdCBxdWVyeSBMREFQIGZvciBncm91cHMgbWF0Y2hpbmcgcmVxdWVzdGVkIG5hbWUiLCBlKTsKKyAgICB9IGNhdGNoIChMb2dpbkV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cud2FybigiQ2Fubm90IHF1ZXJ5IExEQVAgZm9yIGdyb3VwcyBtYXRjaGluZyByZXF1ZXN0ZWQgbmFtZSIsIGUpOwogICAgIH0KICAgICByZXR1cm4gb3V0OwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwTW9kdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwTW9kdWxlLmphdmEKaW5kZXggZjFiMTVmOS4uODhjZjQ1YiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBNb2R1bGUuamF2YQpAQCAtNjAsOCArNjAsOCBAQAogICAgICAgICBuZXcgVHlwZUxpdGVyYWw8SW1tdXRhYmxlU2V0PFN0cmluZz4+KCkge30pCiAgICAgICAuZXhwaXJlQWZ0ZXJXcml0ZSgxLCBIT1VSUyk7CiAKLSAgICBiaW5kKFJlYWxtLmNsYXNzKS50byhMZGFwUmVhbG0uY2xhc3MpLmluKFNjb3Blcy5TSU5HTEVUT04pOwogICAgIGJpbmQoSGVscGVyLmNsYXNzKTsKKyAgICBiaW5kKFJlYWxtLmNsYXNzKS50byhMZGFwUmVhbG0uY2xhc3MpLmluKFNjb3Blcy5TSU5HTEVUT04pOwogCiAgICAgRHluYW1pY1NldC5iaW5kKGJpbmRlcigpLCBHcm91cEJhY2tlbmQuY2xhc3MpLnRvKExkYXBHcm91cEJhY2tlbmQuY2xhc3MpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwUmVhbG0uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBSZWFsbS5qYXZhCmluZGV4IDcyZWI3ZWMuLmZjMTEwMmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBSZWFsbS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBSZWFsbS5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiBpbXBvcnQgamF2YXgubmFtaW5nLk5hbWU7CiBpbXBvcnQgamF2YXgubmFtaW5nLk5hbWluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LkRpckNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKIAogQFNpbmdsZXRvbgogY2xhc3MgTGRhcFJlYWxtIGltcGxlbWVudHMgUmVhbG0gewpAQCAtMTY3LDcgKzE2OCw3IEBACiAgICAgcmV0dXJuICFyZWFkT25seUFjY291bnRGaWVsZHMuY29udGFpbnMoZmllbGQpOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcGx5KFBhcmFtZXRlcml6ZWRTdHJpbmcgcCwgTGRhcFF1ZXJ5LlJlc3VsdCBtKQorICBzdGF0aWMgU3RyaW5nIGFwcGx5KFBhcmFtZXRlcml6ZWRTdHJpbmcgcCwgTGRhcFF1ZXJ5LlJlc3VsdCBtKQogICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CiAgICAgaWYgKHAgPT0gbnVsbCkgewogICAgICAgcmV0dXJuIG51bGw7CkBAIC0yNDAsNiArMjQxLDkgQEAKICAgICB9IGNhdGNoIChOYW1pbmdFeGNlcHRpb24gZSkgewogICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcXVlcnkgTERBUCB0byBhdXRlbnRpY2F0ZSB1c2VyIiwgZSk7CiAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25VbmF2YWlsYWJsZUV4Y2VwdGlvbigiQ2Fubm90IHF1ZXJ5IExEQVAgZm9yIGFjY291bnQiLCBlKTsKKyAgICB9IGNhdGNoIChMb2dpbkV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBhdXRoZW50aWNhdGUgc2VydmVyIHZpYSBKQUFTIiwgZSk7CisgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25VbmF2YWlsYWJsZUV4Y2VwdGlvbigiQ2Fubm90IHF1ZXJ5IExEQVAgZm9yIGFjY291bnQiLCBlKTsKICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcFR5cGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9sZGFwL0xkYXBUeXBlLmphdmEKaW5kZXggM2M0YTU0Yi4uZGI1YmFlYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdXRoL2xkYXAvTGRhcFR5cGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvbGRhcC9MZGFwVHlwZS5qYXZhCkBAIC0yNSw4ICsyNSw5IEBACiAgIHN0YXRpYyBMZGFwVHlwZSBndWVzc1R5cGUoZmluYWwgRGlyQ29udGV4dCBjdHgpIHRocm93cyBOYW1pbmdFeGNlcHRpb24gewogICAgIGZpbmFsIEF0dHJpYnV0ZXMgcm9vdEF0dHMgPSBjdHguZ2V0QXR0cmlidXRlcygiIik7CiAgICAgQXR0cmlidXRlIHN1cHBvcnRlZCA9IHJvb3RBdHRzLmdldCgic3VwcG9ydGVkQ2FwYWJpbGl0aWVzIik7Ci0gICAgaWYgKHN1cHBvcnRlZCAhPSBudWxsICYmIHN1cHBvcnRlZC5jb250YWlucygiMS4yLjg0MC4xMTM1NTYuMS40LjgwMCIpKSB7Ci0gICAgICByZXR1cm4gbmV3IEFjdGl2ZURpcmVjdG9yeShyb290QXR0cyk7CisgICAgaWYgKHN1cHBvcnRlZCAhPSBudWxsICYmIChzdXBwb3J0ZWQuY29udGFpbnMoIjEuMi44NDAuMTEzNTU2LjEuNC44MDAiKQorICAgICAgICAgIHx8IHN1cHBvcnRlZC5jb250YWlucygiMS4yLjg0MC4xMTM1NTYuMS40LjE4NTEiKSkpIHsKKyAgICAgIHJldHVybiBuZXcgQWN0aXZlRGlyZWN0b3J5KCk7CiAgICAgfQogCiAgICAgcmV0dXJuIFJGQ18yMzA3OwpAQCAtMzYsNiArMzcsOCBAQAogCiAgIGFic3RyYWN0IFN0cmluZyBncm91cE1lbWJlclBhdHRlcm4oKTsKIAorICBhYnN0cmFjdCBTdHJpbmcgZ3JvdXBOYW1lKCk7CisKICAgYWJzdHJhY3QgU3RyaW5nIGFjY291bnRGdWxsTmFtZSgpOwogCiAgIGFic3RyYWN0IFN0cmluZyBhY2NvdW50RW1haWxBZGRyZXNzKCk7CkBAIC01OCw2ICs2MSwxMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIFN0cmluZyBncm91cE5hbWUoKSB7CisgICAgICByZXR1cm4gImNuIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBTdHJpbmcgYWNjb3VudEZ1bGxOYW1lKCkgewogICAgICAgcmV0dXJuICJkaXNwbGF5TmFtZSI7CiAgICAgfQpAQCAtODQsMjMgKzkyLDE3IEBACiAgIH0KIAogICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBY3RpdmVEaXJlY3RvcnkgZXh0ZW5kcyBMZGFwVHlwZSB7Ci0gICAgQWN0aXZlRGlyZWN0b3J5KGZpbmFsIEF0dHJpYnV0ZXMgYXR0cykgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7Ci0gICAgICAvLyBDb252ZXJ0ICJkZWZhdWx0TmFtaW5nQ29udGV4dDogREM9Zm9vLERDPWV4YW1wbGUsREM9Y29tIiBpbnRvCi0gICAgICAvLyB0aGUgYSBzdGFuZGFyZCBETlMgbmFtZSBhcyB3ZSB3b3VsZCBleHBlY3QgdG8gZmluZCBpbiB0aGUgc3VmZml4Ci0gICAgICAvLyBwYXJ0IG9mIHRoZSB1c2VyUHJpbmNpcGFsTmFtZS4KLSAgICAgIC8vCi0gICAgICBBdHRyaWJ1dGUgZGVmYXVsdE5hbWluZ0NvbnRleHQgPSBhdHRzLmdldCgiZGVmYXVsdE5hbWluZ0NvbnRleHQiKTsKLSAgICAgIGlmIChkZWZhdWx0TmFtaW5nQ29udGV4dCA9PSBudWxsIHx8IGRlZmF1bHROYW1pbmdDb250ZXh0LnNpemUoKSA8IDEpIHsKLSAgICAgICAgdGhyb3cgbmV3IE5hbWluZ0V4Y2VwdGlvbigicm9vdERTRSBoYXMgbm8gZGVmYXVsdE5hbWluZ0NvbnRleHQiKTsKLSAgICAgIH0KLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBTdHJpbmcgZ3JvdXBQYXR0ZXJuKCkgewogICAgICAgcmV0dXJuICIoJihvYmplY3RDbGFzcz1ncm91cCkoY249JHtncm91cG5hbWV9KSkiOwogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIFN0cmluZyBncm91cE5hbWUoKSB7CisgICAgICByZXR1cm4gImNuIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBTdHJpbmcgZ3JvdXBNZW1iZXJQYXR0ZXJuKCkgewogICAgICAgcmV0dXJuIG51bGw7IC8vIEFjdGl2ZSBEaXJlY3RvcnkgdXNlcyBtZW1iZXJPZiBpbiB0aGUgYWNjb3VudAogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXV0aC9vcGVuaWQvT3BlbklkUHJvdmlkZXJQYXR0ZXJuLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvb3BlbmlkL09wZW5JZFByb3ZpZGVyUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTVmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2F1dGgvb3BlbmlkL09wZW5JZFByb3ZpZGVyUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5vcGVuaWQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEV4dGVybmFsSWQ7CisKK3B1YmxpYyBjbGFzcyBPcGVuSWRQcm92aWRlclBhdHRlcm4geworICBwdWJsaWMgc3RhdGljIE9wZW5JZFByb3ZpZGVyUGF0dGVybiBjcmVhdGUoU3RyaW5nIHBhdHRlcm4pIHsKKyAgICBPcGVuSWRQcm92aWRlclBhdHRlcm4gciA9IG5ldyBPcGVuSWRQcm92aWRlclBhdHRlcm4oKTsKKyAgICByLnJlZ2V4ID0gcGF0dGVybi5zdGFydHNXaXRoKCJeIikgJiYgcGF0dGVybi5lbmRzV2l0aCgiJCIpOworICAgIHIucGF0dGVybiA9IHBhdHRlcm47CisgICAgcmV0dXJuIHI7CisgIH0KKworICBwcm90ZWN0ZWQgYm9vbGVhbiByZWdleDsKKyAgcHJvdGVjdGVkIFN0cmluZyBwYXR0ZXJuOworCisgIHByb3RlY3RlZCBPcGVuSWRQcm92aWRlclBhdHRlcm4oKSB7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpZCkgeworICAgIHJldHVybiByZWdleCA/IGlkLm1hdGNoZXMocGF0dGVybikgOiBpZC5zdGFydHNXaXRoKHBhdHRlcm4pOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhBY2NvdW50RXh0ZXJuYWxJZCBpZCkgeworICAgIHJldHVybiBtYXRjaGVzKGlkLmdldEV4dGVybmFsSWQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gcGF0dGVybjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9hdmF0YXIvQXZhdGFyUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXZhdGFyL0F2YXRhclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxNDBkMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvYXZhdGFyL0F2YXRhclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdmF0YXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLkV4dGVuc2lvblBvaW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKKworLyoqCisgKiBQcm92aWRlIGF2YXRhciBVUkxzIGZvciBzcGVjaWZpZWQgdXNlci4KKyAqCisgKiBJbnZva2VkIGJ5IEdlcnJpdCB3aGVuIEF2YXRhciBpbWFnZSByZXF1ZXN0cyBhcmUgbWFkZS4KKyAqLworQEV4dGVuc2lvblBvaW50CitwdWJsaWMgaW50ZXJmYWNlIEF2YXRhclByb3ZpZGVyIHsKKyAgLyoqCisgICAqIEdldCBhdmF0YXIgVVJMLgorICAgKgorICAgKiBAcGFyYW0gZm9yVXNlciBUaGUgdXNlciBmb3Igd2hpY2ggdG8gbG9hZCBhbiBhdmF0YXIgaW1hZ2UKKyAgICogQHBhcmFtIGltYWdlU2l6ZSBBIHJlcXVlc3RlZCBpbWFnZSBzaXplLCBpbiBwaXhlbHMuIEFuIGltYWdlU2l6ZSBvZiAwCisgICAqICAgICAgICBpbmRpY2F0ZXMgdG8gdXNlIHdoYXRldmVyIGRlZmF1bHQgc2l6ZSB0aGUgcHJvdmlkZXIgZGV0ZXJtaW5lcy4KKyAgICogICAgICAgIEF2YXRhclByb3ZpZGVycyBtYXkgaWdub3JlIHRoZSByZXF1ZXN0ZWQgaW1hZ2Ugc2l6ZS4gVGhlIHdlYgorICAgKiAgICAgICAgaW50ZXJmYWNlIHdpbGwgcmVzaXplIGFueSBpbWFnZSB0byBtYXRjaCBpbWFnZVNpemUsIHNvIGlkZWFsbHkgdGhlCisgICAqICAgICAgICBwcm92aWRlciBzaG91bGQgcmV0dXJuIGFuIGltYWdlIHNpemVkIGNvcnJlY3RseS4KKyAgICogQHJldHVybiBhIFVSTCBvZiBhbiBhdmF0YXIgaW1hZ2UgZm9yIHRoZSBzcGVjaWZpZWQgdXNlci4gQSByZXR1cm4gdmFsdWUgb2YKKyAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaXMgYWNjZXB0YWJsZSwgYW5kIHJlc3VsdHMgaW4gdGhlIHNlcnZlciByZXNwb25kaW5nCisgICAqICAgICAgICAgd2l0aCBhIDQwNC4gVGhpcyB3aWxsIGhpZGUgdGhlIGF2YXRhciBpbWFnZSBpbiB0aGUgd2ViIFVJLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRVcmwoSWRlbnRpZmllZFVzZXIgZm9yVXNlciwgaW50IGltYWdlU2l6ZSk7CisKKyAgLyoqCisgICAqIEdldHMgYSBVUkwgZm9yIGEgdXNlciB0byBtb2RpZnkgdGhlaXIgYXZhdGFyIGltYWdlLgorICAgKgorICAgKiBAcGFyYW0gdXNlciBUaGUgdXNlciB3aXNoaW5nIHRvIGNoYW5nZSB0aGVpciBhdmF0YXIgaW1hZ2UKKyAgICogQHJldHVybiBhIFVSTCB0aGUgdXNlciBzaG91bGQgdmlzaXQgdG8gbW9kaWZ5IHRoZWlyIGF2YXRhciwgb3IgbnVsbCBpZgorICAgKiAgICAgICAgIG1vZGlmaWNhdGlvbiBpcyBub3QgcG9zc2libGUuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENoYW5nZUF2YXRhclVybChJZGVudGlmaWVkVXNlciBmb3JVc2VyKTsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0FiYW5kb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0FiYW5kb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzY2Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQWJhbmRvbi5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFwcHJvdmFsc1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQWJhbmRvbi5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5BYmFuZG9uZWRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVwbHlUb0NoYW5nZVNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitwdWJsaWMgY2xhc3MgQWJhbmRvbiBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PENoYW5nZVJlc291cmNlLCBJbnB1dD4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJhbmRvbi5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKKyAgcHJpdmF0ZSBmaW5hbCBBYmFuZG9uZWRTZW5kZXIuRmFjdG9yeSBhYmFuZG9uZWRTZW5kZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIENoYW5nZUpzb24ganNvbjsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOworICB9CisKKyAgQEluamVjdAorICBBYmFuZG9uKENoYW5nZUhvb2tzIGhvb2tzLAorICAgICAgQWJhbmRvbmVkU2VuZGVyLkZhY3RvcnkgYWJhbmRvbmVkU2VuZGVyRmFjdG9yeSwKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLAorICAgICAgQ2hhbmdlSnNvbiBqc29uKSB7CisgICAgdGhpcy5ob29rcyA9IGhvb2tzOworICAgIHRoaXMuYWJhbmRvbmVkU2VuZGVyRmFjdG9yeSA9IGFiYW5kb25lZFNlbmRlckZhY3Rvcnk7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcmVxLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLAorICAgICAgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSByZXEuZ2V0Q29udHJvbCgpOworICAgIElkZW50aWZpZWRVc2VyIGNhbGxlciA9IChJZGVudGlmaWVkVXNlcikgY29udHJvbC5nZXRDdXJyZW50VXNlcigpOworICAgIENoYW5nZSBjaGFuZ2UgPSByZXEuZ2V0Q2hhbmdlKCk7CisgICAgaWYgKCFjb250cm9sLmNhbkFiYW5kb24oKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oImFiYW5kb24gbm90IHBlcm1pdHRlZCIpOworICAgIH0gZWxzZSBpZiAoIWNoYW5nZS5nZXRTdGF0dXMoKS5pc09wZW4oKSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyAiICsgc3RhdHVzKGNoYW5nZSkpOworICAgIH0KKworICAgIENoYW5nZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBSZXZpZXdEYiBkYiA9IGRiUHJvdmlkZXIuZ2V0KCk7CisgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOworICAgIHRyeSB7CisgICAgICBjaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKAorICAgICAgICBjaGFuZ2UuZ2V0SWQoKSwKKyAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKKyAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgY2hhbmdlLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLkFCQU5ET05FRCk7CisgICAgICAgICAgICAgIENoYW5nZVV0aWwudXBkYXRlZChjaGFuZ2UpOworICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbigiY2hhbmdlIGlzICIKKyAgICAgICAgICAgICsgc3RhdHVzKGRiLmNoYW5nZXMoKS5nZXQocmVxLmdldENoYW5nZSgpLmdldElkKCkpKSk7CisgICAgICB9CisgICAgICBtZXNzYWdlID0gbmV3TWVzc2FnZShpbnB1dCwgY2FsbGVyLCBjaGFuZ2UpOworICAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1lc3NhZ2UpKTsKKyAgICAgIG5ldyBBcHByb3ZhbHNVdGlsKGRiKS5zeW5jQ2hhbmdlU3RhdHVzKGNoYW5nZSk7CisgICAgICBkYi5jb21taXQoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIucm9sbGJhY2soKTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgUmVwbHlUb0NoYW5nZVNlbmRlciBjbSA9IGFiYW5kb25lZFNlbmRlckZhY3RvcnkuY3JlYXRlKGNoYW5nZSk7CisgICAgICBjbS5zZXRGcm9tKGNhbGxlci5nZXRBY2NvdW50SWQoKSk7CisgICAgICBjbS5zZXRDaGFuZ2VNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgY20uc2VuZCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBlbWFpbCB1cGRhdGUgZm9yIGNoYW5nZSAiICsgY2hhbmdlLmdldENoYW5nZUlkKCksIGUpOworICAgIH0KKyAgICBob29rcy5kb0NoYW5nZUFiYW5kb25lZEhvb2soY2hhbmdlLAorICAgICAgICBjYWxsZXIuZ2V0QWNjb3VudCgpLAorICAgICAgICBTdHJpbmdzLmVtcHR5VG9OdWxsKGlucHV0Lm1lc3NhZ2UpLAorICAgICAgICBkYik7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KGNoYW5nZSk7CisgIH0KKworICBwcml2YXRlIENoYW5nZU1lc3NhZ2UgbmV3TWVzc2FnZShJbnB1dCBpbnB1dCwgSWRlbnRpZmllZFVzZXIgY2FsbGVyLAorICAgICAgQ2hhbmdlIGNoYW5nZSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgU3RyaW5nQnVpbGRlciBtc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIG1zZy5hcHBlbmQoIkFiYW5kb25lZCIpOworICAgIGlmICghU3RyaW5ncy5udWxsVG9FbXB0eShpbnB1dC5tZXNzYWdlKS50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICBtc2cuYXBwZW5kKCJcblxuIik7CisgICAgICBtc2cuYXBwZW5kKGlucHV0Lm1lc3NhZ2UudHJpbSgpKTsKKyAgICB9CisKKyAgICBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgQ2hhbmdlTWVzc2FnZSgKKyAgICAgICAgbmV3IENoYW5nZU1lc3NhZ2UuS2V5KAorICAgICAgICAgICAgY2hhbmdlLmdldElkKCksCisgICAgICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiUHJvdmlkZXIuZ2V0KCkpKSwKKyAgICAgICAgY2FsbGVyLmdldEFjY291bnRJZCgpLAorICAgICAgICBjaGFuZ2UuZ2V0TGFzdFVwZGF0ZWRPbigpLAorICAgICAgICBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgbWVzc2FnZS5zZXRNZXNzYWdlKG1zZy50b1N0cmluZygpKTsKKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0dXMoQ2hhbmdlIGNoYW5nZSkgeworICAgIHJldHVybiBjaGFuZ2UgIT0gbnVsbCA/IGNoYW5nZS5nZXRTdGF0dXMoKS5uYW1lKCkudG9Mb3dlckNhc2UoKSA6ICJkZWxldGVkIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlSW5zZXJ0ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZUluc2VydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjNzhlYQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZUluc2VydGVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQXBwcm92YWxzVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlRyYWNraW5nRm9vdGVyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJMaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIENoYW5nZUluc2VydGVyIHsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CisgIHByaXZhdGUgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsOworICBwcml2YXRlIGZpbmFsIFRyYWNraW5nRm9vdGVycyB0cmFja2luZ0Zvb3RlcnM7CisKKyAgQEluamVjdAorICBwdWJsaWMgQ2hhbmdlSW5zZXJ0ZXIoZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLAorICAgICAgQ2hhbmdlSG9va3MgaG9va3MsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbCwKKyAgICAgIFRyYWNraW5nRm9vdGVycyB0cmFja2luZ0Zvb3RlcnMpIHsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOworICAgIHRoaXMuaG9va3MgPSBob29rczsKKyAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOworICAgIHRoaXMudHJhY2tpbmdGb290ZXJzID0gdHJhY2tpbmdGb290ZXJzOworICB9CisKKyAgcHVibGljIHZvaWQgaW5zZXJ0Q2hhbmdlKFJldmlld0RiIGRiLCBDaGFuZ2UgY2hhbmdlLCBQYXRjaFNldCBwcywKKyAgICAgIFJldkNvbW1pdCBjb21taXQsIExhYmVsVHlwZXMgbGFiZWxUeXBlcywgTGlzdDxGb290ZXJMaW5lPiBmb290ZXJMaW5lcywKKyAgICAgIFBhdGNoU2V0SW5mbyBpbmZvLCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKworICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZS5nZXRJZCgpKTsKKyAgICB0cnkgeworICAgICAgQ2hhbmdlVXRpbC5pbnNlcnRBbmNlc3RvcnMoZGIsIHBzLmdldElkKCksIGNvbW1pdCk7CisgICAgICBkYi5wYXRjaFNldHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBzKSk7CisgICAgICBkYi5jaGFuZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjaGFuZ2UpKTsKKyAgICAgIENoYW5nZVV0aWwudXBkYXRlVHJhY2tpbmdJZHMoZGIsIGNoYW5nZSwgdHJhY2tpbmdGb290ZXJzLCBmb290ZXJMaW5lcyk7CisgICAgICBhcHByb3ZhbHNVdGlsLmFkZFJldmlld2VycyhkYiwgbGFiZWxUeXBlcywgY2hhbmdlLCBwcywgaW5mbywgcmV2aWV3ZXJzLAorICAgICAgICAgIENvbGxlY3Rpb25zLjxBY2NvdW50LklkPiBlbXB0eVNldCgpKTsKKyAgICAgIGRiLmNvbW1pdCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBkYi5yb2xsYmFjaygpOworICAgIH0KKworICAgIGdpdFJlZlVwZGF0ZWQuZmlyZShjaGFuZ2UuZ2V0UHJvamVjdCgpLCBwcy5nZXRSZWZOYW1lKCksIE9iamVjdElkLnplcm9JZCgpLAorICAgICAgICBjb21taXQpOworICAgIGhvb2tzLmRvUGF0Y2hzZXRDcmVhdGVkSG9vayhjaGFuZ2UsIHBzLCBkYik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZUpzb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZUpzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkyYmJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlSnNvbi5qYXZhCkBAIC0wLDAgKzEsOTM0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5BTExfQ09NTUlUUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uQUxMX0ZJTEVTOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5BTExfUkVWSVNJT05TOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5DVVJSRU5UX0NPTU1JVDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uQ1VSUkVOVF9GSUxFUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uQ1VSUkVOVF9SRVZJU0lPTjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uREVUQUlMRURfQUNDT1VOVFM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkRFVEFJTEVEX0xBQkVMUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb24uTEFCRUxTOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hCYXNlZFRhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSGFzaE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZExpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlRhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlLlN0YXR1czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mby5QYXJlbnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Vc2VySWRlbnRpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5Bbm9ueW1vdXNVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5MYWJlbE5vcm1hbGl6ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdEVudHJ5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZURhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Ib3N0S2V5OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworcHVibGljIGNsYXNzIENoYW5nZUpzb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ2hhbmdlSnNvbi5jbGFzcyk7CisKKyAgQFNpbmdsZXRvbgorICBzdGF0aWMgY2xhc3MgVXJscyB7CisgICAgZmluYWwgU3RyaW5nIGdpdDsKKyAgICBmaW5hbCBTdHJpbmcgaHR0cDsKKworICAgIEBJbmplY3QKKyAgICBVcmxzKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZykgeworICAgICAgdGhpcy5naXQgPSBlbnN1cmVTbGFzaChjZmcuZ2V0U3RyaW5nKCJnZXJyaXQiLCBudWxsLCAiY2Fub25pY2FsR2l0VXJsIikpOworICAgICAgdGhpcy5odHRwID0gZW5zdXJlU2xhc2goY2ZnLmdldFN0cmluZygiZ2Vycml0IiwgbnVsbCwgImdpdEh0dHBVcmwiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuc3VyZVNsYXNoKFN0cmluZyBpbikgeworICAgICAgaWYgKGluICE9IG51bGwgJiYgIWluLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgcmV0dXJuIGluICsgIi8iOworICAgICAgfQorICAgICAgcmV0dXJuIGluOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOworICBwcml2YXRlIGZpbmFsIExhYmVsTm9ybWFsaXplciBsYWJlbE5vcm1hbGl6ZXI7CisgIHByaXZhdGUgZmluYWwgQ3VycmVudFVzZXIgdXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBBbm9ueW1vdXNVc2VyIGFub255bW91czsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNoYW5nZUNvbnRyb2xHZW5lcmljRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hMaXN0Q2FjaGUgcGF0Y2hMaXN0Q2FjaGU7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm8uTG9hZGVyLkZhY3RvcnkgYWNjb3VudExvYWRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBVcmxzIHVybHM7CisgIHByaXZhdGUgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xVc2VyRmFjdG9yeTsKKyAgcHJpdmF0ZSBTc2hJbmZvIHNzaEluZm87CisgIHByaXZhdGUgRW51bVNldDxMaXN0Q2hhbmdlc09wdGlvbj4gb3B0aW9uczsKKyAgcHJpdmF0ZSBBY2NvdW50SW5mby5Mb2FkZXIgYWNjb3VudExvYWRlcjsKKyAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sIGxhc3RDb250cm9sOworCisgIEBJbmplY3QKKyAgQ2hhbmdlSnNvbigKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYiwKKyAgICAgIExhYmVsTm9ybWFsaXplciBsbiwKKyAgICAgIEN1cnJlbnRVc2VyIHUsCisgICAgICBBbm9ueW1vdXNVc2VyIGF1LAorICAgICAgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgdWYsCisgICAgICBDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNjZiwKKyAgICAgIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcHNpLAorICAgICAgUGF0Y2hMaXN0Q2FjaGUgcGxjLAorICAgICAgQWNjb3VudEluZm8uTG9hZGVyLkZhY3RvcnkgYWlsZiwKKyAgICAgIEBDYW5vbmljYWxXZWJVcmwgUHJvdmlkZXI8U3RyaW5nPiBjdXJsLAorICAgICAgVXJscyB1cmxzKSB7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMubGFiZWxOb3JtYWxpemVyID0gbG47CisgICAgdGhpcy51c2VyID0gdTsKKyAgICB0aGlzLmFub255bW91cyA9IGF1OworICAgIHRoaXMudXNlckZhY3RvcnkgPSB1ZjsKKyAgICB0aGlzLmNoYW5nZUNvbnRyb2xHZW5lcmljRmFjdG9yeSA9IGNjZjsKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwc2k7CisgICAgdGhpcy5wYXRjaExpc3RDYWNoZSA9IHBsYzsKKyAgICB0aGlzLmFjY291bnRMb2FkZXJGYWN0b3J5ID0gYWlsZjsKKyAgICB0aGlzLnVybFByb3ZpZGVyID0gY3VybDsKKyAgICB0aGlzLnVybHMgPSB1cmxzOworCisgICAgb3B0aW9ucyA9IEVudW1TZXQubm9uZU9mKExpc3RDaGFuZ2VzT3B0aW9uLmNsYXNzKTsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VKc29uIGFkZE9wdGlvbihMaXN0Q2hhbmdlc09wdGlvbiBvKSB7CisgICAgb3B0aW9ucy5hZGQobyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgQ2hhbmdlSnNvbiBhZGRPcHRpb25zKENvbGxlY3Rpb248TGlzdENoYW5nZXNPcHRpb24+IG8pIHsKKyAgICBvcHRpb25zLmFkZEFsbChvKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VKc29uIHNldFNzaEluZm8oU3NoSW5mbyBpbmZvKSB7CisgICAgc3NoSW5mbyA9IGluZm87CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgQ2hhbmdlSnNvbiBzZXRDaGFuZ2VDb250cm9sRmFjdG9yeShDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2YpIHsKKyAgICBjaGFuZ2VDb250cm9sVXNlckZhY3RvcnkgPSBjZjsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VJbmZvIGZvcm1hdChDaGFuZ2VSZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZm9ybWF0KG5ldyBDaGFuZ2VEYXRhKHJzcmMuZ2V0Q29udHJvbCgpKSk7CisgIH0KKworICBwdWJsaWMgQ2hhbmdlSW5mbyBmb3JtYXQoQ2hhbmdlIGNoYW5nZSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGZvcm1hdChuZXcgQ2hhbmdlRGF0YShjaGFuZ2UpKTsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VJbmZvIGZvcm1hdChDaGFuZ2UuSWQgaWQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBmb3JtYXQobmV3IENoYW5nZURhdGEoaWQpKTsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VJbmZvIGZvcm1hdChDaGFuZ2VEYXRhIGNkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBMaXN0PENoYW5nZURhdGE+IHRtcCA9IEltbXV0YWJsZUxpc3Qub2YoY2QpOworICAgIHJldHVybiBmb3JtYXRMaXN0MihJbW11dGFibGVMaXN0Lm9mKHRtcCkpLmdldCgwKS5nZXQoMCk7CisgIH0KKworICBwdWJsaWMgQ2hhbmdlSW5mbyBmb3JtYXQoUmV2aXNpb25SZXNvdXJjZSByc3JjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VEYXRhIGNkID0gbmV3IENoYW5nZURhdGEocnNyYy5nZXRDb250cm9sKCkpOworICAgIGNkLmxpbWl0VG9QYXRjaFNldHMoSW1tdXRhYmxlTGlzdC5vZihyc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSkpOworICAgIHJldHVybiBmb3JtYXQoY2QpOworICB9CisKKyAgcHVibGljIExpc3Q8TGlzdDxDaGFuZ2VJbmZvPj4gZm9ybWF0TGlzdDIoTGlzdDxMaXN0PENoYW5nZURhdGE+PiBpbikKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGFjY291bnRMb2FkZXIgPSBhY2NvdW50TG9hZGVyRmFjdG9yeS5jcmVhdGUoaGFzKERFVEFJTEVEX0FDQ09VTlRTKSk7CisgICAgTGlzdDxMaXN0PENoYW5nZUluZm8+PiByZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoaW4uc2l6ZSgpKTsKKyAgICBmb3IgKExpc3Q8Q2hhbmdlRGF0YT4gY2hhbmdlcyA6IGluKSB7CisgICAgICBDaGFuZ2VEYXRhLmVuc3VyZUNoYW5nZUxvYWRlZChkYiwgY2hhbmdlcyk7CisgICAgICBDaGFuZ2VEYXRhLmVuc3VyZUN1cnJlbnRQYXRjaFNldExvYWRlZChkYiwgY2hhbmdlcyk7CisgICAgICBDaGFuZ2VEYXRhLmVuc3VyZUN1cnJlbnRBcHByb3ZhbHNMb2FkZWQoZGIsIGNoYW5nZXMpOworICAgICAgcmVzLmFkZCh0b0NoYW5nZUluZm8oY2hhbmdlcykpOworICAgIH0KKyAgICBhY2NvdW50TG9hZGVyLmZpbGwoKTsKKyAgICByZXR1cm4gcmVzOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGhhcyhMaXN0Q2hhbmdlc09wdGlvbiBvcHRpb24pIHsKKyAgICByZXR1cm4gb3B0aW9ucy5jb250YWlucyhvcHRpb24pOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PENoYW5nZUluZm8+IHRvQ2hhbmdlSW5mbyhMaXN0PENoYW5nZURhdGE+IGNoYW5nZXMpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBMaXN0PENoYW5nZUluZm8+IGluZm8gPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoY2hhbmdlcy5zaXplKCkpOworICAgIGZvciAoQ2hhbmdlRGF0YSBjZCA6IGNoYW5nZXMpIHsKKyAgICAgIGluZm8uYWRkKHRvQ2hhbmdlSW5mbyhjZCkpOworICAgIH0KKyAgICByZXR1cm4gaW5mbzsKKyAgfQorCisgIHByaXZhdGUgQ2hhbmdlSW5mbyB0b0NoYW5nZUluZm8oQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlSW5mbyBvdXQgPSBuZXcgQ2hhbmdlSW5mbygpOworICAgIENoYW5nZSBpbiA9IGNkLmNoYW5nZShkYik7CisgICAgb3V0LnByb2plY3QgPSBpbi5nZXRQcm9qZWN0KCkuZ2V0KCk7CisgICAgb3V0LmJyYW5jaCA9IGluLmdldERlc3QoKS5nZXRTaG9ydE5hbWUoKTsKKyAgICBvdXQudG9waWMgPSBpbi5nZXRUb3BpYygpOworICAgIG91dC5jaGFuZ2VJZCA9IGluLmdldEtleSgpLmdldCgpOworICAgIG91dC5tZXJnZWFibGUgPSBpbi5nZXRTdGF0dXMoKSAhPSBDaGFuZ2UuU3RhdHVzLk1FUkdFRCA/IGluLmlzTWVyZ2VhYmxlKCkgOiBudWxsOworICAgIG91dC5zdWJqZWN0ID0gaW4uZ2V0U3ViamVjdCgpOworICAgIG91dC5zdGF0dXMgPSBpbi5nZXRTdGF0dXMoKTsKKyAgICBvdXQub3duZXIgPSBhY2NvdW50TG9hZGVyLmdldChpbi5nZXRPd25lcigpKTsKKyAgICBvdXQuY3JlYXRlZCA9IGluLmdldENyZWF0ZWRPbigpOworICAgIG91dC51cGRhdGVkID0gaW4uZ2V0TGFzdFVwZGF0ZWRPbigpOworICAgIG91dC5fbnVtYmVyID0gaW4uZ2V0SWQoKS5nZXQoKTsKKyAgICBvdXQuX3NvcnRrZXkgPSBpbi5nZXRTb3J0S2V5KCk7CisgICAgb3V0LnN0YXJyZWQgPSB1c2VyLmdldFN0YXJyZWRDaGFuZ2VzKCkuY29udGFpbnMoaW4uZ2V0SWQoKSkgPyB0cnVlIDogbnVsbDsKKyAgICBvdXQucmV2aWV3ZWQgPSBpbi5nZXRTdGF0dXMoKS5pc09wZW4oKSAmJiBpc0NoYW5nZVJldmlld2VkKGNkKSA/IHRydWUgOiBudWxsOworICAgIG91dC5sYWJlbHMgPSBsYWJlbHNGb3IoY2QsIGhhcyhMQUJFTFMpLCBoYXMoREVUQUlMRURfTEFCRUxTKSk7CisKKyAgICBDb2xsZWN0aW9uPFBhdGNoU2V0LklkPiBsaW1pdGVkID0gY2QuZ2V0TGltaXRlZFBhdGNoU2V0cygpOworICAgIGlmIChvdXQubGFiZWxzICE9IG51bGwgJiYgaGFzKERFVEFJTEVEX0xBQkVMUykpIHsKKyAgICAgIC8vIElmIGxpbWl0ZWQgdG8gc3BlY2lmaWMgcGF0Y2ggc2V0cyBidXQgbm90IHRoZSBjdXJyZW50IHBhdGNoIHNldCwgZG9uJ3QKKyAgICAgIC8vIGxpc3QgcGVybWl0dGVkIGxhYmVscywgc2luY2UgdXNlcnMgY2FuJ3Qgdm90ZSBvbiB0aG9zZSBwYXRjaCBzZXRzLgorICAgICAgaWYgKGxpbWl0ZWQgPT0gbnVsbCB8fCBsaW1pdGVkLmNvbnRhaW5zKGluLmN1cnJlbnRQYXRjaFNldElkKCkpKSB7CisgICAgICAgIG91dC5wZXJtaXR0ZWRfbGFiZWxzID0gcGVybWl0dGVkTGFiZWxzKGNkKTsKKyAgICAgIH0KKyAgICAgIG91dC5yZW1vdmFibGVfcmV2aWV3ZXJzID0gcmVtb3ZhYmxlUmV2aWV3ZXJzKGNkLCBvdXQubGFiZWxzLnZhbHVlcygpKTsKKyAgICB9CisgICAgb3V0LmZpbmlzaCgpOworCisgICAgaWYgKGhhcyhBTExfUkVWSVNJT05TKSB8fCBoYXMoQ1VSUkVOVF9SRVZJU0lPTikgfHwgbGltaXRlZCAhPSBudWxsKSB7CisgICAgICBvdXQucmV2aXNpb25zID0gcmV2aXNpb25zKGNkKTsKKyAgICAgIGlmIChvdXQucmV2aXNpb25zICE9IG51bGwpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgY29tbWl0IDogb3V0LnJldmlzaW9ucy5rZXlTZXQoKSkgeworICAgICAgICAgIGlmIChvdXQucmV2aXNpb25zLmdldChjb21taXQpLmlzQ3VycmVudCkgeworICAgICAgICAgICAgb3V0LmN1cnJlbnRfcmV2aXNpb24gPSBjb21taXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBsYXN0Q29udHJvbCA9IG51bGw7CisgICAgcmV0dXJuIG91dDsKKyAgfQorCisgIHByaXZhdGUgQ2hhbmdlQ29udHJvbCBjb250cm9sKENoYW5nZURhdGEgY2QpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIENoYW5nZUNvbnRyb2wgY3RybCA9IGNkLmNoYW5nZUNvbnRyb2woKTsKKyAgICBpZiAoY3RybCAhPSBudWxsICYmIGN0cmwuZ2V0Q3VycmVudFVzZXIoKSA9PSB1c2VyKSB7CisgICAgICByZXR1cm4gY3RybDsKKyAgICB9IGVsc2UgaWYgKGxhc3RDb250cm9sICE9IG51bGwKKyAgICAgICAgJiYgY2QuZ2V0SWQoKS5lcXVhbHMobGFzdENvbnRyb2wuZ2V0Q2hhbmdlKCkuZ2V0SWQoKSkpIHsKKyAgICAgIHJldHVybiBsYXN0Q29udHJvbDsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgaWYgKGNoYW5nZUNvbnRyb2xVc2VyRmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgIGN0cmwgPSBjaGFuZ2VDb250cm9sVXNlckZhY3RvcnkuY29udHJvbEZvcihjZC5jaGFuZ2UoZGIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN0cmwgPSBjaGFuZ2VDb250cm9sR2VuZXJpY0ZhY3RvcnkuY29udHJvbEZvcihjZC5jaGFuZ2UoZGIpLCB1c2VyKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIGxhc3RDb250cm9sID0gY3RybDsKKyAgICByZXR1cm4gY3RybDsKKyAgfQorCisgIHByaXZhdGUgTGlzdDxTdWJtaXRSZWNvcmQ+IHN1Ym1pdFJlY29yZHMoQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGNkLmdldFN1Ym1pdFJlY29yZHMoKSAhPSBudWxsKSB7CisgICAgICByZXR1cm4gY2QuZ2V0U3VibWl0UmVjb3JkcygpOworICAgIH0KKyAgICBDaGFuZ2VDb250cm9sIGN0bCA9IGNvbnRyb2woY2QpOworICAgIGlmIChjdGwgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoKTsKKyAgICB9CisgICAgUGF0Y2hTZXQgcHMgPSBjZC5jdXJyZW50UGF0Y2hTZXQoZGIpOworICAgIGlmIChwcyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZigpOworICAgIH0KKyAgICBjZC5zZXRTdWJtaXRSZWNvcmRzKGN0bC5jYW5TdWJtaXQoZGIuZ2V0KCksIHBzLCBjZCwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKKyAgICByZXR1cm4gY2QuZ2V0U3VibWl0UmVjb3JkcygpOworICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVsc0ZvcihDaGFuZ2VEYXRhIGNkLCBib29sZWFuIHN0YW5kYXJkLAorICAgICAgYm9vbGVhbiBkZXRhaWxlZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKCFzdGFuZGFyZCAmJiAhZGV0YWlsZWQpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIENoYW5nZUNvbnRyb2wgY3RsID0gY29udHJvbChjZCk7CisgICAgaWYgKGN0bCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBQYXRjaFNldCBwcyA9IGNkLmN1cnJlbnRQYXRjaFNldChkYik7CisgICAgaWYgKHBzID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcyA9IGN0bC5nZXRMYWJlbFR5cGVzKCk7CisgICAgaWYgKGNkLmdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CisgICAgICByZXR1cm4gbGFiZWxzRm9yT3BlbkNoYW5nZShjZCwgbGFiZWxUeXBlcywgc3RhbmRhcmQsIGRldGFpbGVkKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGxhYmVsc0ZvckNsb3NlZENoYW5nZShjZCwgbGFiZWxUeXBlcywgc3RhbmRhcmQsIGRldGFpbGVkKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gbGFiZWxzRm9yT3BlbkNoYW5nZShDaGFuZ2VEYXRhIGNkLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzLCBib29sZWFuIHN0YW5kYXJkLCBib29sZWFuIGRldGFpbGVkKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgTWFwPFN0cmluZywgTGFiZWxJbmZvPiBsYWJlbHMgPSBpbml0TGFiZWxzKGNkLCBsYWJlbFR5cGVzLCBzdGFuZGFyZCk7CisgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICBzZXRBbGxBcHByb3ZhbHMoY2QsIGxhYmVscyk7CisgICAgfQorICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGFiZWxJbmZvPiBlIDogbGFiZWxzLmVudHJ5U2V0KCkpIHsKKyAgICAgIExhYmVsVHlwZSB0eXBlID0gbGFiZWxUeXBlcy5ieUxhYmVsKGUuZ2V0S2V5KCkpOworICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzdGFuZGFyZCkgeworICAgICAgICBzZXRSZWNvbW1lbmRlZEFuZERpc2xpa2VkKGNkLCB0eXBlLCBlLmdldFZhbHVlKCkpOworICAgICAgfQorICAgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICAgIHNldExhYmVsVmFsdWVzKHR5cGUsIGUuZ2V0VmFsdWUoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsYWJlbHM7CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIExhYmVsSW5mbz4gaW5pdExhYmVscyhDaGFuZ2VEYXRhIGNkLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzLCBib29sZWFuIHN0YW5kYXJkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAvLyBEb24ndCB1c2UgTWFwcy5uZXdUcmVlTWFwKENvbXBhcmF0b3IpIGR1ZSB0byBPcGVuSkRLIGJ1ZyAxMDAxNjcuCisgICAgTWFwPFN0cmluZywgTGFiZWxJbmZvPiBsYWJlbHMgPQorICAgICAgICBuZXcgVHJlZU1hcDxTdHJpbmcsIExhYmVsSW5mbz4obGFiZWxUeXBlcy5uYW1lQ29tcGFyYXRvcigpKTsKKyAgICBmb3IgKFN1Ym1pdFJlY29yZCByZWMgOiBzdWJtaXRSZWNvcmRzKGNkKSkgeworICAgICAgaWYgKHJlYy5sYWJlbHMgPT0gbnVsbCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZvciAoU3VibWl0UmVjb3JkLkxhYmVsIHIgOiByZWMubGFiZWxzKSB7CisgICAgICAgIExhYmVsSW5mbyBwID0gbGFiZWxzLmdldChyLmxhYmVsKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCB8fCBwLl9zdGF0dXMuY29tcGFyZVRvKHIuc3RhdHVzKSA8IDApIHsKKyAgICAgICAgICBMYWJlbEluZm8gbiA9IG5ldyBMYWJlbEluZm8oKTsKKyAgICAgICAgICBuLl9zdGF0dXMgPSByLnN0YXR1czsKKyAgICAgICAgICBpZiAoc3RhbmRhcmQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoci5zdGF0dXMpIHsKKyAgICAgICAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgICAgICBuLmFwcHJvdmVkID0gYWNjb3VudExvYWRlci5nZXQoci5hcHBsaWVkQnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIFJFSkVDVDoKKyAgICAgICAgICAgICAgICBuLnJlamVjdGVkID0gYWNjb3VudExvYWRlci5nZXQoci5hcHBsaWVkQnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIG4ub3B0aW9uYWwgPSBuLl9zdGF0dXMgPT0gU3VibWl0UmVjb3JkLkxhYmVsLlN0YXR1cy5NQVkgPyB0cnVlIDogbnVsbDsKKyAgICAgICAgICBsYWJlbHMucHV0KHIubGFiZWwsIG4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsYWJlbHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0UmVjb21tZW5kZWRBbmREaXNsaWtlZChDaGFuZ2VEYXRhIGNkLCBMYWJlbFR5cGUgdHlwZSwKKyAgICAgIExhYmVsSW5mbyBsYWJlbCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGxhYmVsLmFwcHJvdmVkICE9IG51bGwgfHwgbGFiZWwucmVqZWN0ZWQgIT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh0eXBlLmdldE1pbigpID09IG51bGwgfHwgdHlwZS5nZXRNYXgoKSA9PSBudWxsKSB7CisgICAgICAvLyBVbmtub3duIG9yIG1pc2NvbmZpZ3VyZWQgdHlwZSBjYW4ndCBoYXZlIGludGVybWVkaWF0ZSBzY29yZXMuCisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2hvcnQgbWluID0gdHlwZS5nZXRNaW4oKS5nZXRWYWx1ZSgpOworICAgIHNob3J0IG1heCA9IHR5cGUuZ2V0TWF4KCkuZ2V0VmFsdWUoKTsKKyAgICBpZiAoLTEgPD0gbWluICYmIG1heCA8PSAxKSB7CisgICAgICAvLyBUeXBlcyB3aXRoIGEgcmFuZ2Ugb2YgLTEuLisxIGNhbid0IGhhdmUgaW50ZXJtZWRpYXRlIHNjb3Jlcy4KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogY2QuY3VycmVudEFwcHJvdmFscyhkYikpIHsKKyAgICAgIHNob3J0IHZhbCA9IHBzYS5nZXRWYWx1ZSgpOworICAgICAgaWYgKHZhbCAhPSAwICYmIG1pbiA8IHZhbCAmJiB2YWwgPCBtYXggJiYgdHlwZS5tYXRjaGVzKHBzYSkpIHsKKyAgICAgICAgaWYgKDAgPCB2YWwpIHsKKyAgICAgICAgICBsYWJlbC5yZWNvbW1lbmRlZCA9IGFjY291bnRMb2FkZXIuZ2V0KHBzYS5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgICAgbGFiZWwudmFsdWUgPSB2YWwgIT0gMSA/IHZhbCA6IG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbGFiZWwuZGlzbGlrZWQgPSBhY2NvdW50TG9hZGVyLmdldChwc2EuZ2V0QWNjb3VudElkKCkpOworICAgICAgICAgIGxhYmVsLnZhbHVlID0gdmFsICE9IC0xID8gdmFsIDogbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBwcml2YXRlIHZvaWQgc2V0QWxsQXBwcm92YWxzKENoYW5nZURhdGEgY2QsCisgICAgICBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVscykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBiYXNlQ3RybCA9IGNvbnRyb2woY2QpOworICAgIGlmIChiYXNlQ3RybCA9PSBudWxsKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQWxsIHVzZXJzIGV2ZXIgYWRkZWQsIGV2ZW4gaWYgdGhleSBjYW4ndCB2b3RlIG9uIG9uZSBvciBhbGwgbGFiZWxzLgorICAgIFNldDxBY2NvdW50LklkPiBhbGxVc2VycyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIExpc3RNdWx0aW1hcDxQYXRjaFNldC5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzID0KKyAgICAgICAgY2QuYWxsQXBwcm92YWxzTWFwKGRiKTsKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogYWxsQXBwcm92YWxzLnZhbHVlcygpKSB7CisgICAgICBhbGxVc2Vycy5hZGQocHNhLmdldEFjY291bnRJZCgpKTsKKyAgICB9CisKKyAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnRMaXN0ID0gbGFiZWxOb3JtYWxpemVyLm5vcm1hbGl6ZSgKKyAgICAgICAgYmFzZUN0cmwsIGFsbEFwcHJvdmFscy5nZXQoYmFzZUN0cmwuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKSkpOworICAgIC8vIE1vc3QgcmVjZW50LCBub3JtYWxpemVkIHZvdGUgb24gZWFjaCBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0IGJ5CisgICAgLy8gZWFjaCB1c2VyIChtYXkgYmUgMCkuCisgICAgVGFibGU8QWNjb3VudC5JZCwgU3RyaW5nLCBQYXRjaFNldEFwcHJvdmFsPiBjdXJyZW50ID0gSGFzaEJhc2VkVGFibGUuY3JlYXRlKAorICAgICAgICBhbGxVc2Vycy5zaXplKCksIGJhc2VDdHJsLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCkuc2l6ZSgpKTsKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogY3VycmVudExpc3QpIHsKKyAgICAgIGN1cnJlbnQucHV0KHBzYS5nZXRBY2NvdW50SWQoKSwgcHNhLmdldExhYmVsKCksIHBzYSk7CisgICAgfQorCisgICAgZm9yIChBY2NvdW50LklkIGFjY291bnRJZCA6IGFsbFVzZXJzKSB7CisgICAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gdXNlckZhY3RvcnkuY3JlYXRlKGFjY291bnRJZCk7CisgICAgICBDaGFuZ2VDb250cm9sIGN0bCA9IGJhc2VDdHJsLmZvclVzZXIodXNlcik7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExhYmVsSW5mbz4gZSA6IGxhYmVscy5lbnRyeVNldCgpKSB7CisgICAgICAgIExhYmVsVHlwZSBsdCA9IGN0bC5nZXRMYWJlbFR5cGVzKCkuYnlMYWJlbChlLmdldEtleSgpKTsKKyAgICAgICAgaWYgKGx0ID09IG51bGwpIHsKKyAgICAgICAgICAvLyBJZ25vcmUgc3VibWl0IHJlY29yZCBmb3IgdW5kZWZpbmVkIGxhYmVsOyBsaWtlbHkgdGhlIHN1Ym1pdCBydWxlCisgICAgICAgICAgLy8gYXV0aG9yIGRpZG4ndCBpbnRlbmQgZm9yIHRoZSBsYWJlbCB0byBzaG93IHVwIGluIHRoZSB0YWJsZS4KKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBJbnRlZ2VyIHZhbHVlOworICAgICAgICBQYXRjaFNldEFwcHJvdmFsIHBzYSA9IGN1cnJlbnQuZ2V0KGFjY291bnRJZCwgbHQuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKHBzYSAhPSBudWxsKSB7CisgICAgICAgICAgdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YocHNhLmdldFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEVpdGhlciB0aGUgdXNlciBjYW5ub3Qgdm90ZSBvbiB0aGlzIGxhYmVsLCBvciB0aGVyZSBqdXN0IHdhc24ndCBhCisgICAgICAgICAgLy8gZHVtbXkgYXBwcm92YWwgZm9yIHRoaXMgbGFiZWwuIEV4cGxpY2l0bHkgY2hlY2sgd2hldGhlciB0aGUgdXNlcgorICAgICAgICAgIC8vIGNhbiB2b3RlIG9uIHRoaXMgbGFiZWwuCisgICAgICAgICAgdmFsdWUgPSBsYWJlbE5vcm1hbGl6ZXIuY2FuVm90ZShjdGwsIGx0LCBhY2NvdW50SWQpID8gMCA6IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZS5nZXRWYWx1ZSgpLmFkZEFwcHJvdmFsKGFwcHJvdmFsSW5mbyhhY2NvdW50SWQsIHZhbHVlKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVsc0ZvckNsb3NlZENoYW5nZShDaGFuZ2VEYXRhIGNkLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzLCBib29sZWFuIHN0YW5kYXJkLCBib29sZWFuIGRldGFpbGVkKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgU2V0PEFjY291bnQuSWQ+IGFsbFVzZXJzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBzYSA6IGNkLmFsbEFwcHJvdmFscyhkYikpIHsKKyAgICAgIGFsbFVzZXJzLmFkZChwc2EuZ2V0QWNjb3VudElkKCkpOworICAgIH0KKworICAgIFNldDxTdHJpbmc+IGxhYmVsTmFtZXMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBNdWx0aW1hcDxBY2NvdW50LklkLCBQYXRjaFNldEFwcHJvdmFsPiBjdXJyZW50ID0gSGFzaE11bHRpbWFwLmNyZWF0ZSgpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogY2QuY3VycmVudEFwcHJvdmFscyhkYikpIHsKKyAgICAgIExhYmVsVHlwZSB0eXBlID0gbGFiZWxUeXBlcy5ieUxhYmVsKGEuZ2V0TGFiZWxJZCgpKTsKKyAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgYS5nZXRWYWx1ZSgpICE9IDApIHsKKyAgICAgICAgbGFiZWxOYW1lcy5hZGQodHlwZS5nZXROYW1lKCkpOworICAgICAgICBjdXJyZW50LnB1dChhLmdldEFjY291bnRJZCgpLCBhKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSBjYW4gb25seSBhcHByb3hpbWF0ZWx5IHJlY29uc3RydWN0IHdoYXQgdGhlIHN1Ym1pdCBydWxlIGV2YWx1YXRvcgorICAgIC8vIHdvdWxkIGhhdmUgZG9uZS4gVGhlc2Ugc2hvdWxkIHJlYWxseSBjb21lIGZyb20gYSBzdG9yZWQgc3VibWl0IHJlY29yZC4KKyAgICAvLworICAgIC8vIERvbid0IHVzZSBNYXBzLm5ld1RyZWVNYXAoQ29tcGFyYXRvcikgZHVlIHRvIE9wZW5KREsgYnVnIDEwMDE2Ny4KKyAgICBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVscyA9CisgICAgICAgIG5ldyBUcmVlTWFwPFN0cmluZywgTGFiZWxJbmZvPihsYWJlbFR5cGVzLm5hbWVDb21wYXJhdG9yKCkpOworICAgIGZvciAoU3RyaW5nIG5hbWUgOiBsYWJlbE5hbWVzKSB7CisgICAgICBMYWJlbFR5cGUgdHlwZSA9IGxhYmVsVHlwZXMuYnlMYWJlbChuYW1lKTsKKyAgICAgIExhYmVsSW5mbyBsaSA9IG5ldyBMYWJlbEluZm8oKTsKKyAgICAgIGlmIChkZXRhaWxlZCkgeworICAgICAgICBzZXRMYWJlbFZhbHVlcyh0eXBlLCBsaSk7CisgICAgICB9CisgICAgICBsYWJlbHMucHV0KHR5cGUuZ2V0TmFtZSgpLCBsaSk7CisgICAgfQorCisgICAgZm9yIChBY2NvdW50LklkIGFjY291bnRJZCA6IGFsbFVzZXJzKSB7CisgICAgICBNYXA8U3RyaW5nLCBBcHByb3ZhbEluZm8+IGJ5TGFiZWwgPQorICAgICAgICAgIE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUobGFiZWxzLnNpemUoKSk7CisKKyAgICAgIGlmIChkZXRhaWxlZCkgeworICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbGFiZWxzLmtleVNldCgpKSB7CisgICAgICAgICAgQXBwcm92YWxJbmZvIGFpID0gYXBwcm92YWxJbmZvKGFjY291bnRJZCwgMCk7CisgICAgICAgICAgYnlMYWJlbC5wdXQobmFtZSwgYWkpOworICAgICAgICAgIGxhYmVscy5nZXQobmFtZSkuYWRkQXBwcm92YWwoYWkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogY3VycmVudC5nZXQoYWNjb3VudElkKSkgeworICAgICAgICBMYWJlbFR5cGUgdHlwZSA9IGxhYmVsVHlwZXMuYnlMYWJlbChwc2EuZ2V0TGFiZWxJZCgpKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2hvcnQgdmFsID0gcHNhLmdldFZhbHVlKCk7CisgICAgICAgIEFwcHJvdmFsSW5mbyBpbmZvID0gYnlMYWJlbC5nZXQodHlwZS5nZXROYW1lKCkpOworICAgICAgICBpZiAoaW5mbyAhPSBudWxsKSB7CisgICAgICAgICAgaW5mby52YWx1ZSA9IEludGVnZXIudmFsdWVPZih2YWwpOworICAgICAgICB9CisKKyAgICAgICAgTGFiZWxJbmZvIGxpID0gbGFiZWxzLmdldCh0eXBlLmdldE5hbWUoKSk7CisgICAgICAgIGlmICghc3RhbmRhcmQgfHwgbGkuYXBwcm92ZWQgIT0gbnVsbCB8fCBsaS5yZWplY3RlZCAhPSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbCA9PSB0eXBlLmdldE1heCgpLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICBsaS5hcHByb3ZlZCA9IGFjY291bnRMb2FkZXIuZ2V0KGFjY291bnRJZCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsID09IHR5cGUuZ2V0TWluKCkuZ2V0VmFsdWUoKQorICAgICAgICAgICAgLy8gQSBtZXJnZWQgY2hhbmdlIGNhbid0IGhhdmUgYmVlbiByZWplY3RlZC4KKyAgICAgICAgICAgICYmIGNkLmdldENoYW5nZSgpLmdldFN0YXR1cygpICE9IFN0YXR1cy5NRVJHRUQpIHsKKyAgICAgICAgICBsaS5yZWplY3RlZCA9IGFjY291bnRMb2FkZXIuZ2V0KGFjY291bnRJZCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsID4gMCkgeworICAgICAgICAgIGxpLnJlY29tbWVuZGVkID0gYWNjb3VudExvYWRlci5nZXQoYWNjb3VudElkKTsKKyAgICAgICAgICBsaS52YWx1ZSA9IHZhbDsKKyAgICAgICAgfSBlbHNlIGlmICh2YWwgPCAwKSB7CisgICAgICAgICAgbGkuZGlzbGlrZWQgPSBhY2NvdW50TG9hZGVyLmdldChhY2NvdW50SWQpOworICAgICAgICAgIGxpLnZhbHVlID0gdmFsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsYWJlbHM7CisgIH0KKworICBwcml2YXRlIEFwcHJvdmFsSW5mbyBhcHByb3ZhbEluZm8oQWNjb3VudC5JZCBpZCwgSW50ZWdlciB2YWx1ZSkgeworICAgIEFwcHJvdmFsSW5mbyBhaSA9IG5ldyBBcHByb3ZhbEluZm8oaWQpOworICAgIGFpLnZhbHVlID0gdmFsdWU7CisgICAgYWNjb3VudExvYWRlci5wdXQoYWkpOworICAgIHJldHVybiBhaTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPbmx5WmVybyhDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKSB7CisgICAgcmV0dXJuIHZhbHVlcy5pc0VtcHR5KCkgfHwgKHZhbHVlcy5zaXplKCkgPT0gMSAmJiB2YWx1ZXMuY29udGFpbnMoIiAwIikpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNldExhYmVsVmFsdWVzKExhYmVsVHlwZSB0eXBlLCBMYWJlbEluZm8gbGFiZWwpIHsKKyAgICBsYWJlbC52YWx1ZXMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICBmb3IgKExhYmVsVmFsdWUgdiA6IHR5cGUuZ2V0VmFsdWVzKCkpIHsKKyAgICAgIGxhYmVsLnZhbHVlcy5wdXQodi5mb3JtYXRWYWx1ZSgpLCB2LmdldFRleHQoKSk7CisgICAgfQorICAgIGlmIChpc09ubHlaZXJvKGxhYmVsLnZhbHVlcy5rZXlTZXQoKSkpIHsKKyAgICAgIGxhYmVsLnZhbHVlcyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBlcm1pdHRlZExhYmVscyhDaGFuZ2VEYXRhIGNkKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBjdGwgPSBjb250cm9sKGNkKTsKKyAgICBpZiAoY3RsID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcyA9IGN0bC5nZXRMYWJlbFR5cGVzKCk7CisgICAgTGlzdE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBwZXJtaXR0ZWQgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgZm9yIChTdWJtaXRSZWNvcmQgcmVjIDogc3VibWl0UmVjb3JkcyhjZCkpIHsKKyAgICAgIGlmIChyZWMubGFiZWxzID09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKFN1Ym1pdFJlY29yZC5MYWJlbCByIDogcmVjLmxhYmVscykgeworICAgICAgICBMYWJlbFR5cGUgdHlwZSA9IGxhYmVsVHlwZXMuYnlMYWJlbChyLmxhYmVsKTsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFBlcm1pc3Npb25SYW5nZSByYW5nZSA9IGN0bC5nZXRSYW5nZShQZXJtaXNzaW9uLmZvckxhYmVsKHIubGFiZWwpKTsKKyAgICAgICAgZm9yIChMYWJlbFZhbHVlIHYgOiB0eXBlLmdldFZhbHVlcygpKSB7CisgICAgICAgICAgaWYgKHJhbmdlLmNvbnRhaW5zKHYuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgIHBlcm1pdHRlZC5wdXQoci5sYWJlbCwgdi5mb3JtYXRWYWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgTGlzdDxTdHJpbmc+IHRvQ2xlYXIgPQorICAgICAgTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHBlcm1pdHRlZC5rZXlTZXQoKS5zaXplKCkpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBlCisgICAgICAgIDogcGVybWl0dGVkLmFzTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgaWYgKGlzT25seVplcm8oZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICB0b0NsZWFyLmFkZChlLmdldEtleSgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChTdHJpbmcgbGFiZWwgOiB0b0NsZWFyKSB7CisgICAgICBwZXJtaXR0ZWQucmVtb3ZlQWxsKGxhYmVsKTsKKyAgICB9CisgICAgcmV0dXJuIHBlcm1pdHRlZC5hc01hcCgpOworICB9CisKKyAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFjY291bnRJbmZvPiByZW1vdmFibGVSZXZpZXdlcnMoQ2hhbmdlRGF0YSBjZCwKKyAgICAgIENvbGxlY3Rpb248TGFiZWxJbmZvPiBsYWJlbHMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIENoYW5nZUNvbnRyb2wgY3RsID0gY29udHJvbChjZCk7CisgICAgaWYgKGN0bCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBTZXQ8QWNjb3VudC5JZD4gZml4ZWQgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGxhYmVscy5zaXplKCkpOworICAgIFNldDxBY2NvdW50LklkPiByZW1vdmFibGUgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGxhYmVscy5zaXplKCkpOworICAgIGZvciAoTGFiZWxJbmZvIGxhYmVsIDogbGFiZWxzKSB7CisgICAgICBpZiAobGFiZWwuYWxsID09IG51bGwpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKEFwcHJvdmFsSW5mbyBhaSA6IGxhYmVsLmFsbCkgeworICAgICAgICBpZiAoY3RsLmNhblJlbW92ZVJldmlld2VyKGFpLl9pZCwgT2JqZWN0cy5maXJzdE5vbk51bGwoYWkudmFsdWUsIDApKSkgeworICAgICAgICAgIHJlbW92YWJsZS5hZGQoYWkuX2lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaXhlZC5hZGQoYWkuX2lkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZW1vdmFibGUucmVtb3ZlQWxsKGZpeGVkKTsKKworICAgIExpc3Q8QWNjb3VudEluZm8+IHJlc3VsdCA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShyZW1vdmFibGUuc2l6ZSgpKTsKKyAgICBmb3IgKEFjY291bnQuSWQgaWQgOiByZW1vdmFibGUpIHsKKyAgICAgIHJlc3VsdC5hZGQoYWNjb3VudExvYWRlci5nZXQoaWQpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpc0NoYW5nZVJldmlld2VkKENoYW5nZURhdGEgY2QpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGlmICh1c2VyIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpIHsKKyAgICAgIFBhdGNoU2V0IGN1cnJlbnRQYXRjaFNldCA9IGNkLmN1cnJlbnRQYXRjaFNldChkYik7CisgICAgICBpZiAoY3VycmVudFBhdGNoU2V0ID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBMaXN0PENoYW5nZU1lc3NhZ2U+IG1lc3NhZ2VzID0KKyAgICAgICAgICBkYi5nZXQoKS5jaGFuZ2VNZXNzYWdlcygpLmJ5UGF0Y2hTZXQoY3VycmVudFBhdGNoU2V0LmdldElkKCkpLnRvTGlzdCgpOworCisgICAgICBpZiAobWVzc2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgLy8gU29ydCBtZXNzYWdlcyB0byBsZXQgdGhlIG1vc3QgcmVjZW50IG9uZXMgYXQgdGhlIGJlZ2lubmluZy4KKyAgICAgIENvbGxlY3Rpb25zLnNvcnQobWVzc2FnZXMsIG5ldyBDb21wYXJhdG9yPENoYW5nZU1lc3NhZ2U+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKENoYW5nZU1lc3NhZ2UgYSwgQ2hhbmdlTWVzc2FnZSBiKSB7CisgICAgICAgICAgcmV0dXJuIGIuZ2V0V3JpdHRlbk9uKCkuY29tcGFyZVRvKGEuZ2V0V3JpdHRlbk9uKCkpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgQWNjb3VudC5JZCBjdXJyZW50VXNlcklkID0gKChJZGVudGlmaWVkVXNlcikgdXNlcikuZ2V0QWNjb3VudElkKCk7CisgICAgICBBY2NvdW50LklkIGNoYW5nZU93bmVySWQgPSBjZC5jaGFuZ2UoZGIpLmdldE93bmVyKCk7CisgICAgICBmb3IgKENoYW5nZU1lc3NhZ2UgY20gOiBtZXNzYWdlcykgeworICAgICAgICBpZiAoY3VycmVudFVzZXJJZC5lcXVhbHMoY20uZ2V0QXV0aG9yKCkpKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlT3duZXJJZC5lcXVhbHMoY20uZ2V0QXV0aG9yKCkpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgUmV2aXNpb25JbmZvPiByZXZpc2lvbnMoQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBjdGwgPSBjb250cm9sKGNkKTsKKyAgICBpZiAoY3RsID09IG51bGwpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIENvbGxlY3Rpb248UGF0Y2hTZXQ+IHNyYzsKKyAgICBpZiAoY2QuZ2V0TGltaXRlZFBhdGNoU2V0cygpICE9IG51bGwgfHwgaGFzKEFMTF9SRVZJU0lPTlMpKSB7CisgICAgICBzcmMgPSBjZC5wYXRjaGVzKGRiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjZC5jdXJyZW50UGF0Y2hTZXQoZGIpKTsKKyAgICB9CisgICAgTWFwPFN0cmluZywgUmV2aXNpb25JbmZvPiByZXMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICBmb3IgKFBhdGNoU2V0IGluIDogc3JjKSB7CisgICAgICBpZiAoY3RsLmlzUGF0Y2hWaXNpYmxlKGluLCBkYi5nZXQoKSkpIHsKKyAgICAgICAgcmVzLnB1dChpbi5nZXRSZXZpc2lvbigpLmdldCgpLCB0b1JldmlzaW9uSW5mbyhjZCwgaW4pKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorCisgIHByaXZhdGUgUmV2aXNpb25JbmZvIHRvUmV2aXNpb25JbmZvKENoYW5nZURhdGEgY2QsIFBhdGNoU2V0IGluKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgUmV2aXNpb25JbmZvIG91dCA9IG5ldyBSZXZpc2lvbkluZm8oKTsKKyAgICBvdXQuaXNDdXJyZW50ID0gaW4uZ2V0SWQoKS5lcXVhbHMoY2QuY2hhbmdlKGRiKS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICBvdXQuX251bWJlciA9IGluLmdldElkKCkuZ2V0KCk7CisgICAgb3V0LmRyYWZ0ID0gaW4uaXNEcmFmdCgpID8gdHJ1ZSA6IG51bGw7CisgICAgb3V0LmZldGNoID0gbWFrZUZldGNoTWFwKGNkLCBpbik7CisKKyAgICBpZiAoaGFzKEFMTF9DT01NSVRTKSB8fCAob3V0LmlzQ3VycmVudCAmJiBoYXMoQ1VSUkVOVF9DT01NSVQpKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgUGF0Y2hTZXRJbmZvIGluZm8gPSBwYXRjaFNldEluZm9GYWN0b3J5LmdldChkYi5nZXQoKSwgaW4uZ2V0SWQoKSk7CisgICAgICAgIG91dC5jb21taXQgPSBuZXcgQ29tbWl0SW5mbygpOworICAgICAgICBvdXQuY29tbWl0LnBhcmVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoaW5mby5nZXRQYXJlbnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgb3V0LmNvbW1pdC5hdXRob3IgPSB0b0dpdFBlcnNvbihpbmZvLmdldEF1dGhvcigpKTsKKyAgICAgICAgb3V0LmNvbW1pdC5jb21taXR0ZXIgPSB0b0dpdFBlcnNvbihpbmZvLmdldENvbW1pdHRlcigpKTsKKyAgICAgICAgb3V0LmNvbW1pdC5zdWJqZWN0ID0gaW5mby5nZXRTdWJqZWN0KCk7CisgICAgICAgIG91dC5jb21taXQubWVzc2FnZSA9IGluZm8uZ2V0TWVzc2FnZSgpOworCisgICAgICAgIGZvciAoUGFyZW50SW5mbyBwYXJlbnQgOiBpbmZvLmdldFBhcmVudHMoKSkgeworICAgICAgICAgIENvbW1pdEluZm8gaSA9IG5ldyBDb21taXRJbmZvKCk7CisgICAgICAgICAgaS5jb21taXQgPSBwYXJlbnQuaWQuZ2V0KCk7CisgICAgICAgICAgaS5zdWJqZWN0ID0gcGFyZW50LnNob3J0TWVzc2FnZTsKKyAgICAgICAgICBvdXQuY29tbWl0LnBhcmVudHMuYWRkKGkpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgICBsb2cud2FybigiQ2Fubm90IGxvYWQgUGF0Y2hTZXRJbmZvICIgKyBpbi5nZXRJZCgpLCBlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGFzKEFMTF9GSUxFUykgfHwgKG91dC5pc0N1cnJlbnQgJiYgaGFzKENVUlJFTlRfRklMRVMpKSkgeworICAgICAgUGF0Y2hMaXN0IGxpc3Q7CisgICAgICB0cnkgeworICAgICAgICBsaXN0ID0gcGF0Y2hMaXN0Q2FjaGUuZ2V0KGNkLmNoYW5nZShkYiksIGluKTsKKyAgICAgIH0gY2F0Y2ggKFBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZy53YXJuKCJDYW5ub3QgbG9hZCBQYXRjaExpc3QgIiArIGluLmdldElkKCksIGUpOworICAgICAgICBsaXN0ID0gbnVsbDsKKyAgICAgIH0KKyAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKKyAgICAgICAgb3V0LmZpbGVzID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgICAgIGZvciAoUGF0Y2hMaXN0RW50cnkgZSA6IGxpc3QuZ2V0UGF0Y2hlcygpKSB7CisgICAgICAgICAgaWYgKFBhdGNoLkNPTU1JVF9NU0cuZXF1YWxzKGUuZ2V0TmV3TmFtZSgpKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgRmlsZUluZm8gZCA9IG5ldyBGaWxlSW5mbygpOworICAgICAgICAgIGQuc3RhdHVzID0gZS5nZXRDaGFuZ2VUeXBlKCkgIT0gUGF0Y2guQ2hhbmdlVHlwZS5NT0RJRklFRAorICAgICAgICAgICAgICA/IGUuZ2V0Q2hhbmdlVHlwZSgpLmdldENvZGUoKQorICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgICAgZC5vbGRQYXRoID0gZS5nZXRPbGROYW1lKCk7CisgICAgICAgICAgaWYgKGUuZ2V0UGF0Y2hUeXBlKCkgPT0gUGF0Y2guUGF0Y2hUeXBlLkJJTkFSWSkgeworICAgICAgICAgICAgZC5iaW5hcnkgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkLmxpbmVzSW5zZXJ0ZWQgPSBlLmdldEluc2VydGlvbnMoKSA+IDAgPyBlLmdldEluc2VydGlvbnMoKSA6IG51bGw7CisgICAgICAgICAgICBkLmxpbmVzRGVsZXRlZCA9IGUuZ2V0RGVsZXRpb25zKCkgPiAwID8gZS5nZXREZWxldGlvbnMoKSA6IG51bGw7CisgICAgICAgICAgfQorCisgICAgICAgICAgRmlsZUluZm8gbyA9IG91dC5maWxlcy5wdXQoZS5nZXROZXdOYW1lKCksIGQpOworICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGEgZGVsZXRlLWFkZCBicmVhayBjcmVhdGVkIGJ5IEpHaXQKKyAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpbGUgd2FzIHJld3JpdHRlbiBhbmQgdG9vIGxpdHRsZSBjb250ZW50IHN1cnZpdmVkLiBXcml0ZQorICAgICAgICAgICAgLy8gYSBzaW5nbGUgcmVjb3JkIHdpdGggZGF0YSBmcm9tIGJvdGggc2lkZXMuCisgICAgICAgICAgICBkLnN0YXR1cyA9IFBhdGNoLkNoYW5nZVR5cGUuUkVXUklURS5nZXRDb2RlKCk7CisgICAgICAgICAgICBpZiAoby5iaW5hcnkgIT0gbnVsbCAmJiBvLmJpbmFyeSkgeworICAgICAgICAgICAgICBkLmJpbmFyeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoby5saW5lc0luc2VydGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZC5saW5lc0luc2VydGVkID0gby5saW5lc0luc2VydGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8ubGluZXNEZWxldGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgZC5saW5lc0RlbGV0ZWQgPSBvLmxpbmVzRGVsZXRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dDsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgRmV0Y2hJbmZvPiBtYWtlRmV0Y2hNYXAoQ2hhbmdlRGF0YSBjZCwgUGF0Y2hTZXQgaW4pCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBGZXRjaEluZm8+IHIgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICBTdHJpbmcgcmVmTmFtZSA9IGluLmdldFJlZk5hbWUoKTsKKyAgICBDaGFuZ2VDb250cm9sIGN0bCA9IGNvbnRyb2woY2QpOworICAgIGlmIChjdGwgIT0gbnVsbCAmJiBjdGwuZm9yVXNlcihhbm9ueW1vdXMpLmlzUGF0Y2hWaXNpYmxlKGluLCBkYi5nZXQoKSkpIHsKKyAgICAgIGlmICh1cmxzLmdpdCAhPSBudWxsKSB7CisgICAgICAgIHIucHV0KCJnaXQiLCBuZXcgRmV0Y2hJbmZvKHVybHMuZ2l0CisgICAgICAgICAgICArIGNkLmNoYW5nZShkYikuZ2V0UHJvamVjdCgpLmdldCgpLCByZWZOYW1lKSk7CisgICAgICB9CisgICAgfQorICAgIGlmICh1cmxzLmh0dHAgIT0gbnVsbCkgeworICAgICAgci5wdXQoImh0dHAiLCBuZXcgRmV0Y2hJbmZvKHVybHMuaHR0cAorICAgICAgICAgICsgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCksIHJlZk5hbWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nIGh0dHAgPSB1cmxQcm92aWRlci5nZXQoKTsKKyAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGh0dHApKSB7CisgICAgICAgIHIucHV0KCJodHRwIiwgbmV3IEZldGNoSW5mbyhodHRwCisgICAgICAgICAgICArIGNkLmNoYW5nZShkYikuZ2V0UHJvamVjdCgpLmdldCgpLCByZWZOYW1lKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChzc2hJbmZvICE9IG51bGwgJiYgIXNzaEluZm8uZ2V0SG9zdEtleXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgIEhvc3RLZXkgaG9zdCA9IHNzaEluZm8uZ2V0SG9zdEtleXMoKS5nZXQoMCk7CisgICAgICByLnB1dCgic3NoIiwgbmV3IEZldGNoSW5mbyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJzc2g6Ly8lcy8lcyIsCisgICAgICAgICAgaG9zdC5nZXRIb3N0KCksIGNkLmNoYW5nZShkYikuZ2V0UHJvamVjdCgpLmdldCgpKSwKKyAgICAgICAgICByZWZOYW1lKSk7CisgICAgfQorCisgICAgcmV0dXJuIHI7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBHaXRQZXJzb24gdG9HaXRQZXJzb24oVXNlcklkZW50aXR5IGNvbW1pdHRlcikgeworICAgIEdpdFBlcnNvbiBwID0gbmV3IEdpdFBlcnNvbigpOworICAgIHAubmFtZSA9IGNvbW1pdHRlci5nZXROYW1lKCk7CisgICAgcC5lbWFpbCA9IGNvbW1pdHRlci5nZXRFbWFpbCgpOworICAgIHAuZGF0ZSA9IGNvbW1pdHRlci5nZXREYXRlKCk7CisgICAgcC50eiA9IGNvbW1pdHRlci5nZXRUaW1lWm9uZSgpOworICAgIHJldHVybiBwOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGFuZ2VJbmZvIHsKKyAgICBmaW5hbCBTdHJpbmcga2luZCA9ICJnZXJyaXRjb2RlcmV2aWV3I2NoYW5nZSI7CisgICAgU3RyaW5nIGlkOworICAgIFN0cmluZyBwcm9qZWN0OworICAgIFN0cmluZyBicmFuY2g7CisgICAgU3RyaW5nIHRvcGljOworICAgIHB1YmxpYyBTdHJpbmcgY2hhbmdlSWQ7CisgICAgcHVibGljIFN0cmluZyBzdWJqZWN0OworICAgIENoYW5nZS5TdGF0dXMgc3RhdHVzOworICAgIFRpbWVzdGFtcCBjcmVhdGVkOworICAgIFRpbWVzdGFtcCB1cGRhdGVkOworICAgIEJvb2xlYW4gc3RhcnJlZDsKKyAgICBCb29sZWFuIHJldmlld2VkOworICAgIEJvb2xlYW4gbWVyZ2VhYmxlOworCisgICAgU3RyaW5nIF9zb3J0a2V5OworICAgIGludCBfbnVtYmVyOworCisgICAgQWNjb3VudEluZm8gb3duZXI7CisKKyAgICBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVsczsKKyAgICBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IHBlcm1pdHRlZF9sYWJlbHM7CisgICAgQ29sbGVjdGlvbjxBY2NvdW50SW5mbz4gcmVtb3ZhYmxlX3Jldmlld2VyczsKKworICAgIFN0cmluZyBjdXJyZW50X3JldmlzaW9uOworICAgIE1hcDxTdHJpbmcsIFJldmlzaW9uSW5mbz4gcmV2aXNpb25zOworICAgIHB1YmxpYyBCb29sZWFuIF9tb3JlQ2hhbmdlczsKKworICAgIHZvaWQgZmluaXNoKCkgeworICAgICAgaWQgPSBKb2luZXIub24oJ34nKS5qb2luKAorICAgICAgICAgIFVybC5lbmNvZGUocHJvamVjdCksCisgICAgICAgICAgVXJsLmVuY29kZShicmFuY2gpLAorICAgICAgICAgIFVybC5lbmNvZGUoY2hhbmdlSWQpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgUmV2aXNpb25JbmZvIHsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBib29sZWFuIGlzQ3VycmVudDsKKyAgICBCb29sZWFuIGRyYWZ0OworICAgIGludCBfbnVtYmVyOworICAgIE1hcDxTdHJpbmcsIEZldGNoSW5mbz4gZmV0Y2g7CisgICAgQ29tbWl0SW5mbyBjb21taXQ7CisgICAgTWFwPFN0cmluZywgRmlsZUluZm8+IGZpbGVzOworICB9CisKKyAgc3RhdGljIGNsYXNzIEZldGNoSW5mbyB7CisgICAgU3RyaW5nIHVybDsKKyAgICBTdHJpbmcgcmVmOworCisgICAgRmV0Y2hJbmZvKFN0cmluZyB1cmwsIFN0cmluZyByZWYpIHsKKyAgICAgIHRoaXMudXJsID0gdXJsOworICAgICAgdGhpcy5yZWYgPSByZWY7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIEdpdFBlcnNvbiB7CisgICAgU3RyaW5nIG5hbWU7CisgICAgU3RyaW5nIGVtYWlsOworICAgIFRpbWVzdGFtcCBkYXRlOworICAgIGludCB0ejsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBDb21taXRJbmZvIHsKKyAgICBTdHJpbmcgY29tbWl0OworICAgIExpc3Q8Q29tbWl0SW5mbz4gcGFyZW50czsKKyAgICBHaXRQZXJzb24gYXV0aG9yOworICAgIEdpdFBlcnNvbiBjb21taXR0ZXI7CisgICAgU3RyaW5nIHN1YmplY3Q7CisgICAgU3RyaW5nIG1lc3NhZ2U7CisgIH0KKworICBzdGF0aWMgY2xhc3MgRmlsZUluZm8geworICAgIENoYXJhY3RlciBzdGF0dXM7CisgICAgQm9vbGVhbiBiaW5hcnk7CisgICAgU3RyaW5nIG9sZFBhdGg7CisgICAgSW50ZWdlciBsaW5lc0luc2VydGVkOworICAgIEludGVnZXIgbGluZXNEZWxldGVkOworICB9CisKKyAgc3RhdGljIGNsYXNzIExhYmVsSW5mbyB7CisgICAgdHJhbnNpZW50IFN1Ym1pdFJlY29yZC5MYWJlbC5TdGF0dXMgX3N0YXR1czsKKworICAgIEFjY291bnRJbmZvIGFwcHJvdmVkOworICAgIEFjY291bnRJbmZvIHJlamVjdGVkOworICAgIEFjY291bnRJbmZvIHJlY29tbWVuZGVkOworICAgIEFjY291bnRJbmZvIGRpc2xpa2VkOworICAgIExpc3Q8QXBwcm92YWxJbmZvPiBhbGw7CisKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbHVlczsKKworICAgIFNob3J0IHZhbHVlOworICAgIEJvb2xlYW4gb3B0aW9uYWw7CisKKyAgICB2b2lkIGFkZEFwcHJvdmFsKEFwcHJvdmFsSW5mbyBhaSkgeworICAgICAgaWYgKGFsbCA9PSBudWxsKSB7CisgICAgICAgIGFsbCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgfQorICAgICAgYWxsLmFkZChhaSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIEFwcHJvdmFsSW5mbyBleHRlbmRzIEFjY291bnRJbmZvIHsKKyAgICBJbnRlZ2VyIHZhbHVlOworCisgICAgQXBwcm92YWxJbmZvKEFjY291bnQuSWQgaWQpIHsKKyAgICAgIHN1cGVyKGlkKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZU1lc3NhZ2VzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VNZXNzYWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzZkM2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5ubHMuTkxTOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubmxzLlRyYW5zbGF0aW9uQnVuZGxlOworCitwdWJsaWMgY2xhc3MgQ2hhbmdlTWVzc2FnZXMgZXh0ZW5kcyBUcmFuc2xhdGlvbkJ1bmRsZSB7CisgIHB1YmxpYyBzdGF0aWMgQ2hhbmdlTWVzc2FnZXMgZ2V0KCkgeworICAgIHJldHVybiBOTFMuZ2V0QnVuZGxlRm9yKENoYW5nZU1lc3NhZ2VzLmNsYXNzKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgcmV2ZXJ0Q2hhbmdlRGVmYXVsdE1lc3NhZ2U7CisgIHB1YmxpYyBTdHJpbmcgcmV2aWV3ZXJOb3RGb3VuZDsKKworICBwdWJsaWMgU3RyaW5nIGdyb3VwSXNOb3RBbGxvd2VkOworICBwdWJsaWMgU3RyaW5nIGdyb3VwSGFzVG9vTWFueU1lbWJlcnM7CisgIHB1YmxpYyBTdHJpbmcgZ3JvdXBNYW55TWVtYmVyc0NvbmZpcm1hdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZVJlc291cmNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMzA4MWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworCitwdWJsaWMgY2xhc3MgQ2hhbmdlUmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PENoYW5nZVJlc291cmNlPj4gQ0hBTkdFX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PENoYW5nZVJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbDsKKworICBwdWJsaWMgQ2hhbmdlUmVzb3VyY2UoQ2hhbmdlQ29udHJvbCBjb250cm9sKSB7CisgICAgdGhpcy5jb250cm9sID0gY29udHJvbDsKKyAgfQorCisgIHByb3RlY3RlZCBDaGFuZ2VSZXNvdXJjZShDaGFuZ2VSZXNvdXJjZSBjb3B5KSB7CisgICAgdGhpcy5jb250cm9sID0gY29weS5jb250cm9sOworICB9CisKKyAgcHVibGljIENoYW5nZUNvbnRyb2wgZ2V0Q29udHJvbCgpIHsKKyAgICByZXR1cm4gY29udHJvbDsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2UgZ2V0Q2hhbmdlKCkgeworICAgIHJldHVybiBnZXRDb250cm9sKCkuZ2V0Q2hhbmdlKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0NoYW5nZXNDb2xsZWN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VzQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDBlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VzQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLlF1ZXJ5Q2hhbmdlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDaGFuZ2VzQ29sbGVjdGlvbiBpbXBsZW1lbnRzCisgICAgUmVzdENvbGxlY3Rpb248VG9wTGV2ZWxSZXNvdXJjZSwgQ2hhbmdlUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFF1ZXJ5Q2hhbmdlcz4gcXVlcnlGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8Q2hhbmdlUmVzb3VyY2U+PiB2aWV3czsKKworICBASW5qZWN0CisgIENoYW5nZXNDb2xsZWN0aW9uKAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCisgICAgICBQcm92aWRlcjxRdWVyeUNoYW5nZXM+IHF1ZXJ5RmFjdG9yeSwKKyAgICAgIER5bmFtaWNNYXA8UmVzdFZpZXc8Q2hhbmdlUmVzb3VyY2U+PiB2aWV3cykgeworICAgIHRoaXMuZGIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLnF1ZXJ5RmFjdG9yeSA9IHF1ZXJ5RmFjdG9yeTsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PFRvcExldmVsUmVzb3VyY2U+IGxpc3QoKSB7CisgICAgcmV0dXJuIHF1ZXJ5RmFjdG9yeS5nZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxDaGFuZ2VSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgQ2hhbmdlUmVzb3VyY2UgcGFyc2UoVG9wTGV2ZWxSZXNvdXJjZSByb290LCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24sCisgICAgICBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBQYXJzZWRJZCBwID0gbmV3IFBhcnNlZElkKGlkLmVuY29kZWQoKSk7CisgICAgTGlzdDxDaGFuZ2U+IGNoYW5nZXMgPSBmaW5kQ2hhbmdlcyhwKTsKKyAgICBpZiAoY2hhbmdlcy5zaXplKCkgIT0gMSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgIH0KKworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbDsKKyAgICB0cnkgeworICAgICAgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZXMuZ2V0KDApKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgIH0KKyAgICByZXR1cm4gbmV3IENoYW5nZVJlc291cmNlKGNvbnRyb2wpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PENoYW5nZT4gZmluZENoYW5nZXMoUGFyc2VkSWQgaykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGsubGVnYWN5SWQgIT0gbnVsbCkgeworICAgICAgQ2hhbmdlIGMgPSBkYi5nZXQoKS5jaGFuZ2VzKCkuZ2V0KGsubGVnYWN5SWQpOworICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihjKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9IGVsc2UgaWYgKGsucHJvamVjdCA9PSBudWxsICYmIGsuYnJhbmNoID09IG51bGwgJiYgay5jaGFuZ2VJZCAhPSBudWxsKSB7CisgICAgICBDaGFuZ2UuS2V5IGlkID0gbmV3IENoYW5nZS5LZXkoay5jaGFuZ2VJZCk7CisgICAgICBpZiAoaWQuZ2V0KCkubGVuZ3RoKCkgPT0gNDEpIHsKKyAgICAgICAgcmV0dXJuIGRiLmdldCgpLmNoYW5nZXMoKS5ieUtleShpZCkudG9MaXN0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZGIuZ2V0KCkuY2hhbmdlcygpLmJ5S2V5UmFuZ2UoaWQsIGlkLm1heCgpKS50b0xpc3QoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRiLmdldCgpLmNoYW5nZXMoKS5ieUJyYW5jaEtleSgKKyAgICAgICAgay5icmFuY2goKSwKKyAgICAgICAgbmV3IENoYW5nZS5LZXkoay5jaGFuZ2VJZCkpLnRvTGlzdCgpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFyc2VkSWQgeworICAgIENoYW5nZS5JZCBsZWdhY3lJZDsKKyAgICBTdHJpbmcgcHJvamVjdDsKKyAgICBTdHJpbmcgYnJhbmNoOworICAgIFN0cmluZyBjaGFuZ2VJZDsKKworICAgIFBhcnNlZElkKFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24geworICAgICAgaWYgKGlkLm1hdGNoZXMoIl5bMS05XVswLTldKiQiKSkgeworICAgICAgICBsZWdhY3lJZCA9IENoYW5nZS5JZC5wYXJzZShpZCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgaW50IHQyID0gaWQubGFzdEluZGV4T2YoJ34nKTsKKyAgICAgIGludCB0MSA9IGlkLmxhc3RJbmRleE9mKCd+JywgdDIgLSAxKTsKKyAgICAgIGlmICh0MSA8IDAgfHwgdDIgPCAwKSB7CisgICAgICAgIGlmICghaWQubWF0Y2hlcygiXklbMC05YS16XXs0LDQwfSQiKSkgeworICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICAgICAgfQorICAgICAgICBjaGFuZ2VJZCA9IGlkOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHByb2plY3QgPSBVcmwuZGVjb2RlKGlkLnN1YnN0cmluZygwLCB0MSkpOworICAgICAgYnJhbmNoID0gVXJsLmRlY29kZShpZC5zdWJzdHJpbmcodDEgKyAxLCB0MikpOworICAgICAgY2hhbmdlSWQgPSBVcmwuZGVjb2RlKGlkLnN1YnN0cmluZyh0MiArIDEpKTsKKworICAgICAgaWYgKCFicmFuY2guc3RhcnRzV2l0aChDb25zdGFudHMuUl9SRUZTKSkgeworICAgICAgICBicmFuY2ggPSBDb25zdGFudHMuUl9IRUFEUyArIGJyYW5jaDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBCcmFuY2guTmFtZUtleSBicmFuY2goKSB7CisgICAgICByZXR1cm4gbmV3IEJyYW5jaC5OYW1lS2V5KG5ldyBQcm9qZWN0Lk5hbWVLZXkocHJvamVjdCksIGJyYW5jaCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DcmVhdGVEcmFmdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ3JlYXRlRHJhZnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDhiZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ3JlYXRlRHJhZnQuamF2YQpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50LlN0YXR1czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5QdXREcmFmdC5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworY2xhc3MgQ3JlYXRlRHJhZnQgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxSZXZpc2lvblJlc291cmNlLCBJbnB1dD4geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKworICBASW5qZWN0CisgIENyZWF0ZURyYWZ0KFByb3ZpZGVyPFJldmlld0RiPiBkYikgeworICAgIHRoaXMuZGIgPSBkYjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzcG9uc2U8R2V0RHJhZnQuQ29tbWVudD4gYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByc3JjLCBJbnB1dCBpbikKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaW4ucGF0aCkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJwYXRoIG11c3QgYmUgbm9uLWVtcHR5Iik7CisgICAgfSBlbHNlIGlmIChpbi5tZXNzYWdlID09IG51bGwgfHwgaW4ubWVzc2FnZS50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigibWVzc2FnZSBtdXN0IGJlIG5vbi1lbXB0eSIpOworICAgIH0gZWxzZSBpZiAoaW4ubGluZSAhPSBudWxsICYmIGluLmxpbmUgPD0gMCkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oImxpbmUgbXVzdCBiZSA+IDAiKTsKKyAgICB9CisKKyAgICBQYXRjaExpbmVDb21tZW50IGMgPSBuZXcgUGF0Y2hMaW5lQ29tbWVudCgKKyAgICAgICAgbmV3IFBhdGNoTGluZUNvbW1lbnQuS2V5KAorICAgICAgICAgICAgbmV3IFBhdGNoLktleShyc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwgaW4ucGF0aCksCisgICAgICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiLmdldCgpKSksCisgICAgICAgIGluLmxpbmUgIT0gbnVsbCA/IGluLmxpbmUgOiAwLAorICAgICAgICByc3JjLmdldEFjY291bnRJZCgpLAorICAgICAgICBVcmwuZGVjb2RlKGluLmluUmVwbHlUbykpOworICAgIGMuc2V0U3RhdHVzKFN0YXR1cy5EUkFGVCk7CisgICAgYy5zZXRTaWRlKGluLnNpZGUgPT0gR2V0RHJhZnQuU2lkZS5QQVJFTlQgPyAoc2hvcnQpIDAgOiAoc2hvcnQpIDEpOworICAgIGMuc2V0TWVzc2FnZShpbi5tZXNzYWdlLnRyaW0oKSk7CisgICAgZGIuZ2V0KCkucGF0Y2hDb21tZW50cygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oYykpOworICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKG5ldyBHZXREcmFmdC5Db21tZW50KGMpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRGVsZXRlRHJhZnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0RlbGV0ZURyYWZ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1ODk4ZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0RlbGV0ZURyYWZ0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkRlbGV0ZURyYWZ0LklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitjbGFzcyBEZWxldGVEcmFmdCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PERyYWZ0UmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKworICBASW5qZWN0CisgIERlbGV0ZURyYWZ0KFByb3ZpZGVyPFJldmlld0RiPiBkYikgeworICAgIHRoaXMuZGIgPSBkYjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KERyYWZ0UmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGRiLmdldCgpLnBhdGNoQ29tbWVudHMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJzcmMuZ2V0Q29tbWVudCgpKSk7CisgICAgcmV0dXJuIFJlc3BvbnNlLm5vbmUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRGVsZXRlUmV2aWV3ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0RlbGV0ZVJldmlld2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmZmZhYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0RlbGV0ZVJldmlld2VyLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5EZWxldGVSZXZpZXdlci5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBEZWxldGVSZXZpZXdlciBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFJldmlld2VyUmVzb3VyY2UsIElucHV0PiB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKworICBASW5qZWN0CisgIERlbGV0ZVJldmlld2VyKFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyKSB7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFJldmlld2VyUmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSByc3JjLmdldENvbnRyb2woKTsKKyAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSByc3JjLmdldENoYW5nZSgpLmdldElkKCk7CisgICAgUmV2aWV3RGIgZGIgPSBkYlByb3ZpZGVyLmdldCgpOworICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZUlkKTsKKyAgICB0cnkgeworICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBkZWwgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxzKGRiLCByc3JjKSkgeworICAgICAgICBpZiAoY29udHJvbC5jYW5SZW1vdmVSZXZpZXdlcihhKSkgeworICAgICAgICAgIGRlbC5hZGQoYSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oImRlbGV0ZSBub3QgcGVybWl0dGVkIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChkZWwuaXNFbXB0eSgpKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICB9CisgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmRlbGV0ZShkZWwpOworICAgICAgZGIuY29tbWl0KCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRiLnJvbGxiYWNrKCk7CisgICAgfQorICAgIHJldHVybiBSZXNwb25zZS5ub25lKCk7CisgIH0KKworICBwcml2YXRlIEl0ZXJhYmxlPFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscyhSZXZpZXdEYiBkYiwKKyAgICAgIFJldmlld2VyUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZmluYWwgQWNjb3VudC5JZCB1c2VyID0gcnNyYy5nZXRVc2VyKCkuZ2V0QWNjb3VudElkKCk7CisgICAgcmV0dXJuIEl0ZXJhYmxlcy5maWx0ZXIoCisgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlDaGFuZ2UocnNyYy5nZXRDaGFuZ2UoKS5nZXRJZCgpKSwKKyAgICAgICAgbmV3IFByZWRpY2F0ZTxQYXRjaFNldEFwcHJvdmFsPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShQYXRjaFNldEFwcHJvdmFsIGlucHV0KSB7CisgICAgICAgICAgICByZXR1cm4gdXNlci5lcXVhbHMoaW5wdXQuZ2V0QWNjb3VudElkKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0RyYWZ0UmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0RyYWZ0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q4OTAyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRHJhZnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBEcmFmdFJlc291cmNlIGltcGxlbWVudHMgUmVzdFJlc291cmNlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlTGl0ZXJhbDxSZXN0VmlldzxEcmFmdFJlc291cmNlPj4gRFJBRlRfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8RHJhZnRSZXNvdXJjZT4+KCkge307CisKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpc2lvblJlc291cmNlIHJldjsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaExpbmVDb21tZW50IGNvbW1lbnQ7CisKKyAgRHJhZnRSZXNvdXJjZShSZXZpc2lvblJlc291cmNlIHJldiwgUGF0Y2hMaW5lQ29tbWVudCBjKSB7CisgICAgdGhpcy5yZXYgPSByZXY7CisgICAgdGhpcy5jb21tZW50ID0gYzsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VDb250cm9sIGdldENvbnRyb2woKSB7CisgICAgcmV0dXJuIHJldi5nZXRDb250cm9sKCk7CisgIH0KKworICBwdWJsaWMgQ2hhbmdlIGdldENoYW5nZSgpIHsKKyAgICByZXR1cm4gZ2V0Q29udHJvbCgpLmdldENoYW5nZSgpOworICB9CisKKyAgcHVibGljIFBhdGNoU2V0IGdldFBhdGNoU2V0KCkgeworICAgIHJldHVybiByZXYuZ2V0UGF0Y2hTZXQoKTsKKyAgfQorCisgIFBhdGNoTGluZUNvbW1lbnQgZ2V0Q29tbWVudCgpIHsKKyAgICByZXR1cm4gY29tbWVudDsKKyAgfQorCisgIFN0cmluZyBnZXRJZCgpIHsKKyAgICByZXR1cm4gY29tbWVudC5nZXRLZXkoKS5nZXQoKTsKKyAgfQorCisgIEFjY291bnQuSWQgZ2V0QXV0aG9ySWQoKSB7CisgICAgcmV0dXJuICgoSWRlbnRpZmllZFVzZXIpIGdldENvbnRyb2woKS5nZXRDdXJyZW50VXNlcigpKS5nZXRBY2NvdW50SWQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRHJhZnRzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9EcmFmdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjgyZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvRHJhZnRzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworY2xhc3MgRHJhZnRzIGltcGxlbWVudHMgQ2hpbGRDb2xsZWN0aW9uPFJldmlzaW9uUmVzb3VyY2UsIERyYWZ0UmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljTWFwPFJlc3RWaWV3PERyYWZ0UmVzb3VyY2U+PiB2aWV3czsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gdXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0RHJhZnRzPiBsaXN0OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworCisgIEBJbmplY3QKKyAgRHJhZnRzKER5bmFtaWNNYXA8UmVzdFZpZXc8RHJhZnRSZXNvdXJjZT4+IHZpZXdzLAorICAgICAgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHVzZXIsCisgICAgICBQcm92aWRlcjxMaXN0RHJhZnRzPiBsaXN0LAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIpIHsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICB0aGlzLmxpc3QgPSBsaXN0OworICAgIHRoaXMuZGJQcm92aWRlciA9IGRiUHJvdmlkZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8RHJhZnRSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzdFZpZXc8UmV2aXNpb25SZXNvdXJjZT4gbGlzdCgpIHRocm93cyBBdXRoRXhjZXB0aW9uIHsKKyAgICBjaGVja0lkZW50aWZpZWRVc2VyKCk7CisgICAgcmV0dXJuIGxpc3QuZ2V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERyYWZ0UmVzb3VyY2UgcGFyc2UoUmV2aXNpb25SZXNvdXJjZSByZXYsIElkU3RyaW5nIGlkKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiB7CisgICAgY2hlY2tJZGVudGlmaWVkVXNlcigpOworICAgIFN0cmluZyB1dWlkID0gaWQuZ2V0KCk7CisgICAgZm9yIChQYXRjaExpbmVDb21tZW50IGMgOiBkYlByb3ZpZGVyLmdldCgpLnBhdGNoQ29tbWVudHMoKQorICAgICAgICAuZHJhZnRCeVBhdGNoU2V0QXV0aG9yKAorICAgICAgICAgICAgcmV2LmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwKKyAgICAgICAgICAgIHJldi5nZXRBY2NvdW50SWQoKSkpIHsKKyAgICAgIGlmICh1dWlkLmVxdWFscyhjLmdldEtleSgpLmdldCgpKSkgeworICAgICAgICByZXR1cm4gbmV3IERyYWZ0UmVzb3VyY2UocmV2LCBjKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrSWRlbnRpZmllZFVzZXIoKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB7CisgICAgaWYgKCEodXNlci5nZXQoKSBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oImRyYWZ0cyBvbmx5IGF2YWlsYWJsZSB0byBhdXRoZW50aWNhdGVkIHVzZXJzIik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9FbWFpbFJldmlld0NvbW1lbnRzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9FbWFpbFJldmlld0NvbW1lbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhOWVkZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0VtYWlsUmV2aWV3Q29tbWVudHMuamF2YQpAQCAtMCwwICsxLDE3MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5Qb3N0UmV2aWV3Lk5vdGlmeUhhbmRsaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkNvbW1lbnRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aXNpb25FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBFbWFpbFJldmlld0NvbW1lbnRzIGltcGxlbWVudHMgUnVubmFibGUsIFJlcXVlc3RDb250ZXh0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEVtYWlsUmV2aWV3Q29tbWVudHMuY2xhc3MpOworCisgIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBFbWFpbFJldmlld0NvbW1lbnRzIGNyZWF0ZSgKKyAgICAgICAgTm90aWZ5SGFuZGxpbmcgbm90aWZ5LAorICAgICAgICBDaGFuZ2UgY2hhbmdlLAorICAgICAgICBQYXRjaFNldCBwYXRjaFNldCwKKyAgICAgICAgQWNjb3VudC5JZCBhdXRob3JJZCwKKyAgICAgICAgQ2hhbmdlTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGNvbW1lbnRzKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZTsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQ29tbWVudFNlbmRlci5GYWN0b3J5IGNvbW1lbnRTZW5kZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dDsKKworICBwcml2YXRlIGZpbmFsIFBvc3RSZXZpZXcuTm90aWZ5SGFuZGxpbmcgbm90aWZ5OworICBwcml2YXRlIGZpbmFsIENoYW5nZSBjaGFuZ2U7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQ7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudC5JZCBhdXRob3JJZDsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2U7CisgIHByaXZhdGUgTGlzdDxQYXRjaExpbmVDb21tZW50PiBjb21tZW50czsKKyAgcHJpdmF0ZSBSZXZpZXdEYiBkYjsKKworICBASW5qZWN0CisgIEVtYWlsUmV2aWV3Q29tbWVudHMgKAorICAgICAgV29ya1F1ZXVlIHdvcmtRdWV1ZSwKKyAgICAgIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwKKyAgICAgIENvbW1lbnRTZW5kZXIuRmFjdG9yeSBjb21tZW50U2VuZGVyRmFjdG9yeSwKKyAgICAgIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYUZhY3RvcnksCisgICAgICBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgQEFzc2lzdGVkIE5vdGlmeUhhbmRsaW5nIG5vdGlmeSwKKyAgICAgIEBBc3Npc3RlZCBDaGFuZ2UgY2hhbmdlLAorICAgICAgQEFzc2lzdGVkIFBhdGNoU2V0IHBhdGNoU2V0LAorICAgICAgQEFzc2lzdGVkIEFjY291bnQuSWQgYXV0aG9ySWQsCisgICAgICBAQXNzaXN0ZWQgQ2hhbmdlTWVzc2FnZSBtZXNzYWdlLAorICAgICAgQEFzc2lzdGVkIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gY29tbWVudHMpIHsKKyAgICB0aGlzLndvcmtRdWV1ZSA9IHdvcmtRdWV1ZTsKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuY29tbWVudFNlbmRlckZhY3RvcnkgPSBjb21tZW50U2VuZGVyRmFjdG9yeTsKKyAgICB0aGlzLnNjaGVtYUZhY3RvcnkgPSBzY2hlbWFGYWN0b3J5OworICAgIHRoaXMucmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dDsKKyAgICB0aGlzLm5vdGlmeSA9IG5vdGlmeTsKKyAgICB0aGlzLmNoYW5nZSA9IGNoYW5nZTsKKyAgICB0aGlzLnBhdGNoU2V0ID0gcGF0Y2hTZXQ7CisgICAgdGhpcy5hdXRob3JJZCA9IGF1dGhvcklkOworICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgdGhpcy5jb21tZW50cyA9IGNvbW1lbnRzOworICB9CisKKyAgdm9pZCBzZW5kQXN5bmMoKSB7CisgICAgd29ya1F1ZXVlLmdldERlZmF1bHRRdWV1ZSgpLnN1Ym1pdCh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgdHJ5IHsKKyAgICAgIHJlcXVlc3RDb250ZXh0LnNldENvbnRleHQodGhpcyk7CisKKyAgICAgIGNvbW1lbnRzID0gTGlzdHMubmV3QXJyYXlMaXN0KGNvbW1lbnRzKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoY29tbWVudHMsIG5ldyBDb21wYXJhdG9yPFBhdGNoTGluZUNvbW1lbnQ+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKFBhdGNoTGluZUNvbW1lbnQgYSwgUGF0Y2hMaW5lQ29tbWVudCBiKSB7CisgICAgICAgICAgaW50IGNtcCA9IHBhdGgoYSkuY29tcGFyZVRvKHBhdGgoYikpOworICAgICAgICAgIGlmIChjbXAgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvLyAwIGlzIGFuY2VzdG9yLCAxIGlzIHJldmlzaW9uLiBTb3J0IGFuY2VzdG9yIGZpcnN0LgorICAgICAgICAgIGNtcCA9IGEuZ2V0U2lkZSgpIC0gYi5nZXRTaWRlKCk7CisgICAgICAgICAgaWYgKGNtcCAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gY21wOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBhLmdldExpbmUoKSAtIGIuZ2V0TGluZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aChQYXRjaExpbmVDb21tZW50IGMpIHsKKyAgICAgICAgICByZXR1cm4gYy5nZXRLZXkoKS5nZXRQYXJlbnRLZXkoKS5nZXRGaWxlTmFtZSgpOworICAgICAgICB9CisgICAgICB9KTsKKworICAgICAgQ29tbWVudFNlbmRlciBjbSA9IGNvbW1lbnRTZW5kZXJGYWN0b3J5LmNyZWF0ZShub3RpZnksIGNoYW5nZSk7CisgICAgICBjbS5zZXRGcm9tKGF1dGhvcklkKTsKKyAgICAgIGNtLnNldFBhdGNoU2V0KHBhdGNoU2V0LCBwYXRjaFNldEluZm9GYWN0b3J5LmdldChjaGFuZ2UsIHBhdGNoU2V0KSk7CisgICAgICBjbS5zZXRDaGFuZ2VNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgY20uc2V0UGF0Y2hMaW5lQ29tbWVudHMoY29tbWVudHMpOworICAgICAgY20uc2VuZCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBlbWFpbCBjb21tZW50cyBmb3IgIiArIHBhdGNoU2V0LmdldElkKCksIGUpOworICAgIH0gZmluYWxseSB7CisgICAgICByZXF1ZXN0Q29udGV4dC5zZXRDb250ZXh0KG51bGwpOworICAgICAgaWYgKGRiICE9IG51bGwpIHsKKyAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgZGIgPSBudWxsOworICAgICAgfQorICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAic2VuZC1lbWFpbCBjb21tZW50cyI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgeworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQcm92aWRlcjxSZXZpZXdEYj4gZ2V0UmV2aWV3RGJQcm92aWRlcigpIHsKKyAgICByZXR1cm4gbmV3IFByb3ZpZGVyPFJldmlld0RiPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJldmlld0RiIGdldCgpIHsKKyAgICAgICAgaWYgKGRiID09IG51bGwpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgZGIgPSBzY2hlbWFGYWN0b3J5Lm9wZW4oKTsKKyAgICAgICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiQ2Fubm90IG9wZW4gUmV2aWV3RGIiLCBlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRiOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldENoYW5nZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0Q2hhbmdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNTQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldENoYW5nZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIEdldENoYW5nZSBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxDaGFuZ2VSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIENoYW5nZUpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldENoYW5nZShDaGFuZ2VKc29uIGpzb24pIHsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJzcmMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXREZXRhaWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldERldGFpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMGQ5ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0RGV0YWlsLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgR2V0RGV0YWlsIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PENoYW5nZVJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgR2V0RGV0YWlsKENoYW5nZUpzb24ganNvbikgeworICAgIHRoaXMuanNvbiA9IGpzb24KKyAgICAgICAgLmFkZE9wdGlvbihMaXN0Q2hhbmdlc09wdGlvbi5MQUJFTFMpCisgICAgICAgIC5hZGRPcHRpb24oTGlzdENoYW5nZXNPcHRpb24uREVUQUlMRURfTEFCRUxTKQorICAgICAgICAuYWRkT3B0aW9uKExpc3RDaGFuZ2VzT3B0aW9uLkRFVEFJTEVEX0FDQ09VTlRTKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KENoYW5nZVJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBqc29uLmZvcm1hdChyc3JjKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0RHJhZnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldERyYWZ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2NjU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldERyYWZ0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OworCitpbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOworCitjbGFzcyBHZXREcmFmdCBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxEcmFmdFJlc291cmNlPiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KERyYWZ0UmVzb3VyY2UgcnNyYykgdGhyb3dzIEF1dGhFeGNlcHRpb24sCisgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBFeGNlcHRpb24geworICAgIHJldHVybiBuZXcgQ29tbWVudChyc3JjLmdldENvbW1lbnQoKSk7CisgIH0KKworICBzdGF0aWMgZW51bSBTaWRlIHsKKyAgICBQQVJFTlQsIFJFVklTSU9OOworICB9CisKKyAgc3RhdGljIGNsYXNzIENvbW1lbnQgeworICAgIGZpbmFsIFN0cmluZyBraW5kID0gImdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCI7CisgICAgU3RyaW5nIGlkOworICAgIFN0cmluZyBwYXRoOworICAgIFNpZGUgc2lkZTsKKyAgICBJbnRlZ2VyIGxpbmU7CisgICAgU3RyaW5nIGluUmVwbHlUbzsKKyAgICBTdHJpbmcgbWVzc2FnZTsKKyAgICBUaW1lc3RhbXAgdXBkYXRlZDsKKworICAgIENvbW1lbnQoUGF0Y2hMaW5lQ29tbWVudCBjKSB7CisgICAgICBpZCA9IFVybC5lbmNvZGUoYy5nZXRLZXkoKS5nZXQoKSk7CisgICAgICBwYXRoID0gYy5nZXRLZXkoKS5nZXRQYXJlbnRLZXkoKS5nZXRGaWxlTmFtZSgpOworICAgICAgaWYgKGMuZ2V0U2lkZSgpID09IDApIHsKKyAgICAgICAgc2lkZSA9IFNpZGUuUEFSRU5UOworICAgICAgfQorICAgICAgaWYgKGMuZ2V0TGluZSgpID4gMCkgeworICAgICAgICBsaW5lID0gYy5nZXRMaW5lKCk7CisgICAgICB9CisgICAgICBpblJlcGx5VG8gPSBVcmwuZW5jb2RlKGMuZ2V0UGFyZW50VXVpZCgpKTsKKyAgICAgIG1lc3NhZ2UgPSBTdHJpbmdzLmVtcHR5VG9OdWxsKGMuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIHVwZGF0ZWQgPSBjLmdldFdyaXR0ZW5PbigpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0UmV2aWV3LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRSZXZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTdmNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0UmV2aWV3LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgR2V0UmV2aWV3IGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFJldmlzaW9uUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VKc29uIGpzb247CisKKyAgQEluamVjdAorICBHZXRSZXZpZXcoQ2hhbmdlSnNvbiBqc29uKSB7CisgICAgdGhpcy5qc29uID0ganNvbi5hZGRPcHRpb24oTGlzdENoYW5nZXNPcHRpb24uREVUQUlMRURfTEFCRUxTKQorICAgICAgICAuYWRkT3B0aW9uKExpc3RDaGFuZ2VzT3B0aW9uLkRFVEFJTEVEX0FDQ09VTlRTKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFJldmlzaW9uUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBqc29uLmZvcm1hdChyZXNvdXJjZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0dldFJldmlld2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRSZXZpZXdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDFiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRSZXZpZXdlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIEdldFJldmlld2VyIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFJldmlld2VyUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdlckpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldFJldmlld2VyKFJldmlld2VySnNvbiBqc29uKSB7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFJldmlld2VyUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJzcmMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9HZXRUb3BpYy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0VG9waWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmE1Yzc2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvR2V0VG9waWMuamF2YQpAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CisKK2NsYXNzIEdldFRvcGljIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PENoYW5nZVJlc291cmNlPiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KENoYW5nZVJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBTdHJpbmdzLm51bGxUb0VtcHR5KHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0VG9waWMoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0xpc3REcmFmdHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0xpc3REcmFmdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjQzNjNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvTGlzdERyYWZ0cy5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0cy5maXJzdE5vbk51bGw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkdldERyYWZ0LkNvbW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5HZXREcmFmdC5TaWRlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitjbGFzcyBMaXN0RHJhZnRzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFJldmlzaW9uUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CisKKyAgQEluamVjdAorICBMaXN0RHJhZnRzKFByb3ZpZGVyPFJldmlld0RiPiBkYikgeworICAgIHRoaXMuZGIgPSBkYjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFJldmlzaW9uUmVzb3VyY2UgcnNyYykgdGhyb3dzIEF1dGhFeGNlcHRpb24sCisgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBFeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIExpc3Q8Q29tbWVudD4+IG91dCA9IE1hcHMubmV3VHJlZU1hcCgpOworICAgIGZvciAoUGF0Y2hMaW5lQ29tbWVudCBjIDogZGIuZ2V0KCkucGF0Y2hDb21tZW50cygpCisgICAgICAgIC5kcmFmdEJ5UGF0Y2hTZXRBdXRob3IoCisgICAgICAgICAgICByc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwKKyAgICAgICAgICAgIHJzcmMuZ2V0QWNjb3VudElkKCkpKSB7CisgICAgICBDb21tZW50IG8gPSBuZXcgQ29tbWVudChjKTsKKyAgICAgIExpc3Q8Q29tbWVudD4gbGlzdCA9IG91dC5nZXQoby5wYXRoKTsKKyAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBvdXQucHV0KG8ucGF0aCwgbGlzdCk7CisgICAgICB9CisgICAgICBvLnBhdGggPSBudWxsOworICAgICAgbGlzdC5hZGQobyk7CisgICAgfQorICAgIGZvciAoTGlzdDxDb21tZW50PiBsaXN0IDogb3V0LnZhbHVlcygpKSB7CisgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yPENvbW1lbnQ+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKENvbW1lbnQgYSwgQ29tbWVudCBiKSB7CisgICAgICAgICAgaW50IGMgPSBmaXJzdE5vbk51bGwoYS5zaWRlLCBTaWRlLlJFVklTSU9OKS5vcmRpbmFsKCkKKyAgICAgICAgICAgICAgICAtIGZpcnN0Tm9uTnVsbChiLnNpZGUsIFNpZGUuUkVWSVNJT04pLm9yZGluYWwoKTsKKyAgICAgICAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgICAgICBjID0gZmlyc3ROb25OdWxsKGEubGluZSwgMCkgLSBmaXJzdE5vbk51bGwoYi5saW5lLCAwKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGMgPT0gMCkgeworICAgICAgICAgICAgYyA9IGEuaWQuY29tcGFyZVRvKGIuaWQpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgICAgfSk7CisgICAgfQorICAgIHJldHVybiBvdXQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0xpc3RSZXZpZXdlcnMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL0xpc3RSZXZpZXdlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGNjMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvTGlzdFJldmlld2Vycy5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitjbGFzcyBMaXN0UmV2aWV3ZXJzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PENoYW5nZVJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3ZXJKc29uIGpzb247CisgIHByaXZhdGUgZmluYWwgUmV2aWV3ZXJSZXNvdXJjZS5GYWN0b3J5IHJlc291cmNlRmFjdG9yeTsKKworICBASW5qZWN0CisgIExpc3RSZXZpZXdlcnMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICBSZXZpZXdlclJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5LAorICAgICAgUmV2aWV3ZXJKc29uIGpzb24pIHsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMucmVzb3VyY2VGYWN0b3J5ID0gcmVzb3VyY2VGYWN0b3J5OworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShDaGFuZ2VSZXNvdXJjZSByc3JjKSB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwKKyAgICAgIE9ybUV4Y2VwdGlvbiB7CisgICAgTWFwPEFjY291bnQuSWQsIFJldmlld2VyUmVzb3VyY2U+IHJldmlld2VycyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgIFJldmlld0RiIGRiID0gZGJQcm92aWRlci5nZXQoKTsKKyAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSByc3JjLmdldENoYW5nZSgpLmdldElkKCk7CisgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBhdGNoU2V0QXBwcm92YWwKKyAgICAgICAgIDogZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShjaGFuZ2VJZCkpIHsKKyAgICAgIEFjY291bnQuSWQgYWNjb3VudElkID0gcGF0Y2hTZXRBcHByb3ZhbC5nZXRBY2NvdW50SWQoKTsKKyAgICAgIGlmICghcmV2aWV3ZXJzLmNvbnRhaW5zS2V5KGFjY291bnRJZCkpIHsKKyAgICAgICAgcmV2aWV3ZXJzLnB1dChhY2NvdW50SWQsIHJlc291cmNlRmFjdG9yeS5jcmVhdGUocnNyYywgYWNjb3VudElkKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBqc29uLmZvcm1hdChyZXZpZXdlcnMudmFsdWVzKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9Nb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMTc1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDg2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZVJlc291cmNlLkNIQU5HRV9LSU5EOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkRyYWZ0UmVzb3VyY2UuRFJBRlRfS0lORDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5QYXRjaFJlc291cmNlLlBBVENIX0tJTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aWV3ZXJSZXNvdXJjZS5SRVZJRVdFUl9LSU5EOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJldmlzaW9uUmVzb3VyY2UuUkVWSVNJT05fS0lORDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RBcGlNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXZpZXdlZC5EZWxldGVSZXZpZXdlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJldmlld2VkLlB1dFJldmlld2VkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuRmFjdG9yeU1vZHVsZTsKKworcHVibGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIFJlc3RBcGlNb2R1bGUgeworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgIGJpbmQoUmV2aXNpb25zLmNsYXNzKTsKKyAgICBiaW5kKFJldmlld2Vycy5jbGFzcyk7CisgICAgYmluZChEcmFmdHMuY2xhc3MpOworICAgIGJpbmQoUGF0Y2hlcy5jbGFzcyk7CisKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBDSEFOR0VfS0lORCk7CisgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgRFJBRlRfS0lORCk7CisgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgUEFUQ0hfS0lORCk7CisgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgUkVWSUVXRVJfS0lORCk7CisgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgUkVWSVNJT05fS0lORCk7CisKKyAgICBnZXQoQ0hBTkdFX0tJTkQpLnRvKEdldENoYW5nZS5jbGFzcyk7CisgICAgZ2V0KENIQU5HRV9LSU5ELCAiZGV0YWlsIikudG8oR2V0RGV0YWlsLmNsYXNzKTsKKyAgICBnZXQoQ0hBTkdFX0tJTkQsICJ0b3BpYyIpLnRvKEdldFRvcGljLmNsYXNzKTsKKyAgICBwdXQoQ0hBTkdFX0tJTkQsICJ0b3BpYyIpLnRvKFB1dFRvcGljLmNsYXNzKTsKKyAgICBkZWxldGUoQ0hBTkdFX0tJTkQsICJ0b3BpYyIpLnRvKFB1dFRvcGljLmNsYXNzKTsKKyAgICBwb3N0KENIQU5HRV9LSU5ELCAiYWJhbmRvbiIpLnRvKEFiYW5kb24uY2xhc3MpOworICAgIHBvc3QoQ0hBTkdFX0tJTkQsICJyZXN0b3JlIikudG8oUmVzdG9yZS5jbGFzcyk7CisgICAgcG9zdChDSEFOR0VfS0lORCwgInJldmVydCIpLnRvKFJldmVydC5jbGFzcyk7CisgICAgcG9zdChDSEFOR0VfS0lORCwgInN1Ym1pdCIpLnRvKFN1Ym1pdC5DdXJyZW50UmV2aXNpb24uY2xhc3MpOworCisgICAgcG9zdChDSEFOR0VfS0lORCwgInJldmlld2VycyIpLnRvKFBvc3RSZXZpZXdlcnMuY2xhc3MpOworICAgIGNoaWxkKENIQU5HRV9LSU5ELCAicmV2aWV3ZXJzIikudG8oUmV2aWV3ZXJzLmNsYXNzKTsKKyAgICBnZXQoUkVWSUVXRVJfS0lORCkudG8oR2V0UmV2aWV3ZXIuY2xhc3MpOworICAgIGRlbGV0ZShSRVZJRVdFUl9LSU5EKS50byhEZWxldGVSZXZpZXdlci5jbGFzcyk7CisKKyAgICBjaGlsZChDSEFOR0VfS0lORCwgInJldmlzaW9ucyIpLnRvKFJldmlzaW9ucy5jbGFzcyk7CisgICAgZ2V0KFJFVklTSU9OX0tJTkQsICJyZXZpZXciKS50byhHZXRSZXZpZXcuY2xhc3MpOworICAgIHBvc3QoUkVWSVNJT05fS0lORCwgInJldmlldyIpLnRvKFBvc3RSZXZpZXcuY2xhc3MpOworICAgIHBvc3QoUkVWSVNJT05fS0lORCwgInN1Ym1pdCIpLnRvKFN1Ym1pdC5jbGFzcyk7CisgICAgZ2V0KFJFVklTSU9OX0tJTkQsICJzdWJtaXRfdHlwZSIpLnRvKFRlc3RTdWJtaXRUeXBlLkdldC5jbGFzcyk7CisgICAgcG9zdChSRVZJU0lPTl9LSU5ELCAidGVzdC5zdWJtaXRfcnVsZSIpLnRvKFRlc3RTdWJtaXRSdWxlLmNsYXNzKTsKKyAgICBwb3N0KFJFVklTSU9OX0tJTkQsICJ0ZXN0LnN1Ym1pdF90eXBlIikudG8oVGVzdFN1Ym1pdFR5cGUuY2xhc3MpOworCisgICAgY2hpbGQoUkVWSVNJT05fS0lORCwgImRyYWZ0cyIpLnRvKERyYWZ0cy5jbGFzcyk7CisgICAgcHV0KFJFVklTSU9OX0tJTkQsICJkcmFmdHMiKS50byhDcmVhdGVEcmFmdC5jbGFzcyk7CisgICAgZ2V0KERSQUZUX0tJTkQpLnRvKEdldERyYWZ0LmNsYXNzKTsKKyAgICBwdXQoRFJBRlRfS0lORCkudG8oUHV0RHJhZnQuY2xhc3MpOworICAgIGRlbGV0ZShEUkFGVF9LSU5EKS50byhEZWxldGVEcmFmdC5jbGFzcyk7CisKKyAgICBjaGlsZChSRVZJU0lPTl9LSU5ELCAiZmlsZXMiKS50byhQYXRjaGVzLmNsYXNzKTsKKyAgICBwdXQoUEFUQ0hfS0lORCwgInJldmlld2VkIikudG8oUHV0UmV2aWV3ZWQuY2xhc3MpOworICAgIGRlbGV0ZShQQVRDSF9LSU5ELCAicmV2aWV3ZWQiKS50byhEZWxldGVSZXZpZXdlZC5jbGFzcyk7CisKKyAgICBpbnN0YWxsKG5ldyBGYWN0b3J5TW9kdWxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGZhY3RvcnkoUmV2aWV3ZXJSZXNvdXJjZS5GYWN0b3J5LmNsYXNzKTsKKyAgICAgICAgZmFjdG9yeShBY2NvdW50SW5mby5Mb2FkZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgICAgIGZhY3RvcnkoRW1haWxSZXZpZXdDb21tZW50cy5GYWN0b3J5LmNsYXNzKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUGF0Y2hSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUGF0Y2hSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzY2Y1YzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QYXRjaFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBQYXRjaFJlc291cmNlIGltcGxlbWVudHMgUmVzdFJlc291cmNlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlTGl0ZXJhbDxSZXN0VmlldzxQYXRjaFJlc291cmNlPj4gUEFUQ0hfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8UGF0Y2hSZXNvdXJjZT4+KCkge307CisKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpc2lvblJlc291cmNlIHJldjsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaC5LZXkga2V5OworCisgIFBhdGNoUmVzb3VyY2UoUmV2aXNpb25SZXNvdXJjZSByZXYsIFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5yZXYgPSByZXY7CisgICAgdGhpcy5rZXkgPSBuZXcgUGF0Y2guS2V5KHJldi5nZXRQYXRjaFNldCgpLmdldElkKCksIG5hbWUpOworICB9CisKKyAgcHVibGljIFBhdGNoLktleSBnZXRQYXRjaEtleSgpIHsKKyAgICByZXR1cm4ga2V5OworICB9CisKKyAgQWNjb3VudC5JZCBnZXRBY2NvdW50SWQoKSB7CisgICAgcmV0dXJuIHJldi5nZXRBY2NvdW50SWQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUGF0Y2hlcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUGF0Y2hlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMGE5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QYXRjaGVzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworY2xhc3MgUGF0Y2hlcyBpbXBsZW1lbnRzIENoaWxkQ29sbGVjdGlvbjxSZXZpc2lvblJlc291cmNlLCBQYXRjaFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxQYXRjaFJlc291cmNlPj4gdmlld3M7CisKKyAgQEluamVjdAorICBQYXRjaGVzKER5bmFtaWNNYXA8UmVzdFZpZXc8UGF0Y2hSZXNvdXJjZT4+IHZpZXdzKSB7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PFBhdGNoUmVzb3VyY2U+PiB2aWV3cygpIHsKKyAgICByZXR1cm4gdmlld3M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PFJldmlzaW9uUmVzb3VyY2U+IGxpc3QoKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFBhdGNoUmVzb3VyY2UgcGFyc2UoUmV2aXNpb25SZXNvdXJjZSByZXYsIElkU3RyaW5nIGlkKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBQYXRjaFJlc291cmNlKHJldiwgaWQuZ2V0KCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9Qb3N0UmV2aWV3LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9Qb3N0UmV2aWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZiOTM5YgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Bvc3RSZXZpZXcuamF2YQpAQCAtMCwwICsxLDQ5NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoTGluZUNvbW1lbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlBvc3RSZXZpZXcuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgUG9zdFJldmlldyBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFJldmlzaW9uUmVzb3VyY2UsIElucHV0PiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQb3N0UmV2aWV3LmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOworCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFNob3J0PiBsYWJlbHM7CisgICAgTWFwPFN0cmluZywgTGlzdDxDb21tZW50Pj4gY29tbWVudHM7CisKKyAgICAvKioKKyAgICAgKiBJZiB0cnVlIHJlcXVpcmUgYWxsIGxhYmVscyB0byBiZSB3aXRoaW4gdGhlIHVzZXIncyBwZXJtaXR0ZWQgcmFuZ2VzIGJhc2VkCisgICAgICogb24gYWNjZXNzIGNvbnRyb2xzLCBhdHRlbXB0aW5nIHRvIHVzZSBhIGxhYmVsIG5vdCBncmFudGVkIHRvIHRoZSB1c2VyCisgICAgICogd2lsbCBmYWlsIHRoZSBlbnRpcmUgbW9kaWZ5IG9wZXJhdGlvbiBlYXJseS4gSWYgZmFsc2UgdGhlIG9wZXJhdGlvbiB3aWxsCisgICAgICogZXhlY3V0ZSBhbnl3YXksIGJ1dCB0aGUgcHJvcG9zZWQgbGFiZWxzIGdpdmVuIGJ5IHRoZSB1c2VyIHdpbGwgYmUKKyAgICAgKiBtb2RpZmllZCB0byBiZSB0aGUgImJlc3QiIHZhbHVlIGFsbG93ZWQgYnkgdGhlIGFjY2VzcyBjb250cm9scywgb3IKKyAgICAgKiBpZ25vcmVkIGlmIHRoZSBsYWJlbCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdHJpY3RMYWJlbHMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogSG93IHRvIHByb2Nlc3MgZHJhZnQgY29tbWVudHMgYWxyZWFkeSBpbiB0aGUgZGF0YWJhc2UgdGhhdCB3ZXJlIG5vdCBhbHNvCisgICAgICogZGVzY3JpYmVkIGluIHRoaXMgaW5wdXQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRHJhZnRIYW5kbGluZyBkcmFmdHMgPSBEcmFmdEhhbmRsaW5nLkRFTEVURTsKKworICAgIC8qKiBXaG8gdG8gc2VuZCBlbWFpbCBub3RpZmljYXRpb25zIHRvIGFmdGVyIHJldmlldyBpcyBzdG9yZWQuICovCisgICAgcHVibGljIE5vdGlmeUhhbmRsaW5nIG5vdGlmeSA9IE5vdGlmeUhhbmRsaW5nLkFMTDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZW51bSBEcmFmdEhhbmRsaW5nIHsKKyAgICBERUxFVEUsIFBVQkxJU0gsIEtFRVA7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGVudW0gTm90aWZ5SGFuZGxpbmcgeworICAgIE5PTkUsIE9XTkVSLCBPV05FUl9SRVZJRVdFUlMsIEFMTDsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBDb21tZW50IHsKKyAgICBTdHJpbmcgaWQ7CisgICAgR2V0RHJhZnQuU2lkZSBzaWRlOworICAgIGludCBsaW5lOworICAgIFN0cmluZyBpblJlcGx5VG87CisgICAgU3RyaW5nIG1lc3NhZ2U7CisgIH0KKworICBzdGF0aWMgY2xhc3MgT3V0cHV0IHsKKyAgICBNYXA8U3RyaW5nLCBTaG9ydD4gbGFiZWxzOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBFbWFpbFJldmlld0NvbW1lbnRzLkZhY3RvcnkgZW1haWw7CisgIEBEZXByZWNhdGVkIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CisKKyAgcHJpdmF0ZSBDaGFuZ2UgY2hhbmdlOworICBwcml2YXRlIENoYW5nZU1lc3NhZ2UgbWVzc2FnZTsKKyAgcHJpdmF0ZSBUaW1lc3RhbXAgdGltZXN0YW1wOworICBwcml2YXRlIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gY29tbWVudHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbGFiZWxEZWx0YSA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICBwcml2YXRlIE1hcDxTdHJpbmcsIFNob3J0PiBjYXRlZ29yaWVzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgQEluamVjdAorICBQb3N0UmV2aWV3KFJldmlld0RiIGRiLAorICAgICAgRW1haWxSZXZpZXdDb21tZW50cy5GYWN0b3J5IGVtYWlsLAorICAgICAgQ2hhbmdlSG9va3MgaG9va3MpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIHRoaXMuaG9va3MgPSBob29rczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFJldmlzaW9uUmVzb3VyY2UgcmV2aXNpb24sIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0LmxhYmVscyAhPSBudWxsKSB7CisgICAgICBjaGVja0xhYmVscyhyZXZpc2lvbiwgaW5wdXQuc3RyaWN0TGFiZWxzLCBpbnB1dC5sYWJlbHMpOworICAgIH0KKyAgICBpZiAoaW5wdXQuY29tbWVudHMgIT0gbnVsbCkgeworICAgICAgY2hlY2tDb21tZW50cyhpbnB1dC5jb21tZW50cyk7CisgICAgfQorICAgIGlmIChpbnB1dC5ub3RpZnkgPT0gbnVsbCkgeworICAgICAgaW5wdXQubm90aWZ5ID0gTm90aWZ5SGFuZGxpbmcuTk9ORTsKKyAgICB9CisKKyAgICBkYi5jaGFuZ2VzKCkuYmVnaW5UcmFuc2FjdGlvbihyZXZpc2lvbi5nZXRDaGFuZ2UoKS5nZXRJZCgpKTsKKyAgICB0cnkgeworICAgICAgY2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChyZXZpc2lvbi5nZXRDaGFuZ2UoKS5nZXRJZCgpKTsKKyAgICAgIENoYW5nZVV0aWwudXBkYXRlZChjaGFuZ2UpOworICAgICAgdGltZXN0YW1wID0gY2hhbmdlLmdldExhc3RVcGRhdGVkT24oKTsKKworICAgICAgYm9vbGVhbiBkaXJ0eSA9IGZhbHNlOworICAgICAgZGlydHkgfD0gaW5zZXJ0Q29tbWVudHMocmV2aXNpb24sIGlucHV0LmNvbW1lbnRzLCBpbnB1dC5kcmFmdHMpOworICAgICAgZGlydHkgfD0gdXBkYXRlTGFiZWxzKHJldmlzaW9uLCBpbnB1dC5sYWJlbHMpOworICAgICAgZGlydHkgfD0gaW5zZXJ0TWVzc2FnZShyZXZpc2lvbiwgaW5wdXQubWVzc2FnZSk7CisgICAgICBpZiAoZGlydHkpIHsKKyAgICAgICAgZGIuY2hhbmdlcygpLnVwZGF0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oY2hhbmdlKSk7CisgICAgICAgIGRiLmNvbW1pdCgpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBkYi5yb2xsYmFjaygpOworICAgIH0KKworICAgIGlmIChpbnB1dC5ub3RpZnkuY29tcGFyZVRvKE5vdGlmeUhhbmRsaW5nLk5PTkUpID4gMCAmJiBtZXNzYWdlICE9IG51bGwpIHsKKyAgICAgIGVtYWlsLmNyZWF0ZSgKKyAgICAgICAgICBpbnB1dC5ub3RpZnksCisgICAgICAgICAgY2hhbmdlLAorICAgICAgICAgIHJldmlzaW9uLmdldFBhdGNoU2V0KCksCisgICAgICAgICAgcmV2aXNpb24uZ2V0QWNjb3VudElkKCksCisgICAgICAgICAgbWVzc2FnZSwKKyAgICAgICAgICBjb21tZW50cykuc2VuZEFzeW5jKCk7CisgICAgICBmaXJlQ29tbWVudEFkZGVkSG9vayhyZXZpc2lvbik7CisgICAgfQorCisgICAgT3V0cHV0IG91dHB1dCA9IG5ldyBPdXRwdXQoKTsKKyAgICBvdXRwdXQubGFiZWxzID0gaW5wdXQubGFiZWxzOworICAgIHJldHVybiBvdXRwdXQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgY2hlY2tMYWJlbHMoUmV2aXNpb25SZXNvdXJjZSByZXZpc2lvbiwgYm9vbGVhbiBzdHJpY3QsCisgICAgICBNYXA8U3RyaW5nLCBTaG9ydD4gbGFiZWxzKSB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBjdGwgPSByZXZpc2lvbi5nZXRDb250cm9sKCk7CisgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgU2hvcnQ+PiBpdHIgPSBsYWJlbHMuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgIHdoaWxlIChpdHIuaGFzTmV4dCgpKSB7CisgICAgICBNYXAuRW50cnk8U3RyaW5nLCBTaG9ydD4gZW50ID0gaXRyLm5leHQoKTsKKworICAgICAgTGFiZWxUeXBlIGx0ID0gcmV2aXNpb24uZ2V0Q29udHJvbCgpLmdldExhYmVsVHlwZXMoKQorICAgICAgICAgIC5ieUxhYmVsKGVudC5nZXRLZXkoKSk7CisgICAgICBpZiAobHQgPT0gbnVsbCkgeworICAgICAgICBpZiAoc3RyaWN0KSB7CisgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgImxhYmVsIFwiJXNcIiBpcyBub3QgYSBjb25maWd1cmVkIGxhYmVsIiwgZW50LmdldEtleSgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaXRyLnJlbW92ZSgpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChlbnQuZ2V0VmFsdWUoKSA9PSBudWxsIHx8IGVudC5nZXRWYWx1ZSgpID09IDApIHsKKyAgICAgICAgLy8gQWx3YXlzIHBlcm1pdCAwLCBldmVuIGlmIGl0IGlzIG5vdCB3aXRoaW4gcmFuZ2UuCisgICAgICAgIC8vIExhdGVyIG51bGwvMCB3aWxsIGJlIGRlbGV0ZWQgYW5kIHJldm9rZSB0aGUgbGFiZWwuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAobHQuZ2V0VmFsdWUoZW50LmdldFZhbHVlKCkpID09IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cmljdCkgeworICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJsYWJlbCBcIiVzXCI6ICVkIGlzIG5vdCBhIHZhbGlkIHZhbHVlIiwKKyAgICAgICAgICAgICAgZW50LmdldEtleSgpLCBlbnQuZ2V0VmFsdWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGl0ci5yZW1vdmUoKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBTdHJpbmcgbmFtZSA9IGx0LmdldE5hbWUoKTsKKyAgICAgIFBlcm1pc3Npb25SYW5nZSByYW5nZSA9IGN0bC5nZXRSYW5nZShQZXJtaXNzaW9uLmZvckxhYmVsKG5hbWUpKTsKKyAgICAgIGlmIChyYW5nZSA9PSBudWxsIHx8ICFyYW5nZS5jb250YWlucyhlbnQuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgaWYgKHN0cmljdCkgeworICAgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJBcHBseWluZyBsYWJlbCBcIiVzXCI6ICVkIGlzIHJlc3RyaWN0ZWQiLAorICAgICAgICAgICAgICBlbnQuZ2V0S2V5KCksIGVudC5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0gZWxzZSBpZiAocmFuZ2UgPT0gbnVsbCB8fCByYW5nZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBlbnQuc2V0VmFsdWUoKHNob3J0KSAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbnQuc2V0VmFsdWUoKHNob3J0KSByYW5nZS5zcXVhc2goZW50LmdldFZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBjaGVja0NvbW1lbnRzKE1hcDxTdHJpbmcsIExpc3Q8Q29tbWVudD4+IGluKQorICAgICAgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24geworICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8Q29tbWVudD4+PiBtYXBJdHIgPQorICAgICAgICBpbi5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKG1hcEl0ci5oYXNOZXh0KCkpIHsKKyAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8Q29tbWVudD4+IGVudCA9IG1hcEl0ci5uZXh0KCk7CisgICAgICBTdHJpbmcgcGF0aCA9IGVudC5nZXRLZXkoKTsKKyAgICAgIExpc3Q8Q29tbWVudD4gbGlzdCA9IGVudC5nZXRWYWx1ZSgpOworICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICBtYXBJdHIucmVtb3ZlKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBJdGVyYXRvcjxDb21tZW50PiBsaXN0SXRyID0gbGlzdC5pdGVyYXRvcigpOworICAgICAgd2hpbGUgKGxpc3RJdHIuaGFzTmV4dCgpKSB7CisgICAgICAgIENvbW1lbnQgYyA9IGxpc3RJdHIubmV4dCgpOworICAgICAgICBpZiAoYy5saW5lIDwgMCkgeworICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJuZWdhdGl2ZSBsaW5lIG51bWJlciAlZCBub3QgYWxsb3dlZCBvbiAlcyIsCisgICAgICAgICAgICAgIGMubGluZSwgcGF0aCkpOworICAgICAgICB9CisgICAgICAgIGMubWVzc2FnZSA9IFN0cmluZ3MuZW1wdHlUb051bGwoYy5tZXNzYWdlKS50cmltKCk7CisgICAgICAgIGlmIChjLm1lc3NhZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgbGlzdEl0ci5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgIG1hcEl0ci5yZW1vdmUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaW5zZXJ0Q29tbWVudHMoUmV2aXNpb25SZXNvdXJjZSByc3JjLAorICAgICAgTWFwPFN0cmluZywgTGlzdDxDb21tZW50Pj4gaW4sIERyYWZ0SGFuZGxpbmcgZHJhZnRzSGFuZGxpbmcpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgaW4gPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgIH0KKworICAgIE1hcDxTdHJpbmcsIFBhdGNoTGluZUNvbW1lbnQ+IGRyYWZ0cyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgaWYgKCFpbi5pc0VtcHR5KCkgfHwgZHJhZnRzSGFuZGxpbmcgIT0gRHJhZnRIYW5kbGluZy5LRUVQKSB7CisgICAgICBkcmFmdHMgPSBzY2FuRHJhZnRDb21tZW50cyhyc3JjKTsKKyAgICB9CisKKyAgICBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGRlbCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gaW5zID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdDxQYXRjaExpbmVDb21tZW50PiB1cGQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxDb21tZW50Pj4gZW50IDogaW4uZW50cnlTZXQoKSkgeworICAgICAgU3RyaW5nIHBhdGggPSBlbnQuZ2V0S2V5KCk7CisgICAgICBmb3IgKENvbW1lbnQgYyA6IGVudC5nZXRWYWx1ZSgpKSB7CisgICAgICAgIFN0cmluZyBwYXJlbnQgPSBVcmwuZGVjb2RlKGMuaW5SZXBseVRvKTsKKyAgICAgICAgUGF0Y2hMaW5lQ29tbWVudCBlID0gZHJhZnRzLnJlbW92ZShVcmwuZGVjb2RlKGMuaWQpKTsKKyAgICAgICAgYm9vbGVhbiBjcmVhdGUgPSBlID09IG51bGw7CisgICAgICAgIGlmIChjcmVhdGUpIHsKKyAgICAgICAgICBlID0gbmV3IFBhdGNoTGluZUNvbW1lbnQoCisgICAgICAgICAgICAgIG5ldyBQYXRjaExpbmVDb21tZW50LktleSgKKyAgICAgICAgICAgICAgICAgIG5ldyBQYXRjaC5LZXkocnNyYy5nZXRQYXRjaFNldCgpLmdldElkKCksIHBhdGgpLAorICAgICAgICAgICAgICAgICAgQ2hhbmdlVXRpbC5tZXNzYWdlVVVJRChkYikpLAorICAgICAgICAgICAgICBjLmxpbmUsCisgICAgICAgICAgICAgIHJzcmMuZ2V0QWNjb3VudElkKCksCisgICAgICAgICAgICAgIHBhcmVudCk7CisgICAgICAgIH0gZWxzZSBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICBlLnNldFBhcmVudFV1aWQocGFyZW50KTsKKyAgICAgICAgfQorICAgICAgICBlLnNldFN0YXR1cyhQYXRjaExpbmVDb21tZW50LlN0YXR1cy5QVUJMSVNIRUQpOworICAgICAgICBlLnNldFdyaXR0ZW5Pbih0aW1lc3RhbXApOworICAgICAgICBlLnNldFNpZGUoYy5zaWRlID09IEdldERyYWZ0LlNpZGUuUEFSRU5UID8gKHNob3J0KSAwIDogKHNob3J0KSAxKTsKKyAgICAgICAgZS5zZXRNZXNzYWdlKGMubWVzc2FnZSk7CisgICAgICAgIChjcmVhdGUgPyBpbnMgOiB1cGQpLmFkZChlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKE9iamVjdHMuZmlyc3ROb25OdWxsKGRyYWZ0c0hhbmRsaW5nLCBEcmFmdEhhbmRsaW5nLkRFTEVURSkpIHsKKyAgICAgIGNhc2UgS0VFUDoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgIGRlbC5hZGRBbGwoZHJhZnRzLnZhbHVlcygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBVQkxJU0g6CisgICAgICAgIGZvciAoUGF0Y2hMaW5lQ29tbWVudCBlIDogZHJhZnRzLnZhbHVlcygpKSB7CisgICAgICAgICAgZS5zZXRTdGF0dXMoUGF0Y2hMaW5lQ29tbWVudC5TdGF0dXMuUFVCTElTSEVEKTsKKyAgICAgICAgICBlLnNldFdyaXR0ZW5Pbih0aW1lc3RhbXApOworICAgICAgICAgIHVwZC5hZGQoZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRiLnBhdGNoQ29tbWVudHMoKS5kZWxldGUoZGVsKTsKKyAgICBkYi5wYXRjaENvbW1lbnRzKCkuaW5zZXJ0KGlucyk7CisgICAgZGIucGF0Y2hDb21tZW50cygpLnVwZGF0ZSh1cGQpOworICAgIGNvbW1lbnRzLmFkZEFsbChpbnMpOworICAgIGNvbW1lbnRzLmFkZEFsbCh1cGQpOworICAgIHJldHVybiAhZGVsLmlzRW1wdHkoKSB8fCAhaW5zLmlzRW1wdHkoKSB8fCAhdXBkLmlzRW1wdHkoKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZywgUGF0Y2hMaW5lQ29tbWVudD4gc2NhbkRyYWZ0Q29tbWVudHMoCisgICAgICBSZXZpc2lvblJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIE1hcDxTdHJpbmcsIFBhdGNoTGluZUNvbW1lbnQ+IGRyYWZ0cyA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoUGF0Y2hMaW5lQ29tbWVudCBjIDogZGIucGF0Y2hDb21tZW50cygpLmRyYWZ0QnlQYXRjaFNldEF1dGhvcigKKyAgICAgICAgICByc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwKKyAgICAgICAgICByc3JjLmdldEFjY291bnRJZCgpKSkgeworICAgICAgZHJhZnRzLnB1dChjLmdldEtleSgpLmdldCgpLCBjKTsKKyAgICB9CisgICAgcmV0dXJuIGRyYWZ0czsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiB1cGRhdGVMYWJlbHMoUmV2aXNpb25SZXNvdXJjZSByc3JjLCBNYXA8U3RyaW5nLCBTaG9ydD4gbGFiZWxzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGxhYmVscyA9PSBudWxsKSB7CisgICAgICBsYWJlbHMgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgIH0KKworICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gZGVsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBpbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IHVwZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIE1hcDxTdHJpbmcsIFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnQgPSBzY2FuTGFiZWxzKHJzcmMsIGRlbCk7CisKKyAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSByc3JjLmdldENvbnRyb2woKS5nZXRMYWJlbFR5cGVzKCk7CisgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTaG9ydD4gZW50IDogbGFiZWxzLmVudHJ5U2V0KCkpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gZW50LmdldEtleSgpOworICAgICAgTGFiZWxUeXBlIGx0ID0gY2hlY2tOb3ROdWxsKGxhYmVsVHlwZXMuYnlMYWJlbChuYW1lKSwgbmFtZSk7CisgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgLy8gVE9ETyBBbGxvdyB1cGRhdGluZyBzb21lIGxhYmVscyBldmVuIHdoZW4gY2xvc2VkLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBjID0gY3VycmVudC5yZW1vdmUobmFtZSk7CisgICAgICBpZiAoZW50LmdldFZhbHVlKCkgPT0gbnVsbCB8fCBlbnQuZ2V0VmFsdWUoKSA9PSAwKSB7CisgICAgICAgIC8vIFVzZXIgcmVxdWVzdGVkIGRlbGV0ZSBvZiB0aGlzIGxhYmVsLgorICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKGMuZ2V0VmFsdWUoKSAhPSAwKSB7CisgICAgICAgICAgICBsYWJlbERlbHRhLmFkZCgiLSIgKyBuYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVsLmFkZChjKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjICE9IG51bGwgJiYgYy5nZXRWYWx1ZSgpICE9IGVudC5nZXRWYWx1ZSgpKSB7CisgICAgICAgIGMuc2V0VmFsdWUoZW50LmdldFZhbHVlKCkpOworICAgICAgICBjLnNldEdyYW50ZWQodGltZXN0YW1wKTsKKyAgICAgICAgYy5jYWNoZShjaGFuZ2UpOworICAgICAgICB1cGQuYWRkKGMpOworICAgICAgICBsYWJlbERlbHRhLmFkZChmb3JtYXQobmFtZSwgYy5nZXRWYWx1ZSgpKSk7CisgICAgICAgIGNhdGVnb3JpZXMucHV0KG5hbWUsIGMuZ2V0VmFsdWUoKSk7CisgICAgICB9IGVsc2UgaWYgKGMgIT0gbnVsbCAmJiBjLmdldFZhbHVlKCkgPT0gZW50LmdldFZhbHVlKCkpIHsKKyAgICAgICAgY3VycmVudC5wdXQobmFtZSwgYyk7CisgICAgICB9IGVsc2UgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICBjID0gbmV3IFBhdGNoU2V0QXBwcm92YWwobmV3IFBhdGNoU2V0QXBwcm92YWwuS2V5KAorICAgICAgICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgICAgICAgIHJzcmMuZ2V0QWNjb3VudElkKCksCisgICAgICAgICAgICAgICAgbHQuZ2V0TGFiZWxJZCgpKSwKKyAgICAgICAgICAgIGVudC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYy5zZXRHcmFudGVkKHRpbWVzdGFtcCk7CisgICAgICAgIGMuY2FjaGUoY2hhbmdlKTsKKyAgICAgICAgaW5zLmFkZChjKTsKKyAgICAgICAgbGFiZWxEZWx0YS5hZGQoZm9ybWF0KG5hbWUsIGMuZ2V0VmFsdWUoKSkpOworICAgICAgICBjYXRlZ29yaWVzLnB1dChuYW1lLCBjLmdldFZhbHVlKCkpOworICAgICAgfQorICAgIH0KKworICAgIGZvcmNlQ2FsbGVyQXNSZXZpZXdlcihyc3JjLCBjdXJyZW50LCBpbnMsIHVwZCwgZGVsKTsKKyAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmRlbGV0ZShkZWwpOworICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuaW5zZXJ0KGlucyk7CisgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS51cGRhdGUodXBkKTsKKyAgICByZXR1cm4gIWRlbC5pc0VtcHR5KCkgfHwgIWlucy5pc0VtcHR5KCkgfHwgIXVwZC5pc0VtcHR5KCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgZm9yY2VDYWxsZXJBc1Jldmlld2VyKFJldmlzaW9uUmVzb3VyY2UgcnNyYywKKyAgICAgIE1hcDxTdHJpbmcsIFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnQsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gaW5zLAorICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiB1cGQsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gZGVsKSB7CisgICAgaWYgKGN1cnJlbnQuaXNFbXB0eSgpICYmIGlucy5pc0VtcHR5KCkgJiYgdXBkLmlzRW1wdHkoKSkgeworICAgICAgLy8gVE9ETyBGaW5kIGFub3RoZXIgd2F5IHRvIGxpbmsgcmV2aWV3ZXJzIHRvIGNoYW5nZXMuCisgICAgICBpZiAoZGVsLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBJZiBubyBleGlzdGluZyBsYWJlbCBpcyBiZWluZyBzZXQgdG8gMCwgaGFjayBpbiB0aGUgY2FsbGVyCisgICAgICAgIC8vIGFzIGEgcmV2aWV3ZXIgYnkgcGlja2luZyB0aGUgZmlyc3Qgc2VydmVyLXdpZGUgTGFiZWxUeXBlLgorICAgICAgICBQYXRjaFNldEFwcHJvdmFsIGMgPSBuZXcgUGF0Y2hTZXRBcHByb3ZhbChuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkoCisgICAgICAgICAgICByc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwKKyAgICAgICAgICAgIHJzcmMuZ2V0QWNjb3VudElkKCksCisgICAgICAgICAgICByc3JjLmdldENvbnRyb2woKS5nZXRMYWJlbFR5cGVzKCkuZ2V0TGFiZWxUeXBlcygpLmdldCgwKQorICAgICAgICAgICAgICAgIC5nZXRMYWJlbElkKCkpLAorICAgICAgICAgICAgKHNob3J0KSAwKTsKKyAgICAgICAgYy5zZXRHcmFudGVkKHRpbWVzdGFtcCk7CisgICAgICAgIGMuY2FjaGUoY2hhbmdlKTsKKyAgICAgICAgaW5zLmFkZChjKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBpY2sgYSByYW5kb20gbGFiZWwgdGhhdCBpcyBhYm91dCB0byBiZSBkZWxldGVkIGFuZCBrZWVwIGl0LgorICAgICAgICBJdGVyYXRvcjxQYXRjaFNldEFwcHJvdmFsPiBpID0gZGVsLml0ZXJhdG9yKCk7CisgICAgICAgIFBhdGNoU2V0QXBwcm92YWwgYyA9IGkubmV4dCgpOworICAgICAgICBjLnNldFZhbHVlKChzaG9ydCkgMCk7CisgICAgICAgIGMuc2V0R3JhbnRlZCh0aW1lc3RhbXApOworICAgICAgICBjLmNhY2hlKGNoYW5nZSk7CisgICAgICAgIGkucmVtb3ZlKCk7CisgICAgICAgIHVwZC5hZGQoYyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQYXRjaFNldEFwcHJvdmFsPiBzY2FuTGFiZWxzKFJldmlzaW9uUmVzb3VyY2UgcnNyYywKKyAgICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gZGVsKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSByc3JjLmdldENvbnRyb2woKS5nZXRMYWJlbFR5cGVzKCk7CisgICAgTWFwPFN0cmluZywgUGF0Y2hTZXRBcHByb3ZhbD4gY3VycmVudCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0VXNlcigKKyAgICAgICAgICByc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwgcnNyYy5nZXRBY2NvdW50SWQoKSkpIHsKKyAgICAgIGlmIChhLmlzU3VibWl0KCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIExhYmVsVHlwZSBsdCA9IGxhYmVsVHlwZXMuYnlMYWJlbChhLmdldExhYmVsSWQoKSk7CisgICAgICBpZiAobHQgIT0gbnVsbCkgeworICAgICAgICBjdXJyZW50LnB1dChsdC5nZXROYW1lKCksIGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsLmFkZChhKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGN1cnJlbnQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KFN0cmluZyBuYW1lLCBzaG9ydCB2YWx1ZSkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihuYW1lLmxlbmd0aCgpICsgMik7CisgICAgc2IuYXBwZW5kKG5hbWUpOworICAgIGlmICh2YWx1ZSA+PSAwKSB7CisgICAgICBzYi5hcHBlbmQoJysnKTsKKyAgICB9CisgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpbnNlcnRNZXNzYWdlKFJldmlzaW9uUmVzb3VyY2UgcnNyYywgU3RyaW5nIG1zZykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIG1zZyA9IFN0cmluZ3MubnVsbFRvRW1wdHkobXNnKS50cmltKCk7CisKKyAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZm9yIChTdHJpbmcgZCA6IGxhYmVsRGVsdGEpIHsKKyAgICAgIGJ1Zi5hcHBlbmQoIiAiKS5hcHBlbmQoZCk7CisgICAgfQorICAgIGlmIChjb21tZW50cy5zaXplKCkgPT0gMSkgeworICAgICAgYnVmLmFwcGVuZCgiXG5cbigxIGNvbW1lbnQpIik7CisgICAgfSBlbHNlIGlmIChjb21tZW50cy5zaXplKCkgPiAxKSB7CisgICAgICBidWYuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlxuXG4oJWQgY29tbWVudHMpIiwgY29tbWVudHMuc2l6ZSgpKSk7CisgICAgfQorICAgIGlmICghbXNnLmlzRW1wdHkoKSkgeworICAgICAgYnVmLmFwcGVuZCgiXG5cbiIpLmFwcGVuZChtc2cpOworICAgIH0KKyAgICBpZiAoYnVmLmxlbmd0aCgpID09IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZXNzYWdlID0gbmV3IENoYW5nZU1lc3NhZ2UoCisgICAgICAgIG5ldyBDaGFuZ2VNZXNzYWdlLktleShjaGFuZ2UuZ2V0SWQoKSwgQ2hhbmdlVXRpbC5tZXNzYWdlVVVJRChkYikpLAorICAgICAgICByc3JjLmdldEFjY291bnRJZCgpLAorICAgICAgICB0aW1lc3RhbXAsCisgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpKTsKKyAgICBtZXNzYWdlLnNldE1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgIlBhdGNoIFNldCAlZDolcyIsCisgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRQYXRjaFNldElkKCksCisgICAgICAgIGJ1Zi50b1N0cmluZygpKSk7CisgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1lc3NhZ2UpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBEZXByZWNhdGVkCisgIHByaXZhdGUgdm9pZCBmaXJlQ29tbWVudEFkZGVkSG9vayhSZXZpc2lvblJlc291cmNlIHJzcmMpIHsKKyAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gKElkZW50aWZpZWRVc2VyKSByc3JjLmdldENvbnRyb2woKS5nZXRDdXJyZW50VXNlcigpOworICAgIHRyeSB7CisgICAgICBob29rcy5kb0NvbW1lbnRBZGRlZEhvb2soY2hhbmdlLAorICAgICAgICAgIHVzZXIuZ2V0QWNjb3VudCgpLAorICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKSwKKyAgICAgICAgICBtZXNzYWdlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICBjYXRlZ29yaWVzLCBkYik7CisgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy53YXJuKCJDaGFuZ2VIb29rLmRvQ29tbWVudEFkZGVkSG9vayBkZWxpdmVyeSBmYWlsZWQiLCBlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Bvc3RSZXZpZXdlcnMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Bvc3RSZXZpZXdlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNmMjU5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUG9zdFJldmlld2Vycy5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBNZW1iZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUG9zdFJldmlld2Vycy5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJldmlld2VySnNvbi5Qb3N0UmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aWV3ZXJKc29uLlJldmlld2VySW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBzQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5BZGRSZXZpZXdlclNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKK2ltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgUG9zdFJldmlld2VycyBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PENoYW5nZVJlc291cmNlLCBJbnB1dD4geworICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX01BWF9SRVZJRVdFUlNfV0lUSE9VVF9DSEVDSyA9IDEwOworICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX01BWF9SRVZJRVdFUlMgPSAyMDsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgcHVibGljIFN0cmluZyByZXZpZXdlcjsKKyAgICBCb29sZWFuIGNvbmZpcm1lZDsKKworICAgIGJvb2xlYW4gY29uZmlybWVkKCkgeworICAgICAgcmV0dXJuIE9iamVjdHMuZmlyc3ROb25OdWxsKGNvbmZpcm1lZCwgZmFsc2UpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgQWNjb3VudHNDb2xsZWN0aW9uIGFjY291bnRzOworICBwcml2YXRlIGZpbmFsIFJldmlld2VyUmVzb3VyY2UuRmFjdG9yeSByZXZpZXdlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQWRkUmV2aWV3ZXJTZW5kZXIuRmFjdG9yeSBhZGRSZXZpZXdlclNlbmRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cE1lbWJlcnMuRmFjdG9yeSBncm91cE1lbWJlcnNGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEFjY291bnRJbmZvLkxvYWRlci5GYWN0b3J5IGFjY291bnRMb2FkZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQ29uZmlnIGNmZzsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOworICBwcml2YXRlIGZpbmFsIFJldmlld2VySnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgUG9zdFJldmlld2VycyhBY2NvdW50c0NvbGxlY3Rpb24gYWNjb3VudHMsCisgICAgICBSZXZpZXdlclJlc291cmNlLkZhY3RvcnkgcmV2aWV3ZXJGYWN0b3J5LAorICAgICAgQWRkUmV2aWV3ZXJTZW5kZXIuRmFjdG9yeSBhZGRSZXZpZXdlclNlbmRlckZhY3RvcnksCisgICAgICBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uLAorICAgICAgR3JvdXBNZW1iZXJzLkZhY3RvcnkgZ3JvdXBNZW1iZXJzRmFjdG9yeSwKKyAgICAgIEFjY291bnRJbmZvLkxvYWRlci5GYWN0b3J5IGFjY291bnRMb2FkZXJGYWN0b3J5LAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiLAorICAgICAgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXIsCisgICAgICBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3RvcnksCisgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcsCisgICAgICBDaGFuZ2VIb29rcyBob29rcywKKyAgICAgIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCisgICAgICBSZXZpZXdlckpzb24ganNvbikgeworICAgIHRoaXMuYWNjb3VudHMgPSBhY2NvdW50czsKKyAgICB0aGlzLnJldmlld2VyRmFjdG9yeSA9IHJldmlld2VyRmFjdG9yeTsKKyAgICB0aGlzLmFkZFJldmlld2VyU2VuZGVyRmFjdG9yeSA9IGFkZFJldmlld2VyU2VuZGVyRmFjdG9yeTsKKyAgICB0aGlzLmdyb3Vwc0NvbGxlY3Rpb24gPSBncm91cHNDb2xsZWN0aW9uOworICAgIHRoaXMuZ3JvdXBNZW1iZXJzRmFjdG9yeSA9IGdyb3VwTWVtYmVyc0ZhY3Rvcnk7CisgICAgdGhpcy5hY2NvdW50TG9hZGVyRmFjdG9yeSA9IGFjY291bnRMb2FkZXJGYWN0b3J5OworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7CisgICAgdGhpcy5pZGVudGlmaWVkVXNlckZhY3RvcnkgPSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7CisgICAgdGhpcy5jZmcgPSBjZmc7CisgICAgdGhpcy5ob29rcyA9IGhvb2tzOworICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFBvc3RSZXN1bHQgYXBwbHkoQ2hhbmdlUmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgRW1haWxFeGNlcHRpb24geworICAgIGlmIChpbnB1dC5yZXZpZXdlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigibWlzc2luZyByZXZpZXdlciBmaWVsZCIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBBY2NvdW50LklkIGFjY291bnRJZCA9IGFjY291bnRzLnBhcnNlKGlucHV0LnJldmlld2VyKS5nZXRBY2NvdW50SWQoKTsKKyAgICAgIHJldHVybiBwdXRBY2NvdW50KHJldmlld2VyRmFjdG9yeS5jcmVhdGUocnNyYywgYWNjb3VudElkKSk7CisgICAgfSBjYXRjaCAoVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiBlKSB7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gcHV0R3JvdXAocnNyYywgaW5wdXQpOworICAgICAgfSBjYXRjaCAoVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiBlMikgeworICAgICAgICB0aHJvdyBuZXcgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKyAgICAgICAgICAgIENoYW5nZU1lc3NhZ2VzLmdldCgpLnJldmlld2VyTm90Rm91bmQsCisgICAgICAgICAgICBpbnB1dC5yZXZpZXdlcikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgUG9zdFJlc3VsdCBwdXRBY2NvdW50KFJldmlld2VyUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEVtYWlsRXhjZXB0aW9uIHsKKyAgICBQb3N0UmVzdWx0IHJlc3VsdCA9IG5ldyBQb3N0UmVzdWx0KCk7CisgICAgYWRkUmV2aWV3ZXJzKHJzcmMsIHJlc3VsdCwgSW1tdXRhYmxlU2V0Lm9mKHJzcmMuZ2V0VXNlcigpKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgUG9zdFJlc3VsdCBwdXRHcm91cChDaGFuZ2VSZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBFbWFpbEV4Y2VwdGlvbiB7CisgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBncm91cCA9IGdyb3Vwc0NvbGxlY3Rpb24uZ2V0KCkucGFyc2VJbnRlcm5hbChpbnB1dC5yZXZpZXdlcik7CisgICAgUG9zdFJlc3VsdCByZXN1bHQgPSBuZXcgUG9zdFJlc3VsdCgpOworICAgIGlmICghaXNMZWdhbFJldmlld2VyR3JvdXAoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpKSB7CisgICAgICByZXN1bHQuZXJyb3IgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKyAgICAgICAgICBDaGFuZ2VNZXNzYWdlcy5nZXQoKS5ncm91cElzTm90QWxsb3dlZCwgZ3JvdXAuZ2V0TmFtZSgpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgU2V0PElkZW50aWZpZWRVc2VyPiByZXZpZXdlcnMgPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXQoKTsKKyAgICBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSByc3JjLmdldENvbnRyb2woKTsKKyAgICBTZXQ8QWNjb3VudD4gbWVtYmVyczsKKyAgICB0cnkgeworICAgICAgbWVtYmVycyA9IGdyb3VwTWVtYmVyc0ZhY3RvcnkuY3JlYXRlKGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSkubGlzdEFjY291bnRzKAorICAgICAgICAgICAgICBncm91cC5nZXRHcm91cFVVSUQoKSwgY29udHJvbC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorCisgICAgLy8gaWYgbWF4QWxsb3dlZCBpcyBzZXQgdG8gMCwgaXQgaXMgYWxsb3dlZCB0byBhZGQgYW55IG51bWJlciBvZgorICAgIC8vIHJldmlld2VycworICAgIGludCBtYXhBbGxvd2VkID0KKyAgICAgICAgY2ZnLmdldEludCgiYWRkcmV2aWV3ZXIiLCAibWF4QWxsb3dlZCIsIERFRkFVTFRfTUFYX1JFVklFV0VSUyk7CisgICAgaWYgKG1heEFsbG93ZWQgPiAwICYmIG1lbWJlcnMuc2l6ZSgpID4gbWF4QWxsb3dlZCkgeworICAgICAgcmVzdWx0LmVycm9yID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisgICAgICAgICAgQ2hhbmdlTWVzc2FnZXMuZ2V0KCkuZ3JvdXBIYXNUb29NYW55TWVtYmVycywgZ3JvdXAuZ2V0TmFtZSgpKTsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLy8gaWYgbWF4V2l0aG91dENoZWNrIGlzIHNldCB0byAwLCB3ZSBuZXZlciBhc2sgZm9yIGNvbmZpcm1hdGlvbgorICAgIGludCBtYXhXaXRob3V0Q29uZmlybWF0aW9uID0KKyAgICAgICAgY2ZnLmdldEludCgiYWRkcmV2aWV3ZXIiLCAibWF4V2l0aG91dENvbmZpcm1hdGlvbiIsCisgICAgICAgICAgICBERUZBVUxUX01BWF9SRVZJRVdFUlNfV0lUSE9VVF9DSEVDSyk7CisgICAgaWYgKCFpbnB1dC5jb25maXJtZWQoKSAmJiBtYXhXaXRob3V0Q29uZmlybWF0aW9uID4gMAorICAgICAgICAmJiBtZW1iZXJzLnNpemUoKSA+IG1heFdpdGhvdXRDb25maXJtYXRpb24pIHsKKyAgICAgIHJlc3VsdC5jb25maXJtID0gdHJ1ZTsKKyAgICAgIHJlc3VsdC5lcnJvciA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorICAgICAgICAgIENoYW5nZU1lc3NhZ2VzLmdldCgpLmdyb3VwTWFueU1lbWJlcnNDb25maXJtYXRpb24sCisgICAgICAgICAgZ3JvdXAuZ2V0TmFtZSgpLCBtZW1iZXJzLnNpemUoKSk7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGZvciAoQWNjb3VudCBtZW1iZXIgOiBtZW1iZXJzKSB7CisgICAgICBpZiAobWVtYmVyLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgSWRlbnRpZmllZFVzZXIgdXNlciA9IGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUobWVtYmVyLmdldElkKCkpOworICAgICAgICAvLyBEb2VzIG5vdCBhY2NvdW50IGZvciBkcmFmdCBzdGF0dXMgYXMgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gbGV0IGEKKyAgICAgICAgLy8gcmV2aWV3ZXIgc2VlIGEgZHJhZnQuCisgICAgICAgIGlmIChjb250cm9sLmZvclVzZXIodXNlcikuaXNSZWZWaXNpYmxlKCkpIHsKKyAgICAgICAgICByZXZpZXdlcnMuYWRkKHVzZXIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYWRkUmV2aWV3ZXJzKHJzcmMsIHJlc3VsdCwgcmV2aWV3ZXJzKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGFkZFJldmlld2VycyhDaGFuZ2VSZXNvdXJjZSByc3JjLCBQb3N0UmVzdWx0IHJlc3VsdCwKKyAgICAgIFNldDxJZGVudGlmaWVkVXNlcj4gcmV2aWV3ZXJzKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBFbWFpbEV4Y2VwdGlvbiB7CisgICAgaWYgKHJldmlld2Vycy5pc0VtcHR5KCkpIHsKKyAgICAgIHJlc3VsdC5yZXZpZXdlcnMgPSBJbW11dGFibGVMaXN0Lm9mKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgUGF0Y2hTZXQuSWQgcHNpZCA9IHJzcmMuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKTsKKyAgICBTZXQ8QWNjb3VudC5JZD4gZXhpc3RpbmcgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogZGIuZ2V0KCkucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0KHBzaWQpKSB7CisgICAgICBleGlzdGluZy5hZGQocHNhLmdldEFjY291bnRJZCgpKTsKKyAgICB9CisKKyAgICByZXN1bHQucmV2aWV3ZXJzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHJldmlld2Vycy5zaXplKCkpOworICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gdG9JbnNlcnQgPQorICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocmV2aWV3ZXJzLnNpemUoKSk7CisgICAgZm9yIChJZGVudGlmaWVkVXNlciB1c2VyIDogcmV2aWV3ZXJzKSB7CisgICAgICBBY2NvdW50LklkIGlkID0gdXNlci5nZXRBY2NvdW50SWQoKTsKKyAgICAgIGlmIChleGlzdGluZy5jb250YWlucyhpZCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSByc3JjLmdldENvbnRyb2woKS5mb3JVc2VyKHVzZXIpOworICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBwc2EgPSBkdW1teUFwcHJvdmFsKGNvbnRyb2wsIHBzaWQsIGlkKTsKKyAgICAgIHJlc3VsdC5yZXZpZXdlcnMuYWRkKGpzb24uZm9ybWF0KAorICAgICAgICAgIG5ldyBSZXZpZXdlckluZm8oaWQpLCBjb250cm9sLCBJbW11dGFibGVMaXN0Lm9mKHBzYSkpKTsKKyAgICAgIHRvSW5zZXJ0LmFkZChwc2EpOworICAgIH0KKyAgICBkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLmluc2VydCh0b0luc2VydCk7CisgICAgYWNjb3VudExvYWRlckZhY3RvcnkuY3JlYXRlKHRydWUpLmZpbGwocmVzdWx0LnJldmlld2Vycyk7CisgICAgcG9zdEFkZChyc3JjLmdldENoYW5nZSgpLCByZXN1bHQpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHBvc3RBZGQoQ2hhbmdlIGNoYW5nZSwgUG9zdFJlc3VsdCByZXN1bHQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBFbWFpbEV4Y2VwdGlvbiB7CisgICAgaWYgKHJlc3VsdC5yZXZpZXdlcnMuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRXhlY3V0ZSBob29rIGZvciBhZGRlZCByZXZpZXdlcnMKKyAgICAvLworICAgIFBhdGNoU2V0IHBhdGNoU2V0ID0gZGIuZ2V0KCkucGF0Y2hTZXRzKCkuZ2V0KGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICBmb3IgKEFjY291bnRJbmZvIGluZm8gOiByZXN1bHQucmV2aWV3ZXJzKSB7CisgICAgICBBY2NvdW50IGFjY291bnQgPSBhY2NvdW50Q2FjaGUuZ2V0KGluZm8uX2lkKS5nZXRBY2NvdW50KCk7CisgICAgICBob29rcy5kb1Jldmlld2VyQWRkZWRIb29rKGNoYW5nZSwgYWNjb3VudCwgcGF0Y2hTZXQsIGRiLmdldCgpKTsKKyAgICB9CisKKyAgICAvLyBFbWFpbCB0aGUgcmV2aWV3ZXJzCisgICAgLy8KKyAgICAvLyBUaGUgdXNlciBrbm93cyB0aGV5IGFkZGVkIHRoZW1zZWx2ZXMsIGRvbid0IGJvdGhlciBlbWFpbGluZyB0aGVtLgorICAgIExpc3Q8QWNjb3VudC5JZD4gYWRkZWQgPQorICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocmVzdWx0LnJldmlld2Vycy5zaXplKCkpOworICAgIGZvciAoQWNjb3VudEluZm8gaW5mbyA6IHJlc3VsdC5yZXZpZXdlcnMpIHsKKyAgICAgIGlmICghaW5mby5faWQuZXF1YWxzKGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpKSkgeworICAgICAgICBhZGRlZC5hZGQoaW5mby5faWQpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWFkZGVkLmlzRW1wdHkoKSkgeworICAgICAgQWRkUmV2aWV3ZXJTZW5kZXIgY207CisKKyAgICAgIGNtID0gYWRkUmV2aWV3ZXJTZW5kZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2UpOworICAgICAgY20uc2V0RnJvbShjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CisgICAgICBjbS5hZGRSZXZpZXdlcnMoYWRkZWQpOworICAgICAgY20uc2VuZCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsUmV2aWV3ZXJHcm91cChBY2NvdW50R3JvdXAuVVVJRCBncm91cFVVSUQpIHsKKyAgICByZXR1cm4gIShBY2NvdW50R3JvdXAuQU5PTllNT1VTX1VTRVJTLmVxdWFscyhncm91cFVVSUQpCisgICAgICAgICAgICAgfHwgQWNjb3VudEdyb3VwLlJFR0lTVEVSRURfVVNFUlMuZXF1YWxzKGdyb3VwVVVJRCkpOworICB9CisKKyAgcHJpdmF0ZSBQYXRjaFNldEFwcHJvdmFsIGR1bW15QXBwcm92YWwoQ2hhbmdlQ29udHJvbCBjdGwsCisgICAgICBQYXRjaFNldC5JZCBwYXRjaFNldElkLCBBY2NvdW50LklkIHJldmlld2VySWQpIHsKKyAgICBMYWJlbElkIGlkID0KKyAgICAgICAgSXRlcmFibGVzLmdldExhc3QoY3RsLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCkpLmdldExhYmVsSWQoKTsKKyAgICBQYXRjaFNldEFwcHJvdmFsIGR1bW15QXBwcm92YWwgPSBuZXcgUGF0Y2hTZXRBcHByb3ZhbCgKKyAgICAgICAgbmV3IFBhdGNoU2V0QXBwcm92YWwuS2V5KHBhdGNoU2V0SWQsIHJldmlld2VySWQsIGlkKSwgKHNob3J0KSAwKTsKKyAgICBkdW1teUFwcHJvdmFsLmNhY2hlKGN0bC5nZXRDaGFuZ2UoKSk7CisgICAgcmV0dXJuIGR1bW15QXBwcm92YWw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1B1dERyYWZ0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QdXREcmFmdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZWFhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QdXREcmFmdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkdldERyYWZ0LlNpZGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5QdXREcmFmdC5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2NsYXNzIFB1dERyYWZ0IGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8RHJhZnRSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBTdHJpbmcga2luZDsKKyAgICBTdHJpbmcgaWQ7CisgICAgU3RyaW5nIHBhdGg7CisgICAgU2lkZSBzaWRlOworICAgIEludGVnZXIgbGluZTsKKyAgICBTdHJpbmcgaW5SZXBseVRvOworICAgIFRpbWVzdGFtcCB1cGRhdGVkOyAvLyBBY2NlcHRlZCBidXQgaWdub3JlZC4KKworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBTdHJpbmcgbWVzc2FnZTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPERlbGV0ZURyYWZ0PiBkZWxldGU7CisKKyAgQEluamVjdAorICBQdXREcmFmdChQcm92aWRlcjxSZXZpZXdEYj4gZGIsIFByb3ZpZGVyPERlbGV0ZURyYWZ0PiBkZWxldGUpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5kZWxldGUgPSBkZWxldGU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShEcmFmdFJlc291cmNlIHJzcmMsIElucHV0IGluKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgUGF0Y2hMaW5lQ29tbWVudCBjID0gcnNyYy5nZXRDb21tZW50KCk7CisgICAgaWYgKGluID09IG51bGwgfHwgaW4ubWVzc2FnZSA9PSBudWxsIHx8IGluLm1lc3NhZ2UudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIGRlbGV0ZS5nZXQoKS5hcHBseShyc3JjLCBudWxsKTsKKyAgICB9IGVsc2UgaWYgKGluLmtpbmQgIT0gbnVsbCAmJiAhImdlcnJpdGNvZGVyZXZpZXcjY29tbWVudCIuZXF1YWxzKGluLmtpbmQpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiZXhwZWN0ZWQga2luZCBnZXJyaXRjb2RlcmV2aWV3I2NvbW1lbnQiKTsKKyAgICB9IGVsc2UgaWYgKGluLmlkICE9IG51bGwgJiYgIXJzcmMuZ2V0SWQoKS5lcXVhbHMoaW4uaWQpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiaWQgbXVzdCBtYXRjaCBVUkwiKTsKKyAgICB9IGVsc2UgaWYgKGluLmxpbmUgIT0gbnVsbCAmJiBpbi5saW5lIDwgMCkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oImxpbmUgbXVzdCBiZSA+PSAwIik7CisgICAgfQorCisgICAgaWYgKGluLnBhdGggIT0gbnVsbAorICAgICAgICAmJiAhaW4ucGF0aC5lcXVhbHMoYy5nZXRLZXkoKS5nZXRQYXJlbnRLZXkoKS5nZXRGaWxlTmFtZSgpKSkgeworICAgICAgLy8gVXBkYXRpbmcgdGhlIHBhdGggYWx0ZXJzIHRoZSBwcmltYXJ5IGtleSwgd2hpY2ggaXNuJ3QgcG9zc2libGUuCisgICAgICAvLyBEZWxldGUgdGhlbiByZWNyZWF0ZSB0aGUgY29tbWVudCBpbnN0ZWFkIG9mIGFuIHVwZGF0ZS4KKyAgICAgIGRiLmdldCgpLnBhdGNoQ29tbWVudHMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGMpKTsKKyAgICAgIGMgPSBuZXcgUGF0Y2hMaW5lQ29tbWVudCgKKyAgICAgICAgICBuZXcgUGF0Y2hMaW5lQ29tbWVudC5LZXkoCisgICAgICAgICAgICAgIG5ldyBQYXRjaC5LZXkocnNyYy5nZXRQYXRjaFNldCgpLmdldElkKCksIGluLnBhdGgpLAorICAgICAgICAgICAgICBjLmdldEtleSgpLmdldCgpKSwKKyAgICAgICAgICBjLmdldExpbmUoKSwKKyAgICAgICAgICByc3JjLmdldEF1dGhvcklkKCksCisgICAgICAgICAgYy5nZXRQYXJlbnRVdWlkKCkpOworICAgICAgZGIuZ2V0KCkucGF0Y2hDb21tZW50cygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24odXBkYXRlKGMsIGluKSkpOworICAgIH0gZWxzZSB7CisgICAgICBkYi5nZXQoKS5wYXRjaENvbW1lbnRzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbih1cGRhdGUoYywgaW4pKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgR2V0RHJhZnQuQ29tbWVudChjKTsKKyAgfQorCisgIHByaXZhdGUgUGF0Y2hMaW5lQ29tbWVudCB1cGRhdGUoUGF0Y2hMaW5lQ29tbWVudCBlLCBJbnB1dCBpbikgeworICAgIGlmIChpbi5zaWRlICE9IG51bGwpIHsKKyAgICAgIGUuc2V0U2lkZShpbi5zaWRlID09IEdldERyYWZ0LlNpZGUuUEFSRU5UID8gKHNob3J0KSAwIDogKHNob3J0KSAxKTsKKyAgICB9CisgICAgaWYgKGluLmxpbmUgIT0gbnVsbCkgeworICAgICAgZS5zZXRMaW5lKGluLmxpbmUpOworICAgIH0KKyAgICBpZiAoaW4uaW5SZXBseVRvICE9IG51bGwpIHsKKyAgICAgIGUuc2V0UGFyZW50VXVpZChVcmwuZGVjb2RlKGluLmluUmVwbHlUbykpOworICAgIH0KKyAgICBlLnNldE1lc3NhZ2UoaW4ubWVzc2FnZS50cmltKCkpOworICAgIGUudXBkYXRlZCgpOworICAgIHJldHVybiBlOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9QdXRUb3BpYy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUHV0VG9waWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTZiNDgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUHV0VG9waWMuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlB1dFRvcGljLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2NsYXNzIFB1dFRvcGljIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8Q2hhbmdlUmVzb3VyY2UsIElucHV0PiB7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgU3RyaW5nIHRvcGljOworICAgIFN0cmluZyBtZXNzYWdlOworICB9CisKKyAgQEluamVjdAorICBQdXRUb3BpYyhQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcikgeworICAgIHRoaXMuZGJQcm92aWRlciA9IGRiUHJvdmlkZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShDaGFuZ2VSZXNvdXJjZSByZXEsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLCBFeGNlcHRpb24geworICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICBpbnB1dCA9IG5ldyBJbnB1dCgpOworICAgIH0KKworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IHJlcS5nZXRDb250cm9sKCk7CisgICAgQ2hhbmdlIGNoYW5nZSA9IHJlcS5nZXRDaGFuZ2UoKTsKKyAgICBpZiAoIWNvbnRyb2wuY2FuRWRpdFRvcGljTmFtZSgpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiY2hhbmdpbmcgdG9waWMgbm90IHBlcm1pdHRlZCIpOworICAgIH0KKworICAgIFJldmlld0RiIGRiID0gZGJQcm92aWRlci5nZXQoKTsKKyAgICBmaW5hbCBTdHJpbmcgbmV3VG9waWNOYW1lID0gU3RyaW5ncy5udWxsVG9FbXB0eShpbnB1dC50b3BpYyk7CisgICAgU3RyaW5nIG9sZFRvcGljTmFtZSA9IFN0cmluZ3MubnVsbFRvRW1wdHkoY2hhbmdlLmdldFRvcGljKCkpOworICAgIGlmICghb2xkVG9waWNOYW1lLmVxdWFscyhuZXdUb3BpY05hbWUpKSB7CisgICAgICBTdHJpbmcgc3VtbWFyeTsKKyAgICAgIGlmIChvbGRUb3BpY05hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIHN1bW1hcnkgPSAiVG9waWMgc2V0IHRvIFwiIiArIG5ld1RvcGljTmFtZSArICJcIi4iOworICAgICAgfSBlbHNlIGlmIChuZXdUb3BpY05hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgIHN1bW1hcnkgPSAiVG9waWMgXCIiICsgb2xkVG9waWNOYW1lICsgIlwiIHJlbW92ZWQuIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN1bW1hcnkgPSBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIlRvcGljIHVwZGF0ZWQgZnJvbSBcIiVzXCIgdG8gXCIlc1wiLiIsCisgICAgICAgICAgICBvbGRUb3BpY05hbWUsIG5ld1RvcGljTmFtZSk7CisgICAgICB9CisKKyAgICAgIENoYW5nZU1lc3NhZ2UgY21zZyA9IG5ldyBDaGFuZ2VNZXNzYWdlKAorICAgICAgICAgIG5ldyBDaGFuZ2VNZXNzYWdlLktleShjaGFuZ2UuZ2V0SWQoKSwgQ2hhbmdlVXRpbC5tZXNzYWdlVVVJRChkYikpLAorICAgICAgICAgICgoSWRlbnRpZmllZFVzZXIpIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSkuZ2V0QWNjb3VudElkKCksCisgICAgICAgICAgY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworICAgICAgU3RyaW5nQnVpbGRlciBtc2dCdWYgPSBuZXcgU3RyaW5nQnVpbGRlcihzdW1tYXJ5KTsKKyAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGlucHV0Lm1lc3NhZ2UpKSB7CisgICAgICAgIG1zZ0J1Zi5hcHBlbmQoIlxuXG4iKTsKKyAgICAgICAgbXNnQnVmLmFwcGVuZChpbnB1dC5tZXNzYWdlKTsKKyAgICAgIH0KKyAgICAgIGNtc2cuc2V0TWVzc2FnZShtc2dCdWYudG9TdHJpbmcoKSk7CisKKyAgICAgIGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoY2hhbmdlLmdldElkKCksCisgICAgICAgIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7CisgICAgICAgICAgICBjaGFuZ2Uuc2V0VG9waWMoU3RyaW5ncy5lbXB0eVRvTnVsbChuZXdUb3BpY05hbWUpKTsKKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjbXNnKSk7CisgICAgfQorICAgIHJldHVybiBTdHJpbmdzLmlzTnVsbE9yRW1wdHkobmV3VG9waWNOYW1lKQorICAgICAgICA/IFJlc3BvbnNlLm5vbmUoKQorICAgICAgICA6IG5ld1RvcGljTmFtZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmVzdG9yZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmVzdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjU4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXN0b3JlLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2UuU3RhdHVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQXBwcm92YWxzVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXN0b3JlLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlcGx5VG9DaGFuZ2VTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVzdG9yZWRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQXRvbWljVXBkYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworcHVibGljIGNsYXNzIFJlc3RvcmUgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxDaGFuZ2VSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc3RvcmUuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CisgIHByaXZhdGUgZmluYWwgUmVzdG9yZWRTZW5kZXIuRmFjdG9yeSByZXN0b3JlZFNlbmRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXI7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSnNvbiBqc29uOworCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2U7CisgIH0KKworICBASW5qZWN0CisgIFJlc3RvcmUoQ2hhbmdlSG9va3MgaG9va3MsCisgICAgICBSZXN0b3JlZFNlbmRlci5GYWN0b3J5IHJlc3RvcmVkU2VuZGVyRmFjdG9yeSwKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLAorICAgICAgQ2hhbmdlSnNvbiBqc29uKSB7CisgICAgdGhpcy5ob29rcyA9IGhvb2tzOworICAgIHRoaXMucmVzdG9yZWRTZW5kZXJGYWN0b3J5ID0gcmVzdG9yZWRTZW5kZXJGYWN0b3J5OworICAgIHRoaXMuZGJQcm92aWRlciA9IGRiUHJvdmlkZXI7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KENoYW5nZVJlc291cmNlIHJlcSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSByZXEuZ2V0Q29udHJvbCgpOworICAgIElkZW50aWZpZWRVc2VyIGNhbGxlciA9IChJZGVudGlmaWVkVXNlcikgY29udHJvbC5nZXRDdXJyZW50VXNlcigpOworICAgIENoYW5nZSBjaGFuZ2UgPSByZXEuZ2V0Q2hhbmdlKCk7CisgICAgaWYgKCFjb250cm9sLmNhblJlc3RvcmUoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oInJlc3RvcmUgbm90IHBlcm1pdHRlZCIpOworICAgIH0gZWxzZSBpZiAoY2hhbmdlLmdldFN0YXR1cygpICE9IFN0YXR1cy5BQkFORE9ORUQpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJjaGFuZ2UgaXMgIiArIHN0YXR1cyhjaGFuZ2UpKTsKKyAgICB9CisKKyAgICBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2U7CisgICAgUmV2aWV3RGIgZGIgPSBkYlByb3ZpZGVyLmdldCgpOworICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZS5nZXRJZCgpKTsKKyAgICB0cnkgeworICAgICAgY2hhbmdlID0gZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZSgKKyAgICAgICAgY2hhbmdlLmdldElkKCksCisgICAgICAgIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7CisgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuQUJBTkRPTkVEKSB7CisgICAgICAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5ORVcpOworICAgICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyAiCisgICAgICAgICAgICArIHN0YXR1cyhkYi5jaGFuZ2VzKCkuZ2V0KHJlcS5nZXRDaGFuZ2UoKS5nZXRJZCgpKSkpOworICAgICAgfQorICAgICAgbWVzc2FnZSA9IG5ld01lc3NhZ2UoaW5wdXQsIGNhbGxlciwgY2hhbmdlKTsKKyAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtZXNzYWdlKSk7CisgICAgICBuZXcgQXBwcm92YWxzVXRpbChkYikuc3luY0NoYW5nZVN0YXR1cyhjaGFuZ2UpOworICAgICAgZGIuY29tbWl0KCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRiLnJvbGxiYWNrKCk7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIFJlcGx5VG9DaGFuZ2VTZW5kZXIgY20gPSByZXN0b3JlZFNlbmRlckZhY3RvcnkuY3JlYXRlKGNoYW5nZSk7CisgICAgICBjbS5zZXRGcm9tKGNhbGxlci5nZXRBY2NvdW50SWQoKSk7CisgICAgICBjbS5zZXRDaGFuZ2VNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgY20uc2VuZCgpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBlbWFpbCB1cGRhdGUgZm9yIGNoYW5nZSAiICsgY2hhbmdlLmdldENoYW5nZUlkKCksIGUpOworICAgIH0KKyAgICBob29rcy5kb0NoYW5nZVJlc3RvcmVkSG9vayhjaGFuZ2UsCisgICAgICAgIGNhbGxlci5nZXRBY2NvdW50KCksCisgICAgICAgIFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQubWVzc2FnZSksCisgICAgICAgIGRiUHJvdmlkZXIuZ2V0KCkpOworICAgIHJldHVybiBqc29uLmZvcm1hdChjaGFuZ2UpOworICB9CisKKyAgcHJpdmF0ZSBDaGFuZ2VNZXNzYWdlIG5ld01lc3NhZ2UoSW5wdXQgaW5wdXQsIElkZW50aWZpZWRVc2VyIGNhbGxlciwKKyAgICAgIENoYW5nZSBjaGFuZ2UpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIFN0cmluZ0J1aWxkZXIgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBtc2cuYXBwZW5kKCJSZXN0b3JlZCIpOworICAgIGlmICghU3RyaW5ncy5udWxsVG9FbXB0eShpbnB1dC5tZXNzYWdlKS50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICBtc2cuYXBwZW5kKCJcblxuIik7CisgICAgICBtc2cuYXBwZW5kKGlucHV0Lm1lc3NhZ2UudHJpbSgpKTsKKyAgICB9CisKKyAgICBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgQ2hhbmdlTWVzc2FnZSgKKyAgICAgICAgbmV3IENoYW5nZU1lc3NhZ2UuS2V5KAorICAgICAgICAgICAgY2hhbmdlLmdldElkKCksCisgICAgICAgICAgICBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiUHJvdmlkZXIuZ2V0KCkpKSwKKyAgICAgICAgY2FsbGVyLmdldEFjY291bnRJZCgpLAorICAgICAgICBjaGFuZ2UuZ2V0TGFzdFVwZGF0ZWRPbigpLAorICAgICAgICBjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgbWVzc2FnZS5zZXRNZXNzYWdlKG1zZy50b1N0cmluZygpKTsKKyAgICByZXR1cm4gbWVzc2FnZTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0dXMoQ2hhbmdlIGNoYW5nZSkgeworICAgIHJldHVybiBjaGFuZ2UgIT0gbnVsbCA/IGNoYW5nZS5nZXRTdGF0dXMoKS5uYW1lKCkudG9Mb3dlckNhc2UoKSA6ICJkZWxldGVkIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2ZXJ0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZlcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjY4NTMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2ZXJ0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5DaGFuZ2VIb29rczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlLlN0YXR1czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJldmVydC5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQudmFsaWRhdG9ycy5Db21taXRWYWxpZGF0b3JzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJldmVydGVkU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLk5vU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworcHVibGljIGNsYXNzIFJldmVydCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PENoYW5nZVJlc291cmNlLCBJbnB1dD4geworICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOworICBwcml2YXRlIGZpbmFsIFJldmVydGVkU2VuZGVyLkZhY3RvcnkgcmV2ZXJ0ZWRTZW5kZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIENvbW1pdFZhbGlkYXRvcnMuRmFjdG9yeSBjb21taXRWYWxpZGF0b3JzRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VKc29uIGpzb247CisgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlcjsKKyAgcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50OworICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQ7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybDsKKworICBwdWJsaWMgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2U7CisgIH0KKworICBASW5qZWN0CisgIFJldmVydChDaGFuZ2VIb29rcyBob29rcywKKyAgICAgIFJldmVydGVkU2VuZGVyLkZhY3RvcnkgcmV2ZXJ0ZWRTZW5kZXJGYWN0b3J5LAorICAgICAgZmluYWwgQ29tbWl0VmFsaWRhdG9ycy5GYWN0b3J5IGNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5LAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICBDaGFuZ2VKc29uIGpzb24sCisgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLAorICAgICAgQEdlcnJpdFBlcnNvbklkZW50IGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQsCisgICAgICBAQ2Fub25pY2FsV2ViVXJsIEBOdWxsYWJsZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsKSB7CisgICAgdGhpcy5ob29rcyA9IGhvb2tzOworICAgIHRoaXMucmV2ZXJ0ZWRTZW5kZXJGYWN0b3J5ID0gcmV2ZXJ0ZWRTZW5kZXJGYWN0b3J5OworICAgIHRoaXMuY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnkgPSBjb21taXRWYWxpZGF0b3JzRmFjdG9yeTsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMuanNvbiA9IGpzb247CisgICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKKyAgICB0aGlzLm15SWRlbnQgPSBteUlkZW50OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgICB0aGlzLmNhbm9uaWNhbFdlYlVybCA9IGNhbm9uaWNhbFdlYlVybDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KENoYW5nZVJlc291cmNlIHJlcSwgSW5wdXQgaW5wdXQpIHRocm93cyBFeGNlcHRpb24geworICAgIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IHJlcS5nZXRDb250cm9sKCk7CisgICAgQ2hhbmdlIGNoYW5nZSA9IHJlcS5nZXRDaGFuZ2UoKTsKKyAgICBpZiAoIWNvbnRyb2wuY2FuQWRkUGF0Y2hTZXQoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oInJldmVydCBub3QgcGVybWl0dGVkIik7CisgICAgfSBlbHNlIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgIT0gU3RhdHVzLk1FUkdFRCkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyAiICsgc3RhdHVzKGNoYW5nZSkpOworICAgIH0KKworICAgIGZpbmFsIFJlcG9zaXRvcnkgZ2l0ID0gZ2l0TWFuYWdlci5vcGVuUmVwb3NpdG9yeShjb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOworICAgIHRyeSB7CisgICAgICBDb21taXRWYWxpZGF0b3JzIGNvbW1pdFZhbGlkYXRvcnMgPQorICAgICAgICAgIGNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5LmNyZWF0ZShjb250cm9sLmdldFJlZkNvbnRyb2woKSwgbmV3IE5vU3NoSW5mbygpLCBnaXQpOworCisgICAgICBDaGFuZ2UuSWQgcmV2ZXJ0ZWRDaGFuZ2VJZCA9CisgICAgICAgICAgQ2hhbmdlVXRpbC5yZXZlcnQoY29udHJvbC5nZXRSZWZDb250cm9sKCksIGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLAorICAgICAgICAgICAgICAoSWRlbnRpZmllZFVzZXIpIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSwKKyAgICAgICAgICAgICAgY29tbWl0VmFsaWRhdG9ycywKKyAgICAgICAgICAgICAgU3RyaW5ncy5lbXB0eVRvTnVsbChpbnB1dC5tZXNzYWdlKSwgZGJQcm92aWRlci5nZXQoKSwKKyAgICAgICAgICAgICAgcmV2ZXJ0ZWRTZW5kZXJGYWN0b3J5LCBob29rcywgZ2l0LCBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgICAgICAgICBnaXRSZWZVcGRhdGVkLCBteUlkZW50LCBjYW5vbmljYWxXZWJVcmwpOworCisgICAgICByZXR1cm4ganNvbi5mb3JtYXQocmV2ZXJ0ZWRDaGFuZ2VJZCk7CisgICAgfSBjYXRjaCAoSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdGF0dXMoQ2hhbmdlIGNoYW5nZSkgeworICAgIHJldHVybiBjaGFuZ2UgIT0gbnVsbCA/IGNoYW5nZS5nZXRTdGF0dXMoKS5uYW1lKCkudG9Mb3dlckNhc2UoKSA6ICJkZWxldGVkIjsKKyAgIH0KKyB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODk4YmNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZWQuamF2YQpAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQYXRjaFJldmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2NsYXNzIFJldmlld2VkIHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBQdXRSZXZpZXdlZCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFBhdGNoUmVzb3VyY2UsIElucHV0PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKworICAgIEBJbmplY3QKKyAgICBQdXRSZXZpZXdlZChQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcikgeworICAgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KFBhdGNoUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIFJldmlld0RiIGRiID0gZGJQcm92aWRlci5nZXQoKTsKKyAgICAgIEFjY291bnRQYXRjaFJldmlldyBhcHIgPSBnZXRFeGlzdGluZyhkYiwgcmVzb3VyY2UpOworICAgICAgaWYgKGFwciA9PSBudWxsKSB7CisgICAgICAgIGRiLmFjY291bnRQYXRjaFJldmlld3MoKS5pbnNlcnQoCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IEFjY291bnRQYXRjaFJldmlldyhyZXNvdXJjZS5nZXRQYXRjaEtleSgpLAorICAgICAgICAgICAgICAgIHJlc291cmNlLmdldEFjY291bnRJZCgpKSkpOworICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCgiIik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBEZWxldGVSZXZpZXdlZCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFBhdGNoUmVzb3VyY2UsIElucHV0PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKworICAgIEBJbmplY3QKKyAgICBEZWxldGVSZXZpZXdlZChQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcikgeworICAgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KFBhdGNoUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIFJldmlld0RiIGRiID0gZGJQcm92aWRlci5nZXQoKTsKKyAgICAgIEFjY291bnRQYXRjaFJldmlldyBhcHIgPSBnZXRFeGlzdGluZyhkYiwgcmVzb3VyY2UpOworICAgICAgaWYgKGFwciAhPSBudWxsKSB7CisgICAgICAgIGRiLmFjY291bnRQYXRjaFJldmlld3MoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFwcikpOworICAgICAgfQorICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vbmUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBBY2NvdW50UGF0Y2hSZXZpZXcgZ2V0RXhpc3RpbmcoUmV2aWV3RGIgZGIsCisgICAgICBQYXRjaFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50UGF0Y2hSZXZpZXcuS2V5IGtleSA9IG5ldyBBY2NvdW50UGF0Y2hSZXZpZXcuS2V5KAorICAgICAgICByZXNvdXJjZS5nZXRQYXRjaEtleSgpLCByZXNvdXJjZS5nZXRBY2NvdW50SWQoKSk7CisgICAgcmV0dXJuIGRiLmFjY291bnRQYXRjaFJldmlld3MoKS5nZXQoa2V5KTsKKyAgfQorCisgIHByaXZhdGUgUmV2aWV3ZWQoKSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Jldmlld2VySnNvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJKc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0ZDUyNAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Jldmlld2VySnNvbi5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFZhbHVlLmZvcm1hdFZhbHVlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5MYWJlbE5vcm1hbGl6ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZURhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitwdWJsaWMgY2xhc3MgUmV2aWV3ZXJKc29uIHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGI7CisgIHByaXZhdGUgZmluYWwgTGFiZWxOb3JtYWxpemVyIGxhYmVsTm9ybWFsaXplcjsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50SW5mby5Mb2FkZXIuRmFjdG9yeSBhY2NvdW50TG9hZGVyRmFjdG9yeTsKKworICBASW5qZWN0CisgIFJldmlld2VySnNvbihQcm92aWRlcjxSZXZpZXdEYj4gZGIsCisgICAgICBMYWJlbE5vcm1hbGl6ZXIgbGFiZWxOb3JtYWxpemVyLAorICAgICAgQWNjb3VudEluZm8uTG9hZGVyLkZhY3RvcnkgYWNjb3VudExvYWRlckZhY3RvcnkpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5sYWJlbE5vcm1hbGl6ZXIgPSBsYWJlbE5vcm1hbGl6ZXI7CisgICAgdGhpcy5hY2NvdW50TG9hZGVyRmFjdG9yeSA9IGFjY291bnRMb2FkZXJGYWN0b3J5OworICB9CisKKyAgcHVibGljIExpc3Q8UmV2aWV3ZXJJbmZvPiBmb3JtYXQoQ29sbGVjdGlvbjxSZXZpZXdlclJlc291cmNlPiByc3JjcykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIExpc3Q8UmV2aWV3ZXJJbmZvPiBpbmZvcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShyc3Jjcy5zaXplKCkpOworICAgIEFjY291bnRJbmZvLkxvYWRlciBsb2FkZXIgPSBhY2NvdW50TG9hZGVyRmFjdG9yeS5jcmVhdGUodHJ1ZSk7CisgICAgZm9yIChSZXZpZXdlclJlc291cmNlIHJzcmMgOiByc3JjcykgeworICAgICAgUmV2aWV3ZXJJbmZvIGluZm8gPSBmb3JtYXQocnNyYywgbnVsbCk7CisgICAgICBsb2FkZXIucHV0KGluZm8pOworICAgICAgaW5mb3MuYWRkKGluZm8pOworICAgIH0KKyAgICBsb2FkZXIuZmlsbCgpOworICAgIHJldHVybiBpbmZvczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PFJldmlld2VySW5mbz4gZm9ybWF0KFJldmlld2VyUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGZvcm1hdChJbW11dGFibGVMaXN0LjxSZXZpZXdlclJlc291cmNlPiBvZihyc3JjKSk7CisgIH0KKworICBwdWJsaWMgUmV2aWV3ZXJJbmZvIGZvcm1hdChSZXZpZXdlckluZm8gb3V0LCBDaGFuZ2VDb250cm9sIGN0bCwKKyAgICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBQYXRjaFNldC5JZCBwc0lkID0gY3RsLmdldENoYW5nZSgpLmN1cnJlbnRQYXRjaFNldElkKCk7CisKKyAgICBpZiAoYXBwcm92YWxzID09IG51bGwpIHsKKyAgICAgIGFwcHJvdmFscyA9IENoYW5nZURhdGEuc29ydEFwcHJvdmFscyhkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpCisgICAgICAgICAgLmJ5UGF0Y2hTZXRVc2VyKHBzSWQsIG91dC5faWQpKTsKKyAgICB9CisgICAgYXBwcm92YWxzID0gbGFiZWxOb3JtYWxpemVyLm5vcm1hbGl6ZShjdGwsIGFwcHJvdmFscyk7CisgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzID0gY3RsLmdldExhYmVsVHlwZXMoKTsKKworICAgIC8vIERvbid0IHVzZSBNYXBzLm5ld1RyZWVNYXAoQ29tcGFyYXRvcikgZHVlIHRvIE9wZW5KREsgYnVnIDEwMDE2Ny4KKyAgICBvdXQuYXBwcm92YWxzID0gbmV3IFRyZWVNYXA8U3RyaW5nLFN0cmluZz4obGFiZWxUeXBlcy5uYW1lQ29tcGFyYXRvcigpKTsKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgY2EgOiBhcHByb3ZhbHMpIHsKKyAgICAgIGZvciAoUGVybWlzc2lvblJhbmdlIHByIDogY3RsLmdldExhYmVsUmFuZ2VzKCkpIHsKKyAgICAgICAgaWYgKCFwci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBMYWJlbFR5cGUgYXQgPSBsYWJlbFR5cGVzLmJ5TGFiZWwoY2EuZ2V0TGFiZWxJZCgpKTsKKyAgICAgICAgICBpZiAoYXQgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LmFwcHJvdmFscy5wdXQoYXQuZ2V0TmFtZSgpLCBmb3JtYXRWYWx1ZShjYS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gQWRkIGR1bW15IGFwcHJvdmFscyBmb3IgYWxsIHBlcm1pdHRlZCBsYWJlbHMgZm9yIHRoZSB1c2VyIGV2ZW4gaWYgdGhleQorICAgIC8vIGRvIG5vdCBleGlzdCBpbiB0aGUgREIuCisgICAgQ2hhbmdlRGF0YSBjZCA9IG5ldyBDaGFuZ2VEYXRhKGN0bCk7CisgICAgUGF0Y2hTZXQgcHMgPSBjZC5jdXJyZW50UGF0Y2hTZXQoZGIpOworICAgIGlmIChwcyAhPSBudWxsKSB7CisgICAgICBmb3IgKFN1Ym1pdFJlY29yZCByZWMgOgorICAgICAgICAgIGN0bC5jYW5TdWJtaXQoZGIuZ2V0KCksIHBzLCBjZCwgdHJ1ZSwgZmFsc2UsIHRydWUpKSB7CisgICAgICAgIGlmIChyZWMubGFiZWxzID09IG51bGwpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN1Ym1pdFJlY29yZC5MYWJlbCBsYWJlbCA6IHJlYy5sYWJlbHMpIHsKKyAgICAgICAgICBTdHJpbmcgbmFtZSA9IGxhYmVsLmxhYmVsOworICAgICAgICAgIGlmICghb3V0LmFwcHJvdmFscy5jb250YWluc0tleShuYW1lKQorICAgICAgICAgICAgICAmJiAhY3RsLmdldFJhbmdlKFBlcm1pc3Npb24uZm9yTGFiZWwobmFtZSkpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgb3V0LmFwcHJvdmFscy5wdXQobmFtZSwgZm9ybWF0VmFsdWUoKHNob3J0KSAwKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dC5hcHByb3ZhbHMuaXNFbXB0eSgpKSB7CisgICAgICBvdXQuYXBwcm92YWxzID0gbnVsbDsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0OworICB9CisKKyAgcHJpdmF0ZSBSZXZpZXdlckluZm8gZm9ybWF0KFJldmlld2VyUmVzb3VyY2UgcnNyYywKKyAgICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZm9ybWF0KG5ldyBSZXZpZXdlckluZm8ocnNyYy5nZXRVc2VyKCkuZ2V0QWNjb3VudElkKCkpLAorICAgICAgICByc3JjLmdldFVzZXJDb250cm9sKCksIGFwcHJvdmFscyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFJldmlld2VySW5mbyBleHRlbmRzIEFjY291bnRJbmZvIHsKKyAgICBmaW5hbCBTdHJpbmcga2luZCA9ICJnZXJyaXRjb2RlcmV2aWV3I3Jldmlld2VyIjsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFwcHJvdmFsczsKKworICAgIHByb3RlY3RlZCBSZXZpZXdlckluZm8oQWNjb3VudC5JZCBpZCkgeworICAgICAgc3VwZXIoaWQpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zdFJlc3VsdCB7CisgICAgcHVibGljIExpc3Q8UmV2aWV3ZXJJbmZvPiByZXZpZXdlcnM7CisgICAgcHVibGljIFN0cmluZyBlcnJvcjsKKyAgICBCb29sZWFuIGNvbmZpcm07CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Jldmlld2VyUmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Jldmlld2VyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2I1MjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkSW5qZWN0OworCitwdWJsaWMgY2xhc3MgUmV2aWV3ZXJSZXNvdXJjZSBleHRlbmRzIENoYW5nZVJlc291cmNlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlTGl0ZXJhbDxSZXN0VmlldzxSZXZpZXdlclJlc291cmNlPj4gUkVWSUVXRVJfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8UmV2aWV3ZXJSZXNvdXJjZT4+KCkge307CisKKyAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgUmV2aWV3ZXJSZXNvdXJjZSBjcmVhdGUoQ2hhbmdlUmVzb3VyY2UgcnNyYywgSWRlbnRpZmllZFVzZXIgdXNlcik7CisgICAgUmV2aWV3ZXJSZXNvdXJjZSBjcmVhdGUoQ2hhbmdlUmVzb3VyY2UgcnNyYywgQWNjb3VudC5JZCBpZCk7CisgIH0KKworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXI7CisKKyAgQEFzc2lzdGVkSW5qZWN0CisgIFJldmlld2VyUmVzb3VyY2UoQEFzc2lzdGVkIENoYW5nZVJlc291cmNlIHJzcmMsCisgICAgICBAQXNzaXN0ZWQgSWRlbnRpZmllZFVzZXIgdXNlcikgeworICAgIHN1cGVyKHJzcmMpOworICAgIHRoaXMudXNlciA9IHVzZXI7CisgIH0KKworICBAQXNzaXN0ZWRJbmplY3QKKyAgUmV2aWV3ZXJSZXNvdXJjZShJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKKyAgICAgIEBBc3Npc3RlZCBDaGFuZ2VSZXNvdXJjZSByc3JjLAorICAgICAgQEFzc2lzdGVkIEFjY291bnQuSWQgaWQpIHsKKyAgICB0aGlzKHJzcmMsIHVzZXJGYWN0b3J5LmNyZWF0ZShpZCkpOworICB9CisKKyAgcHVibGljIElkZW50aWZpZWRVc2VyIGdldFVzZXIoKSB7CisgICAgcmV0dXJuIHVzZXI7CisgIH0KKworICAvKioKKyAgICogQHJldHVybiB0aGUgY29udHJvbCBmb3IgdGhlIHJldmlld2VyJ3MgdXNlciAoYXMgb3Bwb3NlZCB0byB0aGUgY2FsbGVyJ3MKKyAgICogICAgIHVzZXIgYXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRDb250cm9sKCl9KS4KKyAgICovCisgIHB1YmxpYyBDaGFuZ2VDb250cm9sIGdldFVzZXJDb250cm9sKCkgeworICAgIHJldHVybiBnZXRDb250cm9sKCkuZm9yVXNlcih1c2VyKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9SZXZpZXdlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjllMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aWV3ZXJzLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQ2hpbGRDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRzQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBSZXZpZXdlcnMgaW1wbGVtZW50cworICAgIENoaWxkQ29sbGVjdGlvbjxDaGFuZ2VSZXNvdXJjZSwgUmV2aWV3ZXJSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8UmV2aWV3ZXJSZXNvdXJjZT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIEFjY291bnRzQ29sbGVjdGlvbiBhY2NvdW50czsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdlclJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3RSZXZpZXdlcnM+IGxpc3Q7CisKKyAgQEluamVjdAorICBSZXZpZXdlcnMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICBBY2NvdW50c0NvbGxlY3Rpb24gYWNjb3VudHMsCisgICAgICBSZXZpZXdlclJlc291cmNlLkZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5LAorICAgICAgRHluYW1pY01hcDxSZXN0VmlldzxSZXZpZXdlclJlc291cmNlPj4gdmlld3MsCisgICAgICBQcm92aWRlcjxMaXN0UmV2aWV3ZXJzPiBsaXN0KSB7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICB0aGlzLmFjY291bnRzID0gYWNjb3VudHM7CisgICAgdGhpcy5yZXNvdXJjZUZhY3RvcnkgPSByZXNvdXJjZUZhY3Rvcnk7CisgICAgdGhpcy52aWV3cyA9IHZpZXdzOworICAgIHRoaXMubGlzdCA9IGxpc3Q7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8UmV2aWV3ZXJSZXNvdXJjZT4+IHZpZXdzKCkgeworICAgIHJldHVybiB2aWV3czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVzdFZpZXc8Q2hhbmdlUmVzb3VyY2U+IGxpc3QoKSB7CisgICAgcmV0dXJuIGxpc3QuZ2V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJldmlld2VyUmVzb3VyY2UgcGFyc2UoQ2hhbmdlUmVzb3VyY2UgcnNyYywgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50LklkIGFjY291bnRJZCA9CisgICAgICAgIGFjY291bnRzLnBhcnNlKFRvcExldmVsUmVzb3VyY2UuSU5TVEFOQ0UsIGlkKS5nZXRVc2VyKCkuZ2V0QWNjb3VudElkKCk7CisKKyAgICAvLyBTZWUgaWYgdGhlIGlkIGV4aXN0cyBhcyBhIHJldmlld2VyIGZvciB0aGlzIGNoYW5nZQorICAgIGlmIChmZXRjaEFjY291bnRJZHMocnNyYykuY29udGFpbnMoYWNjb3VudElkKSkgeworICAgICAgcmV0dXJuIHJlc291cmNlRmFjdG9yeS5jcmVhdGUocnNyYywgYWNjb3VudElkKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICB9CisKKyAgcHJpdmF0ZSBTZXQ8QWNjb3VudC5JZD4gZmV0Y2hBY2NvdW50SWRzKENoYW5nZVJlc291cmNlIHJzcmMpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBTZXQ8QWNjb3VudC5JZD4gYWNjb3VudElkcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhCisgICAgICAgICA6IGRiUHJvdmlkZXIuZ2V0KCkucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShyc3JjLmdldENoYW5nZSgpLmdldElkKCkpKSB7CisgICAgICBhY2NvdW50SWRzLmFkZChhLmdldEFjY291bnRJZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIGFjY291bnRJZHM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1JldmlzaW9uUmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1JldmlzaW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ5ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aXNpb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuVHlwZUxpdGVyYWw7CisKK3B1YmxpYyBjbGFzcyBSZXZpc2lvblJlc291cmNlIGltcGxlbWVudHMgUmVzdFJlc291cmNlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlTGl0ZXJhbDxSZXN0VmlldzxSZXZpc2lvblJlc291cmNlPj4gUkVWSVNJT05fS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8UmV2aXNpb25SZXNvdXJjZT4+KCkge307CisKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VSZXNvdXJjZSBjaGFuZ2U7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQgcHM7CisKKyAgcHVibGljIFJldmlzaW9uUmVzb3VyY2UoQ2hhbmdlUmVzb3VyY2UgY2hhbmdlLCBQYXRjaFNldCBwcykgeworICAgIHRoaXMuY2hhbmdlID0gY2hhbmdlOworICAgIHRoaXMucHMgPSBwczsKKyAgfQorCisgIHB1YmxpYyBDaGFuZ2VDb250cm9sIGdldENvbnRyb2woKSB7CisgICAgcmV0dXJuIGNoYW5nZS5nZXRDb250cm9sKCk7CisgIH0KKworICBwdWJsaWMgQ2hhbmdlIGdldENoYW5nZSgpIHsKKyAgICByZXR1cm4gZ2V0Q29udHJvbCgpLmdldENoYW5nZSgpOworICB9CisKKyAgcHVibGljIFBhdGNoU2V0IGdldFBhdGNoU2V0KCkgeworICAgIHJldHVybiBwczsKKyAgfQorCisgIEFjY291bnQuSWQgZ2V0QWNjb3VudElkKCkgeworICAgIHJldHVybiAoKElkZW50aWZpZWRVc2VyKSBnZXRDb250cm9sKCkuZ2V0Q3VycmVudFVzZXIoKSkuZ2V0QWNjb3VudElkKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1JldmlzaW9ucy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvUmV2aXNpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlZjYzYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1JldmlzaW9ucy5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQ2hpbGRDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlJldklkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFJldmlzaW9ucyBpbXBsZW1lbnRzIENoaWxkQ29sbGVjdGlvbjxDaGFuZ2VSZXNvdXJjZSwgUmV2aXNpb25SZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8UmV2aXNpb25SZXNvdXJjZT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworCisgIEBJbmplY3QKKyAgUmV2aXNpb25zKER5bmFtaWNNYXA8UmVzdFZpZXc8UmV2aXNpb25SZXNvdXJjZT4+IHZpZXdzLAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIpIHsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxSZXZpc2lvblJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxDaGFuZ2VSZXNvdXJjZT4gbGlzdCgpIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXZpc2lvblJlc291cmNlIHBhcnNlKENoYW5nZVJlc291cmNlIGNoYW5nZSwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoaWQuZXF1YWxzKCJjdXJyZW50IikpIHsKKyAgICAgIFBhdGNoU2V0LklkIHAgPSBjaGFuZ2UuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKTsKKyAgICAgIFBhdGNoU2V0IHBzID0gcCAhPSBudWxsID8gZGJQcm92aWRlci5nZXQoKS5wYXRjaFNldHMoKS5nZXQocCkgOiBudWxsOworICAgICAgaWYgKHBzICE9IG51bGwgJiYgdmlzaWJsZShjaGFuZ2UsIHBzKSkgeworICAgICAgICByZXR1cm4gbmV3IFJldmlzaW9uUmVzb3VyY2UoY2hhbmdlLCBwcyk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorICAgIExpc3Q8UGF0Y2hTZXQ+IG1hdGNoID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgyKTsKKyAgICBmb3IgKFBhdGNoU2V0IHBzIDogZmluZChjaGFuZ2UsIGlkLmdldCgpKSkgeworICAgICAgQ2hhbmdlLklkIGNoYW5nZUlkID0gcHMuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKTsKKyAgICAgIGlmIChjaGFuZ2VJZC5lcXVhbHMoY2hhbmdlLmdldENoYW5nZSgpLmdldElkKCkpICYmIHZpc2libGUoY2hhbmdlLCBwcykpIHsKKyAgICAgICAgbWF0Y2guYWRkKHBzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1hdGNoLnNpemUoKSAhPSAxKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgUmV2aXNpb25SZXNvdXJjZShjaGFuZ2UsIG1hdGNoLmdldCgwKSk7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gdmlzaWJsZShDaGFuZ2VSZXNvdXJjZSBjaGFuZ2UsIFBhdGNoU2V0IHBzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGNoYW5nZS5nZXRDb250cm9sKCkuaXNQYXRjaFZpc2libGUocHMsIGRiUHJvdmlkZXIuZ2V0KCkpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PFBhdGNoU2V0PiBmaW5kKENoYW5nZVJlc291cmNlIGNoYW5nZSwgU3RyaW5nIGlkKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgUmV2aWV3RGIgZGIgPSBkYlByb3ZpZGVyLmdldCgpOworCisgICAgaWYgKGlkLmxlbmd0aCgpIDwgNiAmJiBpZC5tYXRjaGVzKCJeWzEtOV1bMC05XXswLDR9JCIpKSB7CisgICAgICAvLyBMZWdhY3kgcGF0Y2ggc2V0IG51bWJlciBzeW50YXguCisgICAgICBQYXRjaFNldCBwcyA9IGRiUHJvdmlkZXIuZ2V0KCkucGF0Y2hTZXRzKCkuZ2V0KG5ldyBQYXRjaFNldC5JZCgKKyAgICAgICAgICBjaGFuZ2UuZ2V0Q2hhbmdlKCkuZ2V0SWQoKSwKKyAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KGlkKSkpOworICAgICAgaWYgKHBzICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHMpOworICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0gZWxzZSBpZiAoaWQubGVuZ3RoKCkgPCA0IHx8IGlkLmxlbmd0aCgpID4gUmV2SWQuTEVOKSB7CisgICAgICAvLyBSZXF1aXJlIGEgbWluaW11bSBvZiA0IGRpZ2l0cy4KKyAgICAgIC8vIEltcG9zc2libHkgbG9uZyBpZGVudGlmaWVyIHdpbGwgbmV2ZXIgbWF0Y2guCisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfSBlbHNlIGlmIChpZC5sZW5ndGgoKSA+PSA4KSB7CisgICAgICAvLyBDb21taXQgbmFtZXMgYXJlIHJhdGhlciB1bmlxdWUuIFF1ZXJ5IGZvciB0aGUgY29tbWl0IGFuZCBsYXRlcgorICAgICAgLy8gbWF0Y2ggdG8gdGhlIGNoYW5nZS4gVGhpcyBpcyBtb3N0IGxpa2VseSBnb2luZyB0byBpZGVudGlmeSAxIG9yCisgICAgICAvLyBhdCBtb3N0IDIgcGF0Y2ggc2V0cyB0byBjb25zaWRlciwgd2hpY2ggaXMgc21hbGxlciB0aGFuIGxvb2tpbmcKKyAgICAgIC8vIGZvciBhbGwgcGF0Y2ggc2V0cyBpbiB0aGUgY2hhbmdlLgorICAgICAgUmV2SWQgcmV2aWQgPSBuZXcgUmV2SWQoaWQpOworICAgICAgaWYgKHJldmlkLmlzQ29tcGxldGUoKSkgeworICAgICAgICByZXR1cm4gZGIucGF0Y2hTZXRzKCkuYnlSZXZpc2lvbihyZXZpZCkudG9MaXN0KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZGIucGF0Y2hTZXRzKCkuYnlSZXZpc2lvblJhbmdlKHJldmlkLCByZXZpZC5tYXgoKSkudG9MaXN0KCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIENoYW5jZSBvZiBjb2xsaXNpb24gcmlzZXM7IGxvb2sgYXQgYWxsIHBhdGNoIHNldHMgb24gdGhlIGNoYW5nZS4KKyAgICAgIExpc3Q8UGF0Y2hTZXQ+IG91dCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yIChQYXRjaFNldCBwcyA6IGRiLnBhdGNoU2V0cygpLmJ5Q2hhbmdlKGNoYW5nZS5nZXRDaGFuZ2UoKS5nZXRJZCgpKSkgeworICAgICAgICBpZiAocHMuZ2V0UmV2aXNpb24oKSAhPSBudWxsICYmIHBzLmdldFJldmlzaW9uKCkuZ2V0KCkuc3RhcnRzV2l0aChpZCkpIHsKKyAgICAgICAgICBvdXQuYWRkKHBzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1N1Ym1pdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvU3VibWl0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYzYmY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1N1Ym1pdC5qYXZhCkBAIC0wLDAgKzEsMzE4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQuU3RhdHVzLk9LOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PcHRpb25hbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWwuTGFiZWxJZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5Qcm9qZWN0VXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlN1Ym1pdC5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWVyZ2VRdWV1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTdWJtaXQgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxSZXZpc2lvblJlc291cmNlLCBJbnB1dD4geworICBwdWJsaWMgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBwdWJsaWMgYm9vbGVhbiB3YWl0Rm9yTWVyZ2U7CisgIH0KKworICBwdWJsaWMgZW51bSBTdGF0dXMgeworICAgIFNVQk1JVFRFRCwgTUVSR0VEOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBPdXRwdXQgeworICAgIHB1YmxpYyBTdGF0dXMgc3RhdHVzOworICAgIHRyYW5zaWVudCBDaGFuZ2UgY2hhbmdlOworCisgICAgcHJpdmF0ZSBPdXRwdXQoU3RhdHVzIHMsIENoYW5nZSBjKSB7CisgICAgICBzdGF0dXMgPSBzOworICAgICAgY2hhbmdlID0gYzsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOworICBwcml2YXRlIGZpbmFsIE1lcmdlUXVldWUgbWVyZ2VRdWV1ZTsKKworICBASW5qZWN0CisgIFN1Ym1pdChQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAorICAgICAgTWVyZ2VRdWV1ZSBtZXJnZVF1ZXVlKSB7CisgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CisgICAgdGhpcy5tZXJnZVF1ZXVlID0gbWVyZ2VRdWV1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT3V0cHV0IGFwcGx5KFJldmlzaW9uUmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlQ29udHJvbCBjb250cm9sID0gcnNyYy5nZXRDb250cm9sKCk7CisgICAgSWRlbnRpZmllZFVzZXIgY2FsbGVyID0gKElkZW50aWZpZWRVc2VyKSBjb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CisgICAgQ2hhbmdlIGNoYW5nZSA9IHJzcmMuZ2V0Q2hhbmdlKCk7CisgICAgaWYgKCFjb250cm9sLmNhblN1Ym1pdCgpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigic3VibWl0IG5vdCBwZXJtaXR0ZWQiKTsKKyAgICB9IGVsc2UgaWYgKCFjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJjaGFuZ2UgaXMgIiArIHN0YXR1cyhjaGFuZ2UpKTsKKyAgICB9IGVsc2UgaWYgKCFQcm9qZWN0VXRpbC5icmFuY2hFeGlzdHMocmVwb01hbmFnZXIsIGNoYW5nZS5nZXREZXN0KCkpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJkZXN0aW5hdGlvbiBicmFuY2ggXCIlc1wiIG5vdCBmb3VuZC4iLAorICAgICAgICAgIGNoYW5nZS5nZXREZXN0KCkuZ2V0KCkpKTsKKyAgICB9IGVsc2UgaWYgKCFyc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKS5lcXVhbHMoY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpKSB7CisgICAgICAvLyBUT0RPIEFsbG93IHN1Ym1pdHRpbmcgbm9uLWN1cnJlbnQgcmV2aXNpb24gYnkgY2hhbmdpbmcgdGhlIGN1cnJlbnQuCisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJyZXZpc2lvbiAlcyBpcyBub3QgY3VycmVudCByZXZpc2lvbiIsCisgICAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLmdldFJldmlzaW9uKCkuZ2V0KCkpKTsKKyAgICB9CisKKyAgICBjaGVja1N1Ym1pdFJ1bGUocnNyYyk7CisgICAgY2hhbmdlID0gc3VibWl0KHJzcmMsIGNhbGxlcik7CisKKyAgICBpZiAoaW5wdXQud2FpdEZvck1lcmdlKSB7CisgICAgICBtZXJnZVF1ZXVlLm1lcmdlKGNoYW5nZS5nZXREZXN0KCkpOworICAgICAgY2hhbmdlID0gZGJQcm92aWRlci5nZXQoKS5jaGFuZ2VzKCkuZ2V0KGNoYW5nZS5nZXRJZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVyZ2VRdWV1ZS5zY2hlZHVsZShjaGFuZ2UuZ2V0RGVzdCgpKTsKKyAgICB9CisKKyAgICBpZiAoY2hhbmdlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJjaGFuZ2UgaXMgZGVsZXRlZCIpOworICAgIH0KKyAgICBzd2l0Y2ggKGNoYW5nZS5nZXRTdGF0dXMoKSkgeworICAgICAgY2FzZSBTVUJNSVRURUQ6CisgICAgICAgIHJldHVybiBuZXcgT3V0cHV0KFN0YXR1cy5TVUJNSVRURUQsIGNoYW5nZSk7CisgICAgICBjYXNlIE1FUkdFRDoKKyAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXQoU3RhdHVzLk1FUkdFRCwgY2hhbmdlKTsKKyAgICAgIGNhc2UgTkVXOgorICAgICAgICAvLyBJZiB0aGUgbWVyZ2Ugd2FzIGF0dGVtcHRlZCBhbmQgaXQgZmFpbGVkIHRoZSBzeXN0ZW0gdXN1YWxseQorICAgICAgICAvLyB3cml0ZXMgYSBjb21tZW50IGFzIGEgQ2hhbmdlTWVzc2FnZSBhbmQgc2V0cyBzdGF0dXMgdG8gTkVXLgorICAgICAgICAvLyBGaW5kIHRoZSByZWxldmFudCBtZXNzYWdlIGFuZCByZXBvcnQgdGhhdCBhcyB0aGUgY29uZmxpY3QuCisgICAgICAgIGZpbmFsIFRpbWVzdGFtcCBiZWZvcmUgPSByc3JjLmdldENoYW5nZSgpLmdldExhc3RVcGRhdGVkT24oKTsKKyAgICAgICAgQ2hhbmdlTWVzc2FnZSBtc2cgPSBJdGVyYWJsZXMuZ2V0Rmlyc3QoSXRlcmFibGVzLmZpbHRlcigKKyAgICAgICAgICBMaXN0cy5yZXZlcnNlKGRiUHJvdmlkZXIuZ2V0KCkuY2hhbmdlTWVzc2FnZXMoKQorICAgICAgICAgICAgICAuYnlDaGFuZ2UoY2hhbmdlLmdldElkKCkpCisgICAgICAgICAgICAgIC50b0xpc3QoKSksCisgICAgICAgICAgbmV3IFByZWRpY2F0ZTxDaGFuZ2VNZXNzYWdlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoQ2hhbmdlTWVzc2FnZSBpbnB1dCkgeworICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuZ2V0QXV0aG9yKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgJiYgaW5wdXQuZ2V0V3JpdHRlbk9uKCkuZ2V0VGltZSgpID49IGJlZm9yZS5nZXRUaW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSksIG51bGwpOworICAgICAgICBpZiAobXNnICE9IG51bGwpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihtc2cuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oImNoYW5nZSBpcyAiICsgc3RhdHVzKGNoYW5nZSkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgQ2hhbmdlIHN1Ym1pdChSZXZpc2lvblJlc291cmNlIHJzcmMsIElkZW50aWZpZWRVc2VyIGNhbGxlcikKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24geworICAgIGZpbmFsIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBuZXcgVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICBDaGFuZ2UgY2hhbmdlID0gcnNyYy5nZXRDaGFuZ2UoKTsKKyAgICBSZXZpZXdEYiBkYiA9IGRiUHJvdmlkZXIuZ2V0KCk7CisgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oY2hhbmdlLmdldElkKCkpOworICAgIHRyeSB7CisgICAgICBhcHByb3ZlKHJzcmMuZ2V0UGF0Y2hTZXQoKSwgY2FsbGVyLCB0aW1lc3RhbXApOworICAgICAgY2hhbmdlID0gZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZSgKKyAgICAgICAgY2hhbmdlLmdldElkKCksCisgICAgICAgIG5ldyBBdG9taWNVcGRhdGU8Q2hhbmdlPigpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7CisgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5TVUJNSVRURUQpOworICAgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFVwZGF0ZWRPbih0aW1lc3RhbXApOworICAgICAgICAgICAgICBDaGFuZ2VVdGlsLmNvbXB1dGVTb3J0S2V5KGNoYW5nZSk7CisgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgaWYgKGNoYW5nZSA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJjaGFuZ2UgaXMgIgorICAgICAgICAgICAgKyBzdGF0dXMoZGIuY2hhbmdlcygpLmdldChyc3JjLmdldENoYW5nZSgpLmdldElkKCkpKSk7CisgICAgICB9CisgICAgICBkYi5jb21taXQoKTsKKyAgICB9IGZpbmFsbHkgeworICAgICAgZGIucm9sbGJhY2soKTsKKyAgICB9CisgICAgcmV0dXJuIGNoYW5nZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhcHByb3ZlKFBhdGNoU2V0IHJldiwgSWRlbnRpZmllZFVzZXIgY2FsbGVyLCBUaW1lc3RhbXAgdGltZXN0YW1wKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXQgPSBJdGVyYWJsZXMuZ2V0Rmlyc3QoSXRlcmFibGVzLmZpbHRlcigKKyAgICAgIGRiUHJvdmlkZXIuZ2V0KCkucGF0Y2hTZXRBcHByb3ZhbHMoKQorICAgICAgICAuYnlQYXRjaFNldFVzZXIocmV2LmdldElkKCksIGNhbGxlci5nZXRBY2NvdW50SWQoKSksCisgICAgICBuZXcgUHJlZGljYXRlPFBhdGNoU2V0QXBwcm92YWw+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoUGF0Y2hTZXRBcHByb3ZhbCBpbnB1dCkgeworICAgICAgICAgIHJldHVybiBpbnB1dC5pc1N1Ym1pdCgpOworICAgICAgICB9CisgICAgICB9KSwgbnVsbCk7CisgICAgaWYgKHN1Ym1pdCA9PSBudWxsKSB7CisgICAgICBzdWJtaXQgPSBuZXcgUGF0Y2hTZXRBcHByb3ZhbCgKKyAgICAgICAgICBuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkoCisgICAgICAgICAgICAgIHJldi5nZXRJZCgpLAorICAgICAgICAgICAgICBjYWxsZXIuZ2V0QWNjb3VudElkKCksCisgICAgICAgICAgICAgIExhYmVsSWQuU1VCTUlUKSwKKyAgICAgICAgICAoc2hvcnQpIDEpOworICAgIH0KKyAgICBzdWJtaXQuc2V0VmFsdWUoKHNob3J0KSAxKTsKKyAgICBzdWJtaXQuc2V0R3JhbnRlZCh0aW1lc3RhbXApOworICAgIGRiUHJvdmlkZXIuZ2V0KCkucGF0Y2hTZXRBcHByb3ZhbHMoKS51cHNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHN1Ym1pdCkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNoZWNrU3VibWl0UnVsZShSZXZpc2lvblJlc291cmNlIHJzcmMpCisgICAgICB0aHJvd3MgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiB7CisgIExpc3Q8U3VibWl0UmVjb3JkPiByZXN1bHRzID0gcnNyYy5nZXRDb250cm9sKCkuY2FuU3VibWl0KAorICAgICAgICBkYlByb3ZpZGVyLmdldCgpLAorICAgICAgICByc3JjLmdldFBhdGNoU2V0KCkpOworICAgIE9wdGlvbmFsPFN1Ym1pdFJlY29yZD4gb2sgPSBmaW5kT2tSZWNvcmQocmVzdWx0cyk7CisgICAgaWYgKG9rLmlzUHJlc2VudCgpKSB7CisgICAgICAvLyBSdWxlcyBzdXBwbGllZCBhIHZhbGlkIHNvbHV0aW9uLgorICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocmVzdWx0cy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiQ2hhbmdlQ29udHJvbC5jYW5TdWJtaXQgcmV0dXJuZWQgZW1wdHkgbGlzdCBmb3IgJXMgaW4gJXMiLAorICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgIHJzcmMuZ2V0Q2hhbmdlKCkuZ2V0UHJvamVjdCgpLmdldCgpKSk7CisgICAgfQorCisgICAgZm9yIChTdWJtaXRSZWNvcmQgcmVjb3JkIDogcmVzdWx0cykgeworICAgICAgc3dpdGNoIChyZWNvcmQuc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ0xPU0VEOgorICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJjaGFuZ2UgaXMgY2xvc2VkIik7CisKKyAgICAgICAgY2FzZSBSVUxFX0VSUk9SOgorICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJydWxlIGVycm9yOiAlcyIsCisgICAgICAgICAgICAgIHJlY29yZC5lcnJvck1lc3NhZ2UpKTsKKworICAgICAgICBjYXNlIE5PVF9SRUFEWToKKyAgICAgICAgICBTdHJpbmdCdWlsZGVyIG1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgZm9yIChTdWJtaXRSZWNvcmQuTGFiZWwgbGJsIDogcmVjb3JkLmxhYmVscykgeworICAgICAgICAgICAgc3dpdGNoIChsYmwuc3RhdHVzKSB7CisgICAgICAgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAgIGNhc2UgTUFZOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgIGNhc2UgUkVKRUNUOgorICAgICAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoKCkgPiAwKSBtc2cuYXBwZW5kKCI7ICIpOworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoImJsb2NrZWQgYnkgIiArIGxibC5sYWJlbCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgY2FzZSBORUVEOgorICAgICAgICAgICAgICAgIGlmIChtc2cubGVuZ3RoKCkgPiAwKSBtc2cuYXBwZW5kKCI7ICIpOworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIm5lZWRzICIgKyBsYmwubGFiZWwpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgIGNhc2UgSU1QT1NTSUJMRToKKyAgICAgICAgICAgICAgICBpZiAobXNnLmxlbmd0aCgpID4gMCkgbXNnLmFwcGVuZCgiOyAiKTsKKyAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCJuZWVkcyAiICsgbGJsLmxhYmVsICsgIiAoY2hlY2sgcHJvamVjdCBhY2Nlc3MpIik7CisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBTdWJtaXRSZWNvcmQuTGFiZWwgJXMgZm9yICVzIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbGJsLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIHJzcmMuZ2V0UGF0Y2hTZXQoKS5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICByc3JjLmdldENoYW5nZSgpLmdldFByb2plY3QoKS5nZXQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihtc2cudG9TdHJpbmcoKSk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBTdWJtaXRSZWNvcmQgJXMgZm9yICVzIGluICVzIiwKKyAgICAgICAgICAgICAgcmVjb3JkLAorICAgICAgICAgICAgICByc3JjLmdldFBhdGNoU2V0KCkuZ2V0SWQoKSwKKyAgICAgICAgICAgICAgcnNyYy5nZXRDaGFuZ2UoKS5nZXRQcm9qZWN0KCkuZ2V0KCkpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBPcHRpb25hbDxTdWJtaXRSZWNvcmQ+IGZpbmRPa1JlY29yZChDb2xsZWN0aW9uPFN1Ym1pdFJlY29yZD4gaW4pIHsKKyAgICByZXR1cm4gSXRlcmFibGVzLnRyeUZpbmQoaW4sIG5ldyBQcmVkaWNhdGU8U3VibWl0UmVjb3JkPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGJvb2xlYW4gYXBwbHkoU3VibWl0UmVjb3JkIGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5zdGF0dXMgPT0gT0s7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RhdHVzKENoYW5nZSBjaGFuZ2UpIHsKKyAgICByZXR1cm4gY2hhbmdlICE9IG51bGwgPyBjaGFuZ2UuZ2V0U3RhdHVzKCkubmFtZSgpLnRvTG93ZXJDYXNlKCkgOiAiZGVsZXRlZCI7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1cnJlbnRSZXZpc2lvbiBpbXBsZW1lbnRzCisgICAgICBSZXN0TW9kaWZ5VmlldzxDaGFuZ2VSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOworICAgIHByaXZhdGUgZmluYWwgU3VibWl0IHN1Ym1pdDsKKyAgICBwcml2YXRlIGZpbmFsIENoYW5nZUpzb24ganNvbjsKKworICAgIEBJbmplY3QKKyAgICBDdXJyZW50UmV2aXNpb24oUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsCisgICAgICAgIFN1Ym1pdCBzdWJtaXQsCisgICAgICAgIENoYW5nZUpzb24ganNvbikgeworICAgICAgdGhpcy5kYlByb3ZpZGVyID0gZGJQcm92aWRlcjsKKyAgICAgIHRoaXMuc3VibWl0ID0gc3VibWl0OworICAgICAgdGhpcy5qc29uID0ganNvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENoYW5nZVJlc291cmNlIHJzcmMsIElucHV0IGlucHV0KSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgICAgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgT3JtRXhjZXB0aW9uIHsKKyAgICAgIFBhdGNoU2V0IHBzID0gZGJQcm92aWRlci5nZXQoKS5wYXRjaFNldHMoKQorICAgICAgICAuZ2V0KHJzcmMuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgICBpZiAocHMgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbigiY3VycmVudCByZXZpc2lvbiBpcyBtaXNzaW5nIik7CisgICAgICB9IGVsc2UgaWYgKCFyc3JjLmdldENvbnRyb2woKS5pc1BhdGNoVmlzaWJsZShwcywgZGJQcm92aWRlci5nZXQoKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oImN1cnJlbnQgcmV2aXNpb24gbm90IGFjY2Vzc2libGUiKTsKKyAgICAgIH0KKyAgICAgIE91dHB1dCBvdXQgPSBzdWJtaXQuYXBwbHkobmV3IFJldmlzaW9uUmVzb3VyY2UocnNyYywgcHMpLCBpbnB1dCk7CisgICAgICByZXR1cm4ganNvbi5mb3JtYXQob3V0LmNoYW5nZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9UZXN0U3VibWl0UnVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvVGVzdFN1Ym1pdFJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE4ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvVGVzdFN1Ym1pdFJ1bGUuamF2YQpAQCAtMCwwICsxLDE5OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlJ1bGVzQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5UZXN0U3VibWl0UnVsZS5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5SdWxlRXZhbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TdWJtaXRSdWxlRXZhbHVhdG9yOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVGVybTsKKworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUZXN0U3VibWl0UnVsZSBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFJldmlzaW9uUmVzb3VyY2UsIElucHV0PiB7CisgIHB1YmxpYyBlbnVtIEZpbHRlcnMgeworICAgIFJVTiwgU0tJUDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBwdWJsaWMgU3RyaW5nIHJ1bGU7CisgICAgcHVibGljIEZpbHRlcnMgZmlsdGVyczsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgZmluYWwgUnVsZXNDYWNoZSBydWxlczsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50SW5mby5Mb2FkZXIuRmFjdG9yeSBhY2NvdW50SW5mb0ZhY3Rvcnk7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tZmlsdGVycyIsIHVzYWdlID0gImltcGFjdCBvZiBmaWx0ZXJzIGluIHBhcmVudCBwcm9qZWN0cyIpCisgIHByaXZhdGUgRmlsdGVycyBmaWx0ZXJzID0gRmlsdGVycy5SVU47CisKKyAgQEluamVjdAorICBUZXN0U3VibWl0UnVsZShSZXZpZXdEYiBkYiwgUnVsZXNDYWNoZSBydWxlcywKKyAgICAgIEFjY291bnRJbmZvLkxvYWRlci5GYWN0b3J5IGluZm9GYWN0b3J5KSB7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMucnVsZXMgPSBydWxlczsKKyAgICB0aGlzLmFjY291bnRJbmZvRmFjdG9yeSA9IGluZm9GYWN0b3J5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByc3JjLCBJbnB1dCBpbnB1dCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKKyAgICAgIEJhZFJlcXVlc3RFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24geworICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICBpbnB1dCA9IG5ldyBJbnB1dCgpOworICAgIH0KKyAgICBpZiAoaW5wdXQucnVsZSAhPSBudWxsICYmICFydWxlcy5pc1Byb2plY3RSdWxlc0VuYWJsZWQoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oInByb2plY3QgcnVsZXMgYXJlIGRpc2FibGVkIik7CisgICAgfQorICAgIGlucHV0LmZpbHRlcnMgPSBPYmplY3RzLmZpcnN0Tm9uTnVsbChpbnB1dC5maWx0ZXJzLCBmaWx0ZXJzKTsKKworICAgIFN1Ym1pdFJ1bGVFdmFsdWF0b3IgZXZhbHVhdG9yID0gbmV3IFN1Ym1pdFJ1bGVFdmFsdWF0b3IoCisgICAgICAgIGRiLAorICAgICAgICByc3JjLmdldFBhdGNoU2V0KCksCisgICAgICAgIHJzcmMuZ2V0Q29udHJvbCgpLmdldFByb2plY3RDb250cm9sKCksCisgICAgICAgIHJzcmMuZ2V0Q29udHJvbCgpLAorICAgICAgICByc3JjLmdldENoYW5nZSgpLAorICAgICAgICBuZXcgQ2hhbmdlRGF0YShyc3JjLmdldENoYW5nZSgpKSwKKyAgICAgICAgZmFsc2UsCisgICAgICAgICJsb2NhdGVfc3VibWl0X3J1bGUiLCAiY2FuX3N1Ym1pdCIsCisgICAgICAgICJsb2NhdGVfc3VibWl0X2ZpbHRlciIsICJmaWx0ZXJfc3VibWl0X3Jlc3VsdHMiLAorICAgICAgICBpbnB1dC5maWx0ZXJzID09IEZpbHRlcnMuU0tJUCwKKyAgICAgICAgaW5wdXQucnVsZSAhPSBudWxsCisgICAgICAgICAgPyBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQucnVsZS5nZXRCeXRlcyhDaGFyc2V0cy5VVEZfOCkpCisgICAgICAgICAgOiBudWxsKTsKKworICAgIExpc3Q8VGVybT4gcmVzdWx0czsKKyAgICB0cnkgeworICAgICAgcmVzdWx0cyA9IGV2YWwoZXZhbHVhdG9yKTsKKyAgICB9IGNhdGNoIChSdWxlRXZhbEV4Y2VwdGlvbiBlKSB7CisgICAgICBTdHJpbmcgbXNnID0gSm9pbmVyLm9uKCI6ICIpLnNraXBOdWxscygpLmpvaW4oSXRlcmFibGVzLnRyYW5zZm9ybSgKKyAgICAgICAgICBUaHJvd2FibGVzLmdldENhdXNhbENoYWluKGUpLAorICAgICAgICAgIG5ldyBGdW5jdGlvbjxUaHJvd2FibGUsIFN0cmluZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoVGhyb3dhYmxlIGluKSB7CisgICAgICAgICAgICAgIHJldHVybiBpbi5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSkpOworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oInJ1bGUgZmFpbGVkOiAiICsgbXNnKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdHMuaXNFbXB0eSgpKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJydWxlICVzIGhhcyBubyBzb2x1dGlvbnMiLAorICAgICAgICAgIGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCkudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIExpc3Q8U3VibWl0UmVjb3JkPiByZWNvcmRzID0gcnNyYy5nZXRDb250cm9sKCkucmVzdWx0c1RvU3VibWl0UmVjb3JkKAorICAgICAgICBldmFsdWF0b3IuZ2V0U3VibWl0UnVsZSgpLAorICAgICAgICByZXN1bHRzKTsKKyAgICBMaXN0PFJlY29yZD4gb3V0ID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHJlY29yZHMuc2l6ZSgpKTsKKyAgICBBY2NvdW50SW5mby5Mb2FkZXIgYWNjb3VudHMgPSBhY2NvdW50SW5mb0ZhY3RvcnkuY3JlYXRlKHRydWUpOworICAgIGZvciAoU3VibWl0UmVjb3JkIHIgOiByZWNvcmRzKSB7CisgICAgICBvdXQuYWRkKG5ldyBSZWNvcmQociwgYWNjb3VudHMpKTsKKyAgICB9CisgICAgYWNjb3VudHMuZmlsbCgpOworICAgIHJldHVybiBvdXQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBMaXN0PFRlcm0+IGV2YWwoU3VibWl0UnVsZUV2YWx1YXRvciBldmFsdWF0b3IpCisgICAgICB0aHJvd3MgUnVsZUV2YWxFeGNlcHRpb24geworICAgIHJldHVybiBldmFsdWF0b3IuZXZhbHVhdGUoKTsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBSZWNvcmQgeworICAgIFN1Ym1pdFJlY29yZC5TdGF0dXMgc3RhdHVzOworICAgIFN0cmluZyBlcnJvck1lc3NhZ2U7CisgICAgTWFwPFN0cmluZywgQWNjb3VudEluZm8+IG9rOworICAgIE1hcDxTdHJpbmcsIEFjY291bnRJbmZvPiByZWplY3Q7CisgICAgTWFwPFN0cmluZywgTm9uZT4gbmVlZDsKKyAgICBNYXA8U3RyaW5nLCBBY2NvdW50SW5mbz4gbWF5OworICAgIE1hcDxTdHJpbmcsIE5vbmU+IGltcG9zc2libGU7CisKKyAgICBSZWNvcmQoU3VibWl0UmVjb3JkIHIsIEFjY291bnRJbmZvLkxvYWRlciBhY2NvdW50cykgeworICAgICAgdGhpcy5zdGF0dXMgPSByLnN0YXR1czsKKyAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gci5lcnJvck1lc3NhZ2U7CisKKyAgICAgIGlmIChyLmxhYmVscyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoU3VibWl0UmVjb3JkLkxhYmVsIG4gOiByLmxhYmVscykgeworICAgICAgICAgIEFjY291bnRJbmZvIHdobyA9IG4uYXBwbGllZEJ5ICE9IG51bGwKKyAgICAgICAgICAgICAgPyBhY2NvdW50cy5nZXQobi5hcHBsaWVkQnkpCisgICAgICAgICAgICAgIDogbmV3IEFjY291bnRJbmZvKG51bGwpOworICAgICAgICAgIGxhYmVsKG4sIHdobyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGFiZWwoU3VibWl0UmVjb3JkLkxhYmVsIG4sIEFjY291bnRJbmZvIHdobykgeworICAgICAgc3dpdGNoIChuLnN0YXR1cykgeworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgIGlmIChvayA9PSBudWxsKSB7CisgICAgICAgICAgICBvayA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBvay5wdXQobi5sYWJlbCwgd2hvKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUpFQ1Q6CisgICAgICAgICAgaWYgKHJlamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZWplY3QgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmVqZWN0LnB1dChuLmxhYmVsLCB3aG8pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5FRUQ6CisgICAgICAgICAgaWYgKG5lZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgbmVlZCA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBuZWVkLnB1dChuLmxhYmVsLCBuZXcgTm9uZSgpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNQVk6CisgICAgICAgICAgaWYgKG1heSA9PSBudWxsKSB7CisgICAgICAgICAgICBtYXkgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWF5LnB1dChuLmxhYmVsLCB3aG8pOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElNUE9TU0lCTEU6CisgICAgICAgICAgaWYgKGltcG9zc2libGUgPT0gbnVsbCkgeworICAgICAgICAgICAgaW1wb3NzaWJsZSA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBpbXBvc3NpYmxlLnB1dChuLmxhYmVsLCBuZXcgTm9uZSgpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgTm9uZSB7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlL1Rlc3RTdWJtaXRUeXBlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9UZXN0U3VibWl0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZTFmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9UZXN0U3VibWl0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlcy5SdWxlc0NhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuVGVzdFN1Ym1pdFJ1bGUuRmlsdGVyczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlRlc3RTdWJtaXRSdWxlLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlJ1bGVFdmFsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlN1Ym1pdFJ1bGVFdmFsdWF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VEYXRhOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOworCitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBUZXN0U3VibWl0VHlwZSBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFJldmlzaW9uUmVzb3VyY2UsIElucHV0PiB7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgZmluYWwgUnVsZXNDYWNoZSBydWxlczsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1maWx0ZXJzIiwgdXNhZ2UgPSAiaW1wYWN0IG9mIGZpbHRlcnMgaW4gcGFyZW50IHByb2plY3RzIikKKyAgcHJpdmF0ZSBGaWx0ZXJzIGZpbHRlcnMgPSBGaWx0ZXJzLlJVTjsKKworICBASW5qZWN0CisgIFRlc3RTdWJtaXRUeXBlKFJldmlld0RiIGRiLCBSdWxlc0NhY2hlIHJ1bGVzKSB7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMucnVsZXMgPSBydWxlczsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGFwcGx5KFJldmlzaW9uUmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpIHRocm93cyBPcm1FeGNlcHRpb24sCisgICAgICBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgaW5wdXQgPSBuZXcgSW5wdXQoKTsKKyAgICB9CisgICAgaWYgKGlucHV0LnJ1bGUgIT0gbnVsbCAmJiAhcnVsZXMuaXNQcm9qZWN0UnVsZXNFbmFibGVkKCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJwcm9qZWN0IHJ1bGVzIGFyZSBkaXNhYmxlZCIpOworICAgIH0KKyAgICBpbnB1dC5maWx0ZXJzID0gT2JqZWN0cy5maXJzdE5vbk51bGwoaW5wdXQuZmlsdGVycywgZmlsdGVycyk7CisKKyAgICBTdWJtaXRSdWxlRXZhbHVhdG9yIGV2YWx1YXRvciA9IG5ldyBTdWJtaXRSdWxlRXZhbHVhdG9yKAorICAgICAgICBkYiwKKyAgICAgICAgcnNyYy5nZXRQYXRjaFNldCgpLAorICAgICAgICByc3JjLmdldENvbnRyb2woKS5nZXRQcm9qZWN0Q29udHJvbCgpLAorICAgICAgICByc3JjLmdldENvbnRyb2woKSwKKyAgICAgICAgcnNyYy5nZXRDaGFuZ2UoKSwKKyAgICAgICAgbmV3IENoYW5nZURhdGEocnNyYy5nZXRDaGFuZ2UoKSksCisgICAgICAgIGZhbHNlLAorICAgICAgICAibG9jYXRlX3N1Ym1pdF90eXBlIiwgImdldF9zdWJtaXRfdHlwZSIsCisgICAgICAgICJsb2NhdGVfc3VibWl0X3R5cGVfZmlsdGVyIiwgImZpbHRlcl9zdWJtaXRfdHlwZV9yZXN1bHRzIiwKKyAgICAgICAgaW5wdXQuZmlsdGVycyA9PSBGaWx0ZXJzLlNLSVAsCisgICAgICAgIGlucHV0LnJ1bGUgIT0gbnVsbAorICAgICAgICAgID8gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LnJ1bGUuZ2V0Qnl0ZXMoQ2hhcnNldHMuVVRGXzgpKQorICAgICAgICAgIDogbnVsbCk7CisKKyAgICBMaXN0PFRlcm0+IHJlc3VsdHM7CisgICAgdHJ5IHsKKyAgICAgIHJlc3VsdHMgPSBldmFsdWF0b3IuZXZhbHVhdGUoKTsKKyAgICB9IGNhdGNoIChSdWxlRXZhbEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICJydWxlIGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogJXMiLAorICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKSk7CisgICAgfQorICAgIGlmIChyZXN1bHRzLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAicnVsZSAlcyBoYXMgbm8gc29sdXRpb24iLAorICAgICAgICAgIGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCkpKTsKKyAgICB9CisgICAgVGVybSB0eXBlID0gcmVzdWx0cy5nZXQoMCk7CisgICAgaWYgKCF0eXBlLmlzU3ltYm9sKCkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgInJ1bGUgJXMgcHJvZHVjZWQgaW52YWxpZCByZXN1bHQ6ICVzIiwKKyAgICAgICAgICBldmFsdWF0b3IuZ2V0U3VibWl0UnVsZSgpLnRvU3RyaW5nKCksCisgICAgICAgICAgdHlwZSkpOworICAgIH0KKyAgICByZXR1cm4gdHlwZS50b1N0cmluZygpOworICB9CisKKyAgc3RhdGljIGNsYXNzIEdldCBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxSZXZpc2lvblJlc291cmNlPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXN0U3VibWl0VHlwZSB0ZXN0OworCisgICAgQEluamVjdAorICAgIEdldChUZXN0U3VibWl0VHlwZSB0ZXN0KSB7CisgICAgICB0aGlzLnRlc3QgPSB0ZXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoUmV2aXNpb25SZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICAgIE9ybUV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiB7CisgICAgICByZXR1cm4gdGVzdC5hcHBseShyZXNvdXJjZSwgbnVsbCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9BYmFuZG9uQ2hhbmdlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9BYmFuZG9uQ2hhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYTRhODMuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvQWJhbmRvbkNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3UmVzdWx0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQWJhbmRvbmVkU2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkVtYWlsRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotCi1pbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OwotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBYmFuZG9uQ2hhbmdlIGltcGxlbWVudHMgQ2FsbGFibGU8UmV2aWV3UmVzdWx0PiB7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBBYmFuZG9uZWRTZW5kZXIuRmFjdG9yeSBhYmFuZG9uZWRTZW5kZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKLQotICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIG11bHRpVmFsdWVkID0gZmFsc2UsIHVzYWdlID0gImNoYW5nZSB0byBhYmFuZG9uIikKLSAgcHJpdmF0ZSBDaGFuZ2UuSWQgY2hhbmdlSWQ7Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2hhbmdlSWQoZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkKSB7Ci0gICAgdGhpcy5jaGFuZ2VJZCA9IGNoYW5nZUlkOwotICB9Ci0KLSAgQE9wdGlvbihuYW1lID0gIi0tbWVzc2FnZSIsIGFsaWFzZXMgPSB7Ii1tIn0sCi0gICAgICAgICAgdXNhZ2UgPSAib3B0aW9uYWwgbWVzc2FnZSB0byBhcHBlbmQgdG8gY2hhbmdlIikKLSAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQotICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgfQotCi0gIEBJbmplY3QKLSAgQWJhbmRvbkNoYW5nZShmaW5hbCBBYmFuZG9uZWRTZW5kZXIuRmFjdG9yeSBhYmFuZG9uZWRTZW5kZXJGYWN0b3J5LAotICAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LCBmaW5hbCBSZXZpZXdEYiBkYiwKLSAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLCBmaW5hbCBDaGFuZ2VIb29rcyBob29rcykgewotICAgIHRoaXMuYWJhbmRvbmVkU2VuZGVyRmFjdG9yeSA9IGFiYW5kb25lZFNlbmRlckZhY3Rvcnk7Ci0gICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7Ci0gICAgdGhpcy5ob29rcyA9IGhvb2tzOwotCi0gICAgY2hhbmdlSWQgPSBudWxsOwotICAgIG1lc3NhZ2UgPSBudWxsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBSZXZpZXdSZXN1bHQgY2FsbCgpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiwKLSAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKLSAgICBpZiAoY2hhbmdlSWQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oImNoYW5nZUlkIGlzIHJlcXVpcmVkIik7Ci0gICAgfQotCi0gICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IG5ldyBSZXZpZXdSZXN1bHQoKTsKLSAgICByZXN1bHQuc2V0Q2hhbmdlSWQoY2hhbmdlSWQpOwotCi0gICAgZmluYWwgQ2hhbmdlQ29udHJvbCBjb250cm9sID0gY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOwotICAgIGZpbmFsIENoYW5nZSBjaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuZ2V0KGNoYW5nZUlkKTsKLSAgICBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkID0gY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCk7Ci0gICAgZmluYWwgUGF0Y2hTZXQgcGF0Y2ggPSBkYi5wYXRjaFNldHMoKS5nZXQocGF0Y2hTZXRJZCk7Ci0gICAgaWYgKCFjb250cm9sLmNhbkFiYW5kb24oKSkgewotICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuQUJBTkRPTl9OT1RfUEVSTUlUVEVEKSk7Ci0gICAgfSBlbHNlIGlmIChwYXRjaCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uKGNoYW5nZUlkKTsKLSAgICB9IGVsc2UgewotCi0gICAgICAvLyBDcmVhdGUgYSBtZXNzYWdlIHRvIGFjY29tcGFueSB0aGUgYWJhbmRvbmVkIGNoYW5nZQotICAgICAgZmluYWwgQ2hhbmdlTWVzc2FnZSBjbXNnID0gbmV3IENoYW5nZU1lc3NhZ2UoCi0gICAgICAgICAgbmV3IENoYW5nZU1lc3NhZ2UuS2V5KGNoYW5nZUlkLCBDaGFuZ2VVdGlsLm1lc3NhZ2VVVUlEKGRiKSksCi0gICAgICAgICAgY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCksIHBhdGNoU2V0SWQpOwotICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2dCdWYgPQotICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCJQYXRjaCBTZXQgIiArIHBhdGNoU2V0SWQuZ2V0KCkgKyAiOiBBYmFuZG9uZWQiKTsKLSAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgbXNnQnVmLmFwcGVuZCgiXG5cbiIpOwotICAgICAgICBtc2dCdWYuYXBwZW5kKG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgY21zZy5zZXRNZXNzYWdlKG1zZ0J1Zi50b1N0cmluZygpKTsKLQotICAgICAgLy8gQWJhbmRvbiB0aGUgY2hhbmdlCi0gICAgICBmaW5hbCBDaGFuZ2UgdXBkYXRlZENoYW5nZSA9IGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoY2hhbmdlSWQsCi0gICAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNPcGVuKCkpIHsKLSAgICAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5BQkFORE9ORUQpOwotICAgICAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBpZiAodXBkYXRlZENoYW5nZSA9PSBudWxsKSB7Ci0gICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3UmVzdWx0LkVycm9yKAotICAgICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuQ0hBTkdFX0lTX0NMT1NFRCkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWRDaGFuZ2UoZGIsIGN1cnJlbnRVc2VyLCB1cGRhdGVkQ2hhbmdlLCBjbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiYW5kb25lZFNlbmRlckZhY3RvcnkpOwotICAgICAgaG9va3MuZG9DaGFuZ2VBYmFuZG9uZWRIb29rKHVwZGF0ZWRDaGFuZ2UsIGN1cnJlbnRVc2VyLmdldEFjY291bnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBkYik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvRGVsZXRlRHJhZnRQYXRjaFNldC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvRGVsZXRlRHJhZnRQYXRjaFNldC5qYXZhCmluZGV4IGY0NjYyMzEuLmFkZWMyOTIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL0RlbGV0ZURyYWZ0UGF0Y2hTZXQuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9EZWxldGVEcmFmdFBhdGNoU2V0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CiAgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CiAKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkOwpAQCAtNTIsMTIgKzUyLDEyIEBACiAgIEBJbmplY3QKICAgRGVsZXRlRHJhZnRQYXRjaFNldChDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCiAgICAgICBSZXZpZXdEYiBkYiwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlciwKLSAgICAgIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24sIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwKKyAgICAgIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAogICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQpIHsKICAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7CiAgICAgdGhpcy5kYiA9IGRiOwogICAgIHRoaXMuZ2l0TWFuYWdlciA9IGdpdE1hbmFnZXI7Ci0gICAgdGhpcy5yZXBsaWNhdGlvbiA9IHJlcGxpY2F0aW9uOworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CiAgICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKIAogICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7CkBAIC04OCw3ICs4OCw3IEBACiAgICAgZmluYWwgQ2hhbmdlIGNoYW5nZSA9IGNvbnRyb2wuZ2V0Q2hhbmdlKCk7CiAKICAgICB0cnkgewotICAgICAgQ2hhbmdlVXRpbC5kZWxldGVPbmx5RHJhZnRQYXRjaFNldChwYXRjaCwgY2hhbmdlLCBnaXRNYW5hZ2VyLCByZXBsaWNhdGlvbiwgZGIpOworICAgICAgQ2hhbmdlVXRpbC5kZWxldGVPbmx5RHJhZnRQYXRjaFNldChwYXRjaCwgY2hhbmdlLCBnaXRNYW5hZ2VyLCBnaXRSZWZVcGRhdGVkLCBkYik7CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCiAgICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuR0lUX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSkpOwpAQCAtOTcsNyArOTcsNyBAQAogICAgIExpc3Q8UGF0Y2hTZXQ+IHJlc3RPZlBhdGNoZXMgPSBkYi5wYXRjaFNldHMoKS5ieUNoYW5nZShjaGFuZ2VJZCkudG9MaXN0KCk7CiAgICAgaWYgKHJlc3RPZlBhdGNoZXMuc2l6ZSgpID09IDApIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIENoYW5nZVV0aWwuZGVsZXRlRHJhZnRDaGFuZ2UocGF0Y2hTZXRJZCwgZ2l0TWFuYWdlciwgcmVwbGljYXRpb24sIGRiKTsKKyAgICAgICAgQ2hhbmdlVXRpbC5kZWxldGVEcmFmdENoYW5nZShwYXRjaFNldElkLCBnaXRNYW5hZ2VyLCBnaXRSZWZVcGRhdGVkLCBkYik7CiAgICAgICAgIHJlc3VsdC5zZXRDaGFuZ2VJZChudWxsKTsKICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCkBAIC0xMTEsOSArMTExLDEwIEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGlmIChjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMocGF0Y2hTZXRJZCkpIHsKLSAgICAgICAgY2hhbmdlLnJlbW92ZUxhc3RQYXRjaFNldElkKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgY2hhbmdlLnNldEN1cnJlbnRQYXRjaFNldChwYXRjaFNldEluZm9GYWN0b3J5LmdldChkYiwgY2hhbmdlLmN1cnJQYXRjaFNldElkKCkpKTsKKyAgICAgICAgICBQYXRjaFNldC5JZCBpZCA9CisgICAgICAgICAgICAgIG5ldyBQYXRjaFNldC5JZChwYXRjaFNldElkLmdldFBhcmVudEtleSgpLCBwYXRjaFNldElkLmdldCgpIC0gMSk7CisgICAgICAgICAgY2hhbmdlLnNldEN1cnJlbnRQYXRjaFNldChwYXRjaFNldEluZm9GYWN0b3J5LmdldChkYiwgaWQpKTsKICAgICAgICAgfSBjYXRjaCAoUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uKGNoYW5nZUlkKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUGF0aENvbmZsaWN0RXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9QYXRoQ29uZmxpY3RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTJmMmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUGF0aENvbmZsaWN0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWw7CisKKy8qKiBJbmRpY2F0ZXMgYSBwYXRoIGNvbmZsaWN0IGR1cmluZyByZWJhc2Ugb3IgbWVyZ2UgKi8KK3B1YmxpYyBjbGFzcyBQYXRoQ29uZmxpY3RFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICBwdWJsaWMgUGF0aENvbmZsaWN0RXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKKyAgICBzdXBlcihtc2cpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9QdWJsaXNoRHJhZnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1B1Ymxpc2hEcmFmdC5qYXZhCmluZGV4IGE3MWUxMmUuLjIyZWFlMmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1B1Ymxpc2hEcmFmdC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1B1Ymxpc2hEcmFmdC5qYXZhCkBAIC0xNSwxMiArMTUsMjkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1haWxVdGlsLmdldFJlY2lwaWVudHNGcm9tQXBwcm92YWxzOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5NYWlsVXRpbC5nZXRSZWNpcGllbnRzRnJvbUZvb3RlcnM7CisKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZXZpZXdSZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFwcHJvdmFsc1V0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvbHZlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkNyZWF0ZUNoYW5nZVNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5NYWlsVXRpbC5NYWlsUmVjaXBpZW50czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBsYWNlUGF0Y2hTZXRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQXRvbWljVXBkYXRlOwpAQCAtMjgsOSArNDUsMjIgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJMaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogCiBwdWJsaWMgY2xhc3MgUHVibGlzaERyYWZ0IGltcGxlbWVudHMgQ2FsbGFibGU8UmV2aWV3UmVzdWx0PiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQorICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHVibGlzaERyYWZ0LmNsYXNzKTsKIAogICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewogICAgIFB1Ymxpc2hEcmFmdCBjcmVhdGUoUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCk7CkBAIC0zOSwyNyArNjksNDcgQEAKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CiAgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va3MgaG9va3M7CisgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsc1V0aWwgYXBwcm92YWxzVXRpbDsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyOworICBwcml2YXRlIGZpbmFsIENyZWF0ZUNoYW5nZVNlbmRlci5GYWN0b3J5IGNyZWF0ZUNoYW5nZVNlbmRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUmVwbGFjZVBhdGNoU2V0U2VuZGVyLkZhY3RvcnkgcmVwbGFjZVBhdGNoU2V0RmFjdG9yeTsKIAogICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7CiAKICAgQEluamVjdAotICBQdWJsaXNoRHJhZnQoQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAotICAgICAgUmV2aWV3RGIgZGIsIEBBc3Npc3RlZCBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAotICAgICAgZmluYWwgQ2hhbmdlSG9va3MgaG9va3MpIHsKKyAgUHVibGlzaERyYWZ0KGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKKyAgICAgIGZpbmFsIFJldmlld0RiIGRiLCBmaW5hbCBDaGFuZ2VIb29rcyBob29rcywKKyAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsLAorICAgICAgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlciwKKyAgICAgIGZpbmFsIENyZWF0ZUNoYW5nZVNlbmRlci5GYWN0b3J5IGNyZWF0ZUNoYW5nZVNlbmRlckZhY3RvcnksCisgICAgICBmaW5hbCBSZXBsYWNlUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeSByZXBsYWNlUGF0Y2hTZXRGYWN0b3J5LAorICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQpIHsKICAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7CiAgICAgdGhpcy5kYiA9IGRiOwogICAgIHRoaXMuaG9va3MgPSBob29rczsKKyAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CisgICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgICB0aGlzLmFwcHJvdmFsc1V0aWwgPSBhcHByb3ZhbHNVdGlsOworICAgIHRoaXMuYWNjb3VudFJlc29sdmVyID0gYWNjb3VudFJlc29sdmVyOworICAgIHRoaXMuY3JlYXRlQ2hhbmdlU2VuZGVyRmFjdG9yeSA9IGNyZWF0ZUNoYW5nZVNlbmRlckZhY3Rvcnk7CisgICAgdGhpcy5yZXBsYWNlUGF0Y2hTZXRGYWN0b3J5ID0gcmVwbGFjZVBhdGNoU2V0RmFjdG9yeTsKIAogICAgIHRoaXMucGF0Y2hTZXRJZCA9IHBhdGNoU2V0SWQ7CiAgIH0KIAogICBAT3ZlcnJpZGUKLSAgcHVibGljIFJldmlld1Jlc3VsdCBjYWxsKCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgcHVibGljIFJldmlld1Jlc3VsdCBjYWxsKCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLAorICAgICAgSU9FeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CiAgICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IG5ldyBSZXZpZXdSZXN1bHQoKTsKIAogICAgIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZCA9IHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCk7CiAgICAgcmVzdWx0LnNldENoYW5nZUlkKGNoYW5nZUlkKTsKICAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihjaGFuZ2VJZCk7CisgICAgZmluYWwgTGFiZWxUeXBlcyBsYWJlbFR5cGVzID0gY29udHJvbC5nZXRMYWJlbFR5cGVzKCk7CiAgICAgZmluYWwgUGF0Y2hTZXQgcGF0Y2ggPSBkYi5wYXRjaFNldHMoKS5nZXQocGF0Y2hTZXRJZCk7CiAgICAgaWYgKHBhdGNoID09IG51bGwpIHsKICAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOwpAQCAtNzQsNyArMTI0LDcgQEAKICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3UmVzdWx0LkVycm9yKAogICAgICAgICAgIFJldmlld1Jlc3VsdC5FcnJvci5UeXBlLlBVQkxJU0hfTk9UX1BFUk1JVFRFRCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICBmaW5hbCBQYXRjaFNldCB1cGRhdGVkUGF0Y2ggPSBkYi5wYXRjaFNldHMoKS5hdG9taWNVcGRhdGUocGF0Y2hTZXRJZCwKKyAgICAgIGZpbmFsIFBhdGNoU2V0IHVwZGF0ZWRQYXRjaFNldCA9IGRiLnBhdGNoU2V0cygpLmF0b21pY1VwZGF0ZShwYXRjaFNldElkLAogICAgICAgICAgIG5ldyBBdG9taWNVcGRhdGU8UGF0Y2hTZXQ+KCkgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFBhdGNoU2V0IHVwZGF0ZShQYXRjaFNldCBwYXRjaHNldCkgewpAQCAtOTUsMTEgKzE0NSw3NyBAQAogICAgICAgICB9CiAgICAgICB9KTsKIAotICAgICAgaWYgKCF1cGRhdGVkUGF0Y2guaXNEcmFmdCgpIHx8IHVwZGF0ZWRDaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5ORVcpIHsKLSAgICAgICAgaG9va3MuZG9EcmFmdFB1Ymxpc2hlZEhvb2sodXBkYXRlZENoYW5nZSwgdXBkYXRlZFBhdGNoLCBkYik7CisgICAgICBpZiAoIXVwZGF0ZWRQYXRjaFNldC5pc0RyYWZ0KCkgfHwgdXBkYXRlZENoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk5FVykgeworICAgICAgICBob29rcy5kb0RyYWZ0UHVibGlzaGVkSG9vayh1cGRhdGVkQ2hhbmdlLCB1cGRhdGVkUGF0Y2hTZXQsIGRiKTsKKworICAgICAgICBzZW5kTm90aWZpY2F0aW9ucyhjb250cm9sLmdldENoYW5nZSgpLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuRFJBRlQsCisgICAgICAgICAgICAoSWRlbnRpZmllZFVzZXIpIGNvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKSwgdXBkYXRlZENoYW5nZSwgdXBkYXRlZFBhdGNoU2V0LAorICAgICAgICAgICAgbGFiZWxUeXBlcyk7CiAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQorCisgIHByaXZhdGUgdm9pZCBzZW5kTm90aWZpY2F0aW9ucyhmaW5hbCBib29sZWFuIG5ld0NoYW5nZSwKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLCBmaW5hbCBDaGFuZ2UgdXBkYXRlZENoYW5nZSwKKyAgICAgIGZpbmFsIFBhdGNoU2V0IHVwZGF0ZWRQYXRjaFNldCwgZmluYWwgTGFiZWxUeXBlcyBsYWJlbFR5cGVzKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgUmVwb3NpdG9yeSBnaXQgPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeSh1cGRhdGVkQ2hhbmdlLmdldFByb2plY3QoKSk7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGdpdCk7CisgICAgICBmaW5hbCBSZXZDb21taXQgY29tbWl0OworICAgICAgdHJ5IHsKKyAgICAgICAgY29tbWl0ID0gcmV2V2Fsay5wYXJzZUNvbW1pdChPYmplY3RJZC5mcm9tU3RyaW5nKHVwZGF0ZWRQYXRjaFNldC5nZXRSZXZpc2lvbigpLmdldCgpKSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICByZXZXYWxrLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIGZpbmFsIFBhdGNoU2V0SW5mbyBpbmZvID0gcGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQoY29tbWl0LCB1cGRhdGVkUGF0Y2hTZXQuZ2V0SWQoKSk7CisgICAgICBmaW5hbCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlckxpbmVzID0gY29tbWl0LmdldEZvb3RlckxpbmVzKCk7CisgICAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCk7CisgICAgICBmaW5hbCBNYWlsUmVjaXBpZW50cyByZWNpcGllbnRzID0KKyAgICAgICAgICBnZXRSZWNpcGllbnRzRnJvbUZvb3RlcnMoYWNjb3VudFJlc29sdmVyLCB1cGRhdGVkUGF0Y2hTZXQsIGZvb3RlckxpbmVzKTsKKyAgICAgIHJlY2lwaWVudHMucmVtb3ZlKG1lKTsKKworICAgICAgaWYgKG5ld0NoYW5nZSkgeworICAgICAgICBhcHByb3ZhbHNVdGlsLmFkZFJldmlld2VycyhkYiwgbGFiZWxUeXBlcywgdXBkYXRlZENoYW5nZSwgdXBkYXRlZFBhdGNoU2V0LCBpbmZvLAorICAgICAgICAgICAgcmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSwgQ29sbGVjdGlvbnMuPEFjY291bnQuSWQ+IGVtcHR5U2V0KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgIENyZWF0ZUNoYW5nZVNlbmRlciBjbSA9IGNyZWF0ZUNoYW5nZVNlbmRlckZhY3RvcnkuY3JlYXRlKHVwZGF0ZWRDaGFuZ2UpOworICAgICAgICAgIGNtLnNldEZyb20obWUpOworICAgICAgICAgIGNtLnNldFBhdGNoU2V0KHVwZGF0ZWRQYXRjaFNldCwgaW5mbyk7CisgICAgICAgICAgY20uYWRkUmV2aWV3ZXJzKHJlY2lwaWVudHMuZ2V0UmV2aWV3ZXJzKCkpOworICAgICAgICAgIGNtLmFkZEV4dHJhQ0MocmVjaXBpZW50cy5nZXRDY09ubHkoKSk7CisgICAgICAgICAgY20uc2VuZCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHNlbmQgZW1haWwgZm9yIG5ldyBjaGFuZ2UgIiArIHVwZGF0ZWRDaGFuZ2UuZ2V0SWQoKSwgZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gcGF0Y2hTZXRBcHByb3ZhbHMgPQorICAgICAgICAgICAgZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZSh1cGRhdGVkQ2hhbmdlLmdldElkKCkpLnRvTGlzdCgpOworICAgICAgICBmaW5hbCBNYWlsUmVjaXBpZW50cyBvbGRSZWNpcGllbnRzID0KKyAgICAgICAgICAgIGdldFJlY2lwaWVudHNGcm9tQXBwcm92YWxzKHBhdGNoU2V0QXBwcm92YWxzKTsKKyAgICAgICAgYXBwcm92YWxzVXRpbC5hZGRSZXZpZXdlcnMoZGIsIGxhYmVsVHlwZXMsIHVwZGF0ZWRDaGFuZ2UsIHVwZGF0ZWRQYXRjaFNldCwgaW5mbywKKyAgICAgICAgICAgIHJlY2lwaWVudHMuZ2V0UmV2aWV3ZXJzKCksIG9sZFJlY2lwaWVudHMuZ2V0QWxsKCkpOworICAgICAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIG1zZyA9CisgICAgICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZShuZXcgQ2hhbmdlTWVzc2FnZS5LZXkodXBkYXRlZENoYW5nZS5nZXRJZCgpLAorICAgICAgICAgICAgICAgIENoYW5nZVV0aWwubWVzc2FnZVVVSUQoZGIpKSwgbWUsCisgICAgICAgICAgICAgICAgdXBkYXRlZFBhdGNoU2V0LmdldENyZWF0ZWRPbigpLCB1cGRhdGVkUGF0Y2hTZXQuZ2V0SWQoKSk7CisgICAgICAgIG1zZy5zZXRNZXNzYWdlKCJVcGxvYWRlZCBwYXRjaCBzZXQgIiArIHVwZGF0ZWRQYXRjaFNldC5nZXRQYXRjaFNldElkKCkgKyAiLiIpOworICAgICAgICB0cnkgeworICAgICAgICAgIFJlcGxhY2VQYXRjaFNldFNlbmRlciBjbSA9IHJlcGxhY2VQYXRjaFNldEZhY3RvcnkuY3JlYXRlKHVwZGF0ZWRDaGFuZ2UpOworICAgICAgICAgIGNtLnNldEZyb20obWUpOworICAgICAgICAgIGNtLnNldFBhdGNoU2V0KHVwZGF0ZWRQYXRjaFNldCwgaW5mbyk7CisgICAgICAgICAgY20uc2V0Q2hhbmdlTWVzc2FnZShtc2cpOworICAgICAgICAgIGNtLmFkZFJldmlld2VycyhyZWNpcGllbnRzLmdldFJldmlld2VycygpKTsKKyAgICAgICAgICBjbS5hZGRFeHRyYUNDKHJlY2lwaWVudHMuZ2V0Q2NPbmx5KCkpOworICAgICAgICAgIGNtLnNlbmQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBzZW5kIGVtYWlsIGZvciBuZXcgcGF0Y2ggc2V0ICIgKyB1cGRhdGVkUGF0Y2hTZXQuZ2V0SWQoKSwgZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGZpbmFsbHkgeworICAgICAgZ2l0LmNsb3NlKCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1JlYmFzZUNoYW5nZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzUwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9SZWJhc2VDaGFuZ2UuamF2YQpAQCAtMCwwICsxLDQ3MCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlLlN0YXR1czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUmV2SWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BcHByb3ZhbHNVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWVyZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlYmFzZWRQYXRjaFNldFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBsYWNlUGF0Y2hTZXRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLkF0b21pY1VwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlRocmVlV2F5TWVyZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFJlYmFzZUNoYW5nZSB7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOworICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQ7CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOworICBwcml2YXRlIGZpbmFsIFJlYmFzZWRQYXRjaFNldFNlbmRlci5GYWN0b3J5IHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlSG9va1J1bm5lciBob29rczsKKyAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWw7CisgIHByaXZhdGUgZmluYWwgTWVyZ2VVdGlsLkZhY3RvcnkgbWVyZ2VVdGlsRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlOworCisgIEBJbmplY3QKKyAgUmViYXNlQ2hhbmdlKGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKKyAgICAgIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwgZmluYWwgUmV2aWV3RGIgZGIsCisgICAgICBAR2Vycml0UGVyc29uSWRlbnQgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudCwKKyAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1hbmFnZXIsCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCisgICAgICBmaW5hbCBSZWJhc2VkUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeSByZWJhc2VkUGF0Y2hTZXRTZW5kZXJGYWN0b3J5LAorICAgICAgZmluYWwgQ2hhbmdlSG9va1J1bm5lciBob29rcywgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsLAorICAgICAgZmluYWwgTWVyZ2VVdGlsLkZhY3RvcnkgbWVyZ2VVdGlsRmFjdG9yeSwKKyAgICAgIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUpIHsKKyAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5naXRNYW5hZ2VyID0gZ2l0TWFuYWdlcjsKKyAgICB0aGlzLm15SWRlbnQgPSBteUlkZW50OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5yZWJhc2VkUGF0Y2hTZXRTZW5kZXJGYWN0b3J5ID0gcmViYXNlZFBhdGNoU2V0U2VuZGVyRmFjdG9yeTsKKyAgICB0aGlzLmhvb2tzID0gaG9va3M7CisgICAgdGhpcy5hcHByb3ZhbHNVdGlsID0gYXBwcm92YWxzVXRpbDsKKyAgICB0aGlzLm1lcmdlVXRpbEZhY3RvcnkgPSBtZXJnZVV0aWxGYWN0b3J5OworICAgIHRoaXMucHJvamVjdENhY2hlID0gcHJvamVjdENhY2hlOworICB9CisKKyAgLyoqCisgICAqIFJlYmFzZXMgdGhlIGNoYW5nZSBvZiB0aGUgZ2l2ZW4gcGF0Y2ggc2V0LgorICAgKgorICAgKiBJdCBpcyB2ZXJpZmllZCB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaXMgYWxsb3dlZCB0byBkbyB0aGUgcmViYXNlLgorICAgKgorICAgKiBJZiB0aGUgcGF0Y2ggc2V0IGhhcyBubyBkZXBlbmRlbmN5IHRvIGFuIG9wZW4gY2hhbmdlLCB0aGVuIHRoZSBjaGFuZ2UgaXMKKyAgICogcmViYXNlZCBvbiB0aGUgdGlwIG9mIHRoZSBkZXN0aW5hdGlvbiBicmFuY2guCisgICAqCisgICAqIElmIHRoZSBwYXRjaCBzZXQgZGVwZW5kcyBvbiBhbiBvcGVuIGNoYW5nZSwgaXQgaXMgcmViYXNlZCBvbiB0aGUgbGF0ZXN0CisgICAqIHBhdGNoIHNldCBvZiB0aGlzIGNoYW5nZS4KKyAgICoKKyAgICogVGhlIHJlYmFzZWQgY29tbWl0IGlzIGFkZGVkIGFzIG5ldyBwYXRjaCBzZXQgdG8gdGhlIGNoYW5nZS4KKyAgICoKKyAgICogRS1tYWlsIG5vdGlmaWNhdGlvbiBhbmQgdHJpZ2dlcmluZyBvZiBob29rcyBoYXBwZW5zIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlCisgICAqIG5ldyBwYXRjaCBzZXQuCisgICAqCisgICAqIEBwYXJhbSBwYXRjaFNldElkIHRoZSBpZCBvZiB0aGUgcGF0Y2ggc2V0CisgICAqIEBwYXJhbSB1cGxvYWRlciB0aGUgdXNlciB0aGF0IGNyZWF0ZXMgdGhlIHJlYmFzZWQgcGF0Y2ggc2V0CisgICAqIEB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgY2hhbmdlIHRvIHdoaWNoIHRoZSBwYXRjaCBzZXQKKyAgICogICAgICAgICBiZWxvbmdzIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSB1c2VyCisgICAqIEB0aHJvd3MgRW1haWxFeGNlcHRpb24gdGhyb3duIGlmIHNlbmRpbmcgdGhlIGUtbWFpbCB0byBub3RpZnkgYWJvdXQgdGhlIG5ldworICAgKiAgICAgICAgIHBhdGNoIHNldCBmYWlscworICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbiB0aHJvd24gaW4gY2FzZSBhY2Nlc3NpbmcgdGhlIGRhdGFiYXNlIGZhaWxzCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhyb3duIGlmIHJlYmFzZSBpcyBub3QgcG9zc2libGUgb3Igbm90IG5lZWRlZAorICAgKiBAdGhyb3dzIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24gdGhyb3duIGlmIHJlYmFzZSBpcyBub3QgYWxsb3dlZAorICAgKi8KKyAgcHVibGljIHZvaWQgcmViYXNlKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsIGZpbmFsIEFjY291bnQuSWQgdXBsb2FkZXIpCisgICAgICB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLCBFbWFpbEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24geworICAgIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZCA9IHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCk7CisgICAgZmluYWwgQ2hhbmdlQ29udHJvbCBjaGFuZ2VDb250cm9sID0KKyAgICAgICAgY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOworICAgIGlmICghY2hhbmdlQ29udHJvbC5jYW5SZWJhc2UoKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIkNhbm5vdCByZWJhc2U6IE5ldyBwYXRjaCBzZXRzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBhZGRlZCB0byBjaGFuZ2U6ICIKKyAgICAgICAgICAgICAgKyBjaGFuZ2VJZC50b1N0cmluZygpKTsKKyAgICB9CisgICAgZmluYWwgQ2hhbmdlIGNoYW5nZSA9IGNoYW5nZUNvbnRyb2wuZ2V0Q2hhbmdlKCk7CisgICAgUmVwb3NpdG9yeSBnaXQgPSBudWxsOworICAgIFJldldhbGsgcncgPSBudWxsOworICAgIE9iamVjdEluc2VydGVyIGluc2VydGVyID0gbnVsbDsKKyAgICB0cnkgeworICAgICAgZ2l0ID0gZ2l0TWFuYWdlci5vcGVuUmVwb3NpdG9yeShjaGFuZ2UuZ2V0UHJvamVjdCgpKTsKKyAgICAgIHJ3ID0gbmV3IFJldldhbGsoZ2l0KTsKKyAgICAgIGluc2VydGVyID0gZ2l0Lm5ld09iamVjdEluc2VydGVyKCk7CisKKyAgICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gb2xkUGF0Y2hTZXRBcHByb3ZhbHMgPQorICAgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlDaGFuZ2UoY2hhbmdlLmdldElkKCkpLnRvTGlzdCgpOworCisgICAgICBmaW5hbCBTdHJpbmcgYmFzZVJldiA9IGZpbmRCYXNlUmV2aXNpb24ocGF0Y2hTZXRJZCwgZGIsCisgICAgICAgICAgY2hhbmdlLmdldERlc3QoKSwgZ2l0LCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgIGZpbmFsIFJldkNvbW1pdCBiYXNlQ29tbWl0ID0KKyAgICAgICAgICBydy5wYXJzZUNvbW1pdChPYmplY3RJZC5mcm9tU3RyaW5nKGJhc2VSZXYpKTsKKworICAgICAgZmluYWwgUGF0Y2hTZXQgbmV3UGF0Y2hTZXQgPQorICAgICAgICAgIHJlYmFzZShnaXQsIHJ3LCBpbnNlcnRlciwgcGF0Y2hTZXRJZCwgY2hhbmdlLCB1cGxvYWRlciwgYmFzZUNvbW1pdCwKKyAgICAgICAgICAgICAgbWVyZ2VVdGlsRmFjdG9yeS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICBjaGFuZ2VDb250cm9sLmdldFByb2plY3RDb250cm9sKCkuZ2V0UHJvamVjdFN0YXRlKCksIHRydWUpKTsKKworICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IG9sZFJldmlld2VycyA9IFNldHMubmV3SGFzaFNldCgpOworICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IG9sZENDID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IG9sZFBhdGNoU2V0QXBwcm92YWxzKSB7CisgICAgICAgIGlmIChhLmdldFZhbHVlKCkgIT0gMCkgeworICAgICAgICAgIG9sZFJldmlld2Vycy5hZGQoYS5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgb2xkQ0MuYWRkKGEuZ2V0QWNjb3VudElkKCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmaW5hbCBSZXBsYWNlUGF0Y2hTZXRTZW5kZXIgY20gPQorICAgICAgICAgIHJlYmFzZWRQYXRjaFNldFNlbmRlckZhY3RvcnkuY3JlYXRlKGNoYW5nZSk7CisgICAgICBjbS5zZXRGcm9tKHVwbG9hZGVyKTsKKyAgICAgIGNtLnNldFBhdGNoU2V0KG5ld1BhdGNoU2V0KTsKKyAgICAgIGNtLmFkZFJldmlld2VycyhvbGRSZXZpZXdlcnMpOworICAgICAgY20uYWRkRXh0cmFDQyhvbGRDQyk7CisgICAgICBjbS5zZW5kKCk7CisKKyAgICAgIGhvb2tzLmRvUGF0Y2hzZXRDcmVhdGVkSG9vayhjaGFuZ2UsIG5ld1BhdGNoU2V0LCBkYik7CisgICAgfSBjYXRjaCAoUGF0aENvbmZsaWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChpbnNlcnRlciAhPSBudWxsKSB7CisgICAgICAgIGluc2VydGVyLnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIGlmIChydyAhPSBudWxsKSB7CisgICAgICAgIHJ3LnJlbGVhc2UoKTsKKyAgICAgIH0KKyAgICAgIGlmIChnaXQgIT0gbnVsbCkgeworICAgICAgICBnaXQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioKKyAgICogRmluZHMgdGhlIHJldmlzaW9uIG9mIGNvbW1pdCBvbiB3aGljaCB0aGUgZ2l2ZW4gcGF0Y2ggc2V0IHNob3VsZCBiZSBiYXNlZC4KKyAgICoKKyAgICogQHBhcmFtIHBhdGNoU2V0SWQgdGhlIGlkIG9mIHRoZSBwYXRjaCBzZXQgZm9yIHdoaWNoIHRoZSBuZXcgYmFzZSBjb21taXQKKyAgICogICAgICAgIHNob3VsZCBiZSBmb3VuZAorICAgKiBAcGFyYW0gZGIgdGhlIFJldmlld0RiCisgICAqIEBwYXJhbSBkZXN0QnJhbmNoIHRoZSBkZXN0aW5hdGlvbiBicmFuY2gKKyAgICogQHBhcmFtIGdpdCB0aGUgcmVwb3NpdG9yeQorICAgKiBAcGFyYW0gcGF0Y2hTZXRBbmNlc3RvcnMgdGhlIG9yaWdpbmFsIFBhdGNoU2V0QW5jZXN0b3Igb2YgdGhlIGdpdmVuIHBhdGNoCisgICAqICAgICAgICBzZXQgdGhhdCBzaG91bGQgYmUgYmFzZWQKKyAgICogQHBhcmFtIGRlcFBhdGNoU2V0TGlzdCB0aGUgb3JpZ2luYWwgcGF0Y2ggc2V0IGxpc3Qgb24gd2hpY2ggdGhlIHJlYmFzZWQKKyAgICogICAgICAgIHBhdGNoIHNldCBkZXBlbmRzCisgICAqIEBwYXJhbSBkZXBDaGFuZ2VMaXN0IHRoZSBvcmlnaW5hbCBjaGFuZ2UgbGlzdCBvbiB3aG9zZSBwYXRjaCBzZXQgdGhlCisgICAqICAgICAgICByZWJhc2VkIHBhdGNoIHNldCBkZXBlbmRzCisgICAqIEByZXR1cm4gdGhlIHJldmlzaW9uIG9mIGNvbW1pdCBvbiB3aGljaCB0aGUgZ2l2ZW4gcGF0Y2ggc2V0IHNob3VsZCBiZSBiYXNlZAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRocm93biBpZiByZWJhc2UgaXMgbm90IHBvc3NpYmxlIG9yIG5vdCBuZWVkZWQKKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24gdGhyb3duIGluIGNhc2UgYWNjZXNzaW5nIHRoZSBkYXRhYmFzZSBmYWlscworICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZEJhc2VSZXZpc2lvbihmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLAorICAgICAgICBmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgQnJhbmNoLk5hbWVLZXkgZGVzdEJyYW5jaCwgZmluYWwgUmVwb3NpdG9yeSBnaXQsCisgICAgICAgIExpc3Q8UGF0Y2hTZXRBbmNlc3Rvcj4gcGF0Y2hTZXRBbmNlc3RvcnMsIExpc3Q8UGF0Y2hTZXQ+IGRlcFBhdGNoU2V0TGlzdCwKKyAgICAgICAgTGlzdDxDaGFuZ2U+IGRlcENoYW5nZUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKworICAgICAgU3RyaW5nIGJhc2VSZXYgPSBudWxsOworCisgICAgICBpZiAocGF0Y2hTZXRBbmNlc3RvcnMgPT0gbnVsbCkgeworICAgICAgICBwYXRjaFNldEFuY2VzdG9ycyA9CisgICAgICAgICAgICBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmFuY2VzdG9yc09mKHBhdGNoU2V0SWQpLnRvTGlzdCgpOworICAgICAgfQorCisgICAgICBpZiAocGF0Y2hTZXRBbmNlc3RvcnMuc2l6ZSgpID4gMSkgeworICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAiQ2Fubm90IHJlYmFzZSBhIGNoYW5nZSB3aXRoIG11bHRpcGxlIHBhcmVudHMuIFBhcmVudHMgY29tbWl0czogIgorICAgICAgICAgICAgICAgICsgcGF0Y2hTZXRBbmNlc3RvcnMudG9TdHJpbmcoKSk7CisgICAgICB9CisgICAgICBpZiAocGF0Y2hTZXRBbmNlc3RvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgIkNhbm5vdCByZWJhc2UgYSBjaGFuZ2Ugd2l0aG91dCBhbnkgcGFyZW50cyAoaXMgdGhpcyB0aGUgaW5pdGlhbCBjb21taXQ/KS4iKTsKKyAgICAgIH0KKworICAgICAgUmV2SWQgYW5jZXN0b3JSZXYgPSBwYXRjaFNldEFuY2VzdG9ycy5nZXQoMCkuZ2V0QW5jZXN0b3JSZXZpc2lvbigpOworICAgICAgaWYgKGRlcFBhdGNoU2V0TGlzdCA9PSBudWxsIHx8IGRlcFBhdGNoU2V0TGlzdC5zaXplKCkgIT0gMSB8fAorICAgICAgICAgICFkZXBQYXRjaFNldExpc3QuZ2V0KDApLmdldFJldmlzaW9uKCkuZXF1YWxzKGFuY2VzdG9yUmV2KSkgeworICAgICAgICBkZXBQYXRjaFNldExpc3QgPSBkYi5wYXRjaFNldHMoKS5ieVJldmlzaW9uKGFuY2VzdG9yUmV2KS50b0xpc3QoKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFkZXBQYXRjaFNldExpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgIFBhdGNoU2V0IGRlcFBhdGNoU2V0ID0gZGVwUGF0Y2hTZXRMaXN0LmdldCgwKTsKKworICAgICAgICBDaGFuZ2UuSWQgZGVwQ2hhbmdlSWQgPSBkZXBQYXRjaFNldC5nZXRJZCgpLmdldFBhcmVudEtleSgpOworICAgICAgICBDaGFuZ2UgZGVwQ2hhbmdlOworICAgICAgICBpZiAoZGVwQ2hhbmdlTGlzdCA9PSBudWxsIHx8IGRlcENoYW5nZUxpc3Quc2l6ZSgpICE9IDEgfHwKKyAgICAgICAgICAgICFkZXBDaGFuZ2VMaXN0LmdldCgwKS5nZXRJZCgpLmVxdWFscyhkZXBDaGFuZ2VJZCkpIHsKKyAgICAgICAgICBkZXBDaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuZ2V0KGRlcENoYW5nZUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZXBDaGFuZ2UgPSBkZXBDaGFuZ2VMaXN0LmdldCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXBDaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLkFCQU5ET05FRCkgeworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IHJlYmFzZSBhIGNoYW5nZSB3aXRoIGFuIGFiYW5kb25lZCBwYXJlbnQ6ICIKKyAgICAgICAgICAgICAgKyBkZXBDaGFuZ2UuZ2V0S2V5KCkudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVwQ2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CisgICAgICAgICAgaWYgKGRlcFBhdGNoU2V0LmdldElkKCkuZXF1YWxzKGRlcENoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDaGFuZ2UgaXMgYWxyZWFkeSBiYXNlZCBvbiB0aGUgbGF0ZXN0IHBhdGNoIHNldCBvZiB0aGUgZGVwZW5kZW50IGNoYW5nZS4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgUGF0Y2hTZXQgbGF0ZXN0RGVwUGF0Y2hTZXQgPQorICAgICAgICAgICAgICBkYi5wYXRjaFNldHMoKS5nZXQoZGVwQ2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworICAgICAgICAgIGJhc2VSZXYgPSBsYXRlc3REZXBQYXRjaFNldC5nZXRSZXZpc2lvbigpLmdldCgpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChiYXNlUmV2ID09IG51bGwpIHsKKyAgICAgICAgLy8gV2UgYXJlIGRlcGVuZGVudCBvbiBhIG1lcmdlZCBQYXRjaFNldCBvciBoYXZlIG5vIFBhdGNoU2V0CisgICAgICAgIC8vIGRlcGVuZGVuY2llcyBhdCBhbGwuCisgICAgICAgIFJlZiBkZXN0UmVmID0gZ2l0LmdldFJlZihkZXN0QnJhbmNoLmdldCgpKTsKKyAgICAgICAgaWYgKGRlc3RSZWYgPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIlRoZSBkZXN0aW5hdGlvbiBicmFuY2ggZG9lcyBub3QgZXhpc3Q6ICIKKyAgICAgICAgICAgICAgICAgICsgZGVzdEJyYW5jaC5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgYmFzZVJldiA9IGRlc3RSZWYuZ2V0T2JqZWN0SWQoKS5nZXROYW1lKCk7CisgICAgICAgIGlmIChiYXNlUmV2LmVxdWFscyhhbmNlc3RvclJldi5nZXQoKSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNoYW5nZSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUuIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBiYXNlUmV2OworICAgIH0KKworICAvKioKKyAgICogUmViYXNlcyB0aGUgY2hhbmdlIG9mIHRoZSBnaXZlbiBwYXRjaCBzZXQgb24gdGhlIGdpdmVuIGJhc2UgY29tbWl0LgorICAgKgorICAgKiBUaGUgcmViYXNlZCBjb21taXQgaXMgYWRkZWQgYXMgbmV3IHBhdGNoIHNldCB0byB0aGUgY2hhbmdlLgorICAgKgorICAgKiBFLW1haWwgbm90aWZpY2F0aW9uIGFuZCB0cmlnZ2VyaW5nIG9mIGhvb2tzIGlzIE5PVCBkb25lIGZvciB0aGUgY3JlYXRpb24gb2YKKyAgICogdGhlIG5ldyBwYXRjaCBzZXQuCisgICAqCisgICAqIEBwYXJhbSBnaXQgdGhlIHJlcG9zaXRvcnkKKyAgICogQHBhcmFtIHJldldhbGsgdGhlIFJldldhbGsKKyAgICogQHBhcmFtIGluc2VydGVyIHRoZSBvYmplY3QgaW5zZXJ0ZXIKKyAgICogQHBhcmFtIHBhdGNoU2V0SWQgdGhlIGlkIG9mIHRoZSBwYXRjaCBzZXQKKyAgICogQHBhcmFtIGNoZyB0aGUgY2hhbmdlIHRoYXQgc2hvdWxkIGJlIHJlYmFzZWQKKyAgICogQHBhcmFtIHVwbG9hZGVyIHRoZSB1c2VyIHRoYXQgY3JlYXRlcyB0aGUgcmViYXNlZCBwYXRjaCBzZXQKKyAgICogQHBhcmFtIGJhc2VDb21taXQgdGhlIGNvbW1pdCB0aGF0IHNob3VsZCBiZSB0aGUgbmV3IGJhc2UKKyAgICogQHBhcmFtIG1lcmdlVXRpbCBtZXJnZSB1dGlsaXRpZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBwcm9qZWN0CisgICAqIEByZXR1cm4gdGhlIG5ldyBwYXRjaCBzZXQgd2hpY2ggaXMgYmFzZWQgb24gdGhlIGdpdmVuIGJhc2UgY29tbWl0CisgICAqIEB0aHJvd3MgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIHRocm93biBpZiB0aGUgY2hhbmdlIHRvIHdoaWNoIHRoZSBwYXRjaCBzZXQKKyAgICogICAgICAgICBiZWxvbmdzIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSB1c2VyCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uIHRocm93biBpbiBjYXNlIGFjY2Vzc2luZyB0aGUgZGF0YWJhc2UgZmFpbHMKKyAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgcmViYXNlIGlzIG5vdCBwb3NzaWJsZSBvciBub3QgbmVlZGVkCisgICAqIEB0aHJvd3MgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiB0aHJvd24gaWYgcmViYXNlIGlzIG5vdCBhbGxvd2VkCisgICAqLworICBwdWJsaWMgUGF0Y2hTZXQgcmViYXNlKGZpbmFsIFJlcG9zaXRvcnkgZ2l0LCBmaW5hbCBSZXZXYWxrIHJldldhbGssCisgICAgICBmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwKKyAgICAgIGZpbmFsIENoYW5nZSBjaGcsIGZpbmFsIEFjY291bnQuSWQgdXBsb2FkZXIsIGZpbmFsIFJldkNvbW1pdCBiYXNlQ29tbWl0LAorICAgICAgZmluYWwgTWVyZ2VVdGlsIG1lcmdlVXRpbCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwKKyAgICAgIE9ybUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sCisgICAgICBQYXRoQ29uZmxpY3RFeGNlcHRpb24geworICAgIENoYW5nZSBjaGFuZ2UgPSBjaGc7CisgICAgaWYgKCFjaGcuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMocGF0Y2hTZXRJZCkpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKCJwYXRjaCBzZXQgaXMgbm90IGN1cnJlbnQiKTsKKyAgICB9CisgICAgZmluYWwgUGF0Y2hTZXQgb3JpZ2luYWxQYXRjaFNldCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKKworICAgIGZpbmFsIFJldkNvbW1pdCByZWJhc2VkQ29tbWl0OworICAgIE9iamVjdElkIG9sZElkID0gT2JqZWN0SWQuZnJvbVN0cmluZyhvcmlnaW5hbFBhdGNoU2V0LmdldFJldmlzaW9uKCkuZ2V0KCkpOworICAgIE9iamVjdElkIG5ld0lkID0gcmViYXNlQ29tbWl0KGdpdCwgaW5zZXJ0ZXIsIHJldldhbGsucGFyc2VDb21taXQob2xkSWQpLAorICAgICAgICBiYXNlQ29tbWl0LCBtZXJnZVV0aWwsIG15SWRlbnQpOworCisgICAgcmViYXNlZENvbW1pdCA9IHJldldhbGsucGFyc2VDb21taXQobmV3SWQpOworCisgICAgUGF0Y2hTZXQuSWQgaWQgPSBDaGFuZ2VVdGlsLm5leHRQYXRjaFNldElkKGdpdCwgY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworICAgIGZpbmFsIFBhdGNoU2V0IG5ld1BhdGNoU2V0ID0gbmV3IFBhdGNoU2V0KGlkKTsKKyAgICBuZXdQYXRjaFNldC5zZXRDcmVhdGVkT24obmV3IFRpbWVzdGFtcChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworICAgIG5ld1BhdGNoU2V0LnNldFVwbG9hZGVyKHVwbG9hZGVyKTsKKyAgICBuZXdQYXRjaFNldC5zZXRSZXZpc2lvbihuZXcgUmV2SWQocmViYXNlZENvbW1pdC5uYW1lKCkpKTsKKyAgICBuZXdQYXRjaFNldC5zZXREcmFmdChvcmlnaW5hbFBhdGNoU2V0LmlzRHJhZnQoKSk7CisKKyAgICBmaW5hbCBQYXRjaFNldEluZm8gaW5mbyA9CisgICAgICAgIHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KHJlYmFzZWRDb21taXQsIG5ld1BhdGNoU2V0LmdldElkKCkpOworCisgICAgZmluYWwgUmVmVXBkYXRlIHJ1ID0gZ2l0LnVwZGF0ZVJlZihuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCkpOworICAgIHJ1LnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoT2JqZWN0SWQuemVyb0lkKCkpOworICAgIHJ1LnNldE5ld09iamVjdElkKHJlYmFzZWRDb21taXQpOworICAgIHJ1LmRpc2FibGVSZWZMb2coKTsKKyAgICBpZiAocnUudXBkYXRlKHJldldhbGspICE9IFJlZlVwZGF0ZS5SZXN1bHQuTkVXKSB7CisgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGNyZWF0ZSByZWYgJXMgaW4gJXM6ICVzIiwKKyAgICAgICAgICBuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCksIGNoYW5nZS5nZXREZXN0KCkuZ2V0UGFyZW50S2V5KCkuZ2V0KCksCisgICAgICAgICAgcnUuZ2V0UmVzdWx0KCkpKTsKKyAgICB9CisgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGNoYW5nZS5nZXRQcm9qZWN0KCksIHJ1KTsKKworICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZS5nZXRJZCgpKTsKKyAgICB0cnkgeworICAgICAgQ2hhbmdlIHVwZGF0ZWRDaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuZ2V0KGNoYW5nZS5nZXRJZCgpKTsKKyAgICAgIGlmICh1cGRhdGVkQ2hhbmdlICE9IG51bGwgJiYgY2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CisgICAgICAgIGNoYW5nZSA9IHVwZGF0ZWRDaGFuZ2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkNoYW5nZSAlcyBpcyBjbG9zZWQiLCBjaGFuZ2UuZ2V0SWQoKSkpOworICAgICAgfQorCisgICAgICBDaGFuZ2VVdGlsLmluc2VydEFuY2VzdG9ycyhkYiwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSwgcmViYXNlZENvbW1pdCk7CisgICAgICBkYi5wYXRjaFNldHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ld1BhdGNoU2V0KSk7CisgICAgICB1cGRhdGVkQ2hhbmdlID0KKyAgICAgICAgICBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKGNoYW5nZS5nZXRJZCgpLCBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDaGFuZ2UgdXBkYXRlKENoYW5nZSBjaGFuZ2UpIHsKKyAgICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKS5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKCFjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMocGF0Y2hTZXRJZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpICE9IENoYW5nZS5TdGF0dXMuRFJBRlQpIHsKKyAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0U3RhdHVzKENoYW5nZS5TdGF0dXMuTkVXKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFNoYTFNZXJnZVRlc3RlZChudWxsKTsKKyAgICAgICAgICAgICAgY2hhbmdlLnNldEN1cnJlbnRQYXRjaFNldChpbmZvKTsKKyAgICAgICAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7CisgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSk7CisgICAgICBpZiAodXBkYXRlZENoYW5nZSAhPSBudWxsKSB7CisgICAgICAgIGNoYW5nZSA9IHVwZGF0ZWRDaGFuZ2U7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkNoYW5nZSAlcyB3YXMgbW9kaWZpZWQiLCBjaGFuZ2UuZ2V0SWQoKSkpOworICAgICAgfQorCisgICAgICBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPQorICAgICAgICAgIHByb2plY3RDYWNoZS5nZXQoY2hhbmdlLmdldFByb2plY3QoKSkuZ2V0TGFiZWxUeXBlcygpOworICAgICAgYXBwcm92YWxzVXRpbC5jb3B5VmV0b3NUb1BhdGNoU2V0KGRiLCBsYWJlbFR5cGVzLAorICAgICAgICAgIGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKworICAgICAgZmluYWwgQ2hhbmdlTWVzc2FnZSBjbXNnID0KKyAgICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZShuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoY2hhbmdlLmdldElkKCksCisgICAgICAgICAgICAgIENoYW5nZVV0aWwubWVzc2FnZVVVSUQoZGIpKSwgdXBsb2FkZXIsIHBhdGNoU2V0SWQpOworICAgICAgY21zZy5zZXRNZXNzYWdlKCJQYXRjaCBTZXQgIiArIGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLmdldCgpCisgICAgICAgICAgKyAiOiBQYXRjaCBTZXQgIiArIHBhdGNoU2V0SWQuZ2V0KCkgKyAiIHdhcyByZWJhc2VkIik7CisgICAgICBkYi5jaGFuZ2VNZXNzYWdlcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oY21zZykpOworICAgICAgZGIuY29tbWl0KCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRiLnJvbGxiYWNrKCk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld1BhdGNoU2V0OworICB9CisKKyAgLyoqCisgICAqIFJlYmFzZXMgYSBjb21taXQuCisgICAqCisgICAqIEBwYXJhbSBnaXQgcmVwb3NpdG9yeSB0byBmaW5kIGNvbW1pdHMgaW4KKyAgICogQHBhcmFtIGluc2VydGVyIGluc2VydGVyIHRvIGhhbmRsZSBuZXcgdHJlZXMgYW5kIGJsb2JzCisgICAqIEBwYXJhbSBvcmlnaW5hbCBUaGUgY29tbWl0IHRvIHJlYmFzZQorICAgKiBAcGFyYW0gYmFzZSBCYXNlIHRvIHJlYmFzZSBhZ2FpbnN0CisgICAqIEBwYXJhbSBtZXJnZVV0aWwgbWVyZ2UgdXRpbGl0aWVzIGZvciB0aGUgZGVzdGluYXRpb24gcHJvamVjdAorICAgKiBAcGFyYW0gY29tbWl0dGVySWRlbnQgY29tbWl0dGVyIGlkZW50aXR5CisgICAqIEByZXR1cm4gdGhlIGlkIG9mIHRoZSByZWJhc2VkIGNvbW1pdAorICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIE1lcmdlZCBmYWlsZWQKKyAgICogQHRocm93cyBQYXRoQ29uZmxpY3RFeGNlcHRpb24gdGhlIHJlYmFzZSBmYWlsZWQgZHVlIHRvIGEgcGF0aCBjb25mbGljdAorICAgKi8KKyAgcHJpdmF0ZSBPYmplY3RJZCByZWJhc2VDb21taXQoZmluYWwgUmVwb3NpdG9yeSBnaXQsCisgICAgICBmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgZmluYWwgUmV2Q29tbWl0IG9yaWdpbmFsLAorICAgICAgZmluYWwgUmV2Q29tbWl0IGJhc2UsIGZpbmFsIE1lcmdlVXRpbCBtZXJnZVV0aWwsCisgICAgICBmaW5hbCBQZXJzb25JZGVudCBjb21taXR0ZXJJZGVudCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgUGF0aENvbmZsaWN0RXhjZXB0aW9uIHsKKworICAgIGZpbmFsIFJldkNvbW1pdCBwYXJlbnRDb21taXQgPSBvcmlnaW5hbC5nZXRQYXJlbnQoMCk7CisKKyAgICBpZiAoYmFzZS5lcXVhbHMocGFyZW50Q29tbWl0KSkgeworICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDaGFuZ2UgaXMgYWxyZWFkeSB1cCB0byBkYXRlLiIpOworICAgIH0KKworICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG1lcmdlciA9IG1lcmdlVXRpbC5uZXdUaHJlZVdheU1lcmdlcihnaXQsIGluc2VydGVyKTsKKyAgICBtZXJnZXIuc2V0QmFzZShwYXJlbnRDb21taXQpOworICAgIG1lcmdlci5tZXJnZShvcmlnaW5hbCwgYmFzZSk7CisKKyAgICBpZiAobWVyZ2VyLmdldFJlc3VsdFRyZWVJZCgpID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBQYXRoQ29uZmxpY3RFeGNlcHRpb24oCisgICAgICAgICAgIlRoZSBjaGFuZ2UgY291bGQgbm90IGJlIHJlYmFzZWQgZHVlIHRvIGEgcGF0aCBjb25mbGljdCBkdXJpbmcgbWVyZ2UuIik7CisgICAgfQorCisgICAgZmluYWwgQ29tbWl0QnVpbGRlciBjYiA9IG5ldyBDb21taXRCdWlsZGVyKCk7CisgICAgY2Iuc2V0VHJlZUlkKG1lcmdlci5nZXRSZXN1bHRUcmVlSWQoKSk7CisgICAgY2Iuc2V0UGFyZW50SWQoYmFzZSk7CisgICAgY2Iuc2V0QXV0aG9yKG9yaWdpbmFsLmdldEF1dGhvcklkZW50KCkpOworICAgIGNiLnNldE1lc3NhZ2Uob3JpZ2luYWwuZ2V0RnVsbE1lc3NhZ2UoKSk7CisgICAgY2Iuc2V0Q29tbWl0dGVyKGNvbW1pdHRlcklkZW50KTsKKyAgICBmaW5hbCBPYmplY3RJZCBvYmplY3RJZCA9IGluc2VydGVyLmluc2VydChjYik7CisgICAgaW5zZXJ0ZXIuZmx1c2goKTsKKyAgICByZXR1cm4gb2JqZWN0SWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuRG9SZWJhc2UoZmluYWwgUmV2aWV3RGIgZGIsCisgICAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAorICAgICAgTGlzdDxQYXRjaFNldEFuY2VzdG9yPiBwYXRjaFNldEFuY2VzdG9ycywKKyAgICAgIExpc3Q8UGF0Y2hTZXQ+IGRlcFBhdGNoU2V0TGlzdCwgTGlzdDxDaGFuZ2U+IGRlcENoYW5nZUxpc3QpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIFJlcG9zaXRvcnkgZ2l0ID0gZ2l0TWFuYWdlci5vcGVuUmVwb3NpdG9yeShjaGFuZ2UuZ2V0UHJvamVjdCgpKTsKKworICAgIHRyeSB7CisgICAgICAvLyBJZiBubyBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHdlIGNhbiBkbyBhIHJlYmFzZS4KKyAgICAgIGZpbmRCYXNlUmV2aXNpb24oY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCksIGRiLCBjaGFuZ2UuZ2V0RGVzdCgpLCBnaXQsCisgICAgICAgICAgcGF0Y2hTZXRBbmNlc3RvcnMsIGRlcFBhdGNoU2V0TGlzdCwgZGVwQ2hhbmdlTGlzdCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGdpdC5jbG9zZSgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUmVzdG9yZUNoYW5nZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvUmVzdG9yZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2RhMmI2Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY2hhbmdlZGV0YWlsL1Jlc3RvcmVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlByb2plY3RVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVzdG9yZWRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuQXRvbWljVXBkYXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKLQotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVzdG9yZUNoYW5nZSBpbXBsZW1lbnRzIENhbGxhYmxlPFJldmlld1Jlc3VsdD4gewotCi0gIHByaXZhdGUgZmluYWwgUmVzdG9yZWRTZW5kZXIuRmFjdG9yeSByZXN0b3JlZFNlbmRlckZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOwotICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOwotICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOwotCi0gIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gdHJ1ZSwgbXVsdGlWYWx1ZWQgPSBmYWxzZSwKLSAgICAgICAgICAgIHVzYWdlID0gImNoYW5nZSB0byByZXN0b3JlIiwgbWV0YVZhciA9ICJDSEFOR0UiKQotICBwcml2YXRlIENoYW5nZS5JZCBjaGFuZ2VJZDsKLSAgcHVibGljIHZvaWQgc2V0Q2hhbmdlSWQoZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkKSB7Ci0gICAgdGhpcy5jaGFuZ2VJZCA9IGNoYW5nZUlkOwotICB9Ci0KLSAgQE9wdGlvbihuYW1lID0gIi0tbWVzc2FnZSIsIGFsaWFzZXMgPSB7Ii1tIn0sCi0gICAgICAgICAgdXNhZ2UgPSAib3B0aW9uYWwgbWVzc2FnZSB0byBhcHBlbmQgdG8gY2hhbmdlIikKLSAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0KLQotICBASW5qZWN0Ci0gIFJlc3RvcmVDaGFuZ2UoZmluYWwgUmVzdG9yZWRTZW5kZXIuRmFjdG9yeSByZXN0b3JlZFNlbmRlckZhY3RvcnksCi0gICAgICBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksIGZpbmFsIFJldmlld0RiIGRiLAotICAgICAgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLAotICAgICAgZmluYWwgQ2hhbmdlSG9va3MgaG9va3MpIHsKLSAgICB0aGlzLnJlc3RvcmVkU2VuZGVyRmFjdG9yeSA9IHJlc3RvcmVkU2VuZGVyRmFjdG9yeTsKLSAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKLSAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7Ci0gICAgdGhpcy5ob29rcyA9IGhvb2tzOwotCi0gICAgY2hhbmdlSWQgPSBudWxsOwotICAgIG1lc3NhZ2UgPSBudWxsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBSZXZpZXdSZXN1bHQgY2FsbCgpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiwgTm9TdWNoQ2hhbmdlRXhjZXB0aW9uLAotICAgICAgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uLAotICAgICAgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGNoYW5nZUlkID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKCJjaGFuZ2VJZCBpcyByZXF1aXJlZCIpOwotICAgIH0KLQotICAgIGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQgPSBuZXcgUmV2aWV3UmVzdWx0KCk7Ci0gICAgcmVzdWx0LnNldENoYW5nZUlkKGNoYW5nZUlkKTsKLQotICAgIGZpbmFsIENoYW5nZUNvbnRyb2wgY29udHJvbCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKLSAgICBmaW5hbCBDaGFuZ2UgY2hhbmdlID0gZGIuY2hhbmdlcygpLmdldChjaGFuZ2VJZCk7Ci0gICAgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCA9IGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpOwotICAgIGlmICghY29udHJvbC5jYW5SZXN0b3JlKCkpIHsKLSAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3UmVzdWx0LkVycm9yKAotICAgICAgICAgIFJldmlld1Jlc3VsdC5FcnJvci5UeXBlLlJFU1RPUkVfTk9UX1BFUk1JVFRFRCkpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBmaW5hbCBQYXRjaFNldCBwYXRjaCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKLSAgICBpZiAocGF0Y2ggPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7Ci0gICAgfQotCi0gICAgZmluYWwgQnJhbmNoLk5hbWVLZXkgZGVzdEJyYW5jaCA9IGNvbnRyb2wuZ2V0Q2hhbmdlKCkuZ2V0RGVzdCgpOwotICAgIGlmICghUHJvamVjdFV0aWwuYnJhbmNoRXhpc3RzKHJlcG9NYW5hZ2VyLCBkZXN0QnJhbmNoKSkgewotICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuREVTVF9CUkFOQ0hfTk9UX0ZPVU5ELCBkZXN0QnJhbmNoLmdldCgpKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBhIG1lc3NhZ2UgdG8gYWNjb21wYW55IHRoZSByZXN0b3JlZCBjaGFuZ2UKLSAgICBmaW5hbCBDaGFuZ2VNZXNzYWdlIGNtc2cgPQotICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZShuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoY2hhbmdlSWQsIENoYW5nZVV0aWwKLSAgICAgICAgICAgIC5tZXNzYWdlVVVJRChkYikpLCBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSwgcGF0Y2hTZXRJZCk7Ci0gICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2dCdWYgPQotICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiUGF0Y2ggU2V0ICIgKyBwYXRjaFNldElkLmdldCgpICsgIjogUmVzdG9yZWQiKTsKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICBtc2dCdWYuYXBwZW5kKCJcblxuIik7Ci0gICAgICBtc2dCdWYuYXBwZW5kKG1lc3NhZ2UpOwotICAgIH0KLSAgICBjbXNnLnNldE1lc3NhZ2UobXNnQnVmLnRvU3RyaW5nKCkpOwotCi0gICAgLy8gUmVzdG9yZSB0aGUgY2hhbmdlCi0gICAgZmluYWwgQ2hhbmdlIHVwZGF0ZWRDaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuYXRvbWljVXBkYXRlKGNoYW5nZUlkLAotICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkFCQU5ET05FRCkgewotICAgICAgICAgICAgICBjaGFuZ2Uuc2V0U3RhdHVzKENoYW5nZS5TdGF0dXMuTkVXKTsKLSAgICAgICAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7Ci0gICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgaWYgKHVwZGF0ZWRDaGFuZ2UgPT0gbnVsbCkgewotICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuQ0hBTkdFX05PVF9BQkFORE9ORUQpKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQ2hhbmdlVXRpbC51cGRhdGVkQ2hhbmdlKGRiLCBjdXJyZW50VXNlciwgdXBkYXRlZENoYW5nZSwgY21zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZWRTZW5kZXJGYWN0b3J5KTsKLSAgICBob29rcy5kb0NoYW5nZVJlc3RvcmVkSG9vayh1cGRhdGVkQ2hhbmdlLCBjdXJyZW50VXNlci5nZXRBY2NvdW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2VkZXRhaWwvU3VibWl0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9TdWJtaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4N2FhMS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZWRldGFpbC9TdWJtaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbDsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5SZXZpZXdSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlByb2plY3RVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZU9wOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWVyZ2VRdWV1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotCi1wdWJsaWMgY2xhc3MgU3VibWl0IGltcGxlbWVudHMgQ2FsbGFibGU8UmV2aWV3UmVzdWx0PiB7Ci0KLSAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBTdWJtaXQgY3JlYXRlKFBhdGNoU2V0LklkIHBhdGNoU2V0SWQpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgTWVyZ2VPcC5GYWN0b3J5IG9wRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBNZXJnZVF1ZXVlIG1lcmdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlcjsKLQotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQ7Ci0KLSAgQEluamVjdAotICBTdWJtaXQoZmluYWwgQ2hhbmdlQ29udHJvbC5GYWN0b3J5IGNoYW5nZUNvbnRyb2xGYWN0b3J5LAotICAgICAgZmluYWwgTWVyZ2VPcC5GYWN0b3J5IG9wRmFjdG9yeSwgZmluYWwgTWVyZ2VRdWV1ZSBtZXJnZXIsCi0gICAgICBmaW5hbCBSZXZpZXdEYiBkYiwgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciwgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQpIHsKLSAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gICAgdGhpcy5vcEZhY3RvcnkgPSBvcEZhY3Rvcnk7Ci0gICAgdGhpcy5tZXJnZXIgPSBtZXJnZXI7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKLSAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7Ci0KLSAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBSZXZpZXdSZXN1bHQgY2FsbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sCi0gICAgICBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uLCBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwKLSAgICAgIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0gbmV3IFJldmlld1Jlc3VsdCgpOwotCi0gICAgZmluYWwgUGF0Y2hTZXQgcGF0Y2ggPSBkYi5wYXRjaFNldHMoKS5nZXQocGF0Y2hTZXRJZCk7Ci0gICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKLSAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihjaGFuZ2VJZCk7Ci0gICAgcmVzdWx0LnNldENoYW5nZUlkKGNoYW5nZUlkKTsKLSAgICBpZiAocGF0Y2ggPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE5vU3VjaENoYW5nZUV4Y2VwdGlvbihjaGFuZ2VJZCk7Ci0gICAgfQotCi0gICAgTGlzdDxTdWJtaXRSZWNvcmQ+IHN1Ym1pdFJlc3VsdCA9IGNvbnRyb2wuY2FuU3VibWl0KGRiLCBwYXRjaCk7Ci0gICAgaWYgKHN1Ym1pdFJlc3VsdC5pc0VtcHR5KCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgIkNoYW5nZUNvbnRyb2wuY2FuU3VibWl0IHJldHVybmVkIGVtcHR5IGxpc3QiKTsKLSAgICB9Ci0KLSAgICBmb3IgKFN1Ym1pdFJlY29yZCBzdWJtaXRSZWNvcmQgOiBzdWJtaXRSZXN1bHQpIHsKLSAgICAgIHN3aXRjaCAoc3VibWl0UmVjb3JkLnN0YXR1cykgewotICAgICAgICBjYXNlIE9LOgotICAgICAgICAgIGlmICghY29udHJvbC5nZXRSZWZDb250cm9sKCkuY2FuU3VibWl0KCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3UmVzdWx0LkVycm9yKAotICAgICAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5TVUJNSVRfTk9UX1BFUk1JVFRFRCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE5PVF9SRUFEWToKLSAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVyck1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgZm9yIChTdWJtaXRSZWNvcmQuTGFiZWwgbGJsIDogc3VibWl0UmVjb3JkLmxhYmVscykgewotICAgICAgICAgICAgc3dpdGNoIChsYmwuc3RhdHVzKSB7Ci0gICAgICAgICAgICAgIGNhc2UgT0s6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBSRUpFQ1Q6Ci0gICAgICAgICAgICAgICAgaWYgKGVyck1zZy5sZW5ndGgoKSA+IDApIGVyck1zZy5hcHBlbmQoIjsgIik7Ci0gICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiY2hhbmdlICIgKyBjaGFuZ2VJZCArICI6IGJsb2NrZWQgYnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYmwubGFiZWwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgTkVFRDoKLSAgICAgICAgICAgICAgICBpZiAoZXJyTXNnLmxlbmd0aCgpID4gMCkgZXJyTXNnLmFwcGVuZCgiOyAiKTsKLSAgICAgICAgICAgICAgICBlcnJNc2cuYXBwZW5kKCJjaGFuZ2UgIiArIGNoYW5nZUlkICsgIjogbmVlZHMgIiArIGxibC5sYWJlbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBNQVk6Ci0gICAgICAgICAgICAgICAgLy8gVGhlIE1BWSBsYWJlbCBkaWRuJ3QgY2F1c2UgdGhlIE5PVF9SRUFEWSBzdGF0dXMKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIElNUE9TU0lCTEU6Ci0gICAgICAgICAgICAgICAgaWYgKGVyck1zZy5sZW5ndGgoKSA+IDApIGVyck1zZy5hcHBlbmQoIjsgIik7Ci0gICAgICAgICAgICAgICAgZXJyTXNnLmFwcGVuZCgiY2hhbmdlICIgKyBjaGFuZ2VJZCArICI6IG5lZWRzICIgKyBsYmwubGFiZWwKLSAgICAgICAgICAgICAgICAgICAgKyAiIChjaGVjayBwcm9qZWN0IGFjY2VzcykiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBTdWJtaXRSZWNvcmQuTGFiZWwuc3RhdHVzICgiICsgbGJsLnN0YXR1cwotICAgICAgICAgICAgICAgICAgICArICIpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3UmVzdWx0LkVycm9yKAotICAgICAgICAgICAgUmV2aWV3UmVzdWx0LkVycm9yLlR5cGUuU1VCTUlUX05PVF9SRUFEWSwgZXJyTXNnLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENMT1NFRDoKLSAgICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKLSAgICAgICAgICAgIFJldmlld1Jlc3VsdC5FcnJvci5UeXBlLkNIQU5HRV9JU19DTE9TRUQpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJVTEVfRVJST1I6Ci0gICAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5SVUxFX0VSUk9SLAotICAgICAgICAgICAgc3VibWl0UmVzdWx0LmdldCgwKS5lcnJvck1lc3NhZ2UpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBTdWJtaXRSZWNvcmQuc3RhdHVzICsgKCIgKyBzdWJtaXRSZWNvcmQuc3RhdHVzCi0gICAgICAgICAgICAgICsgIikiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIVByb2plY3RVdGlsLmJyYW5jaEV4aXN0cyhyZXBvTWFuYWdlciwgY29udHJvbC5nZXRDaGFuZ2UoKS5nZXREZXN0KCkpKSB7Ci0gICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld1Jlc3VsdC5FcnJvcigKLSAgICAgICAgICBSZXZpZXdSZXN1bHQuRXJyb3IuVHlwZS5ERVNUX0JSQU5DSF9OT1RfRk9VTkQsCi0gICAgICAgICAgIkRlc3RpbmF0aW9uIGJyYW5jaCBcIiIgKyBjb250cm9sLmdldENoYW5nZSgpLmdldERlc3QoKS5nZXQoKQotICAgICAgICAgICAgICArICJcIiBub3QgZm91bmQuIikpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBTdWJtaXQgdGhlIGNoYW5nZSBpZiB3ZSBjYW4KLSAgICBpZiAocmVzdWx0LmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotICAgICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhbGxBcHByb3ZhbHMgPQotICAgICAgICAgIG5ldyBBcnJheUxpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4oZGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0KAotICAgICAgICAgICAgICBwYXRjaFNldElkKS50b0xpc3QoKSk7Ci0KLSAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwuS2V5IGFrZXkgPQotICAgICAgICAgIG5ldyBQYXRjaFNldEFwcHJvdmFsLktleShwYXRjaFNldElkLCBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCTUlUKTsKLQotICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBhcHByb3ZhbCA9IG5ldyBQYXRjaFNldEFwcHJvdmFsKGFrZXksIChzaG9ydCkgMSk7Ci0gICAgICBmb3IgKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2FuZGlkYXRlQXBwcm92YWwgOiBhbGxBcHByb3ZhbHMpIHsKLSAgICAgICAgaWYgKGFrZXkuZXF1YWxzKGNhbmRpZGF0ZUFwcHJvdmFsLmdldEtleSgpKSkgewotICAgICAgICAgIGNhbmRpZGF0ZUFwcHJvdmFsLnNldFZhbHVlKChzaG9ydCkgMSk7Ci0gICAgICAgICAgY2FuZGlkYXRlQXBwcm92YWwuc2V0R3JhbnRlZCgpOwotICAgICAgICAgIGFwcHJvdmFsID0gY2FuZGlkYXRlQXBwcm92YWw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkudXBzZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihhcHByb3ZhbCkpOwotCi0gICAgICBmaW5hbCBDaGFuZ2UgdXBkYXRlZENoYW5nZSA9IGRiLmNoYW5nZXMoKS5hdG9taWNVcGRhdGUoY2hhbmdlSWQsCi0gICAgICAgICAgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5ORVcpIHsKLSAgICAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5TVUJNSVRURUQpOwotICAgICAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGNoYW5nZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBpZiAodXBkYXRlZENoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLlNVQk1JVFRFRCkgewotICAgICAgICBtZXJnZXIubWVyZ2Uob3BGYWN0b3J5LCB1cGRhdGVkQ2hhbmdlLmdldERlc3QoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0FwcHJvdmFsVHlwZXNQcm92aWRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQXBwcm92YWxUeXBlc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTQxNmQuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQXBwcm92YWxUeXBlc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgQXBwcm92YWxUeXBlc1Byb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8QXBwcm92YWxUeXBlcz4gewotICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYTsKLQotICBASW5qZWN0Ci0gIEFwcHJvdmFsVHlwZXNQcm92aWRlcihmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzZikgewotICAgIHNjaGVtYSA9IHNmOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBBcHByb3ZhbFR5cGVzIGdldCgpIHsKLSAgICBMaXN0PEFwcHJvdmFsVHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmFsVHlwZT4oMik7Ci0KLSAgICB0cnkgewotICAgICAgZmluYWwgUmV2aWV3RGIgZGIgPSBzY2hlbWEub3BlbigpOwotICAgICAgdHJ5IHsKLSAgICAgICAgZm9yIChmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGMgOiBkYi5hcHByb3ZhbENhdGVnb3JpZXMoKS5hbGwoKSkgewotICAgICAgICAgIGZpbmFsIExpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPiB2YWx1ZXMgPQotICAgICAgICAgICAgICBkYi5hcHByb3ZhbENhdGVnb3J5VmFsdWVzKCkuYnlDYXRlZ29yeShjLmdldElkKCkpLnRvTGlzdCgpOwotICAgICAgICAgIHR5cGVzLmFkZChuZXcgQXBwcm92YWxUeXBlKGMsIHZhbHVlcykpOwotICAgICAgICB9Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICBkYi5jbG9zZSgpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJDYW5ub3QgcXVlcnkgYXBwcm92YWwgY2F0ZWdvcmllcyIsIGUpOwotICAgIH0KLQotICAgIHJldHVybiBuZXcgQXBwcm92YWxUeXBlcyhDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHR5cGVzKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0F1dGhDb25maWcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0F1dGhDb25maWcuamF2YQppbmRleCA5OTE2MjU3Li45YTgwNGMxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9BdXRoQ29uZmlnLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQXV0aENvbmZpZy5qYXZhCkBAIC0xNCw5ICsxNCw5IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZzsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5hdXRoLm9wZW5pZC5PcGVuSWRQcm92aWRlclBhdHRlcm47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRFeHRlcm5hbElkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BdXRoVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYXV0aC5vcGVuaWQuT3BlbklkUHJvdmlkZXJQYXR0ZXJuOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5zZXJ2ZXIuU2lnbmVkVG9rZW47CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rqc29ucnBjLnNlcnZlci5Yc3JmRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNDAsNiArNDEsNyBAQAogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZ2l0QmFzaWNBdXRoOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBsb2dvdXRVcmw7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG9wZW5JZFNzb1VybDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gb3BlbklkRG9tYWluczsKICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9wZW5JZFByb3ZpZGVyUGF0dGVybj4gdHJ1c3RlZE9wZW5JRHM7CiAgIHByaXZhdGUgZmluYWwgTGlzdDxPcGVuSWRQcm92aWRlclBhdHRlcm4+IGFsbG93ZWRPcGVuSURzOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb29raWVQYXRoOwpAQCAtNTYsNiArNTgsNyBAQAogICAgIGh0dHBIZWFkZXIgPSBjZmcuZ2V0U3RyaW5nKCJhdXRoIiwgbnVsbCwgImh0dHBoZWFkZXIiKTsKICAgICBsb2dvdXRVcmwgPSBjZmcuZ2V0U3RyaW5nKCJhdXRoIiwgbnVsbCwgImxvZ291dHVybCIpOwogICAgIG9wZW5JZFNzb1VybCA9IGNmZy5nZXRTdHJpbmcoImF1dGgiLCBudWxsLCAib3Blbmlkc3NvdXJsIik7CisgICAgb3BlbklkRG9tYWlucyA9IEFycmF5cy5hc0xpc3QoY2ZnLmdldFN0cmluZ0xpc3QoImF1dGgiLCBudWxsLCAib3BlbklkRG9tYWluIikpOwogICAgIHRydXN0ZWRPcGVuSURzID0gdG9QYXR0ZXJucyhjZmcsICJ0cnVzdGVkT3BlbklEIik7CiAgICAgYWxsb3dlZE9wZW5JRHMgPSB0b1BhdHRlcm5zKGNmZywgImFsbG93ZWRPcGVuSUQiKTsKICAgICBjb29raWVQYXRoID0gY2ZnLmdldFN0cmluZygiYXV0aCIsIG51bGwsICJjb29raWVwYXRoIik7CkBAIC0xMjcsNiArMTMwLDEwIEBACiAgICAgcmV0dXJuIG9wZW5JZFNzb1VybDsKICAgfQogCisgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0T3BlbklkRG9tYWlucygpIHsKKyAgICByZXR1cm4gb3BlbklkRG9tYWluczsKKyAgfQorCiAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29va2llUGF0aCgpIHsKICAgICByZXR1cm4gY29va2llUGF0aDsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQ29uZmlnU2VjdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQ29uZmlnU2VjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1N2NlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9Db25maWdTZWN0aW9uLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKKy8qKiBQcm92aWRlcyBhY2Nlc3MgdG8gb25lIHNlY3Rpb24gZnJvbSB7QGxpbmsgQ29uZmlnfSAqLworcHVibGljIGNsYXNzIENvbmZpZ1NlY3Rpb24geworCisgIHByaXZhdGUgZmluYWwgQ29uZmlnIGNmZzsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VjdGlvbjsKKworICBwdWJsaWMgQ29uZmlnU2VjdGlvbihDb25maWcgY2ZnLCBTdHJpbmcgc2VjdGlvbikgeworICAgIHRoaXMuY2ZnID0gY2ZnOworICAgIHRoaXMuc2VjdGlvbiA9IHNlY3Rpb247CisgIH0KKworICBwdWJsaWMgU3RyaW5nIG9wdGlvbmFsKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIGNmZy5nZXRTdHJpbmcoc2VjdGlvbiwgbnVsbCwgbmFtZSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIHJlcXVpcmVkKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIENvbmZpZ1V0aWwuZ2V0UmVxdWlyZWQoY2ZnLCBzZWN0aW9uLCBuYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQ29uZmlnVXRpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvQ29uZmlnVXRpbC5qYXZhCmluZGV4IGNjNTQwNTQuLjk1YzE1MDAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0NvbmZpZ1V0aWwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9Db25maWdVdGlsLmphdmEKQEAgLTEwMiw3ICsxMDIsNyBAQAogICAgICAgZmluYWwgU3RyaW5nIHN1YnNlY3Rpb24sIGZpbmFsIFN0cmluZyBzZXR0aW5nLCBTdHJpbmcgdmFsdWVTdHJpbmcsCiAgICAgICBmaW5hbCBUW10gYWxsKSB7CiAKLSAgICBTdHJpbmcgbiA9IHZhbHVlU3RyaW5nLnJlcGxhY2UoJyAnLCAnXycpOworICAgIFN0cmluZyBuID0gdmFsdWVTdHJpbmcucmVwbGFjZSgnICcsICdfJykucmVwbGFjZSgnLScsICdfJyk7CiAgICAgZm9yIChmaW5hbCBUIGUgOiBhbGwpIHsKICAgICAgIGlmIChlcXVhbHNJZ25vcmVDYXNlKGUubmFtZSgpLCBuKSkgewogICAgICAgICByZXR1cm4gZTsKQEAgLTI4Niw2ICsyODYsMTUgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXF1aXJlZChDb25maWcgY2ZnLCBTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIG5hbWUpIHsKKyAgICBmaW5hbCBTdHJpbmcgdiA9IGNmZy5nZXRTdHJpbmcoc2VjdGlvbiwgbnVsbCwgbmFtZSk7CisgICAgaWYgKHYgPT0gbnVsbCB8fCAiIi5lcXVhbHModikpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vICIgKyBzZWN0aW9uICsgIi4iICsgbmFtZQorICAgICAgICAgICsgIiBjb25maWd1cmVkIik7CisgICAgfQorICAgIHJldHVybiB2OworICB9CisKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaChmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nLi4uIGNhc2VzKSB7CiAgICAgZm9yIChmaW5hbCBTdHJpbmcgYiA6IGNhc2VzKSB7CiAgICAgICBpZiAoZXF1YWxzSWdub3JlQ2FzZShhLCBiKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvR2Vycml0R2xvYmFsTW9kdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9HZXJyaXRHbG9iYWxNb2R1bGUuamF2YQppbmRleCAyYTY2NzA2Li4xZGE2MTFjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9HZXJyaXRHbG9iYWxNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9HZXJyaXRHbG9iYWxNb2R1bGUuamF2YQpAQCAtMTgsOSArMTgsMTAgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0LkF1ZGl0TW9kdWxlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUxpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5OZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNJdGVtOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXV0aFR5cGU7CkBAIC0zMSw1MCArMzIsODAgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkludGVybmFsVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuTWltZVV0aWxGaWxlVHlwZVJlZ2lzdHJ5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5QbHVnaW5Vc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRCeUVtYWlsQ2FjaGVJbXBsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZUltcGw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm9DYWNoZUZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRWaXNpYmlsaXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRWaXNpYmlsaXR5UHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQ2FwYWJpbGl0eUNvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQ2hhbmdlVXNlck5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuRGVmYXVsdFJlYWxtOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkVtYWlsRXhwYW5kZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBCYWNrZW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGVJbXBsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cERldGFpbEZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBJbmNsdWRlQ2FjaGVJbXBsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwSW5mb0NhY2hlRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cE1lbWJlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkludGVybmFsR3JvdXBCYWNrZW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlBlcmZvcm1DcmVhdGVHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5QZXJmb3JtUmVuYW1lR3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuUmVhbG07CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuVW5pdmVyc2FsR3JvdXBCYWNrZW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkF1dGhCYWNrZW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkludGVybmFsQXV0aEJhY2tlbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguVW5pdmVyc2FsQXV0aEJhY2tlbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGgubGRhcC5MZGFwTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdmF0YXIuQXZhdGFyUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNhY2hlLkNhY2hlUmVtb3ZhbExpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuRXZlbnRGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQ2hhbmdlQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5DaGFuZ2VNZXJnZVF1ZXVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2FyYmFnZUNvbGxlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZVF1ZXVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWVyZ2VVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTm90ZXNCcmFuY2hVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUmVsb2FkU3VibWl0UXVldWVPcDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlRhZ0NhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuVHJhbnNmZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC52YWxpZGF0b3JzLkNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdG9yczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5BZGRSZXZpZXdlclNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Db21taXRNZXNzYWdlRWRpdGVkU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkNyZWF0ZUNoYW5nZVNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5FbWFpbE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Gcm9tQWRkcmVzc0dlbmVyYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Gcm9tQWRkcmVzc0dlbmVyYXRvclByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1lcmdlRmFpbFNlbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5NZXJnZWRTZW5kZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmViYXNlZFBhdGNoU2V0U2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlcGxhY2VQYXRjaFNldFNlbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5WZWxvY2l0eVJ1bnRpbWVQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0Q2FjaGVJbXBsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkFjY2Vzc0NvbnRyb2xNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5QZXJmb3JtQ3JlYXRlUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5QZXJtaXNzaW9uQ29sbGVjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGVJbXBsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3ROb2RlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TZWN0aW9uU29ydENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlUXVlcnlCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlUXVlcnlSZXdyaXRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEFkZHJlc3Nlc01vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudG9vbHMuVG9vbHNDYXRhbG9nOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLklkR2VuZXJhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlRocmVhZExvY2FsUmVxdWVzdENvbnRleHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93LkZ1bmN0aW9uU3RhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOwogCkBAIC0xMDcsMTEgKzEzOCwxMCBAQAogCiAgICAgICBkZWZhdWx0OgogICAgICAgICBiaW5kKFJlYWxtLmNsYXNzKS50byhEZWZhdWx0UmVhbG0uY2xhc3MpOworICAgICAgICBEeW5hbWljU2V0LmJpbmQoYmluZGVyKCksIEF1dGhCYWNrZW5kLmNsYXNzKS50byhJbnRlcm5hbEF1dGhCYWNrZW5kLmNsYXNzKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgYmluZChBcHByb3ZhbFR5cGVzLmNsYXNzKS50b1Byb3ZpZGVyKEFwcHJvdmFsVHlwZXNQcm92aWRlci5jbGFzcykuaW4oCi0gICAgICAgIFNJTkdMRVRPTik7CiAgICAgYmluZChFbWFpbEV4cGFuZGVyLmNsYXNzKS50b1Byb3ZpZGVyKEVtYWlsRXhwYW5kZXJQcm92aWRlci5jbGFzcykuaW4oCiAgICAgICAgIFNJTkdMRVRPTik7CiAKQEAgLTEyNSwyNyArMTU1LDU1IEBACiAgICAgaW5zdGFsbChQcm9qZWN0Q2FjaGVJbXBsLm1vZHVsZSgpKTsKICAgICBpbnN0YWxsKFNlY3Rpb25Tb3J0Q2FjaGUubW9kdWxlKCkpOwogICAgIGluc3RhbGwoVGFnQ2FjaGUubW9kdWxlKCkpOworICAgIGluc3RhbGwoQ2hhbmdlQ2FjaGUubW9kdWxlKCkpOworCiAgICAgaW5zdGFsbChuZXcgQWNjZXNzQ29udHJvbE1vZHVsZSgpKTsKKyAgICBpbnN0YWxsKG5ldyBFbWFpbE1vZHVsZSgpKTsKICAgICBpbnN0YWxsKG5ldyBHaXRNb2R1bGUoKSk7CiAgICAgaW5zdGFsbChuZXcgUHJvbG9nTW9kdWxlKCkpOworICAgIGluc3RhbGwobmV3IFNzaEFkZHJlc3Nlc01vZHVsZSgpKTsKICAgICBpbnN0YWxsKFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQubW9kdWxlKCkpOwogCisgICAgYmluZChBY2NvdW50UmVzb2x2ZXIuY2xhc3MpOworICAgIGJpbmQoQ2hhbmdlUXVlcnlSZXdyaXRlci5jbGFzcyk7CisKICAgICBmYWN0b3J5KEFjY291bnRJbmZvQ2FjaGVGYWN0b3J5LkZhY3RvcnkuY2xhc3MpOworICAgIGZhY3RvcnkoQWRkUmV2aWV3ZXJTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KENoYW5nZVF1ZXJ5QnVpbGRlci5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KENvbW1pdE1lc3NhZ2VFZGl0ZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShDcmVhdGVDaGFuZ2VTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShHcm91cEluZm9DYWNoZUZhY3RvcnkuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShHcm91cE1lbWJlcnMuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShJbnRlcm5hbFVzZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShNZXJnZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShNZXJnZUZhaWxTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShNZXJnZVV0aWwuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShQZXJmb3JtQ3JlYXRlR3JvdXAuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShQZXJmb3JtUmVuYW1lR3JvdXAuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShQbHVnaW5Vc2VyLkZhY3RvcnkuY2xhc3MpOwogICAgIGZhY3RvcnkoUHJvamVjdE5vZGUuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShQcm9qZWN0U3RhdGUuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShSZWJhc2VkUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShSZXBsYWNlUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShQZXJmb3JtQ3JlYXRlUHJvamVjdC5GYWN0b3J5LmNsYXNzKTsKKyAgICBmYWN0b3J5KEdhcmJhZ2VDb2xsZWN0aW9uLkZhY3RvcnkuY2xhc3MpOwogICAgIGJpbmQoUGVybWlzc2lvbkNvbGxlY3Rpb24uRmFjdG9yeS5jbGFzcyk7CiAgICAgYmluZChBY2NvdW50VmlzaWJpbGl0eS5jbGFzcykKICAgICAgICAgLnRvUHJvdmlkZXIoQWNjb3VudFZpc2liaWxpdHlQcm92aWRlci5jbGFzcykKICAgICAgICAgLmluKFNJTkdMRVRPTik7CiAKKyAgICBiaW5kKEF1dGhCYWNrZW5kLmNsYXNzKS50byhVbml2ZXJzYWxBdXRoQmFja2VuZC5jbGFzcykuaW4oU0lOR0xFVE9OKTsKKyAgICBEeW5hbWljU2V0LnNldE9mKGJpbmRlcigpLCBBdXRoQmFja2VuZC5jbGFzcyk7CisKICAgICBiaW5kKEdyb3VwQ29udHJvbC5GYWN0b3J5LmNsYXNzKS5pbihTSU5HTEVUT04pOworICAgIGJpbmQoR3JvdXBDb250cm9sLkdlbmVyaWNGYWN0b3J5LmNsYXNzKS5pbihTSU5HTEVUT04pOwogICAgIGZhY3RvcnkoSW5jbHVkaW5nR3JvdXBNZW1iZXJzaGlwLkZhY3RvcnkuY2xhc3MpOwotICAgIGJpbmQoSW50ZXJuYWxHcm91cEJhY2tlbmQuY2xhc3MpLmluKFNJTkdMRVRPTik7CiAgICAgYmluZChHcm91cEJhY2tlbmQuY2xhc3MpLnRvKFVuaXZlcnNhbEdyb3VwQmFja2VuZC5jbGFzcykuaW4oU0lOR0xFVE9OKTsKICAgICBEeW5hbWljU2V0LnNldE9mKGJpbmRlcigpLCBHcm91cEJhY2tlbmQuY2xhc3MpOworCisgICAgYmluZChJbnRlcm5hbEdyb3VwQmFja2VuZC5jbGFzcykuaW4oU0lOR0xFVE9OKTsKICAgICBEeW5hbWljU2V0LmJpbmQoYmluZGVyKCksIEdyb3VwQmFja2VuZC5jbGFzcykudG8oSW50ZXJuYWxHcm91cEJhY2tlbmQuY2xhc3MpOwogCiAgICAgYmluZChGaWxlVHlwZVJlZ2lzdHJ5LmNsYXNzKS50byhNaW1lVXRpbEZpbGVUeXBlUmVnaXN0cnkuY2xhc3MpOwpAQCAtMTY3LDE2ICsyMjUsMzEgQEAKICAgICBiaW5kKElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5LmNsYXNzKS5pbihTSU5HTEVUT04pOwogICAgIGJpbmQoQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeS5jbGFzcyk7CiAgICAgYmluZChQcm9qZWN0Q29udHJvbC5HZW5lcmljRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShGdW5jdGlvblN0YXRlLkZhY3RvcnkuY2xhc3MpOworICAgIGJpbmQoQWNjb3VudENvbnRyb2wuRmFjdG9yeS5jbGFzcyk7CiAKICAgICBpbnN0YWxsKG5ldyBBdWRpdE1vZHVsZSgpKTsKKyAgICBpbnN0YWxsKG5ldyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Nb2R1bGUoKSk7CisgICAgaW5zdGFsbChuZXcgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5Nb2R1bGUoKSk7CisgICAgaW5zdGFsbChuZXcgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLk1vZHVsZSgpKTsKKyAgICBpbnN0YWxsKG5ldyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Nb2R1bGUoKSk7CiAKICAgICBiaW5kKEdpdFJlZmVyZW5jZVVwZGF0ZWQuY2xhc3MpOwogICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIG5ldyBUeXBlTGl0ZXJhbDxDYWNoZTw/LCA/Pj4oKSB7fSk7CiAgICAgRHluYW1pY1NldC5zZXRPZihiaW5kZXIoKSwgQ2FjaGVSZW1vdmFsTGlzdGVuZXIuY2xhc3MpOwogICAgIER5bmFtaWNTZXQuc2V0T2YoYmluZGVyKCksIEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5jbGFzcyk7CiAgICAgRHluYW1pY1NldC5zZXRPZihiaW5kZXIoKSwgTmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lci5jbGFzcyk7CisgICAgRHluYW1pY1NldC5iaW5kKGJpbmRlcigpLCBHaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIuY2xhc3MpLnRvKENoYW5nZUNhY2hlLmNsYXNzKTsKKyAgICBEeW5hbWljU2V0LnNldE9mKGJpbmRlcigpLCBDaGFuZ2VMaXN0ZW5lci5jbGFzcyk7CisgICAgRHluYW1pY1NldC5zZXRPZihiaW5kZXIoKSwgQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyLmNsYXNzKTsKKyAgICBEeW5hbWljSXRlbS5pdGVtT2YoYmluZGVyKCksIEF2YXRhclByb3ZpZGVyLmNsYXNzKTsKIAogICAgIGJpbmQoQW5vbnltb3VzVXNlci5jbGFzcyk7CisKKyAgICBmYWN0b3J5KENvbW1pdFZhbGlkYXRvcnMuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShOb3Rlc0JyYW5jaFV0aWwuRmFjdG9yeS5jbGFzcyk7CisKKyAgICBiaW5kKEFjY291bnRNYW5hZ2VyLmNsYXNzKTsKKyAgICBiaW5kKENoYW5nZVVzZXJOYW1lLkN1cnJlbnRVc2VyLmNsYXNzKTsKKyAgICBmYWN0b3J5KENoYW5nZVVzZXJOYW1lLkZhY3RvcnkuY2xhc3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9HZXJyaXRSZXF1ZXN0TW9kdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9HZXJyaXRSZXF1ZXN0TW9kdWxlLmphdmEKaW5kZXggYmE1NGM1Ni4uZWMxNDg4MyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvR2Vycml0UmVxdWVzdE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL0dlcnJpdFJlcXVlc3RNb2R1bGUuamF2YQpAQCAtMTYsNDggKzE2LDIwIEBACiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzLlNJTkdMRVRPTjsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQXBwcm92YWxzVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlJlcXVlc3RDbGVhbnVwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvbHZlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cERldGFpbEZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBNZW1iZXJzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlBlcmZvcm1DcmVhdGVHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5QZXJmb3JtUmVuYW1lR3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuVmlzaWJsZUdyb3VwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZUluc2VydGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuRGVsZXRlRHJhZnRQYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlB1Ymxpc2hEcmFmdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlN1Ym1pdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkFzeW5jUmVjZWl2ZUNvbW1pdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5CYW5Db21taXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5DcmVhdGVDb2RlUmV2aWV3Tm90ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZU9wOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWV0YURhdGFVcGRhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Ob3Rlc0JyYW5jaFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5TdWJtb2R1bGVPcDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5BYmFuZG9uZWRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQWRkUmV2aWV3ZXJTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ29tbWVudFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5DcmVhdGVDaGFuZ2VTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuTWVyZ2VGYWlsU2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1lcmdlZFNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZWJhc2VkUGF0Y2hTZXRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUmVwbGFjZVBhdGNoU2V0U2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJlc3RvcmVkU2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlJldmVydGVkU2VuZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5BZGRSZXZpZXdlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUHVibGlzaENvbW1lbnRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5SZW1vdmVSZXZpZXdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNyZWF0ZVByb2plY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTGlzdFByb2plY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlBlclJlcXVlc3RQcm9qZWN0Q29udHJvbENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlN1Z2dlc3RQYXJlbnRDYW5kaWRhdGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlUXVlcnlCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlUXVlcnlSZXdyaXRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zZXJ2bGV0LlJlcXVlc3RTY29wZWQ7CiAKIC8qKiBCaW5kaW5ncyBmb3Ige0BsaW5rIFJlcXVlc3RTY29wZWR9IGVudGl0aWVzLiAqLwpAQCAtNjUsNTIgKzM3LDI0IEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CiAgICAgYmluZChSZXF1ZXN0Q2xlYW51cC5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7Ci0gICAgYmluZChSZXZpZXdEYi5jbGFzcykudG9Qcm92aWRlcihSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlci5jbGFzcykuaW4oCi0gICAgICAgIFJlcXVlc3RTY29wZWQuY2xhc3MpOworICAgIGJpbmQoUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIuY2xhc3MpOwogICAgIGJpbmQoSWRlbnRpZmllZFVzZXIuUmVxdWVzdEZhY3RvcnkuY2xhc3MpLmluKFNJTkdMRVRPTik7Ci0gICAgYmluZChNZXRhRGF0YVVwZGF0ZS5Vc2VyLmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKLSAgICBiaW5kKEFjY291bnRSZXNvbHZlci5jbGFzcyk7Ci0gICAgYmluZChDaGFuZ2VRdWVyeVJld3JpdGVyLmNsYXNzKTsKLSAgICBiaW5kKExpc3RQcm9qZWN0cy5jbGFzcyk7CiAgICAgYmluZChBcHByb3ZhbHNVdGlsLmNsYXNzKTsKKyAgICBiaW5kKENoYW5nZUluc2VydGVyLmNsYXNzKTsKIAogICAgIGJpbmQoUGVyUmVxdWVzdFByb2plY3RDb250cm9sQ2FjaGUuY2xhc3MpLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOwogICAgIGJpbmQoQ2hhbmdlQ29udHJvbC5GYWN0b3J5LmNsYXNzKS5pbihTSU5HTEVUT04pOwogICAgIGJpbmQoUHJvamVjdENvbnRyb2wuRmFjdG9yeS5jbGFzcykuaW4oU0lOR0xFVE9OKTsKLSAgICBiaW5kKEFjY291bnRDb250cm9sLkZhY3RvcnkuY2xhc3MpLmluKFNJTkdMRVRPTik7CiAKLSAgICBmYWN0b3J5KENoYW5nZVF1ZXJ5QnVpbGRlci5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KFN1Ym1vZHVsZU9wLkZhY3RvcnkuY2xhc3MpOwogICAgIGZhY3RvcnkoTWVyZ2VPcC5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KENyZWF0ZUNvZGVSZXZpZXdOb3Rlcy5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KE5vdGVzQnJhbmNoVXRpbC5GYWN0b3J5LmNsYXNzKTsKLSAgICBpbnN0YWxsKG5ldyBBc3luY1JlY2VpdmVDb21taXRzLk1vZHVsZSgpKTsKIAogICAgIC8vIE5vdCByZWFsbHkgcGVyLXJlcXVlc3QsIGJ1dCBkYW1taXQsIEkgZG9uJ3Qga25vdyB3aGVyZSBlbHNlIHRvCiAgICAgLy8gZWFzaWx5IHBhcmsgdGhpcyBzdHVmZi4KICAgICAvLwotICAgIGZhY3RvcnkoQWRkUmV2aWV3ZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShBZGRSZXZpZXdlclNlbmRlci5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KENyZWF0ZUNoYW5nZVNlbmRlci5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KERlbGV0ZURyYWZ0UGF0Y2hTZXQuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShQdWJsaXNoQ29tbWVudHMuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShQdWJsaXNoRHJhZnQuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShSZXBsYWNlUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShSZWJhc2VkUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShBYmFuZG9uZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShSZW1vdmVSZXZpZXdlci5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KFJlc3RvcmVkU2VuZGVyLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoUmV2ZXJ0ZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShDb21tZW50U2VuZGVyLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoTWVyZ2VkU2VuZGVyLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoTWVyZ2VGYWlsU2VuZGVyLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoUGVyZm9ybUNyZWF0ZUdyb3VwLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoUGVyZm9ybVJlbmFtZUdyb3VwLkZhY3RvcnkuY2xhc3MpOwotICAgIGZhY3RvcnkoVmlzaWJsZUdyb3Vwcy5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KEdyb3VwRGV0YWlsRmFjdG9yeS5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KEdyb3VwTWVtYmVycy5GYWN0b3J5LmNsYXNzKTsKLSAgICBmYWN0b3J5KENyZWF0ZVByb2plY3QuRmFjdG9yeS5jbGFzcyk7Ci0gICAgZmFjdG9yeShTdWJtaXQuRmFjdG9yeS5jbGFzcyk7CiAgICAgZmFjdG9yeShTdWdnZXN0UGFyZW50Q2FuZGlkYXRlcy5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KEJhbkNvbW1pdC5GYWN0b3J5LmNsYXNzKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvTWFzdGVyTm9kZVN0YXJ0dXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL01hc3Rlck5vZGVTdGFydHVwLmphdmEKaW5kZXggYmI5NWRjYS4uYmY5NmEyMiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvTWFzdGVyTm9kZVN0YXJ0dXAuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9NYXN0ZXJOb2RlU3RhcnR1cC5qYXZhCkBAIC0xNCwzNSArMTQsNjAgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnOwogCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTlVURVM7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CisKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUmVsb2FkU3VibWl0UXVldWVPcDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOwogCiAvKiogQ29uZmlndXJhdGlvbiBmb3IgYSBtYXN0ZXIgbm9kZSBpbiBhIGNsdXN0ZXIgb2Ygc2VydmVycy4gKi8KIHB1YmxpYyBjbGFzcyBNYXN0ZXJOb2RlU3RhcnR1cCBleHRlbmRzIExpZmVjeWNsZU1vZHVsZSB7CiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBjb25maWd1cmUoKSB7Ci0gICAgbGlzdGVuZXIoKS50byhPblN0YXJ0LmNsYXNzKTsKKyAgICBsaXN0ZW5lcigpLnRvKExpZmVjeWNsZS5jbGFzcyk7CiAgIH0KIAotICBzdGF0aWMgY2xhc3MgT25TdGFydCBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKKyAgQFNpbmdsZXRvbgorICBzdGF0aWMgY2xhc3MgTGlmZWN5Y2xlIGltcGxlbWVudHMgTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX0RFTEFZX1MgPSAxNTsKKwogICAgIHByaXZhdGUgZmluYWwgUmVsb2FkU3VibWl0UXVldWVPcC5GYWN0b3J5IHN1Ym1pdDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgZGVsYXk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlZHVsZWRGdXR1cmU8Pz4gaGFuZGxlOwogCiAgICAgQEluamVjdAotICAgIE9uU3RhcnQoZmluYWwgUmVsb2FkU3VibWl0UXVldWVPcC5GYWN0b3J5IHN1Ym1pdCkgeworICAgIExpZmVjeWNsZShSZWxvYWRTdWJtaXRRdWV1ZU9wLkZhY3Rvcnkgc3VibWl0LAorICAgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjb25maWcpIHsKICAgICAgIHRoaXMuc3VibWl0ID0gc3VibWl0OworICAgICAgdGhpcy5kZWxheSA9IENvbmZpZ1V0aWwuZ2V0VGltZVVuaXQoY29uZmlnLAorICAgICAgICAgICJjaGFuZ2VNZXJnZSIsIG51bGwsICJjaGVja0ZyZXF1ZW5jeSIsCisgICAgICAgICAgU0VDT05EUy5jb252ZXJ0KDUsIE1JTlVURVMpLCBTRUNPTkRTKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgIHN1Ym1pdC5jcmVhdGUoKS5zdGFydCgxNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICBpZiAoZGVsYXkgPiAwKSB7CisgICAgICAgIGhhbmRsZSA9IHN1Ym1pdC5jcmVhdGUoKQorICAgICAgICAgICAgLnN0YXJ0V2l0aEZpeGVkRGVsYXkoSU5JVElBTF9ERUxBWV9TLCBkZWxheSwgU0VDT05EUyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBoYW5kbGUgPSBzdWJtaXQuY3JlYXRlKCkuc3RhcnQoSU5JVElBTF9ERUxBWV9TLCBTRUNPTkRTKTsKKyAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgU2NoZWR1bGVkRnV0dXJlPD8+IGYgPSBoYW5kbGU7CisgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgIGhhbmRsZSA9IG51bGw7CisgICAgICAgIGYuY2FuY2VsKHRydWUpOworICAgICAgfQogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29uZmlnL1JlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyLmphdmEKaW5kZXggNDUxOGEyZS4uNGFkYTdiMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb25maWcvUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbmZpZy9SZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlci5qYXZhCkBAIC0yMSwxNiArMjEsMTcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5zZXJ2bGV0LlJlcXVlc3RTY29wZWQ7CiAKIC8qKiBQcm92aWRlcyB7QGxpbmsgUmV2aWV3RGJ9IGRhdGFiYXNlIGhhbmRsZSBsaXZlIG9ubHkgZm9yIHRoaXMgcmVxdWVzdC4gKi8KLUBTaW5nbGV0b24KLWZpbmFsIGNsYXNzIFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyIGltcGxlbWVudHMgUHJvdmlkZXI8UmV2aWV3RGI+IHsKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXIgaW1wbGVtZW50cyBQcm92aWRlcjxSZXZpZXdEYj4gewogICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYTsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXF1ZXN0Q2xlYW51cD4gY2xlYW51cDsKKyAgcHJpdmF0ZSBSZXZpZXdEYiBkYjsKIAogICBASW5qZWN0Ci0gIFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyKGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYSwKKyAgcHVibGljIFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyKGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYSwKICAgICAgIGZpbmFsIFByb3ZpZGVyPFJlcXVlc3RDbGVhbnVwPiBjbGVhbnVwKSB7CiAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7CiAgICAgdGhpcy5jbGVhbnVwID0gY2xlYW51cDsKQEAgLTM4LDI2ICszOSwyNyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgUmV2aWV3RGIgZ2V0KCkgewotICAgIGZpbmFsIFJldmlld0RiIGM7Ci0gICAgdHJ5IHsKLSAgICAgIGMgPSBzY2hlbWEub3BlbigpOwotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBSZXZpZXdEYiIsIGUpOworICAgIGlmIChkYiA9PSBudWxsKSB7CisgICAgICBmaW5hbCBSZXZpZXdEYiBjOworICAgICAgdHJ5IHsKKyAgICAgICAgYyA9IHNjaGVtYS5vcGVuKCk7CisgICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBSZXZpZXdEYiIsIGUpOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgY2xlYW51cC5nZXQoKS5hZGQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIGRiID0gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgYy5jbG9zZSgpOworICAgICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJDYW5ub3QgZGVmZXIgY2xlYW51cCBvZiBSZXZpZXdEYiIsIGUpOworICAgICAgfQorICAgICAgZGIgPSBjOwogICAgIH0KLSAgICB0cnkgewotICAgICAgY2xlYW51cC5nZXQoKS5hZGQobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgIGMuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICByZXR1cm4gYzsKLSAgICB9IGNhdGNoIChFcnJvciBlKSB7Ci0gICAgICBjLmNsb3NlKCk7Ci0gICAgICB0aHJvdyBlOwotICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgYy5jbG9zZSgpOwotICAgICAgdGhyb3cgZTsKLSAgICB9CisgICAgcmV0dXJuIGRiOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbnRhY3QvRW5jcnlwdGVkQ29udGFjdFN0b3JlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NvbnRhY3QvRW5jcnlwdGVkQ29udGFjdFN0b3JlLmphdmEKaW5kZXggYmM4OGNkMi4uYmQxYzBkNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jb250YWN0L0VuY3J5cHRlZENvbnRhY3RTdG9yZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvY29udGFjdC9FbmNyeXB0ZWRDb250YWN0U3RvcmUuamF2YQpAQCAtMTA3LDYgKzEwNyw3IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAorICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICBwcml2YXRlIHN0YXRpYyBQR1BQdWJsaWNLZXlSaW5nQ29sbGVjdGlvbiByZWFkUHViUmluZyhmaW5hbCBGaWxlIHB1YikgewogICAgIHRyeSB7CiAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHViKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZG9jdW1lbnRhdGlvbi9NYXJrZG93bkZvcm1hdHRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9kb2N1bWVudGF0aW9uL01hcmtkb3duRm9ybWF0dGVyLmphdmEKaW5kZXggNmJiN2JhOC4uYWYwOGQxZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9kb2N1bWVudGF0aW9uL01hcmtkb3duRm9ybWF0dGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9kb2N1bWVudGF0aW9uL01hcmtkb3duRm9ybWF0dGVyLmphdmEKQEAgLTEzNiw4ICsxMzYsMTIgQEAKICAgICBJbnB1dFN0cmVhbSBpbiA9IHVybC5vcGVuU3RyZWFtKCk7CiAgICAgdHJ5IHsKICAgICAgIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHRtcCA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgxMjggKiAxMDI0KTsKLSAgICAgIHRtcC5jb3B5KGluKTsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nKHRtcC50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHRtcC5jb3B5KGluKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcodG1wLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdG1wLmNsb3NlKCk7CisgICAgICB9CiAgICAgfSBmaW5hbGx5IHsKICAgICAgIGluLmNsb3NlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvQ29tbWl0UmVjZWl2ZWRFdmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvQ29tbWl0UmVjZWl2ZWRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDEwODQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9Db21taXRSZWNlaXZlZEV2ZW50LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlY2VpdmVDb21tYW5kOworCitwdWJsaWMgY2xhc3MgQ29tbWl0UmVjZWl2ZWRFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKKyAgcHVibGljIGZpbmFsIFJlY2VpdmVDb21tYW5kIGNvbW1hbmQ7CisgIHB1YmxpYyBmaW5hbCBQcm9qZWN0IHByb2plY3Q7CisgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVmTmFtZTsKKyAgcHVibGljIGZpbmFsIFJldkNvbW1pdCBjb21taXQ7CisgIHB1YmxpYyBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyOworCisgIHB1YmxpYyBDb21taXRSZWNlaXZlZEV2ZW50KFJlY2VpdmVDb21tYW5kIGNvbW1hbmQsIFByb2plY3QgcHJvamVjdCwKKyAgICAgIFN0cmluZyByZWZOYW1lLCBSZXZDb21taXQgY29tbWl0LCBJZGVudGlmaWVkVXNlciB1c2VyKSB7CisgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKKyAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIHRoaXMucmVmTmFtZSA9IHJlZk5hbWU7CisgICAgdGhpcy5jb21taXQgPSBjb21taXQ7CisgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvRXZlbnRGYWN0b3J5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9FdmVudEZhY3RvcnkuamF2YQppbmRleCBmMDdhZTBjLi5kNTU2ZTczIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9FdmVudEZhY3RvcnkuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9FdmVudEZhY3RvcnkuamF2YQpAQCAtMTQsMTkgKzE0LDIxIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50czsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBbmNlc3RvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUmV2SWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlRyYWNraW5nSWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlVzZXJJZGVudGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKQEAgLTM1LDYgKzM3LDggQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdEVudHJ5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTQ4LDggKzUyLDggQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIApAQCAtNTgsMjIgKzYyLDIyIEBACiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFdmVudEZhY3RvcnkuY2xhc3MpOwogICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKLSAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXM7CiAgIHByaXZhdGUgZmluYWwgUGF0Y2hMaXN0Q2FjaGUgcGF0Y2hMaXN0Q2FjaGU7CiAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hOworICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcHNJbmZvRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50OwogCiAgIEBJbmplY3QKICAgRXZlbnRGYWN0b3J5KEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCiAgICAgICBAQ2Fub25pY2FsV2ViVXJsIEBOdWxsYWJsZSBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyLAotICAgICAgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzLAorICAgICAgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwc2lmLAogICAgICAgUGF0Y2hMaXN0Q2FjaGUgcGF0Y2hMaXN0Q2FjaGUsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYSwKICAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBQZXJzb25JZGVudCBteUlkZW50KSB7CiAgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7CiAgICAgdGhpcy51cmxQcm92aWRlciA9IHVybFByb3ZpZGVyOwotICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsVHlwZXM7CiAgICAgdGhpcy5wYXRjaExpc3RDYWNoZSA9IHBhdGNoTGlzdENhY2hlOwogICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOworICAgIHRoaXMucHNJbmZvRmFjdG9yeSA9IHBzaWY7CiAgICAgdGhpcy5teUlkZW50ID0gbXlJZGVudDsKICAgfQogCkBAIC0xODQsMTEgKzE4OCwyNCBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIFJldklkIHJldklkID0gZGIucGF0Y2hTZXRzKCkuZ2V0KHBzSWQpLmdldFJldmlzaW9uKCk7Ci0gICAgICAgIGZvciAoUGF0Y2hTZXRBbmNlc3RvciBhIDogZGIucGF0Y2hTZXRBbmNlc3RvcnMoKS5kZXNjZW5kYW50c09mKHJldklkKSkgewotICAgICAgICAgIGZpbmFsIFBhdGNoU2V0IHAgPSBkYi5wYXRjaFNldHMoKS5nZXQoYS5nZXRQYXRjaFNldCgpKTsKLSAgICAgICAgICBmaW5hbCBDaGFuZ2UgYyA9IGRiLmNoYW5nZXMoKS5nZXQocC5nZXRJZCgpLmdldFBhcmVudEtleSgpKTsKLSAgICAgICAgICBjYS5uZWVkZWRCeS5hZGQobmV3TmVlZGVkQnkoYywgcCkpOworICAgICAgICBmaW5hbCBQYXRjaFNldCBwcyA9IGRiLnBhdGNoU2V0cygpLmdldChwc0lkKTsKKyAgICAgICAgaWYgKHBzID09IG51bGwpIHsKKyAgICAgICAgICBsb2cuZXJyb3IoIkVycm9yIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGxpc3Qgb2YgZGVzY2VuZGFudHMgZm9yIgorICAgICAgICAgICAgICArICIgUGF0Y2hTZXQgIiArIHBzSWQgKyAiOiBDYW5ub3QgZmluZCBQYXRjaFNldCBlbnRyeSBpbiIKKyAgICAgICAgICAgICAgKyAiIGRhdGFiYXNlLiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZpbmFsIFJldklkIHJldklkID0gcHMuZ2V0UmV2aXNpb24oKTsKKyAgICAgICAgICBmb3IgKFBhdGNoU2V0QW5jZXN0b3IgYSA6IGRiLnBhdGNoU2V0QW5jZXN0b3JzKCkuZGVzY2VuZGFudHNPZihyZXZJZCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhdGNoU2V0IHAgPSBkYi5wYXRjaFNldHMoKS5nZXQoYS5nZXRQYXRjaFNldCgpKTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgbG9nLmVycm9yKCJFcnJvciB3aGlsZSBnZW5lcmF0aW5nIHRoZSBsaXN0IG9mIGRlc2NlbmRhbnRzIGZvciIKKyAgICAgICAgICAgICAgICAgICsgIiByZXZpc2lvbiAiICsgcmV2SWQuZ2V0KCkgKyAiOiBDYW5ub3QgZmluZCBQYXRjaFNldCBlbnRyeSBpbiIKKyAgICAgICAgICAgICAgICAgICsgIiBkYXRhYmFzZSBmb3IgIiArIGEuZ2V0UGF0Y2hTZXQoKSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQ2hhbmdlIGMgPSBkYi5jaGFuZ2VzKCkuZ2V0KHAuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKSk7CisgICAgICAgICAgICBjYS5uZWVkZWRCeS5hZGQobmV3TmVlZGVkQnkoYywgcCkpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgZGIuY2xvc2UoKTsKQEAgLTIwNyw3ICsyMjQsNyBAQAogCiAgIHByaXZhdGUgRGVwZW5kZW5jeUF0dHJpYnV0ZSBuZXdEZXBlbmRzT24oQ2hhbmdlIGMsIFBhdGNoU2V0IHBzKSB7CiAgICAgRGVwZW5kZW5jeUF0dHJpYnV0ZSBkID0gbmV3RGVwZW5kZW5jeUF0dHJpYnV0ZShjLCBwcyk7Ci0gICAgZC5pc0N1cnJlbnRQYXRjaFNldCA9IGMuY3VyclBhdGNoU2V0SWQoKS5lcXVhbHMocHMuZ2V0SWQoKSk7CisgICAgZC5pc0N1cnJlbnRQYXRjaFNldCA9IHBzLmdldElkKCkuZXF1YWxzKGMuY3VycmVudFBhdGNoU2V0SWQoKSk7CiAgICAgcmV0dXJuIGQ7CiAgIH0KIApAQCAtMjM3LDI1ICsyNTQsMjYgQEAKICAgICBhLmNvbW1pdE1lc3NhZ2UgPSBjb21taXRNZXNzYWdlOwogICB9CiAKLSAgcHVibGljIHZvaWQgYWRkUGF0Y2hTZXRzKENoYW5nZUF0dHJpYnV0ZSBhLCBDb2xsZWN0aW9uPFBhdGNoU2V0PiBwcykgewotICAgIGFkZFBhdGNoU2V0cyhhLCBwcywgbnVsbCwgZmFsc2UsIG51bGwpOworICBwdWJsaWMgdm9pZCBhZGRQYXRjaFNldHMoQ2hhbmdlQXR0cmlidXRlIGEsIENvbGxlY3Rpb248UGF0Y2hTZXQ+IHBzLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB7CisgICAgYWRkUGF0Y2hTZXRzKGEsIHBzLCBudWxsLCBmYWxzZSwgbnVsbCwgbGFiZWxUeXBlcyk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBhZGRQYXRjaFNldHMoQ2hhbmdlQXR0cmlidXRlIGNhLCBDb2xsZWN0aW9uPFBhdGNoU2V0PiBwcywKLSAgICAgIE1hcDxQYXRjaFNldC5JZCxDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PiBhcHByb3ZhbHMpIHsKLSAgICBhZGRQYXRjaFNldHMoY2EsIHBzLCBhcHByb3ZhbHMsIGZhbHNlLCBudWxsKTsKKyAgICAgIE1hcDxQYXRjaFNldC5JZCwgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPj4gYXBwcm92YWxzLAorICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB7CisgICAgYWRkUGF0Y2hTZXRzKGNhLCBwcywgYXBwcm92YWxzLCBmYWxzZSwgbnVsbCwgbGFiZWxUeXBlcyk7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBhZGRQYXRjaFNldHMoQ2hhbmdlQXR0cmlidXRlIGNhLCBDb2xsZWN0aW9uPFBhdGNoU2V0PiBwcywKLSAgICAgIE1hcDxQYXRjaFNldC5JZCxDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PiBhcHByb3ZhbHMsCi0gICAgICBib29sZWFuIGluY2x1ZGVGaWxlcywgQ2hhbmdlIGNoYW5nZSkgewotCisgICAgICBNYXA8UGF0Y2hTZXQuSWQsIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IGFwcHJvdmFscywKKyAgICAgIGJvb2xlYW4gaW5jbHVkZUZpbGVzLCBDaGFuZ2UgY2hhbmdlLCBMYWJlbFR5cGVzIGxhYmVsVHlwZXMpIHsKICAgICBpZiAoIXBzLmlzRW1wdHkoKSkgewogICAgICAgY2EucGF0Y2hTZXRzID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEF0dHJpYnV0ZT4ocHMuc2l6ZSgpKTsKICAgICAgIGZvciAoUGF0Y2hTZXQgcCA6IHBzKSB7CiAgICAgICAgIFBhdGNoU2V0QXR0cmlidXRlIHBzYSA9IGFzUGF0Y2hTZXRBdHRyaWJ1dGUocCk7CiAgICAgICAgIGlmIChhcHByb3ZhbHMgIT0gbnVsbCkgewotICAgICAgICAgIGFkZEFwcHJvdmFscyhwc2EsIHAuZ2V0SWQoKSwgYXBwcm92YWxzKTsKKyAgICAgICAgICBhZGRBcHByb3ZhbHMocHNhLCBwLmdldElkKCksIGFwcHJvdmFscywgbGFiZWxUeXBlcyk7CiAgICAgICAgIH0KICAgICAgICAgY2EucGF0Y2hTZXRzLmFkZChwc2EpOwogICAgICAgICBpZiAoaW5jbHVkZUZpbGVzICYmIGNoYW5nZSAhPSBudWxsKSB7CkBAIC0yOTAsNyArMzA4LDEwIEBACiAKICAgICAgICAgUGF0Y2hBdHRyaWJ1dGUgcCA9IG5ldyBQYXRjaEF0dHJpYnV0ZSgpOwogICAgICAgICBwLmZpbGUgPSBwYXRjaC5nZXROZXdOYW1lKCk7CisgICAgICAgIHAuZmlsZU9sZCA9IHBhdGNoLmdldE9sZE5hbWUoKTsKICAgICAgICAgcC50eXBlID0gcGF0Y2guZ2V0Q2hhbmdlVHlwZSgpOworICAgICAgICBwLmRlbGV0aW9ucyAtPSBwYXRjaC5nZXREZWxldGlvbnMoKTsKKyAgICAgICAgcC5pbnNlcnRpb25zID0gcGF0Y2guZ2V0SW5zZXJ0aW9ucygpOwogICAgICAgICBwYXRjaFNldEF0dHJpYnV0ZS5maWxlcy5hZGQocCk7CiAgICAgICB9CiAgICAgfSBjYXRjaCAoUGF0Y2hMaXN0Tm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKQEAgLTMyOCw2ICszNDksNyBAQAogICAgIHAucmVmID0gcGF0Y2hTZXQuZ2V0UmVmTmFtZSgpOwogICAgIHAudXBsb2FkZXIgPSBhc0FjY291bnRBdHRyaWJ1dGUocGF0Y2hTZXQuZ2V0VXBsb2FkZXIoKSk7CiAgICAgcC5jcmVhdGVkT24gPSBwYXRjaFNldC5nZXRDcmVhdGVkT24oKS5nZXRUaW1lKCkgLyAxMDAwTDsKKyAgICBmaW5hbCBQYXRjaFNldC5JZCBwSWQgPSBwYXRjaFNldC5nZXRJZCgpOwogICAgIHRyeSB7CiAgICAgICBmaW5hbCBSZXZpZXdEYiBkYiA9IHNjaGVtYS5vcGVuKCk7CiAgICAgICB0cnkgewpAQCAtMzM2LDMwICszNTgsNTUgQEAKICAgICAgICAgICAgIHBhdGNoU2V0LmdldElkKCkpKSB7CiAgICAgICAgICAgcC5wYXJlbnRzLmFkZChhLmdldEFuY2VzdG9yUmV2aXNpb24oKS5nZXQoKSk7CiAgICAgICAgIH0KKworICAgICAgICBVc2VySWRlbnRpdHkgYXV0aG9yID0gcHNJbmZvRmFjdG9yeS5nZXQoZGIsIHBJZCkuZ2V0QXV0aG9yKCk7CisgICAgICAgIGlmIChhdXRob3IuZ2V0QWNjb3VudCgpID09IG51bGwpIHsKKyAgICAgICAgICBwLmF1dGhvciA9IG5ldyBBY2NvdW50QXR0cmlidXRlKCk7CisgICAgICAgICAgcC5hdXRob3IuZW1haWwgPSBhdXRob3IuZ2V0RW1haWwoKTsKKyAgICAgICAgICBwLmF1dGhvci5uYW1lID0gYXV0aG9yLmdldE5hbWUoKTsKKyAgICAgICAgICBwLmF1dGhvci51c2VybmFtZSA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHAuYXV0aG9yID0gYXNBY2NvdW50QXR0cmlidXRlKGF1dGhvci5nZXRBY2NvdW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgQ2hhbmdlIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQocElkLmdldFBhcmVudEtleSgpKTsKKyAgICAgICAgTGlzdDxQYXRjaD4gbGlzdCA9CisgICAgICAgICAgICBwYXRjaExpc3RDYWNoZS5nZXQoY2hhbmdlLCBwYXRjaFNldCkudG9QYXRjaExpc3QocElkKTsKKyAgICAgICAgZm9yIChQYXRjaCBwZSA6IGxpc3QpIHsKKyAgICAgICAgICBpZiAoIVBhdGNoLkNPTU1JVF9NU0cuZXF1YWxzKHBlLmdldEZpbGVOYW1lKCkpKSB7CisgICAgICAgICAgICBwLnNpemVEZWxldGlvbnMgLT0gcGUuZ2V0RGVsZXRpb25zKCk7CisgICAgICAgICAgICBwLnNpemVJbnNlcnRpb25zICs9IHBlLmdldEluc2VydGlvbnMoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgIGRiLmNsb3NlKCk7CiAgICAgICB9CiAgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGxvYWQgcGF0Y2ggc2V0IGRhdGEgZm9yICIgKyBwYXRjaFNldC5nZXRJZCgpLCBlKTsKKyAgICB9IGNhdGNoIChQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKFN0cmluZy5mb3JtYXQoIkNhbm5vdCBnZXQgYXV0aG9yRW1haWwgZm9yICVzLiIsIHBJZCksIGUpOworICAgIH0gY2F0Y2ggKFBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGdldCBzaXplIGluZm9ybWF0aW9uIGZvciAlcy4iLCBwSWQpLCBlKTsKICAgICB9CiAgICAgcmV0dXJuIHA7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBhZGRBcHByb3ZhbHMoUGF0Y2hTZXRBdHRyaWJ1dGUgcCwgUGF0Y2hTZXQuSWQgaWQsCi0gICAgICBNYXA8UGF0Y2hTZXQuSWQsQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPj4gYWxsKSB7CisgICAgICBNYXA8UGF0Y2hTZXQuSWQsIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IGFsbCwKKyAgICAgIExhYmVsVHlwZXMgbGFiZWxUeXBlcykgewogICAgIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gbGlzdCA9IGFsbC5nZXQoaWQpOwogICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgIGFkZEFwcHJvdmFscyhwLCBsaXN0KTsKKyAgICAgIGFkZEFwcHJvdmFscyhwLCBsaXN0LCBsYWJlbFR5cGVzKTsKICAgICB9CiAgIH0KIAogICBwdWJsaWMgdm9pZCBhZGRBcHByb3ZhbHMoUGF0Y2hTZXRBdHRyaWJ1dGUgcCwKLSAgICAgIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gbGlzdCkgeworICAgICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBsaXN0LCBMYWJlbFR5cGVzIGxhYmVsVHlwZXMpIHsKICAgICBpZiAoIWxpc3QuaXNFbXB0eSgpKSB7CiAgICAgICBwLmFwcHJvdmFscyA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxBdHRyaWJ1dGU+KGxpc3Quc2l6ZSgpKTsKICAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogbGlzdCkgewogICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpICE9IDApIHsKLSAgICAgICAgICBwLmFwcHJvdmFscy5hZGQoYXNBcHByb3ZhbEF0dHJpYnV0ZShhKSk7CisgICAgICAgICAgcC5hcHByb3ZhbHMuYWRkKGFzQXBwcm92YWxBdHRyaWJ1dGUoYSwgbGFiZWxUeXBlcykpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAocC5hcHByb3ZhbHMuaXNFbXB0eSgpKSB7CkBAIC0zNzYsNiArNDIzLDkgQEAKICAgICogQHJldHVybiBvYmplY3Qgc3VpdGFibGUgZm9yIHNlcmlhbGl6YXRpb24gdG8gSlNPTgogICAgKi8KICAgcHVibGljIEFjY291bnRBdHRyaWJ1dGUgYXNBY2NvdW50QXR0cmlidXRlKEFjY291bnQuSWQgaWQpIHsKKyAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQogICAgIHJldHVybiBhc0FjY291bnRBdHRyaWJ1dGUoYWNjb3VudENhY2hlLmdldChpZCkuZ2V0QWNjb3VudCgpKTsKICAgfQogCkBAIC00MTMsMTggKzQ2MywyMCBAQAogICAgKiBzZXJpYWxpemF0aW9uIHRvIEpTT04uCiAgICAqCiAgICAqIEBwYXJhbSBhcHByb3ZhbAorICAgKiBAcGFyYW0gbGFiZWxUeXBlcyBsYWJlbCB0eXBlcyBmb3IgdGhlIGNvbnRhaW5pbmcgcHJvamVjdAogICAgKiBAcmV0dXJuIG9iamVjdCBzdWl0YWJsZSBmb3Igc2VyaWFsaXphdGlvbiB0byBKU09OCiAgICAqLwotICBwdWJsaWMgQXBwcm92YWxBdHRyaWJ1dGUgYXNBcHByb3ZhbEF0dHJpYnV0ZShQYXRjaFNldEFwcHJvdmFsIGFwcHJvdmFsKSB7CisgIHB1YmxpYyBBcHByb3ZhbEF0dHJpYnV0ZSBhc0FwcHJvdmFsQXR0cmlidXRlKFBhdGNoU2V0QXBwcm92YWwgYXBwcm92YWwsCisgICAgICBMYWJlbFR5cGVzIGxhYmVsVHlwZXMpIHsKICAgICBBcHByb3ZhbEF0dHJpYnV0ZSBhID0gbmV3IEFwcHJvdmFsQXR0cmlidXRlKCk7Ci0gICAgYS50eXBlID0gYXBwcm92YWwuZ2V0Q2F0ZWdvcnlJZCgpLmdldCgpOworICAgIGEudHlwZSA9IGFwcHJvdmFsLmdldExhYmVsSWQoKS5nZXQoKTsKICAgICBhLnZhbHVlID0gU2hvcnQudG9TdHJpbmcoYXBwcm92YWwuZ2V0VmFsdWUoKSk7CiAgICAgYS5ieSA9IGFzQWNjb3VudEF0dHJpYnV0ZShhcHByb3ZhbC5nZXRBY2NvdW50SWQoKSk7CiAgICAgYS5ncmFudGVkT24gPSBhcHByb3ZhbC5nZXRHcmFudGVkKCkuZ2V0VGltZSgpIC8gMTAwMEw7CiAKLSAgICBBcHByb3ZhbFR5cGUgYXQgPSBhcHByb3ZhbFR5cGVzLmJ5SWQoYXBwcm92YWwuZ2V0Q2F0ZWdvcnlJZCgpKTsKLSAgICBpZiAoYXQgIT0gbnVsbCkgewotICAgICAgYS5kZXNjcmlwdGlvbiA9IGF0LmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpOworICAgIExhYmVsVHlwZSBsdCA9IGxhYmVsVHlwZXMuYnlMYWJlbChhcHByb3ZhbC5nZXRMYWJlbElkKCkpOworICAgIGlmIChsdCAhPSBudWxsKSB7CisgICAgICBhLmRlc2NyaXB0aW9uID0gbHQuZ2V0TmFtZSgpOwogICAgIH0KICAgICByZXR1cm4gYTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvTWVyZ2VGYWlsZWRFdmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvTWVyZ2VGYWlsZWRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZmY1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9NZXJnZUZhaWxlZEV2ZW50LmphdmEKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHM7CisKK3B1YmxpYyBjbGFzcyBNZXJnZUZhaWxlZEV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgeworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdHlwZSA9ICJtZXJnZS1mYWlsZWQiOworICAgIHB1YmxpYyBDaGFuZ2VBdHRyaWJ1dGUgY2hhbmdlOworICAgIHB1YmxpYyBQYXRjaFNldEF0dHJpYnV0ZSBwYXRjaFNldDsKKyAgICBwdWJsaWMgQWNjb3VudEF0dHJpYnV0ZSBzdWJtaXR0ZXI7CisgICAgcHVibGljIFN0cmluZyByZWFzb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9QYXRjaEF0dHJpYnV0ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUGF0Y2hBdHRyaWJ1dGUuamF2YQppbmRleCAzODAyZmRkLi44MmY0NGExIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9QYXRjaEF0dHJpYnV0ZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1BhdGNoQXR0cmlidXRlLmphdmEKQEAgLTE4LDUgKzE4LDggQEAKIAogcHVibGljIGNsYXNzIFBhdGNoQXR0cmlidXRlIHsKICAgICBwdWJsaWMgU3RyaW5nIGZpbGU7CisgICAgcHVibGljIFN0cmluZyBmaWxlT2xkOwogICAgIHB1YmxpYyBDaGFuZ2VUeXBlIHR5cGU7CisgICAgcHVibGljIGludCBpbnNlcnRpb25zOworICAgIHB1YmxpYyBpbnQgZGVsZXRpb25zOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUGF0Y2hTZXRBdHRyaWJ1dGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1BhdGNoU2V0QXR0cmlidXRlLmphdmEKaW5kZXggZjcyNmNlMy4uMTEyM2U1ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUGF0Y2hTZXRBdHRyaWJ1dGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9QYXRjaFNldEF0dHJpYnV0ZS5qYXZhCkBAIC0yMyw4ICsyMywxMSBAQAogICBwdWJsaWMgU3RyaW5nIHJlZjsKICAgcHVibGljIEFjY291bnRBdHRyaWJ1dGUgdXBsb2FkZXI7CiAgIHB1YmxpYyBMb25nIGNyZWF0ZWRPbjsKKyAgcHVibGljIEFjY291bnRBdHRyaWJ1dGUgYXV0aG9yOwogCiAgIHB1YmxpYyBMaXN0PEFwcHJvdmFsQXR0cmlidXRlPiBhcHByb3ZhbHM7CiAgIHB1YmxpYyBMaXN0PFBhdGNoU2V0Q29tbWVudEF0dHJpYnV0ZT4gY29tbWVudHM7CiAgIHB1YmxpYyBMaXN0PFBhdGNoQXR0cmlidXRlPiBmaWxlczsKKyAgcHVibGljIGludCBzaXplSW5zZXJ0aW9uczsKKyAgcHVibGljIGludCBzaXplRGVsZXRpb25zOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUXVlcnlTdGF0cy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUXVlcnlTdGF0cy5qYXZhCmluZGV4IDFjNWU3ZDcuLmVjZjJiOWEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXZlbnRzL1F1ZXJ5U3RhdHMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9RdWVyeVN0YXRzLmphdmEKQEAgLTE4LDQgKzE4LDUgQEAKICAgcHVibGljIGZpbmFsIFN0cmluZyB0eXBlID0gInN0YXRzIjsKICAgcHVibGljIGludCByb3dDb3VudDsKICAgcHVibGljIGxvbmcgcnVuVGltZU1pbGxpc2Vjb25kczsKKyAgcHVibGljIFN0cmluZyByZXN1bWVTb3J0S2V5OwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUmV2aWV3ZXJBZGRlZEV2ZW50LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V2ZW50cy9SZXZpZXdlckFkZGVkRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODgxZDhkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ldmVudHMvUmV2aWV3ZXJBZGRlZEV2ZW50LmphdmEKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHM7CisKK3B1YmxpYyBjbGFzcyBSZXZpZXdlckFkZGVkRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0eXBlID0gInJldmlld2VyLWFkZGVkIjsKKyAgICBwdWJsaWMgQ2hhbmdlQXR0cmlidXRlIGNoYW5nZTsKKyAgICBwdWJsaWMgUGF0Y2hTZXRBdHRyaWJ1dGUgcGF0Y2hTZXQ7CisgICAgcHVibGljIEFjY291bnRBdHRyaWJ1dGUgcmV2aWV3ZXI7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2V4dGVuc2lvbnMvZXZlbnRzL0dpdFJlZmVyZW5jZVVwZGF0ZWQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXh0ZW5zaW9ucy9ldmVudHMvR2l0UmVmZXJlbmNlVXBkYXRlZC5qYXZhCmluZGV4IDgzM2I2MTEuLjQ5YzkwYmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXh0ZW5zaW9ucy9ldmVudHMvR2l0UmVmZXJlbmNlVXBkYXRlZC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZXh0ZW5zaW9ucy9ldmVudHMvR2l0UmVmZXJlbmNlVXBkYXRlZC5qYXZhCkBAIC0yMCw2ICsyMCw5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOworCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC0zOCw4ICs0MSwxNiBAQAogICAgIHRoaXMubGlzdGVuZXJzID0gbGlzdGVuZXJzOwogICB9CiAKLSAgcHVibGljIHZvaWQgZmlyZShQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgU3RyaW5nIHJlZikgewotICAgIEV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KHByb2plY3QsIHJlZik7CisgIHB1YmxpYyB2b2lkIGZpcmUoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFJlZlVwZGF0ZSByZWZVcGRhdGUpIHsKKyAgICBmaXJlKHByb2plY3QsIHJlZlVwZGF0ZS5nZXROYW1lKCksIHJlZlVwZGF0ZS5nZXRPbGRPYmplY3RJZCgpLAorICAgICAgICByZWZVcGRhdGUuZ2V0TmV3T2JqZWN0SWQoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBmaXJlKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgcmVmLAorICAgICAgT2JqZWN0SWQgb2xkT2JqZWN0SWQsIE9iamVjdElkIG5ld09iamVjdElkKSB7CisgICAgT2JqZWN0SWQgbyA9IG9sZE9iamVjdElkICE9IG51bGwgPyBvbGRPYmplY3RJZCA6IE9iamVjdElkLnplcm9JZCgpOworICAgIE9iamVjdElkIG4gPSBuZXdPYmplY3RJZCAhPSBudWxsID8gbmV3T2JqZWN0SWQgOiBPYmplY3RJZC56ZXJvSWQoKTsKKyAgICBFdmVudCBldmVudCA9IG5ldyBFdmVudChwcm9qZWN0LCByZWYsIG8ubmFtZSgpLCBuLm5hbWUoKSk7CiAgICAgZm9yIChHaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIgbCA6IGxpc3RlbmVycykgewogICAgICAgbC5vbkdpdFJlZmVyZW5jZVVwZGF0ZWQoZXZlbnQpOwogICAgIH0KQEAgLTQ4LDEwICs1OSwxNSBAQAogICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFdmVudCBpbXBsZW1lbnRzIEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5FdmVudCB7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdE5hbWU7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVmOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG9sZE9iamVjdElkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5ld09iamVjdElkOwogCi0gICAgRXZlbnQoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFN0cmluZyByZWYpIHsKKyAgICBFdmVudChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgU3RyaW5nIHJlZiwKKyAgICAgICAgU3RyaW5nIG9sZE9iamVjdElkLCBTdHJpbmcgbmV3T2JqZWN0SWQpIHsKICAgICAgIHRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0LmdldCgpOwogICAgICAgdGhpcy5yZWYgPSByZWY7CisgICAgICB0aGlzLm9sZE9iamVjdElkID0gb2xkT2JqZWN0SWQ7CisgICAgICB0aGlzLm5ld09iamVjdElkID0gbmV3T2JqZWN0SWQ7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02Myw5ICs3OSwyMCBAQAogICAgIHB1YmxpYyBMaXN0PEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5VcGRhdGU+IGdldFVwZGF0ZXMoKSB7CiAgICAgICBHaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIuVXBkYXRlIHVwZGF0ZSA9CiAgICAgICAgICAgbmV3IEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5VcGRhdGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZSgpIHsKICAgICAgICAgICAgICAgcmV0dXJuIHJlZjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE9sZE9iamVjdElkKCkgeworICAgICAgICAgICAgICByZXR1cm4gb2xkT2JqZWN0SWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROZXdPYmplY3RJZCgpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdElkOworICAgICAgICAgICAgfQogICAgICAgICAgIH07CiAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZih1cGRhdGUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0FzeW5jUmVjZWl2ZUNvbW1pdHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0FzeW5jUmVjZWl2ZUNvbW1pdHMuamF2YQppbmRleCBjOGQ3NDFiLi5hYWYwMjczIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Bc3luY1JlY2VpdmVDb21taXRzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQXN5bmNSZWNlaXZlQ29tbWl0cy5qYXZhCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgICB0aW1lb3V0TWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cud2FybigiRXJyb3IgaW4gUmVjZWl2ZUNvbW1pdHMiLCBlKTsKLSAgICAgIHJjLmFkZEVycm9yKCJpbnRlcm5hbCBlcnJvciB3aGlsZSBwcm9jZXNzaW5nIGNoYW5nZXMiKTsKKyAgICAgIHJjLmFkZEVycm9yKCJpbnRlcm5hbCBlcnJvciB3aGlsZSBwcm9jZXNzaW5nIGNoYW5nZXMgIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgIC8vIFJlY2VpdmVDb21taXRzIGhhcyB0cmllZCBpdHMgYmVzdCB0byBjYXRjaCBlcnJvcnMsIHNvIGFueXRoaW5nIGF0IHRoaXMKICAgICAgIC8vIHBvaW50IGlzIHZlcnkgYmFkLgogICAgICAgZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjIDogY29tbWFuZHMpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0JhbkNvbW1pdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQmFuQ29tbWl0LmphdmEKaW5kZXggYzBlMDBhYS4uNjg1OTI2MiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQmFuQ29tbWl0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQmFuQ29tbWl0LmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfUkVKRUNUX0NPTU1JVFM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLlBlcm1pc3Npb25EZW5pZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKQEAgLTc0LDggKzc1LDggQEAKICAgICBmaW5hbCBCYW5Db21taXRSZXN1bHQgcmVzdWx0ID0gbmV3IEJhbkNvbW1pdFJlc3VsdCgpOwogICAgIE5vdGVNYXAgYmFuQ29tbWl0Tm90ZXMgPSBOb3RlTWFwLm5ld0VtcHR5TWFwKCk7CiAgICAgLy8gYWRkIGEgbm90ZSBmb3IgZWFjaCBiYW5uZWQgY29tbWl0IHRvIG5vdGVzCi0gICAgZmluYWwgUmVwb3NpdG9yeSByZXBvID0KLSAgICAgICAgcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkocHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3QgPSBwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpOworICAgIGZpbmFsIFJlcG9zaXRvcnkgcmVwbyA9IHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KHByb2plY3QpOwogICAgIHRyeSB7CiAgICAgICBmaW5hbCBSZXZXYWxrIHJldldhbGsgPSBuZXcgUmV2V2FsayhyZXBvKTsKICAgICAgIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOwpAQCAtOTIsNyArOTMsOCBAQAogICAgICAgICAgIGJhbkNvbW1pdE5vdGVzLnNldChjb21taXRUb0JhbiwgY3JlYXRlTm90ZUNvbnRlbnQocmVhc29uLCBpbnNlcnRlcikpOwogICAgICAgICB9CiAgICAgICAgIGluc2VydGVyLmZsdXNoKCk7Ci0gICAgICAgIE5vdGVzQnJhbmNoVXRpbCBub3Rlc0JyYW5jaFV0aWwgPSBub3Rlc0JyYW5jaFV0aWxGYWN0b3J5LmNyZWF0ZShyZXBvKTsKKyAgICAgICAgTm90ZXNCcmFuY2hVdGlsIG5vdGVzQnJhbmNoVXRpbCA9IG5vdGVzQnJhbmNoVXRpbEZhY3RvcnkuY3JlYXRlKHByb2plY3QsCisgICAgICAgICAgICByZXBvLCBpbnNlcnRlcik7CiAgICAgICAgIE5vdGVNYXAgbmV3bHlDcmVhdGVkID0KICAgICAgICAgICAgIG5vdGVzQnJhbmNoVXRpbC5jb21taXROZXdOb3RlcyhiYW5Db21taXROb3RlcywgUkVGX1JFSkVDVF9DT01NSVRTLAogICAgICAgICAgICAgICAgIGNyZWF0ZVBlcnNvbklkZW50KCksIGJ1aWxkQ29tbWl0TWVzc2FnZShjb21taXRzVG9CYW4sIHJlYXNvbikpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlQ2FjaGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoYW5nZUNhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3MTkzNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoYW5nZUNhY2hlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlTG9hZGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkxvYWRpbmdDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNhY2hlLkNhY2hlTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZWQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIENoYW5nZUNhY2hlIGltcGxlbWVudHMgR2l0UmVmZXJlbmNlVXBkYXRlZExpc3RlbmVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9CisgICAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDaGFuZ2VDYWNoZS5jbGFzcyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DQUNIRSA9ICJjaGFuZ2VzIjsKKworICBwdWJsaWMgc3RhdGljIE1vZHVsZSBtb2R1bGUoKSB7CisgICAgcmV0dXJuIG5ldyBDYWNoZU1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBjYWNoZShJRF9DQUNIRSwKKyAgICAgICAgICAgIFByb2plY3QuTmFtZUtleS5jbGFzcywKKyAgICAgICAgICAgIG5ldyBUeXBlTGl0ZXJhbDxMaXN0PENoYW5nZT4+KCkge30pCisgICAgICAgICAgLm1heGltdW1XZWlnaHQoMCkKKyAgICAgICAgICAubG9hZGVyKExvYWRlci5jbGFzcyk7CisgICAgICB9CisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgTG9hZGluZ0NhY2hlPFByb2plY3QuTmFtZUtleSwgTGlzdDxDaGFuZ2U+PiBjYWNoZTsKKworICBASW5qZWN0CisgIENoYW5nZUNhY2hlKEBOYW1lZChJRF9DQUNIRSkgTG9hZGluZ0NhY2hlPFByb2plY3QuTmFtZUtleSwgTGlzdDxDaGFuZ2U+PiBjYWNoZSkgeworICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKKyAgfQorCisgIExpc3Q8Q2hhbmdlPiBnZXQoUHJvamVjdC5OYW1lS2V5IG5hbWUpIHsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIGNhY2hlLmdldChuYW1lKTsKKyAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgbG9nLndhcm4oIkNhbm5vdCBmZXRjaCBjaGFuZ2VzIGZvciAiICsgbmFtZSwgZSk7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIG9uR2l0UmVmZXJlbmNlVXBkYXRlZChHaXRSZWZlcmVuY2VVcGRhdGVkTGlzdGVuZXIuRXZlbnQgZXZlbnQpIHsKKyAgICBmb3IgKEdpdFJlZmVyZW5jZVVwZGF0ZWRMaXN0ZW5lci5VcGRhdGUgdSA6IGV2ZW50LmdldFVwZGF0ZXMoKSkgeworICAgICAgaWYgKHUuZ2V0UmVmTmFtZSgpLnN0YXJ0c1dpdGgoInJlZnMvY2hhbmdlcy8iKSkgeworICAgICAgICBjYWNoZS5pbnZhbGlkYXRlKG5ldyBQcm9qZWN0Lk5hbWVLZXkoZXZlbnQuZ2V0UHJvamVjdE5hbWUoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgTG9hZGVyIGV4dGVuZHMgQ2FjaGVMb2FkZXI8UHJvamVjdC5OYW1lS2V5LCBMaXN0PENoYW5nZT4+IHsKKyAgICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYTsKKworICAgIEBJbmplY3QKKyAgICBMb2FkZXIoU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hKSB7CisgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxDaGFuZ2U+IGxvYWQoUHJvamVjdC5OYW1lS2V5IGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBSZXZpZXdEYiBkYiA9IHNjaGVtYS5vcGVuKCk7CisgICAgICB0cnkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChkYi5jaGFuZ2VzKCkuYnlQcm9qZWN0KGtleSkudG9MaXN0KCkpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoYW5nZU1lcmdlUXVldWUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoYW5nZU1lcmdlUXVldWUuamF2YQppbmRleCA2ZDFiMTU1Li4xMjIxOWUyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DaGFuZ2VNZXJnZVF1ZXVlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlTWVyZ2VRdWV1ZS5qYXZhCkBAIC0xOSw5ICsxOSwxMSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5SZW1vdGVQZWVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0UmVxdWVzdE1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0Q29udGV4dDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwpAQCAtOTEsMTIgKzkzLDE4IEBACiAKICAgICAgIEBQcm92aWRlcwogICAgICAgcHVibGljIFBlclRocmVhZFJlcXVlc3RTY29wZS5TY29wZXIgcHJvdmlkZVNjb3BlcigKLSAgICAgICAgICBmaW5hbCBQZXJUaHJlYWRSZXF1ZXN0U2NvcGUuUHJvcGFnYXRvciBwcm9wYWdhdG9yKSB7CisgICAgICAgICAgZmluYWwgUGVyVGhyZWFkUmVxdWVzdFNjb3BlLlByb3BhZ2F0b3IgcHJvcGFnYXRvciwKKyAgICAgICAgICBmaW5hbCBQcm92aWRlcjxSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcj4gZGJQcm92aWRlcikgewogICAgICAgICBmaW5hbCBSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCA9IG5ldyBSZXF1ZXN0Q29udGV4dCgpIHsKICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTY29wZUV4Y2VwdGlvbigiTm8gdXNlciBvbiBtZXJnZSB0aHJlYWQiKTsKICAgICAgICAgICB9CisKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgUHJvdmlkZXI8UmV2aWV3RGI+IGdldFJldmlld0RiUHJvdmlkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gZGJQcm92aWRlci5nZXQoKTsKKyAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIHJldHVybiBuZXcgUGVyVGhyZWFkUmVxdWVzdFNjb3BlLlNjb3BlcigpIHsKICAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTExMSw5ICsxMTksOSBAQAogICB9CiAKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIG1lcmdlKE1lcmdlT3AuRmFjdG9yeSBtb2YsIEJyYW5jaC5OYW1lS2V5IGJyYW5jaCkgeworICBwdWJsaWMgdm9pZCBtZXJnZShCcmFuY2guTmFtZUtleSBicmFuY2gpIHsKICAgICBpZiAoc3RhcnQoYnJhbmNoKSkgewotICAgICAgbWVyZ2VJbXBsKG1vZiwgYnJhbmNoKTsKKyAgICAgIG1lcmdlSW1wbChicmFuY2gpOwogICAgIH0KICAgfQogCkBAIC0xOTEsMTYgKzE5OSw2IEBACiAgICAgZS5uZWVkTWVyZ2UgPSBmYWxzZTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBtZXJnZUltcGwoTWVyZ2VPcC5GYWN0b3J5IG9wRmFjdG9yeSwgQnJhbmNoLk5hbWVLZXkgYnJhbmNoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIG9wRmFjdG9yeS5jcmVhdGUoYnJhbmNoKS5tZXJnZSgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICBsb2cuZXJyb3IoIk1lcmdlIGF0dGVtcHQgZm9yICIgKyBicmFuY2ggKyAiIGZhaWxlZCIsIGUpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBmaW5pc2goYnJhbmNoKTsKLSAgICB9Ci0gIH0KLQogICBwcml2YXRlIHZvaWQgbWVyZ2VJbXBsKGZpbmFsIEJyYW5jaC5OYW1lS2V5IGJyYW5jaCkgewogICAgIHRyeSB7CiAgICAgICB0aHJlYWRTY29wZXIuc2NvcGUobmV3IENhbGxhYmxlPFZvaWQ+KCl7CkBAIC0yNDMsNiArMjQxLDcgQEAKICAgICAgIGRlc3QgPSBkOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgIHVuc2NoZWR1bGUodGhpcyk7CiAgICAgICBtZXJnZUltcGwoZGVzdCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DaGFuZ2VVcGRhdGVFeGVjdXRvci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlVXBkYXRlRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDUyYmIwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hhbmdlVXBkYXRlRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGluZ0Fubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CisKKy8qKgorICogTWFya2VyIG9uIHRoZSBnbG9iYWwge0BsaW5rIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZX0gdXNlZCBieQorICoge0BsaW5rIFJlY2VpdmVDb21taXRzfSB0byBjcmVhdGUgb3IgcmVwbGFjZSBjaGFuZ2VzLgorICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAQmluZGluZ0Fubm90YXRpb24KK3B1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVVwZGF0ZUV4ZWN1dG9yIHsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoZXJyeVBpY2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NoZXJyeVBpY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTUzMDhmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ2hlcnJ5UGljay5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlJldklkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ2hhbmdlVXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvRmFjdG9yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgQ2hlcnJ5UGljayBleHRlbmRzIFN1Ym1pdFN0cmF0ZWd5IHsKKyAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOworICBwcml2YXRlIGZpbmFsIE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+IG5ld0NvbW1pdHM7CisKKyAgQ2hlcnJ5UGljayhmaW5hbCBTdWJtaXRTdHJhdGVneS5Bcmd1bWVudHMgYXJncywKKyAgICAgIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCkgeworICAgIHN1cGVyKGFyZ3MpOworCisgICAgdGhpcy5wYXRjaFNldEluZm9GYWN0b3J5ID0gcGF0Y2hTZXRJbmZvRmFjdG9yeTsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOworICAgIHRoaXMubmV3Q29tbWl0cyA9IG5ldyBIYXNoTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgQ29kZVJldmlld0NvbW1pdCBfcnVuKGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgQ29kZVJldmlld0NvbW1pdCBuZXdNZXJnZVRpcCA9IG1lcmdlVGlwOworICAgIHdoaWxlICghdG9NZXJnZS5pc0VtcHR5KCkpIHsKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbiA9IHRvTWVyZ2UucmVtb3ZlKDApOworCisgICAgICB0cnkgeworICAgICAgICBpZiAobmV3TWVyZ2VUaXAgPT0gbnVsbCkgeworICAgICAgICAgIC8vIFRoZSBicmFuY2ggaXMgdW5ib3JuLiBUYWtlIGEgZmFzdC1mb3J3YXJkIHJlc29sdXRpb24gdG8KKyAgICAgICAgICAvLyBjcmVhdGUgdGhlIGJyYW5jaC4KKyAgICAgICAgICAvLworICAgICAgICAgIG5ld01lcmdlVGlwID0gbjsKKyAgICAgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRTsKKworICAgICAgICB9IGVsc2UgaWYgKG4uZ2V0UGFyZW50Q291bnQoKSA9PSAwKSB7CisgICAgICAgICAgLy8gUmVmdXNlIHRvIG1lcmdlIGEgcm9vdCBjb21taXQgaW50byBhbiBleGlzdGluZyBicmFuY2gsCisgICAgICAgICAgLy8gd2UgY2Fubm90IG9idGFpbiBhIGRlbHRhIGZvciB0aGUgY2hlcnJ5LXBpY2sgdG8gYXBwbHkuCisgICAgICAgICAgLy8KKyAgICAgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DQU5OT1RfQ0hFUlJZX1BJQ0tfUk9PVDsKKworICAgICAgICB9IGVsc2UgaWYgKG4uZ2V0UGFyZW50Q291bnQoKSA9PSAxKSB7CisgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgb25seSBvbmUgcGFyZW50LCBhIGNoZXJyeS1waWNrIGNhbiBiZSBkb25lIGJ5CisgICAgICAgICAgLy8gdGFraW5nIHRoZSBkZWx0YSByZWxhdGl2ZSB0byB0aGF0IG9uZSBwYXJlbnQgYW5kIHJlZG9pbmcKKyAgICAgICAgICAvLyB0aGF0IG9uIHRoZSBjdXJyZW50IG1lcmdlIHRpcC4KKyAgICAgICAgICAvLworCisgICAgICAgICAgbmV3TWVyZ2VUaXAgPSB3cml0ZUNoZXJyeVBpY2tDb21taXQobWVyZ2VUaXAsIG4pOworCisgICAgICAgICAgaWYgKG5ld01lcmdlVGlwICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5ld0NvbW1pdHMucHV0KG5ld01lcmdlVGlwLnBhdGNoc2V0SWQuZ2V0UGFyZW50S2V5KCksIG5ld01lcmdlVGlwKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuUEFUSF9DT05GTElDVDsKKyAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBUaGVyZSBhcmUgbXVsdGlwbGUgcGFyZW50cywgc28gdGhpcyBpcyBhIG1lcmdlIGNvbW1pdC4gV2UKKyAgICAgICAgICAvLyBkb24ndCB3YW50IHRvIGNoZXJyeS1waWNrIHRoZSBtZXJnZSBhcyBjbGllbnRzIGNhbid0IGVhc2lseQorICAgICAgICAgIC8vIHJlYmFzZSB0aGVpciBoaXN0b3J5IHdpdGggdGhhdCBtZXJnZSBwcmVzZW50IGFuZCByZXBsYWNlZAorICAgICAgICAgIC8vIGJ5IGFuIGVxdWl2YWxlbnQgbWVyZ2Ugd2l0aCBhIGRpZmZlcmVudCBmaXJzdCBwYXJlbnQuIFNvCisgICAgICAgICAgLy8gaW5zdGVhZCBiZWhhdmUgYXMgdGhvdWdoIE1FUkdFX0lGX05FQ0VTU0FSWSB3YXMgY29uZmlndXJlZC4KKyAgICAgICAgICAvLworICAgICAgICAgIGlmICghYXJncy5tZXJnZVV0aWwuaGFzTWlzc2luZ0RlcGVuZGVuY2llcyhhcmdzLm1lcmdlU29ydGVyLCBuKSkgeworICAgICAgICAgICAgaWYgKGFyZ3MucncuaXNNZXJnZWRJbnRvKG5ld01lcmdlVGlwLCBuKSkgeworICAgICAgICAgICAgICBuZXdNZXJnZVRpcCA9IG47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBuZXdNZXJnZVRpcCA9CisgICAgICAgICAgICAgICAgICBhcmdzLm1lcmdlVXRpbC5tZXJnZU9uZUNvbW1pdChhcmdzLm15SWRlbnQsIGFyZ3MucmVwbywKKyAgICAgICAgICAgICAgICAgICAgICBhcmdzLnJ3LCBhcmdzLmluc2VydGVyLCBhcmdzLmNhbk1lcmdlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICBhcmdzLmRlc3RCcmFuY2gsIG5ld01lcmdlVGlwLCBuKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXRBcHByb3ZhbCA9CisgICAgICAgICAgICAgICAgYXJncy5tZXJnZVV0aWwubWFya0NsZWFuTWVyZ2VzKGFyZ3MucncsIGFyZ3MuY2FuTWVyZ2VGbGFnLAorICAgICAgICAgICAgICAgICAgICBuZXdNZXJnZVRpcCwgYXJncy5hbHJlYWR5QWNjZXB0ZWQpOworICAgICAgICAgICAgc2V0UmVmTG9nSWRlbnQoc3VibWl0QXBwcm92YWwpOworCisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9uZSBvciBtb3JlIGRlcGVuZGVuY2llcyB3ZXJlIG5vdCBtZXQuIFRoZSBzdGF0dXMgd2FzCisgICAgICAgICAgICAvLyBhbHJlYWR5IG1hcmtlZCBvbiB0aGUgY29tbWl0IHNvIHdlIGhhdmUgbm90aGluZyBmdXJ0aGVyCisgICAgICAgICAgICAvLyB0byBwZXJmb3JtIGF0IHRoaXMgdGltZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWVyZ2UgIiArIG4ubmFtZSgpLCBlKTsKKyAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1lcmdlICIgKyBuLm5hbWUoKSwgZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXdNZXJnZVRpcDsKKyAgfQorCisgIHByaXZhdGUgQ29kZVJldmlld0NvbW1pdCB3cml0ZUNoZXJyeVBpY2tDb21taXQoZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuKQorICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworCisgICAgYXJncy5ydy5wYXJzZUJvZHkobik7CisKKyAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEF1ZGl0ID0KKyAgICAgICAgYXJncy5tZXJnZVV0aWwuZ2V0U3VibWl0dGVyKG4uY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkpOworCisgICAgUGVyc29uSWRlbnQgY2hlcnJ5UGlja0NvbW1pdHRlcklkZW50ID0gbnVsbDsKKyAgICBpZiAoc3VibWl0QXVkaXQgIT0gbnVsbCkgeworICAgICAgY2hlcnJ5UGlja0NvbW1pdHRlcklkZW50ID0KKyAgICAgICAgICBhcmdzLmlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoc3VibWl0QXVkaXQuZ2V0QWNjb3VudElkKCkpCisgICAgICAgICAgICAgIC5uZXdDb21taXR0ZXJJZGVudChzdWJtaXRBdWRpdC5nZXRHcmFudGVkKCksCisgICAgICAgICAgICAgICAgICBhcmdzLm15SWRlbnQuZ2V0VGltZVpvbmUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoZXJyeVBpY2tDb21taXR0ZXJJZGVudCA9IGFyZ3MubXlJZGVudDsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgY2hlcnJ5UGlja0NtdE1zZyA9IGFyZ3MubWVyZ2VVdGlsLmNyZWF0ZUNoZXJyeVBpY2tDb21taXRNZXNzYWdlKG4pOworCisgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuZXdDb21taXQgPQorICAgICAgICBhcmdzLm1lcmdlVXRpbC5jcmVhdGVDaGVycnlQaWNrRnJvbUNvbW1pdChhcmdzLnJlcG8sIGFyZ3MuaW5zZXJ0ZXIsIG1lcmdlVGlwLCBuLAorICAgICAgICAgICAgY2hlcnJ5UGlja0NvbW1pdHRlcklkZW50LCBjaGVycnlQaWNrQ210TXNnLCBhcmdzLnJ3KTsKKworICAgIGlmIChuZXdDb21taXQgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBQYXRjaFNldC5JZCBpZCA9CisgICAgICAgIENoYW5nZVV0aWwubmV4dFBhdGNoU2V0SWQoYXJncy5yZXBvLCBuLmNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICBmaW5hbCBQYXRjaFNldCBwcyA9IG5ldyBQYXRjaFNldChpZCk7CisgICAgcHMuc2V0Q3JlYXRlZE9uKG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICBwcy5zZXRVcGxvYWRlcihzdWJtaXRBdWRpdC5nZXRBY2NvdW50SWQoKSk7CisgICAgcHMuc2V0UmV2aXNpb24obmV3IFJldklkKG5ld0NvbW1pdC5nZXRJZCgpLmdldE5hbWUoKSkpOworICAgIGluc2VydEFuY2VzdG9ycyhhcmdzLmRiLCBwcy5nZXRJZCgpLCBuZXdDb21taXQpOworICAgIGFyZ3MuZGIucGF0Y2hTZXRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihwcykpOworCisgICAgbi5jaGFuZ2Uuc2V0Q3VycmVudFBhdGNoU2V0KHBhdGNoU2V0SW5mb0ZhY3RvcnkuZ2V0KG5ld0NvbW1pdCwgcHMuZ2V0SWQoKSkpOworICAgIGFyZ3MuZGIuY2hhbmdlcygpLnVwZGF0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG4uY2hhbmdlKSk7CisKKyAgICBmaW5hbCBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXJncy5tZXJnZVV0aWwuZ2V0QXBwcm92YWxzRm9yQ29tbWl0KG4pKSB7CisgICAgICBhcHByb3ZhbHMuYWRkKG5ldyBQYXRjaFNldEFwcHJvdmFsKHBzLmdldElkKCksIGEpKTsKKyAgICB9CisgICAgYXJncy5kYi5wYXRjaFNldEFwcHJvdmFscygpLmluc2VydChhcHByb3ZhbHMpOworCisgICAgZmluYWwgUmVmVXBkYXRlIHJ1ID0gYXJncy5yZXBvLnVwZGF0ZVJlZihwcy5nZXRSZWZOYW1lKCkpOworICAgIHJ1LnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoT2JqZWN0SWQuemVyb0lkKCkpOworICAgIHJ1LnNldE5ld09iamVjdElkKG5ld0NvbW1pdCk7CisgICAgcnUuZGlzYWJsZVJlZkxvZygpOworICAgIGlmIChydS51cGRhdGUoYXJncy5ydykgIT0gUmVmVXBkYXRlLlJlc3VsdC5ORVcpIHsKKyAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gY3JlYXRlIHJlZiAlcyBpbiAlczogJXMiLAorICAgICAgICAgIHBzLmdldFJlZk5hbWUoKSwgbi5jaGFuZ2UuZ2V0RGVzdCgpLmdldFBhcmVudEtleSgpLmdldCgpLAorICAgICAgICAgIHJ1LmdldFJlc3VsdCgpKSk7CisgICAgfQorCisgICAgZ2l0UmVmVXBkYXRlZC5maXJlKG4uY2hhbmdlLmdldFByb2plY3QoKSwgcnUpOworCisgICAgbmV3Q29tbWl0LmNvcHlGcm9tKG4pOworICAgIG5ld0NvbW1pdC5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fUElDSzsKKyAgICBuZXdDb21taXRzLnB1dChuZXdDb21taXQucGF0Y2hzZXRJZC5nZXRQYXJlbnRLZXkoKSwgbmV3Q29tbWl0KTsKKyAgICBzZXRSZWZMb2dJZGVudChzdWJtaXRBdWRpdCk7CisgICAgcmV0dXJuIG5ld0NvbW1pdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5zZXJ0QW5jZXN0b3JzKFJldmlld0RiIGRiLCBQYXRjaFNldC5JZCBpZCwgUmV2Q29tbWl0IHNyYykKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGZpbmFsIGludCBjbnQgPSBzcmMuZ2V0UGFyZW50Q291bnQoKTsKKyAgICBMaXN0PFBhdGNoU2V0QW5jZXN0b3I+IHRvSW5zZXJ0ID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEFuY2VzdG9yPihjbnQpOworICAgIGZvciAoaW50IHAgPSAwOyBwIDwgY250OyBwKyspIHsKKyAgICAgIFBhdGNoU2V0QW5jZXN0b3IgYTsKKworICAgICAgYSA9IG5ldyBQYXRjaFNldEFuY2VzdG9yKG5ldyBQYXRjaFNldEFuY2VzdG9yLklkKGlkLCBwICsgMSkpOworICAgICAgYS5zZXRBbmNlc3RvclJldmlzaW9uKG5ldyBSZXZJZChzcmMuZ2V0UGFyZW50KHApLmdldElkKCkubmFtZSgpKSk7CisgICAgICB0b0luc2VydC5hZGQoYSk7CisgICAgfQorICAgIGRiLnBhdGNoU2V0QW5jZXN0b3JzKCkuaW5zZXJ0KHRvSW5zZXJ0KTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gZ2V0TmV3Q29tbWl0cygpIHsKKyAgICByZXR1cm4gbmV3Q29tbWl0czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBkcnlSdW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYXJncy5tZXJnZVV0aWwuY2FuQ2hlcnJ5UGljayhhcmdzLm1lcmdlU29ydGVyLCBhcmdzLnJlcG8sCisgICAgICAgIG1lcmdlVGlwLCBhcmdzLnJ3LCB0b01lcmdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjdlZDU2Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7Ci0KLS8qKgotICogVGhyb3duIHdoZW4gY3JlYXRpb24gb2YgYSBjb2RlIHJldmlldyBub3RlIGZhaWxzLgotICovCi1wdWJsaWMgY2xhc3MgQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIHB1YmxpYyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtc2cpIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci0KLSAgcHVibGljIENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24oZmluYWwgVGhyb3dhYmxlIHdoeSkgewotICAgIHN1cGVyKHdoeSk7Ci0gIH0KLQotICBwdWJsaWMgQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbihmaW5hbCBSZXZDb21taXQgY29tbWl0LAotICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgc3VwZXIoIkNvdWxkbid0IGNyZWF0ZSBjb2RlIHJldmlldyBub3RlIGZvciB0aGUgZm9sbG93aW5nIGNvbW1pdDogIgotICAgICAgICArIGNvbW1pdC5uYW1lKCksIGNhdXNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ29tbWl0TWVyZ2VTdGF0dXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NvbW1pdE1lcmdlU3RhdHVzLmphdmEKaW5kZXggNmI1MzEyMS4uNjlkY2IxNSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvQ29tbWl0TWVyZ2VTdGF0dXMuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Db21taXRNZXJnZVN0YXR1cy5qYXZhCkBAIC0yMiwxMiArMjIsMTUgQEAKICAgQ0xFQU5fUElDSygiQ2hhbmdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjaGVycnktcGlja2VkIiksCiAKICAgLyoqICovCisgIENMRUFOX1JFQkFTRSgiQ2hhbmdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWJhc2VkIiksCisKKyAgLyoqICovCiAgIEFMUkVBRFlfTUVSR0VEKCIiKSwKIAogICAvKiogKi8KLSAgUEFUSF9DT05GTElDVCgiWW91ciBjaGFuZ2UgY291bGQgbm90IGJlIG1lcmdlZCBkdWUgdG8gYSBwYXRoIGNvbmZsaWN0LlxuIgorICBQQVRIX0NPTkZMSUNUKCJUaGUgY2hhbmdlIGNvdWxkIG5vdCBiZSBtZXJnZWQgZHVlIHRvIGEgcGF0aCBjb25mbGljdC5cbiIKICAgICAgICAgICAgICAgICAgICsgIlxuIgotICAgICAgICAgICAgICAgICAgKyAiUGxlYXNlIG1lcmdlIChvciByZWJhc2UpIHRoZSBjaGFuZ2UgbG9jYWxseSBhbmQgdXBsb2FkIHRoZSByZXNvbHV0aW9uIGZvciByZXZpZXcuIiksCisgICAgICAgICAgICAgICAgICArICJQbGVhc2UgcmViYXNlIHRoZSBjaGFuZ2UgbG9jYWxseSBhbmQgdXBsb2FkIHRoZSByZWJhc2VkIGNvbW1pdCBmb3IgcmV2aWV3LiIpLAogCiAgIC8qKiAqLwogICBNSVNTSU5HX0RFUEVOREVOQ1koIiIpLApAQCAtMzksOSArNDIsMTIgQEAKICAgUkVWSVNJT05fR09ORSgiIiksCiAKICAgLyoqICovCi0gIENSSVNTX0NST1NTX01FUkdFKCJZb3VyIGNoYW5nZSByZXF1aXJlcyBhIHJlY3Vyc2l2ZSBtZXJnZSB0byByZXNvbHZlLlxuIgotICAgICAgICAgICAgICAgICAgKyAiXG4iCi0gICAgICAgICAgICAgICAgICArICJQbGVhc2UgbWVyZ2UgKG9yIHJlYmFzZSkgdGhlIGNoYW5nZSBsb2NhbGx5IGFuZCB1cGxvYWQgdGhlIHJlc29sdXRpb24gZm9yIHJldmlldy4iKSwKKyAgTk9fU1VCTUlUX1RZUEUoIiIpLAorCisgIC8qKiAqLworICBNQU5VQUxfUkVDVVJTSVZFX01FUkdFKCJUaGUgY2hhbmdlIHJlcXVpcmVzIGEgbG9jYWwgbWVyZ2UgdG8gcmVzb2x2ZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSBtZXJnZSAob3IgcmViYXNlKSB0aGUgY2hhbmdlIGxvY2FsbHkgYW5kIHVwbG9hZCB0aGUgcmVzb2x1dGlvbiBmb3IgcmV2aWV3LiIpLAogCiAgIC8qKiAqLwogICBDQU5OT1RfQ0hFUlJZX1BJQ0tfUk9PVCgiQ2Fubm90IGNoZXJyeS1waWNrIGFuIGluaXRpYWwgY29tbWl0IG9udG8gYW4gZXhpc3RpbmcgYnJhbmNoLlxuIgpAQCAtNDksNiArNTUsMTEgQEAKICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSBtZXJnZSB0aGUgY2hhbmdlIGxvY2FsbHkgYW5kIHVwbG9hZCB0aGUgbWVyZ2UgY29tbWl0IGZvciByZXZpZXcuIiksCiAKICAgLyoqICovCisgIENBTk5PVF9SRUJBU0VfUk9PVCgiQ2Fubm90IHJlYmFzZSBhbiBpbml0aWFsIGNvbW1pdCBvbnRvIGFuIGV4aXN0aW5nIGJyYW5jaC5cbiIKKyAgICAgICAgICAgICAgICAgICArICJcbiIKKyAgICAgICAgICAgICAgICAgICArICJQbGVhc2UgbWVyZ2UgdGhlIGNoYW5nZSBsb2NhbGx5IGFuZCB1cGxvYWQgdGhlIG1lcmdlIGNvbW1pdCBmb3IgcmV2aWV3LiIpLAorCisgIC8qKiAqLwogICBOT1RfRkFTVF9GT1JXQVJEKCJQcm9qZWN0IHBvbGljeSByZXF1aXJlcyBhbGwgc3VibWlzc2lvbnMgdG8gYmUgYSBmYXN0LWZvcndhcmQuXG4iCiAgICAgICAgICAgICAgICAgICArICJcbiIKICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSByZWJhc2UgdGhlIGNoYW5nZSBsb2NhbGx5IGFuZCB1cGxvYWQgYWdhaW4gZm9yIHJldmlldy4iKSwKQEAgLTgxLDQgKzkyLDQgQEAKICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCl7CiAgICAgcmV0dXJuIG1lc3NhZ2U7CiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9DcmVhdGVDb2RlUmV2aWV3Tm90ZXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NyZWF0ZUNvZGVSZXZpZXdOb3Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBmZTE3Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0NyZWF0ZUNvZGVSZXZpZXdOb3Rlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGU19OT1RFU19SRVZJRVc7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5Db25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdEluc2VydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubm90ZXMuTm90ZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9vdGVyS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNyZWF0ZSBjb2RlIHJldmlldyBub3RlcyBmb3IgZ2l2ZW4ge0BsaW5rIENvZGVSZXZpZXdDb21taXR9cy4KLSAqIDxwPgotICogQWZ0ZXIgdGhlIHtAbGluayAjY3JlYXRlKExpc3QsIFBlcnNvbklkZW50KX0gbWV0aG9kIGlzIGludm9rZWQgb25jZSB0aGlzCi0gKiBpbnN0YW5jZSBtdXN0IG5vdCBiZSByZXVzZWQuIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlmIG5lZWRlZC4KLSAqLwotcHVibGljIGNsYXNzIENyZWF0ZUNvZGVSZXZpZXdOb3RlcyB7Ci0gIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgQ3JlYXRlQ29kZVJldmlld05vdGVzIGNyZWF0ZShSZXZpZXdEYiByZXZpZXdEYiwgUmVwb3NpdG9yeSBkYik7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGb290ZXJLZXkgQ0hBTkdFX0lEID0gbmV3IEZvb3RlcktleSgiQ2hhbmdlLUlkIik7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsOwotICBwcml2YXRlIGZpbmFsIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lOwotICBwcml2YXRlIGZpbmFsIFJldmlld0RiIHNjaGVtYTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IGRiOwotCi0gIHByaXZhdGUgUGVyc29uSWRlbnQgYXV0aG9yOwotCi0gIHByaXZhdGUgUmV2V2FsayByZXZXYWxrOwotICBwcml2YXRlIE9iamVjdEluc2VydGVyIGluc2VydGVyOwotCi0gIHByaXZhdGUgZmluYWwgTm90ZXNCcmFuY2hVdGlsLkZhY3Rvcnkgbm90ZXNCcmFuY2hVdGlsRmFjdG9yeTsKLQotICBASW5qZWN0Ci0gIENyZWF0ZUNvZGVSZXZpZXdOb3RlcygKLSAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudCwKLSAgICAgIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCi0gICAgICBmaW5hbCBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCi0gICAgICBmaW5hbCBATnVsbGFibGUgQENhbm9uaWNhbFdlYlVybCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsLAotICAgICAgZmluYWwgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsCi0gICAgICBmaW5hbCBOb3Rlc0JyYW5jaFV0aWwuRmFjdG9yeSBub3Rlc0JyYW5jaFV0aWxGYWN0b3J5LAotICAgICAgZmluYWwgQEFzc2lzdGVkICBSZXZpZXdEYiByZXZpZXdEYiwKLSAgICAgIGZpbmFsIEBBc3Npc3RlZCAgUmVwb3NpdG9yeSBkYikgewotICAgIHRoaXMuYXV0aG9yID0gZ2Vycml0SWRlbnQ7Ci0gICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7Ci0gICAgdGhpcy5hcHByb3ZhbFR5cGVzID0gYXBwcm92YWxUeXBlczsKLSAgICB0aGlzLmNhbm9uaWNhbFdlYlVybCA9IGNhbm9uaWNhbFdlYlVybDsKLSAgICB0aGlzLmFub255bW91c0Nvd2FyZE5hbWUgPSBhbm9ueW1vdXNDb3dhcmROYW1lOwotICAgIHRoaXMubm90ZXNCcmFuY2hVdGlsRmFjdG9yeSA9IG5vdGVzQnJhbmNoVXRpbEZhY3Rvcnk7Ci0gICAgc2NoZW1hID0gcmV2aWV3RGI7Ci0gICAgdGhpcy5kYiA9IGRiOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY3JlYXRlKExpc3Q8Q29kZVJldmlld0NvbW1pdD4gY29tbWl0cywgUGVyc29uSWRlbnQgYXV0aG9yKQotICAgICAgdGhyb3dzIENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICByZXZXYWxrID0gbmV3IFJldldhbGsoZGIpOwotICAgICAgaW5zZXJ0ZXIgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpOwotICAgICAgaWYgKGF1dGhvciAhPSBudWxsKSB7Ci0gICAgICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yOwotICAgICAgfQotCi0gICAgICBOb3RlTWFwIG5vdGVzID0gTm90ZU1hcC5uZXdFbXB0eU1hcCgpOwotICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0KLSAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiVXBkYXRlIG5vdGVzIGZvciBzdWJtaXR0ZWQgY2hhbmdlc1xuXG4iKTsKLSAgICAgIGZvciAoQ29kZVJldmlld0NvbW1pdCBjIDogY29tbWl0cykgewotICAgICAgICBub3Rlcy5zZXQoYywgY3JlYXRlTm90ZUNvbnRlbnQoYy5jaGFuZ2UsIGMpKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoIiogIikuYXBwZW5kKGMuZ2V0U2hvcnRNZXNzYWdlKCkpLmFwcGVuZCgiXG4iKTsKLSAgICAgIH0KLQotICAgICAgTm90ZXNCcmFuY2hVdGlsIG5vdGVzQnJhbmNoVXRpbCA9IG5vdGVzQnJhbmNoVXRpbEZhY3RvcnkuY3JlYXRlKGRiKTsKLSAgICAgIG5vdGVzQnJhbmNoVXRpbC5jb21taXRBbGxOb3Rlcyhub3RlcywgUkVGU19OT1RFU19SRVZJRVcsIGF1dGhvciwKLSAgICAgICAgICBtZXNzYWdlLnRvU3RyaW5nKCkpOwotICAgICAgaW5zZXJ0ZXIuZmx1c2goKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgQ29kZVJldmlld05vdGVDcmVhdGlvbkV4Y2VwdGlvbihlKTsKLSAgICB9IGNhdGNoIChDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uKGUpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICByZXZXYWxrLnJlbGVhc2UoKTsKLSAgICAgIGluc2VydGVyLnJlbGVhc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGUoTGlzdDxDaGFuZ2U+IGNoYW5nZXMsIFBlcnNvbklkZW50IGF1dGhvciwKLSAgICAgIFN0cmluZyBjb21taXRNZXNzYWdlLCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIE9ybUV4Y2VwdGlvbiwKLSAgICAgIElPRXhjZXB0aW9uLCBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKLSAgICAgIGluc2VydGVyID0gZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKTsKLSAgICAgIGlmIChhdXRob3IgIT0gbnVsbCkgewotICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKLSAgICAgIH0KLSAgICAgIGlmIChtb25pdG9yID09IG51bGwpIHsKLSAgICAgICAgbW9uaXRvciA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7Ci0gICAgICB9Ci0KLSAgICAgIE5vdGVNYXAgbm90ZXMgPSBOb3RlTWFwLm5ld0VtcHR5TWFwKCk7Ci0gICAgICBmb3IgKENoYW5nZSBjIDogY2hhbmdlcykgewotICAgICAgICBtb25pdG9yLnVwZGF0ZSgxKTsKLSAgICAgICAgUGF0Y2hTZXQgcHMgPSBzY2hlbWEucGF0Y2hTZXRzKCkuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSk7Ci0gICAgICAgIE9iamVjdElkIGNvbW1pdElkID0gT2JqZWN0SWQuZnJvbVN0cmluZyhwcy5nZXRSZXZpc2lvbigpLmdldCgpKTsKLSAgICAgICAgbm90ZXMuc2V0KGNvbW1pdElkLCBjcmVhdGVOb3RlQ29udGVudChjLCBjb21taXRJZCkpOwotICAgICAgfQotCi0gICAgICBOb3Rlc0JyYW5jaFV0aWwgbm90ZXNCcmFuY2hVdGlsID0gbm90ZXNCcmFuY2hVdGlsRmFjdG9yeS5jcmVhdGUoZGIpOwotICAgICAgbm90ZXNCcmFuY2hVdGlsLmNvbW1pdEFsbE5vdGVzKG5vdGVzLCBSRUZTX05PVEVTX1JFVklFVywgYXV0aG9yLAotICAgICAgICAgIGNvbW1pdE1lc3NhZ2UpOwotICAgICAgaW5zZXJ0ZXIuZmx1c2goKTsKLSAgICB9IGNhdGNoIChDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uKGUpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICByZXZXYWxrLnJlbGVhc2UoKTsKLSAgICAgIGluc2VydGVyLnJlbGVhc2UoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdElkIGNyZWF0ZU5vdGVDb250ZW50KENoYW5nZSBjaGFuZ2UsIE9iamVjdElkIGNvbW1pdCkKLSAgICAgIHRocm93cyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiAgewotICAgIGlmICghKGNvbW1pdCBpbnN0YW5jZW9mIFJldkNvbW1pdCkpIHsKLSAgICAgIGNvbW1pdCA9IHJldldhbGsucGFyc2VDb21taXQoY29tbWl0KTsKLSAgICB9Ci0gICAgcmV0dXJuIGNyZWF0ZU5vdGVDb250ZW50KGNoYW5nZSwgKFJldkNvbW1pdCkgY29tbWl0KTsKLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0SWQgY3JlYXRlTm90ZUNvbnRlbnQoQ2hhbmdlIGNoYW5nZSwgUmV2Q29tbWl0IGNvbW1pdCkKLSAgICAgIHRocm93cyBDb2RlUmV2aWV3Tm90ZUNyZWF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFJldmlld05vdGVIZWFkZXJGb3JtYXR0ZXIgZm9ybWF0dGVyID0KLSAgICAgICAgICBuZXcgUmV2aWV3Tm90ZUhlYWRlckZvcm1hdHRlcihhdXRob3IuZ2V0VGltZVpvbmUoKSwKLSAgICAgICAgICAgICAgYW5vbnltb3VzQ293YXJkTmFtZSk7Ci0gICAgICBmaW5hbCBMaXN0PFN0cmluZz4gaWRMaXN0ID0gY29tbWl0LmdldEZvb3RlckxpbmVzKENIQU5HRV9JRCk7Ci0gICAgICBpZiAoaWRMaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgZm9ybWF0dGVyLmFwcGVuZENoYW5nZUlkKGNoYW5nZS5nZXRLZXkoKSk7Ci0gICAgICBSZXN1bHRTZXQ8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzID0KLSAgICAgICAgc2NoZW1hLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldChjaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKSk7Ci0gICAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdCA9IG51bGw7Ci0gICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFscykgewotICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpID09IDApIHsKLSAgICAgICAgICAvLyBJZ25vcmUgMCB2YWx1ZXMuCi0gICAgICAgIH0gZWxzZSBpZiAoQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQuZXF1YWxzKGEuZ2V0Q2F0ZWdvcnlJZCgpKSkgewotICAgICAgICAgIHN1Ym1pdCA9IGE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQXBwcm92YWxUeXBlIHR5cGUgPSBhcHByb3ZhbFR5cGVzLmJ5SWQoYS5nZXRDYXRlZ29yeUlkKCkpOwotICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvcm1hdHRlci5hcHBlbmRBcHByb3ZhbCgKLSAgICAgICAgICAgICAgICB0eXBlLmdldENhdGVnb3J5KCksCi0gICAgICAgICAgICAgICAgYS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgICAgIGFjY291bnRDYWNoZS5nZXQoYS5nZXRBY2NvdW50SWQoKSkuZ2V0QWNjb3VudCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHN1Ym1pdCAhPSBudWxsKSB7Ci0gICAgICAgIGZvcm1hdHRlci5hcHBlbmRTdWJtaXR0ZWRCeShhY2NvdW50Q2FjaGUuZ2V0KHN1Ym1pdC5nZXRBY2NvdW50SWQoKSkuZ2V0QWNjb3VudCgpKTsKLSAgICAgICAgZm9ybWF0dGVyLmFwcGVuZFN1Ym1pdHRlZEF0KHN1Ym1pdC5nZXRHcmFudGVkKCkpOwotICAgICAgfQotICAgICAgaWYgKGNhbm9uaWNhbFdlYlVybCAhPSBudWxsKSB7Ci0gICAgICAgIGZvcm1hdHRlci5hcHBlbmRSZXZpZXdlZE9uKGNhbm9uaWNhbFdlYlVybCwgY2hhbmdlLmdldElkKCkpOwotICAgICAgfQotICAgICAgZm9ybWF0dGVyLmFwcGVuZFByb2plY3QoY2hhbmdlLmdldFByb2plY3QoKS5nZXQoKSk7Ci0gICAgICBmb3JtYXR0ZXIuYXBwZW5kQnJhbmNoKGNoYW5nZS5nZXREZXN0KCkpOwotICAgICAgcmV0dXJuIGluc2VydGVyLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsIGZvcm1hdHRlci50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpKTsKLSAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24oY29tbWl0LCBlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0RlZmF1bHRRdWV1ZU9wLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9EZWZhdWx0UXVldWVPcC5qYXZhCmluZGV4IDgyZDA0OTMuLmNmZjY5YzYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0RlZmF1bHRRdWV1ZU9wLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvRGVmYXVsdFF1ZXVlT3AuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZhdWx0UXVldWVPcCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKQEAgLTIzLDcgKzI0LDEzIEBACiAgICAgd29ya1F1ZXVlID0gd3E7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBpbnQgZGVsYXksIGZpbmFsIFRpbWVVbml0IHVuaXQpIHsKLSAgICB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkuc2NoZWR1bGUodGhpcywgZGVsYXksIHVuaXQpOworICBwdWJsaWMgU2NoZWR1bGVkRnV0dXJlPD8+IHN0YXJ0KGxvbmcgZGVsYXksIFRpbWVVbml0IHVuaXQpIHsKKyAgICByZXR1cm4gd29ya1F1ZXVlLmdldERlZmF1bHRRdWV1ZSgpLnNjaGVkdWxlKHRoaXMsIGRlbGF5LCB1bml0KTsKKyAgfQorCisgIHB1YmxpYyBTY2hlZHVsZWRGdXR1cmU8Pz4gc3RhcnRXaXRoRml4ZWREZWxheShsb25nIGluaXRpYWxEZWxheSwgbG9uZyBkZWxheSwKKyAgICAgIFRpbWVVbml0IHVuaXQpIHsKKyAgICByZXR1cm4gd29ya1F1ZXVlLmdldERlZmF1bHRRdWV1ZSgpCisgICAgICAgIC5zY2hlZHVsZVdpdGhGaXhlZERlbGF5KHRoaXMsIGluaXRpYWxEZWxheSwgZGVsYXksIHVuaXQpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9GYXN0Rm9yd2FyZE9ubHkuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0Zhc3RGb3J3YXJkT25seS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGY0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9GYXN0Rm9yd2FyZE9ubHkuamF2YQpAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBGYXN0Rm9yd2FyZE9ubHkgZXh0ZW5kcyBTdWJtaXRTdHJhdGVneSB7CisKKyAgRmFzdEZvcndhcmRPbmx5KGZpbmFsIFN1Ym1pdFN0cmF0ZWd5LkFyZ3VtZW50cyBhcmdzKSB7CisgICAgc3VwZXIoYXJncyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIENvZGVSZXZpZXdDb21taXQgX3J1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGFyZ3MubWVyZ2VVdGlsLnJlZHVjZVRvTWluaW1hbE1lcmdlKGFyZ3MubWVyZ2VTb3J0ZXIsIHRvTWVyZ2UpOworICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbmV3TWVyZ2VUaXAgPQorICAgICAgICBhcmdzLm1lcmdlVXRpbC5nZXRGaXJzdEZhc3RGb3J3YXJkKG1lcmdlVGlwLCBhcmdzLnJ3LCB0b01lcmdlKTsKKworICAgIHdoaWxlICghdG9NZXJnZS5pc0VtcHR5KCkpIHsKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbiA9IHRvTWVyZ2UucmVtb3ZlKDApOworICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuTk9UX0ZBU1RfRk9SV0FSRDsKKyAgICB9CisKKyAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEFwcHJvdmFsID0KKyAgICAgICAgYXJncy5tZXJnZVV0aWwubWFya0NsZWFuTWVyZ2VzKGFyZ3MucncsIGFyZ3MuY2FuTWVyZ2VGbGFnLCBuZXdNZXJnZVRpcCwKKyAgICAgICAgICAgIGFyZ3MuYWxyZWFkeUFjY2VwdGVkKTsKKyAgICBzZXRSZWZMb2dJZGVudChzdWJtaXRBcHByb3ZhbCk7CisKKyAgICByZXR1cm4gbmV3TWVyZ2VUaXA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gcmV0cnlPbkxvY2tGYWlsdXJlKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGRyeVJ1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIHJldHVybiBhcmdzLm1lcmdlVXRpbC5jYW5GYXN0Rm9yd2FyZChhcmdzLm1lcmdlU29ydGVyLCBtZXJnZVRpcCwgYXJncy5ydywKKyAgICAgICAgdG9NZXJnZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dhcmJhZ2VDb2xsZWN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HYXJiYWdlQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NWU4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HYXJiYWdlQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HYXJiYWdlQ29sbGVjdGlvblJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HYXJiYWdlQ29sbGVjdENvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuVGV4dFByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjay5QYWNrQ29uZmlnOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIEdhcmJhZ2VDb2xsZWN0aW9uIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkKKyAgICAgIC5nZXRMb2dnZXIoR2FyYmFnZUNvbGxlY3Rpb24uY2xhc3MpOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19OQU1FID0gImdjX2xvZyI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBnY0xvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExPR19OQU1FKTsKKworCisgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgR2FyYmFnZUNvbGxlY3Rpb25RdWV1ZSBnY1F1ZXVlOworCisgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgR2FyYmFnZUNvbGxlY3Rpb24gY3JlYXRlKCk7CisgIH0KKworICBASW5qZWN0CisgIEdhcmJhZ2VDb2xsZWN0aW9uKEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLCBHYXJiYWdlQ29sbGVjdGlvblF1ZXVlIGdjUXVldWUpIHsKKyAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CisgICAgdGhpcy5nY1F1ZXVlID0gZ2NRdWV1ZTsKKyAgfQorCisgIHB1YmxpYyBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdCBydW4oTGlzdDxQcm9qZWN0Lk5hbWVLZXk+IHByb2plY3ROYW1lcykgeworICAgIHJldHVybiBydW4ocHJvamVjdE5hbWVzLCBudWxsKTsKKyAgfQorCisgIHB1YmxpYyBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdCBydW4oTGlzdDxQcm9qZWN0Lk5hbWVLZXk+IHByb2plY3ROYW1lcywKKyAgICAgIFByaW50V3JpdGVyIHdyaXRlcikgeworICAgIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0IHJlc3VsdCA9IG5ldyBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdCgpOworICAgIFNldDxQcm9qZWN0Lk5hbWVLZXk+IHByb2plY3RzVG9HYyA9IGdjUXVldWUuYWRkQWxsKHByb2plY3ROYW1lcyk7CisgICAgZm9yIChQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUgOiBTZXRzLmRpZmZlcmVuY2UoCisgICAgICAgIFNldHMubmV3SGFzaFNldChwcm9qZWN0TmFtZXMpLCBwcm9qZWN0c1RvR2MpKSB7CisgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yKAorICAgICAgICAgIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yLlR5cGUuR0NfQUxSRUFEWV9TQ0hFRFVMRUQsIHByb2plY3ROYW1lKSk7CisgICAgfQorICAgIGZvciAoUHJvamVjdC5OYW1lS2V5IHAgOiBwcm9qZWN0c1RvR2MpIHsKKyAgICAgIFJlcG9zaXRvcnkgcmVwbyA9IG51bGw7CisgICAgICB0cnkgeworICAgICAgICByZXBvID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkocCk7CisgICAgICAgIGxvZ0djQ29uZmlndXJhdGlvbihwLCByZXBvKTsKKyAgICAgICAgcHJpbnQod3JpdGVyLCAiY29sbGVjdGluZyBnYXJiYWdlIGZvciBcIiIgKyBwICsgIlwiOlxuIik7CisgICAgICAgIEdhcmJhZ2VDb2xsZWN0Q29tbWFuZCBnYyA9IEdpdC53cmFwKHJlcG8pLmdjKCk7CisgICAgICAgIGxvZ0djSW5mbyhwLCAiYmVmb3JlOiIsIGdjLmdldFN0YXRpc3RpY3MoKSk7CisgICAgICAgIGdjLnNldFByb2dyZXNzTW9uaXRvcih3cml0ZXIgIT0gbnVsbCA/IG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKHdyaXRlcikKKyAgICAgICAgICAgIDogTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CisgICAgICAgIFByb3BlcnRpZXMgc3RhdGlzdGljcyA9IGdjLmNhbGwoKTsKKyAgICAgICAgbG9nR2NJbmZvKHAsICJhZnRlcjogIiwgc3RhdGlzdGljcyk7CisgICAgICAgIHByaW50KHdyaXRlciwgImRvbmUuXG5cbiIpOworICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nR2NFcnJvcih3cml0ZXIsIHAsIGUpOworICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yKAorICAgICAgICAgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IuVHlwZS5SRVBPU0lUT1JZX05PVF9GT1VORCwKKyAgICAgICAgICAgIHApKTsKKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgbG9nR2NFcnJvcih3cml0ZXIsIHAsIGUpOworICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yKAorICAgICAgICAgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IuVHlwZS5HQ19GQUlMRUQsIHApKTsKKyAgICAgIH0gY2F0Y2ggKEdpdEFQSUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZ0djRXJyb3Iod3JpdGVyLCBwLCBlKTsKKyAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvcigKKyAgICAgICAgICAgIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0LkVycm9yLlR5cGUuR0NfRkFJTEVELCBwKSk7CisgICAgICB9IGNhdGNoIChKR2l0SW50ZXJuYWxFeGNlcHRpb24gZSkgeworICAgICAgICBsb2dHY0Vycm9yKHdyaXRlciwgcCwgZSk7CisgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IoCisgICAgICAgICAgICBHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvci5UeXBlLkdDX0ZBSUxFRCwgcCkpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgaWYgKHJlcG8gIT0gbnVsbCkgeworICAgICAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBnY1F1ZXVlLmdjRmluaXNoZWQocCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0djSW5mbyhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUsIFN0cmluZyBtc2cpIHsKKyAgICBsb2dHY0luZm8ocHJvamVjdE5hbWUsIG1zZywgbnVsbCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0djSW5mbyhQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUsIFN0cmluZyBtc2csCisgICAgICBQcm9wZXJ0aWVzIHN0YXRpc3RpY3MpIHsKKyAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGIuYXBwZW5kKCJbIikuYXBwZW5kKHByb2plY3ROYW1lLmdldCgpKS5hcHBlbmQoIl0gIik7CisgICAgYi5hcHBlbmQobXNnKTsKKyAgICBpZiAoc3RhdGlzdGljcyAhPSBudWxsKSB7CisgICAgICBiLmFwcGVuZCgiICIpOworICAgICAgU3RyaW5nIHMgPSBzdGF0aXN0aWNzLnRvU3RyaW5nKCk7CisgICAgICBpZiAocy5zdGFydHNXaXRoKCJ7IikgJiYgcy5lbmRzV2l0aCgifSIpKSB7CisgICAgICAgIHMgPSBzLnN1YnN0cmluZygxLCBzLmxlbmd0aCgpIC0gMSk7CisgICAgICB9CisgICAgICBiLmFwcGVuZChzKTsKKyAgICB9CisgICAgZ2NMb2cuaW5mbyhiLnRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dHY0NvbmZpZ3VyYXRpb24oUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lLAorICAgICAgUmVwb3NpdG9yeSByZXBvKSB7CisgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBDb25maWcgY2ZnID0gcmVwby5nZXRDb25maWcoKTsKKyAgICBiLmFwcGVuZChmb3JtYXRDb25maWdWYWx1ZXMoY2ZnLCBDb25maWdDb25zdGFudHMuQ09ORklHX0dDX1NFQ1RJT04sIG51bGwpKTsKKyAgICBmb3IgKFN0cmluZyBzdWJzZWN0aW9uIDogY2ZnLmdldFN1YnNlY3Rpb25zKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfR0NfU0VDVElPTikpIHsKKyAgICAgIGIuYXBwZW5kKGZvcm1hdENvbmZpZ1ZhbHVlcyhjZmcsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfR0NfU0VDVElPTiwKKyAgICAgICAgICBzdWJzZWN0aW9uKSk7CisgICAgfQorICAgIGlmIChiLmxlbmd0aCgpID09IDApIHsKKyAgICAgIGIuYXBwZW5kKCJubyBzZXQiKTsKKyAgICB9CisKKyAgICBsb2dHY0luZm8ocHJvamVjdE5hbWUsICJnYyBjb25maWc6ICIgKyBiLnRvU3RyaW5nKCkpOworICAgIGxvZ0djSW5mbyhwcm9qZWN0TmFtZSwgInBhY2sgY29uZmlnOiAiICsgKG5ldyBQYWNrQ29uZmlnKHJlcG8pKS50b1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRDb25maWdWYWx1ZXMoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sCisgICAgICBTdHJpbmcgc3Vic2VjdGlvbikgeworICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgU2V0PFN0cmluZz4gbmFtZXMgPSBjb25maWcuZ2V0TmFtZXMoc2VjdGlvbiwgc3Vic2VjdGlvbik7CisgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7CisgICAgICBTdHJpbmcgdmFsdWUgPSBjb25maWcuZ2V0U3RyaW5nKHNlY3Rpb24sIHN1YnNlY3Rpb24sIG5hbWUpOworICAgICAgYi5hcHBlbmQoc2VjdGlvbik7CisgICAgICBpZiAoc3Vic2VjdGlvbiAhPSBudWxsKSB7CisgICAgICAgIGIuYXBwZW5kKCIuIikuYXBwZW5kKHN1YnNlY3Rpb24pOworICAgICAgfQorICAgICAgYi5hcHBlbmQoIi4iKTsKKyAgICAgIGIuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPSIpLmFwcGVuZCh2YWx1ZSk7CisgICAgICBiLmFwcGVuZCgiOyAiKTsKKyAgICB9CisgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nR2NFcnJvcihQcmludFdyaXRlciB3cml0ZXIsCisgICAgICBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWUsIEV4Y2VwdGlvbiBlKSB7CisgICAgcHJpbnQod3JpdGVyLCAiZmFpbGVkLlxuXG4iKTsKKyAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGIuYXBwZW5kKCJbIikuYXBwZW5kKHByb2plY3ROYW1lLmdldCgpKS5hcHBlbmQoIl0iKTsKKyAgICBnY0xvZy5lcnJvcihiLnRvU3RyaW5nKCksIGUpOworICAgIGxvZy5lcnJvcihiLnRvU3RyaW5nKCksIGUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludChQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYgKHdyaXRlciAhPSBudWxsKSB7CisgICAgICB3cml0ZXIucHJpbnQobWVzc2FnZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HYXJiYWdlQ29sbGVjdGlvblF1ZXVlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HYXJiYWdlQ29sbGVjdGlvblF1ZXVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYzUwNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dhcmJhZ2VDb2xsZWN0aW9uUXVldWUuamF2YQpAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgR2FyYmFnZUNvbGxlY3Rpb25RdWV1ZSB7CisgIHByaXZhdGUgZmluYWwgU2V0PFByb2plY3QuTmFtZUtleT4gcHJvamVjdHNTY2hlZHVsZWRGb3JHYyA9IFNldHMubmV3SGFzaFNldCgpOworCisgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0PFByb2plY3QuTmFtZUtleT4gYWRkQWxsKENvbGxlY3Rpb248UHJvamVjdC5OYW1lS2V5PiBwcm9qZWN0cykgeworICAgIFNldDxQcm9qZWN0Lk5hbWVLZXk+IGFkZGVkID0KKyAgICAgICAgU2V0cy5uZXdMaW5rZWRIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShwcm9qZWN0cy5zaXplKCkpOworICAgIGZvciAoUHJvamVjdC5OYW1lS2V5IHAgOiBwcm9qZWN0cykgeworICAgICAgaWYgKHByb2plY3RzU2NoZWR1bGVkRm9yR2MuYWRkKHApKSB7CisgICAgICAgIGFkZGVkLmFkZChwKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFkZGVkOworICB9CisKKyAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGdjRmluaXNoZWQoUHJvamVjdC5OYW1lS2V5IHByb2plY3QpIHsKKyAgICBwcm9qZWN0c1NjaGVkdWxlZEZvckdjLnJlbW92ZShwcm9qZWN0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvR2l0TW9kdWxlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HaXRNb2R1bGUuamF2YQppbmRleCA3OTQ3ZDMwLi45ZWY3MjU2IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HaXRNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HaXRNb2R1bGUuamF2YQpAQCAtMjMsNSArMjMsNiBAQAogICAgIGZhY3RvcnkoUmVuYW1lR3JvdXBPcC5GYWN0b3J5LmNsYXNzKTsKICAgICBmYWN0b3J5KE1ldGFEYXRhVXBkYXRlLkludGVybmFsRmFjdG9yeS5jbGFzcyk7CiAgICAgYmluZChNZXRhRGF0YVVwZGF0ZS5TZXJ2ZXIuY2xhc3MpOworICAgIGJpbmQoUmVjZWl2ZUNvbmZpZy5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dpdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9HaXRSZXBvc2l0b3J5TWFuYWdlci5qYXZhCmluZGV4IDFiZjE1N2IuLjAxMTg0MDQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0dpdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvR2l0UmVwb3NpdG9yeU1hbmFnZXIuamF2YQpAQCAtMzEsMTUgKzMxLDE1IEBACiAgKiBlbnZpcm9ubWVudC4KICAqLwogcHVibGljIGludGVyZmFjZSBHaXRSZXBvc2l0b3J5TWFuYWdlciB7Ci0gIC8qKiBOb3RlcyBicmFuY2ggc3VjY2Vzc2Z1bCByZXZpZXdzIGFyZSB3cml0dGVuIHRvIGFmdGVyIGJlaW5nIG1lcmdlZC4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGU19OT1RFU19SRVZJRVcgPSAicmVmcy9ub3Rlcy9yZXZpZXciOwotCiAgIC8qKiBOb3RlIHRyZWUgbGlzdGluZyBjb21taXRzIHdlIHJlZnVzZSB7QGNvZGUgcmVmcy9tZXRhL3JlamVjdC1jb21taXRzfSAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfUkVKRUNUX0NPTU1JVFMgPSAicmVmcy9tZXRhL3JlamVjdC1jb21taXRzIjsKIAogICAvKiogQ29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYSBwcm9qZWN0IHtAY29kZSByZWZzL21ldGEvY29uZmlnfSAqLwogICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfQ09ORklHID0gInJlZnMvbWV0YS9jb25maWciOwogCisgIC8qKiBDb25maWd1cmF0aW9ucyBvZiBwcm9qZWN0LXNwZWNpZmljIGRhc2hib2FyZHMgKGNhbm5lZCBzZWFyY2ggcXVlcmllcykuICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFRlNfREFTSEJPQVJEUyA9ICJyZWZzL21ldGEvZGFzaGJvYXJkcy8iOworCiAgIC8qKgogICAgKiBQcmVmaXggYXBwbGllZCB0byBtZXJnZSBjb21taXQgYmFzZSBub2Rlcy4KICAgICogPHA+CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9MYWJlbE5vcm1hbGl6ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0xhYmVsTm9ybWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDk5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9MYWJlbE5vcm1hbGl6ZXIuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUmFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBMYWJlbE5vcm1hbGl6ZXIgeworICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKKworICBASW5qZWN0CisgIExhYmVsTm9ybWFsaXplcihDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNoYW5nZUZhY3RvcnksCisgICAgICBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSkgeworICAgIHRoaXMuY2hhbmdlRmFjdG9yeSA9IGNoYW5nZUZhY3Rvcnk7CisgICAgdGhpcy51c2VyRmFjdG9yeSA9IHVzZXJGYWN0b3J5OworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBjaGFuZ2UgY2hhbmdlIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGFwcHJvdmFscy4KKyAgICogQHBhcmFtIGFwcHJvdmFscyBsaXN0IG9mIGFwcHJvdmFscy4KKyAgICogQHJldHVybiBjb3BpZXMgb2YgYXBwcm92YWxzIG5vcm1hbGl6ZWQgdG8gdGhlIGRlZmluZWQgcmFuZ2VzIGZvciB0aGUgbGFiZWwKKyAgICogICAgIHR5cGUgYW5kIHBlcm1pc3Npb25zIGZvciB0aGUgdXNlci4gQXBwcm92YWxzIGZvciB1bmtub3duIGxhYmVscyBhcmUgbm90CisgICAqICAgICBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LCBub3IgYXJlIGFwcHJvdmFscyB3aGVyZSB0aGUgdXNlciBoYXMgbm8KKyAgICogICAgIHBlcm1pc3Npb25zIGZvciB0aGF0IGxhYmVsLgorICAgKiBAdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gbm9ybWFsaXplKENoYW5nZSBjaGFuZ2UsCisgICAgICBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscykgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5vcm1hbGl6ZSgKKyAgICAgICAgY2hhbmdlRmFjdG9yeS5jb250cm9sRm9yKGNoYW5nZSwgdXNlckZhY3RvcnkuY3JlYXRlKGNoYW5nZS5nZXRPd25lcigpKSksCisgICAgICAgIGFwcHJvdmFscyk7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGN0bCBjaGFuZ2UgY29udHJvbCBjb250YWluaW5nIHRoZSBnaXZlbiBhcHByb3ZhbHMuCisgICAqIEBwYXJhbSBhcHByb3ZhbHMgbGlzdCBvZiBhcHByb3ZhbHMuCisgICAqIEByZXR1cm4gY29waWVzIG9mIGFwcHJvdmFscyBub3JtYWxpemVkIHRvIHRoZSBkZWZpbmVkIHJhbmdlcyBmb3IgdGhlIGxhYmVsCisgICAqICAgICB0eXBlIGFuZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHVzZXIuIEFwcHJvdmFscyBmb3IgdW5rbm93biBsYWJlbHMgYXJlIG5vdAorICAgKiAgICAgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCwgbm9yIGFyZSBhcHByb3ZhbHMgd2hlcmUgdGhlIHVzZXIgaGFzIG5vCisgICAqICAgICBwZXJtaXNzaW9ucyBmb3IgdGhhdCBsYWJlbC4KKyAgICovCisgIHB1YmxpYyBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IG5vcm1hbGl6ZShDaGFuZ2VDb250cm9sIGN0bCwKKyAgICAgIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKSB7CisgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiByZXN1bHQgPQorICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoYXBwcm92YWxzLnNpemUoKSk7CisgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzID0gY3RsLmdldExhYmVsVHlwZXMoKTsKKyAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogYXBwcm92YWxzKSB7CisgICAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwc2EuZ2V0S2V5KCkuZ2V0UGFyZW50S2V5KCkuZ2V0UGFyZW50S2V5KCk7CisgICAgICBjaGVja0FyZ3VtZW50KGNoYW5nZUlkLmVxdWFscyhjdGwuZ2V0Q2hhbmdlKCkuZ2V0SWQoKSksCisgICAgICAgICAgIkFwcHJvdmFsICVzIGRvZXMgbm90IG1hdGNoIGNoYW5nZSAlcyIsCisgICAgICAgICAgcHNhLmdldEtleSgpLCBjdGwuZ2V0Q2hhbmdlKCkuZ2V0S2V5KCkpOworICAgICAgaWYgKHBzYS5pc1N1Ym1pdCgpKSB7CisgICAgICAgIHJlc3VsdC5hZGQoY29weShwc2EsIGN0bCkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIExhYmVsVHlwZSBsYWJlbCA9IGxhYmVsVHlwZXMuYnlMYWJlbChwc2EuZ2V0TGFiZWxJZCgpKTsKKyAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7CisgICAgICAgIHBzYSA9IGNvcHkocHNhLCBjdGwpOworICAgICAgICBhcHBseVR5cGVGbG9vcihsYWJlbCwgcHNhKTsKKyAgICAgICAgaWYgKGFwcGx5UmlnaHRGbG9vcihjdGwsIGxhYmVsLCBwc2EpKSB7CisgICAgICAgICAgcmVzdWx0LmFkZChwc2EpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvKioKKyAgICogQHBhcmFtIGN0bCBjaGFuZ2UgY29udHJvbCAoZm9yIGFueSB1c2VyKS4KKyAgICogQHBhcmFtIGx0IGxhYmVsIHR5cGUuCisgICAqIEBwYXJhbSBpZCBhY2NvdW50IElELgorICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGFjY291bnQgSUQgaGFzIGFueSBwZXJtaXNzaW9ucyB0byB2b3RlIG9uIHRoaXMKKyAgICogICAgIGxhYmVsIGZvciB0aGlzIGNoYW5nZS4KKyAgICovCisgIHB1YmxpYyBib29sZWFuIGNhblZvdGUoQ2hhbmdlQ29udHJvbCBjdGwsIExhYmVsVHlwZSBsdCwgQWNjb3VudC5JZCBpZCkgeworICAgIHJldHVybiAhZ2V0UmFuZ2UoY3RsLCBsdCwgaWQpLmlzRW1wdHkoKTsKKyAgfQorCisgIHByaXZhdGUgUGF0Y2hTZXRBcHByb3ZhbCBjb3B5KFBhdGNoU2V0QXBwcm92YWwgc3JjLCBDaGFuZ2VDb250cm9sIGN0bCkgeworICAgIFBhdGNoU2V0QXBwcm92YWwgZGVzdCA9IG5ldyBQYXRjaFNldEFwcHJvdmFsKHNyYy5nZXRQYXRjaFNldElkKCksIHNyYyk7CisgICAgZGVzdC5jYWNoZShjdGwuZ2V0Q2hhbmdlKCkpOworICAgIHJldHVybiBkZXN0OworICB9CisKKyAgcHJpdmF0ZSBQZXJtaXNzaW9uUmFuZ2UgZ2V0UmFuZ2UoQ2hhbmdlQ29udHJvbCBjdGwsIExhYmVsVHlwZSBsdCwKKyAgICAgIEFjY291bnQuSWQgaWQpIHsKKyAgICBTdHJpbmcgcGVybWlzc2lvbiA9IFBlcm1pc3Npb24uZm9yTGFiZWwobHQuZ2V0TmFtZSgpKTsKKyAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gdXNlckZhY3RvcnkuY3JlYXRlKGlkKTsKKyAgICByZXR1cm4gY3RsLmZvclVzZXIodXNlcikuZ2V0UmFuZ2UocGVybWlzc2lvbik7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gYXBwbHlSaWdodEZsb29yKENoYW5nZUNvbnRyb2wgY3RsLCBMYWJlbFR5cGUgbHQsCisgICAgICBQYXRjaFNldEFwcHJvdmFsIGEpIHsKKyAgICBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UgPSBnZXRSYW5nZShjdGwsIGx0LCBhLmdldEFjY291bnRJZCgpKTsKKyAgICBpZiAocmFuZ2UuaXNFbXB0eSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGEuc2V0VmFsdWUoKHNob3J0KSByYW5nZS5zcXVhc2goYS5nZXRWYWx1ZSgpKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXBwbHlUeXBlRmxvb3IoTGFiZWxUeXBlIGx0LCBQYXRjaFNldEFwcHJvdmFsIGEpIHsKKyAgICBMYWJlbFZhbHVlIGF0TWluID0gbHQuZ2V0TWluKCk7CisgICAgaWYgKGF0TWluICE9IG51bGwgJiYgYS5nZXRWYWx1ZSgpIDwgYXRNaW4uZ2V0VmFsdWUoKSkgeworICAgICAgYS5zZXRWYWx1ZShhdE1pbi5nZXRWYWx1ZSgpKTsKKyAgICB9CisgICAgTGFiZWxWYWx1ZSBhdE1heCA9IGx0LmdldE1heCgpOworICAgIGlmIChhdE1heCAhPSBudWxsICYmIGEuZ2V0VmFsdWUoKSA+IGF0TWF4LmdldFZhbHVlKCkpIHsKKyAgICAgIGEuc2V0VmFsdWUoYXRNYXguZ2V0VmFsdWUoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXIuamF2YQppbmRleCA0ZTNmMzI0Li4xY2E3NGIxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L0xvY2FsRGlza1JlcG9zaXRvcnlNYW5hZ2VyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Vzc2lvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5Mb2NrRmlsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKQEAgLTMzLDggKzM0LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5Q2FjaGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeUNhY2hlLkZpbGVLZXk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkxvY2tGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkpzY2hDb25maWdTZXNzaW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5PcGVuU3NoQ29uZmlnOwpAQCAtNzgsMTEgKzc3LDExIEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIExpZmVjeWNsZSBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbmZpZyBjZmc7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25maWcgc2VydmVyQ29uZmlnOwogCiAgICAgQEluamVjdAogICAgIExpZmVjeWNsZShAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcpIHsKLSAgICAgIHRoaXMuY2ZnID0gY2ZnOworICAgICAgdGhpcy5zZXJ2ZXJDb25maWcgPSBjZmc7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05Niw5ICs5NSwzNCBAQAogICAgICAgICB9CiAgICAgICB9KTsKIAotICAgICAgZmluYWwgV2luZG93Q2FjaGVDb25maWcgYyA9IG5ldyBXaW5kb3dDYWNoZUNvbmZpZygpOwotICAgICAgYy5mcm9tQ29uZmlnKGNmZyk7Ci0gICAgICBXaW5kb3dDYWNoZS5yZWNvbmZpZ3VyZShjKTsKKyAgICAgIFdpbmRvd0NhY2hlQ29uZmlnIGNmZyA9IG5ldyBXaW5kb3dDYWNoZUNvbmZpZygpOworICAgICAgY2ZnLmZyb21Db25maWcoc2VydmVyQ29uZmlnKTsKKyAgICAgIGlmIChzZXJ2ZXJDb25maWcuZ2V0U3RyaW5nKCJjb3JlIiwgbnVsbCwgInN0cmVhbUZpbGVUaHJlc2hvbGQiKSA9PSBudWxsKSB7CisgICAgICAgIGxvbmcgbXggPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5tYXhNZW1vcnkoKTsKKyAgICAgICAgaW50IGxpbWl0ID0gKGludCkgTWF0aC5taW4oCisgICAgICAgICAgICBteCAvIDQsIC8vIGRvbid0IHVzZSBtb3JlIHRoYW4gMS80IG9mIHRoZSBoZWFwLgorICAgICAgICAgICAgMjA0NyA8PCAyMCk7IC8vIGNhbm5vdCBleGNlZWQgYXJyYXkgbGVuZ3RoCisgICAgICAgIGlmICgoNSA8PCAyMCkgPCBsaW1pdCAmJiBsaW1pdCAlICgxIDw8IDIwKSAhPSAwKSB7CisgICAgICAgICAgLy8gSWYgdGhlIGxpbWl0IGlzIGF0IGxlYXN0IDUgTWlCIGJ1dCBpcyBub3QgYSB3aG9sZSBtdWx0aXBsZQorICAgICAgICAgIC8vIG9mIE1pQiByb3VuZCB1cCB0byB0aGUgbmV4dCBvbmUgZnVsbCBtZWdhYnl0ZS4gVGhpcyBpcyBhIHZlcnkKKyAgICAgICAgICAvLyB0aW55IG1lbW9yeSBpbmNyZWFzZSBpbiBleGNoYW5nZSBmb3IgbmljZSByb3VuZCB1bml0cy4KKyAgICAgICAgICBsaW1pdCA9ICgobGltaXQgLyAoMSA8PCAyMCkpICsgMSkgPDwgMjA7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGVzYzsKKyAgICAgICAgaWYgKGxpbWl0ICUgKDEgPDwgMjApID09IDApIHsKKyAgICAgICAgICBkZXNjID0gU3RyaW5nLmZvcm1hdCgiJWRtIiwgbGltaXQgLyAoMSA8PCAyMCkpOworICAgICAgICB9IGVsc2UgaWYgKGxpbWl0ICUgKDEgPDwgMTApID09IDApIHsKKyAgICAgICAgICBkZXNjID0gU3RyaW5nLmZvcm1hdCgiJWRrIiwgbGltaXQgLyAoMSA8PCAxMCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc2MgPSBTdHJpbmcuZm9ybWF0KCIlZCIsIGxpbWl0KTsKKyAgICAgICAgfQorICAgICAgICBsb2cuaW5mbyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkRlZmF1bHRpbmcgY29yZS5zdHJlYW1GaWxlVGhyZXNob2xkIHRvICVzIiwKKyAgICAgICAgICAgIGRlc2MpKTsKKyAgICAgICAgY2ZnLnNldFN0cmVhbUZpbGVUaHJlc2hvbGQobGltaXQpOworICAgICAgfQorICAgICAgY2ZnLmluc3RhbGwoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE3NywxMCArMjAxLDcgQEAKICAgICAgIC8vIEl0IGRvZXNuJ3QgZXhpc3QgdW5kZXIgYW55IG9mIHRoZSBzdGFuZGFyZCBwZXJtdXRhdGlvbnMKICAgICAgIC8vIG9mIHRoZSByZXBvc2l0b3J5IG5hbWUsIHNvIHByZWZlciB0aGUgc3RhbmRhcmQgYmFyZSBuYW1lLgogICAgICAgLy8KLSAgICAgIFN0cmluZyBuID0gbmFtZS5nZXQoKTsKLSAgICAgIGlmICghbi5lbmRzV2l0aChDb25zdGFudHMuRE9UX0dJVF9FWFQpKSB7Ci0gICAgICAgIG4gPSBuICsgQ29uc3RhbnRzLkRPVF9HSVRfRVhUOwotICAgICAgfQorICAgICAgU3RyaW5nIG4gPSBuYW1lLmdldCgpICsgQ29uc3RhbnRzLkRPVF9HSVRfRVhUOwogICAgICAgbG9jID0gRmlsZUtleS5leGFjdChuZXcgRmlsZShiYXNlUGF0aCwgbiksIEZTLkRFVEVDVEVEKTsKICAgICB9CiAKQEAgLTI5MCw3ICszMTEsNyBAQAogICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHJldHVybiB0cnVlOyAvLyBubyBlbXB0eSBwYXRocwogICAgIGlmIChuYW1lLmNoYXJBdChuYW1lLmxlbmd0aCgpIC0xKSA9PSAnLycpIHJldHVybiB0cnVlOyAvLyBubyBzdWZmaXgKIAotICAgIGlmIChuYW1lLmluZGV4T2YoJ1xcJykgPj0gMCkgcmV0dXJuIHRydWU7IC8vIG5vIHdpbmRvd3MvZG9zIHN0bHllIHBhdGhzCisgICAgaWYgKG5hbWUuaW5kZXhPZignXFwnKSA+PSAwKSByZXR1cm4gdHJ1ZTsgLy8gbm8gd2luZG93cy9kb3Mgc3R5bGUgcGF0aHMKICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gJy8nKSByZXR1cm4gdHJ1ZTsgLy8gbm8gYWJzb2x1dGUgcGF0aHMKICAgICBpZiAobmV3IEZpbGUobmFtZSkuaXNBYnNvbHV0ZSgpKSByZXR1cm4gdHJ1ZTsgLy8gbm8gYWJzb2x1dGUgcGF0aHMKIApAQCAtMjk4LDYgKzMxOSwxNSBAQAogICAgIGlmIChuYW1lLmNvbnRhaW5zKCIvLi4vIikpIHJldHVybiB0cnVlOyAvLyBubyAiZm9vLy4uL2V0Yy9wYXNzd2QiCiAgICAgaWYgKG5hbWUuY29udGFpbnMoIi8uLyIpKSByZXR1cm4gdHJ1ZTsgLy8gImZvby8uL2ZvbyIgaXMgaW5zYW5lIHRvIGFzawogICAgIGlmIChuYW1lLmNvbnRhaW5zKCIvLyIpKSByZXR1cm4gdHJ1ZTsgLy8gd2luZG93cyBVTkMgcGF0aCBjYW4gYmUgIi8vLi4uIgorICAgIGlmIChuYW1lLmNvbnRhaW5zKCI/IikpIHJldHVybiB0cnVlOyAvLyBjb21tb24gdW5peCB3aWxkY2FyZAorICAgIGlmIChuYW1lLmNvbnRhaW5zKCIlIikpIHJldHVybiB0cnVlOyAvLyB3aWxkY2FyZCBvciBzdHJpbmcgcGFyYW1ldGVyCisgICAgaWYgKG5hbWUuY29udGFpbnMoIioiKSkgcmV0dXJuIHRydWU7IC8vIHdpbGRjYXJkCisgICAgaWYgKG5hbWUuY29udGFpbnMoIjoiKSkgcmV0dXJuIHRydWU7IC8vIENvdWxkIGJlIHVzZWQgZm9yIGFic29sdXRlIHBhdGhzIGluIHdpbmRvd3M/CisgICAgaWYgKG5hbWUuY29udGFpbnMoIjwiKSkgcmV0dXJuIHRydWU7IC8vIHJlZGlyZWN0IGlucHV0CisgICAgaWYgKG5hbWUuY29udGFpbnMoIj4iKSkgcmV0dXJuIHRydWU7IC8vIHJlZGlyZWN0IG91dHB1dAorICAgIGlmIChuYW1lLmNvbnRhaW5zKCJ8IikpIHJldHVybiB0cnVlOyAvLyBwaXBlCisgICAgaWYgKG5hbWUuY29udGFpbnMoIiQiKSkgcmV0dXJuIHRydWU7IC8vIGRvbGxhciBzaWduCisgICAgaWYgKG5hbWUuY29udGFpbnMoIlxyIikpIHJldHVybiB0cnVlOyAvLyBjYXJyaWFnZSByZXR1cm4KIAogICAgIHJldHVybiBmYWxzZTsgLy8gaXMgYSByZWFzb25hYmxlIG5hbWUKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VBbHdheXMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlQWx3YXlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzYTQwZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlQWx3YXlzLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgTWVyZ2VBbHdheXMgZXh0ZW5kcyBTdWJtaXRTdHJhdGVneSB7CisKKyAgTWVyZ2VBbHdheXMoZmluYWwgU3VibWl0U3RyYXRlZ3kuQXJndW1lbnRzIGFyZ3MpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgQ29kZVJldmlld0NvbW1pdCBfcnVuKGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgYXJncy5tZXJnZVV0aWwucmVkdWNlVG9NaW5pbWFsTWVyZ2UoYXJncy5tZXJnZVNvcnRlciwgdG9NZXJnZSk7CisKKyAgICBDb2RlUmV2aWV3Q29tbWl0IG5ld01lcmdlVGlwID0gbWVyZ2VUaXA7CisgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgeworICAgICAgbmV3TWVyZ2VUaXAgPQorICAgICAgICAgIGFyZ3MubWVyZ2VVdGlsLm1lcmdlT25lQ29tbWl0KGFyZ3MubXlJZGVudCwgYXJncy5yZXBvLCBhcmdzLnJ3LAorICAgICAgICAgICAgICBhcmdzLmluc2VydGVyLCBhcmdzLmNhbk1lcmdlRmxhZywgYXJncy5kZXN0QnJhbmNoLCBtZXJnZVRpcCwKKyAgICAgICAgICAgICAgdG9NZXJnZS5yZW1vdmUoMCkpOworICAgIH0KKworICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0QXBwcm92YWwgPQorICAgICAgICBhcmdzLm1lcmdlVXRpbC5tYXJrQ2xlYW5NZXJnZXMoYXJncy5ydywgYXJncy5jYW5NZXJnZUZsYWcsIG5ld01lcmdlVGlwLAorICAgICAgICAgICAgYXJncy5hbHJlYWR5QWNjZXB0ZWQpOworICAgIHNldFJlZkxvZ0lkZW50KHN1Ym1pdEFwcHJvdmFsKTsKKworICAgIHJldHVybiBuZXdNZXJnZVRpcDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBkcnlSdW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gYXJncy5tZXJnZVV0aWwuY2FuTWVyZ2UoYXJncy5tZXJnZVNvcnRlciwgYXJncy5yZXBvLCBtZXJnZVRpcCwKKyAgICAgICAgdG9NZXJnZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDE5OTdjMTMuLjU0Y2QzMjkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlRXhjZXB0aW9uLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VFeGNlcHRpb24uamF2YQpAQCAtMTgsMTEgKzE4LDExIEBACiBwdWJsaWMgY2xhc3MgTWVyZ2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotICBNZXJnZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbXNnKSB7CisgIHB1YmxpYyBNZXJnZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbXNnKSB7CiAgICAgc3VwZXIobXNnLCBudWxsKTsKICAgfQogCi0gIE1lcmdlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIFRocm93YWJsZSB3aHkpIHsKKyAgcHVibGljIE1lcmdlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIFRocm93YWJsZSB3aHkpIHsKICAgICBzdXBlcihtc2csIHdoeSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlSWZOZWNlc3NhcnkuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlSWZOZWNlc3NhcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFlZGIyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VJZk5lY2Vzc2FyeS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIE1lcmdlSWZOZWNlc3NhcnkgZXh0ZW5kcyBTdWJtaXRTdHJhdGVneSB7CisKKyAgTWVyZ2VJZk5lY2Vzc2FyeShmaW5hbCBTdWJtaXRTdHJhdGVneS5Bcmd1bWVudHMgYXJncykgeworICAgIHN1cGVyKGFyZ3MpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBDb2RlUmV2aWV3Q29tbWl0IF9ydW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBhcmdzLm1lcmdlVXRpbC5yZWR1Y2VUb01pbmltYWxNZXJnZShhcmdzLm1lcmdlU29ydGVyLCB0b01lcmdlKTsKKyAgICBDb2RlUmV2aWV3Q29tbWl0IG5ld01lcmdlVGlwID0KKyAgICAgICAgYXJncy5tZXJnZVV0aWwuZ2V0Rmlyc3RGYXN0Rm9yd2FyZChtZXJnZVRpcCwgYXJncy5ydywgdG9NZXJnZSk7CisKKyAgICAvLyBGb3IgZXZlcnkgb3RoZXIgY29tbWl0IGRvIGEgcGFpci13aXNlIG1lcmdlLgorICAgIHdoaWxlICghdG9NZXJnZS5pc0VtcHR5KCkpIHsKKyAgICAgIG5ld01lcmdlVGlwID0KKyAgICAgICAgICBhcmdzLm1lcmdlVXRpbC5tZXJnZU9uZUNvbW1pdChhcmdzLm15SWRlbnQsIGFyZ3MucmVwbywgYXJncy5ydywKKyAgICAgICAgICAgICAgYXJncy5pbnNlcnRlciwgYXJncy5jYW5NZXJnZUZsYWcsIGFyZ3MuZGVzdEJyYW5jaCwgbWVyZ2VUaXAsCisgICAgICAgICAgICAgIHRvTWVyZ2UucmVtb3ZlKDApKTsKKyAgICB9CisKKyAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEFwcHJvdmFsID0gYXJncy5tZXJnZVV0aWwubWFya0NsZWFuTWVyZ2VzKAorICAgICAgICBhcmdzLnJ3LCBhcmdzLmNhbk1lcmdlRmxhZywgbmV3TWVyZ2VUaXAsIGFyZ3MuYWxyZWFkeUFjY2VwdGVkKTsKKyAgICBzZXRSZWZMb2dJZGVudChzdWJtaXRBcHByb3ZhbCk7CisKKyAgICByZXR1cm4gbmV3TWVyZ2VUaXA7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZHJ5UnVuKGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGFyZ3MubWVyZ2VVdGlsLmNhbkZhc3RGb3J3YXJkKAorICAgICAgICAgIGFyZ3MubWVyZ2VTb3J0ZXIsIG1lcmdlVGlwLCBhcmdzLnJ3LCB0b01lcmdlKQorICAgICAgICB8fCBhcmdzLm1lcmdlVXRpbC5jYW5NZXJnZSgKKyAgICAgICAgICBhcmdzLm1lcmdlU29ydGVyLCBhcmdzLnJlcG8sIG1lcmdlVGlwLCB0b01lcmdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VPcC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VPcC5qYXZhCmluZGV4IDJlOGYxODMuLmRhY2UwYWUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlT3AuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZU9wLmphdmEKQEAgLTE0LDMwICsxNCwzNSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZVV0aWwuZ2V0U3VibWl0dGVyOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5EQVlTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTlVURVM7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RNdWx0aW1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNhcGFibGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRUeXBlUmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuU3VibWl0VHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUmV2SWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DaGFuZ2VVdGlsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQWxsUHJvamVjdHNOYW1lOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1lcmdlRmFpbFNlbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5NZXJnZWRTZW5kZXI7CkBAIC00NSwyNCArNTAsMjAgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNoYW5nZUNvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci53b3JrZmxvdy5DYXRlZ29yeUZ1bmN0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci53b3JrZmxvdy5GdW5jdGlvblN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUNvbmN1cnJlbmN5RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKQEAgLTcwLDExICs3MSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuTWVyZ2VTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLk1lcmdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLlRocmVlV2F5TWVyZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLkZvb3RlckxpbmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2RmxhZzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2U29ydDsKQEAgLTgzLDIxICs3OSwxNSBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuVGltZXN0YW1wOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiAvKioKICAqIE1lcmdlcyBjaGFuZ2VzIGluIHN1Ym1pc3Npb24gb3JkZXIgaW50byBhIHNpbmdsZSBicmFuY2guCkBAIC0xMTksNTMgKzEwOSw0NyBAQAogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1lcmdlT3AuY2xhc3MpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUl9IRUFEU19NQVNURVIgPQotICAgICAgQ29uc3RhbnRzLlJfSEVBRFMgKyBDb25zdGFudHMuTUFTVEVSOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcHByb3ZhbENhdGVnb3J5LklkIENSVlcgPQotICAgICAgbmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoIkNSVlciKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBWUklGID0KLSAgICAgIG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKCJWUklGIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBSRVZJRVdFRF9PTiA9IG5ldyBGb290ZXJLZXkoIlJldmlld2VkLW9uIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBDSEFOR0VfSUQgPSBuZXcgRm9vdGVyS2V5KCJDaGFuZ2UtSWQiKTsKIAogICAvKiogQW1vdW50IG9mIHRpbWUgdG8gd2FpdCBiZXR3ZWVuIHN1Ym1pdCBhbmQgY2hlY2tpbmcgZm9yIG1pc3NpbmcgZGVwcy4gKi8KICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERVBFTkRFTkNZX0RFTEFZID0KICAgICAgIE1JTExJU0VDT05EUy5jb252ZXJ0KDE1LCBNSU5VVEVTKTsKIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIExPQ0tfRkFJTFVSRV9SRVRSWV9ERUxBWSA9CisgICAgICBNSUxMSVNFQ09ORFMuY29udmVydCgxNSwgU0VDT05EUyk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBEVVBMSUNBVEVfTUVTU0FHRV9JTlRFUlZBTCA9CisgICAgICBNSUxMSVNFQ09ORFMuY29udmVydCgxLCBEQVlTKTsKKwogICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwogICBwcml2YXRlIGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IHNjaGVtYUZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZTsKLSAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvblN0YXRlLkZhY3RvcnkgZnVuY3Rpb25TdGF0ZTsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIGZpbmFsIExhYmVsTm9ybWFsaXplciBsYWJlbE5vcm1hbGl6ZXI7CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOwogICBwcml2YXRlIGZpbmFsIE1lcmdlZFNlbmRlci5GYWN0b3J5IG1lcmdlZFNlbmRlckZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgTWVyZ2VGYWlsU2VuZGVyLkZhY3RvcnkgbWVyZ2VGYWlsU2VuZGVyRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKICAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgTWVyZ2VRdWV1ZSBtZXJnZVF1ZXVlOwogCi0gIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKICAgcHJpdmF0ZSBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoOwotICBwcml2YXRlIFByb2plY3QgZGVzdFByb2plY3Q7Ci0gIHByaXZhdGUgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlOwotICBwcml2YXRlIExpc3Q8Q2hhbmdlPiBzdWJtaXR0ZWQ7CisgIHByaXZhdGUgUHJvamVjdFN0YXRlIGRlc3RQcm9qZWN0OworICBwcml2YXRlIGZpbmFsIExpc3RNdWx0aW1hcDxTdWJtaXRUeXBlLCBDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlOworICBwcml2YXRlIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gcG90ZW50aWFsbHlTdGlsbFN1Ym1pdHRhYmxlOwogICBwcml2YXRlIGZpbmFsIE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+IGNvbW1pdHM7CiAgIHByaXZhdGUgUmV2aWV3RGIgZGI7CiAgIHByaXZhdGUgUmVwb3NpdG9yeSByZXBvOwogICBwcml2YXRlIFJldldhbGsgcnc7Ci0gIHByaXZhdGUgUmV2RmxhZyBDQU5fTUVSR0U7CisgIHByaXZhdGUgUmV2RmxhZyBjYW5NZXJnZUZsYWc7CiAgIHByaXZhdGUgQ29kZVJldmlld0NvbW1pdCBicmFuY2hUaXA7CiAgIHByaXZhdGUgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcDsKLSAgcHJpdmF0ZSBTZXQ8UmV2Q29tbWl0PiBhbHJlYWR5QWNjZXB0ZWQ7Ci0gIHByaXZhdGUgUmVmVXBkYXRlIGJyYW5jaFVwZGF0ZTsKICAgcHJpdmF0ZSBPYmplY3RJbnNlcnRlciBpbnNlcnRlcjsKKyAgcHJpdmF0ZSBQZXJzb25JZGVudCByZWZMb2dJZGVudDsKIAogICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOwogICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CiAgIHByaXZhdGUgZmluYWwgVGFnQ2FjaGUgdGFnQ2FjaGU7Ci0gIHByaXZhdGUgZmluYWwgQ3JlYXRlQ29kZVJldmlld05vdGVzLkZhY3RvcnkgY29kZVJldmlld05vdGVzRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBTdWJtaXRTdHJhdGVneUZhY3Rvcnkgc3VibWl0U3RyYXRlZ3lGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFN1Ym1vZHVsZU9wLkZhY3Rvcnkgc3ViT3BGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFdvcmtRdWV1ZSB3b3JrUXVldWU7CiAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFNjb3BlUHJvcGFnYXRvciByZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwpAQCAtMTczLDMwICsxNTcsMjcgQEAKIAogICBASW5qZWN0CiAgIE1lcmdlT3AoZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ3JtLCBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzZiwKLSAgICAgIGZpbmFsIFByb2plY3RDYWNoZSBwYywgZmluYWwgRnVuY3Rpb25TdGF0ZS5GYWN0b3J5IGZzLAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBycSwgZmluYWwgTWVyZ2VkU2VuZGVyLkZhY3RvcnkgbXNmLAorICAgICAgZmluYWwgUHJvamVjdENhY2hlIHBjLCBmaW5hbCBMYWJlbE5vcm1hbGl6ZXIgZnMsCisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdydSwgZmluYWwgTWVyZ2VkU2VuZGVyLkZhY3RvcnkgbXNmLAogICAgICAgZmluYWwgTWVyZ2VGYWlsU2VuZGVyLkZhY3RvcnkgbWZzZiwKLSAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gY3d1LAotICAgICAgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzLCBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBzaWYsCisgICAgICBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXMsIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcHNpZiwKICAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGl1ZiwKICAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCi0gICAgICBAR2Vycml0UGVyc29uSWRlbnQgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudCwKICAgICAgIGZpbmFsIE1lcmdlUXVldWUgbWVyZ2VRdWV1ZSwgQEFzc2lzdGVkIGZpbmFsIEJyYW5jaC5OYW1lS2V5IGJyYW5jaCwKICAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLCBmaW5hbCBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAotICAgICAgZmluYWwgVGFnQ2FjaGUgdGFnQ2FjaGUsIGZpbmFsIENyZWF0ZUNvZGVSZXZpZXdOb3Rlcy5GYWN0b3J5IGNybmYsCisgICAgICBmaW5hbCBUYWdDYWNoZSB0YWdDYWNoZSwKKyAgICAgIGZpbmFsIFN1Ym1pdFN0cmF0ZWd5RmFjdG9yeSBzdWJtaXRTdHJhdGVneUZhY3RvcnksCiAgICAgICBmaW5hbCBTdWJtb2R1bGVPcC5GYWN0b3J5IHN1Yk9wRmFjdG9yeSwKICAgICAgIGZpbmFsIFdvcmtRdWV1ZSB3b3JrUXVldWUsCiAgICAgICBmaW5hbCBSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yIHJlcXVlc3RTY29wZVByb3BhZ2F0b3IsCiAgICAgICBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lKSB7CiAgICAgcmVwb01hbmFnZXIgPSBncm07CiAgICAgc2NoZW1hRmFjdG9yeSA9IHNmOwotICAgIGZ1bmN0aW9uU3RhdGUgPSBmczsKKyAgICBsYWJlbE5vcm1hbGl6ZXIgPSBmczsKICAgICBwcm9qZWN0Q2FjaGUgPSBwYzsKLSAgICByZXBsaWNhdGlvbiA9IHJxOworICAgIGdpdFJlZlVwZGF0ZWQgPSBncnU7CiAgICAgbWVyZ2VkU2VuZGVyRmFjdG9yeSA9IG1zZjsKICAgICBtZXJnZUZhaWxTZW5kZXJGYWN0b3J5ID0gbWZzZjsKLSAgICB1cmxQcm92aWRlciA9IGN3dTsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhcHByb3ZhbFR5cGVzOwogICAgIHBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwc2lmOwogICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeSA9IGl1ZjsKICAgICB0aGlzLmNoYW5nZUNvbnRyb2xGYWN0b3J5ID0gY2hhbmdlQ29udHJvbEZhY3Rvcnk7CkBAIC0yMDQsMjQgKzE4NSwyMiBAQAogICAgIHRoaXMuaG9va3MgPSBob29rczsKICAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKICAgICB0aGlzLnRhZ0NhY2hlID0gdGFnQ2FjaGU7Ci0gICAgY29kZVJldmlld05vdGVzRmFjdG9yeSA9IGNybmY7CisgICAgdGhpcy5zdWJtaXRTdHJhdGVneUZhY3RvcnkgPSBzdWJtaXRTdHJhdGVneUZhY3Rvcnk7CiAgICAgdGhpcy5zdWJPcEZhY3RvcnkgPSBzdWJPcEZhY3Rvcnk7CiAgICAgdGhpcy53b3JrUXVldWUgPSB3b3JrUXVldWU7CiAgICAgdGhpcy5yZXF1ZXN0U2NvcGVQcm9wYWdhdG9yID0gcmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKICAgICB0aGlzLmFsbFByb2plY3RzTmFtZSA9IGFsbFByb2plY3RzTmFtZTsKLSAgICB0aGlzLm15SWRlbnQgPSBteUlkZW50OwogICAgIGRlc3RCcmFuY2ggPSBicmFuY2g7Ci0gICAgdG9NZXJnZSA9IG5ldyBBcnJheUxpc3Q8Q29kZVJldmlld0NvbW1pdD4oKTsKKyAgICB0b01lcmdlID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgcG90ZW50aWFsbHlTdGlsbFN1Ym1pdHRhYmxlID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOwogICAgIGNvbW1pdHMgPSBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+KCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB2ZXJpZnlNZXJnZWFiaWxpdHkoQ2hhbmdlIGNoYW5nZSkgeworICBwdWJsaWMgdm9pZCB2ZXJpZnlNZXJnZWFiaWxpdHkoQ2hhbmdlIGNoYW5nZSkgdGhyb3dzIE5vU3VjaFByb2plY3RFeGNlcHRpb24gewogICAgIHRyeSB7CiAgICAgICBzZXREZXN0UHJvamVjdCgpOwogICAgICAgb3BlblJlcG9zaXRvcnkoKTsKICAgICAgIGZpbmFsIFJlZiBkZXN0QnJhbmNoUmVmID0gcmVwby5nZXRSZWYoZGVzdEJyYW5jaC5nZXQoKSk7Ci0gICAgICBzdWJtaXR0ZWQgPSBuZXcgQXJyYXlMaXN0PENoYW5nZT4oKTsKLSAgICAgIHN1Ym1pdHRlZC5hZGQoY2hhbmdlKTsKIAogICAgICAgLy8gVGVzdCBtZXJnZWFiaWxpdHkgb2YgdGhlIGNoYW5nZSBpZiB0aGUgbGFzdCBtZXJnZWQgc2hhMQogICAgICAgLy8gaW4gdGhlIGJyYW5jaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbGFzdCBzaGExCkBAIC0yMzEsMTcgKzIxMCwyNyBAQAogICAgICAgICAgIHx8IChkZXN0QnJhbmNoUmVmICE9IG51bGwgJiYgIWRlc3RCcmFuY2hSZWYuZ2V0T2JqZWN0SWQoKS5nZXROYW1lKCkKICAgICAgICAgICAgICAgLmVxdWFscyhjaGFuZ2UuZ2V0TGFzdFNoYTFNZXJnZVRlc3RlZCgpLmdldCgpKSkpIHsKICAgICAgICAgb3BlblNjaGVtYSgpOwotICAgICAgICBwcmVNZXJnZSgpOworICAgICAgICBvcGVuQnJhbmNoKCk7CisgICAgICAgIHZhbGlkYXRlQ2hhbmdlTGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNoYW5nZSkpOworICAgICAgICBpZiAoIXRvTWVyZ2UuaXNFbXB0eSgpKSB7CisgICAgICAgICAgZmluYWwgRW50cnk8U3VibWl0VHlwZSwgQ29kZVJldmlld0NvbW1pdD4gZSA9CisgICAgICAgICAgICAgIHRvTWVyZ2UuZW50cmllcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNNZXJnZWFibGUgPQorICAgICAgICAgICAgICBjcmVhdGVTdHJhdGVneShlLmdldEtleSgpKS5kcnlSdW4oYnJhbmNoVGlwLCBlLmdldFZhbHVlKCkpOwogCi0gICAgICAgIC8vIHVwZGF0ZSBzaGExIHRlc3RlZCBtZXJnZS4KLSAgICAgICAgaWYgKGRlc3RCcmFuY2hSZWYgIT0gbnVsbCkgewotICAgICAgICAgIGNoYW5nZS5zZXRMYXN0U2hhMU1lcmdlVGVzdGVkKG5ldyBSZXZJZChkZXN0QnJhbmNoUmVmCi0gICAgICAgICAgICAgIC5nZXRPYmplY3RJZCgpLmdldE5hbWUoKSkpOworICAgICAgICAgIC8vIHVwZGF0ZSBzaGExIHRlc3RlZCBtZXJnZS4KKyAgICAgICAgICBpZiAoZGVzdEJyYW5jaFJlZiAhPSBudWxsKSB7CisgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFNoYTFNZXJnZVRlc3RlZChuZXcgUmV2SWQoZGVzdEJyYW5jaFJlZgorICAgICAgICAgICAgICAgIC5nZXRPYmplY3RJZCgpLmdldE5hbWUoKSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFuZ2Uuc2V0TGFzdFNoYTFNZXJnZVRlc3RlZChuZXcgUmV2SWQoIiIpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2hhbmdlLnNldE1lcmdlYWJsZShpc01lcmdlYWJsZSk7CisgICAgICAgICAgZGIuY2hhbmdlcygpLnVwZGF0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oY2hhbmdlKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2hhbmdlLnNldExhc3RTaGExTWVyZ2VUZXN0ZWQobmV3IFJldklkKCIiKSk7CisgICAgICAgICAgbG9nLmVycm9yKCJUZXN0IG1lcmdlIGF0dGVtcHQgZm9yIGNoYW5nZTogIiArIGNoYW5nZS5nZXRJZCgpCisgICAgICAgICAgICAgICsgIiBmYWlsZWQiKTsKICAgICAgICAgfQotICAgICAgICBjaGFuZ2Uuc2V0TWVyZ2VhYmxlKGlzTWVyZ2VhYmxlKGNoYW5nZSkpOwotICAgICAgICBkYi5jaGFuZ2VzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihjaGFuZ2UpKTsKICAgICAgIH0KICAgICB9IGNhdGNoIChNZXJnZUV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cuZXJyb3IoIlRlc3QgbWVyZ2UgYXR0ZW1wdCBmb3IgY2hhbmdlOiAiICsgY2hhbmdlLmdldElkKCkKQEAgLTI2MywxMSArMjUyLDEwIEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgc2V0RGVzdFByb2plY3QoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24gewotICAgIGZpbmFsIFByb2plY3RTdGF0ZSBwZSA9IHByb2plY3RDYWNoZS5nZXQoZGVzdEJyYW5jaC5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgaWYgKHBlID09IG51bGwpIHsKKyAgICBkZXN0UHJvamVjdCA9IHByb2plY3RDYWNoZS5nZXQoZGVzdEJyYW5jaC5nZXRQYXJlbnRLZXkoKSk7CisgICAgaWYgKGRlc3RQcm9qZWN0ID09IG51bGwpIHsKICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiTm8gc3VjaCBwcm9qZWN0OiAiICsgZGVzdEJyYW5jaC5nZXRQYXJlbnRLZXkoKSk7CiAgICAgfQotICAgIGRlc3RQcm9qZWN0ID0gcGUuZ2V0UHJvamVjdCgpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIG9wZW5TY2hlbWEoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKQEAgLTI3NiwxNiArMjY0LDU5IEBACiAgICAgfQogICB9CiAKLSAgcHVibGljIHZvaWQgbWVyZ2UoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICBwdWJsaWMgdm9pZCBtZXJnZSgpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CiAgICAgc2V0RGVzdFByb2plY3QoKTsKICAgICB0cnkgewogICAgICAgb3BlblNjaGVtYSgpOwogICAgICAgb3BlblJlcG9zaXRvcnkoKTsKLSAgICAgIHN1Ym1pdHRlZCA9IGRiLmNoYW5nZXMoKS5zdWJtaXR0ZWQoZGVzdEJyYW5jaCkudG9MaXN0KCk7Ci0gICAgICBwcmVNZXJnZSgpOwotICAgICAgdXBkYXRlQnJhbmNoKCk7Ci0gICAgICB1cGRhdGVDaGFuZ2VTdGF0dXMoKTsKLSAgICAgIHVwZGF0ZVN1YnNjcmlwdGlvbnMoKTsKKyAgICAgIG9wZW5CcmFuY2goKTsKKyAgICAgIGZpbmFsIExpc3RNdWx0aW1hcDxTdWJtaXRUeXBlLCBDaGFuZ2U+IHRvU3VibWl0ID0KKyAgICAgICAgICB2YWxpZGF0ZUNoYW5nZUxpc3QoZGIuY2hhbmdlcygpLnN1Ym1pdHRlZChkZXN0QnJhbmNoKS50b0xpc3QoKSk7CisKKyAgICAgIGZpbmFsIExpc3RNdWx0aW1hcDxTdWJtaXRUeXBlLCBDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlTmV4dFR1cm4gPQorICAgICAgICAgIEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBwb3RlbnRpYWxseVN0aWxsU3VibWl0dGFibGVPbk5leHRSdW4gPQorICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q29kZVJldmlld0NvbW1pdD4oKTsKKyAgICAgIHdoaWxlICghdG9NZXJnZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgdG9NZXJnZU5leHRUdXJuLmNsZWFyKCk7CisgICAgICAgIGZpbmFsIFNldDxTdWJtaXRUeXBlPiBzdWJtaXRUeXBlcyA9CisgICAgICAgICAgICBuZXcgSGFzaFNldDxQcm9qZWN0LlN1Ym1pdFR5cGU+KHRvTWVyZ2Uua2V5U2V0KCkpOworICAgICAgICBmb3IgKGZpbmFsIFN1Ym1pdFR5cGUgc3VibWl0VHlwZSA6IHN1Ym1pdFR5cGVzKSB7CisgICAgICAgICAgZmluYWwgUmVmVXBkYXRlIGJyYW5jaFVwZGF0ZSA9IG9wZW5CcmFuY2goKTsKKyAgICAgICAgICBmaW5hbCBTdWJtaXRTdHJhdGVneSBzdHJhdGVneSA9IGNyZWF0ZVN0cmF0ZWd5KHN1Ym1pdFR5cGUpOworICAgICAgICAgIHByZU1lcmdlKHN0cmF0ZWd5LCB0b01lcmdlLmdldChzdWJtaXRUeXBlKSk7CisgICAgICAgICAgdXBkYXRlQnJhbmNoKHN0cmF0ZWd5LCBicmFuY2hVcGRhdGUpOworICAgICAgICAgIHVwZGF0ZUNoYW5nZVN0YXR1cyh0b1N1Ym1pdC5nZXQoc3VibWl0VHlwZSkpOworICAgICAgICAgIHVwZGF0ZVN1YnNjcmlwdGlvbnModG9TdWJtaXQuZ2V0KHN1Ym1pdFR5cGUpKTsKKworICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q29kZVJldmlld0NvbW1pdD4gaXQgPQorICAgICAgICAgICAgICBwb3RlbnRpYWxseVN0aWxsU3VibWl0dGFibGUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjb21taXQgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBpZiAoY29udGFpbnNNaXNzaW5nQ29tbWl0cyh0b01lcmdlLCBjb21taXQpCisgICAgICAgICAgICAgICAgfHwgY29udGFpbnNNaXNzaW5nQ29tbWl0cyh0b01lcmdlTmV4dFR1cm4sIGNvbW1pdCkpIHsKKyAgICAgICAgICAgICAgLy8gY2hhbmdlIGhhcyBtaXNzaW5nIGRlcGVuZGVuY2llcywgYnV0IGFsbCBjb21taXRzIHdoaWNoIGFyZQorICAgICAgICAgICAgICAvLyBtaXNzaW5nIGFyZSBzdGlsbCBhdHRlbXB0ZWQgdG8gYmUgbWVyZ2VkIHdpdGggYW5vdGhlciBzdWJtaXQKKyAgICAgICAgICAgICAgLy8gc3RyYXRlZ3ksIHJldHJ5IHRvIG1lcmdlIHRoaXMgY29tbWl0IGluIHRoZSBuZXh0IHR1cm4KKyAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgIGNvbW1pdC5zdGF0dXNDb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgY29tbWl0Lm1pc3NpbmcgPSBudWxsOworICAgICAgICAgICAgICB0b01lcmdlTmV4dFR1cm4ucHV0KHN1Ym1pdFR5cGUsIGNvbW1pdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHBvdGVudGlhbGx5U3RpbGxTdWJtaXR0YWJsZU9uTmV4dFJ1bi5hZGRBbGwocG90ZW50aWFsbHlTdGlsbFN1Ym1pdHRhYmxlKTsKKyAgICAgICAgICBwb3RlbnRpYWxseVN0aWxsU3VibWl0dGFibGUuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICB0b01lcmdlLmNsZWFyKCk7CisgICAgICAgIHRvTWVyZ2UucHV0QWxsKHRvTWVyZ2VOZXh0VHVybik7CisgICAgICB9CisKKyAgICAgIGZvciAoZmluYWwgQ29kZVJldmlld0NvbW1pdCBjb21taXQgOiBwb3RlbnRpYWxseVN0aWxsU3VibWl0dGFibGVPbk5leHRSdW4pIHsKKyAgICAgICAgZmluYWwgQ2FwYWJsZSBjYXBhYmxlID0gaXNTdWJtaXRTdGlsbFBvc3NpYmxlKGNvbW1pdCk7CisgICAgICAgIGlmIChjYXBhYmxlICE9IENhcGFibGUuT0spIHsKKyAgICAgICAgICBzZW5kTWVyZ2VGYWlsKGNvbW1pdC5jaGFuZ2UsCisgICAgICAgICAgICAgIG1lc3NhZ2UoY29tbWl0LmNoYW5nZSwgY2FwYWJsZS5nZXRNZXNzYWdlKCkpLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgcXVlcnkgdGhlIGRhdGFiYXNlIiwgZSk7CiAgICAgfSBmaW5hbGx5IHsKQEAgLTMwNCwyNCArMzM1LDU5IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHByZU1lcmdlKCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24gewotICAgIG9wZW5CcmFuY2goKTsKLSAgICB2YWxpZGF0ZUNoYW5nZUxpc3QoKTsKLSAgICBtZXJnZVRpcCA9IGJyYW5jaFRpcDsKLSAgICBzd2l0Y2ggKGRlc3RQcm9qZWN0LmdldFN1Ym1pdFR5cGUoKSkgewotICAgICAgY2FzZSBDSEVSUllfUElDSzoKLSAgICAgICAgY2hlcnJ5UGlja0NoYW5nZXMoKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRkFTVF9GT1JXQVJEX09OTFk6Ci0gICAgICBjYXNlIE1FUkdFX0FMV0FZUzoKLSAgICAgIGNhc2UgTUVSR0VfSUZfTkVDRVNTQVJZOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmVkdWNlVG9NaW5pbWFsTWVyZ2UoKTsKLSAgICAgICAgbWVyZ2VUb3BpY3MoKTsKLSAgICAgICAgbWFya0NsZWFuTWVyZ2VzKCk7Ci0gICAgICAgIGJyZWFrOworICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNNaXNzaW5nQ29tbWl0cygKKyAgICAgIGZpbmFsIExpc3RNdWx0aW1hcDxTdWJtaXRUeXBlLCBDb2RlUmV2aWV3Q29tbWl0PiBtYXAsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNvbW1pdCkgeworICAgIGlmICghaXNTdWJtaXRGb3JNaXNzaW5nQ29tbWl0c1N0aWxsUG9zc2libGUoY29tbWl0KSkgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKworICAgIGZvciAoZmluYWwgQ29kZVJldmlld0NvbW1pdCBtaXNzaW5nQ29tbWl0IDogY29tbWl0Lm1pc3NpbmcpIHsKKyAgICAgIGlmICghbWFwLmNvbnRhaW5zVmFsdWUobWlzc2luZ0NvbW1pdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbGVhbiBpc1N1Ym1pdEZvck1pc3NpbmdDb21taXRzU3RpbGxQb3NzaWJsZShmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNvbW1pdCkgeworICAgIGlmIChjb21taXQubWlzc2luZyA9PSBudWxsIHx8IGNvbW1pdC5taXNzaW5nLmlzRW1wdHkoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciAoQ29kZVJldmlld0NvbW1pdCBtaXNzaW5nQ29tbWl0IDogY29tbWl0Lm1pc3NpbmcpIHsKKyAgICAgIGxvYWRDaGFuZ2VJbmZvKG1pc3NpbmdDb21taXQpOworCisgICAgICBpZiAobWlzc2luZ0NvbW1pdC5wYXRjaHNldElkID09IG51bGwpIHsKKyAgICAgICAgLy8gVGhlIGNvbW1pdCBkb2Vzbid0IGhhdmUgYSBwYXRjaCBzZXQsIHNvIGl0IGNhbm5vdCBiZQorICAgICAgICAvLyBzdWJtaXR0ZWQgdG8gdGhlIGJyYW5jaC4KKyAgICAgICAgLy8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBpZiAoIW1pc3NpbmdDb21taXQuY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkuZXF1YWxzKAorICAgICAgICAgIG1pc3NpbmdDb21taXQucGF0Y2hzZXRJZCkpIHsKKyAgICAgICAgLy8gSWYgdGhlIG1pc3NpbmcgY29tbWl0IGlzIG5vdCB0aGUgY3VycmVudCBwYXRjaCBzZXQsCisgICAgICAgIC8vIHRoZSBjaGFuZ2UgbXVzdCBiZSByZWJhc2VkIHRvIHVzZSB0aGUgcHJvcGVyIHBhcmVudC4KKyAgICAgICAgLy8KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHByZU1lcmdlKGZpbmFsIFN1Ym1pdFN0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIG1lcmdlVGlwID0gc3RyYXRlZ3kucnVuKGJyYW5jaFRpcCwgdG9NZXJnZSk7CisgICAgcmVmTG9nSWRlbnQgPSBzdHJhdGVneS5nZXRSZWZMb2dJZGVudCgpOworICAgIGNvbW1pdHMucHV0QWxsKHN0cmF0ZWd5LmdldE5ld0NvbW1pdHMoKSk7CisgIH0KKworICBwcml2YXRlIFN1Ym1pdFN0cmF0ZWd5IGNyZWF0ZVN0cmF0ZWd5KGZpbmFsIFN1Ym1pdFR5cGUgc3VibWl0VHlwZSkKKyAgICAgIHRocm93cyBNZXJnZUV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIHN1Ym1pdFN0cmF0ZWd5RmFjdG9yeS5jcmVhdGUoc3VibWl0VHlwZSwgZGIsIHJlcG8sIHJ3LCBpbnNlcnRlciwKKyAgICAgICAgY2FuTWVyZ2VGbGFnLCBnZXRBbHJlYWR5QWNjZXB0ZWQoYnJhbmNoVGlwKSwgZGVzdEJyYW5jaCk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgb3BlblJlcG9zaXRvcnkoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24gewpAQCAtMzQ0LDIwICs0MTAsMTcgQEAKICAgICB9OwogICAgIHJ3LnNvcnQoUmV2U29ydC5UT1BPKTsKICAgICBydy5zb3J0KFJldlNvcnQuQ09NTUlUX1RJTUVfREVTQywgdHJ1ZSk7Ci0gICAgQ0FOX01FUkdFID0gcncubmV3RmxhZygiQ0FOX01FUkdFIik7CisgICAgY2FuTWVyZ2VGbGFnID0gcncubmV3RmxhZygiQ0FOX01FUkdFIik7CiAKICAgICBpbnNlcnRlciA9IHJlcG8ubmV3T2JqZWN0SW5zZXJ0ZXIoKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBvcGVuQnJhbmNoKCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKLSAgICBhbHJlYWR5QWNjZXB0ZWQgPSBuZXcgSGFzaFNldDxSZXZDb21taXQ+KCk7Ci0KKyAgcHJpdmF0ZSBSZWZVcGRhdGUgb3BlbkJyYW5jaCgpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgYnJhbmNoVXBkYXRlID0gcmVwby51cGRhdGVSZWYoZGVzdEJyYW5jaC5nZXQoKSk7CisgICAgICBmaW5hbCBSZWZVcGRhdGUgYnJhbmNoVXBkYXRlID0gcmVwby51cGRhdGVSZWYoZGVzdEJyYW5jaC5nZXQoKSk7CiAgICAgICBpZiAoYnJhbmNoVXBkYXRlLmdldE9sZE9iamVjdElkKCkgIT0gbnVsbCkgewogICAgICAgICBicmFuY2hUaXAgPQogICAgICAgICAgICAgKENvZGVSZXZpZXdDb21taXQpIHJ3LnBhcnNlQ29tbWl0KGJyYW5jaFVwZGF0ZS5nZXRPbGRPYmplY3RJZCgpKTsKLSAgICAgICAgYWxyZWFkeUFjY2VwdGVkLmFkZChicmFuY2hUaXApOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgYnJhbmNoVGlwID0gbnVsbDsKICAgICAgIH0KQEAgLTM2OSwxNCArNDMyLDMxIEBACiAgICAgICAgIH0gZWxzZSBpZiAocmVwby5nZXRGdWxsQnJhbmNoKCkuZXF1YWxzKGRlc3RCcmFuY2guZ2V0KCkpKSB7CiAgICAgICAgICAgYnJhbmNoVXBkYXRlLnNldEV4cGVjdGVkT2xkT2JqZWN0SWQoT2JqZWN0SWQuemVyb0lkKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiRGVzdGluYXRpb24gYnJhbmNoIFwiIgotICAgICAgICAgICAgICArIGJyYW5jaFVwZGF0ZS5nZXRSZWYoKS5nZXROYW1lKCkgKyAiXCIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIENoYW5nZSBjIDogZGIuY2hhbmdlcygpLnN1Ym1pdHRlZChkZXN0QnJhbmNoKS50b0xpc3QoKSkgeworICAgICAgICAgICAgc2V0TmV3KGMsIG1lc3NhZ2UoYywgIllvdXIgY2hhbmdlIGNvdWxkIG5vdCBiZSBtZXJnZWQsICIKKyAgICAgICAgICAgICAgICArICJiZWNhdXNlIHRoZSBkZXN0aW5hdGlvbiBicmFuY2ggZG9lcyBub3QgZXhpc3QgYW55bW9yZS4iKSk7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigKICAgICAgICAgICAgICJGYWlsZWQgdG8gY2hlY2sgZXhpc3RlbmNlIG9mIGRlc3RpbmF0aW9uIGJyYW5jaCIsIGUpOwogICAgICAgfQogCisgICAgICByZXR1cm4gYnJhbmNoVXBkYXRlOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG9wZW4gYnJhbmNoIiwgZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBTZXQ8UmV2Q29tbWl0PiBnZXRBbHJlYWR5QWNjZXB0ZWQoZmluYWwgQ29kZVJldmlld0NvbW1pdCBicmFuY2hUaXApCisgICAgICB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGZpbmFsIFNldDxSZXZDb21taXQ+IGFscmVhZHlBY2NlcHRlZCA9IG5ldyBIYXNoU2V0PFJldkNvbW1pdD4oKTsKKworICAgIGlmIChicmFuY2hUaXAgIT0gbnVsbCkgeworICAgICAgYWxyZWFkeUFjY2VwdGVkLmFkZChicmFuY2hUaXApOworICAgIH0KKworICAgIHRyeSB7CiAgICAgICBmb3IgKGZpbmFsIFJlZiByIDogcmVwby5nZXRBbGxSZWZzKCkudmFsdWVzKCkpIHsKICAgICAgICAgaWYgKHIuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpCiAgICAgICAgICAgICB8fCByLmdldE5hbWUoKS5zdGFydHNXaXRoKENvbnN0YW50cy5SX1RBR1MpKSB7CkBAIC0zODgsMTEgKzQ2OCwxNyBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBicmFuY2giLCBlKTsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGRldGVybWluZSBhbHJlYWR5IGFjY2VwdGVkIGNvbW1pdHMuIiwgZSk7CiAgICAgfQorCisgICAgcmV0dXJuIGFscmVhZHlBY2NlcHRlZDsKICAgfQogCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUNoYW5nZUxpc3QoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICBwcml2YXRlIExpc3RNdWx0aW1hcDxTdWJtaXRUeXBlLCBDaGFuZ2U+IHZhbGlkYXRlQ2hhbmdlTGlzdCgKKyAgICAgIGZpbmFsIExpc3Q8Q2hhbmdlPiBzdWJtaXR0ZWQpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgTGlzdE11bHRpbWFwPFN1Ym1pdFR5cGUsIENoYW5nZT4gdG9TdWJtaXQgPQorICAgICAgICBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKwogICAgIGZpbmFsIFNldDxPYmplY3RJZD4gdGlwcyA9IG5ldyBIYXNoU2V0PE9iamVjdElkPigpOwogICAgIGZvciAoZmluYWwgUmVmIHIgOiByZXBvLmdldEFsbFJlZnMoKS52YWx1ZXMoKSkgewogICAgICAgdGlwcy5hZGQoci5nZXRPYmplY3RJZCgpKTsKQEAgLTQ1NSwxMCArNTQxLDExIEBACiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICBpZiAoR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGX0NPTkZJRy5lcXVhbHMoYnJhbmNoVXBkYXRlLmdldE5hbWUoKSkpIHsKKyAgICAgIGlmIChHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLmVxdWFscyhkZXN0QnJhbmNoLmdldCgpKSkgewogICAgICAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgbmV3UGFyZW50OwogICAgICAgICB0cnkgewotICAgICAgICAgIFByb2plY3RDb25maWcgY2ZnID0gbmV3IFByb2plY3RDb25maWcoZGVzdFByb2plY3QuZ2V0TmFtZUtleSgpKTsKKyAgICAgICAgICBQcm9qZWN0Q29uZmlnIGNmZyA9CisgICAgICAgICAgICAgIG5ldyBQcm9qZWN0Q29uZmlnKGRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOwogICAgICAgICAgIGNmZy5sb2FkKHJlcG8sIGNvbW1pdCk7CiAgICAgICAgICAgbmV3UGFyZW50ID0gY2ZnLmdldFByb2plY3QoKS5nZXRQYXJlbnQoYWxsUHJvamVjdHNOYW1lKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTQ2Niw3ICs1NTMsOCBAQAogICAgICAgICAgICAgICAuZXJyb3IoQ29tbWl0TWVyZ2VTdGF0dXMuSU5WQUxJRF9QUk9KRUNUX0NPTkZJR1VSQVRJT04pKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgb2xkUGFyZW50ID0gZGVzdFByb2plY3QuZ2V0UGFyZW50KGFsbFByb2plY3RzTmFtZSk7CisgICAgICAgIGZpbmFsIFByb2plY3QuTmFtZUtleSBvbGRQYXJlbnQgPQorICAgICAgICAgICAgZGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldFBhcmVudChhbGxQcm9qZWN0c05hbWUpOwogICAgICAgICBpZiAob2xkUGFyZW50ID09IG51bGwpIHsKICAgICAgICAgICAvLyB1cGRhdGUgb2YgdGhlICdBbGwtUHJvamVjdHMnIHByb2plY3QKICAgICAgICAgICBpZiAobmV3UGFyZW50ICE9IG51bGwpIHsKQEAgLTUwNiw3ICs1OTQsNyBAQAogCiAgICAgICBpZiAoYnJhbmNoVGlwICE9IG51bGwpIHsKICAgICAgICAgLy8gSWYgdGhpcyBjb21taXQgaXMgYWxyZWFkeSBtZXJnZWQgaXRzIGEgYnVnIGluIHRoZSBxdWV1aW5nIGNvZGUKLSAgICAgICAgLy8gdGhhdCB3ZSBnb3QgYmFjayBoZXJlLiBKdXN0IG1hcmsgaXQgY29tcGxldGUgYW5kIG1vdmUgb24uIEl0cworICAgICAgICAvLyB0aGF0IHdlIGdvdCBiYWNrIGhlcmUuIEp1c3QgbWFyayBpdCBjb21wbGV0ZSBhbmQgbW92ZSBvbi4gSXQncwogICAgICAgICAvLyBtZXJnZWQgYW5kIHRoYXQgaXMgYWxsIHRoYXQgbWF0dGVyZWQgdG8gdGhlIHJlcXVlc3Rvci4KICAgICAgICAgLy8KICAgICAgICAgdHJ5IHsKQEAgLTUxOSw1OTMgKzYwNyw1OCBAQAogICAgICAgICB9CiAgICAgICB9CiAKLSAgICAgIGNvbW1pdC5hZGQoQ0FOX01FUkdFKTsKLSAgICAgIHRvTWVyZ2UuYWRkKGNvbW1pdCk7CisgICAgICBmaW5hbCBTdWJtaXRUeXBlIHN1Ym1pdFR5cGUgPSBnZXRTdWJtaXRUeXBlKGNoZywgcHMpOworICAgICAgaWYgKHN1Ym1pdFR5cGUgPT0gbnVsbCkgeworICAgICAgICBjb21taXRzLnB1dChjaGFuZ2VJZCwKKyAgICAgICAgICAgIENvZGVSZXZpZXdDb21taXQuZXJyb3IoQ29tbWl0TWVyZ2VTdGF0dXMuTk9fU1VCTUlUX1RZUEUpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGNvbW1pdC5hZGQoY2FuTWVyZ2VGbGFnKTsKKyAgICAgIHRvTWVyZ2UucHV0KHN1Ym1pdFR5cGUsIGNvbW1pdCk7CisgICAgICB0b1N1Ym1pdC5wdXQoc3VibWl0VHlwZSwgY2hnKTsKICAgICB9CisgICAgcmV0dXJuIHRvU3VibWl0OwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHJlZHVjZVRvTWluaW1hbE1lcmdlKCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBDb2xsZWN0aW9uPENvZGVSZXZpZXdDb21taXQ+IGhlYWRzOworICBwcml2YXRlIFN1Ym1pdFR5cGUgZ2V0U3VibWl0VHlwZShmaW5hbCBDaGFuZ2UgY2hhbmdlLCBmaW5hbCBQYXRjaFNldCBwcykgewogICAgIHRyeSB7Ci0gICAgICBoZWFkcyA9IG5ldyBNZXJnZVNvcnRlcihydywgYWxyZWFkeUFjY2VwdGVkLCBDQU5fTUVSR0UpLnNvcnQodG9NZXJnZSk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJCcmFuY2ggaGVhZCBzb3J0aW5nIGZhaWxlZCIsIGUpOwotICAgIH0KLQotICAgIHRvTWVyZ2UuY2xlYXIoKTsKLSAgICB0b01lcmdlLmFkZEFsbChoZWFkcyk7Ci0gICAgQ29sbGVjdGlvbnMuc29ydCh0b01lcmdlLCBuZXcgQ29tcGFyYXRvcjxDb2RlUmV2aWV3Q29tbWl0PigpIHsKLSAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGEsIGZpbmFsIENvZGVSZXZpZXdDb21taXQgYikgewotICAgICAgICByZXR1cm4gYS5vcmlnaW5hbE9yZGVyIC0gYi5vcmlnaW5hbE9yZGVyOworICAgICAgZmluYWwgU3VibWl0VHlwZVJlY29yZCByID0KKyAgICAgICAgICBjaGFuZ2VDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGNoYW5nZSwKKyAgICAgICAgICAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShjaGFuZ2UuZ2V0T3duZXIoKSkpCisgICAgICAgICAgICAgIC5nZXRTdWJtaXRUeXBlUmVjb3JkKGRiLCBwcyk7CisgICAgICBpZiAoci5zdGF0dXMgIT0gU3VibWl0VHlwZVJlY29yZC5TdGF0dXMuT0spIHsKKyAgICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IHN1Ym1pdCB0eXBlIGZvciAiICsgY2hhbmdlLmdldEtleSgpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICB9Ci0gICAgfSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgbWVyZ2VUb3BpY3MoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24gewotICAgIC8vIFRha2UgdGhlIGZpcnN0IGZhc3QtZm9yd2FyZCBhdmFpbGFibGUsIGlmIGFueSBpcyBhdmFpbGFibGUgaW4gdGhlIHNldC4KLSAgICAvLwotICAgIGlmIChkZXN0UHJvamVjdC5nZXRTdWJtaXRUeXBlKCkgIT0gUHJvamVjdC5TdWJtaXRUeXBlLk1FUkdFX0FMV0FZUykgewotICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxDb2RlUmV2aWV3Q29tbWl0PiBpID0gdG9NZXJnZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4gPSBpLm5leHQoKTsKLSAgICAgICAgICBpZiAobWVyZ2VUaXAgPT0gbnVsbCB8fCBydy5pc01lcmdlZEludG8obWVyZ2VUaXAsIG4pKSB7Ci0gICAgICAgICAgICBtZXJnZVRpcCA9IG47Ci0gICAgICAgICAgICBpLnJlbW92ZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgZmFzdC1mb3J3YXJkIHRlc3QgZHVyaW5nIG1lcmdlIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZGVzdFByb2plY3QuZ2V0U3VibWl0VHlwZSgpID09IFByb2plY3QuU3VibWl0VHlwZS5GQVNUX0ZPUldBUkRfT05MWSkgewotICAgICAgLy8gSWYgdGhpcyBwcm9qZWN0IG9ubHkgcGVybWl0cyBmYXN0LWZvcndhcmRzLCBhYm9ydCBldmVyeXRoaW5nIGVsc2UuCi0gICAgICAvLwotICAgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgewotICAgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4gPSB0b01lcmdlLnJlbW92ZSgwKTsKLSAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuTk9UX0ZBU1RfRk9SV0FSRDsKLSAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBGb3IgZXZlcnkgb3RoZXIgY29tbWl0IGRvIGEgcGFpci13aXNlIG1lcmdlLgotICAgICAgLy8KLSAgICAgIHdoaWxlICghdG9NZXJnZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgbWVyZ2VPbmVDb21taXQodG9NZXJnZS5yZW1vdmUoMCkpOwotICAgICAgfQorICAgICAgcmV0dXJuIHIudHlwZTsKKyAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJGYWlsZWQgdG8gZ2V0IHN1Ym1pdCB0eXBlIGZvciAiICsgY2hhbmdlLmdldEtleSgpLCBlKTsKKyAgICAgIHJldHVybiBudWxsOwogICAgIH0KICAgfQogCi0gIHByaXZhdGUgdm9pZCBtZXJnZU9uZUNvbW1pdChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4pIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgVGhyZWVXYXlNZXJnZXIgbSA9IG5ld1RocmVlV2F5TWVyZ2VyKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChtLm1lcmdlKG5ldyBBbnlPYmplY3RJZFtdIHttZXJnZVRpcCwgbn0pKSB7Ci0gICAgICAgIHdyaXRlTWVyZ2VDb21taXQobS5nZXRSZXN1bHRUcmVlSWQoKSwgbik7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZhaWxlZChuLCBDb21taXRNZXJnZVN0YXR1cy5QQVRIX0NPTkZMSUNUKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBpZiAoZS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgiTXVsdGlwbGUgbWVyZ2UgYmFzZXMgZm9yIikpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmYWlsZWQobiwgQ29tbWl0TWVyZ2VTdGF0dXMuQ1JJU1NfQ1JPU1NfTUVSR0UpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1lcmdlICIgKyBuLm5hbWUoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1lcmdlICIgKyBuLm5hbWUoKSwgZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBUaHJlZVdheU1lcmdlciBuZXdUaHJlZVdheU1lcmdlcigpIHsKLSAgICBUaHJlZVdheU1lcmdlciBtOwotICAgIGlmIChkZXN0UHJvamVjdC5pc1VzZUNvbnRlbnRNZXJnZSgpKSB7Ci0gICAgICAvLyBTZXR0aW5ncyBmb3IgdGhpcyBwcm9qZWN0IGFsbG93IHVzIHRvIHRyeSBhbmQKLSAgICAgIC8vIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSBjb25mbGljdHMgd2l0aGluIGZpbGVzIGlmIG5lZWRlZC4KLSAgICAgIC8vIFVzZSBSZXNvbHZlTWVyZ2UgYW5kIGluc3RydWN0IHRvIG9wZXJhdGUgaW4gY29yZS4KLSAgICAgIG0gPSBNZXJnZVN0cmF0ZWd5LlJFU09MVkUubmV3TWVyZ2VyKHJlcG8sIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBObyBhdXRvIGNvbmZsaWN0IHJlc29sdmluZyBhbGxvd2VkLiBJZiBhbnkgb2YgdGhlCi0gICAgICAvLyBhZmZlY3RlZCBmaWxlcyB3YXMgbW9kaWZpZWQsIG1lcmdlIHdpbGwgZmFpbC4KLSAgICAgIG0gPSBNZXJnZVN0cmF0ZWd5LlNJTVBMRV9UV09fV0FZX0lOX0NPUkUubmV3TWVyZ2VyKHJlcG8pOwotICAgIH0KLSAgICBtLnNldE9iamVjdEluc2VydGVyKG5ldyBPYmplY3RJbnNlcnRlci5GaWx0ZXIoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHByb3RlY3RlZCBPYmplY3RJbnNlcnRlciBkZWxlZ2F0ZSgpIHsKLSAgICAgICAgcmV0dXJuIGluc2VydGVyOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0gICAgICB9Ci0gICAgfSk7Ci0gICAgcmV0dXJuIG07Ci0gIH0KLQotICBwcml2YXRlIENvZGVSZXZpZXdDb21taXQgZmFpbGVkKGZpbmFsIENvZGVSZXZpZXdDb21taXQgbiwKLSAgICAgIGZpbmFsIENvbW1pdE1lcmdlU3RhdHVzIGZhaWx1cmUpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAotICAgICAgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotICAgIHJ3LnJlc2V0KCk7Ci0gICAgcncubWFya1N0YXJ0KG4pOwotICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKG1lcmdlVGlwKTsKLSAgICBDb2RlUmV2aWV3Q29tbWl0IGZhaWxlZDsKLSAgICB3aGlsZSAoKGZhaWxlZCA9IChDb2RlUmV2aWV3Q29tbWl0KSBydy5uZXh0KCkpICE9IG51bGwpIHsKLSAgICAgIGZhaWxlZC5zdGF0dXNDb2RlID0gZmFpbHVyZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhaWxlZDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZU1lcmdlQ29tbWl0KE9iamVjdElkIHRyZWVJZCwgQ29kZVJldmlld0NvbW1pdCBuKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IG1lcmdlZCA9IG5ldyBBcnJheUxpc3Q8Q29kZVJldmlld0NvbW1pdD4oKTsKLSAgICBydy5yZXNldCgpOwotICAgIHJ3Lm1hcmtTdGFydChuKTsKLSAgICBydy5tYXJrVW5pbnRlcmVzdGluZyhtZXJnZVRpcCk7Ci0gICAgZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IHJ3KSB7Ci0gICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGNyYyA9IChDb2RlUmV2aWV3Q29tbWl0KSBjOwotICAgICAgaWYgKGNyYy5wYXRjaHNldElkICE9IG51bGwpIHsKLSAgICAgICAgbWVyZ2VkLmFkZChjcmMpOwotICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbXNnYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBpZiAobWVyZ2VkLnNpemUoKSA9PSAxKSB7Ci0gICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IGMgPSBtZXJnZWQuZ2V0KDApOwotICAgICAgcncucGFyc2VCb2R5KGMpOwotICAgICAgbXNnYnVmLmFwcGVuZCgiTWVyZ2UgXCIiKTsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoYy5nZXRTaG9ydE1lc3NhZ2UoKSk7Ci0gICAgICBtc2didWYuYXBwZW5kKCJcIiIpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoIk1lcmdlIGNoYW5nZXMgIik7Ci0gICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPENvZGVSZXZpZXdDb21taXQ+IGkgPSBtZXJnZWQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgIG1zZ2J1Zi5hcHBlbmQoaS5uZXh0KCkuY2hhbmdlLmdldEtleSgpLmFiYnJldmlhdGUoKSk7Ci0gICAgICAgIGlmIChpLmhhc05leHQoKSkgewotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoJywnKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICghUl9IRUFEU19NQVNURVIuZXF1YWxzKGRlc3RCcmFuY2guZ2V0KCkpKSB7Ci0gICAgICBtc2didWYuYXBwZW5kKCIgaW50byAiKTsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoZGVzdEJyYW5jaC5nZXRTaG9ydE5hbWUoKSk7Ci0gICAgfQotCi0gICAgaWYgKG1lcmdlZC5zaXplKCkgPiAxKSB7Ci0gICAgICBtc2didWYuYXBwZW5kKCJcblxuKiBjaGFuZ2VzOlxuIik7Ci0gICAgICBmb3IgKGZpbmFsIENvZGVSZXZpZXdDb21taXQgYyA6IG1lcmdlZCkgewotICAgICAgICBydy5wYXJzZUJvZHkoYyk7Ci0gICAgICAgIG1zZ2J1Zi5hcHBlbmQoIiAgIik7Ci0gICAgICAgIG1zZ2J1Zi5hcHBlbmQoYy5nZXRTaG9ydE1lc3NhZ2UoKSk7Ci0gICAgICAgIG1zZ2J1Zi5hcHBlbmQoIlxuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgUGVyc29uSWRlbnQgYXV0aG9ySWRlbnQgPSBjb21wdXRlQXV0aG9yKG1lcmdlZCk7Ci0KLSAgICBmaW5hbCBDb21taXRCdWlsZGVyIG1lcmdlQ29tbWl0ID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKLSAgICBtZXJnZUNvbW1pdC5zZXRUcmVlSWQodHJlZUlkKTsKLSAgICBtZXJnZUNvbW1pdC5zZXRQYXJlbnRJZHMobWVyZ2VUaXAsIG4pOwotICAgIG1lcmdlQ29tbWl0LnNldEF1dGhvcihhdXRob3JJZGVudCk7Ci0gICAgbWVyZ2VDb21taXQuc2V0Q29tbWl0dGVyKG15SWRlbnQpOwotICAgIG1lcmdlQ29tbWl0LnNldE1lc3NhZ2UobXNnYnVmLnRvU3RyaW5nKCkpOwotCi0gICAgbWVyZ2VUaXAgPSAoQ29kZVJldmlld0NvbW1pdCkgcncucGFyc2VDb21taXQoY29tbWl0KG1lcmdlQ29tbWl0KSk7Ci0gIH0KLQotICBwcml2YXRlIFBlcnNvbklkZW50IGNvbXB1dGVBdXRob3IoCi0gICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IGNvZGVSZXZpZXdDb21taXRzKSB7Ci0gICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXIgPSBudWxsOwotICAgIGZvciAoZmluYWwgQ29kZVJldmlld0NvbW1pdCBjIDogY29kZVJldmlld0NvbW1pdHMpIHsKLSAgICAgIFBhdGNoU2V0QXBwcm92YWwgcyA9IGdldFN1Ym1pdHRlcihkYiwgYy5wYXRjaHNldElkKTsKLSAgICAgIGlmIChzdWJtaXR0ZXIgPT0gbnVsbAotICAgICAgICAgIHx8IChzICE9IG51bGwgJiYgcy5nZXRHcmFudGVkKCkuY29tcGFyZVRvKHN1Ym1pdHRlci5nZXRHcmFudGVkKCkpID4gMCkpIHsKLSAgICAgICAgc3VibWl0dGVyID0gczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUcnkgdG8gdXNlIHRoZSBzdWJtaXR0ZXIncyBpZGVudGl0eSBmb3IgdGhlIG1lcmdlIGNvbW1pdCBhdXRob3IuCi0gICAgLy8gSWYgYWxsIG9mIHRoZSBjb21taXRzIGJlaW5nIG1lcmdlZCBhcmUgY3JlYXRlZCBieSB0aGUgc3VibWl0dGVyLAotICAgIC8vIHByZWZlciB0aGUgaWRlbnRpdHkgbGluZSB0aGV5IHVzZWQgaW4gdGhlIGNvbW1pdHMgcmF0aGVyIHRoYW4gdGhlCi0gICAgLy8gcHJlZmVycmVkIGlkZW50aXR5IHN0b3JlZCBpbiB0aGUgdXNlciBhY2NvdW50LiBUaGlzIHdheSB0aGUgR2l0Ci0gICAgLy8gY29tbWl0IHJlY29yZHMgYXJlIG1vcmUgY29uc2lzdGVudCBpbnRlcm5hbGx5LgotICAgIC8vCi0gICAgUGVyc29uSWRlbnQgYXV0aG9ySWRlbnQ7Ci0gICAgaWYgKHN1Ym1pdHRlciAhPSBudWxsKSB7Ci0gICAgICBJZGVudGlmaWVkVXNlciB3aG8gPQotICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoc3VibWl0dGVyLmdldEFjY291bnRJZCgpKTsKLSAgICAgIFNldDxTdHJpbmc+IGVtYWlscyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgIGZvciAoUmV2Q29tbWl0IGMgOiBjb2RlUmV2aWV3Q29tbWl0cykgewotICAgICAgICB0cnkgewotICAgICAgICAgIHJ3LnBhcnNlQm9keShjKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgIGxvZy53YXJuKCJDYW5ub3QgcGFyc2UgY29tbWl0ICIgKyBjLm5hbWUoKSArICIgaW4gIiArIGRlc3RCcmFuY2gsIGUpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGVtYWlscy5hZGQoYy5nZXRBdXRob3JJZGVudCgpLmdldEVtYWlsQWRkcmVzcygpKTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgVGltZXN0YW1wIGR0ID0gc3VibWl0dGVyLmdldEdyYW50ZWQoKTsKLSAgICAgIGZpbmFsIFRpbWVab25lIHR6ID0gbXlJZGVudC5nZXRUaW1lWm9uZSgpOwotICAgICAgaWYgKGVtYWlscy5zaXplKCkgPT0gMQotICAgICAgICAgICYmIHdoby5nZXRFbWFpbEFkZHJlc3NlcygpLmNvbnRhaW5zKGVtYWlscy5pdGVyYXRvcigpLm5leHQoKSkpIHsKLSAgICAgICAgYXV0aG9ySWRlbnQgPQotICAgICAgICAgICAgbmV3IFBlcnNvbklkZW50KGNvZGVSZXZpZXdDb21taXRzLmdldCgwKS5nZXRBdXRob3JJZGVudCgpLCBkdCwgdHopOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXV0aG9ySWRlbnQgPSB3aG8ubmV3Q29tbWl0dGVySWRlbnQoZHQsIHR6KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgYXV0aG9ySWRlbnQgPSBteUlkZW50OwotICAgIH0KLSAgICByZXR1cm4gYXV0aG9ySWRlbnQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgbWFya0NsZWFuTWVyZ2VzKCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKLSAgICBpZiAobWVyZ2VUaXAgPT0gbnVsbCkgewotICAgICAgLy8gSWYgbWVyZ2VUaXAgaXMgbnVsbCBoZXJlLCBicmFuY2hUaXAgd2FzIG51bGwsIGluZGljYXRpbmcgYSBuZXcgYnJhbmNoCi0gICAgICAvLyBhdCB0aGUgc3RhcnQgb2YgdGhlIG1lcmdlIHByb2Nlc3MuIFdlIGFsc28gZWxlY3RlZCB0byBtZXJnZSBub3RoaW5nLAotICAgICAgLy8gcHJvYmFibHkgZHVlIHRvIG1pc3NpbmcgZGVwZW5kZW5jaWVzLiBOb3RoaW5nIHdhcyBjbGVhbmx5IG1lcmdlZC4KLSAgICAgIC8vCisgIHByaXZhdGUgdm9pZCB1cGRhdGVCcmFuY2goZmluYWwgU3VibWl0U3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICBmaW5hbCBSZWZVcGRhdGUgYnJhbmNoVXBkYXRlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGlmICgoYnJhbmNoVGlwID09IG51bGwgJiYgbWVyZ2VUaXAgPT0gbnVsbCkgfHwgYnJhbmNoVGlwID09IG1lcmdlVGlwKSB7CisgICAgICAvLyBub3RoaW5nIHRvIGRvCiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgdHJ5IHsKLSAgICAgIHJ3LnJlc2V0KCk7Ci0gICAgICBydy5zb3J0KFJldlNvcnQuVE9QTyk7Ci0gICAgICBydy5zb3J0KFJldlNvcnQuUkVWRVJTRSwgdHJ1ZSk7Ci0gICAgICBydy5tYXJrU3RhcnQobWVyZ2VUaXApOwotICAgICAgZm9yIChSZXZDb21taXQgYyA6IGFscmVhZHlBY2NlcHRlZCkgewotICAgICAgICBydy5tYXJrVW5pbnRlcmVzdGluZyhjKTsKLSAgICAgIH0KLQotICAgICAgQ29kZVJldmlld0NvbW1pdCBjOwotICAgICAgd2hpbGUgKChjID0gKENvZGVSZXZpZXdDb21taXQpIHJ3Lm5leHQoKSkgIT0gbnVsbCkgewotICAgICAgICBpZiAoYy5wYXRjaHNldElkICE9IG51bGwpIHsKLSAgICAgICAgICBjLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRTsKLSAgICAgICAgICBpZiAoYnJhbmNoVXBkYXRlLmdldFJlZkxvZ0lkZW50KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgc2V0UmVmTG9nSWRlbnQoZ2V0U3VibWl0dGVyKGRiLCBjLnBhdGNoc2V0SWQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBtYXJrIGNsZWFuIG1lcmdlcyIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZXRSZWZMb2dJZGVudChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEF1ZGl0KSB7Ci0gICAgaWYgKHN1Ym1pdEF1ZGl0ICE9IG51bGwpIHsKLSAgICAgIGJyYW5jaFVwZGF0ZS5zZXRSZWZMb2dJZGVudChpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKAotICAgICAgICAgIHN1Ym1pdEF1ZGl0LmdldEFjY291bnRJZCgpKS5uZXdSZWZMb2dJZGVudCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY2hlcnJ5UGlja0NoYW5nZXMoKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7Ci0gICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgewotICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gdG9NZXJnZS5yZW1vdmUoMCk7Ci0gICAgICBmaW5hbCBUaHJlZVdheU1lcmdlciBtID0gbmV3VGhyZWVXYXlNZXJnZXIoKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlmIChtZXJnZVRpcCA9PSBudWxsKSB7Ci0gICAgICAgICAgLy8gVGhlIGJyYW5jaCBpcyB1bmJvcm4uIFRha2UgYSBmYXN0LWZvcndhcmQgcmVzb2x1dGlvbiB0bwotICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgYnJhbmNoLgotICAgICAgICAgIC8vCi0gICAgICAgICAgbWVyZ2VUaXAgPSBuOwotICAgICAgICAgIG4uc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX01FUkdFOwotCi0gICAgICAgIH0gZWxzZSBpZiAobi5nZXRQYXJlbnRDb3VudCgpID09IDApIHsKLSAgICAgICAgICAvLyBSZWZ1c2UgdG8gbWVyZ2UgYSByb290IGNvbW1pdCBpbnRvIGFuIGV4aXN0aW5nIGJyYW5jaCwKLSAgICAgICAgICAvLyB3ZSBjYW5ub3Qgb2J0YWluIGEgZGVsdGEgZm9yIHRoZSBjaGVycnktcGljayB0byBhcHBseS4KLSAgICAgICAgICAvLwotICAgICAgICAgIG4uc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLkNBTk5PVF9DSEVSUllfUElDS19ST09UOwotCi0gICAgICAgIH0gZWxzZSBpZiAobi5nZXRQYXJlbnRDb3VudCgpID09IDEpIHsKLSAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJlbnQsIGEgY2hlcnJ5LXBpY2sgY2FuIGJlIGRvbmUgYnkKLSAgICAgICAgICAvLyB0YWtpbmcgdGhlIGRlbHRhIHJlbGF0aXZlIHRvIHRoYXQgb25lIHBhcmVudCBhbmQgcmVkb2luZwotICAgICAgICAgIC8vIHRoYXQgb24gdGhlIGN1cnJlbnQgbWVyZ2UgdGlwLgotICAgICAgICAgIC8vCi0gICAgICAgICAgbS5zZXRCYXNlKG4uZ2V0UGFyZW50KDApKTsKLSAgICAgICAgICBpZiAobS5tZXJnZShtZXJnZVRpcCwgbikpIHsKLSAgICAgICAgICAgIHdyaXRlQ2hlcnJ5UGlja0NvbW1pdChtLCBuKTsKLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5QQVRIX0NPTkZMSUNUOwotICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFRoZXJlIGFyZSBtdWx0aXBsZSBwYXJlbnRzLCBzbyB0aGlzIGlzIGEgbWVyZ2UgY29tbWl0LiBXZQotICAgICAgICAgIC8vIGRvbid0IHdhbnQgdG8gY2hlcnJ5LXBpY2sgdGhlIG1lcmdlIGFzIGNsaWVudHMgY2FuJ3QgZWFzaWx5Ci0gICAgICAgICAgLy8gcmViYXNlIHRoZWlyIGhpc3Rvcnkgd2l0aCB0aGF0IG1lcmdlIHByZXNlbnQgYW5kIHJlcGxhY2VkCi0gICAgICAgICAgLy8gYnkgYW4gZXF1aXZhbGVudCBtZXJnZSB3aXRoIGEgZGlmZmVyZW50IGZpcnN0IHBhcmVudC4gU28KLSAgICAgICAgICAvLyBpbnN0ZWFkIGJlaGF2ZSBhcyB0aG91Z2ggTUVSR0VfSUZfTkVDRVNTQVJZIHdhcyBjb25maWd1cmVkLgotICAgICAgICAgIC8vCi0gICAgICAgICAgaWYgKGhhc0RlcGVuZGVuY2llc01ldChuKSkgewotICAgICAgICAgICAgaWYgKHJ3LmlzTWVyZ2VkSW50byhtZXJnZVRpcCwgbikpIHsKLSAgICAgICAgICAgICAgbWVyZ2VUaXAgPSBuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbWVyZ2VPbmVDb21taXQobik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXJrQ2xlYW5NZXJnZXMoKTsKLQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPbmUgb3IgbW9yZSBkZXBlbmRlbmNpZXMgd2VyZSBub3QgbWV0LiBUaGUgc3RhdHVzIHdhcwotICAgICAgICAgICAgLy8gYWxyZWFkeSBtYXJrZWQgb24gdGhlIGNvbW1pdCBzbyB3ZSBoYXZlIG5vdGhpbmcgZnVydGhlcgotICAgICAgICAgICAgLy8gdG8gcGVyZm9ybSBhdCB0aGlzIHRpbWUuCi0gICAgICAgICAgICAvLwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1lcmdlICIgKyBuLm5hbWUoKSwgZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGhhc0RlcGVuZGVuY2llc01ldChmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4pCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIE9kZGx5IHdlIGNhbiBkZXRlcm1pbmUgdGhpcyBieSBydW5uaW5nIHRoZSBtZXJnZSBzb3J0ZXIgYW5kCi0gICAgLy8gbG9vayBmb3IgdGhlIG9uZSBjb21taXQgdG8gY29tZSBvdXQgYXMgYSByZXN1bHQuIFRoaXMgd29ya3MKLSAgICAvLyBhcyB0aGUgbWVyZ2Ugc29ydGVyIGNoZWNrcyB0aGUgZGVwZW5kZW5jeSBjaGFpbiBhcyBwYXJ0IG9mCi0gICAgLy8gaXRzIGxvZ2ljIHRyeWluZyB0byBmaW5kIGEgbWluaW1hbCBtZXJnZSBwYXRoLgotICAgIC8vCi0gICAgcmV0dXJuIG5ldyBNZXJnZVNvcnRlcihydywgYWxyZWFkeUFjY2VwdGVkLCBDQU5fTUVSR0UpLnNvcnQoCi0gICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuKSkuY29udGFpbnMobik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVDaGVycnlQaWNrQ29tbWl0KGZpbmFsIE1lcmdlciBtLCBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4pCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7Ci0gICAgcncucGFyc2VCb2R5KG4pOwotCi0gICAgZmluYWwgTGlzdDxGb290ZXJMaW5lPiBmb290ZXJzID0gbi5nZXRGb290ZXJMaW5lcygpOwotICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbXNnYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBtc2didWYuYXBwZW5kKG4uZ2V0RnVsbE1lc3NhZ2UoKSk7Ci0KLSAgICBpZiAobXNnYnVmLmxlbmd0aCgpID09IDApIHsKLSAgICAgIC8vIFdURiwgYW4gZW1wdHkgY29tbWl0IG1lc3NhZ2U/Ci0gICAgICBtc2didWYuYXBwZW5kKCI8bm8gY29tbWl0IG1lc3NhZ2UgcHJvdmlkZWQ+Iik7Ci0gICAgfQotICAgIGlmIChtc2didWYuY2hhckF0KG1zZ2J1Zi5sZW5ndGgoKSAtIDEpICE9ICdcbicpIHsKLSAgICAgIC8vIE1pc3NpbmcgYSB0cmFpbGluZyBMRj8gQ29ycmVjdCBpdCAocGVyaGFwcyB0aGUgZWRpdG9yIHdhcyBicm9rZW4pLgotICAgICAgbXNnYnVmLmFwcGVuZCgnXG4nKTsKLSAgICB9Ci0gICAgaWYgKGZvb3RlcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAvLyBEb2Vzbid0IGVuZCBpbiBhICJTaWduZWQtb2ZmLWJ5OiAuLi4iIHN0eWxlIGxpbmU/IEFkZCBhbm90aGVyIGxpbmUKLSAgICAgIC8vIGJyZWFrIHRvIHN0YXJ0IGEgbmV3IHBhcmFncmFwaCBmb3IgdGhlIHJldmlld2VkLWJ5IHRhZyBsaW5lcy4KLSAgICAgIC8vCi0gICAgICBtc2didWYuYXBwZW5kKCdcbicpOwotICAgIH0KLQotICAgIGlmICghY29udGFpbnMoZm9vdGVycywgQ0hBTkdFX0lELCBuLmNoYW5nZS5nZXRLZXkoKS5nZXQoKSkpIHsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoQ0hBTkdFX0lELmdldE5hbWUoKSk7Ci0gICAgICBtc2didWYuYXBwZW5kKCI6ICIpOwotICAgICAgbXNnYnVmLmFwcGVuZChuLmNoYW5nZS5nZXRLZXkoKS5nZXQoKSk7Ci0gICAgICBtc2didWYuYXBwZW5kKCdcbicpOwotICAgIH0KLQotICAgIGZpbmFsIFN0cmluZyBzaXRlVXJsID0gdXJsUHJvdmlkZXIuZ2V0KCk7Ci0gICAgaWYgKHNpdGVVcmwgIT0gbnVsbCkgewotICAgICAgZmluYWwgU3RyaW5nIHVybCA9IHNpdGVVcmwgKyBuLnBhdGNoc2V0SWQuZ2V0UGFyZW50S2V5KCkuZ2V0KCk7Ci0gICAgICBpZiAoIWNvbnRhaW5zKGZvb3RlcnMsIFJFVklFV0VEX09OLCB1cmwpKSB7Ci0gICAgICAgIG1zZ2J1Zi5hcHBlbmQoUkVWSUVXRURfT04uZ2V0TmFtZSgpKTsKLSAgICAgICAgbXNnYnVmLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgbXNnYnVmLmFwcGVuZCh1cmwpOwotICAgICAgICBtc2didWYuYXBwZW5kKCdcbicpOwotICAgICAgfQotICAgIH0KLQotICAgIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0QXVkaXQgPSBudWxsOwotICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxMaXN0ID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgYXBwcm92YWxMaXN0ID0KLSAgICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQobi5wYXRjaHNldElkKS50b0xpc3QoKTsKLSAgICAgIENvbGxlY3Rpb25zLnNvcnQoYXBwcm92YWxMaXN0LCBuZXcgQ29tcGFyYXRvcjxQYXRjaFNldEFwcHJvdmFsPigpIHsKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSwgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBiKSB7Ci0gICAgICAgICAgcmV0dXJuIGEuZ2V0R3JhbnRlZCgpLmNvbXBhcmVUbyhiLmdldEdyYW50ZWQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotCi0gICAgICBmb3IgKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFsTGlzdCkgewotICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpIDw9IDApIHsKLSAgICAgICAgICAvLyBOZWdhdGl2ZSB2b3RlcyBhcmVuJ3QgY291bnRlZC4KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChBcHByb3ZhbENhdGVnb3J5LlNVQk1JVC5lcXVhbHMoYS5nZXRDYXRlZ29yeUlkKCkpKSB7Ci0gICAgICAgICAgLy8gU3VibWl0IGlzIHRyZWF0ZWQgc3BlY2lhbGx5LCBiZWxvdyAoYmVjb21lcyBjb21taXR0ZXIpCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAoc3VibWl0QXVkaXQgPT0gbnVsbAotICAgICAgICAgICAgICB8fCBhLmdldEdyYW50ZWQoKS5jb21wYXJlVG8oc3VibWl0QXVkaXQuZ2V0R3JhbnRlZCgpKSA+IDApIHsKLSAgICAgICAgICAgIHN1Ym1pdEF1ZGl0ID0gYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBY2NvdW50IGFjYyA9Ci0gICAgICAgICAgICBpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGEuZ2V0QWNjb3VudElkKCkpLmdldEFjY291bnQoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBpZGVudGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGlmIChhY2MuZ2V0RnVsbE5hbWUoKSAhPSBudWxsICYmIGFjYy5nZXRGdWxsTmFtZSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgIGlmIChpZGVudGJ1Zi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIGlkZW50YnVmLmFwcGVuZCgnICcpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoYWNjLmdldEZ1bGxOYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhY2MuZ2V0UHJlZmVycmVkRW1haWwoKSAhPSBudWxsCi0gICAgICAgICAgICAmJiBhY2MuZ2V0UHJlZmVycmVkRW1haWwoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBpZiAoaXNTaWduZWRPZmZCeShmb290ZXJzLCBhY2MuZ2V0UHJlZmVycmVkRW1haWwoKSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaWRlbnRidWYubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoJyAnKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWRlbnRidWYuYXBwZW5kKCc8Jyk7Ci0gICAgICAgICAgaWRlbnRidWYuYXBwZW5kKGFjYy5nZXRQcmVmZXJyZWRFbWFpbCgpKTsKLSAgICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoJz4nKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaWRlbnRidWYubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgIC8vIE5vdGhpbmcgcmVhc29uYWJsZSB0byBkZXNjcmliZSB0aGVtIGJ5PyBJZ25vcmUgdGhlbS4KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFN0cmluZyB0YWc7Ci0gICAgICAgIGlmIChDUlZXLmVxdWFscyhhLmdldENhdGVnb3J5SWQoKSkpIHsKLSAgICAgICAgICB0YWcgPSAiUmV2aWV3ZWQtYnkiOwotICAgICAgICB9IGVsc2UgaWYgKFZSSUYuZXF1YWxzKGEuZ2V0Q2F0ZWdvcnlJZCgpKSkgewotICAgICAgICAgIHRhZyA9ICJUZXN0ZWQtYnkiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZpbmFsIEFwcHJvdmFsVHlwZSBhdCA9Ci0gICAgICAgICAgICAgIGFwcHJvdmFsVHlwZXMuYnlJZChhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICAgICAgaWYgKGF0ID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEEgZGVwcmVjYXRlZC9kZWxldGVkIGFwcHJvdmFsIHR5cGUsIGlnbm9yZSBpdC4KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICB0YWcgPSBhdC5nZXRDYXRlZ29yeSgpLmdldE5hbWUoKS5yZXBsYWNlKCcgJywgJy0nKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29udGFpbnMoZm9vdGVycywgbmV3IEZvb3RlcktleSh0YWcpLCBpZGVudGJ1Zi50b1N0cmluZygpKSkgewotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQodGFnKTsKLSAgICAgICAgICBtc2didWYuYXBwZW5kKCI6ICIpOwotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoaWRlbnRidWYpOwotICAgICAgICAgIG1zZ2J1Zi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewotICAgICAgbG9nLmVycm9yKCJDYW4ndCByZWFkIGFwcHJvdmFsIHJlY29yZHMgZm9yICIgKyBuLnBhdGNoc2V0SWQsIGUpOwotICAgIH0KLQotICAgIGZpbmFsIENvbW1pdEJ1aWxkZXIgbWVyZ2VDb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOwotICAgIG1lcmdlQ29tbWl0LnNldFRyZWVJZChtLmdldFJlc3VsdFRyZWVJZCgpKTsKLSAgICBtZXJnZUNvbW1pdC5zZXRQYXJlbnRJZChtZXJnZVRpcCk7Ci0gICAgbWVyZ2VDb21taXQuc2V0QXV0aG9yKG4uZ2V0QXV0aG9ySWRlbnQoKSk7Ci0gICAgbWVyZ2VDb21taXQuc2V0Q29tbWl0dGVyKHRvQ29tbWl0dGVySWRlbnQoc3VibWl0QXVkaXQpKTsKLSAgICBtZXJnZUNvbW1pdC5zZXRNZXNzYWdlKG1zZ2J1Zi50b1N0cmluZygpKTsKLQotICAgIGZpbmFsIE9iamVjdElkIGlkID0gY29tbWl0KG1lcmdlQ29tbWl0KTsKLSAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG5ld0NvbW1pdCA9IChDb2RlUmV2aWV3Q29tbWl0KSBydy5wYXJzZUNvbW1pdChpZCk7Ci0KLSAgICBpZiAoc3VibWl0QXVkaXQgIT0gbnVsbCkgewotICAgICAgZmluYWwgQ2hhbmdlIG9sZENoYW5nZSA9IG4uY2hhbmdlOwotCi0gICAgICBuLmNoYW5nZSA9Ci0gICAgICAgICAgZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShuLmNoYW5nZS5nZXRJZCgpLAotICAgICAgICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgY2hhbmdlLm5leHRQYXRjaFNldElkKCk7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgIGZpbmFsIFBhdGNoU2V0IHBzID0gbmV3IFBhdGNoU2V0KG4uY2hhbmdlLmN1cnJQYXRjaFNldElkKCkpOwotICAgICAgcHMuc2V0Q3JlYXRlZE9uKG5ldyBUaW1lc3RhbXAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLSAgICAgIHBzLnNldFVwbG9hZGVyKHN1Ym1pdEF1ZGl0LmdldEFjY291bnRJZCgpKTsKLSAgICAgIHBzLnNldFJldmlzaW9uKG5ldyBSZXZJZChpZC5nZXROYW1lKCkpKTsKLSAgICAgIGluc2VydEFuY2VzdG9ycyhwcy5nZXRJZCgpLCBuZXdDb21taXQpOwotICAgICAgZGIucGF0Y2hTZXRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihwcykpOwotCi0gICAgICBuLmNoYW5nZSA9Ci0gICAgICAgICAgZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShuLmNoYW5nZS5nZXRJZCgpLAotICAgICAgICAgICAgICBuZXcgQXRvbWljVXBkYXRlPENoYW5nZT4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldEN1cnJlbnRQYXRjaFNldChwYXRjaFNldEluZm9GYWN0b3J5LmdldChuZXdDb21taXQsCi0gICAgICAgICAgICAgICAgICAgICAgcHMuZ2V0SWQoKSkpOwotICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0pOwotCi0gICAgICB0aGlzLnN1Ym1pdHRlZC5yZW1vdmUob2xkQ2hhbmdlKTsKLSAgICAgIHRoaXMuc3VibWl0dGVkLmFkZChuLmNoYW5nZSk7Ci0KLSAgICAgIGlmIChhcHByb3ZhbExpc3QgIT0gbnVsbCkgewotICAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFsTGlzdCkgewotICAgICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuaW5zZXJ0KAotICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IFBhdGNoU2V0QXBwcm92YWwocHMuZ2V0SWQoKSwgYSkpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmaW5hbCBSZWZVcGRhdGUgcnUgPSByZXBvLnVwZGF0ZVJlZihwcy5nZXRSZWZOYW1lKCkpOwotICAgICAgcnUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChPYmplY3RJZC56ZXJvSWQoKSk7Ci0gICAgICBydS5zZXROZXdPYmplY3RJZChuZXdDb21taXQpOwotICAgICAgcnUuZGlzYWJsZVJlZkxvZygpOwotICAgICAgaWYgKHJ1LnVwZGF0ZShydykgIT0gUmVmVXBkYXRlLlJlc3VsdC5ORVcpIHsKLSAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZWYgJXMgaW4gJXM6ICVzIiwgcHMuZ2V0UmVmTmFtZSgpLCBuLmNoYW5nZQotICAgICAgICAgICAgICAgIC5nZXREZXN0KCkuZ2V0UGFyZW50S2V5KCkuZ2V0KCksIHJ1LmdldFJlc3VsdCgpKSk7Ci0gICAgICB9Ci0gICAgICByZXBsaWNhdGlvbi5maXJlKG4uY2hhbmdlLmdldFByb2plY3QoKSwgcnUuZ2V0TmFtZSgpKTsKLSAgICB9Ci0KLSAgICBuZXdDb21taXQuY29weUZyb20obik7Ci0gICAgbmV3Q29tbWl0LnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9QSUNLOwotICAgIGNvbW1pdHMucHV0KG5ld0NvbW1pdC5wYXRjaHNldElkLmdldFBhcmVudEtleSgpLCBuZXdDb21taXQpOwotICAgIG1lcmdlVGlwID0gbmV3Q29tbWl0OwotICAgIHNldFJlZkxvZ0lkZW50KHN1Ym1pdEF1ZGl0KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbnNlcnRBbmNlc3RvcnMoUGF0Y2hTZXQuSWQgaWQsIFJldkNvbW1pdCBzcmMpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgY250ID0gc3JjLmdldFBhcmVudENvdW50KCk7Ci0gICAgTGlzdDxQYXRjaFNldEFuY2VzdG9yPiB0b0luc2VydCA9IG5ldyBBcnJheUxpc3Q8UGF0Y2hTZXRBbmNlc3Rvcj4oY250KTsKLSAgICBmb3IgKGludCBwID0gMDsgcCA8IGNudDsgcCsrKSB7Ci0gICAgICBQYXRjaFNldEFuY2VzdG9yIGE7Ci0KLSAgICAgIGEgPSBuZXcgUGF0Y2hTZXRBbmNlc3RvcihuZXcgUGF0Y2hTZXRBbmNlc3Rvci5JZChpZCwgcCArIDEpKTsKLSAgICAgIGEuc2V0QW5jZXN0b3JSZXZpc2lvbihuZXcgUmV2SWQoc3JjLmdldFBhcmVudChwKS5nZXRJZCgpLm5hbWUoKSkpOwotICAgICAgdG9JbnNlcnQuYWRkKGEpOwotICAgIH0KLSAgICBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmluc2VydCh0b0luc2VydCk7Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdElkIGNvbW1pdChDb21taXRCdWlsZGVyIG1lcmdlQ29tbWl0KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBPYmplY3RJZCBpZCA9IGluc2VydGVyLmluc2VydChtZXJnZUNvbW1pdCk7Ci0gICAgaW5zZXJ0ZXIuZmx1c2goKTsKLSAgICByZXR1cm4gaWQ7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoTGlzdDxGb290ZXJMaW5lPiBmb290ZXJzLCBGb290ZXJLZXkga2V5LCBTdHJpbmcgdmFsKSB7Ci0gICAgZm9yIChmaW5hbCBGb290ZXJMaW5lIGxpbmUgOiBmb290ZXJzKSB7Ci0gICAgICBpZiAobGluZS5tYXRjaGVzKGtleSkgJiYgdmFsLmVxdWFscyhsaW5lLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNTaWduZWRPZmZCeShMaXN0PEZvb3RlckxpbmU+IGZvb3RlcnMsIFN0cmluZyBlbWFpbCkgewotICAgIGZvciAoZmluYWwgRm9vdGVyTGluZSBsaW5lIDogZm9vdGVycykgewotICAgICAgaWYgKGxpbmUubWF0Y2hlcyhGb290ZXJLZXkuU0lHTkVEX09GRl9CWSkKLSAgICAgICAgICAmJiBlbWFpbC5lcXVhbHMobGluZS5nZXRFbWFpbEFkZHJlc3MoKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgUGVyc29uSWRlbnQgdG9Db21taXR0ZXJJZGVudChmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGF1ZGl0KSB7Ci0gICAgaWYgKGF1ZGl0ICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGF1ZGl0LmdldEFjY291bnRJZCgpKQotICAgICAgICAgIC5uZXdDb21taXR0ZXJJZGVudChhdWRpdC5nZXRHcmFudGVkKCksIG15SWRlbnQuZ2V0VGltZVpvbmUoKSk7Ci0gICAgfQotICAgIHJldHVybiBteUlkZW50OwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJyYW5jaCgpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CiAgICAgaWYgKG1lcmdlVGlwICE9IG51bGwgJiYgKGJyYW5jaFRpcCA9PSBudWxsIHx8IGJyYW5jaFRpcCAhPSBtZXJnZVRpcCkpIHsKICAgICAgIGlmIChHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLmVxdWFscyhicmFuY2hVcGRhdGUuZ2V0TmFtZSgpKSkgewogICAgICAgICB0cnkgewotICAgICAgICAgIFByb2plY3RDb25maWcgY2ZnID0gbmV3IFByb2plY3RDb25maWcoZGVzdFByb2plY3QuZ2V0TmFtZUtleSgpKTsKKyAgICAgICAgICBQcm9qZWN0Q29uZmlnIGNmZyA9CisgICAgICAgICAgICAgIG5ldyBQcm9qZWN0Q29uZmlnKGRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOwogICAgICAgICAgIGNmZy5sb2FkKHJlcG8sIG1lcmdlVGlwKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIlN1Ym1pdCB3b3VsZCBzdG9yZSBpbnZhbGlkIgogICAgICAgICAgICAgICArICIgcHJvamVjdCBjb25maWd1cmF0aW9uICIgKyBtZXJnZVRpcC5uYW1lKCkgKyAiIGZvciAiCi0gICAgICAgICAgICAgICsgZGVzdFByb2plY3QuZ2V0TmFtZSgpLCBlKTsKKyAgICAgICAgICAgICAgKyBkZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlKTsKICAgICAgICAgfQogICAgICAgfQogCisgICAgICBicmFuY2hVcGRhdGUuc2V0UmVmTG9nSWRlbnQocmVmTG9nSWRlbnQpOwogICAgICAgYnJhbmNoVXBkYXRlLnNldEZvcmNlVXBkYXRlKGZhbHNlKTsKICAgICAgIGJyYW5jaFVwZGF0ZS5zZXROZXdPYmplY3RJZChtZXJnZVRpcCk7CiAgICAgICBicmFuY2hVcGRhdGUuc2V0UmVmTG9nTWVzc2FnZSgibWVyZ2VkIiwgdHJ1ZSk7CkBAIC0xMTIxLDEzICs2NzQsMTQgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcuZXF1YWxzKGJyYW5jaFVwZGF0ZS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgIHByb2plY3RDYWNoZS5ldmljdChkZXN0UHJvamVjdCk7Ci0gICAgICAgICAgICAgIFByb2plY3RTdGF0ZSBwcyA9IHByb2plY3RDYWNoZS5nZXQoZGVzdFByb2plY3QuZ2V0TmFtZUtleSgpKTsKLSAgICAgICAgICAgICAgcmVwb01hbmFnZXIuc2V0UHJvamVjdERlc2NyaXB0aW9uKGRlc3RQcm9qZWN0LmdldE5hbWVLZXkoKSwgLy8KLSAgICAgICAgICAgICAgICAgIHBzLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgICAgICAgICAgcHJvamVjdENhY2hlLmV2aWN0KGRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7CisgICAgICAgICAgICAgIGRlc3RQcm9qZWN0ID0gcHJvamVjdENhY2hlLmdldChkZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKKyAgICAgICAgICAgICAgcmVwb01hbmFnZXIuc2V0UHJvamVjdERlc2NyaXB0aW9uKAorICAgICAgICAgICAgICAgICAgZGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSwKKyAgICAgICAgICAgICAgICAgIGRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmVwbGljYXRpb24uZmlyZShkZXN0QnJhbmNoLmdldFBhcmVudEtleSgpLCBicmFuY2hVcGRhdGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGdpdFJlZlVwZGF0ZWQuZmlyZShkZXN0QnJhbmNoLmdldFBhcmVudEtleSgpLCBicmFuY2hVcGRhdGUpOwogCiAgICAgICAgICAgICBBY2NvdW50IGFjY291bnQgPSBudWxsOwogICAgICAgICAgICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXIgPSBnZXRTdWJtaXR0ZXIoZGIsIG1lcmdlVGlwLnBhdGNoc2V0SWQpOwpAQCAtMTEzNyw2ICs2OTEsMTYgQEAKICAgICAgICAgICAgIGhvb2tzLmRvUmVmVXBkYXRlZEhvb2soZGVzdEJyYW5jaCwgYnJhbmNoVXBkYXRlLCBhY2NvdW50KTsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgICAgY2FzZSBMT0NLX0ZBSUxVUkU6CisgICAgICAgICAgICBTdHJpbmcgbXNnOworICAgICAgICAgICAgaWYgKHN0cmF0ZWd5LnJldHJ5T25Mb2NrRmFpbHVyZSgpKSB7CisgICAgICAgICAgICAgIG1lcmdlUXVldWUucmVjaGVja0FmdGVyKGRlc3RCcmFuY2gsIExPQ0tfRkFJTFVSRV9SRVRSWV9ERUxBWSwKKyAgICAgICAgICAgICAgICAgIE1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgIG1zZyA9ICJ3aWxsIHJldHJ5IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG1zZyA9ICJ3aWxsIG5vdCByZXRyeSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oYnJhbmNoVXBkYXRlLmdldFJlc3VsdCgpLm5hbWUoKSArICIsICIgKyBtc2cpOwogICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oYnJhbmNoVXBkYXRlLmdldFJlc3VsdCgpLm5hbWUoKSk7CiAgICAgICAgIH0KQEAgLTExNDYsMjMgKzcxMCw3IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBib29sZWFuIGlzTWVyZ2VhYmxlKENoYW5nZSBjKSB7Ci0gICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjb21taXQgPSBjb21taXRzLmdldChjLmdldElkKCkpOwotICAgIGZpbmFsIENvbW1pdE1lcmdlU3RhdHVzIHMgPSBjb21taXQgIT0gbnVsbCA/IGNvbW1pdC5zdGF0dXNDb2RlIDogbnVsbDsKLSAgICBib29sZWFuIGlzTWVyZ2VhYmxlID0gZmFsc2U7Ci0gICAgaWYgKHMgIT0gbnVsbAotICAgICAgICAmJiAocy5lcXVhbHMoQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fTUVSR0UpCi0gICAgICAgICAgICB8fCBzLmVxdWFscyhDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9QSUNLKSB8fCBzCi0gICAgICAgICAgICAuZXF1YWxzKENvbW1pdE1lcmdlU3RhdHVzLkFMUkVBRFlfTUVSR0VEKSkpIHsKLSAgICAgIGlzTWVyZ2VhYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaXNNZXJnZWFibGU7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlQ2hhbmdlU3RhdHVzKCkgewotICAgIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gbWVyZ2VkID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOwotCisgIHByaXZhdGUgdm9pZCB1cGRhdGVDaGFuZ2VTdGF0dXMoZmluYWwgTGlzdDxDaGFuZ2U+IHN1Ym1pdHRlZCkgewogICAgIGZvciAoZmluYWwgQ2hhbmdlIGMgOiBzdWJtaXR0ZWQpIHsKICAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgY29tbWl0ID0gY29tbWl0cy5nZXQoYy5nZXRJZCgpKTsKICAgICAgIGZpbmFsIENvbW1pdE1lcmdlU3RhdHVzIHMgPSBjb21taXQgIT0gbnVsbCA/IGNvbW1pdC5zdGF0dXNDb2RlIDogbnVsbDsKQEAgLTExNzUsNjYgKzcyMyw1MSBAQAogCiAgICAgICBmaW5hbCBTdHJpbmcgdHh0ID0gcy5nZXRNZXNzYWdlKCk7CiAKLSAgICAgIHN3aXRjaCAocykgewotICAgICAgICBjYXNlIENMRUFOX01FUkdFOiB7Ci0gICAgICAgICAgc2V0TWVyZ2VkKGMsIG1lc3NhZ2UoYywgdHh0KSk7Ci0gICAgICAgICAgbWVyZ2VkLmFkZChjb21taXQpOwotICAgICAgICAgIGJyZWFrOworICAgICAgdHJ5IHsKKyAgICAgICAgc3dpdGNoIChzKSB7CisgICAgICAgICAgY2FzZSBDTEVBTl9NRVJHRToKKyAgICAgICAgICAgIHNldE1lcmdlZChjLCBtZXNzYWdlKGMsIHR4dCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIENMRUFOX1JFQkFTRToKKyAgICAgICAgICBjYXNlIENMRUFOX1BJQ0s6CisgICAgICAgICAgICBzZXRNZXJnZWQoYywgbWVzc2FnZShjLCB0eHQgKyAiIGFzICIgKyBjb21taXQubmFtZSgpKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgQUxSRUFEWV9NRVJHRUQ6CisgICAgICAgICAgICBzZXRNZXJnZWQoYywgbnVsbCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgUEFUSF9DT05GTElDVDoKKyAgICAgICAgICBjYXNlIE1BTlVBTF9SRUNVUlNJVkVfTUVSR0U6CisgICAgICAgICAgY2FzZSBDQU5OT1RfQ0hFUlJZX1BJQ0tfUk9PVDoKKyAgICAgICAgICBjYXNlIE5PVF9GQVNUX0ZPUldBUkQ6CisgICAgICAgICAgY2FzZSBJTlZBTElEX1BST0pFQ1RfQ09ORklHVVJBVElPTjoKKyAgICAgICAgICBjYXNlIElOVkFMSURfUFJPSkVDVF9DT05GSUdVUkFUSU9OX1BBUkVOVF9QUk9KRUNUX05PVF9GT1VORDoKKyAgICAgICAgICBjYXNlIElOVkFMSURfUFJPSkVDVF9DT05GSUdVUkFUSU9OX1JPT1RfUFJPSkVDVF9DQU5OT1RfSEFWRV9QQVJFTlQ6CisgICAgICAgICAgY2FzZSBTRVRUSU5HX1BBUkVOVF9QUk9KRUNUX09OTFlfQUxMT1dFRF9CWV9BRE1JTjoKKyAgICAgICAgICAgIHNldE5ldyhjLCBtZXNzYWdlKGMsIHR4dCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIE1JU1NJTkdfREVQRU5ERU5DWToKKyAgICAgICAgICAgIHBvdGVudGlhbGx5U3RpbGxTdWJtaXR0YWJsZS5hZGQoY29tbWl0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNldE5ldyhjLCBtZXNzYWdlKGMsICJVbnNwZWNpZmllZCBtZXJnZSBmYWlsdXJlOiAiICsgcy5uYW1lKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBDTEVBTl9QSUNLOiB7Ci0gICAgICAgICAgc2V0TWVyZ2VkKGMsIG1lc3NhZ2UoYywgdHh0ICsgIiBhcyAiICsgY29tbWl0Lm5hbWUoKSkpOwotICAgICAgICAgIG1lcmdlZC5hZGQoY29tbWl0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQUxSRUFEWV9NRVJHRUQ6Ci0gICAgICAgICAgc2V0TWVyZ2VkKGMsIG51bGwpOwotICAgICAgICAgIG1lcmdlZC5hZGQoY29tbWl0KTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBBVEhfQ09ORkxJQ1Q6Ci0gICAgICAgIGNhc2UgQ1JJU1NfQ1JPU1NfTUVSR0U6Ci0gICAgICAgIGNhc2UgQ0FOTk9UX0NIRVJSWV9QSUNLX1JPT1Q6Ci0gICAgICAgIGNhc2UgTk9UX0ZBU1RfRk9SV0FSRDoKLSAgICAgICAgY2FzZSBJTlZBTElEX1BST0pFQ1RfQ09ORklHVVJBVElPTjoKLSAgICAgICAgY2FzZSBJTlZBTElEX1BST0pFQ1RfQ09ORklHVVJBVElPTl9QQVJFTlRfUFJPSkVDVF9OT1RfRk9VTkQ6Ci0gICAgICAgIGNhc2UgSU5WQUxJRF9QUk9KRUNUX0NPTkZJR1VSQVRJT05fUk9PVF9QUk9KRUNUX0NBTk5PVF9IQVZFX1BBUkVOVDoKLSAgICAgICAgY2FzZSBTRVRUSU5HX1BBUkVOVF9QUk9KRUNUX09OTFlfQUxMT1dFRF9CWV9BRE1JTjogewotICAgICAgICAgIHNldE5ldyhjLCBtZXNzYWdlKGMsIHR4dCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBNSVNTSU5HX0RFUEVOREVOQ1k6IHsKLSAgICAgICAgICBmaW5hbCBDYXBhYmxlIGNhcGFibGUgPSBpc1N1Ym1pdFN0aWxsUG9zc2libGUoY29tbWl0KTsKLSAgICAgICAgICBpZiAoY2FwYWJsZSAhPSBDYXBhYmxlLk9LKSB7Ci0gICAgICAgICAgICBzZW5kTWVyZ2VGYWlsKGMsIG1lc3NhZ2UoYywgY2FwYWJsZS5nZXRNZXNzYWdlKCkpLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBzZXROZXcoYywgbWVzc2FnZShjLCAiVW5zcGVjaWZpZWQgbWVyZ2UgZmFpbHVyZTogIiArIHMubmFtZSgpKSk7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CisgICAgICAgIGxvZy53YXJuKCJFcnJvciB1cGRhdGluZyBjaGFuZ2Ugc3RhdHVzIGZvciAiICsgYy5nZXRJZCgpLCBlcnIpOwogICAgICAgfQogICAgIH0KLQotICAgIENyZWF0ZUNvZGVSZXZpZXdOb3RlcyBjb2RlUmV2aWV3Tm90ZXMgPQotICAgICAgICBjb2RlUmV2aWV3Tm90ZXNGYWN0b3J5LmNyZWF0ZShkYiwgcmVwbyk7Ci0gICAgdHJ5IHsKLSAgICAgIGNvZGVSZXZpZXdOb3Rlcy5jcmVhdGUobWVyZ2VkLCBjb21wdXRlQXV0aG9yKG1lcmdlZCkpOwotICAgIH0gY2F0Y2ggKENvZGVSZXZpZXdOb3RlQ3JlYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgbG9nLmVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmVwbGljYXRpb24uZmlyZShkZXN0QnJhbmNoLmdldFBhcmVudEtleSgpLAotICAgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZTX05PVEVTX1JFVklFVyk7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgdXBkYXRlU3Vic2NyaXB0aW9ucygpIHsKKyAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVN1YnNjcmlwdGlvbnMoZmluYWwgTGlzdDxDaGFuZ2U+IHN1Ym1pdHRlZCkgewogICAgIGlmIChtZXJnZVRpcCAhPSBudWxsICYmIChicmFuY2hUaXAgPT0gbnVsbCB8fCBicmFuY2hUaXAgIT0gbWVyZ2VUaXApKSB7CiAgICAgICBTdWJtb2R1bGVPcCBzdWJPcCA9Ci0gICAgICAgICAgc3ViT3BGYWN0b3J5LmNyZWF0ZShkZXN0QnJhbmNoLCBtZXJnZVRpcCwgcncsIHJlcG8sIGRlc3RQcm9qZWN0LAotICAgICAgICAgICAgICBzdWJtaXR0ZWQsIGNvbW1pdHMpOworICAgICAgICAgIHN1Yk9wRmFjdG9yeS5jcmVhdGUoZGVzdEJyYW5jaCwgbWVyZ2VUaXAsIHJ3LCByZXBvLAorICAgICAgICAgICAgICBkZXN0UHJvamVjdC5nZXRQcm9qZWN0KCksIHN1Ym1pdHRlZCwgY29tbWl0cyk7CiAgICAgICB0cnkgewogICAgICAgICBzdWJPcC51cGRhdGUoKTsKICAgICAgIH0gY2F0Y2ggKFN1Ym1vZHVsZUV4Y2VwdGlvbiBlKSB7CkBAIC0xMjQ4LDMyICs3ODEsNyBAQAogICBwcml2YXRlIENhcGFibGUgaXNTdWJtaXRTdGlsbFBvc3NpYmxlKGZpbmFsIENvZGVSZXZpZXdDb21taXQgY29tbWl0KSB7CiAgICAgZmluYWwgQ2FwYWJsZSBjYXBhYmxlOwogICAgIGZpbmFsIENoYW5nZSBjID0gY29tbWl0LmNoYW5nZTsKLSAgICBpZiAoY29tbWl0Lm1pc3NpbmcgPT0gbnVsbCkgewotICAgICAgY29tbWl0Lm1pc3NpbmcgPSBuZXcgQXJyYXlMaXN0PENvZGVSZXZpZXdDb21taXQ+KCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBzdWJtaXRTdGlsbFBvc3NpYmxlID0gY29tbWl0Lm1pc3Npbmcuc2l6ZSgpID4gMDsKLSAgICBmb3IgKENvZGVSZXZpZXdDb21taXQgbWlzc2luZ0NvbW1pdCA6IGNvbW1pdC5taXNzaW5nKSB7Ci0gICAgICBsb2FkQ2hhbmdlSW5mbyhtaXNzaW5nQ29tbWl0KTsKLQotICAgICAgaWYgKG1pc3NpbmdDb21taXQucGF0Y2hzZXRJZCA9PSBudWxsKSB7Ci0gICAgICAgIC8vIFRoZSBjb21taXQgZG9lc24ndCBoYXZlIGEgcGF0Y2ggc2V0LCBzbyBpdCBjYW5ub3QgYmUKLSAgICAgICAgLy8gc3VibWl0dGVkIHRvIHRoZSBicmFuY2guCi0gICAgICAgIC8vCi0gICAgICAgIHN1Ym1pdFN0aWxsUG9zc2libGUgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghbWlzc2luZ0NvbW1pdC5jaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5lcXVhbHMoCi0gICAgICAgICAgbWlzc2luZ0NvbW1pdC5wYXRjaHNldElkKSkgewotICAgICAgICAvLyBJZiB0aGUgbWlzc2luZyBjb21taXQgaXMgbm90IHRoZSBjdXJyZW50IHBhdGNoIHNldCwKLSAgICAgICAgLy8gdGhlIGNoYW5nZSBtdXN0IGJlIHJlYmFzZWQgdG8gdXNlIHRoZSBwcm9wZXIgcGFyZW50LgotICAgICAgICAvLwotICAgICAgICBzdWJtaXRTdGlsbFBvc3NpYmxlID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQorICAgIGZpbmFsIGJvb2xlYW4gc3VibWl0U3RpbGxQb3NzaWJsZSA9IGlzU3VibWl0Rm9yTWlzc2luZ0NvbW1pdHNTdGlsbFBvc3NpYmxlKGNvbW1pdCk7CiAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICBmaW5hbCBsb25nIHdhaXRVbnRpbCA9IGMuZ2V0TGFzdFVwZGF0ZWRPbigpLmdldFRpbWUoKSArIERFUEVOREVOQ1lfREVMQVk7CiAgICAgaWYgKHN1Ym1pdFN0aWxsUG9zc2libGUgJiYgbm93IDwgd2FpdFVudGlsKSB7CkBAIC0xMjg3LDI1ICs3OTUsMjAgQEAKICAgICAgIC8vIGRlcGVuZGVuY2llcyBhcmUgYWxzbyBzdWJtaXR0ZWQuIFBlcmhhcHMgdGhlIHVzZXIganVzdAogICAgICAgLy8gZm9yZ290IHRvIHN1Ym1pdCB0aG9zZS4KICAgICAgIC8vCi0gICAgICBTdHJpbmcgdHh0ID0KLSAgICAgICAgICAiQ2hhbmdlIGNvdWxkIG5vdCBiZSBtZXJnZWQgYmVjYXVzZSBvZiBhIG1pc3NpbmcgZGVwZW5kZW5jeS4iOwotICAgICAgaWYgKCFpc0FscmVhZHlTZW50KGMsIHR4dCkpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBtID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbS5hcHBlbmQodHh0KTsKLSAgICAgICAgbS5hcHBlbmQoIlxuIik7CisgICAgICBTdHJpbmdCdWlsZGVyIG0gPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgbS5hcHBlbmQoIkNoYW5nZSBjb3VsZCBub3QgYmUgbWVyZ2VkIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIGRlcGVuZGVuY3kuIik7CisgICAgICBtLmFwcGVuZCgiXG4iKTsKIAotICAgICAgICBtLmFwcGVuZCgiXG4iKTsKKyAgICAgIG0uYXBwZW5kKCJcbiIpOwogCi0gICAgICAgIG0uYXBwZW5kKCJUaGUgZm9sbG93aW5nIGNoYW5nZXMgbXVzdCBhbHNvIGJlIHN1Ym1pdHRlZDpcbiIpOworICAgICAgbS5hcHBlbmQoIlRoZSBmb2xsb3dpbmcgY2hhbmdlcyBtdXN0IGFsc28gYmUgc3VibWl0dGVkOlxuIik7CisgICAgICBtLmFwcGVuZCgiXG4iKTsKKyAgICAgIGZvciAoQ29kZVJldmlld0NvbW1pdCBtaXNzaW5nQ29tbWl0IDogY29tbWl0Lm1pc3NpbmcpIHsKKyAgICAgICAgbS5hcHBlbmQoIiogIik7CisgICAgICAgIG0uYXBwZW5kKG1pc3NpbmdDb21taXQuY2hhbmdlLmdldEtleSgpLmdldCgpKTsKICAgICAgICAgbS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIGZvciAoQ29kZVJldmlld0NvbW1pdCBtaXNzaW5nQ29tbWl0IDogY29tbWl0Lm1pc3NpbmcpIHsKLSAgICAgICAgICBtLmFwcGVuZCgiKiAiKTsKLSAgICAgICAgICBtLmFwcGVuZChtaXNzaW5nQ29tbWl0LmNoYW5nZS5nZXRLZXkoKS5nZXQoKSk7Ci0gICAgICAgICAgbS5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgdHh0ID0gbS50b1N0cmluZygpOwogICAgICAgfQotICAgICAgY2FwYWJsZSA9IG5ldyBDYXBhYmxlKHR4dCk7CisgICAgICBjYXBhYmxlID0gbmV3IENhcGFibGUobS50b1N0cmluZygpKTsKICAgICB9IGVsc2UgewogICAgICAgLy8gSXQgaXMgaW1wb3NzaWJsZSB0byBzdWJtaXQgdGhpcyBjaGFuZ2UgYXMtaXMuIFRoZSBhdXRob3IKICAgICAgIC8vIG5lZWRzIHRvIHJlYmFzZSBpdCBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCB0aGUgbWlzc2luZwpAQCAtMTMyMyw4ICs4MjYsMTAgQEAKICAgICAgICAgICBtLmFwcGVuZChtaXNzaW5nQ29tbWl0LnBhdGNoc2V0SWQuZ2V0KCkpOwogICAgICAgICAgIG0uYXBwZW5kKCIgb2YgIik7CiAgICAgICAgICAgbS5hcHBlbmQobWlzc2luZ0NvbW1pdC5jaGFuZ2UuZ2V0S2V5KCkuYWJicmV2aWF0ZSgpKTsKLSAgICAgICAgICBtLmFwcGVuZCgiLCBob3dldmVyIHRoZSBjdXJyZW50IHBhdGNoIHNldCBpcyAiKTsKLSAgICAgICAgICBtLmFwcGVuZChtaXNzaW5nQ29tbWl0LmNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpLmdldCgpKTsKKyAgICAgICAgICBpZiAobWlzc2luZ0NvbW1pdC5wYXRjaHNldElkLmdldCgpICE9IG1pc3NpbmdDb21taXQuY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCkuZ2V0KCkpIHsKKyAgICAgICAgICAgIG0uYXBwZW5kKCIsIGhvd2V2ZXIgdGhlIGN1cnJlbnQgcGF0Y2ggc2V0IGlzICIpOworICAgICAgICAgICAgbS5hcHBlbmQobWlzc2luZ0NvbW1pdC5jaGFuZ2UuY3VycmVudFBhdGNoU2V0SWQoKS5nZXQoKSk7CisgICAgICAgICAgfQogICAgICAgICAgIG0uYXBwZW5kKCIuXG4iKTsKIAogICAgICAgICB9IGVsc2UgewpAQCAtMTM1NiwzMCArODYxLDYgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIGJvb2xlYW4gaXNBbHJlYWR5U2VudChmaW5hbCBDaGFuZ2UgYywgZmluYWwgU3RyaW5nIHByZWZpeCkgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBMaXN0PENoYW5nZU1lc3NhZ2U+IG1zZ0xpc3QgPQotICAgICAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuYnlDaGFuZ2UoYy5nZXRJZCgpKS50b0xpc3QoKTsKLSAgICAgIGlmIChtc2dMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgZmluYWwgQ2hhbmdlTWVzc2FnZSBsYXN0ID0gbXNnTGlzdC5nZXQobXNnTGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgaWYgKGxhc3QuZ2V0QXV0aG9yKCkgPT0gbnVsbCAmJiBsYXN0LmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLSAgICAgICAgICAvLyBUaGUgbGFzdCBtZXNzYWdlIHdhcyB3cml0dGVuIGJ5IHVzLCBhbmQgaXQgc2FpZCB0aGlzCi0gICAgICAgICAgLy8gc2FtZSBtZXNzYWdlIGFscmVhZHkuIEl0cyB1bmxpa2VseSBhbnl0aGluZyBoYXMgY2hhbmdlZAotICAgICAgICAgIC8vIHRoYXQgd291bGQgY2F1c2UgdXMgdG8gbmVlZCB0byByZXBlYXQgb3Vyc2VsdmVzLgotICAgICAgICAgIC8vCi0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGhlIGxhc3QgbWVzc2FnZSB3YXMgbm90IHNlbnQgYnkgdXMsIG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIHRleHQKLSAgICAgIC8vIHdlIGFyZSBhYm91dCB0byBzZW5kLgotICAgICAgLy8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KICAgcHJpdmF0ZSBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2UoZmluYWwgQ2hhbmdlIGMsIGZpbmFsIFN0cmluZyBib2R5KSB7CiAgICAgZmluYWwgU3RyaW5nIHV1aWQ7CiAgICAgdHJ5IHsKQEAgLTEzOTQsODcgKzg3NSw4NyBAQAogICAgIHJldHVybiBtOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgUGF0Y2hTZXRBcHByb3ZhbCBnZXRTdWJtaXR0ZXIoUmV2aWV3RGIgcmV2aWV3RGIsCi0gICAgICBQYXRjaFNldC5JZCBjKSB7Ci0gICAgaWYgKGMgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0dGVyID0gbnVsbDsKKyAgcHJpdmF0ZSB2b2lkIHNldE1lcmdlZChmaW5hbCBDaGFuZ2UgYywgZmluYWwgQ2hhbmdlTWVzc2FnZSBtc2cpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICB0cnkgewotICAgICAgZmluYWwgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPQotICAgICAgICAgIHJldmlld0RiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldChjKS50b0xpc3QoKTsKLSAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxzKSB7Ci0gICAgICAgIGlmIChhLmdldFZhbHVlKCkgPiAwCi0gICAgICAgICAgICAmJiBBcHByb3ZhbENhdGVnb3J5LlNVQk1JVC5lcXVhbHMoYS5nZXRDYXRlZ29yeUlkKCkpKSB7Ci0gICAgICAgICAgaWYgKHN1Ym1pdHRlciA9PSBudWxsCi0gICAgICAgICAgICAgIHx8IGEuZ2V0R3JhbnRlZCgpLmNvbXBhcmVUbyhzdWJtaXR0ZXIuZ2V0R3JhbnRlZCgpKSA+IDApIHsKLSAgICAgICAgICAgIHN1Ym1pdHRlciA9IGE7Ci0gICAgICAgICAgfQorICAgICAgZGIuY2hhbmdlcygpLmJlZ2luVHJhbnNhY3Rpb24oYy5nZXRJZCgpKTsKKworICAgICAgLy8gV2UgbXVzdCBwdWxsIHRoZSBwYXRjaHNldCBvdXQgb2YgY29tbWl0cywgYmVjYXVzZSB0aGUgcGF0Y2hzZXQgSUQgaXMKKyAgICAgIC8vIG1vZGlmaWVkIHdoZW4gdXNpbmcgdGhlIGNoZXJyeS1waWNrIG1lcmdlIHN0cmF0ZWd5LgorICAgICAgQ29kZVJldmlld0NvbW1pdCBjb21taXQgPSBjb21taXRzLmdldChjLmdldElkKCkpOworICAgICAgUGF0Y2hTZXQuSWQgbWVyZ2VkID0gY29tbWl0LmNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpOworICAgICAgc2V0TWVyZ2VkUGF0Y2hTZXQoYy5nZXRJZCgpLCBtZXJnZWQpOworICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXIgPSBzYXZlQXBwcm92YWxzKGMsIG1lcmdlZCk7CisgICAgICBhZGRNZXJnZWRNZXNzYWdlKHN1Ym1pdHRlciwgbXNnKTsKKworICAgICAgZGIuY29tbWl0KCk7CisKKyAgICAgIHNlbmRNZXJnZWRFbWFpbChjLCBzdWJtaXR0ZXIpOworICAgICAgaWYgKHN1Ym1pdHRlciAhPSBudWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaG9va3MuZG9DaGFuZ2VNZXJnZWRIb29rKGMsCisgICAgICAgICAgICAgIGFjY291bnRDYWNoZS5nZXQoc3VibWl0dGVyLmdldEFjY291bnRJZCgpKS5nZXRBY2NvdW50KCksCisgICAgICAgICAgICAgIGRiLnBhdGNoU2V0cygpLmdldChjLmN1cnJlbnRQYXRjaFNldElkKCkpLCBkYik7CisgICAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHJ1biBob29rIGZvciBzdWJtaXR0ZWQgcGF0Y2ggc2V0ICIgKyBjLmdldElkKCksIGV4KTsKICAgICAgICAgfQogICAgICAgfQotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGRiLnJvbGxiYWNrKCk7CiAgICAgfQotICAgIHJldHVybiBzdWJtaXR0ZXI7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgc2V0TWVyZ2VkKGZpbmFsIENoYW5nZSBjLCBmaW5hbCBDaGFuZ2VNZXNzYWdlIG1zZykgewotICAgIGZpbmFsIENoYW5nZS5JZCBjaGFuZ2VJZCA9IGMuZ2V0SWQoKTsKLSAgICAvLyBXZSBtdXN0IHB1bGwgdGhlIHBhdGNoc2V0IG91dCBvZiBjb21taXRzLCBiZWNhdXNlIHRoZSBwYXRjaHNldCBJRCBpcwotICAgIC8vIG1vZGlmaWVkIHdoZW4gdXNpbmcgdGhlIGNoZXJyeS1waWNrIG1lcmdlIHN0cmF0ZWd5LgotICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgY29tbWl0ID0gY29tbWl0cy5nZXQoYy5nZXRJZCgpKTsKLSAgICBmaW5hbCBQYXRjaFNldC5JZCBtZXJnZWQgPSBjb21taXQuY2hhbmdlLmN1cnJlbnRQYXRjaFNldElkKCk7Ci0KLSAgICB0cnkgewotICAgICAgZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2VJZCwgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIENoYW5nZSB1cGRhdGUoQ2hhbmdlIGMpIHsKLSAgICAgICAgICBjLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLk1FUkdFRCk7Ci0gICAgICAgICAgLy8gSXQgY291bGQgYmUgcG9zc2libGUgdGhhdCB0aGUgY2hhbmdlIGJlaW5nIG1lcmdlZAotICAgICAgICAgIC8vIGhhcyBuZXZlciBoYWQgaXRzIG1lcmdlYWJpbGl0eSB0ZXN0ZWQuIFNvIHdlIGluc3VyZQotICAgICAgICAgIC8vIG1lcmdlZCBjaGFuZ2VzIGhhcyBtZXJnZWFibGUgZmllbGQgdHJ1ZS4KLSAgICAgICAgICBjLnNldE1lcmdlYWJsZSh0cnVlKTsKLSAgICAgICAgICBpZiAoIW1lcmdlZC5lcXVhbHMoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKSkgewotICAgICAgICAgICAgLy8gVW5jb29sOyB0aGUgcGF0Y2ggc2V0IGNoYW5nZWQgYWZ0ZXIgd2UgbWVyZ2VkIGl0LgotICAgICAgICAgICAgLy8gR28gYmFjayB0byB0aGUgcGF0Y2ggc2V0IHRoYXQgd2FzIGFjdHVhbGx5IG1lcmdlZC4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBjLnNldEN1cnJlbnRQYXRjaFNldChwYXRjaFNldEluZm9GYWN0b3J5LmdldChkYiwgbWVyZ2VkKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChQYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcmVhZCBtZXJnZWQgcGF0Y2ggc2V0ICIgKyBtZXJnZWQsIGUxKTsKLSAgICAgICAgICAgIH0KKyAgcHJpdmF0ZSB2b2lkIHNldE1lcmdlZFBhdGNoU2V0KENoYW5nZS5JZCBjaGFuZ2VJZCwgZmluYWwgUGF0Y2hTZXQuSWQgbWVyZ2VkKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2VJZCwgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgYykgeworICAgICAgICBjLnNldFN0YXR1cyhDaGFuZ2UuU3RhdHVzLk1FUkdFRCk7CisgICAgICAgIC8vIEl0IGNvdWxkIGJlIHBvc3NpYmxlIHRoYXQgdGhlIGNoYW5nZSBiZWluZyBtZXJnZWQKKyAgICAgICAgLy8gaGFzIG5ldmVyIGhhZCBpdHMgbWVyZ2VhYmlsaXR5IHRlc3RlZC4gU28gd2UgaW5zdXJlCisgICAgICAgIC8vIG1lcmdlZCBjaGFuZ2VzIGhhcyBtZXJnZWFibGUgZmllbGQgdHJ1ZS4KKyAgICAgICAgYy5zZXRNZXJnZWFibGUodHJ1ZSk7CisgICAgICAgIGlmICghbWVyZ2VkLmVxdWFscyhjLmN1cnJlbnRQYXRjaFNldElkKCkpKSB7CisgICAgICAgICAgLy8gVW5jb29sOyB0aGUgcGF0Y2ggc2V0IGNoYW5nZWQgYWZ0ZXIgd2UgbWVyZ2VkIGl0LgorICAgICAgICAgIC8vIEdvIGJhY2sgdG8gdGhlIHBhdGNoIHNldCB0aGF0IHdhcyBhY3R1YWxseSBtZXJnZWQuCisgICAgICAgICAgLy8KKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYy5zZXRDdXJyZW50UGF0Y2hTZXQocGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQoZGIsIG1lcmdlZCkpOworICAgICAgICAgIH0gY2F0Y2ggKFBhdGNoU2V0SW5mb05vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlMSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcmVhZCBtZXJnZWQgcGF0Y2ggc2V0ICIgKyBtZXJnZWQsIGUxKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgQ2hhbmdlVXRpbC51cGRhdGVkKGMpOwotICAgICAgICAgIHJldHVybiBjOwogICAgICAgICB9Ci0gICAgICB9KTsKLSAgICB9IGNhdGNoIChPcm1Db25jdXJyZW5jeUV4Y2VwdGlvbiBlcnIpIHsKLSAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7Ci0gICAgICBsb2cud2FybigiQ2Fubm90IHVwZGF0ZSBjaGFuZ2Ugc3RhdHVzIiwgZXJyKTsKLSAgICB9CisgICAgICAgIENoYW5nZVV0aWwudXBkYXRlZChjKTsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgICB9CisgICAgfSk7CisgIH0KIAotICAgIC8vIEZsYXR0ZW4gb3V0IGFsbCBleGlzdGluZyBhcHByb3ZhbHMgYmFzZWQgdXBvbiB0aGUgY3VycmVudAotICAgIC8vIHBlcm1pc3Npb25zLiBPbmNlIHRoZSBjaGFuZ2UgaXMgY2xvc2VkIHRoZSBhcHByb3ZhbHMgYXJlCi0gICAgLy8gbm90IHVwZGF0ZWQgYXQgcHJlc2VudGF0aW9uIHZpZXcgdGltZSwgc28gd2UgbmVlZCB0byBtYWtlLgotICAgIC8vIHN1cmUgdGhleSBhcmUgYWNjdXJhdGUgbm93LiBUaGlzIHdheSBpZiBwZXJtaXNzaW9ucyBnZXQKLSAgICAvLyBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLCBoaXN0b3JpY2FsIHJlY29yZHMgc3RheSBhY2N1cmF0ZS4KLSAgICAvLworICBwcml2YXRlIFBhdGNoU2V0QXBwcm92YWwgc2F2ZUFwcHJvdmFscyhDaGFuZ2UgYywgUGF0Y2hTZXQuSWQgbWVyZ2VkKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgLy8gRmxhdHRlbiBvdXQgZXhpc3RpbmcgYXBwcm92YWxzIGZvciB0aGlzIHBhdGNoIHNldCBiYXNlZCB1cG9uIHRoZSBjdXJyZW50CisgICAgLy8gcGVybWlzc2lvbnMuIE9uY2UgdGhlIGNoYW5nZSBpcyBjbG9zZWQgdGhlIGFwcHJvdmFscyBhcmUgbm90IHVwZGF0ZWQgYXQKKyAgICAvLyBwcmVzZW50YXRpb24gdmlldyB0aW1lLCBleGNlcHQgZm9yIHplcm8gdm90ZXMgdXNlZCB0byBpbmRpY2F0ZSBhIHJldmlld2VyCisgICAgLy8gd2FzIGFkZGVkLiBTbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB2b3RlcyBhcmUgYWNjdXJhdGUgbm93LiBUaGlzIHdheSBpZgorICAgIC8vIHBlcm1pc3Npb25zIGdldCBtb2RpZmllZCBpbiB0aGUgZnV0dXJlLCBoaXN0b3JpY2FsIHJlY29yZHMgc3RheSBhY2N1cmF0ZS4KICAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlciA9IG51bGw7CiAgICAgdHJ5IHsKICAgICAgIGMuc2V0U3RhdHVzKENoYW5nZS5TdGF0dXMuTUVSR0VEKTsKLSAgICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzID0KLSAgICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKGNoYW5nZUlkKS50b0xpc3QoKTsKLSAgICAgIGZpbmFsIEZ1bmN0aW9uU3RhdGUgZnMgPSBmdW5jdGlvblN0YXRlLmNyZWF0ZSgKLSAgICAgICAgICBjaGFuZ2VDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKAotICAgICAgICAgICAgICBjLAotICAgICAgICAgICAgICBpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGMuZ2V0T3duZXIoKSkpLAotICAgICAgICAgICAgICBtZXJnZWQsIGFwcHJvdmFscyk7Ci0gICAgICBmb3IgKEFwcHJvdmFsVHlwZSBhdCA6IGFwcHJvdmFsVHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpKSB7Ci0gICAgICAgIENhdGVnb3J5RnVuY3Rpb24uZm9yQ2F0ZWdvcnkoYXQuZ2V0Q2F0ZWdvcnkoKSkucnVuKGF0LCBmcyk7Ci0gICAgICB9CisKKyAgICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzID0KKyAgICAgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQobWVyZ2VkKS50b0xpc3QoKTsKKyAgICAgIFNldDxQYXRjaFNldEFwcHJvdmFsLktleT4gdG9EZWxldGUgPQorICAgICAgICAgIFNldHMubmV3SGFzaFNldFdpdGhFeHBlY3RlZFNpemUoYXBwcm92YWxzLnNpemUoKSk7CiAgICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgYSA6IGFwcHJvdmFscykgewotICAgICAgICBpZiAoYS5nZXRWYWx1ZSgpID4gMAotICAgICAgICAgICAgJiYgQXBwcm92YWxDYXRlZ29yeS5TVUJNSVQuZXF1YWxzKGEuZ2V0Q2F0ZWdvcnlJZCgpKQotICAgICAgICAgICAgJiYgYS5nZXRQYXRjaFNldElkKCkuZXF1YWxzKG1lcmdlZCkpIHsKKyAgICAgICAgaWYgKGEuZ2V0VmFsdWUoKSAhPSAwKSB7CisgICAgICAgICAgdG9EZWxldGUuYWRkKGEuZ2V0S2V5KCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFwcHJvdmFscyA9IGxhYmVsTm9ybWFsaXplci5ub3JtYWxpemUoYywgYXBwcm92YWxzKTsKKyAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxzKSB7CisgICAgICAgIHRvRGVsZXRlLnJlbW92ZShhLmdldEtleSgpKTsKKyAgICAgICAgaWYgKGEuZ2V0VmFsdWUoKSA+IDAgJiYgYS5pc1N1Ym1pdCgpKSB7CiAgICAgICAgICAgaWYgKHN1Ym1pdHRlciA9PSBudWxsCiAgICAgICAgICAgICAgIHx8IGEuZ2V0R3JhbnRlZCgpLmNvbXBhcmVUbyhzdWJtaXR0ZXIuZ2V0R3JhbnRlZCgpKSA+IDApIHsKICAgICAgICAgICAgIHN1Ym1pdHRlciA9IGE7CkBAIC0xNDgzLDI0ICs5NjQsMjQgQEAKICAgICAgICAgYS5jYWNoZShjKTsKICAgICAgIH0KICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkudXBkYXRlKGFwcHJvdmFscyk7CisgICAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmRlbGV0ZUtleXModG9EZWxldGUpOwogICAgIH0gY2F0Y2ggKE5vU3VjaENoYW5nZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIGxvZy53YXJuKCJDYW5ub3Qgbm9ybWFsaXplIGFwcHJvdmFscyBmb3IgY2hhbmdlICIgKyBjaGFuZ2VJZCwgZXJyKTsKLSAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7Ci0gICAgICBsb2cud2FybigiQ2Fubm90IG5vcm1hbGl6ZSBhcHByb3ZhbHMgZm9yIGNoYW5nZSAiICsgY2hhbmdlSWQsIGVycik7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGVycik7CiAgICAgfQorICAgIHJldHVybiBzdWJtaXR0ZXI7CisgIH0KIAorICBwcml2YXRlIHZvaWQgYWRkTWVyZ2VkTWVzc2FnZShQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdHRlciwgQ2hhbmdlTWVzc2FnZSBtc2cpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICBpZiAobXNnICE9IG51bGwpIHsKICAgICAgIGlmIChzdWJtaXR0ZXIgIT0gbnVsbCAmJiBtc2cuZ2V0QXV0aG9yKCkgPT0gbnVsbCkgewogICAgICAgICBtc2cuc2V0QXV0aG9yKHN1Ym1pdHRlci5nZXRBY2NvdW50SWQoKSk7CiAgICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBkYi5jaGFuZ2VNZXNzYWdlcygpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24obXNnKSk7Ci0gICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgIGxvZy53YXJuKCJDYW5ub3Qgc3RvcmUgbWVzc2FnZSBvbiBjaGFuZ2UiLCBlcnIpOwotICAgICAgfQorICAgICAgZGIuY2hhbmdlTWVzc2FnZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1zZykpOwogICAgIH0KKyAgfQogCi0gICAgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBmcm9tID0gc3VibWl0dGVyOworICBwcml2YXRlIHZvaWQgc2VuZE1lcmdlZEVtYWlsKGZpbmFsIENoYW5nZSBjLCBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGZyb20pIHsKICAgICB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkKICAgICAgICAgLnN1Ym1pdChyZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLndyYXAobmV3IFJ1bm5hYmxlKCkgewogICAgICAgQE92ZXJyaWRlCkBAIC0xNTE5LDcgKzEwMDAsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmaW5hbCBNZXJnZWRTZW5kZXIgY20gPSBtZXJnZWRTZW5kZXJGYWN0b3J5LmNyZWF0ZShjKTsKKyAgICAgICAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGMsCisgICAgICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoYy5nZXRPd25lcigpKSk7CisgICAgICAgICAgZmluYWwgTWVyZ2VkU2VuZGVyIGNtID0gbWVyZ2VkU2VuZGVyRmFjdG9yeS5jcmVhdGUoY29udHJvbCk7CiAgICAgICAgICAgaWYgKGZyb20gIT0gbnVsbCkgewogICAgICAgICAgICAgY20uc2V0RnJvbShmcm9tLmdldEFjY291bnRJZCgpKTsKICAgICAgICAgICB9CkBAIC0xNTM1LDIzICsxMDE4LDM3IEBACiAgICAgICAgIHJldHVybiAic2VuZC1lbWFpbCBtZXJnZWQiOwogICAgICAgfQogICAgIH0pKTsKLQotCi0gICAgdHJ5IHsKLSAgICAgIGhvb2tzLmRvQ2hhbmdlTWVyZ2VkSG9vayhjLCAvLwotICAgICAgICAgIGFjY291bnRDYWNoZS5nZXQoc3VibWl0dGVyLmdldEFjY291bnRJZCgpKS5nZXRBY2NvdW50KCksIC8vCi0gICAgICAgICAgZGIucGF0Y2hTZXRzKCkuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSksIGRiKTsKLSAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXgpIHsKLSAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHJ1biBob29rIGZvciBzdWJtaXR0ZWQgcGF0Y2ggc2V0ICIgKyBjLmdldElkKCksIGV4KTsKLSAgICB9CiAgIH0KIAogICBwcml2YXRlIHZvaWQgc2V0TmV3KENoYW5nZSBjLCBDaGFuZ2VNZXNzYWdlIG1zZykgewogICAgIHNlbmRNZXJnZUZhaWwoYywgbXNnLCB0cnVlKTsKICAgfQogCisgIHByaXZhdGUgYm9vbGVhbiBpc0R1cGxpY2F0ZShDaGFuZ2VNZXNzYWdlIG1zZykgeworICAgIHRyeSB7CisgICAgICBDaGFuZ2VNZXNzYWdlIGxhc3QgPSBJdGVyYWJsZXMuZ2V0TGFzdChkYi5jaGFuZ2VNZXNzYWdlcygpLmJ5Q2hhbmdlKAorICAgICAgICAgIG1zZy5nZXRQYXRjaFNldElkKCkuZ2V0UGFyZW50S2V5KCkpLCBudWxsKTsKKyAgICAgIGlmIChsYXN0ICE9IG51bGwpIHsKKyAgICAgICAgbG9uZyBsYXN0TXMgPSBsYXN0LmdldFdyaXR0ZW5PbigpLmdldFRpbWUoKTsKKyAgICAgICAgbG9uZyBtc2dNcyA9IG1zZy5nZXRXcml0dGVuT24oKS5nZXRUaW1lKCk7CisgICAgICAgIGlmIChPYmplY3RzLmVxdWFsKGxhc3QuZ2V0QXV0aG9yKCksIG1zZy5nZXRBdXRob3IoKSkKKyAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWwobGFzdC5nZXRNZXNzYWdlKCksIG1zZy5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAmJiBtc2dNcyAtIGxhc3RNcyA8IERVUExJQ0FURV9NRVNTQUdFX0lOVEVSVkFMKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CisgICAgICBsb2cud2FybigiQ2Fubm90IGNoZWNrIHByZXZpb3VzIG1lcmdlIGZhaWx1cmUgbWVzc2FnZSIsIGVycik7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCBzZW5kTWVyZ2VGYWlsKGZpbmFsIENoYW5nZSBjLCBmaW5hbCBDaGFuZ2VNZXNzYWdlIG1zZywKICAgICAgIGZpbmFsIGJvb2xlYW4gbWFrZU5ldykgeworICAgIGlmIChpc0R1cGxpY2F0ZShtc2cpKSB7CisgICAgICByZXR1cm47CisgICAgfQorCiAgICAgdHJ5IHsKICAgICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtc2cpKTsKICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CkBAIC0xNTgyLDE3ICsxMDc5LDIzIEBACiAgICAgICB9CiAgICAgfQogCisgICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXIgPSBudWxsOworICAgIHRyeSB7CisgICAgICBzdWJtaXR0ZXIgPSBnZXRTdWJtaXR0ZXIoZGIsIGMuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGdldCBzdWJtaXR0ZXIiLCBlKTsKKyAgICB9CisKKyAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGZyb20gPSBzdWJtaXR0ZXI7CiAgICAgd29ya1F1ZXVlLmdldERlZmF1bHRRdWV1ZSgpCiAgICAgICAgIC5zdWJtaXQocmVxdWVzdFNjb3BlUHJvcGFnYXRvci53cmFwKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICBQYXRjaFNldCBwYXRjaFNldDsKLSAgICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXI7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgUmV2aWV3RGIgcmV2aWV3RGIgPSBzY2hlbWFGYWN0b3J5Lm9wZW4oKTsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgcGF0Y2hTZXQgPSByZXZpZXdEYi5wYXRjaFNldHMoKS5nZXQoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgICAgIHN1Ym1pdHRlciA9IGdldFN1Ym1pdHRlcihyZXZpZXdEYiwgYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgcmV2aWV3RGIuY2xvc2UoKTsKICAgICAgICAgICB9CkBAIC0xNjAzLDggKzExMDYsOCBAQAogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgZmluYWwgTWVyZ2VGYWlsU2VuZGVyIGNtID0gbWVyZ2VGYWlsU2VuZGVyRmFjdG9yeS5jcmVhdGUoYyk7Ci0gICAgICAgICAgaWYgKHN1Ym1pdHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbS5zZXRGcm9tKHN1Ym1pdHRlci5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgICAgaWYgKGZyb20gIT0gbnVsbCkgeworICAgICAgICAgICAgY20uc2V0RnJvbShmcm9tLmdldEFjY291bnRJZCgpKTsKICAgICAgICAgICB9CiAgICAgICAgICAgY20uc2V0UGF0Y2hTZXQocGF0Y2hTZXQpOwogICAgICAgICAgIGNtLnNldENoYW5nZU1lc3NhZ2UobXNnKTsKQEAgLTE2MTksNSArMTEyMiwxNSBAQAogICAgICAgICByZXR1cm4gInNlbmQtZW1haWwgbWVyZ2UtZmFpbGVkIjsKICAgICAgIH0KICAgICB9KSk7CisKKyAgICBpZiAoc3VibWl0dGVyICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGhvb2tzLmRvTWVyZ2VGYWlsZWRIb29rKGMsCisgICAgICAgICAgICBhY2NvdW50Q2FjaGUuZ2V0KHN1Ym1pdHRlci5nZXRBY2NvdW50SWQoKSkuZ2V0QWNjb3VudCgpLAorICAgICAgICAgICAgZGIucGF0Y2hTZXRzKCkuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSksIG1zZy5nZXRNZXNzYWdlKCksIGRiKTsKKyAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBleCkgeworICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBydW4gaG9vayBmb3IgbWVyZ2UgZmFpbGVkICIgKyBjLmdldElkKCksIGV4KTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlUXVldWUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlUXVldWUuamF2YQppbmRleCAxMDcxNzY4Li5hNTNiMDRjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVF1ZXVlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VRdWV1ZS5qYXZhCkBAIC0xOSw5ICsxOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIHB1YmxpYyBpbnRlcmZhY2UgTWVyZ2VRdWV1ZSB7Ci0gIHZvaWQgbWVyZ2UoTWVyZ2VPcC5GYWN0b3J5IG1vZiwgQnJhbmNoLk5hbWVLZXkgYnJhbmNoKTsKLQorICB2b2lkIG1lcmdlKEJyYW5jaC5OYW1lS2V5IGJyYW5jaCk7CiAgIHZvaWQgc2NoZWR1bGUoQnJhbmNoLk5hbWVLZXkgYnJhbmNoKTsKLQogICB2b2lkIHJlY2hlY2tBZnRlcihCcmFuY2guTmFtZUtleSBicmFuY2gsIGxvbmcgZGVsYXksIFRpbWVVbml0IGRlbGF5VW5pdCk7CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVNvcnRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VTb3J0ZXIuamF2YQppbmRleCBmZTg3NDgwLi4zOTExZDk2IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVNvcnRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01lcmdlU29ydGVyLmphdmEKQEAgLTI4LDE0ICsyOCwxNCBAQAogCiBjbGFzcyBNZXJnZVNvcnRlciB7CiAgIHByaXZhdGUgZmluYWwgUmV2V2FsayBydzsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZGbGFnIENBTl9NRVJHRTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZzsKICAgcHJpdmF0ZSBmaW5hbCBTZXQ8UmV2Q29tbWl0PiBhY2NlcHRlZDsKIAotICBNZXJnZVNvcnRlcihmaW5hbCBSZXZXYWxrIHdhbGssIGZpbmFsIFNldDxSZXZDb21taXQ+IGFscmVhZHlBY2NlcHRlZCwKLSAgICAgIGZpbmFsIFJldkZsYWcgZmxhZ0NBTl9NRVJHRSkgewotICAgIHJ3ID0gd2FsazsKLSAgICBDQU5fTUVSR0UgPSBmbGFnQ0FOX01FUkdFOwotICAgIGFjY2VwdGVkID0gYWxyZWFkeUFjY2VwdGVkOworICBNZXJnZVNvcnRlcihmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBTZXQ8UmV2Q29tbWl0PiBhbHJlYWR5QWNjZXB0ZWQsCisgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZykgeworICAgIHRoaXMucncgPSBydzsKKyAgICB0aGlzLmNhbk1lcmdlRmxhZyA9IGNhbk1lcmdlRmxhZzsKKyAgICB0aGlzLmFjY2VwdGVkID0gYWxyZWFkeUFjY2VwdGVkOwogICB9CiAKICAgQ29sbGVjdGlvbjxDb2RlUmV2aWV3Q29tbWl0PiBzb3J0KGZpbmFsIENvbGxlY3Rpb248Q29kZVJldmlld0NvbW1pdD4gaW5jb21pbmcpCkBAIC00NSw3ICs0NSw3IEBACiAgICAgd2hpbGUgKCFzb3J0LmlzRW1wdHkoKSkgewogICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gcmVtb3ZlT25lKHNvcnQpOwogCi0gICAgICBydy5yZXNldFJldGFpbihDQU5fTUVSR0UpOworICAgICAgcncucmVzZXRSZXRhaW4oY2FuTWVyZ2VGbGFnKTsKICAgICAgIHJ3Lm1hcmtTdGFydChuKTsKICAgICAgIGZvciAoUmV2Q29tbWl0IGMgOiBhY2NlcHRlZCkgewogICAgICAgICBydy5tYXJrVW5pbnRlcmVzdGluZyhjKTsKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgIFJldkNvbW1pdCBjOwogICAgICAgZmluYWwgUmV2Q29tbWl0TGlzdDxSZXZDb21taXQ+IGNvbnRlbnRzID0gbmV3IFJldkNvbW1pdExpc3Q8UmV2Q29tbWl0PigpOwogICAgICAgd2hpbGUgKChjID0gcncubmV4dCgpKSAhPSBudWxsKSB7Ci0gICAgICAgIGlmICghYy5oYXMoQ0FOX01FUkdFKSkgeworICAgICAgICBpZiAoIWMuaGFzKGNhbk1lcmdlRmxhZykgfHwgIWluY29taW5nLmNvbnRhaW5zKGMpKSB7CiAgICAgICAgICAgLy8gV2UgY2Fubm90IG1lcmdlIG4gYXMgaXQgd291bGQgYnJpbmcgc29tZXRoaW5nIHdlCiAgICAgICAgICAgLy8gYXJlbid0IHBlcm1pdHRlZCB0byBtZXJnZSBhdCB0aGlzIHRpbWUuIERyb3Agbi4KICAgICAgICAgICAvLwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VVdGlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXJnZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJlYjJiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWVyZ2VVdGlsLmphdmEKQEAgLTAsMCArMSw3MTMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsLkxhYmVsSWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0U3RhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZEluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob01lcmdlQmFzZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob01lcmdlQmFzZUV4Y2VwdGlvbi5NZXJnZUJhc2VGYWlsdXJlUmVhc29uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkFueU9iamVjdElkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbW1pdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5NdXRhYmxlT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SW5zZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlLk1lcmdlU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5UaHJlZVdheU1lcmdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9vdGVyS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJMaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkZsYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldlNvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUGFja1BhcnNlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5UaW1lc3RhbXA7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworcHVibGljIGNsYXNzIE1lcmdlVXRpbCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihNZXJnZVV0aWwuY2xhc3MpOworCisgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZhY3RvcnkgeworICAgIE1lcmdlVXRpbCBjcmVhdGUoUHJvamVjdFN0YXRlIHByb2plY3QpOworICAgIE1lcmdlVXRpbCBjcmVhdGUoUHJvamVjdFN0YXRlIHByb2plY3QsIGJvb2xlYW4gdXNlQ29udGVudE1lcmdlKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSX0hFQURTX01BU1RFUiA9CisgICAgICBDb25zdGFudHMuUl9IRUFEUyArIENvbnN0YW50cy5NQVNURVI7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IFJFVklFV0VEX09OID0gbmV3IEZvb3RlcktleSgiUmV2aWV3ZWQtb24iKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IENIQU5HRV9JRCA9IG5ldyBGb290ZXJLZXkoIkNoYW5nZS1JZCIpOworCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIFByb2plY3RTdGF0ZSBwcm9qZWN0OworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlQ29udGVudE1lcmdlOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlUmVjdXJzaXZlTWVyZ2U7CisKKyAgQEFzc2lzdGVkSW5qZWN0CisgIE1lcmdlVXRpbChAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBzZXJ2ZXJDb25maWcsCisgICAgICBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGIsCisgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3RvcnksCisgICAgICBAQ2Fub25pY2FsV2ViVXJsIEBOdWxsYWJsZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyLAorICAgICAgQEFzc2lzdGVkIGZpbmFsIFByb2plY3RTdGF0ZSBwcm9qZWN0KSB7CisgICAgdGhpcyhzZXJ2ZXJDb25maWcsIGRiLCBpZGVudGlmaWVkVXNlckZhY3RvcnksIHVybFByb3ZpZGVyLCBwcm9qZWN0LAorICAgICAgICBwcm9qZWN0LmlzVXNlQ29udGVudE1lcmdlKCkpOworICB9CisKKyAgQEFzc2lzdGVkSW5qZWN0CisgIE1lcmdlVXRpbChAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBzZXJ2ZXJDb25maWcsCisgICAgICBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGIsCisgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3RvcnksCisgICAgICBAQ2Fub25pY2FsV2ViVXJsIEBOdWxsYWJsZSBmaW5hbCBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyLAorICAgICAgQEFzc2lzdGVkIGZpbmFsIFByb2plY3RTdGF0ZSBwcm9qZWN0LAorICAgICAgQEFzc2lzdGVkIGJvb2xlYW4gdXNlQ29udGVudE1lcmdlKSB7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuaWRlbnRpZmllZFVzZXJGYWN0b3J5ID0gaWRlbnRpZmllZFVzZXJGYWN0b3J5OworICAgIHRoaXMudXJsUHJvdmlkZXIgPSB1cmxQcm92aWRlcjsKKyAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OworICAgIHRoaXMudXNlQ29udGVudE1lcmdlID0gdXNlQ29udGVudE1lcmdlOworICAgIHRoaXMudXNlUmVjdXJzaXZlTWVyZ2UgPQorICAgICAgICBzZXJ2ZXJDb25maWcuZ2V0Qm9vbGVhbigiY29yZSIsIG51bGwsICJ1c2VSZWN1cnNpdmVNZXJnZSIsIGZhbHNlKTsKKyAgfQorCisgIHB1YmxpYyBDb2RlUmV2aWV3Q29tbWl0IGdldEZpcnN0RmFzdEZvcndhcmQoCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLCBmaW5hbCBSZXZXYWxrIHJ3LAorICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q29kZVJldmlld0NvbW1pdD4gaSA9IHRvTWVyZ2UuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7CisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4gPSBpLm5leHQoKTsKKyAgICAgICAgaWYgKG1lcmdlVGlwID09IG51bGwgfHwgcncuaXNNZXJnZWRJbnRvKG1lcmdlVGlwLCBuKSkgeworICAgICAgICAgIGkucmVtb3ZlKCk7CisgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgZmFzdC1mb3J3YXJkIHRlc3QgZHVyaW5nIG1lcmdlIiwgZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBtZXJnZVRpcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlZHVjZVRvTWluaW1hbE1lcmdlKGZpbmFsIE1lcmdlU29ydGVyIG1lcmdlU29ydGVyLAorICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b1NvcnQpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ29sbGVjdGlvbjxDb2RlUmV2aWV3Q29tbWl0PiBoZWFkczsKKyAgICB0cnkgeworICAgICAgaGVhZHMgPSBtZXJnZVNvcnRlci5zb3J0KHRvU29ydCk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJCcmFuY2ggaGVhZCBzb3J0aW5nIGZhaWxlZCIsIGUpOworICAgIH0KKworICAgIHRvU29ydC5jbGVhcigpOworICAgIHRvU29ydC5hZGRBbGwoaGVhZHMpOworICAgIENvbGxlY3Rpb25zLnNvcnQodG9Tb3J0LCBuZXcgQ29tcGFyYXRvcjxDb2RlUmV2aWV3Q29tbWl0PigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIENvZGVSZXZpZXdDb21taXQgYSwgZmluYWwgQ29kZVJldmlld0NvbW1pdCBiKSB7CisgICAgICAgIHJldHVybiBhLm9yaWdpbmFsT3JkZXIgLSBiLm9yaWdpbmFsT3JkZXI7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgUGF0Y2hTZXRBcHByb3ZhbCBnZXRTdWJtaXR0ZXIoZmluYWwgUGF0Y2hTZXQuSWQgYykgeworICAgIHJldHVybiBnZXRTdWJtaXR0ZXIoZGIuZ2V0KCksIGMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBQYXRjaFNldEFwcHJvdmFsIGdldFN1Ym1pdHRlcihmaW5hbCBSZXZpZXdEYiByZXZpZXdEYiwKKyAgICAgIGZpbmFsIFBhdGNoU2V0LklkIGMpIHsKKyAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXR0ZXIgPSBudWxsOworICAgIHRyeSB7CisgICAgICBmaW5hbCBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscyA9CisgICAgICAgICAgcmV2aWV3RGIucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieVBhdGNoU2V0KGMpLnRvTGlzdCgpOworICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhcHByb3ZhbHMpIHsKKyAgICAgICAgaWYgKGEuZ2V0VmFsdWUoKSA+IDAgJiYgYS5pc1N1Ym1pdCgpKSB7CisgICAgICAgICAgaWYgKHN1Ym1pdHRlciA9PSBudWxsCisgICAgICAgICAgICAgIHx8IGEuZ2V0R3JhbnRlZCgpLmNvbXBhcmVUbyhzdWJtaXR0ZXIuZ2V0R3JhbnRlZCgpKSA+IDApIHsKKyAgICAgICAgICAgIHN1Ym1pdHRlciA9IGE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKKyAgICB9CisgICAgcmV0dXJuIHN1Ym1pdHRlcjsKKyAgfQorCisgIHB1YmxpYyBDb2RlUmV2aWV3Q29tbWl0IGNyZWF0ZUNoZXJyeVBpY2tGcm9tQ29tbWl0KFJlcG9zaXRvcnkgcmVwbywKKyAgICAgIE9iamVjdEluc2VydGVyIGluc2VydGVyLCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLCBDb2RlUmV2aWV3Q29tbWl0IG9yaWdpbmFsQ29tbWl0LAorICAgICAgUGVyc29uSWRlbnQgY2hlcnJ5UGlja0NvbW1pdHRlcklkZW50LCBTdHJpbmcgY29tbWl0TXNnLCBSZXZXYWxrIHJ3KQorICAgICAgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgIGZpbmFsIFRocmVlV2F5TWVyZ2VyIG0gPSBuZXdUaHJlZVdheU1lcmdlcihyZXBvLCBpbnNlcnRlcik7CisKKyAgICBtLnNldEJhc2Uob3JpZ2luYWxDb21taXQuZ2V0UGFyZW50KDApKTsKKyAgICBpZiAobS5tZXJnZShtZXJnZVRpcCwgb3JpZ2luYWxDb21taXQpKSB7CisKKyAgICAgIGZpbmFsIENvbW1pdEJ1aWxkZXIgbWVyZ2VDb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOworCisgICAgICBtZXJnZUNvbW1pdC5zZXRUcmVlSWQobS5nZXRSZXN1bHRUcmVlSWQoKSk7CisgICAgICBtZXJnZUNvbW1pdC5zZXRQYXJlbnRJZChtZXJnZVRpcCk7CisgICAgICBtZXJnZUNvbW1pdC5zZXRBdXRob3Iob3JpZ2luYWxDb21taXQuZ2V0QXV0aG9ySWRlbnQoKSk7CisgICAgICBtZXJnZUNvbW1pdC5zZXRDb21taXR0ZXIoY2hlcnJ5UGlja0NvbW1pdHRlcklkZW50KTsKKyAgICAgIG1lcmdlQ29tbWl0LnNldE1lc3NhZ2UoY29tbWl0TXNnKTsKKworICAgICAgZmluYWwgT2JqZWN0SWQgaWQgPSBjb21taXQoaW5zZXJ0ZXIsIG1lcmdlQ29tbWl0KTsKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbmV3Q29tbWl0ID0KKyAgICAgICAgICAoQ29kZVJldmlld0NvbW1pdCkgcncucGFyc2VDb21taXQoaWQpOworCisgICAgICByZXR1cm4gbmV3Q29tbWl0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUNoZXJyeVBpY2tDb21taXRNZXNzYWdlKGZpbmFsIENvZGVSZXZpZXdDb21taXQgbikgeworICAgIGZpbmFsIExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVycyA9IG4uZ2V0Rm9vdGVyTGluZXMoKTsKKyAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ2J1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgbXNnYnVmLmFwcGVuZChuLmdldEZ1bGxNZXNzYWdlKCkpOworCisgICAgaWYgKG1zZ2J1Zi5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAvLyBXVEYsIGFuIGVtcHR5IGNvbW1pdCBtZXNzYWdlPworICAgICAgbXNnYnVmLmFwcGVuZCgiPG5vIGNvbW1pdCBtZXNzYWdlIHByb3ZpZGVkPiIpOworICAgIH0KKyAgICBpZiAobXNnYnVmLmNoYXJBdChtc2didWYubGVuZ3RoKCkgLSAxKSAhPSAnXG4nKSB7CisgICAgICAvLyBNaXNzaW5nIGEgdHJhaWxpbmcgTEY/IENvcnJlY3QgaXQgKHBlcmhhcHMgdGhlIGVkaXRvciB3YXMgYnJva2VuKS4KKyAgICAgIG1zZ2J1Zi5hcHBlbmQoJ1xuJyk7CisgICAgfQorICAgIGlmIChmb290ZXJzLmlzRW1wdHkoKSkgeworICAgICAgLy8gRG9lc24ndCBlbmQgaW4gYSAiU2lnbmVkLW9mZi1ieTogLi4uIiBzdHlsZSBsaW5lPyBBZGQgYW5vdGhlciBsaW5lCisgICAgICAvLyBicmVhayB0byBzdGFydCBhIG5ldyBwYXJhZ3JhcGggZm9yIHRoZSByZXZpZXdlZC1ieSB0YWcgbGluZXMuCisgICAgICAvLworICAgICAgbXNnYnVmLmFwcGVuZCgnXG4nKTsKKyAgICB9CisKKyAgICBpZiAoIWNvbnRhaW5zKGZvb3RlcnMsIENIQU5HRV9JRCwgbi5jaGFuZ2UuZ2V0S2V5KCkuZ2V0KCkpKSB7CisgICAgICBtc2didWYuYXBwZW5kKENIQU5HRV9JRC5nZXROYW1lKCkpOworICAgICAgbXNnYnVmLmFwcGVuZCgiOiAiKTsKKyAgICAgIG1zZ2J1Zi5hcHBlbmQobi5jaGFuZ2UuZ2V0S2V5KCkuZ2V0KCkpOworICAgICAgbXNnYnVmLmFwcGVuZCgnXG4nKTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgc2l0ZVVybCA9IHVybFByb3ZpZGVyLmdldCgpOworICAgIGlmIChzaXRlVXJsICE9IG51bGwpIHsKKyAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSBzaXRlVXJsICsgbi5wYXRjaHNldElkLmdldFBhcmVudEtleSgpLmdldCgpOworICAgICAgaWYgKCFjb250YWlucyhmb290ZXJzLCBSRVZJRVdFRF9PTiwgdXJsKSkgeworICAgICAgICBtc2didWYuYXBwZW5kKFJFVklFV0VEX09OLmdldE5hbWUoKSk7CisgICAgICAgIG1zZ2J1Zi5hcHBlbmQoIjogIik7CisgICAgICAgIG1zZ2J1Zi5hcHBlbmQodXJsKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEF1ZGl0ID0gbnVsbDsKKworICAgIGZvciAoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhIDogZ2V0QXBwcm92YWxzRm9yQ29tbWl0KG4pKSB7CisgICAgICBpZiAoYS5nZXRWYWx1ZSgpIDw9IDApIHsKKyAgICAgICAgLy8gTmVnYXRpdmUgdm90ZXMgYXJlbid0IGNvdW50ZWQuCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBpZiAoYS5pc1N1Ym1pdCgpKSB7CisgICAgICAgIC8vIFN1Ym1pdCBpcyB0cmVhdGVkIHNwZWNpYWxseSwgYmVsb3cgKGJlY29tZXMgY29tbWl0dGVyKQorICAgICAgICAvLworICAgICAgICBpZiAoc3VibWl0QXVkaXQgPT0gbnVsbAorICAgICAgICAgICAgfHwgYS5nZXRHcmFudGVkKCkuY29tcGFyZVRvKHN1Ym1pdEF1ZGl0LmdldEdyYW50ZWQoKSkgPiAwKSB7CisgICAgICAgICAgc3VibWl0QXVkaXQgPSBhOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmaW5hbCBBY2NvdW50IGFjYyA9CisgICAgICAgICAgaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZShhLmdldEFjY291bnRJZCgpKS5nZXRBY2NvdW50KCk7CisgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGlkZW50YnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIGlmIChhY2MuZ2V0RnVsbE5hbWUoKSAhPSBudWxsICYmIGFjYy5nZXRGdWxsTmFtZSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoaWRlbnRidWYubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgaWRlbnRidWYuYXBwZW5kKCcgJyk7CisgICAgICAgIH0KKyAgICAgICAgaWRlbnRidWYuYXBwZW5kKGFjYy5nZXRGdWxsTmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChhY2MuZ2V0UHJlZmVycmVkRW1haWwoKSAhPSBudWxsCisgICAgICAgICAgJiYgYWNjLmdldFByZWZlcnJlZEVtYWlsKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmIChpc1NpZ25lZE9mZkJ5KGZvb3RlcnMsIGFjYy5nZXRQcmVmZXJyZWRFbWFpbCgpKSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpZGVudGJ1Zi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoJyAnKTsKKyAgICAgICAgfQorICAgICAgICBpZGVudGJ1Zi5hcHBlbmQoJzwnKTsKKyAgICAgICAgaWRlbnRidWYuYXBwZW5kKGFjYy5nZXRQcmVmZXJyZWRFbWFpbCgpKTsKKyAgICAgICAgaWRlbnRidWYuYXBwZW5kKCc+Jyk7CisgICAgICB9CisgICAgICBpZiAoaWRlbnRidWYubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAvLyBOb3RoaW5nIHJlYXNvbmFibGUgdG8gZGVzY3JpYmUgdGhlbSBieT8gSWdub3JlIHRoZW0uCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBmaW5hbCBTdHJpbmcgdGFnOworICAgICAgaWYgKGlzQ29kZVJldmlldyhhLmdldExhYmVsSWQoKSkpIHsKKyAgICAgICAgdGFnID0gIlJldmlld2VkLWJ5IjsKKyAgICAgIH0gZWxzZSBpZiAoaXNWZXJpZmllZChhLmdldExhYmVsSWQoKSkpIHsKKyAgICAgICAgdGFnID0gIlRlc3RlZC1ieSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaW5hbCBMYWJlbFR5cGUgbHQgPSBwcm9qZWN0LmdldExhYmVsVHlwZXMoKS5ieUxhYmVsKGEuZ2V0TGFiZWxJZCgpKTsKKyAgICAgICAgaWYgKGx0ID09IG51bGwpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB0YWcgPSBsdC5nZXROYW1lKCk7CisgICAgICB9CisKKyAgICAgIGlmICghY29udGFpbnMoZm9vdGVycywgbmV3IEZvb3RlcktleSh0YWcpLCBpZGVudGJ1Zi50b1N0cmluZygpKSkgeworICAgICAgICBtc2didWYuYXBwZW5kKHRhZyk7CisgICAgICAgIG1zZ2J1Zi5hcHBlbmQoIjogIik7CisgICAgICAgIG1zZ2J1Zi5hcHBlbmQoaWRlbnRidWYpOworICAgICAgICBtc2didWYuYXBwZW5kKCdcbicpOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtc2didWYudG9TdHJpbmcoKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb2RlUmV2aWV3KExhYmVsSWQgaWQpIHsKKyAgICByZXR1cm4gIkNvZGUtUmV2aWV3Ii5lcXVhbHNJZ25vcmVDYXNlKGlkLmdldCgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWZXJpZmllZChMYWJlbElkIGlkKSB7CisgICAgcmV0dXJuICJWZXJpZmllZCIuZXF1YWxzSWdub3JlQ2FzZShpZC5nZXQoKSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBnZXRBcHByb3ZhbHNGb3JDb21taXQoZmluYWwgQ29kZVJldmlld0NvbW1pdCBuKSB7CisgICAgdHJ5IHsKKyAgICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxMaXN0ID0KKyAgICAgICAgICBkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXQobi5wYXRjaHNldElkKS50b0xpc3QoKTsKKyAgICAgIENvbGxlY3Rpb25zLnNvcnQoYXBwcm92YWxMaXN0LCBuZXcgQ29tcGFyYXRvcjxQYXRjaFNldEFwcHJvdmFsPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGEsIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYikgeworICAgICAgICAgIHJldHVybiBhLmdldEdyYW50ZWQoKS5jb21wYXJlVG8oYi5nZXRHcmFudGVkKCkpOworICAgICAgICB9CisgICAgICB9KTsKKyAgICAgIHJldHVybiBhcHByb3ZhbExpc3Q7CisgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2FuJ3QgcmVhZCBhcHByb3ZhbCByZWNvcmRzIGZvciAiICsgbi5wYXRjaHNldElkLCBlKTsKKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVycywgRm9vdGVyS2V5IGtleSwgU3RyaW5nIHZhbCkgeworICAgIGZvciAoZmluYWwgRm9vdGVyTGluZSBsaW5lIDogZm9vdGVycykgeworICAgICAgaWYgKGxpbmUubWF0Y2hlcyhrZXkpICYmIHZhbC5lcXVhbHMobGluZS5nZXRWYWx1ZSgpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NpZ25lZE9mZkJ5KExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVycywgU3RyaW5nIGVtYWlsKSB7CisgICAgZm9yIChmaW5hbCBGb290ZXJMaW5lIGxpbmUgOiBmb290ZXJzKSB7CisgICAgICBpZiAobGluZS5tYXRjaGVzKEZvb3RlcktleS5TSUdORURfT0ZGX0JZKQorICAgICAgICAgICYmIGVtYWlsLmVxdWFscyhsaW5lLmdldEVtYWlsQWRkcmVzcygpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIFBlcnNvbklkZW50IGNvbXB1dGVNZXJnZUNvbW1pdEF1dGhvcihmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgZmluYWwgUmV2V2FsayBydywgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBjb2RlUmV2aWV3Q29tbWl0cykgeworICAgIFBhdGNoU2V0QXBwcm92YWwgc3VibWl0dGVyID0gbnVsbDsKKyAgICBmb3IgKGZpbmFsIENvZGVSZXZpZXdDb21taXQgYyA6IGNvZGVSZXZpZXdDb21taXRzKSB7CisgICAgICBQYXRjaFNldEFwcHJvdmFsIHMgPSBnZXRTdWJtaXR0ZXIoYy5wYXRjaHNldElkKTsKKyAgICAgIGlmIChzdWJtaXR0ZXIgPT0gbnVsbAorICAgICAgICAgIHx8IChzICE9IG51bGwgJiYgcy5nZXRHcmFudGVkKCkuY29tcGFyZVRvKHN1Ym1pdHRlci5nZXRHcmFudGVkKCkpID4gMCkpIHsKKyAgICAgICAgc3VibWl0dGVyID0gczsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUcnkgdG8gdXNlIHRoZSBzdWJtaXR0ZXIncyBpZGVudGl0eSBmb3IgdGhlIG1lcmdlIGNvbW1pdCBhdXRob3IuCisgICAgLy8gSWYgYWxsIG9mIHRoZSBjb21taXRzIGJlaW5nIG1lcmdlZCBhcmUgY3JlYXRlZCBieSB0aGUgc3VibWl0dGVyLAorICAgIC8vIHByZWZlciB0aGUgaWRlbnRpdHkgbGluZSB0aGV5IHVzZWQgaW4gdGhlIGNvbW1pdHMgcmF0aGVyIHRoYW4gdGhlCisgICAgLy8gcHJlZmVycmVkIGlkZW50aXR5IHN0b3JlZCBpbiB0aGUgdXNlciBhY2NvdW50LiBUaGlzIHdheSB0aGUgR2l0CisgICAgLy8gY29tbWl0IHJlY29yZHMgYXJlIG1vcmUgY29uc2lzdGVudCBpbnRlcm5hbGx5LgorICAgIC8vCisgICAgUGVyc29uSWRlbnQgYXV0aG9ySWRlbnQ7CisgICAgaWYgKHN1Ym1pdHRlciAhPSBudWxsKSB7CisgICAgICBJZGVudGlmaWVkVXNlciB3aG8gPQorICAgICAgICAgIGlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoc3VibWl0dGVyLmdldEFjY291bnRJZCgpKTsKKyAgICAgIFNldDxTdHJpbmc+IGVtYWlscyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgIGZvciAoUmV2Q29tbWl0IGMgOiBjb2RlUmV2aWV3Q29tbWl0cykgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJ3LnBhcnNlQm9keShjKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIGxvZy53YXJuKCJDYW5ub3QgcGFyc2UgY29tbWl0ICIgKyBjLm5hbWUoKSwgZSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZW1haWxzLmFkZChjLmdldEF1dGhvcklkZW50KCkuZ2V0RW1haWxBZGRyZXNzKCkpOworICAgICAgfQorCisgICAgICBmaW5hbCBUaW1lc3RhbXAgZHQgPSBzdWJtaXR0ZXIuZ2V0R3JhbnRlZCgpOworICAgICAgZmluYWwgVGltZVpvbmUgdHogPSBteUlkZW50LmdldFRpbWVab25lKCk7CisgICAgICBpZiAoZW1haWxzLnNpemUoKSA9PSAxCisgICAgICAgICAgJiYgd2hvLmdldEVtYWlsQWRkcmVzc2VzKCkuY29udGFpbnMoZW1haWxzLml0ZXJhdG9yKCkubmV4dCgpKSkgeworICAgICAgICBhdXRob3JJZGVudCA9CisgICAgICAgICAgICBuZXcgUGVyc29uSWRlbnQoY29kZVJldmlld0NvbW1pdHMuZ2V0KDApLmdldEF1dGhvcklkZW50KCksIGR0LCB0eik7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdXRob3JJZGVudCA9IHdoby5uZXdDb21taXR0ZXJJZGVudChkdCwgdHopOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhdXRob3JJZGVudCA9IG15SWRlbnQ7CisgICAgfQorICAgIHJldHVybiBhdXRob3JJZGVudDsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGNhbk1lcmdlKGZpbmFsIE1lcmdlU29ydGVyIG1lcmdlU29ydGVyLAorICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKQorICAgICAgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBpZiAoaGFzTWlzc2luZ0RlcGVuZGVuY2llcyhtZXJnZVNvcnRlciwgdG9NZXJnZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmaW5hbCBUaHJlZVdheU1lcmdlciBtID0gbmV3VGhyZWVXYXlNZXJnZXIocmVwbywgY3JlYXRlRHJ5UnVuSW5zZXJ0ZXIoKSk7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBtLm1lcmdlKG5ldyBBbnlPYmplY3RJZFtdIHttZXJnZVRpcCwgdG9NZXJnZX0pOworICAgIH0gY2F0Y2ggKE5vTWVyZ2VCYXNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBtZXJnZSAiICsgdG9NZXJnZS5uYW1lKCksIGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGNhbkZhc3RGb3J3YXJkKGZpbmFsIE1lcmdlU29ydGVyIG1lcmdlU29ydGVyLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwgZmluYWwgUmV2V2FsayBydywKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBpZiAoaGFzTWlzc2luZ0RlcGVuZGVuY2llcyhtZXJnZVNvcnRlciwgdG9NZXJnZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgcmV0dXJuIG1lcmdlVGlwID09IG51bGwgfHwgcncuaXNNZXJnZWRJbnRvKG1lcmdlVGlwLCB0b01lcmdlKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBmYXN0LWZvcndhcmQgdGVzdCBkdXJpbmcgbWVyZ2UiLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjYW5DaGVycnlQaWNrKGZpbmFsIE1lcmdlU29ydGVyIG1lcmdlU29ydGVyLAorICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLCBmaW5hbCBSZXZXYWxrIHJ3LAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIGlmIChtZXJnZVRpcCA9PSBudWxsKSB7CisgICAgICAvLyBUaGUgYnJhbmNoIGlzIHVuYm9ybi4gRmFzdC1mb3J3YXJkIGlzIHBvc3NpYmxlLgorICAgICAgLy8KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh0b01lcmdlLmdldFBhcmVudENvdW50KCkgPT0gMCkgeworICAgICAgLy8gUmVmdXNlIHRvIG1lcmdlIGEgcm9vdCBjb21taXQgaW50byBhbiBleGlzdGluZyBicmFuY2gsCisgICAgICAvLyB3ZSBjYW5ub3Qgb2J0YWluIGEgZGVsdGEgZm9yIHRoZSBjaGVycnktcGljayB0byBhcHBseS4KKyAgICAgIC8vCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRvTWVyZ2UuZ2V0UGFyZW50Q291bnQoKSA9PSAxKSB7CisgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJlbnQsIGEgY2hlcnJ5LXBpY2sgY2FuIGJlIGRvbmUgYnkKKyAgICAgIC8vIHRha2luZyB0aGUgZGVsdGEgcmVsYXRpdmUgdG8gdGhhdCBvbmUgcGFyZW50IGFuZCByZWRvaW5nCisgICAgICAvLyB0aGF0IG9uIHRoZSBjdXJyZW50IG1lcmdlIHRpcC4KKyAgICAgIC8vCisgICAgICB0cnkgeworICAgICAgICBmaW5hbCBUaHJlZVdheU1lcmdlciBtID0KKyAgICAgICAgICAgIG5ld1RocmVlV2F5TWVyZ2VyKHJlcG8sIGNyZWF0ZURyeVJ1bkluc2VydGVyKCkpOworICAgICAgICBtLnNldEJhc2UodG9NZXJnZS5nZXRQYXJlbnQoMCkpOworICAgICAgICByZXR1cm4gbS5tZXJnZShtZXJnZVRpcCwgdG9NZXJnZSk7CisgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1lcmdlICIgKyB0b01lcmdlLm5hbWUoKSwgZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIHBhcmVudHMsIHNvIHRoaXMgaXMgYSBtZXJnZSBjb21taXQuIFdlCisgICAgLy8gZG9uJ3Qgd2FudCB0byBjaGVycnktcGljayB0aGUgbWVyZ2UgYXMgY2xpZW50cyBjYW4ndCBlYXNpbHkKKyAgICAvLyByZWJhc2UgdGhlaXIgaGlzdG9yeSB3aXRoIHRoYXQgbWVyZ2UgcHJlc2VudCBhbmQgcmVwbGFjZWQKKyAgICAvLyBieSBhbiBlcXVpdmFsZW50IG1lcmdlIHdpdGggYSBkaWZmZXJlbnQgZmlyc3QgcGFyZW50LiBTbworICAgIC8vIGluc3RlYWQgYmVoYXZlIGFzIHRob3VnaCBNRVJHRV9JRl9ORUNFU1NBUlkgd2FzIGNvbmZpZ3VyZWQuCisgICAgLy8KKyAgICByZXR1cm4gY2FuRmFzdEZvcndhcmQobWVyZ2VTb3J0ZXIsIG1lcmdlVGlwLCBydywgdG9NZXJnZSkKKyAgICAgICAgfHwgY2FuTWVyZ2UobWVyZ2VTb3J0ZXIsIHJlcG8sIG1lcmdlVGlwLCB0b01lcmdlKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGhhc01pc3NpbmdEZXBlbmRlbmNpZXMoZmluYWwgTWVyZ2VTb3J0ZXIgbWVyZ2VTb3J0ZXIsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiAhbWVyZ2VTb3J0ZXIuc29ydChDb2xsZWN0aW9ucy5zaW5nbGV0b24odG9NZXJnZSkpLmNvbnRhaW5zKHRvTWVyZ2UpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQnJhbmNoIGhlYWQgc29ydGluZyBmYWlsZWQiLCBlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0SW5zZXJ0ZXIgY3JlYXRlRHJ5UnVuSW5zZXJ0ZXIoKSB7CisgICAgcmV0dXJuIG5ldyBPYmplY3RJbnNlcnRlcigpIHsKKyAgICAgIHByaXZhdGUgZmluYWwgTXV0YWJsZU9iamVjdElkIGJ1ZiA9IG5ldyBNdXRhYmxlT2JqZWN0SWQoKTsKKyAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBMQVNUX0JZVEUgPSBDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSCAtIDE7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIE9iamVjdElkIGluc2VydChpbnQgb2JqZWN0VHlwZSwgbG9uZyBsZW5ndGgsIElucHV0U3RyZWFtIGluKQorICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBub24tZXhpc3RpbmcgZHVtbXkgSUQKKyAgICAgICAgYnVmLnNldEJ5dGUoTEFTVF9CWVRFLCBidWYuZ2V0Qnl0ZShMQVNUX0JZVEUpICsgMSk7CisgICAgICAgIHJldHVybiBidWYuY29weSgpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBQYWNrUGFyc2VyIG5ld1BhY2tQYXJzZXIoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgfQorICAgIH07CisgIH0KKworICBwdWJsaWMgQ29kZVJldmlld0NvbW1pdCBtZXJnZU9uZUNvbW1pdChmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlciwKKyAgICAgIGZpbmFsIFJldkZsYWcgY2FuTWVyZ2VGbGFnLCBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuKQorICAgICAgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBUaHJlZVdheU1lcmdlciBtID0gbmV3VGhyZWVXYXlNZXJnZXIocmVwbywgaW5zZXJ0ZXIpOworICAgIHRyeSB7CisgICAgICBpZiAobS5tZXJnZShuZXcgQW55T2JqZWN0SWRbXSB7bWVyZ2VUaXAsIG59KSkgeworICAgICAgICByZXR1cm4gd3JpdGVNZXJnZUNvbW1pdChteUlkZW50LCBydywgaW5zZXJ0ZXIsIGNhbk1lcmdlRmxhZywgZGVzdEJyYW5jaCwKKyAgICAgICAgICAgIG1lcmdlVGlwLCBtLmdldFJlc3VsdFRyZWVJZCgpLCBuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZhaWxlZChydywgY2FuTWVyZ2VGbGFnLCBtZXJnZVRpcCwgbiwgQ29tbWl0TWVyZ2VTdGF0dXMuUEFUSF9DT05GTElDVCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoTm9NZXJnZUJhc2VFeGNlcHRpb24gZSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgZmFpbGVkKHJ3LCBjYW5NZXJnZUZsYWcsIG1lcmdlVGlwLCBuLAorICAgICAgICAgICAgZ2V0Q29tbWl0TWVyZ2VTdGF0dXMoZS5nZXRSZWFzb24oKSkpOworICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1lcmdlRXhjZXB0aW9uKCJDYW5ub3QgbWVyZ2UgIiArIG4ubmFtZSgpLCBlKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBtZXJnZSAiICsgbi5uYW1lKCksIGUpOworICAgIH0KKyAgICByZXR1cm4gbWVyZ2VUaXA7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBDb21taXRNZXJnZVN0YXR1cyBnZXRDb21taXRNZXJnZVN0YXR1cygKKyAgICAgIE1lcmdlQmFzZUZhaWx1cmVSZWFzb24gcmVhc29uKSB7CisgICAgc3dpdGNoIChyZWFzb24pIHsKKyAgICAgIGNhc2UgTVVMVElQTEVfTUVSR0VfQkFTRVNfTk9UX1NVUFBPUlRFRDoKKyAgICAgIGNhc2UgVE9PX01BTllfTUVSR0VfQkFTRVM6CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQ29tbWl0TWVyZ2VTdGF0dXMuTUFOVUFMX1JFQ1VSU0lWRV9NRVJHRTsKKyAgICAgIGNhc2UgQ09ORkxJQ1RTX0RVUklOR19NRVJHRV9CQVNFX0NBTENVTEFUSU9OOgorICAgICAgICByZXR1cm4gQ29tbWl0TWVyZ2VTdGF0dXMuUEFUSF9DT05GTElDVDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBDb2RlUmV2aWV3Q29tbWl0IGZhaWxlZChmaW5hbCBSZXZXYWxrIHJ3LAorICAgICAgZmluYWwgUmV2RmxhZyBjYW5NZXJnZUZsYWcsIGZpbmFsIENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4sIGZpbmFsIENvbW1pdE1lcmdlU3RhdHVzIGZhaWx1cmUpCisgICAgICB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHJ3LnJlc2V0UmV0YWluKGNhbk1lcmdlRmxhZyk7CisgICAgcncubWFya1N0YXJ0KG4pOworICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKG1lcmdlVGlwKTsKKyAgICBDb2RlUmV2aWV3Q29tbWl0IGZhaWxlZDsKKyAgICB3aGlsZSAoKGZhaWxlZCA9IChDb2RlUmV2aWV3Q29tbWl0KSBydy5uZXh0KCkpICE9IG51bGwpIHsKKyAgICAgIGZhaWxlZC5zdGF0dXNDb2RlID0gZmFpbHVyZTsKKyAgICB9CisgICAgcmV0dXJuIGZhaWxlZDsKKyAgfQorCisgIHB1YmxpYyBDb2RlUmV2aWV3Q29tbWl0IHdyaXRlTWVyZ2VDb21taXQoZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudCwKKyAgICAgIGZpbmFsIFJldldhbGsgcncsIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLAorICAgICAgZmluYWwgUmV2RmxhZyBjYW5NZXJnZUZsYWcsIGZpbmFsIEJyYW5jaC5OYW1lS2V5IGRlc3RCcmFuY2gsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLCBmaW5hbCBPYmplY3RJZCB0cmVlSWQsCisgICAgICBmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG4pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24geworICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gbWVyZ2VkID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOworICAgIHJ3LnJlc2V0UmV0YWluKGNhbk1lcmdlRmxhZyk7CisgICAgcncubWFya1N0YXJ0KG4pOworICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKG1lcmdlVGlwKTsKKyAgICBmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogcncpIHsKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgY3JjID0gKENvZGVSZXZpZXdDb21taXQpIGM7CisgICAgICBpZiAoY3JjLnBhdGNoc2V0SWQgIT0gbnVsbCkgeworICAgICAgICBtZXJnZWQuYWRkKGNyYyk7CisgICAgICB9CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2didWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGlmIChtZXJnZWQuc2l6ZSgpID09IDEpIHsKKyAgICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgYyA9IG1lcmdlZC5nZXQoMCk7CisgICAgICBydy5wYXJzZUJvZHkoYyk7CisgICAgICBtc2didWYuYXBwZW5kKCJNZXJnZSBcIiIpOworICAgICAgbXNnYnVmLmFwcGVuZChjLmdldFNob3J0TWVzc2FnZSgpKTsKKyAgICAgIG1zZ2J1Zi5hcHBlbmQoIlwiIik7CisKKyAgICB9IGVsc2UgeworICAgICAgbXNnYnVmLmFwcGVuZCgiTWVyZ2UgY2hhbmdlcyAiKTsKKyAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8Q29kZVJldmlld0NvbW1pdD4gaSA9IG1lcmdlZC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKKyAgICAgICAgbXNnYnVmLmFwcGVuZChpLm5leHQoKS5jaGFuZ2UuZ2V0S2V5KCkuYWJicmV2aWF0ZSgpKTsKKyAgICAgICAgaWYgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgbXNnYnVmLmFwcGVuZCgnLCcpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFSX0hFQURTX01BU1RFUi5lcXVhbHMoZGVzdEJyYW5jaC5nZXQoKSkpIHsKKyAgICAgIG1zZ2J1Zi5hcHBlbmQoIiBpbnRvICIpOworICAgICAgbXNnYnVmLmFwcGVuZChkZXN0QnJhbmNoLmdldFNob3J0TmFtZSgpKTsKKyAgICB9CisKKyAgICBpZiAobWVyZ2VkLnNpemUoKSA+IDEpIHsKKyAgICAgIG1zZ2J1Zi5hcHBlbmQoIlxuXG4qIGNoYW5nZXM6XG4iKTsKKyAgICAgIGZvciAoZmluYWwgQ29kZVJldmlld0NvbW1pdCBjIDogbWVyZ2VkKSB7CisgICAgICAgIHJ3LnBhcnNlQm9keShjKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZCgiICAiKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZChjLmdldFNob3J0TWVzc2FnZSgpKTsKKyAgICAgICAgbXNnYnVmLmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBQZXJzb25JZGVudCBhdXRob3JJZGVudCA9IGNvbXB1dGVNZXJnZUNvbW1pdEF1dGhvcihteUlkZW50LCBydywgbWVyZ2VkKTsKKworICAgIGZpbmFsIENvbW1pdEJ1aWxkZXIgbWVyZ2VDb21taXQgPSBuZXcgQ29tbWl0QnVpbGRlcigpOworICAgIG1lcmdlQ29tbWl0LnNldFRyZWVJZCh0cmVlSWQpOworICAgIG1lcmdlQ29tbWl0LnNldFBhcmVudElkcyhtZXJnZVRpcCwgbik7CisgICAgbWVyZ2VDb21taXQuc2V0QXV0aG9yKGF1dGhvcklkZW50KTsKKyAgICBtZXJnZUNvbW1pdC5zZXRDb21taXR0ZXIobXlJZGVudCk7CisgICAgbWVyZ2VDb21taXQuc2V0TWVzc2FnZShtc2didWYudG9TdHJpbmcoKSk7CisKKyAgICByZXR1cm4gKENvZGVSZXZpZXdDb21taXQpIHJ3LnBhcnNlQ29tbWl0KGNvbW1pdChpbnNlcnRlciwgbWVyZ2VDb21taXQpKTsKKyAgfQorCisgIHB1YmxpYyBUaHJlZVdheU1lcmdlciBuZXdUaHJlZVdheU1lcmdlcihmaW5hbCBSZXBvc2l0b3J5IHJlcG8sCisgICAgICBmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgeworICAgIFRocmVlV2F5TWVyZ2VyIG07CisgICAgaWYgKHVzZUNvbnRlbnRNZXJnZSkgeworICAgICAgLy8gU2V0dGluZ3MgZm9yIHRoaXMgcHJvamVjdCBhbGxvdyB1cyB0byB0cnkgYW5kIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZQorICAgICAgLy8gY29uZmxpY3RzIHdpdGhpbiBmaWxlcyBpZiBuZWVkZWQuIFVzZSBlaXRoZXIgdGhlIG9sZCByZXNvbHZlIG1lcmdlciBvcgorICAgICAgLy8gbmV3IHJlY3Vyc2l2ZSBtZXJnZXIsIGFuZCBpbnN0cnVjdCB0byBvcGVyYXRlIGluIGNvcmUuCisgICAgICBpZiAodXNlUmVjdXJzaXZlTWVyZ2UpIHsKKyAgICAgICAgbSA9IE1lcmdlU3RyYXRlZ3kuUkVDVVJTSVZFLm5ld01lcmdlcihyZXBvLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG0gPSBNZXJnZVN0cmF0ZWd5LlJFU09MVkUubmV3TWVyZ2VyKHJlcG8sIHRydWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBObyBhdXRvIGNvbmZsaWN0IHJlc29sdmluZyBhbGxvd2VkLiBJZiBhbnkgb2YgdGhlCisgICAgICAvLyBhZmZlY3RlZCBmaWxlcyB3YXMgbW9kaWZpZWQsIG1lcmdlIHdpbGwgZmFpbC4KKyAgICAgIG0gPSBNZXJnZVN0cmF0ZWd5LlNJTVBMRV9UV09fV0FZX0lOX0NPUkUubmV3TWVyZ2VyKHJlcG8pOworICAgIH0KKyAgICBtLnNldE9iamVjdEluc2VydGVyKG5ldyBPYmplY3RJbnNlcnRlci5GaWx0ZXIoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCBPYmplY3RJbnNlcnRlciBkZWxlZ2F0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGluc2VydGVyOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgeworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIG07CisgIH0KKworICBwdWJsaWMgT2JqZWN0SWQgY29tbWl0KGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLAorICAgICAgZmluYWwgQ29tbWl0QnVpbGRlciBtZXJnZUNvbW1pdCkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgT2JqZWN0SWQgaWQgPSBpbnNlcnRlci5pbnNlcnQobWVyZ2VDb21taXQpOworICAgIGluc2VydGVyLmZsdXNoKCk7CisgICAgcmV0dXJuIGlkOworICB9CisKKyAgcHVibGljIFBhdGNoU2V0QXBwcm92YWwgbWFya0NsZWFuTWVyZ2VzKGZpbmFsIFJldldhbGsgcncsCisgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZywgZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIFNldDxSZXZDb21taXQ+IGFscmVhZHlBY2NlcHRlZCkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICBpZiAobWVyZ2VUaXAgPT0gbnVsbCkgeworICAgICAgLy8gSWYgbWVyZ2VUaXAgaXMgbnVsbCBoZXJlLCBicmFuY2hUaXAgd2FzIG51bGwsIGluZGljYXRpbmcgYSBuZXcgYnJhbmNoCisgICAgICAvLyBhdCB0aGUgc3RhcnQgb2YgdGhlIG1lcmdlIHByb2Nlc3MuIFdlIGFsc28gZWxlY3RlZCB0byBtZXJnZSBub3RoaW5nLAorICAgICAgLy8gcHJvYmFibHkgZHVlIHRvIG1pc3NpbmcgZGVwZW5kZW5jaWVzLiBOb3RoaW5nIHdhcyBjbGVhbmx5IG1lcmdlZC4KKyAgICAgIC8vCisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICB0cnkgeworICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXRBcHByb3ZhbCA9IG51bGw7CisKKyAgICAgIHJ3LnJlc2V0UmV0YWluKGNhbk1lcmdlRmxhZyk7CisgICAgICBydy5zb3J0KFJldlNvcnQuVE9QTyk7CisgICAgICBydy5zb3J0KFJldlNvcnQuUkVWRVJTRSwgdHJ1ZSk7CisgICAgICBydy5tYXJrU3RhcnQobWVyZ2VUaXApOworICAgICAgZm9yIChSZXZDb21taXQgYyA6IGFscmVhZHlBY2NlcHRlZCkgeworICAgICAgICBydy5tYXJrVW5pbnRlcmVzdGluZyhjKTsKKyAgICAgIH0KKworICAgICAgQ29kZVJldmlld0NvbW1pdCBjOworICAgICAgd2hpbGUgKChjID0gKENvZGVSZXZpZXdDb21taXQpIHJ3Lm5leHQoKSkgIT0gbnVsbCkgeworICAgICAgICBpZiAoYy5wYXRjaHNldElkICE9IG51bGwpIHsKKyAgICAgICAgICBjLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRTsKKyAgICAgICAgICBpZiAoc3VibWl0QXBwcm92YWwgPT0gbnVsbCkgeworICAgICAgICAgICAgc3VibWl0QXBwcm92YWwgPSBnZXRTdWJtaXR0ZXIoYy5wYXRjaHNldElkKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIHN1Ym1pdEFwcHJvdmFsOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IG1hcmsgY2xlYW4gbWVyZ2VzIiwgZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXRhRGF0YVVwZGF0ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTWV0YURhdGFVcGRhdGUuamF2YQppbmRleCA4NmRjMTljLi5kYzA4YTZjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NZXRhRGF0YVVwZGF0ZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L01ldGFEYXRhVXBkYXRlLmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC04NywxNSArODgsMTUgQEAKICAgICAgICAgQEFzc2lzdGVkIFJlcG9zaXRvcnkgZGIpOwogICB9CiAKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdE5hbWU7CiAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSBkYjsKICAgcHJpdmF0ZSBmaW5hbCBDb21taXRCdWlsZGVyIGNvbW1pdDsKIAogICBASW5qZWN0Ci0gIHB1YmxpYyBNZXRhRGF0YVVwZGF0ZShHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uLAorICBwdWJsaWMgTWV0YURhdGFVcGRhdGUoR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkLAogICAgICAgQEFzc2lzdGVkIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSwgQEFzc2lzdGVkIFJlcG9zaXRvcnkgZGIpIHsKLSAgICB0aGlzLnJlcGxpY2F0aW9uID0gcmVwbGljYXRpb247CisgICAgdGhpcy5naXRSZWZVcGRhdGVkID0gZ2l0UmVmVXBkYXRlZDsKICAgICB0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CiAgICAgdGhpcy5kYiA9IGRiOwogICAgIHRoaXMuY29tbWl0ID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKQEAgLTEwNiw2ICsxMDcsMTIgQEAKICAgICBnZXRDb21taXRCdWlsZGVyKCkuc2V0TWVzc2FnZShtZXNzYWdlKTsKICAgfQogCisgIHB1YmxpYyB2b2lkIHNldEF1dGhvcihJZGVudGlmaWVkVXNlciB1c2VyKSB7CisgICAgZ2V0Q29tbWl0QnVpbGRlcigpLnNldEF1dGhvcih1c2VyLm5ld0NvbW1pdHRlcklkZW50KAorICAgICAgICBnZXRDb21taXRCdWlsZGVyKCkuZ2V0Q29tbWl0dGVyKCkuZ2V0V2hlbigpLAorICAgICAgICBnZXRDb21taXRCdWlsZGVyKCkuZ2V0Q29tbWl0dGVyKCkuZ2V0VGltZVpvbmUoKSkpOworICB9CisKICAgLyoqIENsb3NlIHRoZSBjYWNoZWQgUmVwb3NpdG9yeSBoYW5kbGUuICovCiAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgIGdldFJlcG9zaXRvcnkoKS5jbG9zZSgpOwpAQCAtMTIzLDcgKzEzMCw3IEBACiAgICAgcmV0dXJuIGNvbW1pdDsKICAgfQogCi0gIHZvaWQgcmVwbGljYXRlKFN0cmluZyByZWYpIHsKLSAgICByZXBsaWNhdGlvbi5maXJlKHByb2plY3ROYW1lLCByZWYpOworICB2b2lkIGZpcmVHaXRSZWZVcGRhdGVkRXZlbnQoUmVmVXBkYXRlIHJ1KSB7CisgICAgZ2l0UmVmVXBkYXRlZC5maXJlKHByb2plY3ROYW1lLCBydSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L011bHRpUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9NdWx0aVByb2dyZXNzTW9uaXRvci5qYXZhCmluZGV4IDIzZDhkYWQuLjljNTYzM2IgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L011bHRpUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTXVsdGlQcm9ncmVzc01vbml0b3IuamF2YQpAQCAtMTgzLDYgKzE4Myw3IEBACiAgICAgICBmaW5hbCBUaW1lVW5pdCB0aW1lb3V0VW5pdCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CiAgICAgbG9uZyBvdmVyYWxsU3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICBsb25nIGRlYWRsaW5lOworICAgIFN0cmluZyBkZXRhaWxNZXNzYWdlID0gIiI7CiAgICAgaWYgKHRpbWVvdXRUaW1lID4gMCkgewogICAgICAgZGVhZGxpbmUgPSBvdmVyYWxsU3RhcnQgKyBOQU5PU0VDT05EUy5jb252ZXJ0KHRpbWVvdXRUaW1lLCB0aW1lb3V0VW5pdCk7CiAgICAgfSBlbHNlIHsKQEAgLTIwNCwxMCArMjA1LDE1IEBACiAgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLm5hbm9UaW1lKCk7CiAKICAgICAgICAgaWYgKGRlYWRsaW5lID4gMCAmJiBub3cgPiBkZWFkbGluZSkgewotICAgICAgICAgIGxvZy53YXJuKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICJNdWx0aVByb2dyZXNzTW9uaXRvciB3b3JrZXIga2lsbGVkIGFmdGVyICVzbXMiLAotICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydChub3cgLSBvdmVyYWxsU3RhcnQsIE5BTk9TRUNPTkRTKSkpOwogICAgICAgICAgIHdvcmtlckZ1dHVyZS5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgaWYgKHdvcmtlckZ1dHVyZS5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICBkZXRhaWxNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIih0aW1lb3V0ICVzbXMsIGNhbmNlbGxlZCkiLAorICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydChub3cgLSBkZWFkbGluZSwgTkFOT1NFQ09ORFMpKTsKKyAgICAgICAgICAgIGxvZy53YXJuKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJNdWx0aVByb2dyZXNzTW9uaXRvciB3b3JrZXIga2lsbGVkIGFmdGVyICVzbXMiICsgZGV0YWlsTWVzc2FnZSwgLy8KKyAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQobm93IC0gb3ZlcmFsbFN0YXJ0LCBOQU5PU0VDT05EUykpKTsKKyAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjM1LDcgKzI0MSw3IEBACiAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKICAgICB9IGNhdGNoIChDYW5jZWxsYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oZGV0YWlsTWVzc2FnZSwgZSk7CiAgICAgfSBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKSB7CiAgICAgICB3b3JrZXJGdXR1cmUuY2FuY2VsKHRydWUpOwogICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbihlKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L05vdGVzQnJhbmNoVXRpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTm90ZXNCcmFuY2hVdGlsLmphdmEKaW5kZXggMTdjZmVhOC4uMmM2YzdiOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTm90ZXNCcmFuY2hVdGlsLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvTm90ZXNCcmFuY2hVdGlsLmphdmEKQEAgLTE0LDcgKzE0LDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIApAQCAtNDcsMTQgKzQ5LDE4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOb3Rlc0JyYW5jaFV0aWwgewogICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIE5vdGVzQnJhbmNoVXRpbCBjcmVhdGUoUmVwb3NpdG9yeSBkYik7CisgICAgTm90ZXNCcmFuY2hVdGlsIGNyZWF0ZShQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgUmVwb3NpdG9yeSBkYiwKKyAgICAgICAgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MT0NLX0ZBSUxVUkVfQ0FMTFMgPSAxMDsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMRUVQX09OX0xPQ0tfRkFJTFVSRV9NUyA9IDI1OwogCi0gIHByaXZhdGUgUGVyc29uSWRlbnQgZ2Vycml0SWRlbnQ7CisgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgZ2Vycml0SWRlbnQ7CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOworICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0OwogICBwcml2YXRlIGZpbmFsIFJlcG9zaXRvcnkgZGI7CisgIHByaXZhdGUgZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXI7CiAKICAgcHJpdmF0ZSBSZXZDb21taXQgYmFzZUNvbW1pdDsKICAgcHJpdmF0ZSBOb3RlTWFwIGJhc2U7CkBAIC02Myw3ICs2OSw2IEBACiAgIHByaXZhdGUgTm90ZU1hcCBvdXJzOwogCiAgIHByaXZhdGUgUmV2V2FsayByZXZXYWxrOwotICBwcml2YXRlIE9iamVjdEluc2VydGVyIGluc2VydGVyOwogICBwcml2YXRlIE9iamVjdFJlYWRlciByZWFkZXI7CiAgIHByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGU7CiAKQEAgLTcxLDkgKzc2LDE1IEBACiAKICAgQEluamVjdAogICBwdWJsaWMgTm90ZXNCcmFuY2hVdGlsKEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudCwKLSAgICAgIEBBc3Npc3RlZCBSZXBvc2l0b3J5IGRiKSB7CisgICAgICBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQsCisgICAgICBAQXNzaXN0ZWQgUHJvamVjdC5OYW1lS2V5IHByb2plY3QsCisgICAgICBAQXNzaXN0ZWQgUmVwb3NpdG9yeSBkYiwKKyAgICAgIEBBc3Npc3RlZCBPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgewogICAgIHRoaXMuZ2Vycml0SWRlbnQgPSBnZXJyaXRJZGVudDsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuaW5zZXJ0ZXIgPSBpbnNlcnRlcjsKICAgfQogCiAgIC8qKgpAQCAtMTI4LDcgKzEzOSw2IEBACiAgICAgICBDb25jdXJyZW50UmVmVXBkYXRlRXhjZXB0aW9uIHsKICAgICB0cnkgewogICAgICAgcmV2V2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKLSAgICAgIGluc2VydGVyID0gZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKTsKICAgICAgIHJlYWRlciA9IGRiLm5ld09iamVjdFJlYWRlcigpOwogICAgICAgbG9hZEJhc2Uobm90ZXNCcmFuY2gpOwogICAgICAgaWYgKG92ZXJ3cml0ZSkgewpAQCAtMTQ0LDcgKzE1NCw2IEBACiAgICAgICB1cGRhdGVSZWYobm90ZXNCcmFuY2gpOwogICAgIH0gZmluYWxseSB7CiAgICAgICByZXZXYWxrLnJlbGVhc2UoKTsKLSAgICAgIGluc2VydGVyLnJlbGVhc2UoKTsKICAgICAgIHJlYWRlci5yZWxlYXNlKCk7CiAgICAgfQogICB9CkBAIC0yNTIsNiArMjYxLDcgQEAKICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZG4ndCB1cGRhdGUgIiArIG5vdGVzQnJhbmNoICsgIi4gIgogICAgICAgICAgICAgKyByZXN1bHQubmFtZSgpKTsKICAgICAgIH0gZWxzZSB7CisgICAgICAgIGdpdFJlZlVwZGF0ZWQuZmlyZShwcm9qZWN0LCByZWZVcGRhdGUpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Ob3RpZnlDb25maWcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L05vdGlmeUNvbmZpZy5qYXZhCmluZGV4IGJhMjgzM2QuLjNhMGMyNzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L05vdGlmeUNvbmZpZy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L05vdGlmeUNvbmZpZy5qYXZhCkBAIC0yNCwxMCArMjQsMTUgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBwdWJsaWMgY2xhc3MgTm90aWZ5Q29uZmlnIGltcGxlbWVudHMgQ29tcGFyYWJsZTxOb3RpZnlDb25maWc+IHsKKyAgcHVibGljIHN0YXRpYyBlbnVtIEhlYWRlciB7CisgICAgVE8sIENDLCBCQ0M7CisgIH0KKwogICBwcml2YXRlIFN0cmluZyBuYW1lOwogICBwcml2YXRlIEVudW1TZXQ8Tm90aWZ5VHlwZT4gdHlwZXMgPSBFbnVtU2V0Lm9mKE5vdGlmeVR5cGUuQUxMKTsKICAgcHJpdmF0ZSBTdHJpbmcgZmlsdGVyOwogCisgIHByaXZhdGUgSGVhZGVyIGhlYWRlcjsKICAgcHJpdmF0ZSBTZXQ8R3JvdXBSZWZlcmVuY2U+IGdyb3VwcyA9IFNldHMubmV3SGFzaFNldCgpOwogICBwcml2YXRlIFNldDxBZGRyZXNzPiBhZGRyZXNzZXMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKIApAQCAtNjMsNiArNjgsMTQgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKKyAgICByZXR1cm4gaGVhZGVyOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0SGVhZGVyKEhlYWRlciBoZHIpIHsKKyAgICBoZWFkZXIgPSBoZHI7CisgIH0KKwogICBwdWJsaWMgU2V0PEdyb3VwUmVmZXJlbmNlPiBnZXRHcm91cHMoKSB7CiAgICAgcmV0dXJuIGdyb3VwczsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUGVyVGhyZWFkUmVxdWVzdFNjb3BlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9QZXJUaHJlYWRSZXF1ZXN0U2NvcGUuamF2YQppbmRleCA4YWVhNzNhLi5lN2JiMGFlIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9QZXJUaHJlYWRSZXF1ZXN0U2NvcGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9QZXJUaHJlYWRSZXF1ZXN0U2NvcGUuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuUmVxdWVzdENvbnRleHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5UaHJlYWRMb2NhbFJlcXVlc3RTY29wZVByb3BhZ2F0b3I7CkBAIC01Miw4ICs1Myw5IEBACiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9wYWdhdG9yIGV4dGVuZHMgVGhyZWFkTG9jYWxSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yPENvbnRleHQ+IHsKICAgICBASW5qZWN0Ci0gICAgUHJvcGFnYXRvcihUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsKSB7Ci0gICAgICBzdXBlcihSRVFVRVNULCBjdXJyZW50LCBsb2NhbCk7CisgICAgUHJvcGFnYXRvcihUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsLAorICAgICAgICBQcm92aWRlcjxSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcj4gZGJQcm92aWRlclByb3ZpZGVyKSB7CisgICAgICBzdXBlcihSRVFVRVNULCBjdXJyZW50LCBsb2NhbCwgZGJQcm92aWRlclByb3ZpZGVyKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1Byb2plY3RDb25maWcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1Byb2plY3RDb25maWcuamF2YQppbmRleCAxM2U5OTY3Li44MzU2MGMxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9Qcm9qZWN0Q29uZmlnLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUHJvamVjdENvbmZpZy5qYXZhCkBAIC0xNiwxMyArMTYsMjMgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLmlzUGVybWlzc2lvbjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhck1hdGNoZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLlNob3J0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNvbnRyaWJ1dG9yQWdyZWVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxWYWx1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlLkFjdGlvbjsKQEAgLTc5LDYgKzg5LDcgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTUFJTCA9ICJlbWFpbCI7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRklMVEVSID0gImZpbHRlciI7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJ0eXBlIjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IRUFERVIgPSAiaGVhZGVyIjsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWSA9ICJjYXBhYmlsaXR5IjsKIApAQCAtOTMsNiArMTA0LDE5IEBACiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVSR0VfQ09OVEVOVCA9ICJtZXJnZUNvbnRlbnQiOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQVRFID0gInN0YXRlIjsKIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFTSEJPQVJEID0gImRhc2hib2FyZCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVGQVVMVCA9ICJkZWZhdWx0IjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9MT0NBTF9ERUZBVUxUID0gImxvY2FsLWRlZmF1bHQiOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJsYWJlbCI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUJCUkVWSUFUSU9OID0gImFiYnJldmlhdGlvbiI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRlVOQ1RJT04gPSAiZnVuY3Rpb24iOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPUFlfTUlOX1NDT1JFID0gImNvcHlNaW5TY29yZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVkFMVUUgPSAidmFsdWUiOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBTl9PVkVSUklERSA9ICJjYW5PdmVycmlkZSI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IExBQkVMX0ZVTkNUSU9OUyA9IEltbXV0YWJsZVNldC5vZigKKyAgICAgICJNYXhXaXRoQmxvY2siLCAiTWF4Tm9CbG9jayIsICJOb0Jsb2NrIiwgIk5vT3AiKTsKKwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdWJtaXRUeXBlIGRlZmF1bHRTdWJtaXRBY3Rpb24gPQogICAgICAgU3VibWl0VHlwZS5NRVJHRV9JRl9ORUNFU1NBUlk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0YXRlIGRlZmF1bHRTdGF0ZVZhbHVlID0KQEAgLTEwNSw2ICsxMjksNyBAQAogICBwcml2YXRlIE1hcDxTdHJpbmcsIEFjY2Vzc1NlY3Rpb24+IGFjY2Vzc1NlY3Rpb25zOwogICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbnRyaWJ1dG9yQWdyZWVtZW50PiBjb250cmlidXRvckFncmVlbWVudHM7CiAgIHByaXZhdGUgTWFwPFN0cmluZywgTm90aWZ5Q29uZmlnPiBub3RpZnlTZWN0aW9uczsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMYWJlbFR5cGU+IGxhYmVsU2VjdGlvbnM7CiAgIHByaXZhdGUgTGlzdDxWYWxpZGF0aW9uRXJyb3I+IHZhbGlkYXRpb25FcnJvcnM7CiAgIHByaXZhdGUgT2JqZWN0SWQgcnVsZXNJZDsKIApAQCAtMjAzLDYgKzIyOCwxMCBAQAogICAgIHJldHVybiBub3RpZnlTZWN0aW9ucy52YWx1ZXMoKTsKICAgfQogCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBMYWJlbFR5cGU+IGdldExhYmVsU2VjdGlvbnMoKSB7CisgICAgcmV0dXJuIGxhYmVsU2VjdGlvbnM7CisgIH0KKwogICBwdWJsaWMgR3JvdXBSZWZlcmVuY2UgcmVzb2x2ZShBY2NvdW50R3JvdXAgZ3JvdXApIHsKICAgICByZXR1cm4gcmVzb2x2ZShHcm91cFJlZmVyZW5jZS5mb3JHcm91cChncm91cCkpOwogICB9CkBAIC0yMjMsNiArMjUyLDExIEBACiAgICAgcmV0dXJuIGdyb3Vwc0J5VVVJRC5nZXQodXVpZCk7CiAgIH0KIAorICAvKiogQHJldHVybiBzZXQgb2YgYWxsIGdyb3VwcyB1c2VkIGJ5IHRoaXMgY29uZmlndXJhdGlvbi4gKi8KKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0QWxsR3JvdXBVVUlEcygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGdyb3Vwc0J5VVVJRC5rZXlTZXQoKSk7CisgIH0KKwogICAvKioKICAgICogQHJldHVybiB0aGUgcHJvamVjdCdzIHJ1bGVzLnBsIE9iamVjdElkLCBpZiBwcmVzZW50IGluIHRoZSBicmFuY2guCiAgICAqICAgIE51bGwgaWYgaXQgZG9lc24ndCBleGlzdC4KQEAgLTI4MiwxOCArMzE2LDIyIEBACiAgICAgfQogICAgIHAuc2V0UGFyZW50TmFtZShyYy5nZXRTdHJpbmcoQUNDRVNTLCBudWxsLCBLRVlfSU5IRVJJVF9GUk9NKSk7CiAKLSAgICBwLnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhnZXRCb29sZWFuKHJjLCBSRUNFSVZFLCBLRVlfUkVRVUlSRV9DT05UUklCVVRPUl9BR1JFRU1FTlQsIGZhbHNlKSk7Ci0gICAgcC5zZXRVc2VTaWduZWRPZmZCeShnZXRCb29sZWFuKHJjLCBSRUNFSVZFLCBLRVlfUkVRVUlSRV9TSUdORURfT0ZGX0JZLCBmYWxzZSkpOwotICAgIHAuc2V0UmVxdWlyZUNoYW5nZUlEKGdldEJvb2xlYW4ocmMsIFJFQ0VJVkUsIEtFWV9SRVFVSVJFX0NIQU5HRV9JRCwgZmFsc2UpKTsKKyAgICBwLnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhnZXRFbnVtKHJjLCBSRUNFSVZFLCBudWxsLCBLRVlfUkVRVUlSRV9DT05UUklCVVRPUl9BR1JFRU1FTlQsIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKKyAgICBwLnNldFVzZVNpZ25lZE9mZkJ5KGdldEVudW0ocmMsIFJFQ0VJVkUsIG51bGwsIEtFWV9SRVFVSVJFX1NJR05FRF9PRkZfQlksIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKKyAgICBwLnNldFJlcXVpcmVDaGFuZ2VJRChnZXRFbnVtKHJjLCBSRUNFSVZFLCBudWxsLCBLRVlfUkVRVUlSRV9DSEFOR0VfSUQsIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKIAogICAgIHAuc2V0U3VibWl0VHlwZShnZXRFbnVtKHJjLCBTVUJNSVQsIG51bGwsIEtFWV9BQ1RJT04sIGRlZmF1bHRTdWJtaXRBY3Rpb24pKTsKLSAgICBwLnNldFVzZUNvbnRlbnRNZXJnZShnZXRCb29sZWFuKHJjLCBTVUJNSVQsIEtFWV9NRVJHRV9DT05URU5ULCBmYWxzZSkpOworICAgIHAuc2V0VXNlQ29udGVudE1lcmdlKGdldEVudW0ocmMsIFNVQk1JVCwgbnVsbCwgS0VZX01FUkdFX0NPTlRFTlQsIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpKTsKICAgICBwLnNldFN0YXRlKGdldEVudW0ocmMsIFBST0pFQ1QsIG51bGwsIEtFWV9TVEFURSwgZGVmYXVsdFN0YXRlVmFsdWUpKTsKIAorICAgIHAuc2V0RGVmYXVsdERhc2hib2FyZChyYy5nZXRTdHJpbmcoREFTSEJPQVJELCBudWxsLCBLRVlfREVGQVVMVCkpOworICAgIHAuc2V0TG9jYWxEZWZhdWx0RGFzaGJvYXJkKHJjLmdldFN0cmluZyhEQVNIQk9BUkQsIG51bGwsIEtFWV9MT0NBTF9ERUZBVUxUKSk7CisKICAgICBsb2FkQWNjb3VudHNTZWN0aW9uKHJjLCBncm91cHNCeU5hbWUpOwogICAgIGxvYWRDb250cmlidXRvckFncmVlbWVudHMocmMsIGdyb3Vwc0J5TmFtZSk7CiAgICAgbG9hZEFjY2Vzc1NlY3Rpb25zKHJjLCBncm91cHNCeU5hbWUpOwogICAgIGxvYWROb3RpZnlTZWN0aW9ucyhyYywgZ3JvdXBzQnlOYW1lKTsKKyAgICBsb2FkTGFiZWxTZWN0aW9ucyhyYyk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgbG9hZEFjY291bnRzU2VjdGlvbigKQEAgLTM2OCw2ICs0MDYsOSBAQAogICAgICAgICAgIE5PVElGWSwgc2VjdGlvbk5hbWUsIEtFWV9UWVBFLAogICAgICAgICAgIE5vdGlmeVR5cGUuQUxMKSk7CiAgICAgICBuLnNldFR5cGVzKHR5cGVzKTsKKyAgICAgIG4uc2V0SGVhZGVyKENvbmZpZ1V0aWwuZ2V0RW51bShyYywKKyAgICAgICAgICBOT1RJRlksIHNlY3Rpb25OYW1lLCBLRVlfSEVBREVSLAorICAgICAgICAgIE5vdGlmeUNvbmZpZy5IZWFkZXIuQkNDKSk7CiAKICAgICAgIGZvciAoU3RyaW5nIGRzdCA6IHJjLmdldFN0cmluZ0xpc3QoTk9USUZZLCBzZWN0aW9uTmFtZSwgS0VZX0VNQUlMKSkgewogICAgICAgICBpZiAoZHN0LnN0YXJ0c1dpdGgoImdyb3VwICIpKSB7CkBAIC00ODAsNiArNTIxLDcyIEBACiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgTGFiZWxWYWx1ZSBwYXJzZUxhYmVsVmFsdWUoU3RyaW5nIHNyYykgeworICAgIExpc3Q8U3RyaW5nPiBwYXJ0cyA9IEltbXV0YWJsZUxpc3QuY29weU9mKAorICAgICAgICBTcGxpdHRlci5vbihDaGFyTWF0Y2hlci5XSElURVNQQUNFKS5vbWl0RW1wdHlTdHJpbmdzKCkubGltaXQoMikKKyAgICAgICAgLnNwbGl0KHNyYykpOworICAgIGlmIChwYXJ0cy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVtcHR5IHZhbHVlIik7CisgICAgfQorICAgIHJldHVybiBuZXcgTGFiZWxWYWx1ZSgKKyAgICAgICAgU2hvcnRzLmNoZWNrZWRDYXN0KFBlcm1pc3Npb25SdWxlLnBhcnNlSW50KHBhcnRzLmdldCgwKSkpLAorICAgICAgICBwYXJ0cy5nZXQoMSkpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGxvYWRMYWJlbFNlY3Rpb25zKENvbmZpZyByYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvd2VyTmFtZXMgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDIpOworICAgIGxhYmVsU2VjdGlvbnMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogcmMuZ2V0U3Vic2VjdGlvbnMoTEFCRUwpKSB7CisgICAgICBTdHJpbmcgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICBpZiAobG93ZXJOYW1lcy5jb250YWluc0tleShsb3dlcikpIHsKKyAgICAgICAgZXJyb3IobmV3IFZhbGlkYXRpb25FcnJvcihQUk9KRUNUX0NPTkZJRywgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJMYWJlbCBcIiVzXCIgY29uZmxpY3RzIHdpdGggXCIlc1wiIiwKKyAgICAgICAgICAgIG5hbWUsIGxvd2VyTmFtZXMuZ2V0KGxvd2VyKSkpKTsKKyAgICAgIH0KKyAgICAgIGxvd2VyTmFtZXMucHV0KGxvd2VyLCBuYW1lKTsKKworICAgICAgTGlzdDxMYWJlbFZhbHVlPiB2YWx1ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogcmMuZ2V0U3RyaW5nTGlzdChMQUJFTCwgbmFtZSwgS0VZX1ZBTFVFKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHZhbHVlcy5hZGQocGFyc2VMYWJlbFZhbHVlKHZhbHVlKSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3RWYWx1ZSkgeworICAgICAgICAgIGVycm9yKG5ldyBWYWxpZGF0aW9uRXJyb3IoUFJPSkVDVF9DT05GSUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICJJbnZhbGlkICVzIFwiJXNcIiBmb3IgbGFiZWwgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgIEtFWV9WQUxVRSwgdmFsdWUsIG5hbWUsIG5vdFZhbHVlLmdldE1lc3NhZ2UoKSkpKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBMYWJlbFR5cGUgbGFiZWw7CisgICAgICB0cnkgeworICAgICAgICBsYWJlbCA9IG5ldyBMYWJlbFR5cGUobmFtZSwgdmFsdWVzKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBiYWROYW1lKSB7CisgICAgICAgIGVycm9yKG5ldyBWYWxpZGF0aW9uRXJyb3IoUFJPSkVDVF9DT05GSUcsIFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiSW52YWxpZCBsYWJlbCBcIiVzXCIiLCBuYW1lKSkpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFN0cmluZyBhYmJyID0gcmMuZ2V0U3RyaW5nKExBQkVMLCBuYW1lLCBLRVlfQUJCUkVWSUFUSU9OKTsKKyAgICAgIGlmIChhYmJyICE9IG51bGwpIHsKKyAgICAgICAgbGFiZWwuc2V0QWJicmV2aWF0aW9uKGFiYnIpOworICAgICAgfQorCisgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gT2JqZWN0cy5maXJzdE5vbk51bGwoCisgICAgICAgICAgcmMuZ2V0U3RyaW5nKExBQkVMLCBuYW1lLCBLRVlfRlVOQ1RJT04pLCAiTWF4V2l0aEJsb2NrIik7CisgICAgICBpZiAoTEFCRUxfRlVOQ1RJT05TLmNvbnRhaW5zKGZ1bmN0aW9uTmFtZSkpIHsKKyAgICAgICAgbGFiZWwuc2V0RnVuY3Rpb25OYW1lKGZ1bmN0aW9uTmFtZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBlcnJvcihuZXcgVmFsaWRhdGlvbkVycm9yKFBST0pFQ1RfQ09ORklHLCBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkludmFsaWQgJXMgZm9yIGxhYmVsIFwiJXNcIi4gVmFsaWQgbmFtZXMgYXJlOiAlcyIsCisgICAgICAgICAgICBLRVlfRlVOQ1RJT04sIG5hbWUsIEpvaW5lci5vbigiLCAiKS5qb2luKExBQkVMX0ZVTkNUSU9OUykpKSk7CisgICAgICAgIGxhYmVsLnNldEZ1bmN0aW9uTmFtZShudWxsKTsKKyAgICAgIH0KKyAgICAgIGxhYmVsLnNldENvcHlNaW5TY29yZSgKKyAgICAgICAgICByYy5nZXRCb29sZWFuKExBQkVMLCBuYW1lLCBLRVlfQ09QWV9NSU5fU0NPUkUsIGZhbHNlKSk7CisgICAgICBsYWJlbC5zZXRDYW5PdmVycmlkZSgKKyAgICAgICAgICByYy5nZXRCb29sZWFuKExBQkVMLCBuYW1lLCBLRVlfQ0FOX09WRVJSSURFLCB0cnVlKSk7CisgICAgICBsYWJlbFNlY3Rpb25zLnB1dChuYW1lLCBsYWJlbCk7CisgICAgfQorICB9CisKICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBHcm91cFJlZmVyZW5jZT4gcmVhZEdyb3VwTGlzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgZ3JvdXBzQnlVVUlEID0gbmV3IEhhc2hNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEdyb3VwUmVmZXJlbmNlPigpOwogICAgIE1hcDxTdHJpbmcsIEdyb3VwUmVmZXJlbmNlPiBncm91cHNCeU5hbWUgPQpAQCAtNTI1LDIxICs2MzIsMjUgQEAKICAgICB9CiAgICAgc2V0KHJjLCBBQ0NFU1MsIG51bGwsIEtFWV9JTkhFUklUX0ZST00sIHAuZ2V0UGFyZW50TmFtZSgpKTsKIAotICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfQ09OVFJJQlVUT1JfQUdSRUVNRU5ULCBwLmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpOwotICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfU0lHTkVEX09GRl9CWSwgcC5pc1VzZVNpZ25lZE9mZkJ5KCkpOwotICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfQ0hBTkdFX0lELCBwLmlzUmVxdWlyZUNoYW5nZUlEKCkpOworICAgIHNldChyYywgUkVDRUlWRSwgbnVsbCwgS0VZX1JFUVVJUkVfQ09OVFJJQlVUT1JfQUdSRUVNRU5ULCBwLmdldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpLCBQcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKKyAgICBzZXQocmMsIFJFQ0VJVkUsIG51bGwsIEtFWV9SRVFVSVJFX1NJR05FRF9PRkZfQlksIHAuZ2V0VXNlU2lnbmVkT2ZmQnkoKSwgUHJvamVjdC5Jbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVCk7CisgICAgc2V0KHJjLCBSRUNFSVZFLCBudWxsLCBLRVlfUkVRVUlSRV9DSEFOR0VfSUQsIHAuZ2V0UmVxdWlyZUNoYW5nZUlEKCksIFByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQpOwogCiAgICAgc2V0KHJjLCBTVUJNSVQsIG51bGwsIEtFWV9BQ1RJT04sIHAuZ2V0U3VibWl0VHlwZSgpLCBkZWZhdWx0U3VibWl0QWN0aW9uKTsKLSAgICBzZXQocmMsIFNVQk1JVCwgbnVsbCwgS0VZX01FUkdFX0NPTlRFTlQsIHAuaXNVc2VDb250ZW50TWVyZ2UoKSk7CisgICAgc2V0KHJjLCBTVUJNSVQsIG51bGwsIEtFWV9NRVJHRV9DT05URU5ULCBwLmdldFVzZUNvbnRlbnRNZXJnZSgpLCBQcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUKTsKIAogICAgIHNldChyYywgUFJPSkVDVCwgbnVsbCwgS0VZX1NUQVRFLCBwLmdldFN0YXRlKCksIG51bGwpOwogCisgICAgc2V0KHJjLCBEQVNIQk9BUkQsIG51bGwsIEtFWV9ERUZBVUxULCBwLmdldERlZmF1bHREYXNoYm9hcmQoKSk7CisgICAgc2V0KHJjLCBEQVNIQk9BUkQsIG51bGwsIEtFWV9MT0NBTF9ERUZBVUxULCBwLmdldExvY2FsRGVmYXVsdERhc2hib2FyZCgpKTsKKwogICAgIFNldDxBY2NvdW50R3JvdXAuVVVJRD4ga2VlcEdyb3VwcyA9IG5ldyBIYXNoU2V0PEFjY291bnRHcm91cC5VVUlEPigpOwogICAgIHNhdmVBY2NvdW50c1NlY3Rpb24ocmMsIGtlZXBHcm91cHMpOwogICAgIHNhdmVDb250cmlidXRvckFncmVlbWVudHMocmMsIGtlZXBHcm91cHMpOwogICAgIHNhdmVBY2Nlc3NTZWN0aW9ucyhyYywga2VlcEdyb3Vwcyk7CiAgICAgc2F2ZU5vdGlmeVNlY3Rpb25zKHJjLCBrZWVwR3JvdXBzKTsKICAgICBncm91cHNCeVVVSUQua2V5U2V0KCkucmV0YWluQWxsKGtlZXBHcm91cHMpOworICAgIHNhdmVMYWJlbFNlY3Rpb25zKHJjKTsKIAogICAgIHNhdmVDb25maWcoUFJPSkVDVF9DT05GSUcsIHJjKTsKICAgICBzYXZlR3JvdXBMaXN0KCk7CkBAIC01OTMsNiArNzA0LDggQEAKICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWRkcnMpOwogICAgICAgZW1haWwuYWRkQWxsKGFkZHJzKTsKIAorICAgICAgc2V0KHJjLCBOT1RJRlksIG5jLmdldE5hbWUoKSwgS0VZX0hFQURFUiwKKyAgICAgICAgICBuYy5nZXRIZWFkZXIoKSwgTm90aWZ5Q29uZmlnLkhlYWRlci5CQ0MpOwogICAgICAgaWYgKGVtYWlsLmlzRW1wdHkoKSkgewogICAgICAgICByYy51bnNldChOT1RJRlksIG5jLmdldE5hbWUoKSwgS0VZX0VNQUlMKTsKICAgICAgIH0gZWxzZSB7CkBAIC03MDcsNiArODIwLDUzIEBACiAgICAgfQogICB9CiAKKyAgcHJpdmF0ZSB2b2lkIHNhdmVMYWJlbFNlY3Rpb25zKENvbmZpZyByYykgeworICAgIExpc3Q8U3RyaW5nPiBleGlzdGluZyA9IExpc3RzLm5ld0FycmF5TGlzdChyYy5nZXRTdWJzZWN0aW9ucyhMQUJFTCkpOworICAgIGlmICghTGlzdHMubmV3QXJyYXlMaXN0KGxhYmVsU2VjdGlvbnMua2V5U2V0KCkpLmVxdWFscyhleGlzdGluZykpIHsKKyAgICAgIC8vIE9yZGVyIG9mIHNlY3Rpb25zIGNoYW5nZWQsIHJlbW92ZSBhbmQgcmV3cml0ZSB0aGVtIGFsbC4KKyAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBleGlzdGluZykgeworICAgICAgICByYy51bnNldFNlY3Rpb24oTEFCRUwsIG5hbWUpOworICAgICAgfQorICAgIH0KKworICAgIFNldDxTdHJpbmc+IHRvVW5zZXQgPSBTZXRzLm5ld0hhc2hTZXQoZXhpc3RpbmcpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGFiZWxUeXBlPiBlIDogbGFiZWxTZWN0aW9ucy5lbnRyeVNldCgpKSB7CisgICAgICBTdHJpbmcgbmFtZSA9IGUuZ2V0S2V5KCk7CisgICAgICBMYWJlbFR5cGUgbGFiZWwgPSBlLmdldFZhbHVlKCk7CisgICAgICB0b1Vuc2V0LnJlbW92ZShuYW1lKTsKKyAgICAgIHJjLnNldFN0cmluZyhMQUJFTCwgbmFtZSwgS0VZX0ZVTkNUSU9OLCBsYWJlbC5nZXRGdW5jdGlvbk5hbWUoKSk7CisKKyAgICAgIGlmICghTGFiZWxUeXBlLmRlZmF1bHRBYmJyZXZpYXRpb24obmFtZSkKKyAgICAgICAgICAuZXF1YWxzKGxhYmVsLmdldEFiYnJldmlhdGlvbigpKSkgeworICAgICAgICByYy5zZXRTdHJpbmcoCisgICAgICAgICAgICBMQUJFTCwgbmFtZSwgS0VZX0FCQlJFVklBVElPTiwgbGFiZWwuZ2V0QWJicmV2aWF0aW9uKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmMudW5zZXQoTEFCRUwsIG5hbWUsIEtFWV9BQkJSRVZJQVRJT04pOworICAgICAgfQorICAgICAgaWYgKGxhYmVsLmlzQ29weU1pblNjb3JlKCkpIHsKKyAgICAgICAgcmMuc2V0Qm9vbGVhbihMQUJFTCwgbmFtZSwgS0VZX0NPUFlfTUlOX1NDT1JFLCB0cnVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJjLnVuc2V0KExBQkVMLCBuYW1lLCBLRVlfQ09QWV9NSU5fU0NPUkUpOworICAgICAgfQorICAgICAgaWYgKCFsYWJlbC5jYW5PdmVycmlkZSgpKSB7CisgICAgICAgIHJjLnNldEJvb2xlYW4oTEFCRUwsIG5hbWUsIEtFWV9DQU5fT1ZFUlJJREUsIGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJjLnVuc2V0KExBQkVMLCBuYW1lLCBLRVlfQ0FOX09WRVJSSURFKTsKKyAgICAgIH0KKworICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9CisgICAgICAgICAgTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGxhYmVsLmdldFZhbHVlcygpLnNpemUoKSk7CisgICAgICBmb3IgKExhYmVsVmFsdWUgdmFsdWUgOiBsYWJlbC5nZXRWYWx1ZXMoKSkgeworICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlLmZvcm1hdCgpKTsKKyAgICAgIH0KKyAgICAgIHJjLnNldFN0cmluZ0xpc3QoTEFCRUwsIG5hbWUsIEtFWV9WQUxVRSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICBmb3IgKFN0cmluZyBuYW1lIDogdG9VbnNldCkgeworICAgICAgcmMudW5zZXRTZWN0aW9uKExBQkVMLCBuYW1lKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIHZvaWQgc2F2ZUdyb3VwTGlzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgaWYgKGdyb3Vwc0J5VVVJRC5pc0VtcHR5KCkpIHsKICAgICAgIHNhdmVGaWxlKEdST1VQX0xJU1QsIG51bGwpOwpAQCAtNzM0LDE2ICs4OTQsNiBAQAogICAgIHNhdmVVVEY4KEdST1VQX0xJU1QsIGJ1Zi50b1N0cmluZygpKTsKICAgfQogCi0gIHByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKENvbmZpZyByYywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBuYW1lLAotICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHJjLmdldEJvb2xlYW4oc2VjdGlvbiwgbmFtZSwgZGVmYXVsdFZhbHVlKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXJyKSB7Ci0gICAgICBlcnJvcihuZXcgVmFsaWRhdGlvbkVycm9yKFBST0pFQ1RfQ09ORklHLCBlcnIuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgIH0KLSAgfQotCiAgIHByaXZhdGUgPEUgZXh0ZW5kcyBFbnVtPD8+PiBFIGdldEVudW0oQ29uZmlnIHJjLCBTdHJpbmcgc2VjdGlvbiwKICAgICAgIFN0cmluZyBzdWJzZWN0aW9uLCBTdHJpbmcgbmFtZSwgRSBkZWZhdWx0VmFsdWUpIHsKICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmViYXNlSWZOZWNlc3NhcnkuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlYmFzZUlmTmVjZXNzYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5MGVhMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlYmFzZUlmTmVjZXNzYXJ5LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlBhdGhDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlJlYmFzZUNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBSZWJhc2VJZk5lY2Vzc2FyeSBleHRlbmRzIFN1Ym1pdFN0cmF0ZWd5IHsKKworICBwcml2YXRlIGZpbmFsIFJlYmFzZUNoYW5nZSByZWJhc2VDaGFuZ2U7CisgIHByaXZhdGUgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gbmV3Q29tbWl0czsKKworICBSZWJhc2VJZk5lY2Vzc2FyeShmaW5hbCBTdWJtaXRTdHJhdGVneS5Bcmd1bWVudHMgYXJncywKKyAgICAgIGZpbmFsIFJlYmFzZUNoYW5nZSByZWJhc2VDaGFuZ2UpIHsKKyAgICBzdXBlcihhcmdzKTsKKyAgICB0aGlzLnJlYmFzZUNoYW5nZSA9IHJlYmFzZUNoYW5nZTsKKyAgICB0aGlzLm5ld0NvbW1pdHMgPSBuZXcgSGFzaE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIENvZGVSZXZpZXdDb21taXQgX3J1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIENvZGVSZXZpZXdDb21taXQgbmV3TWVyZ2VUaXAgPSBtZXJnZVRpcDsKKyAgICBzb3J0KHRvTWVyZ2UpOworCisgICAgd2hpbGUgKCF0b01lcmdlLmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gdG9NZXJnZS5yZW1vdmUoMCk7CisKKyAgICAgIGlmIChuZXdNZXJnZVRpcCA9PSBudWxsKSB7CisgICAgICAgIC8vIFRoZSBicmFuY2ggaXMgdW5ib3JuLiBUYWtlIGEgZmFzdC1mb3J3YXJkIHJlc29sdXRpb24gdG8KKyAgICAgICAgLy8gY3JlYXRlIHRoZSBicmFuY2guCisgICAgICAgIC8vCisgICAgICAgIG5ld01lcmdlVGlwID0gbjsKKyAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fTUVSR0U7CisKKyAgICAgIH0gZWxzZSBpZiAobi5nZXRQYXJlbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgLy8gUmVmdXNlIHRvIG1lcmdlIGEgcm9vdCBjb21taXQgaW50byBhbiBleGlzdGluZyBicmFuY2gsCisgICAgICAgIC8vIHdlIGNhbm5vdCBvYnRhaW4gYSBkZWx0YSBmb3IgdGhlIHJlYmFzZSB0byBhcHBseS4KKyAgICAgICAgLy8KKyAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0FOTk9UX1JFQkFTRV9ST09UOworCisgICAgICB9IGVsc2UgaWYgKG4uZ2V0UGFyZW50Q291bnQoKSA9PSAxKSB7CisgICAgICAgIGlmIChhcmdzLm1lcmdlVXRpbC5jYW5GYXN0Rm9yd2FyZCgKKyAgICAgICAgICAgIGFyZ3MubWVyZ2VTb3J0ZXIsIG5ld01lcmdlVGlwLCBhcmdzLnJ3LCBuKSkgeworICAgICAgICAgIG5ld01lcmdlVGlwID0gbjsKKyAgICAgICAgICBuLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBQYXRjaFNldCBuZXdQYXRjaFNldCA9CisgICAgICAgICAgICAgICAgcmViYXNlQ2hhbmdlLnJlYmFzZShhcmdzLnJlcG8sIGFyZ3MucncsIGFyZ3MuaW5zZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgIG4ucGF0Y2hzZXRJZCwgbi5jaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgIGFyZ3MubWVyZ2VVdGlsLmdldFN1Ym1pdHRlcihuLnBhdGNoc2V0SWQpLmdldEFjY291bnRJZCgpLAorICAgICAgICAgICAgICAgICAgICBuZXdNZXJnZVRpcCwgYXJncy5tZXJnZVV0aWwpOworICAgICAgICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXJncy5tZXJnZVV0aWwuZ2V0QXBwcm92YWxzRm9yQ29tbWl0KG4pKSB7CisgICAgICAgICAgICAgIGFwcHJvdmFscy5hZGQobmV3IFBhdGNoU2V0QXBwcm92YWwobmV3UGF0Y2hTZXQuZ2V0SWQoKSwgYSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncy5kYi5wYXRjaFNldEFwcHJvdmFscygpLmluc2VydChhcHByb3ZhbHMpOworICAgICAgICAgICAgbmV3TWVyZ2VUaXAgPQorICAgICAgICAgICAgICAgIChDb2RlUmV2aWV3Q29tbWl0KSBhcmdzLnJ3LnBhcnNlQ29tbWl0KE9iamVjdElkCisgICAgICAgICAgICAgICAgICAgIC5mcm9tU3RyaW5nKG5ld1BhdGNoU2V0LmdldFJldmlzaW9uKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG5ld01lcmdlVGlwLmNvcHlGcm9tKG4pOworICAgICAgICAgICAgbmV3TWVyZ2VUaXAucGF0Y2hzZXRJZCA9IG5ld1BhdGNoU2V0LmdldElkKCk7CisgICAgICAgICAgICBuZXdNZXJnZVRpcC5jaGFuZ2UgPQorICAgICAgICAgICAgICAgIGFyZ3MuZGIuY2hhbmdlcygpLmdldChuZXdQYXRjaFNldC5nZXRJZCgpLmdldFBhcmVudEtleSgpKTsKKyAgICAgICAgICAgIG5ld01lcmdlVGlwLnN0YXR1c0NvZGUgPSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9SRUJBU0U7CisgICAgICAgICAgICBuZXdDb21taXRzLnB1dChuZXdQYXRjaFNldC5nZXRJZCgpLmdldFBhcmVudEtleSgpLCBuZXdNZXJnZVRpcCk7CisgICAgICAgICAgICBzZXRSZWZMb2dJZGVudChhcmdzLm1lcmdlVXRpbC5nZXRTdWJtaXR0ZXIobi5wYXRjaHNldElkKSk7CisgICAgICAgICAgfSBjYXRjaCAoUGF0aENvbmZsaWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG4uc3RhdHVzQ29kZSA9IENvbW1pdE1lcmdlU3RhdHVzLlBBVEhfQ09ORkxJQ1Q7CisgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IHJlYmFzZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCByZWJhc2UgIiArIG4ubmFtZSgpLCBlKTsKKyAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCByZWJhc2UgIiArIG4ubmFtZSgpLCBlKTsKKyAgICAgICAgICB9IGNhdGNoIChJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ2Fubm90IHJlYmFzZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICB9IGVsc2UgaWYgKG4uZ2V0UGFyZW50Q291bnQoKSA+IDEpIHsKKyAgICAgICAgLy8gVGhlcmUgYXJlIG11bHRpcGxlIHBhcmVudHMsIHNvIHRoaXMgaXMgYSBtZXJnZSBjb21taXQuIFdlCisgICAgICAgIC8vIGRvbid0IHdhbnQgdG8gcmViYXNlIHRoZSBtZXJnZSBhcyBjbGllbnRzIGNhbid0IGVhc2lseQorICAgICAgICAvLyByZWJhc2UgdGhlaXIgaGlzdG9yeSB3aXRoIHRoYXQgbWVyZ2UgcHJlc2VudCBhbmQgcmVwbGFjZWQKKyAgICAgICAgLy8gYnkgYW4gZXF1aXZhbGVudCBtZXJnZSB3aXRoIGEgZGlmZmVyZW50IGZpcnN0IHBhcmVudC4gU28KKyAgICAgICAgLy8gaW5zdGVhZCBiZWhhdmUgYXMgdGhvdWdoIE1FUkdFX0lGX05FQ0VTU0FSWSB3YXMgY29uZmlndXJlZC4KKyAgICAgICAgLy8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBpZiAoYXJncy5ydy5pc01lcmdlZEludG8obmV3TWVyZ2VUaXAsIG4pKSB7CisgICAgICAgICAgICBuZXdNZXJnZVRpcCA9IG47CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld01lcmdlVGlwID0gYXJncy5tZXJnZVV0aWwubWVyZ2VPbmVDb21taXQoCisgICAgICAgICAgICAgICAgYXJncy5teUlkZW50LCBhcmdzLnJlcG8sIGFyZ3MucncsIGFyZ3MuaW5zZXJ0ZXIsCisgICAgICAgICAgICAgICAgYXJncy5jYW5NZXJnZUZsYWcsIGFyZ3MuZGVzdEJyYW5jaCwgbmV3TWVyZ2VUaXAsIG4pOworICAgICAgICAgIH0KKyAgICAgICAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIHN1Ym1pdEFwcHJvdmFsID0gYXJncy5tZXJnZVV0aWwubWFya0NsZWFuTWVyZ2VzKAorICAgICAgICAgICAgICBhcmdzLnJ3LCBhcmdzLmNhbk1lcmdlRmxhZywgbmV3TWVyZ2VUaXAsIGFyZ3MuYWxyZWFkeUFjY2VwdGVkKTsKKyAgICAgICAgICBzZXRSZWZMb2dJZGVudChzdWJtaXRBcHByb3ZhbCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgTWVyZ2VFeGNlcHRpb24oIkNhbm5vdCBtZXJnZSAiICsgbi5uYW1lKCksIGUpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGFyZ3MuYWxyZWFkeUFjY2VwdGVkLmFkZChuZXdNZXJnZVRpcCk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld01lcmdlVGlwOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNvcnQoZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b1NvcnQpIHRocm93cyBNZXJnZUV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gc29ydGVkID0KKyAgICAgICAgICBuZXcgUmViYXNlU29ydGVyKGFyZ3MucncsIGFyZ3MuYWxyZWFkeUFjY2VwdGVkLCBhcmdzLmNhbk1lcmdlRmxhZykKKyAgICAgICAgICAgICAgLnNvcnQodG9Tb3J0KTsKKyAgICAgIHRvU29ydC5jbGVhcigpOworICAgICAgdG9Tb3J0LmFkZEFsbChzb3J0ZWQpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbigiQ29tbWl0IHNvcnRpbmcgZmFpbGVkIiwgZSk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNYXA8Q2hhbmdlLklkLCBDb2RlUmV2aWV3Q29tbWl0PiBnZXROZXdDb21taXRzKCkgeworICAgIHJldHVybiBuZXdDb21taXRzOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGRyeVJ1bihmaW5hbCBDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb24geworICAgIHJldHVybiAhYXJncy5tZXJnZVV0aWwuaGFzTWlzc2luZ0RlcGVuZGVuY2llcyhhcmdzLm1lcmdlU29ydGVyLCB0b01lcmdlKQorICAgICAgICAmJiBhcmdzLm1lcmdlVXRpbC5jYW5DaGVycnlQaWNrKGFyZ3MubWVyZ2VTb3J0ZXIsIGFyZ3MucmVwbywgbWVyZ2VUaXAsCisgICAgICAgICAgICBhcmdzLnJ3LCB0b01lcmdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmViYXNlU29ydGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWJhc2VTb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE5MjliCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmViYXNlU29ydGVyLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZGbGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworY2xhc3MgUmViYXNlU29ydGVyIHsKKworICBwcml2YXRlIGZpbmFsIFJldldhbGsgcnc7CisgIHByaXZhdGUgZmluYWwgUmV2RmxhZyBjYW5NZXJnZUZsYWc7CisgIHByaXZhdGUgZmluYWwgU2V0PFJldkNvbW1pdD4gYWNjZXB0ZWQ7CisKKyAgUmViYXNlU29ydGVyKGZpbmFsIFJldldhbGsgcncsIGZpbmFsIFNldDxSZXZDb21taXQ+IGFscmVhZHlBY2NlcHRlZCwKKyAgICAgIGZpbmFsIFJldkZsYWcgY2FuTWVyZ2VGbGFnKSB7CisgICAgdGhpcy5ydyA9IHJ3OworICAgIHRoaXMuY2FuTWVyZ2VGbGFnID0gY2FuTWVyZ2VGbGFnOworICAgIHRoaXMuYWNjZXB0ZWQgPSBhbHJlYWR5QWNjZXB0ZWQ7CisgIH0KKworICBMaXN0PENvZGVSZXZpZXdDb21taXQ+IHNvcnQoQ29sbGVjdGlvbjxDb2RlUmV2aWV3Q29tbWl0PiBpbmNvbWluZykKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgZmluYWwgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0PENvZGVSZXZpZXdDb21taXQ+KCk7CisgICAgZmluYWwgU2V0PENvZGVSZXZpZXdDb21taXQ+IHNvcnQgPSBuZXcgSGFzaFNldDxDb2RlUmV2aWV3Q29tbWl0PihpbmNvbWluZyk7CisgICAgd2hpbGUgKCFzb3J0LmlzRW1wdHkoKSkgeworICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBuID0gcmVtb3ZlT25lKHNvcnQpOworCisgICAgICBydy5yZXNldFJldGFpbihjYW5NZXJnZUZsYWcpOworICAgICAgcncubWFya1N0YXJ0KG4pOworICAgICAgZm9yIChSZXZDb21taXQgYyA6IGFjY2VwdGVkKSB7CisgICAgICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKGMpOworICAgICAgfQorCisgICAgICBDb2RlUmV2aWV3Q29tbWl0IGM7CisgICAgICBmaW5hbCBMaXN0PENvZGVSZXZpZXdDb21taXQ+IGNvbnRlbnRzID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOworICAgICAgd2hpbGUgKChjID0gKENvZGVSZXZpZXdDb21taXQpIHJ3Lm5leHQoKSkgIT0gbnVsbCkgeworICAgICAgICBpZiAoIWMuaGFzKGNhbk1lcmdlRmxhZykgfHwgIWluY29taW5nLmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgLy8gV2UgY2Fubm90IG1lcmdlIG4gYXMgaXQgd291bGQgYnJpbmcgc29tZXRoaW5nIHdlCisgICAgICAgICAgLy8gYXJlbid0IHBlcm1pdHRlZCB0byBtZXJnZSBhdCB0aGlzIHRpbWUuIERyb3Agbi4KKyAgICAgICAgICAvLworICAgICAgICAgIGlmIChuLm1pc3NpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgbi5zdGF0dXNDb2RlID0gQ29tbWl0TWVyZ2VTdGF0dXMuTUlTU0lOR19ERVBFTkRFTkNZOworICAgICAgICAgICAgbi5taXNzaW5nID0gbmV3IEFycmF5TGlzdDxDb2RlUmV2aWV3Q29tbWl0PigpOworICAgICAgICAgIH0KKyAgICAgICAgICBuLm1pc3NpbmcuYWRkKChDb2RlUmV2aWV3Q29tbWl0KSBjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb250ZW50cy5hZGQoYyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKG4uc3RhdHVzQ29kZSA9PSBDb21taXRNZXJnZVN0YXR1cy5NSVNTSU5HX0RFUEVOREVOQ1kpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHNvcnQucmVtb3ZlQWxsKGNvbnRlbnRzKTsKKyAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoY29udGVudHMpOworICAgICAgc29ydGVkLnJlbW92ZUFsbChjb250ZW50cyk7CisgICAgICBzb3J0ZWQuYWRkQWxsKGNvbnRlbnRzKTsKKyAgICB9CisgICAgcmV0dXJuIHNvcnRlZDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIDxUPiBUIHJlbW92ZU9uZShmaW5hbCBDb2xsZWN0aW9uPFQ+IGMpIHsKKyAgICBmaW5hbCBJdGVyYXRvcjxUPiBpID0gYy5pdGVyYXRvcigpOworICAgIGZpbmFsIFQgciA9IGkubmV4dCgpOworICAgIGkucmVtb3ZlKCk7CisgICAgcmV0dXJuIHI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWNlaXZlQ29tbWl0cy5qYXZhCmluZGV4IGEyYTgwOWIuLmJjYzMwMTQ0IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWNlaXZlQ29tbWl0cy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzLmphdmEKQEAgLTE0LDMzICsxNCw0NCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfSEVBRFM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2UuSU5JVElBTF9QQVRDSF9TRVRfSUQ7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTXVsdGlQcm9ncmVzc01vbml0b3IuVU5LTk9XTjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuTWFpbFV0aWwuZ2V0UmVjaXBpZW50c0Zyb21BcHByb3ZhbHM7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1haWxVdGlsLmdldFJlY2lwaWVudHNGcm9tRm9vdGVyczsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQuUmVzdWx0Lk5PVF9BVFRFTVBURUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlY2VpdmVDb21tYW5kLlJlc3VsdC5PSzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZUNvbW1hbmQuUmVzdWx0LlJFSkVDVEVEX01JU1NJTkdfT0JKRUNUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQuUkVKRUNURURfTk9ORkFTVEZPUldBUkQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlY2VpdmVDb21tYW5kLlJlc3VsdC5SRUpFQ1RFRF9PVEhFUl9SRUFTT047CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSGFzaE11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkTGlzdE11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0TXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5DaGVja2VkRnV0dXJlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5hYmxlRnV0dXJlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tSdW5uZXIuSG9va1Jlc3VsdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlBhZ2VMaW5rczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5DYXBhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hBY2NvdW50RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QW5jZXN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKQEAgLTUxLDEyICs2MiwxOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQ2hhbmdlSW5zZXJ0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5UcmFja2luZ0Zvb3RlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5Db21taXRSZWNlaXZlZEV2ZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTXVsdGlQcm9ncmVzc01vbml0b3IuVGFzazsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnMuQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC52YWxpZGF0b3JzLkNvbW1pdFZhbGlkYXRvcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuQ3JlYXRlQ2hhbmdlU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1haWxVdGlsLk1haWxSZWNpcGllbnRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLk1lcmdlZFNlbmRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5SZXBsYWNlUGF0Y2hTZXRTZW5kZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoU2V0SW5mb0ZhY3Rvcnk7CkBAIC02NSwxNyArODIsMTkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0U3RhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUmVmQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuTWFnaWNCcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuUmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC51dGlsLmNsaS5DbWRMaW5lUGFyc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5BdG9taWNVcGRhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BYmJyZXZpYXRlZE9iamVjdElkOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkJhdGNoUmVmVXBkYXRlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKQEAgLTkzLDEzICsxMTIsMTggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyLlJldkZpbHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5BZHZlcnRpc2VSZWZzSG9vazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5BZHZlcnRpc2VSZWZzSG9va0NoYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkJhc2VSZWNlaXZlUGFjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVjZWl2ZVBhY2s7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFjazsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMTA5LDYgKzEzMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCkBAIC0xMTksMTEgKzE0NCw5IEBACiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQogICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVjZWl2ZUNvbW1pdHMuY2xhc3MpOwogCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gTkVXX1BBVENIU0VUID0KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIE5FV19QQVRDSFNFVCA9CiAgICAgICBQYXR0ZXJuLmNvbXBpbGUoIl5yZWZzL2NoYW5nZXMvKD86WzAtOV1bMC05XS8pPyhbMS05XVswLTldKikoPzovbmV3KT8kIik7CiAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IFJFVklFV0VEX0JZID0gbmV3IEZvb3RlcktleSgiUmV2aWV3ZWQtYnkiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9vdGVyS2V5IFRFU1RFRF9CWSA9IG5ldyBGb290ZXJLZXkoIlRlc3RlZC1ieSIpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGb290ZXJLZXkgQ0hBTkdFX0lEID0gbmV3IEZvb3RlcktleSgiQ2hhbmdlLUlkIik7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfUkVKRUNUSU9OX01FU1NBR0VfRk9PVEVSID0KQEAgLTEzOCw2ICsxNjEsNyBAQAogICAgICAgICArICJUbyBwdXNoIGludG8gdGhpcyByZWZlcmVuY2UgeW91IG5lZWQgJ1B1c2gnIHJpZ2h0cy4iKSwKICAgICAgICAgREVMRVRFKCJZb3UgbmVlZCAnUHVzaCcgcmlnaHRzIHdpdGggdGhlICdGb3JjZSBQdXNoJ1xuIgogICAgICAgICAgICAgKyAiZmxhZyBzZXQgdG8gZGVsZXRlIHJlZmVyZW5jZXMuIiksCisgICAgICAgIERFTEVURV9DSEFOR0VTKCJDYW5ub3QgZGVsZXRlIGZyb20gJ3JlZnMvY2hhbmdlcyciKSwKICAgICAgICAgQ09ERV9SRVZJRVcoIllvdSBuZWVkICdQdXNoJyByaWdodHMgdG8gdXBsb2FkIGNvZGUgcmV2aWV3IHJlcXVlc3RzLlxuIgogICAgICAgICAgICAgKyAiVmVyaWZ5IHRoYXQgeW91IGFyZSBwdXNoaW5nIHRvIHRoZSByaWdodCBicmFuY2guIik7CiAKQEAgLTE5OSw2MSArMjIzLDY3IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVzc2FnZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFcnJvcjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVuY3Rpb248RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24+IE9STV9FWENFUFRJT04gPQorICAgICAgbmV3IEZ1bmN0aW9uPEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPcm1FeGNlcHRpb24gYXBwbHkoRXhjZXB0aW9uIGlucHV0KSB7CisgICAgICAgICAgaWYgKGlucHV0IGluc3RhbmNlb2YgT3JtRXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gKE9ybUV4Y2VwdGlvbikgaW5wdXQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBuZXcgT3JtRXhjZXB0aW9uKCJFcnJvciB1cGRhdGluZyBkYXRhYmFzZSIsIGlucHV0KTsKKyAgICAgICAgfQorICAgICAgfTsKIAotICAgIHByaXZhdGUgTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgYm9vbGVhbiBpc0Vycm9yKSB7Ci0gICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICAgdGhpcy5pc0Vycm9yID0gaXNFcnJvcjsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50LklkPiByZXZpZXdlcklkID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKLSAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gY2NJZCA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7CisgIHByaXZhdGUgU2V0PEFjY291bnQuSWQ+IHJldmlld2Vyc0Zyb21Db21tYW5kTGluZSA9IFNldHMubmV3TGlua2VkSGFzaFNldCgpOworICBwcml2YXRlIFNldDxBY2NvdW50LklkPiBjY0Zyb21Db21tYW5kTGluZSA9IFNldHMubmV3TGlua2VkSGFzaFNldCgpOwogCiAgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7CiAgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyOworICBwcml2YXRlIGZpbmFsIENtZExpbmVQYXJzZXIuRmFjdG9yeSBvcHRpb25QYXJzZXJGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIENyZWF0ZUNoYW5nZVNlbmRlci5GYWN0b3J5IGNyZWF0ZUNoYW5nZVNlbmRlckZhY3Rvcnk7CiAgIHByaXZhdGUgZmluYWwgTWVyZ2VkU2VuZGVyLkZhY3RvcnkgbWVyZ2VkU2VuZGVyRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBSZXBsYWNlUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeSByZXBsYWNlUGF0Y2hTZXRGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb247CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOwogICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VIb29rcyBob29rczsKICAgcHJpdmF0ZSBmaW5hbCBBcHByb3ZhbHNVdGlsIGFwcHJvdmFsc1V0aWw7CiAgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CiAgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsOwotICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IGdlcnJpdElkZW50OworICBwcml2YXRlIGZpbmFsIENvbW1pdFZhbGlkYXRvcnMuRmFjdG9yeSBjb21taXRWYWxpZGF0b3JzRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBUcmFja2luZ0Zvb3RlcnMgdHJhY2tpbmdGb290ZXJzOwogICBwcml2YXRlIGZpbmFsIFRhZ0NhY2hlIHRhZ0NhY2hlOworICBwcml2YXRlIGZpbmFsIENoYW5nZUluc2VydGVyIGNoYW5nZUluc2VydGVyOwogICBwcml2YXRlIGZpbmFsIFdvcmtRdWV1ZSB3b3JrUXVldWU7CisgIHByaXZhdGUgZmluYWwgTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlIGNoYW5nZVVwZGF0ZUV4ZWN0b3I7CiAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFNjb3BlUHJvcGFnYXRvciByZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOworICBwcml2YXRlIGZpbmFsIFNzaEluZm8gc3NoSW5mbzsKICAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lOworICBwcml2YXRlIGZpbmFsIFJlY2VpdmVDb25maWcgcmVjZWl2ZUNvbmZpZzsKIAogICBwcml2YXRlIGZpbmFsIFByb2plY3RDb250cm9sIHByb2plY3RDb250cm9sOwogICBwcml2YXRlIGZpbmFsIFByb2plY3QgcHJvamVjdDsKKyAgcHJpdmF0ZSBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXM7CiAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOwogICBwcml2YXRlIGZpbmFsIFJlY2VpdmVQYWNrIHJwOwogICBwcml2YXRlIGZpbmFsIE5vdGVNYXAgcmVqZWN0Q29tbWl0czsKLSAgcHJpdmF0ZSBSZWNlaXZlQ29tbWFuZCBuZXdDaGFuZ2U7Ci0gIHByaXZhdGUgQnJhbmNoLk5hbWVLZXkgZGVzdEJyYW5jaDsKLSAgcHJpdmF0ZSBSZWZDb250cm9sIGRlc3RCcmFuY2hDdGw7CisgIHByaXZhdGUgTWFnaWNCcmFuY2hJbnB1dCBtYWdpY0JyYW5jaDsKIAogICBwcml2YXRlIExpc3Q8Q3JlYXRlUmVxdWVzdD4gbmV3Q2hhbmdlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogICBwcml2YXRlIGZpbmFsIE1hcDxDaGFuZ2UuSWQsIFJlcGxhY2VSZXF1ZXN0PiByZXBsYWNlQnlDaGFuZ2UgPQogICAgICAgbmV3IEhhc2hNYXA8Q2hhbmdlLklkLCBSZXBsYWNlUmVxdWVzdD4oKTsKICAgcHJpdmF0ZSBmaW5hbCBNYXA8UmV2Q29tbWl0LCBSZXBsYWNlUmVxdWVzdD4gcmVwbGFjZUJ5Q29tbWl0ID0KICAgICAgIG5ldyBIYXNoTWFwPFJldkNvbW1pdCwgUmVwbGFjZVJlcXVlc3Q+KCk7CisgIHByaXZhdGUgZmluYWwgU2V0PFJldkNvbW1pdD4gdmFsaWRDb21taXRzID0gbmV3IEhhc2hTZXQ8UmV2Q29tbWl0PigpOwogCi0gIHByaXZhdGUgTWFwPE9iamVjdElkLCBSZWY+IHJlZnNCeUlkOwotCi0gIHByaXZhdGUgU3RyaW5nIGRlc3RUb3BpY05hbWU7CisgIHByaXZhdGUgU2V0TXVsdGltYXA8T2JqZWN0SWQsIFJlZj4gcmVmc0J5SWQ7CisgIHByaXZhdGUgTWFwPFN0cmluZywgUmVmPiBhbGxSZWZzOwogCiAgIHByaXZhdGUgZmluYWwgU3VibW9kdWxlT3AuRmFjdG9yeSBzdWJPcEZhY3Rvcnk7CiAKLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxNZXNzYWdlPigpOworICBwcml2YXRlIGZpbmFsIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4oKTsKICAgcHJpdmF0ZSBMaXN0TXVsdGltYXA8RXJyb3IsIFN0cmluZz4gZXJyb3JzID0gTGlua2VkTGlzdE11bHRpbWFwLmNyZWF0ZSgpOwogICBwcml2YXRlIFRhc2sgbmV3UHJvZ3Jlc3M7CiAgIHByaXZhdGUgVGFzayByZXBsYWNlUHJvZ3Jlc3M7CkBAIC0yNjQsNDggKzI5NCw2MiBAQAogCiAgIEBJbmplY3QKICAgUmVjZWl2ZUNvbW1pdHMoZmluYWwgUmV2aWV3RGIgZGIsCisgICAgICBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWFGYWN0b3J5LAogICAgICAgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlciwKKyAgICAgIGZpbmFsIENtZExpbmVQYXJzZXIuRmFjdG9yeSBvcHRpb25QYXJzZXJGYWN0b3J5LAogICAgICAgZmluYWwgQ3JlYXRlQ2hhbmdlU2VuZGVyLkZhY3RvcnkgY3JlYXRlQ2hhbmdlU2VuZGVyRmFjdG9yeSwKICAgICAgIGZpbmFsIE1lcmdlZFNlbmRlci5GYWN0b3J5IG1lcmdlZFNlbmRlckZhY3RvcnksCiAgICAgICBmaW5hbCBSZXBsYWNlUGF0Y2hTZXRTZW5kZXIuRmFjdG9yeSByZXBsYWNlUGF0Y2hTZXRGYWN0b3J5LAotICAgICAgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZXBsaWNhdGlvbiwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwKICAgICAgIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwKICAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLAogICAgICAgZmluYWwgQXBwcm92YWxzVXRpbCBhcHByb3ZhbHNVdGlsLAogICAgICAgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZSwKICAgICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAogICAgICAgZmluYWwgVGFnQ2FjaGUgdGFnQ2FjaGUsCisgICAgICBmaW5hbCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZSwKKyAgICAgIGZpbmFsIENoYW5nZUluc2VydGVyIGNoYW5nZUluc2VydGVyLAorICAgICAgZmluYWwgQ29tbWl0VmFsaWRhdG9ycy5GYWN0b3J5IGNvbW1pdFZhbGlkYXRvcnNGYWN0b3J5LAogICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybCwKICAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudCwKICAgICAgIGZpbmFsIFRyYWNraW5nRm9vdGVycyB0cmFja2luZ0Zvb3RlcnMsCiAgICAgICBmaW5hbCBXb3JrUXVldWUgd29ya1F1ZXVlLAorICAgICAgQENoYW5nZVVwZGF0ZUV4ZWN1dG9yIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZSBjaGFuZ2VVcGRhdGVFeGVjdG9yLAogICAgICAgZmluYWwgUmVxdWVzdFNjb3BlUHJvcGFnYXRvciByZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLAorICAgICAgZmluYWwgU3NoSW5mbyBzc2hJbmZvLAogICAgICAgZmluYWwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZSwKLQorICAgICAgUmVjZWl2ZUNvbmZpZyBjb25maWcsCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wsCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgUmVwb3NpdG9yeSByZXBvLAogICAgICAgZmluYWwgU3VibW9kdWxlT3AuRmFjdG9yeSBzdWJPcEZhY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgdGhpcy5jdXJyZW50VXNlciA9IChJZGVudGlmaWVkVXNlcikgcHJvamVjdENvbnRyb2wuZ2V0Q3VycmVudFVzZXIoKTsKICAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5zY2hlbWFGYWN0b3J5ID0gc2NoZW1hRmFjdG9yeTsKICAgICB0aGlzLmFjY291bnRSZXNvbHZlciA9IGFjY291bnRSZXNvbHZlcjsKKyAgICB0aGlzLm9wdGlvblBhcnNlckZhY3RvcnkgPSBvcHRpb25QYXJzZXJGYWN0b3J5OwogICAgIHRoaXMuY3JlYXRlQ2hhbmdlU2VuZGVyRmFjdG9yeSA9IGNyZWF0ZUNoYW5nZVNlbmRlckZhY3Rvcnk7CiAgICAgdGhpcy5tZXJnZWRTZW5kZXJGYWN0b3J5ID0gbWVyZ2VkU2VuZGVyRmFjdG9yeTsKICAgICB0aGlzLnJlcGxhY2VQYXRjaFNldEZhY3RvcnkgPSByZXBsYWNlUGF0Y2hTZXRGYWN0b3J5OwotICAgIHRoaXMucmVwbGljYXRpb24gPSByZXBsaWNhdGlvbjsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOwogICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7CiAgICAgdGhpcy5ob29rcyA9IGhvb2tzOwogICAgIHRoaXMuYXBwcm92YWxzVXRpbCA9IGFwcHJvdmFsc1V0aWw7CiAgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwcm9qZWN0Q2FjaGU7CiAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwogICAgIHRoaXMuY2Fub25pY2FsV2ViVXJsID0gY2Fub25pY2FsV2ViVXJsOwotICAgIHRoaXMuZ2Vycml0SWRlbnQgPSBnZXJyaXRJZGVudDsKICAgICB0aGlzLnRyYWNraW5nRm9vdGVycyA9IHRyYWNraW5nRm9vdGVyczsKICAgICB0aGlzLnRhZ0NhY2hlID0gdGFnQ2FjaGU7CisgICAgdGhpcy5jaGFuZ2VJbnNlcnRlciA9IGNoYW5nZUluc2VydGVyOworICAgIHRoaXMuY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnkgPSBjb21taXRWYWxpZGF0b3JzRmFjdG9yeTsKICAgICB0aGlzLndvcmtRdWV1ZSA9IHdvcmtRdWV1ZTsKKyAgICB0aGlzLmNoYW5nZVVwZGF0ZUV4ZWN0b3IgPSBjaGFuZ2VVcGRhdGVFeGVjdG9yOwogICAgIHRoaXMucmVxdWVzdFNjb3BlUHJvcGFnYXRvciA9IHJlcXVlc3RTY29wZVByb3BhZ2F0b3I7CisgICAgdGhpcy5zc2hJbmZvID0gc3NoSW5mbzsKICAgICB0aGlzLmFsbFByb2plY3RzTmFtZSA9IGFsbFByb2plY3RzTmFtZTsKKyAgICB0aGlzLnJlY2VpdmVDb25maWcgPSBjb25maWc7CiAKICAgICB0aGlzLnByb2plY3RDb250cm9sID0gcHJvamVjdENvbnRyb2w7CisgICAgdGhpcy5sYWJlbFR5cGVzID0gcHJvamVjdENvbnRyb2wuZ2V0TGFiZWxUeXBlcygpOwogICAgIHRoaXMucHJvamVjdCA9IHByb2plY3RDb250cm9sLmdldFByb2plY3QoKTsKICAgICB0aGlzLnJlcG8gPSByZXBvOwogICAgIHRoaXMucnAgPSBuZXcgUmVjZWl2ZVBhY2socmVwbyk7CkBAIC0zMjEsMTAgKzM2NSwyNCBAQAogICAgIHJwLnNldENoZWNrUmVjZWl2ZWRPYmplY3RzKHRydWUpOwogCiAgICAgaWYgKCFwcm9qZWN0Q29udHJvbC5hbGxSZWZzQXJlVmlzaWJsZSgpKSB7Ci0gICAgICBycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwotICAgICAgcnAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IFZpc2libGVSZWZGaWx0ZXIodGFnQ2FjaGUsIHJlcG8sIHByb2plY3RDb250cm9sLCBkYiwgZmFsc2UpKTsKKyAgICAgIHJwLnNldENoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUoY29uZmlnLmNoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUpOworICAgICAgcnAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IFZpc2libGVSZWZGaWx0ZXIodGFnQ2FjaGUsIGNoYW5nZUNhY2hlLCByZXBvLCBwcm9qZWN0Q29udHJvbCwgZGIsIGZhbHNlKSk7CiAgICAgfQotICAgIExpc3Q8QWR2ZXJ0aXNlUmVmc0hvb2s+IGFkdkhvb2tzID0gbmV3IEFycmF5TGlzdDxBZHZlcnRpc2VSZWZzSG9vaz4oMik7CisgICAgTGlzdDxBZHZlcnRpc2VSZWZzSG9vaz4gYWR2SG9va3MgPSBuZXcgQXJyYXlMaXN0PEFkdmVydGlzZVJlZnNIb29rPigzKTsKKyAgICBhZHZIb29rcy5hZGQobmV3IEFkdmVydGlzZVJlZnNIb29rKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBhZHZlcnRpc2VSZWZzKEJhc2VSZWNlaXZlUGFjayBycCkgeworICAgICAgICBhbGxSZWZzID0gcnAuZ2V0QWR2ZXJ0aXNlZFJlZnMoKTsKKyAgICAgICAgaWYgKGFsbFJlZnMgPT0gbnVsbCkgeworICAgICAgICAgIGFsbFJlZnMgPSBycC5nZXRSZXBvc2l0b3J5KCkuZ2V0QWxsUmVmcygpOworICAgICAgICB9CisgICAgICAgIHJwLnNldEFkdmVydGlzZWRSZWZzKGFsbFJlZnMsIHJwLmdldEFkdmVydGlzZWRPYmplY3RzKCkpOworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIGFkdmVydGlzZVJlZnMoVXBsb2FkUGFjayB1cGxvYWRQYWNrKSB7CisgICAgICB9CisgICAgfSk7CiAgICAgYWR2SG9va3MuYWRkKHJwLmdldEFkdmVydGlzZVJlZnNIb29rKCkpOwogICAgIGFkdkhvb2tzLmFkZChuZXcgUmVjZWl2ZUNvbW1pdHNBZHZlcnRpc2VSZWZzSG9vaygpKTsKICAgICBycC5zZXRBZHZlcnRpc2VSZWZzSG9vayhBZHZlcnRpc2VSZWZzSG9va0NoYWluLm5ld0NoYWluKGFkdkhvb2tzKSk7CkBAIC0zMzIsMTIgKzM5MCwxMiBAQAogCiAgIC8qKiBBZGQgcmV2aWV3ZXJzIGZvciBuZXcgKG9yIHVwZGF0ZWQpIGNoYW5nZXMuICovCiAgIHB1YmxpYyB2b2lkIGFkZFJldmlld2VycyhDb2xsZWN0aW9uPEFjY291bnQuSWQ+IHdobykgewotICAgIHJldmlld2VySWQuYWRkQWxsKHdobyk7CisgICAgcmV2aWV3ZXJzRnJvbUNvbW1hbmRMaW5lLmFkZEFsbCh3aG8pOwogICB9CiAKICAgLyoqIEFkZCByZXZpZXdlcnMgZm9yIG5ldyAob3IgdXBkYXRlZCkgY2hhbmdlcy4gKi8KICAgcHVibGljIHZvaWQgYWRkRXh0cmFDQyhDb2xsZWN0aW9uPEFjY291bnQuSWQ+IHdobykgewotICAgIGNjSWQuYWRkQWxsKHdobyk7CisgICAgY2NGcm9tQ29tbWFuZExpbmUuYWRkQWxsKHdobyk7CiAgIH0KIAogICAvKiogU2V0IGEgbWVzc2FnZSBzZW5kZXIgZm9yIHRoaXMgb3BlcmF0aW9uLiAqLwpAQCAtNDQxLDI0ICs0OTksMjYgQEAKICAgICBpZiAocmVzdWx0ICE9IENhcGFibGUuT0spIHsKICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQotCi0gICAgcmV0dXJuIE1hZ2ljQnJhbmNoLmNoZWNrTWFnaWNCcmFuY2hSZWZzKHJlcG8sIHByb2plY3QpOworICAgIGlmIChyZWNlaXZlQ29uZmlnLmNoZWNrTWFnaWNSZWZzKSB7CisgICAgICByZXN1bHQgPSBNYWdpY0JyYW5jaC5jaGVja01hZ2ljQnJhbmNoUmVmcyhyZXBvLCBwcm9qZWN0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBhZGRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZXMuYWRkKG5ldyBNZXNzYWdlKG1lc3NhZ2UsIGZhbHNlKSk7CisgICAgbWVzc2FnZXMuYWRkKG5ldyBDb21taXRWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBmYWxzZSkpOwogICB9CiAKICAgdm9pZCBhZGRFcnJvcihTdHJpbmcgZXJyb3IpIHsKLSAgICBtZXNzYWdlcy5hZGQobmV3IE1lc3NhZ2UoZXJyb3IsIHRydWUpKTsKKyAgICBtZXNzYWdlcy5hZGQobmV3IENvbW1pdFZhbGlkYXRpb25NZXNzYWdlKGVycm9yLCB0cnVlKSk7CiAgIH0KIAogICB2b2lkIHNlbmRNZXNzYWdlcygpIHsKLSAgICBmb3IgKE1lc3NhZ2UgbSA6IG1lc3NhZ2VzKSB7Ci0gICAgICBpZiAobS5pc0Vycm9yKSB7Ci0gICAgICAgIG1lc3NhZ2VTZW5kZXIuc2VuZEVycm9yKG0ubWVzc2FnZSk7CisgICAgZm9yIChDb21taXRWYWxpZGF0aW9uTWVzc2FnZSBtIDogbWVzc2FnZXMpIHsKKyAgICAgIGlmIChtLmlzRXJyb3IoKSkgeworICAgICAgICBtZXNzYWdlU2VuZGVyLnNlbmRFcnJvcihtLmdldE1lc3NhZ2UoKSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBtZXNzYWdlU2VuZGVyLnNlbmRNZXNzYWdlKG0ubWVzc2FnZSk7CisgICAgICAgIG1lc3NhZ2VTZW5kZXIuc2VuZE1lc3NhZ2UobS5nZXRNZXNzYWdlKCkpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNDc1LDcgKzUzNSw3IEBACiAgICAgYmF0Y2guc2V0UmVmTG9nTWVzc2FnZSgicHVzaCIsIHRydWUpOwogCiAgICAgcGFyc2VDb21tYW5kcyhjb21tYW5kcyk7Ci0gICAgaWYgKG5ld0NoYW5nZSAhPSBudWxsICYmIG5ld0NoYW5nZS5nZXRSZXN1bHQoKSA9PSBOT1RfQVRURU1QVEVEKSB7CisgICAgaWYgKG1hZ2ljQnJhbmNoICE9IG51bGwgJiYgbWFnaWNCcmFuY2guY21kLmdldFJlc3VsdCgpID09IE5PVF9BVFRFTVBURUQpIHsKICAgICAgIG5ld0NoYW5nZXMgPSBzZWxlY3ROZXdDaGFuZ2VzKCk7CiAgICAgfQogICAgIHByZXBhcmVQYXRjaFNldHNGb3JSZXBsYWNlKCk7CkBAIC01MzIsNiArNTkyLDkgQEAKICAgICAgICAgICAgICAgYXV0b0Nsb3NlQ2hhbmdlcyhjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBERUxFVEU6CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc0NvbmZpZyhjKSkgewpAQCAtNTQyLDEwICs2MDUsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghTWFnaWNCcmFuY2guaXNNYWdpY0JyYW5jaChjLmdldFJlZk5hbWUoKSkpIHsKLSAgICAgICAgICAvLyBXZSBvbmx5IHNjaGVkdWxlIGRpcmVjdCByZWZzIHVwZGF0ZXMgZm9yIHJlcGxpY2F0aW9uLgotICAgICAgICAgIC8vIENoYW5nZSByZWZzIGFyZSBzY2hlZHVsZWQgd2hlbiB0aGV5IGFyZSBjcmVhdGVkLgorICAgICAgICAgIC8vIFdlIG9ubHkgZmlyZSBnaXRSZWZVcGRhdGVkIGZvciBkaXJlY3QgcmVmcyB1cGRhdGVzLgorICAgICAgICAgIC8vIEV2ZW50cyBmb3IgY2hhbmdlIHJlZnMgYXJlIGZpcmVkIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4KICAgICAgICAgICAvLwotICAgICAgICAgIHJlcGxpY2F0aW9uLmZpcmUocHJvamVjdC5nZXROYW1lS2V5KCksIGMuZ2V0UmVmTmFtZSgpKTsKKyAgICAgICAgICBnaXRSZWZVcGRhdGVkLmZpcmUocHJvamVjdC5nZXROYW1lS2V5KCksIGMuZ2V0UmVmTmFtZSgpLAorICAgICAgICAgICAgICBjLmdldE9sZElkKCksIGMuZ2V0TmV3SWQoKSk7CiAgICAgICAgICAgaG9va3MuZG9SZWZVcGRhdGVkSG9vaygKICAgICAgICAgICAgICAgbmV3IEJyYW5jaC5OYW1lS2V5KHByb2plY3QuZ2V0TmFtZUtleSgpLCBjLmdldFJlZk5hbWUoKSksCiAgICAgICAgICAgICAgIGMuZ2V0T2xkSWQoKSwKQEAgLTU4Nyw4ICs2NTEsOSBAQAogICAgIGludCByZXBsYWNlQ291bnQgPSAwOwogICAgIGludCBva1RvSW5zZXJ0ID0gMDsKIAotICAgIGZvciAoUmVwbGFjZVJlcXVlc3QgcmVwbGFjZSA6IHJlcGxhY2VCeUNoYW5nZS52YWx1ZXMoKSkgewotICAgICAgaWYgKHJlcGxhY2UuaW5wdXRDb21tYW5kID09IG5ld0NoYW5nZSkgeworICAgIGZvciAoTWFwLkVudHJ5PENoYW5nZS5JZCwgUmVwbGFjZVJlcXVlc3Q+IGUgOiByZXBsYWNlQnlDaGFuZ2UuZW50cnlTZXQoKSkgeworICAgICAgUmVwbGFjZVJlcXVlc3QgcmVwbGFjZSA9IGUuZ2V0VmFsdWUoKTsKKyAgICAgIGlmIChtYWdpY0JyYW5jaCAhPSBudWxsICYmIHJlcGxhY2UuaW5wdXRDb21tYW5kID09IG1hZ2ljQnJhbmNoLmNtZCkgewogICAgICAgICByZXBsYWNlQ291bnQrKzsKIAogICAgICAgICBpZiAocmVwbGFjZS5jbWQgIT0gbnVsbCAmJiByZXBsYWNlLmNtZC5nZXRSZXN1bHQoKSA9PSBPSykgewpAQCAtNTk2LDI2ICs2NjEsMjYgQEAKICAgICAgICAgfQogICAgICAgfSBlbHNlIGlmIChyZXBsYWNlLmNtZCAhPSBudWxsICYmIHJlcGxhY2UuY21kLmdldFJlc3VsdCgpID09IE9LKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKHJlcGxhY2UuaW5zZXJ0UGF0Y2hTZXQoKSAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKHJlcGxhY2UuaW5zZXJ0UGF0Y2hTZXQoKS5jaGVja2VkR2V0KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVwbGFjZS5pbnB1dENvbW1hbmQuc2V0UmVzdWx0KE9LKTsKICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewogICAgICAgICAgIHJlamVjdChyZXBsYWNlLmlucHV0Q29tbWFuZCwgImludGVybmFsIHNlcnZlciBlcnJvciIpOwogICAgICAgICAgIGxvZy5lcnJvcihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAiQ2Fubm90IGFkZCBwYXRjaCBzZXQgdG8gJWQgb2YgJXMiLAotICAgICAgICAgICAgICByZXBsYWNlLm5ld1BhdGNoU2V0LmdldElkKCksIHByb2plY3QuZ2V0TmFtZSgpKSwgZXJyKTsKKyAgICAgICAgICAgICAgZS5nZXRLZXkoKS5nZXQoKSwgcHJvamVjdC5nZXROYW1lKCkpLCBlcnIpOwogICAgICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CiAgICAgICAgICAgcmVqZWN0KHJlcGxhY2UuaW5wdXRDb21tYW5kLCAiaW50ZXJuYWwgc2VydmVyIGVycm9yIik7CiAgICAgICAgICAgbG9nLmVycm9yKFN0cmluZy5mb3JtYXQoCiAgICAgICAgICAgICAgICJDYW5ub3QgYWRkIHBhdGNoIHNldCB0byAlZCBvZiAlcyIsCi0gICAgICAgICAgICAgIHJlcGxhY2UubmV3UGF0Y2hTZXQuZ2V0SWQoKSwgcHJvamVjdC5nZXROYW1lKCkpLCBlcnIpOworICAgICAgICAgICAgICBlLmdldEtleSgpLmdldCgpLCBwcm9qZWN0LmdldE5hbWUoKSksIGVycik7CiAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7CisgICAgICB9IGVsc2UgaWYgKHJlcGxhY2UuaW5wdXRDb21tYW5kLmdldFJlc3VsdCgpID09IE5PVF9BVFRFTVBURUQpIHsKICAgICAgICAgcmVqZWN0KHJlcGxhY2UuaW5wdXRDb21tYW5kLCAiaW50ZXJuYWwgc2VydmVyIGVycm9yIik7CiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG5ld0NoYW5nZSA9PSBudWxsIHx8IG5ld0NoYW5nZS5nZXRSZXN1bHQoKSAhPSBOT1RfQVRURU1QVEVEKSB7CisgICAgaWYgKG1hZ2ljQnJhbmNoID09IG51bGwgfHwgbWFnaWNCcmFuY2guY21kLmdldFJlc3VsdCgpICE9IE5PVF9BVFRFTVBURUQpIHsKICAgICAgIC8vIHJlZnMvZm9yLyBvciByZWZzL2RyYWZ0cy8gbm90IHVzZWQsIG9yIGl0IGFscmVhZHkgZmFpbGVkIGVhcmxpZXIuCiAgICAgICAvLyBObyBuZWVkIHRvIGNvbnRpbnVlLgogICAgICAgcmV0dXJuOwpAQCAtNjMwLDMwICs2OTUsMzUgQEAKICAgICBpZiAob2tUb0luc2VydCAhPSByZXBsYWNlQ291bnQgKyBuZXdDaGFuZ2VzLnNpemUoKSkgewogICAgICAgLy8gT25lIG9yIG1vcmUgbmV3IHJlZmVyZW5jZXMgZmFpbGVkIHRvIGNyZWF0ZS4gQXNzdW1lIHRoZQogICAgICAgLy8gc3lzdGVtIGlzbid0IHdvcmtpbmcgY29ycmVjdGx5IGFueW1vcmUgYW5kIGFib3J0LgotICAgICAgcmVqZWN0KG5ld0NoYW5nZSwgImludGVybmFsIHNlcnZlciBlcnJvciIpOworICAgICAgcmVqZWN0KG1hZ2ljQnJhbmNoLmNtZCwgImludGVybmFsIHNlcnZlciBlcnJvciIpOwogICAgICAgbG9nLmVycm9yKFN0cmluZy5mb3JtYXQoCiAgICAgICAgICAgIk9ubHkgJWQgb2YgJWQgbmV3IGNoYW5nZSByZWZzIGNyZWF0ZWQgaW4gJXM7IGFib3J0aW5nIiwKLSAgICAgICAgICBva1RvSW5zZXJ0LCBuZXdDaGFuZ2VzLnNpemUoKSwgcHJvamVjdC5nZXROYW1lKCkpKTsKKyAgICAgICAgICBva1RvSW5zZXJ0LCByZXBsYWNlQ291bnQgKyBuZXdDaGFuZ2VzLnNpemUoKSwgcHJvamVjdC5nZXROYW1lKCkpKTsKICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICB0cnkgeworICAgICAgTGlzdDxDaGVja2VkRnV0dXJlPD8sIE9ybUV4Y2VwdGlvbj4+IGZ1dHVyZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgICAgIGZvciAoUmVwbGFjZVJlcXVlc3QgcmVwbGFjZSA6IHJlcGxhY2VCeUNoYW5nZS52YWx1ZXMoKSkgewotICAgICAgICBpZiAocmVwbGFjZS5pbnB1dENvbW1hbmQgPT0gbmV3Q2hhbmdlKSB7Ci0gICAgICAgICAgcmVwbGFjZS5pbnNlcnRQYXRjaFNldCgpOworICAgICAgICBpZiAobWFnaWNCcmFuY2ggIT0gbnVsbCAmJiByZXBsYWNlLmlucHV0Q29tbWFuZCA9PSBtYWdpY0JyYW5jaC5jbWQpIHsKKyAgICAgICAgICBmdXR1cmVzLmFkZChyZXBsYWNlLmluc2VydFBhdGNoU2V0KCkpOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIGZvciAoQ3JlYXRlUmVxdWVzdCBjcmVhdGUgOiBuZXdDaGFuZ2VzKSB7Ci0gICAgICAgIGNyZWF0ZS5pbnNlcnRDaGFuZ2UoKTsKKyAgICAgICAgZnV0dXJlcy5hZGQoY3JlYXRlLmluc2VydENoYW5nZSgpKTsKICAgICAgIH0KLSAgICAgIG5ld0NoYW5nZS5zZXRSZXN1bHQoT0spOworCisgICAgICBmb3IgKENoZWNrZWRGdXR1cmU8PywgT3JtRXhjZXB0aW9uPiBmIDogZnV0dXJlcykgeworICAgICAgICBmLmNoZWNrZWRHZXQoKTsKKyAgICAgIH0KKyAgICAgIG1hZ2ljQnJhbmNoLmNtZC5zZXRSZXN1bHQoT0spOwogICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKICAgICAgIGxvZy5lcnJvcigiQ2FuJ3QgaW5zZXJ0IGNoYW5nZXMgZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgZXJyKTsKLSAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiKTsKKyAgICAgIHJlamVjdChtYWdpY0JyYW5jaC5jbWQsICJpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IiKTsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKICAgICAgIGxvZy5lcnJvcigiQ2FuJ3QgcmVhZCBjb21taXRzIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCksIGVycik7Ci0gICAgICByZWplY3QobmV3Q2hhbmdlLCAiaW50ZXJuYWwgc2VydmVyIGVycm9yIik7CisgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAiaW50ZXJuYWwgc2VydmVyIGVycm9yIik7CiAgICAgfQogICB9CiAKQEAgLTY4MSwxNiArNzUxLDYgQEAKICAgICByZXR1cm4gZGlzcGxheU5hbWU7CiAgIH0KIAotICBwcml2YXRlIEFjY291bnQuSWQgdG9BY2NvdW50SWQoZmluYWwgU3RyaW5nIG5hbWVPckVtYWlsKSB0aHJvd3MgT3JtRXhjZXB0aW9uLAotICAgICAgTm9TdWNoQWNjb3VudEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQWNjb3VudCBhID0gYWNjb3VudFJlc29sdmVyLmZpbmRCeU5hbWVPckVtYWlsKG5hbWVPckVtYWlsKTsKLSAgICBpZiAoYSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoQWNjb3VudEV4Y2VwdGlvbigiXCIiICsgbmFtZU9yRW1haWwKLSAgICAgICAgICArICJcIiBpcyBub3QgcmVnaXN0ZXJlZCIpOwotICAgIH0KLSAgICByZXR1cm4gYS5nZXRJZCgpOwotICB9Ci0KICAgcHJpdmF0ZSB2b2lkIHBhcnNlQ29tbWFuZHMoZmluYWwgQ29sbGVjdGlvbjxSZWNlaXZlQ29tbWFuZD4gY29tbWFuZHMpIHsKICAgICBmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAgICAgICBpZiAoY21kLmdldFJlc3VsdCgpICE9IE5PVF9BVFRFTVBURUQpIHsKQEAgLTcwNSw4ICs3NjUsMjEgQEAKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAKKyAgICAgIEhvb2tSZXN1bHQgcmVzdWx0ID0gaG9va3MuZG9SZWZVcGRhdGVIb29rKHByb2plY3QsIGNtZC5nZXRSZWZOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VXNlci5nZXRBY2NvdW50KCksIGNtZC5nZXRPbGRJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmdldE5ld0lkKCkpOworCisgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXN1bHQudG9TdHJpbmcoKS50cmltKCk7CisgICAgICAgIGlmIChyZXN1bHQuZ2V0RXhpdFZhbHVlKCkgIT0gMCkgeworICAgICAgICAgIHJlamVjdChjbWQsIG1lc3NhZ2UpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJwLnNlbmRNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgfQorCiAgICAgICBpZiAoTWFnaWNCcmFuY2guaXNNYWdpY0JyYW5jaChjbWQuZ2V0UmVmTmFtZSgpKSkgewotICAgICAgICBwYXJzZU5ld0NoYW5nZUNvbW1hbmQoY21kKTsKKyAgICAgICAgcGFyc2VNYWdpY0JyYW5jaChjbWQpOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIApAQCAtODczLDE0ICs5NDYsMTcgQEAKIAogICBwcml2YXRlIHZvaWQgcGFyc2VEZWxldGUoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kKSB7CiAgICAgUmVmQ29udHJvbCBjdGwgPSBwcm9qZWN0Q29udHJvbC5jb250cm9sRm9yUmVmKGNtZC5nZXRSZWZOYW1lKCkpOwotICAgIGlmIChjdGwuY2FuRGVsZXRlKCkpIHsKKyAgICBpZiAoY3RsLmdldFJlZk5hbWUoKS5zdGFydHNXaXRoKCJyZWZzL2NoYW5nZXMvIikpIHsKKyAgICAgIGVycm9ycy5wdXQoRXJyb3IuREVMRVRFX0NIQU5HRVMsIGN0bC5nZXRSZWZOYW1lKCkpOworICAgICAgcmVqZWN0KGNtZCwgImNhbm5vdCBkZWxldGUgY2hhbmdlcyIpOworICAgIH0gZWxzZSBpZiAoY3RsLmNhbkRlbGV0ZSgpKSB7CiAgICAgICBiYXRjaC5hZGRDb21tYW5kKGNtZCk7CiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLmVxdWFscyhjdGwuZ2V0UmVmTmFtZSgpKSkgewogICAgICAgICByZWplY3QoY21kLCAiY2Fubm90IGRlbGV0ZSBwcm9qZWN0IGNvbmZpZ3VyYXRpb24iKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGVycm9ycy5wdXQoRXJyb3IuREVMRVRFLCBjdGwuZ2V0UmVmTmFtZSgpKTsKLSAgICAgICAgcmVqZWN0KGNtZCwgImNhbiBub3QgZGVsZXRlIHJlZmVyZW5jZXMiKTsKKyAgICAgICAgcmVqZWN0KGNtZCwgImNhbm5vdCBkZWxldGUgcmVmZXJlbmNlcyIpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtOTE0LDcyICs5OTAsMTM4IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIHBhcnNlTmV3Q2hhbmdlQ29tbWFuZChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQpIHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFnaWNCcmFuY2hJbnB1dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BsaXR0ZXIgQ09NTUFTID0gU3BsaXR0ZXIub24oJywnKS5vbWl0RW1wdHlTdHJpbmdzKCk7CisKKyAgICBmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQ7CisgICAgQnJhbmNoLk5hbWVLZXkgZGVzdDsKKyAgICBSZWZDb250cm9sIGN0bDsKKyAgICBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXIgPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXQoKTsKKyAgICBTZXQ8QWNjb3VudC5JZD4gY2MgPSBTZXRzLm5ld0xpbmtlZEhhc2hTZXQoKTsKKworICAgIEBPcHRpb24obmFtZSA9ICItLXRvcGljIiwgbWV0YVZhciA9ICJOQU1FIiwgdXNhZ2UgPSAiYXR0YWNoIHRvcGljIHRvIGNoYW5nZXMiKQorICAgIFN0cmluZyB0b3BpYzsKKworICAgIEBPcHRpb24obmFtZSA9ICItLWRyYWZ0IiwgdXNhZ2UgPSAibWFyayBuZXcvdXBkYXRlZCBjaGFuZ2VzIGFzIGRyYWZ0IikKKyAgICBib29sZWFuIGRyYWZ0OworCisgICAgQE9wdGlvbihuYW1lID0gIi1yIiwgbWV0YVZhciA9ICJFTUFJTCIsIHVzYWdlID0gImFkZCByZXZpZXdlciB0byBjaGFuZ2VzIikKKyAgICB2b2lkIHJldmlld2VyKEFjY291bnQuSWQgaWQpIHsKKyAgICAgIHJldmlld2VyLmFkZChpZCk7CisgICAgfQorCisgICAgQE9wdGlvbihuYW1lID0gIi0tY2MiLCBtZXRhVmFyID0gIkVNQUlMIiwgdXNhZ2UgPSAibm90aWZ5IHVzZXIgYnkgQ0MiKQorICAgIHZvaWQgY2MoQWNjb3VudC5JZCBpZCkgeworICAgICAgY2MuYWRkKGlkKTsKKyAgICB9CisKKyAgICBAT3B0aW9uKG5hbWUgPSAiLS1wdWJsaXNoIiwgdXNhZ2UgPSAicHVibGlzaCBuZXcvdXBkYXRlZCBjaGFuZ2VzIikKKyAgICB2b2lkIHB1Ymxpc2goYm9vbGVhbiBwdWJsaXNoKSB7CisgICAgICBkcmFmdCA9ICFwdWJsaXNoOworICAgIH0KKworICAgIE1hZ2ljQnJhbmNoSW5wdXQoUmVjZWl2ZUNvbW1hbmQgY21kKSB7CisgICAgICB0aGlzLmNtZCA9IGNtZDsKKyAgICAgIHRoaXMuZHJhZnQgPSBjbWQuZ2V0UmVmTmFtZSgpLnN0YXJ0c1dpdGgoTWFnaWNCcmFuY2guTkVXX0RSQUZUX0NIQU5HRSk7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0RyYWZ0KCkgeworICAgICAgcmV0dXJuIGRyYWZ0OworICAgIH0KKworICAgIE1haWxSZWNpcGllbnRzIGdldE1haWxSZWNpcGllbnRzKCkgeworICAgICAgcmV0dXJuIG5ldyBNYWlsUmVjaXBpZW50cyhyZXZpZXdlciwgY2MpOworICAgIH0KKworICAgIFN0cmluZyBwYXJzZShDbWRMaW5lUGFyc2VyIGNscCwgUmVwb3NpdG9yeSByZXBvLCBTZXQ8U3RyaW5nPiByZWZzKQorICAgICAgICB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisgICAgICBTdHJpbmcgcmVmID0gTWFnaWNCcmFuY2guZ2V0RGVzdEJyYW5jaE5hbWUoY21kLmdldFJlZk5hbWUoKSk7CisgICAgICBpZiAoIXJlZi5zdGFydHNXaXRoKENvbnN0YW50cy5SX1JFRlMpKSB7CisgICAgICAgIHJlZiA9IENvbnN0YW50cy5SX0hFQURTICsgcmVmOworICAgICAgfQorCisgICAgICBpbnQgb3B0aW9uU3RhcnQgPSByZWYuaW5kZXhPZignJScpOworICAgICAgaWYgKDAgPCBvcHRpb25TdGFydCkgeworICAgICAgICBMaXN0TXVsdGltYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMgPSBMaW5rZWRMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICAgIGZvciAoU3RyaW5nIHMgOiBDT01NQVMuc3BsaXQocmVmLnN1YnN0cmluZyhvcHRpb25TdGFydCArIDEpKSkgeworICAgICAgICAgIGludCBlID0gcy5pbmRleE9mKCc9Jyk7CisgICAgICAgICAgaWYgKDAgPCBlKSB7CisgICAgICAgICAgICBvcHRpb25zLnB1dChzLnN1YnN0cmluZygwLCBlKSwgcy5zdWJzdHJpbmcoZSArIDEpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3B0aW9ucy5wdXQocywgIiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbHAucGFyc2VPcHRpb25NYXAob3B0aW9ucyk7CisgICAgICAgIHJlZiA9IHJlZi5zdWJzdHJpbmcoMCwgb3B0aW9uU3RhcnQpOworICAgICAgfQorCisgICAgICAvLyBTcGxpdCB0aGUgZGVzdGluYXRpb24gYnJhbmNoIGJ5IGJyYW5jaCBhbmQgdG9waWMuIFRoZSB0b3BpYworICAgICAgLy8gc3VmZml4IGlzIGVudGlyZWx5IG9wdGlvbmFsLCBzbyBpdCBtaWdodCBub3QgZXZlbiBleGlzdC4KKyAgICAgIFN0cmluZyBoZWFkID0gcmVhZEhFQUQocmVwbyk7CisgICAgICBpbnQgc3BsaXQgPSByZWYubGVuZ3RoKCk7CisgICAgICBmb3IgKDs7KSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gcmVmLnN1YnN0cmluZygwLCBzcGxpdCk7CisgICAgICAgIGlmIChyZWZzLmNvbnRhaW5zKG5hbWUpIHx8IG5hbWUuZXF1YWxzKGhlYWQpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzcGxpdCA9IG5hbWUubGFzdEluZGV4T2YoJy8nLCBzcGxpdCAtIDEpOworICAgICAgICBpZiAoc3BsaXQgPD0gQ29uc3RhbnRzLlJfUkVGUy5sZW5ndGgoKSkgeworICAgICAgICAgIHJldHVybiByZWY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzcGxpdCA8IHJlZi5sZW5ndGgoKSkgeworICAgICAgICB0b3BpYyA9IFN0cmluZ3MuZW1wdHlUb051bGwocmVmLnN1YnN0cmluZyhzcGxpdCArIDEpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWYuc3Vic3RyaW5nKDAsIHNwbGl0KTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcGFyc2VNYWdpY0JyYW5jaChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQpIHsKICAgICAvLyBQZXJtaXQgZXhhY3RseSBvbmUgbmV3IGNoYW5nZSByZXF1ZXN0IHBlciBwdXNoLgotICAgIC8vCi0gICAgaWYgKG5ld0NoYW5nZSAhPSBudWxsKSB7CisgICAgaWYgKG1hZ2ljQnJhbmNoICE9IG51bGwpIHsKICAgICAgIHJlamVjdChjbWQsICJkdXBsaWNhdGUgcmVxdWVzdCIpOwogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG5ld0NoYW5nZSA9IGNtZDsKLSAgICBTdHJpbmcgZGVzdEJyYW5jaE5hbWUgPSBNYWdpY0JyYW5jaC5nZXREZXN0QnJhbmNoTmFtZShjbWQuZ2V0UmVmTmFtZSgpKTsKLSAgICBpZiAoIWRlc3RCcmFuY2hOYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfUkVGUykpIHsKLSAgICAgIGRlc3RCcmFuY2hOYW1lID0gQ29uc3RhbnRzLlJfSEVBRFMgKyBkZXN0QnJhbmNoTmFtZTsKLSAgICB9CisgICAgbWFnaWNCcmFuY2ggPSBuZXcgTWFnaWNCcmFuY2hJbnB1dChjbWQpOworICAgIG1hZ2ljQnJhbmNoLnJldmlld2VyLmFkZEFsbChyZXZpZXdlcnNGcm9tQ29tbWFuZExpbmUpOworICAgIG1hZ2ljQnJhbmNoLmNjLmFkZEFsbChjY0Zyb21Db21tYW5kTGluZSk7CiAKLSAgICBmaW5hbCBTdHJpbmcgaGVhZDsKKyAgICBTdHJpbmcgcmVmOworICAgIENtZExpbmVQYXJzZXIgY2xwID0gb3B0aW9uUGFyc2VyRmFjdG9yeS5jcmVhdGUobWFnaWNCcmFuY2gpOwogICAgIHRyeSB7Ci0gICAgICBoZWFkID0gcmVwby5nZXRGdWxsQnJhbmNoKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgbG9nLmVycm9yKCJDYW5ub3QgcmVhZCBIRUFEIHN5bXJlZiIsIGUpOwotICAgICAgcmVqZWN0KGNtZCwgImludGVybmFsIGVycm9yIik7CisgICAgICByZWYgPSBtYWdpY0JyYW5jaC5wYXJzZShjbHAsIHJlcG8sIHJwLmdldEFkdmVydGlzZWRSZWZzKCkua2V5U2V0KCkpOworICAgIH0gY2F0Y2ggKENtZExpbmVFeGNlcHRpb24gZSkgeworICAgICAgaWYgKCFjbHAud2FzSGVscFJlcXVlc3RlZEJ5T3B0aW9uKCkpIHsKKyAgICAgICAgcmVqZWN0KGNtZCwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICByZWYgPSBudWxsOyAvLyBuZXZlciBoYXBwZW4KKyAgICB9CisgICAgaWYgKGNscC53YXNIZWxwUmVxdWVzdGVkQnlPcHRpb24oKSkgeworICAgICAgU3RyaW5nV3JpdGVyIHcgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICB3LndyaXRlKCJcbkhlbHAgZm9yIHJlZnMvZm9yL2JyYW5jaDpcblxuIik7CisgICAgICBjbHAucHJpbnRVc2FnZSh3LCBudWxsKTsKKyAgICAgIGFkZE1lc3NhZ2Uody50b1N0cmluZygpKTsKKyAgICAgIHJlamVjdChjbWQsICJzZWUgaGVscCIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXJwLmdldEFkdmVydGlzZWRSZWZzKCkuY29udGFpbnNLZXkocmVmKSAmJiAhcmVmLmVxdWFscyhyZWFkSEVBRChyZXBvKSkpIHsKKyAgICAgIGlmIChyZWYuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpIHsKKyAgICAgICAgU3RyaW5nIG4gPSByZWYuc3Vic3RyaW5nKENvbnN0YW50cy5SX0hFQURTLmxlbmd0aCgpKTsKKyAgICAgICAgcmVqZWN0KGNtZCwgImJyYW5jaCAiICsgbiArICIgbm90IGZvdW5kIik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZWplY3QoY21kLCByZWYgKyAiIG5vdCBmb3VuZCIpOworICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFNwbGl0IHRoZSBkZXN0aW5hdGlvbiBicmFuY2ggYnkgYnJhbmNoIGFuZCB0b3BpYy4gIFRoZSB0b3BpYwotICAgIC8vIHN1ZmZpeCBpcyBlbnRpcmVseSBvcHRpb25hbCwgc28gaXQgbWlnaHQgbm90IGV2ZW4gZXhpc3QuCi0gICAgLy8KLSAgICBpbnQgc3BsaXQgPSBkZXN0QnJhbmNoTmFtZS5sZW5ndGgoKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IGRlc3RCcmFuY2hOYW1lLnN1YnN0cmluZygwLCBzcGxpdCk7Ci0KLSAgICAgIGlmIChycC5nZXRBZHZlcnRpc2VkUmVmcygpLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0gICAgICAgIC8vIFdlIGFkdmVydGlzZWQgdGhlIGJyYW5jaCB0byB0aGUgY2xpZW50IHNvIHdlIGtub3cKLSAgICAgICAgLy8gdGhlIGJyYW5jaCBleGlzdHMuIFRhcmdldCB0aGlzIGJyYW5jaCBmb3IgdGhlIHVwbG9hZC4KLSAgICAgICAgLy8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYgKGhlYWQuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgIC8vIFdlIGRpZG4ndCBhZHZlcnRpc2UgdGhlIGJyYW5jaCwgYmVjYXVzZSBpdCBkb2Vzbid0IGV4aXN0IHlldC4KLSAgICAgICAgLy8gQWxsb3cgaXQgYW55d2F5IGFzIEhFQUQgaXMgYSBzeW1ib2xpYyByZWZlcmVuY2UgdG8gdGhlIG5hbWUuCi0gICAgICAgIC8vCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBzcGxpdCA9IG5hbWUubGFzdEluZGV4T2YoJy8nLCBzcGxpdCAtIDEpOwotICAgICAgaWYgKHNwbGl0IDw9IENvbnN0YW50cy5SX1JFRlMubGVuZ3RoKCkpIHsKLSAgICAgICAgU3RyaW5nIG4gPSBkZXN0QnJhbmNoTmFtZTsKLSAgICAgICAgaWYgKG4uc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCi0gICAgICAgICAgbiA9IG4uc3Vic3RyaW5nKENvbnN0YW50cy5SX0hFQURTLmxlbmd0aCgpKTsKLSAgICAgICAgcmVqZWN0KGNtZCwgImJyYW5jaCAiICsgbiArICIgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoc3BsaXQgPCBkZXN0QnJhbmNoTmFtZS5sZW5ndGgoKSkgewotICAgICAgZGVzdFRvcGljTmFtZSA9IGRlc3RCcmFuY2hOYW1lLnN1YnN0cmluZyhzcGxpdCArIDEpOwotICAgICAgaWYgKGRlc3RUb3BpY05hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGRlc3RUb3BpY05hbWUgPSBudWxsOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBkZXN0VG9waWNOYW1lID0gbnVsbDsKLSAgICB9Ci0gICAgZGVzdEJyYW5jaCA9IG5ldyBCcmFuY2guTmFtZUtleShwcm9qZWN0LmdldE5hbWVLZXkoKSwgLy8KLSAgICAgICAgZGVzdEJyYW5jaE5hbWUuc3Vic3RyaW5nKDAsIHNwbGl0KSk7Ci0gICAgZGVzdEJyYW5jaEN0bCA9IHByb2plY3RDb250cm9sLmNvbnRyb2xGb3JSZWYoZGVzdEJyYW5jaCk7Ci0gICAgaWYgKCFkZXN0QnJhbmNoQ3RsLmNhblVwbG9hZCgpKSB7Ci0gICAgICBlcnJvcnMucHV0KEVycm9yLkNPREVfUkVWSUVXLCBjbWQuZ2V0UmVmTmFtZSgpKTsKLSAgICAgIHJlamVjdChjbWQsICJjYW4gbm90IHVwbG9hZCByZXZpZXciKTsKKyAgICBtYWdpY0JyYW5jaC5kZXN0ID0gbmV3IEJyYW5jaC5OYW1lS2V5KHByb2plY3QuZ2V0TmFtZUtleSgpLCByZWYpOworICAgIG1hZ2ljQnJhbmNoLmN0bCA9IHByb2plY3RDb250cm9sLmNvbnRyb2xGb3JSZWYocmVmKTsKKyAgICBpZiAoIW1hZ2ljQnJhbmNoLmN0bC5jYW5VcGxvYWQoKSkgeworICAgICAgZXJyb3JzLnB1dChFcnJvci5DT0RFX1JFVklFVywgcmVmKTsKKyAgICAgIHJlamVjdChjbWQsICJjYW5ub3QgdXBsb2FkIHJldmlldyIpOwogICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtOTkwLDkgKzExMzIsOCBAQAogICAgIC8vCiAgICAgdHJ5IHsKICAgICAgIGZpbmFsIFJldldhbGsgd2FsayA9IHJwLmdldFJldldhbGsoKTsKLQotICAgICAgZmluYWwgUmV2Q29tbWl0IHRpcCA9IHdhbGsucGFyc2VDb21taXQobmV3Q2hhbmdlLmdldE5ld0lkKCkpOwotICAgICAgUmVmIHRhcmdldFJlZiA9IHJwLmdldEFkdmVydGlzZWRSZWZzKCkuZ2V0KGRlc3RCcmFuY2hOYW1lKTsKKyAgICAgIGZpbmFsIFJldkNvbW1pdCB0aXAgPSB3YWxrLnBhcnNlQ29tbWl0KG1hZ2ljQnJhbmNoLmNtZC5nZXROZXdJZCgpKTsKKyAgICAgIFJlZiB0YXJnZXRSZWYgPSBycC5nZXRBZHZlcnRpc2VkUmVmcygpLmdldChtYWdpY0JyYW5jaC5jdGwuZ2V0UmVmTmFtZSgpKTsKICAgICAgIGlmICh0YXJnZXRSZWYgPT0gbnVsbCB8fCB0YXJnZXRSZWYuZ2V0T2JqZWN0SWQoKSA9PSBudWxsKSB7CiAgICAgICAgIC8vIFRoZSBkZXN0aW5hdGlvbiBicmFuY2ggZG9lcyBub3QgeWV0IGV4aXN0LiBBc3N1bWUgdGhlCiAgICAgICAgIC8vIGhpc3RvcnkgYmVpbmcgc2VudCBmb3IgcmV2aWV3IHdpbGwgc3RhcnQgaXQgYW5kIHRodXMKQEAgLTEwMDAsNyArMTE0MSw2IEBACiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICAgIGZpbmFsIFJldkNvbW1pdCBoID0gd2Fsay5wYXJzZUNvbW1pdCh0YXJnZXRSZWYuZ2V0T2JqZWN0SWQoKSk7Ci0KICAgICAgIGZpbmFsIFJldkZpbHRlciBvbGRSZXZGaWx0ZXIgPSB3YWxrLmdldFJldkZpbHRlcigpOwogICAgICAgdHJ5IHsKICAgICAgICAgd2Fsay5yZXNldCgpOwpAQCAtMTAwOCw3ICsxMTQ4LDcgQEAKICAgICAgICAgd2Fsay5tYXJrU3RhcnQodGlwKTsKICAgICAgICAgd2Fsay5tYXJrU3RhcnQoaCk7CiAgICAgICAgIGlmICh3YWxrLm5leHQoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVqZWN0KG5ld0NoYW5nZSwgIm5vIGNvbW1vbiBhbmNlc3RyeSIpOworICAgICAgICAgIHJlamVjdChtYWdpY0JyYW5jaC5jbWQsICJubyBjb21tb24gYW5jZXN0cnkiKTsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgIH0gZmluYWxseSB7CkBAIC0xMDE2LDEyICsxMTU2LDIxIEBACiAgICAgICAgIHdhbGsuc2V0UmV2RmlsdGVyKG9sZFJldkZpbHRlcik7CiAgICAgICB9CiAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgbmV3Q2hhbmdlLnNldFJlc3VsdChSRUpFQ1RFRF9NSVNTSU5HX09CSkVDVCk7CisgICAgICBtYWdpY0JyYW5jaC5jbWQuc2V0UmVzdWx0KFJFSkVDVEVEX01JU1NJTkdfT0JKRUNUKTsKICAgICAgIGxvZy5lcnJvcigiSW52YWxpZCBwYWNrIHVwbG9hZDsgb25lIG9yIG1vcmUgb2JqZWN0cyB3ZXJlbid0IHNlbnQiLCBlKTsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KIAorICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEhFQUQoUmVwb3NpdG9yeSByZXBvKSB7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiByZXBvLmdldEZ1bGxCcmFuY2goKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBsb2cuZXJyb3IoIkNhbm5vdCByZWFkIEhFQUQgc3ltcmVmIiwgZSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKwogICAvKioKICAgICogTG9hZHMgYSBsaXN0IG9mIGNvbW1pdHMgdG8gcmVqZWN0IGZyb20ge0Bjb2RlIHJlZnMvbWV0YS9yZWplY3QtY29tbWl0c30uCiAgICAqCkBAIC0xMTExLDggKzEyNjAsMTEgQEAKICAgICB3YWxrLnNvcnQoUmV2U29ydC5SRVZFUlNFLCB0cnVlKTsKICAgICB0cnkgewogICAgICAgU2V0PE9iamVjdElkPiBleGlzdGluZyA9IFNldHMubmV3SGFzaFNldCgpOwotICAgICAgd2Fsay5tYXJrU3RhcnQod2Fsay5wYXJzZUNvbW1pdChuZXdDaGFuZ2UuZ2V0TmV3SWQoKSkpOwotICAgICAgbWFya0hlYWRzQXNVbmludGVyZXN0aW5nKHdhbGssIGV4aXN0aW5nKTsKKyAgICAgIHdhbGsubWFya1N0YXJ0KHdhbGsucGFyc2VDb21taXQobWFnaWNCcmFuY2guY21kLmdldE5ld0lkKCkpKTsKKyAgICAgIG1hcmtIZWFkc0FzVW5pbnRlcmVzdGluZygKKyAgICAgICAgICB3YWxrLAorICAgICAgICAgIGV4aXN0aW5nLAorICAgICAgICAgIG1hZ2ljQnJhbmNoLmN0bCAhPSBudWxsID8gbWFnaWNCcmFuY2guY3RsLmdldFJlZk5hbWUoKSA6IG51bGwpOwogCiAgICAgICBMaXN0PENoYW5nZUxvb2t1cD4gcGVuZGluZyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogICAgICAgZmluYWwgU2V0PENoYW5nZS5LZXk+IG5ld0NoYW5nZUlkcyA9IG5ldyBIYXNoU2V0PENoYW5nZS5LZXk+KCk7CkBAIC0xMTI2LDcgKzEyNzgsOCBAQAogICAgICAgICAgIC8vCiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF2YWxpZENvbW1pdChkZXN0QnJhbmNoQ3RsLCBuZXdDaGFuZ2UsIGMpKSB7CisKKyAgICAgICAgaWYgKCF2YWxpZENvbW1pdChtYWdpY0JyYW5jaC5jdGwsIG1hZ2ljQnJhbmNoLmNtZCwgYykpIHsKICAgICAgICAgICAvLyBOb3QgYSBjaGFuZ2UgdGhlIHVzZXIgY2FuIHByb3Bvc2U/IEFib3J0IGFzIGVhcmx5IGFzIHBvc3NpYmxlLgogICAgICAgICAgIC8vCiAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwpAQCAtMTE0Miw3ICsxMjk1LDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIGlkU3RyID0gaWRMaXN0LmdldChpZExpc3Quc2l6ZSgpIC0gMSkudHJpbSgpOwogICAgICAgICBpZiAoaWRTdHIubWF0Y2hlcygiXkkwMCokIikpIHsKICAgICAgICAgICAvLyBSZWplY3QgdGhpcyBpbnZhbGlkIGxpbmUgZnJvbSBFR2l0LgotICAgICAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJpbnZhbGlkIENoYW5nZS1JZCIpOworICAgICAgICAgIHJlamVjdChtYWdpY0JyYW5jaC5jbWQsICJpbnZhbGlkIENoYW5nZS1JZCIpOwogICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgfQogCkBAIC0xMTUyLDcgKzEzMDUsNyBAQAogCiAgICAgICBmb3IgKENoYW5nZUxvb2t1cCBwIDogcGVuZGluZykgewogICAgICAgICBpZiAobmV3Q2hhbmdlSWRzLmNvbnRhaW5zKHAuY2hhbmdlS2V5KSkgewotICAgICAgICAgIHJlamVjdChuZXdDaGFuZ2UsICJzcXVhc2ggY29tbWl0cyBmaXJzdCIpOworICAgICAgICAgIHJlamVjdChtYWdpY0JyYW5jaC5jbWQsICJzcXVhc2ggY29tbWl0cyBmaXJzdCIpOwogICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgfQogCkBAIC0xMTYzLDE0ICsxMzE2LDE0IEBACiAgICAgICAgICAgLy8gYSBkaWZmZXJlbnQgQ2hhbmdlLUlkLiBJbiBwcmFjdGljZSwgd2Ugc2hvdWxkIG5ldmVyIHNlZQogICAgICAgICAgIC8vIHRoaXMgZXJyb3IgbWVzc2FnZSBhcyBDaGFuZ2UtSWQgc2hvdWxkIGJlIHVuaXF1ZS4KICAgICAgICAgICAvLwotICAgICAgICAgIHJlamVjdChuZXdDaGFuZ2UsIHAuY2hhbmdlS2V5LmdldCgpICsgIiBoYXMgZHVwbGljYXRlcyIpOworICAgICAgICAgIHJlamVjdChtYWdpY0JyYW5jaC5jbWQsIHAuY2hhbmdlS2V5LmdldCgpICsgIiBoYXMgZHVwbGljYXRlcyIpOwogICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChjaGFuZ2VzLnNpemUoKSA9PSAxKSB7CiAgICAgICAgICAgLy8gU2NoZWR1bGUgYXMgYSByZXBsYWNlbWVudCB0byB0aGlzIG9uZSBtYXRjaGluZyBjaGFuZ2UuCiAgICAgICAgICAgLy8KLSAgICAgICAgICBpZiAocmVxdWVzdFJlcGxhY2UobmV3Q2hhbmdlLCBmYWxzZSwgY2hhbmdlcy5nZXQoMCksIHAuY29tbWl0KSkgeworICAgICAgICAgIGlmIChyZXF1ZXN0UmVwbGFjZShtYWdpY0JyYW5jaC5jbWQsIGZhbHNlLCBjaGFuZ2VzLmdldCgwKSwgcC5jb21taXQpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwpAQCAtMTE3OSw3ICsxMzMyLDcgQEAKIAogICAgICAgICBpZiAoY2hhbmdlcy5zaXplKCkgPT0gMCkgewogICAgICAgICAgIGlmICghaXNWYWxpZENoYW5nZUlkKHAuY2hhbmdlS2V5LmdldCgpKSkgewotICAgICAgICAgICAgcmVqZWN0KG5ld0NoYW5nZSwgImludmFsaWQgQ2hhbmdlLUlkIik7CisgICAgICAgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAiaW52YWxpZCBDaGFuZ2UtSWQiKTsKICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICAgICAgICB9CiAKQEAgLTExOTEsMTcgKzEzNDQsMTcgQEAKICAgICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4sIHRoZSBjb3JlIHJlY2VpdmUgcHJvY2VzcyB3b3VsZCBoYXZlCiAgICAgICAvLyBpZGVudGlmaWVkIHRoZSBtaXNzaW5nIG9iamVjdCBlYXJsaWVyIGJlZm9yZSB3ZSBnb3QgY29udHJvbC4KICAgICAgIC8vCi0gICAgICBuZXdDaGFuZ2Uuc2V0UmVzdWx0KFJFSkVDVEVEX01JU1NJTkdfT0JKRUNUKTsKKyAgICAgIG1hZ2ljQnJhbmNoLmNtZC5zZXRSZXN1bHQoUkVKRUNURURfTUlTU0lOR19PQkpFQ1QpOwogICAgICAgbG9nLmVycm9yKCJJbnZhbGlkIHBhY2sgdXBsb2FkOyBvbmUgb3IgbW9yZSBvYmplY3RzIHdlcmVuJ3Qgc2VudCIsIGUpOwogICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CiAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBxdWVyeSBkYXRhYmFzZSB0byBsb2NhdGUgcHJpb3IgY2hhbmdlcyIsIGUpOwotICAgICAgcmVqZWN0KG5ld0NoYW5nZSwgImRhdGFiYXNlIGVycm9yIik7CisgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAiZGF0YWJhc2UgZXJyb3IiKTsKICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICB9CiAKICAgICBpZiAobmV3Q2hhbmdlcy5pc0VtcHR5KCkgJiYgcmVwbGFjZUJ5Q2hhbmdlLmlzRW1wdHkoKSkgewotICAgICAgcmVqZWN0KG5ld0NoYW5nZSwgIm5vIG5ldyBjaGFuZ2VzIik7CisgICAgICByZWplY3QobWFnaWNCcmFuY2guY21kLCAibm8gbmV3IGNoYW5nZXMiKTsKICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICB9CiAgICAgZm9yIChDcmVhdGVSZXF1ZXN0IGNyZWF0ZSA6IG5ld0NoYW5nZXMpIHsKQEAgLTEyMTAsMTUgKzEzNjMsMTcgQEAKICAgICByZXR1cm4gbmV3Q2hhbmdlczsKICAgfQogCi0KLSAgcHJpdmF0ZSB2b2lkIG1hcmtIZWFkc0FzVW5pbnRlcmVzdGluZyhmaW5hbCBSZXZXYWxrIHdhbGssIFNldDxPYmplY3RJZD4gZXhpc3RpbmcpIHsKLSAgICBmb3IgKFJlZiByZWYgOiByZXBvLmdldEFsbFJlZnMoKS52YWx1ZXMoKSkgeworICBwcml2YXRlIHZvaWQgbWFya0hlYWRzQXNVbmludGVyZXN0aW5nKAorICAgICAgZmluYWwgUmV2V2FsayB3YWxrLAorICAgICAgU2V0PE9iamVjdElkPiBleGlzdGluZywKKyAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZm9yUmVmKSB7CisgICAgZm9yIChSZWYgcmVmIDogYWxsUmVmcy52YWx1ZXMoKSkgewogICAgICAgaWYgKHJlZi5nZXRPYmplY3RJZCgpID09IG51bGwpIHsKICAgICAgICAgY29udGludWU7CiAgICAgICB9IGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aCgicmVmcy9jaGFuZ2VzLyIpKSB7CiAgICAgICAgIGV4aXN0aW5nLmFkZChyZWYuZ2V0T2JqZWN0SWQoKSk7CiAgICAgICB9IGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aChSX0hFQURTKQotICAgICAgICAgIHx8IChkZXN0QnJhbmNoQ3RsICE9IG51bGwgJiYgcmVmLmdldE5hbWUoKS5lcXVhbHMoZGVzdEJyYW5jaEN0bC5nZXRSZWZOYW1lKCkpKSkgeworICAgICAgICAgIHx8IChmb3JSZWYgIT0gbnVsbCAmJiBmb3JSZWYuZXF1YWxzKHJlZi5nZXROYW1lKCkpKSkgewogICAgICAgICB0cnkgewogICAgICAgICAgIHdhbGsubWFya1VuaW50ZXJlc3Rpbmcod2Fsay5wYXJzZUNvbW1pdChyZWYuZ2V0T2JqZWN0SWQoKSkpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0xMjQyLDcgKzEzOTcsNyBAQAogICAgIENoYW5nZUxvb2t1cChSZXZDb21taXQgYywgQ2hhbmdlLktleSBrZXkpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgICAgY29tbWl0ID0gYzsKICAgICAgIGNoYW5nZUtleSA9IGtleTsKLSAgICAgIGNoYW5nZXMgPSBkYi5jaGFuZ2VzKCkuYnlCcmFuY2hLZXkoZGVzdEJyYW5jaCwga2V5KTsKKyAgICAgIGNoYW5nZXMgPSBkYi5jaGFuZ2VzKCkuYnlCcmFuY2hLZXkobWFnaWNCcmFuY2guZGVzdCwga2V5KTsKICAgICB9CiAgIH0KIApAQCAtMTI2MCwxNiArMTQxNSwxNSBAQAogICAgICAgY2hhbmdlID0gbmV3IENoYW5nZShjaGFuZ2VLZXksCiAgICAgICAgICAgbmV3IENoYW5nZS5JZChkYi5uZXh0Q2hhbmdlSWQoKSksCiAgICAgICAgICAgY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCksCi0gICAgICAgICAgZGVzdEJyYW5jaCk7Ci0gICAgICBjaGFuZ2Uuc2V0VG9waWMoZGVzdFRvcGljTmFtZSk7Ci0gICAgICBjaGFuZ2UubmV4dFBhdGNoU2V0SWQoKTsKKyAgICAgICAgICBtYWdpY0JyYW5jaC5kZXN0KTsKKyAgICAgIGNoYW5nZS5zZXRUb3BpYyhtYWdpY0JyYW5jaC50b3BpYyk7CiAKLSAgICAgIHBzID0gbmV3IFBhdGNoU2V0KGNoYW5nZS5jdXJyUGF0Y2hTZXRJZCgpKTsKKyAgICAgIHBzID0gbmV3IFBhdGNoU2V0KG5ldyBQYXRjaFNldC5JZChjaGFuZ2UuZ2V0SWQoKSwgSU5JVElBTF9QQVRDSF9TRVRfSUQpKTsKICAgICAgIHBzLnNldENyZWF0ZWRPbihjaGFuZ2UuZ2V0Q3JlYXRlZE9uKCkpOwogICAgICAgcHMuc2V0VXBsb2FkZXIoY2hhbmdlLmdldE93bmVyKCkpOwogICAgICAgcHMuc2V0UmV2aXNpb24odG9SZXZJZChjKSk7CiAKLSAgICAgIGlmIChNYWdpY0JyYW5jaC5pc0RyYWZ0KG5ld0NoYW5nZS5nZXRSZWZOYW1lKCkpKSB7CisgICAgICBpZiAobWFnaWNCcmFuY2guaXNEcmFmdCgpKSB7CiAgICAgICAgIGNoYW5nZS5zZXRTdGF0dXMoQ2hhbmdlLlN0YXR1cy5EUkFGVCk7CiAgICAgICAgIHBzLnNldERyYWZ0KHRydWUpOwogICAgICAgfQpAQCAtMTI4MCw0OCArMTQzNCw0OCBAQAogICAgICAgY21kID0gbmV3IFJlY2VpdmVDb21tYW5kKE9iamVjdElkLnplcm9JZCgpLCBjLCBwcy5nZXRSZWZOYW1lKCkpOwogICAgIH0KIAotICAgIHZvaWQgaW5zZXJ0Q2hhbmdlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIENoZWNrZWRGdXR1cmU8Vm9pZCwgT3JtRXhjZXB0aW9uPiBpbnNlcnRDaGFuZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgcnAuZ2V0UmV2V2FsaygpLnBhcnNlQm9keShjb21taXQpOwotICAgICAgd2Fybk1hbGZvcm1lZE1lc3NhZ2UoY29tbWl0KTsKIAotICAgICAgZmluYWwgQWNjb3VudC5JZCBtZSA9IGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpOwotICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IHJldmlld2VycyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KHJldmlld2VySWQpOwotICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IGNjID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oY2NJZCk7Ci0gICAgICBmaW5hbCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlckxpbmVzID0gY29tbWl0LmdldEZvb3RlckxpbmVzKCk7Ci0gICAgICBmb3IgKGZpbmFsIEZvb3RlckxpbmUgZm9vdGVyTGluZSA6IGZvb3RlckxpbmVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgaWYgKHBzLmlzRHJhZnQoKSkgewotICAgICAgICAgICAgY29udGludWU7CisgICAgICBmaW5hbCBUaHJlYWQgY2FsbGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgIExpc3RlbmFibGVGdXR1cmU8Vm9pZD4gZnV0dXJlID0gY2hhbmdlVXBkYXRlRXhlY3Rvci5zdWJtaXQoCisgICAgICAgICAgcmVxdWVzdFNjb3BlUHJvcGFnYXRvci53cmFwKG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgICAgICBpZiAoY2FsbGVyID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIGluc2VydENoYW5nZShkYik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJldmlld0RiIGRiID0gc2NoZW1hRmFjdG9yeS5vcGVuKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBpbnNlcnRDaGFuZ2UoZGIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGlzUmV2aWV3ZXIoZm9vdGVyTGluZSkpIHsKLSAgICAgICAgICAgIHJldmlld2Vycy5hZGQodG9BY2NvdW50SWQoZm9vdGVyTGluZS5nZXRWYWx1ZSgpLnRyaW0oKSkpOwotICAgICAgICAgIH0gZWxzZSBpZiAoZm9vdGVyTGluZS5tYXRjaGVzKEZvb3RlcktleS5DQykpIHsKLSAgICAgICAgICAgIGNjLmFkZCh0b0FjY291bnRJZChmb290ZXJMaW5lLmdldFZhbHVlKCkudHJpbSgpKSk7CisgICAgICAgICAgc3luY2hyb25pemVkIChuZXdQcm9ncmVzcykgeworICAgICAgICAgICAgbmV3UHJvZ3Jlc3MudXBkYXRlKDEpOwogICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWNjb3VudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgY29udGludWU7CisgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldmlld2Vycy5yZW1vdmUobWUpOwotICAgICAgY2MucmVtb3ZlKG1lKTsKLSAgICAgIGNjLnJlbW92ZUFsbChyZXZpZXdlcnMpOworICAgICAgfSkpOworICAgICAgcmV0dXJuIEZ1dHVyZXMubWFrZUNoZWNrZWQoZnV0dXJlLCBPUk1fRVhDRVBUSU9OKTsKKyAgICB9CiAKLSAgICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZS5nZXRJZCgpKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGluc2VydEFuY2VzdG9ycyhwcy5nZXRJZCgpLCBjb21taXQpOwotICAgICAgICBkYi5wYXRjaFNldHMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBzKSk7Ci0gICAgICAgIGRiLmNoYW5nZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNoYW5nZSkpOwotICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZVRyYWNraW5nSWRzKGRiLCBjaGFuZ2UsIHRyYWNraW5nRm9vdGVycywgZm9vdGVyTGluZXMpOwotICAgICAgICBhcHByb3ZhbHNVdGlsLmFkZFJldmlld2VycyhjaGFuZ2UsIHBzLCBpbmZvLCByZXZpZXdlcnMpOwotICAgICAgICBkYi5jb21taXQoKTsKLSAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIGRiLnJvbGxiYWNrKCk7CisgICAgcHJpdmF0ZSB2b2lkIGluc2VydENoYW5nZShSZXZpZXdEYiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCk7CisgICAgICBmaW5hbCBMaXN0PEZvb3RlckxpbmU+IGZvb3RlckxpbmVzID0gY29tbWl0LmdldEZvb3RlckxpbmVzKCk7CisgICAgICBmaW5hbCBNYWlsUmVjaXBpZW50cyByZWNpcGllbnRzID0gbmV3IE1haWxSZWNpcGllbnRzKCk7CisgICAgICBpZiAobWFnaWNCcmFuY2ggIT0gbnVsbCkgeworICAgICAgICByZWNpcGllbnRzLmFkZChtYWdpY0JyYW5jaC5nZXRNYWlsUmVjaXBpZW50cygpKTsKICAgICAgIH0KKyAgICAgIHJlY2lwaWVudHMuYWRkKGdldFJlY2lwaWVudHNGcm9tRm9vdGVycyhhY2NvdW50UmVzb2x2ZXIsIHBzLCBmb290ZXJMaW5lcykpOworICAgICAgcmVjaXBpZW50cy5yZW1vdmUobWUpOworCisgICAgICBjaGFuZ2VJbnNlcnRlci5pbnNlcnRDaGFuZ2UoZGIsIGNoYW5nZSwgcHMsIGNvbW1pdCwgbGFiZWxUeXBlcywKKyAgICAgICAgICBmb290ZXJMaW5lcywgaW5mbywgcmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSk7CiAKICAgICAgIGNyZWF0ZWQgPSB0cnVlOwotICAgICAgcmVwbGljYXRpb24uZmlyZShwcm9qZWN0LmdldE5hbWVLZXkoKSwgcHMuZ2V0UmVmTmFtZSgpKTsKLSAgICAgIGhvb2tzLmRvUGF0Y2hzZXRDcmVhdGVkSG9vayhjaGFuZ2UsIHBzLCBkYik7Ci0gICAgICBuZXdQcm9ncmVzcy51cGRhdGUoMSk7CisKICAgICAgIHdvcmtRdWV1ZS5nZXREZWZhdWx0UXVldWUoKQogICAgICAgICAgIC5zdWJtaXQocmVxdWVzdFNjb3BlUHJvcGFnYXRvci53cmFwKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgQE92ZXJyaWRlCkBAIC0xMzMxLDggKzE0ODUsOCBAQAogICAgICAgICAgICAgICAgIGNyZWF0ZUNoYW5nZVNlbmRlckZhY3RvcnkuY3JlYXRlKGNoYW5nZSk7CiAgICAgICAgICAgICBjbS5zZXRGcm9tKG1lKTsKICAgICAgICAgICAgIGNtLnNldFBhdGNoU2V0KHBzLCBpbmZvKTsKLSAgICAgICAgICAgIGNtLmFkZFJldmlld2VycyhyZXZpZXdlcnMpOwotICAgICAgICAgICAgY20uYWRkRXh0cmFDQyhjYyk7CisgICAgICAgICAgICBjbS5hZGRSZXZpZXdlcnMocmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSk7CisgICAgICAgICAgICBjbS5hZGRFeHRyYUNDKHJlY2lwaWVudHMuZ2V0Q2NPbmx5KCkpOwogICAgICAgICAgICAgY20uc2VuZCgpOwogICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBzZW5kIGVtYWlsIGZvciBuZXcgY2hhbmdlICIgKyBjaGFuZ2UuZ2V0SWQoKSwgZSk7CkBAIC0xMzQ3LDE4ICsxNTAxLDEwIEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Jldmlld2VyKGZpbmFsIEZvb3RlckxpbmUgY2FuZGlkYXRlRm9vdGVyTGluZSkgewotICAgIHJldHVybiBjYW5kaWRhdGVGb290ZXJMaW5lLm1hdGNoZXMoRm9vdGVyS2V5LlNJR05FRF9PRkZfQlkpCi0gICAgICAgIHx8IGNhbmRpZGF0ZUZvb3RlckxpbmUubWF0Y2hlcyhGb290ZXJLZXkuQUNLRURfQlkpCi0gICAgICAgIHx8IGNhbmRpZGF0ZUZvb3RlckxpbmUubWF0Y2hlcyhSRVZJRVdFRF9CWSkKLSAgICAgICAgfHwgY2FuZGlkYXRlRm9vdGVyTGluZS5tYXRjaGVzKFRFU1RFRF9CWSk7Ci0gIH0KLQogICBwcml2YXRlIHZvaWQgcHJlcGFyZVBhdGNoU2V0c0ZvclJlcGxhY2UoKSB7CiAgICAgdHJ5IHsKICAgICAgIHJlYWRDaGFuZ2VzRm9yUmVwbGFjZSgpOwogICAgICAgcmVhZFBhdGNoU2V0c0ZvclJlcGxhY2UoKTsKLQogICAgICAgZm9yIChSZXBsYWNlUmVxdWVzdCByZXEgOiByZXBsYWNlQnlDaGFuZ2UudmFsdWVzKCkpIHsKICAgICAgICAgaWYgKHJlcS5pbnB1dENvbW1hbmQuZ2V0UmVzdWx0KCkgPT0gTk9UX0FUVEVNUFRFRCkgewogICAgICAgICAgIHJlcS52YWxpZGF0ZShmYWxzZSk7CkBAIC0xMzg2LDEwICsxNTMyLDEwIEBACiAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG5ld0NoYW5nZSAhPSBudWxsICYmIG5ld0NoYW5nZS5nZXRSZXN1bHQoKSAhPSBOT1RfQVRURU1QVEVEKSB7CisgICAgaWYgKG1hZ2ljQnJhbmNoICE9IG51bGwgJiYgbWFnaWNCcmFuY2guY21kLmdldFJlc3VsdCgpICE9IE5PVF9BVFRFTVBURUQpIHsKICAgICAgIC8vIENhbmNlbCBjcmVhdGlvbnMgdGllZCB0byByZWZzL2Zvci8gb3IgcmVmcy9kcmFmdHMvIGNvbW1hbmQuCiAgICAgICBmb3IgKFJlcGxhY2VSZXF1ZXN0IHJlcSA6IHJlcGxhY2VCeUNoYW5nZS52YWx1ZXMoKSkgewotICAgICAgICBpZiAocmVxLmlucHV0Q29tbWFuZCA9PSBuZXdDaGFuZ2UgJiYgcmVxLmNtZCAhPSBudWxsKSB7CisgICAgICAgIGlmIChyZXEuaW5wdXRDb21tYW5kID09IG1hZ2ljQnJhbmNoLmNtZCAmJiByZXEuY21kICE9IG51bGwpIHsKICAgICAgICAgICByZXEuY21kLnNldFJlc3VsdChSZXN1bHQuUkVKRUNURURfT1RIRVJfUkVBU09OLCAiYWJvcnRlZCIpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xNDY5LDYgKzE2MTUsNyBAQAogICAgICAgfQogCiAgICAgICBycC5nZXRSZXZXYWxrKCkucGFyc2VCb2R5KG5ld0NvbW1pdCk7CisKICAgICAgIGlmICghdmFsaWRDb21taXQoY2hhbmdlQ3RsLmdldFJlZkNvbnRyb2woKSwgaW5wdXRDb21tYW5kLCBuZXdDb21taXQpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KQEAgLTE0OTQsNiArMTY0MSwxMyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgIGZpbmFsIFJldkNvbW1pdCBwcmlvciA9IHJwLmdldFJldldhbGsoKS5wYXJzZUNvbW1pdChjb21taXRJZCk7CiAKKyAgICAgICAgICAvLyBEb24ndCBhbGxvdyB0aGUgc2FtZSBjb21taXQgdG8gYXBwZWFyIHR3aWNlIG9uIHRoZSBzYW1lIGNoYW5nZQorICAgICAgICAgIC8vCisgICAgICAgICAgaWYgKG5ld0NvbW1pdCA9PSBwcmlvcikgeworICAgICAgICAgICAgcmVqZWN0KGlucHV0Q29tbWFuZCwgImNvbW1pdCBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKwogICAgICAgICAgIC8vIERvbid0IGFsbG93IGEgY2hhbmdlIHRvIGRpcmVjdGx5IGRlcGVuZCB1cG9uIGl0c2VsZi4gVGhpcyBpcyBhCiAgICAgICAgICAgLy8gdmVyeSBjb21tb24gZXJyb3IgZHVlIHRvIHVzZXJzIG1ha2luZyBhIG5ldyBjb21taXQgcmF0aGVyIHRoYW4KICAgICAgICAgICAvLyBhbWVuZGluZyB3aGVuIHRyeWluZyB0byBhZGRyZXNzIHJldmlldyBjb21tZW50cy4KQEAgLTE1MDMsMTMgKzE2NTcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIH0KIAotICAgICAgICAgIC8vIERvbid0IGFsbG93IHRoZSBzYW1lIGNvbW1pdCB0byBhcHBlYXIgdHdpY2Ugb24gdGhlIHNhbWUgY2hhbmdlCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAobmV3Q29tbWl0ID09IHByaW9yKSB7Ci0gICAgICAgICAgICByZWplY3QoaW5wdXRDb21tYW5kLCAiY29tbWl0IGFscmVhZHkgZXhpc3RzIik7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotCiAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgdGhlIHNhbWUgdHJlZSBpZiB0aGUgY29tbWl0IG1lc3NhZ2UgaXMgdW5tb2RpZmllZAogICAgICAgICAgIC8vIG9yIG5vIHBhcmVudHMgd2VyZSB1cGRhdGVkIChyZWJhc2UpLCBlbHNlIHdhcm4gdGhhdCBvbmx5IHBhcnQKICAgICAgICAgICAvLyBvZiB0aGUgY29tbWl0IHdhcyBtb2RpZmllZC4KQEAgLTE1NTAsMTIgKzE2OTcsMTMgQEAKICAgICAgICAgfQogICAgICAgfQogCi0gICAgICBjaGFuZ2UubmV4dFBhdGNoU2V0SWQoKTsKLSAgICAgIG5ld1BhdGNoU2V0ID0gbmV3IFBhdGNoU2V0KGNoYW5nZS5jdXJyUGF0Y2hTZXRJZCgpKTsKKyAgICAgIFBhdGNoU2V0LklkIGlkID0KKyAgICAgICAgICBDaGFuZ2VVdGlsLm5leHRQYXRjaFNldElkKGFsbFJlZnMsIGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKKyAgICAgIG5ld1BhdGNoU2V0ID0gbmV3IFBhdGNoU2V0KGlkKTsKICAgICAgIG5ld1BhdGNoU2V0LnNldENyZWF0ZWRPbihuZXcgVGltZXN0YW1wKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7CiAgICAgICBuZXdQYXRjaFNldC5zZXRVcGxvYWRlcihjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CiAgICAgICBuZXdQYXRjaFNldC5zZXRSZXZpc2lvbih0b1JldklkKG5ld0NvbW1pdCkpOwotICAgICAgaWYgKG5ld0NoYW5nZSAhPSBudWxsICYmIE1hZ2ljQnJhbmNoLmlzRHJhZnQobmV3Q2hhbmdlLmdldFJlZk5hbWUoKSkpIHsKKyAgICAgIGlmIChtYWdpY0JyYW5jaCAhPSBudWxsICYmIG1hZ2ljQnJhbmNoLmlzRHJhZnQoKSkgewogICAgICAgICBuZXdQYXRjaFNldC5zZXREcmFmdCh0cnVlKTsKICAgICAgIH0KICAgICAgIGluZm8gPSBwYXRjaFNldEluZm9GYWN0b3J5LmdldChuZXdDb21taXQsIG5ld1BhdGNoU2V0LmdldElkKCkpOwpAQCAtMTU2Niw1MiArMTcxNCw1NSBAQAogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgUGF0Y2hTZXQuSWQgaW5zZXJ0UGF0Y2hTZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgQ2hlY2tlZEZ1dHVyZTxQYXRjaFNldC5JZCwgT3JtRXhjZXB0aW9uPiBpbnNlcnRQYXRjaFNldCgpCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICBycC5nZXRSZXZXYWxrKCkucGFyc2VCb2R5KG5ld0NvbW1pdCk7Ci0gICAgICB3YXJuTWFsZm9ybWVkTWVzc2FnZShuZXdDb21taXQpOwogCi0gICAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gY3VycmVudFVzZXIuZ2V0QWNjb3VudElkKCk7Ci0gICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4ocmV2aWV3ZXJJZCk7Ci0gICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gY2MgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPihjY0lkKTsKLSAgICAgIGZpbmFsIExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVyTGluZXMgPSBuZXdDb21taXQuZ2V0Rm9vdGVyTGluZXMoKTsKLSAgICAgIGZvciAoZmluYWwgRm9vdGVyTGluZSBmb290ZXJMaW5lIDogZm9vdGVyTGluZXMpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAoaXNSZXZpZXdlcihmb290ZXJMaW5lKSkgewotICAgICAgICAgICAgcmV2aWV3ZXJzLmFkZCh0b0FjY291bnRJZChmb290ZXJMaW5lLmdldFZhbHVlKCkudHJpbSgpKSk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChmb290ZXJMaW5lLm1hdGNoZXMoRm9vdGVyS2V5LkNDKSkgewotICAgICAgICAgICAgY2MuYWRkKHRvQWNjb3VudElkKGZvb3RlckxpbmUuZ2V0VmFsdWUoKS50cmltKCkpKTsKKyAgICAgIGZpbmFsIFRocmVhZCBjYWxsZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgTGlzdGVuYWJsZUZ1dHVyZTxQYXRjaFNldC5JZD4gZnV0dXJlID0gY2hhbmdlVXBkYXRlRXhlY3Rvci5zdWJtaXQoCisgICAgICAgICAgcmVxdWVzdFNjb3BlUHJvcGFnYXRvci53cmFwKG5ldyBDYWxsYWJsZTxQYXRjaFNldC5JZD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGF0Y2hTZXQuSWQgY2FsbCgpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY2FsbGVyID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGluc2VydFBhdGNoU2V0KGRiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIFJldmlld0RiIGRiID0gc2NoZW1hRmFjdG9yeS5vcGVuKCk7CisgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc2VydFBhdGNoU2V0KGRiKTsKKyAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAocmVwbGFjZVByb2dyZXNzKSB7CisgICAgICAgICAgICAgIHJlcGxhY2VQcm9ncmVzcy51cGRhdGUoMSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOb1N1Y2hBY2NvdW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgfQotICAgICAgcmV2aWV3ZXJzLnJlbW92ZShtZSk7Ci0gICAgICBjYy5yZW1vdmUobWUpOwotICAgICAgY2MucmVtb3ZlQWxsKHJldmlld2Vycyk7CisgICAgICB9KSk7CisgICAgICByZXR1cm4gRnV0dXJlcy5tYWtlQ2hlY2tlZChmdXR1cmUsIE9STV9FWENFUFRJT04pOworICAgIH0KIAotICAgICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IG9sZFJldmlld2VycyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7Ci0gICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gb2xkQ0MgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOworICAgIFBhdGNoU2V0LklkIGluc2VydFBhdGNoU2V0KFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIEFjY291bnQuSWQgbWUgPSBjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKTsKKyAgICAgIGZpbmFsIExpc3Q8Rm9vdGVyTGluZT4gZm9vdGVyTGluZXMgPSBuZXdDb21taXQuZ2V0Rm9vdGVyTGluZXMoKTsKKyAgICAgIGZpbmFsIE1haWxSZWNpcGllbnRzIHJlY2lwaWVudHMgPSBuZXcgTWFpbFJlY2lwaWVudHMoKTsKKyAgICAgIGlmIChtYWdpY0JyYW5jaCAhPSBudWxsKSB7CisgICAgICAgIHJlY2lwaWVudHMuYWRkKG1hZ2ljQnJhbmNoLmdldE1haWxSZWNpcGllbnRzKCkpOworICAgICAgfQorICAgICAgcmVjaXBpZW50cy5hZGQoZ2V0UmVjaXBpZW50c0Zyb21Gb290ZXJzKGFjY291bnRSZXNvbHZlciwgbmV3UGF0Y2hTZXQsIGZvb3RlckxpbmVzKSk7CisgICAgICByZWNpcGllbnRzLnJlbW92ZShtZSk7CiAKICAgICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZS5nZXRJZCgpKTsKICAgICAgIHRyeSB7Ci0gICAgICAgIGNoYW5nZSA9Ci0gICAgICAgICAgZGIuY2hhbmdlcygpLmF0b21pY1VwZGF0ZShjaGFuZ2UuZ2V0SWQoKSwgbmV3IEF0b21pY1VwZGF0ZTxDaGFuZ2U+KCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ2hhbmdlIHVwZGF0ZShDaGFuZ2UgY2hhbmdlKSB7Ci0gICAgICAgICAgICAgIGlmIChjaGFuZ2UuZ2V0U3RhdHVzKCkuaXNDbG9zZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgY2hhbmdlLnVwZGF0ZU51bWJlck9mUGF0Y2hTZXRzKG5ld1BhdGNoU2V0LmdldFBhdGNoU2V0SWQoKSk7Ci0gICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIGlmIChjaGFuZ2UgPT0gbnVsbCkgeworICAgICAgICBjaGFuZ2UgPSBkYi5jaGFuZ2VzKCkuZ2V0KGNoYW5nZS5nZXRJZCgpKTsKKyAgICAgICAgaWYgKGNoYW5nZSA9PSBudWxsIHx8IGNoYW5nZS5nZXRTdGF0dXMoKS5pc0Nsb3NlZCgpKSB7CiAgICAgICAgICAgcmVqZWN0KGlucHV0Q29tbWFuZCwgImNoYW5nZSBpcyBjbG9zZWQiKTsKICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGluc2VydEFuY2VzdG9ycyhuZXdQYXRjaFNldC5nZXRJZCgpLCBuZXdDb21taXQpOworICAgICAgICBDaGFuZ2VVdGlsLmluc2VydEFuY2VzdG9ycyhkYiwgbmV3UGF0Y2hTZXQuZ2V0SWQoKSwgbmV3Q29tbWl0KTsKICAgICAgICAgZGIucGF0Y2hTZXRzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXdQYXRjaFNldCkpOwogCiAgICAgICAgIGlmIChjaGVja01lcmdlZEludG8pIHsKQEAgLTE2MTksMjIgKzE3NzAsMTMgQEAKICAgICAgICAgICBtZXJnZWRJbnRvUmVmID0gbWVyZ2VkSW50byAhPSBudWxsID8gbWVyZ2VkSW50by5nZXROYW1lKCkgOiBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBwYXRjaFNldEFwcHJvdmFscyA9IGFwcHJvdmFsc1V0aWwuY29weVZldG9zVG9MYXRlc3RQYXRjaFNldChjaGFuZ2UpOwotCi0gICAgICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBoYXZlQXBwcm92YWxzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKLSAgICAgICAgb2xkUmV2aWV3ZXJzLmNsZWFyKCk7Ci0gICAgICAgIG9sZENDLmNsZWFyKCk7Ci0KLSAgICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBwYXRjaFNldEFwcHJvdmFscykgewotICAgICAgICAgIGhhdmVBcHByb3ZhbHMuYWRkKGEuZ2V0QWNjb3VudElkKCkpOwotICAgICAgICAgIGlmIChhLmdldFZhbHVlKCkgIT0gMCkgewotICAgICAgICAgICAgb2xkUmV2aWV3ZXJzLmFkZChhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2xkQ0MuYWRkKGEuZ2V0QWNjb3VudElkKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFwcHJvdmFsc1V0aWwuYWRkUmV2aWV3ZXJzKGNoYW5nZSwgbmV3UGF0Y2hTZXQsIGluZm8sIHJldmlld2VycywgaGF2ZUFwcHJvdmFscyk7CisgICAgICAgIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gcGF0Y2hTZXRBcHByb3ZhbHMgPQorICAgICAgICAgICAgYXBwcm92YWxzVXRpbC5jb3B5VmV0b3NUb1BhdGNoU2V0KGRiLCBsYWJlbFR5cGVzLCBuZXdQYXRjaFNldC5nZXRJZCgpKTsKKyAgICAgICAgZmluYWwgTWFpbFJlY2lwaWVudHMgb2xkUmVjaXBpZW50cyA9CisgICAgICAgICAgICBnZXRSZWNpcGllbnRzRnJvbUFwcHJvdmFscyhwYXRjaFNldEFwcHJvdmFscyk7CisgICAgICAgIGFwcHJvdmFsc1V0aWwuYWRkUmV2aWV3ZXJzKGRiLCBsYWJlbFR5cGVzLCBjaGFuZ2UsIG5ld1BhdGNoU2V0LCBpbmZvLAorICAgICAgICAgICAgcmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSwgb2xkUmVjaXBpZW50cy5nZXRBbGwoKSk7CisgICAgICAgIHJlY2lwaWVudHMuYWRkKG9sZFJlY2lwaWVudHMpOwogCiAgICAgICAgIG1zZyA9CiAgICAgICAgICAgICBuZXcgQ2hhbmdlTWVzc2FnZShuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoY2hhbmdlLmdldElkKCksIENoYW5nZVV0aWwKQEAgLTE2NjAsOCArMTgwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7CiAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgIGlmIChkZXN0VG9waWNOYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldFRvcGljKGRlc3RUb3BpY05hbWUpOworICAgICAgICAgICAgICAgICAgaWYgKG1hZ2ljQnJhbmNoICE9IG51bGwgJiYgbWFnaWNCcmFuY2gudG9waWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0VG9waWMobWFnaWNCcmFuY2gudG9waWMpOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkRSQUZUICYmIG5ld1BhdGNoU2V0LmlzRHJhZnQoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBMZWF2ZSBpbiBkcmFmdCBzdGF0dXMuCkBAIC0xNjcwLDYgKzE4MTIsMTQgQEAKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGNoYW5nZS5zZXRMYXN0U2hhMU1lcmdlVGVzdGVkKG51bGwpOwogICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldEN1cnJlbnRQYXRjaFNldChpbmZvKTsKKworICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGlkTGlzdCA9IG5ld0NvbW1pdC5nZXRGb290ZXJMaW5lcyhDSEFOR0VfSUQpOworICAgICAgICAgICAgICAgICAgaWYgKGlkTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlLnNldEtleShuZXcgQ2hhbmdlLktleSgiSSIgKyBuZXdDb21taXQubmFtZSgpKSk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2Uuc2V0S2V5KG5ldyBDaGFuZ2UuS2V5KGlkTGlzdC5nZXQoaWRMaXN0LnNpemUoKSAtIDEpLnRyaW0oKSkpOworICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICBDaGFuZ2VVdGlsLnVwZGF0ZWQoY2hhbmdlKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY5Niw5ICsxODQ2LDkgQEAKICAgICAgIGlmIChjbWQuZ2V0UmVzdWx0KCkgPT0gTk9UX0FUVEVNUFRFRCkgewogICAgICAgICBjbWQuZXhlY3V0ZShycCk7CiAgICAgICB9Ci0gICAgICByZXBsaWNhdGlvbi5maXJlKHByb2plY3QuZ2V0TmFtZUtleSgpLCBuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCkpOworICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKHByb2plY3QuZ2V0TmFtZUtleSgpLCBuZXdQYXRjaFNldC5nZXRSZWZOYW1lKCksCisgICAgICAgICAgT2JqZWN0SWQuemVyb0lkKCksIG5ld0NvbW1pdCk7CiAgICAgICBob29rcy5kb1BhdGNoc2V0Q3JlYXRlZEhvb2soY2hhbmdlLCBuZXdQYXRjaFNldCwgZGIpOwotICAgICAgcmVwbGFjZVByb2dyZXNzLnVwZGF0ZSgxKTsKICAgICAgIGlmIChtZXJnZWRJbnRvUmVmICE9IG51bGwpIHsKICAgICAgICAgaG9va3MuZG9DaGFuZ2VNZXJnZWRIb29rKAogICAgICAgICAgICAgY2hhbmdlLCBjdXJyZW50VXNlci5nZXRBY2NvdW50KCksIG5ld1BhdGNoU2V0LCBkYik7CkBAIC0xNzEzLDEwICsxODYzLDggQEAKICAgICAgICAgICAgIGNtLnNldEZyb20obWUpOwogICAgICAgICAgICAgY20uc2V0UGF0Y2hTZXQobmV3UGF0Y2hTZXQsIGluZm8pOwogICAgICAgICAgICAgY20uc2V0Q2hhbmdlTWVzc2FnZShtc2cpOwotICAgICAgICAgICAgY20uYWRkUmV2aWV3ZXJzKHJldmlld2Vycyk7Ci0gICAgICAgICAgICBjbS5hZGRFeHRyYUNDKGNjKTsKLSAgICAgICAgICAgIGNtLmFkZFJldmlld2VycyhvbGRSZXZpZXdlcnMpOwotICAgICAgICAgICAgY20uYWRkRXh0cmFDQyhvbGRDQyk7CisgICAgICAgICAgICBjbS5hZGRSZXZpZXdlcnMocmVjaXBpZW50cy5nZXRSZXZpZXdlcnMoKSk7CisgICAgICAgICAgICBjbS5hZGRFeHRyYUNDKHJlY2lwaWVudHMuZ2V0Q2NPbmx5KCkpOwogICAgICAgICAgICAgY20uc2VuZCgpOwogICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBzZW5kIGVtYWlsIGZvciBuZXcgcGF0Y2ggc2V0ICIgKyBuZXdQYXRjaFNldC5nZXRJZCgpLCBlKTsKQEAgLTE4MDMsNyArMTk1MSw3IEBACiAgICAgICAgICYmIGN0bC5jYW5Gb3JnZUNvbW1pdHRlcigpCiAgICAgICAgICYmIGN0bC5jYW5Gb3JnZUdlcnJpdFNlcnZlcklkZW50aXR5KCkKICAgICAgICAgJiYgY3RsLmNhblVwbG9hZE1lcmdlcygpCi0gICAgICAgICYmICFwcm9qZWN0LmlzVXNlU2lnbmVkT2ZmQnkoKQorICAgICAgICAmJiAhcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdFN0YXRlKCkuaXNVc2VTaWduZWRPZmZCeSgpCiAgICAgICAgICYmIEl0ZXJhYmxlcy5pc0VtcHR5KHJlamVjdENvbW1pdHMpCiAgICAgICAgICYmICFHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLmVxdWFscyhjdGwuZ2V0UmVmTmFtZSgpKQogICAgICAgICAmJiAhKE1hZ2ljQnJhbmNoLmlzTWFnaWNCcmFuY2goY21kLmdldFJlZk5hbWUoKSkKQEAgLTE4MTcsNyArMTk2NSw3IEBACiAgICAgdHJ5IHsKICAgICAgIFNldDxPYmplY3RJZD4gZXhpc3RpbmcgPSBTZXRzLm5ld0hhc2hTZXQoKTsKICAgICAgIHdhbGsubWFya1N0YXJ0KHdhbGsucGFyc2VDb21taXQoY21kLmdldE5ld0lkKCkpKTsKLSAgICAgIG1hcmtIZWFkc0FzVW5pbnRlcmVzdGluZyh3YWxrLCBleGlzdGluZyk7CisgICAgICBtYXJrSGVhZHNBc1VuaW50ZXJlc3Rpbmcod2FsaywgZXhpc3RpbmcsIGNtZC5nZXRSZWZOYW1lKCkpOwogCiAgICAgICBSZXZDb21taXQgYzsKICAgICAgIHdoaWxlICgoYyA9IHdhbGsubmV4dCgpKSAhPSBudWxsKSB7CkBAIC0xODM1LDIyMiArMTk4MywyNyBAQAogCiAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZENvbW1pdChmaW5hbCBSZWZDb250cm9sIGN0bCwgZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kLAogICAgICAgZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0gICAgcnAuZ2V0UmV2V2FsaygpLnBhcnNlQm9keShjKTsKLSAgICBmaW5hbCBQZXJzb25JZGVudCBjb21taXR0ZXIgPSBjLmdldENvbW1pdHRlcklkZW50KCk7Ci0gICAgZmluYWwgUGVyc29uSWRlbnQgYXV0aG9yID0gYy5nZXRBdXRob3JJZGVudCgpOwogCi0gICAgLy8gUmVxdWlyZSBwZXJtaXNzaW9uIHRvIHVwbG9hZCBtZXJnZXMuCi0gICAgaWYgKGMuZ2V0UGFyZW50Q291bnQoKSA+IDEgJiYgIWN0bC5jYW5VcGxvYWRNZXJnZXMoKSkgewotICAgICAgcmVqZWN0KGNtZCwgInlvdSBhcmUgbm90IGFsbG93ZWQgdG8gdXBsb2FkIG1lcmdlcyIpOworICAgIGlmICh2YWxpZENvbW1pdHMuY29udGFpbnMoYykpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50ID0KKyAgICAgICAgbmV3IENvbW1pdFJlY2VpdmVkRXZlbnQoY21kLCBwcm9qZWN0LCBjdGwuZ2V0UmVmTmFtZSgpLCBjLCBjdXJyZW50VXNlcik7CisgICAgQ29tbWl0VmFsaWRhdG9ycyBjb21taXRWYWxpZGF0b3JzID0KKyAgICAgICAgY29tbWl0VmFsaWRhdG9yc0ZhY3RvcnkuY3JlYXRlKGN0bCwgc3NoSW5mbywgcmVwbyk7CisKKyAgICB0cnkgeworICAgICAgbWVzc2FnZXMuYWRkQWxsKGNvbW1pdFZhbGlkYXRvcnMudmFsaWRhdGVGb3JSZWNlaXZlQ29tbWl0cyhyZWNlaXZlRXZlbnQpKTsKKyAgICB9IGNhdGNoIChDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgIG1lc3NhZ2VzLmFkZEFsbChlLmdldE1lc3NhZ2VzKCkpOworICAgICAgcmVqZWN0KGNtZCwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLQotICAgIC8vIERvbid0IGFsbG93IHRoZSB1c2VyIHRvIGFtZW5kIGEgbWVyZ2UgY3JlYXRlZCBieSBHZXJyaXQgQ29kZSBSZXZpZXcuCi0gICAgLy8gVGhpcyBzZWVtcyB0byBoYXBwZW4gYWxsIHRvbyBvZnRlbiwgZHVlIHRvIHVzZXJzIG5vdCBwYXlpbmcgYW55Ci0gICAgLy8gYXR0ZW50aW9uIHRvIHdoYXQgdGhleSBhcmUgZG9pbmcuCi0gICAgLy8KLSAgICBpZiAoYy5nZXRQYXJlbnRDb3VudCgpID4gMQotICAgICAgICAmJiBhdXRob3IuZ2V0TmFtZSgpLmVxdWFscyhnZXJyaXRJZGVudC5nZXROYW1lKCkpCi0gICAgICAgICYmIGF1dGhvci5nZXRFbWFpbEFkZHJlc3MoKS5lcXVhbHMoZ2Vycml0SWRlbnQuZ2V0RW1haWxBZGRyZXNzKCkpCi0gICAgICAgICYmICFjdGwuY2FuRm9yZ2VHZXJyaXRTZXJ2ZXJJZGVudGl0eSgpKSB7Ci0gICAgICByZWplY3QoY21kLCAiZG8gbm90IGFtZW5kIG1lcmdlcyBub3QgbWFkZSBieSB5b3UiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBSZXF1aXJlIHRoYXQgYXV0aG9yIG1hdGNoZXMgdGhlIHVwbG9hZGVyLgotICAgIC8vCi0gICAgaWYgKCFjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpLmNvbnRhaW5zKGF1dGhvci5nZXRFbWFpbEFkZHJlc3MoKSkKLSAgICAgICAgJiYgIWN0bC5jYW5Gb3JnZUF1dGhvcigpKSB7Ci0gICAgICBzZW5kSW52YWxpZEVtYWlsRXJyb3IoYywgImF1dGhvciIsIGF1dGhvcik7Ci0gICAgICByZWplY3QoY21kLCAiaW52YWxpZCBhdXRob3IiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBSZXF1aXJlIHRoYXQgY29tbWl0dGVyIG1hdGNoZXMgdGhlIHVwbG9hZGVyLgotICAgIC8vCi0gICAgaWYgKCFjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpLmNvbnRhaW5zKGNvbW1pdHRlci5nZXRFbWFpbEFkZHJlc3MoKSkKLSAgICAgICAgJiYgIWN0bC5jYW5Gb3JnZUNvbW1pdHRlcigpKSB7Ci0gICAgICBzZW5kSW52YWxpZEVtYWlsRXJyb3IoYywgImNvbW1pdHRlciIsIGNvbW1pdHRlcik7Ci0gICAgICByZWplY3QoY21kLCAiaW52YWxpZCBjb21taXR0ZXIiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAocHJvamVjdC5pc1VzZVNpZ25lZE9mZkJ5KCkpIHsKLSAgICAgIC8vIElmIHRoZSBwcm9qZWN0IHdhbnRzIFNpZ25lZC1vZmYtYnkgLyBBY2tlZC1ieSBsaW5lcywgdmVyaWZ5IHdlCi0gICAgICAvLyBoYXZlIHRoZW0gZm9yIHRoZSBibGFtYWJsZSBwYXJ0aWVzIGludm9sdmVkIG9uIHRoaXMgY2hhbmdlLgotICAgICAgLy8KLSAgICAgIGJvb2xlYW4gc2JvQXV0aG9yID0gZmFsc2UsIHNib0NvbW1pdHRlciA9IGZhbHNlLCBzYm9NZSA9IGZhbHNlOwotICAgICAgZm9yIChmaW5hbCBGb290ZXJMaW5lIGZvb3RlciA6IGMuZ2V0Rm9vdGVyTGluZXMoKSkgewotICAgICAgICBpZiAoZm9vdGVyLm1hdGNoZXMoRm9vdGVyS2V5LlNJR05FRF9PRkZfQlkpKSB7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nIGUgPSBmb290ZXIuZ2V0RW1haWxBZGRyZXNzKCk7Ci0gICAgICAgICAgaWYgKGUgIT0gbnVsbCkgewotICAgICAgICAgICAgc2JvQXV0aG9yIHw9IGF1dGhvci5nZXRFbWFpbEFkZHJlc3MoKS5lcXVhbHMoZSk7Ci0gICAgICAgICAgICBzYm9Db21taXR0ZXIgfD0gY29tbWl0dGVyLmdldEVtYWlsQWRkcmVzcygpLmVxdWFscyhlKTsKLSAgICAgICAgICAgIHNib01lIHw9IGN1cnJlbnRVc2VyLmdldEVtYWlsQWRkcmVzc2VzKCkuY29udGFpbnMoZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIXNib0F1dGhvciAmJiAhc2JvQ29tbWl0dGVyICYmICFzYm9NZSAmJiAhY3RsLmNhbkZvcmdlQ29tbWl0dGVyKCkpIHsKLSAgICAgICAgcmVqZWN0KGNtZCwgIm5vdCBTaWduZWQtb2ZmLWJ5IGF1dGhvci9jb21taXR0ZXIvdXBsb2FkZXIiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBpZExpc3QgPSBjLmdldEZvb3RlckxpbmVzKENIQU5HRV9JRCk7Ci0gICAgaWYgKE1hZ2ljQnJhbmNoLmlzTWFnaWNCcmFuY2goY21kLmdldFJlZk5hbWUoKSkgfHwgTkVXX1BBVENIU0VULm1hdGNoZXIoY21kLmdldFJlZk5hbWUoKSkubWF0Y2hlcygpKSB7Ci0gICAgICBpZiAoaWRMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICBpZiAocHJvamVjdC5pc1JlcXVpcmVDaGFuZ2VJRCgpKSB7Ci0gICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJtaXNzaW5nIENoYW5nZS1JZCBpbiBjb21taXQgbWVzc2FnZSI7Ci0gICAgICAgICAgcmVqZWN0KGNtZCwgZXJyTXNnKTsKLSAgICAgICAgICBhZGRNZXNzYWdlKGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKGVyck1zZywgYykpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChpZExpc3Quc2l6ZSgpID4gMSkgewotICAgICAgICByZWplY3QoY21kLCAibXVsdGlwbGUgQ2hhbmdlLUlkIGxpbmVzIGluIGNvbW1pdCBtZXNzYWdlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB2ID0gaWRMaXN0LmdldChpZExpc3Quc2l6ZSgpIC0gMSkudHJpbSgpOwotICAgICAgICBpZiAoIXYubWF0Y2hlcygiXklbMC05YS1mXXs4LH0uKiQiKSkgewotICAgICAgICAgIGZpbmFsIFN0cmluZyBlcnJNc2cgPQotICAgICAgICAgICAgICAibWlzc2luZyBvciBpbnZhbGlkIENoYW5nZS1JZCBsaW5lIGZvcm1hdCBpbiBjb21taXQgbWVzc2FnZSI7Ci0gICAgICAgICAgcmVqZWN0KGNtZCwgZXJyTXNnKTsKLSAgICAgICAgICBhZGRNZXNzYWdlKGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKGVyck1zZywgYykpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIGZvciBiYW5uZWQgY29tbWl0cyB0byBwcmV2ZW50IHRoZW0gZnJvbSBlbnRlcmluZyB0aGUgdHJlZSBhZ2Fpbi4KLSAgICBpZiAocmVqZWN0Q29tbWl0cy5jb250YWlucyhjKSkgewotICAgICAgcmVqZWN0KGNtZCwgImNvbnRhaW5zIGJhbm5lZCBjb21taXQgIiArIGMuZ2V0TmFtZSgpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGlzIGlzIHRoZSBzcGVjaWFsIHByb2plY3QgY29uZmlndXJhdGlvbiBicmFuY2gsIHZhbGlkYXRlIHRoZSBjb25maWcuCi0gICAgaWYgKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcuZXF1YWxzKGN0bC5nZXRSZWZOYW1lKCkpKSB7Ci0gICAgICB0cnkgewotICAgICAgICBQcm9qZWN0Q29uZmlnIGNmZyA9IG5ldyBQcm9qZWN0Q29uZmlnKHByb2plY3QuZ2V0TmFtZUtleSgpKTsKLSAgICAgICAgY2ZnLmxvYWQocmVwbywgY21kLmdldE5ld0lkKCkpOwotICAgICAgICBpZiAoIWNmZy5nZXRWYWxpZGF0aW9uRXJyb3JzKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgYWRkRXJyb3IoIkludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uOiIpOwotICAgICAgICAgIGZvciAoVmFsaWRhdGlvbkVycm9yIGVyciA6IGNmZy5nZXRWYWxpZGF0aW9uRXJyb3JzKCkpIHsKLSAgICAgICAgICAgIGFkZEVycm9yKCIgICIgKyBlcnIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVqZWN0KGNtZCwgImludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uIik7Ci0gICAgICAgICAgbG9nLmVycm9yKCJVc2VyICIgKyBjdXJyZW50VXNlci5nZXRVc2VyTmFtZSgpCi0gICAgICAgICAgICAgICsgIiB0cmllZCB0byBwdXNoIGludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uICIKLSAgICAgICAgICAgICAgKyBjbWQuZ2V0TmV3SWQoKS5uYW1lKCkgKyAiIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcmVqZWN0KGNtZCwgImludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uIik7Ci0gICAgICAgIGxvZy5lcnJvcigiVXNlciAiICsgY3VycmVudFVzZXIuZ2V0VXNlck5hbWUoKQotICAgICAgICAgICAgKyAiIHRyaWVkIHRvIHB1c2ggaW52YWxpZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gIgotICAgICAgICAgICAgKyBjbWQuZ2V0TmV3SWQoKS5uYW1lKCkgKyAiIGZvciAiICsgcHJvamVjdC5nZXROYW1lKCksIGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCisgICAgdmFsaWRDb21taXRzLmFkZChjKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIHByaXZhdGUgU3RyaW5nIGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKFN0cmluZyBlcnJNc2csIFJldkNvbW1pdCBjKSB7Ci0gICAgLy8gV2UgaGFuZGxlIDMgY2FzZXM6Ci0gICAgLy8gMS4gTm8gY2hhbmdlIGlkIGluIHRoZSBjb21taXQgbWVzc2FnZSBhdCBhbGwuCi0gICAgLy8gMi4gY2hhbmdlIGlkIGxhc3QgaW4gdGhlIGNvbW1pdCBtZXNzYWdlIGJ1dCBtaXNzaW5nIGVtcHR5IGxpbmUgdG8gY3JlYXRlIHRoZSBmb290ZXIuCi0gICAgLy8gMy4gdGhlcmUgaXMgYSBjaGFuZ2UtaWQgc29tZXdoZXJlIGluIHRoZSBjb21taXQgbWVzc2FnZSwgYnV0IHdlIGlnbm9yZSBpdC4KLSAgICBmaW5hbCBTdHJpbmcgY2hhbmdlSWQgPSAiQ2hhbmdlLUlkOiI7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgc2IuYXBwZW5kKCJFUlJPUjogIikuYXBwZW5kKGVyck1zZyk7Ci0gICAgc2IuYXBwZW5kKCJcbiIpOwotICAgIHNiLmFwcGVuZCgiU3VnZ2VzdGlvbiBmb3IgY29tbWl0IG1lc3NhZ2U6XG4iKTsKLQotICAgIGlmIChjLmdldEZ1bGxNZXNzYWdlKCkuaW5kZXhPZihjaGFuZ2VJZCk9PS0xKSB7Ci0gICAgICBzYi5hcHBlbmQoYy5nZXRGdWxsTWVzc2FnZSgpKTsKLSAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgIHNiLmFwcGVuZChjaGFuZ2VJZCkuYXBwZW5kKCIgSSIpLmFwcGVuZChjLm5hbWUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFN0cmluZyBsaW5lc1tdID0gYy5nZXRGdWxsTWVzc2FnZSgpLnRyaW0oKS5zcGxpdCgiXG4iKTsKLSAgICAgIFN0cmluZyBsYXN0TGluZSA9IGxpbmVzLmxlbmd0aCA+IDAgPyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA6ICIiOwotCi0gICAgICBpZiAobGFzdExpbmUuaW5kZXhPZihjaGFuZ2VJZCk9PTApIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHsKLSAgICAgICAgICBzYi5hcHBlbmQobGluZXNbaV0pOwotICAgICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgc2IuYXBwZW5kKGxhc3RMaW5lKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNiLmFwcGVuZChjLmdldEZ1bGxNZXNzYWdlKCkpOwotICAgICAgICBzYi5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHNiLmFwcGVuZChjaGFuZ2VJZCkuYXBwZW5kKCIgSSIpLmFwcGVuZChjLm5hbWUoKSk7Ci0gICAgICAgIHNiLmFwcGVuZCgiXG5IaW50OiBBIHBvdGVudGlhbCBDaGFuZ2UtSWQgd2FzIGZvdW5kLCBidXQgaXQgd2FzIG5vdCBpbiB0aGUgZm9vdGVyIG9mIHRoZSBjb21taXQgbWVzc2FnZS4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzZW5kSW52YWxpZEVtYWlsRXJyb3IoUmV2Q29tbWl0IGMsIFN0cmluZyB0eXBlLCBQZXJzb25JZGVudCB3aG8pIHsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzYi5hcHBlbmQoIlxuIik7Ci0gICAgc2IuYXBwZW5kKCJFUlJPUjogIEluIGNvbW1pdCAiICsgYy5uYW1lKCkgKyAiXG4iKTsKLSAgICBzYi5hcHBlbmQoIkVSUk9SOiAgIiArIHR5cGUgKyAiIGVtYWlsIGFkZHJlc3MgIiArIHdoby5nZXRFbWFpbEFkZHJlc3MoKSArICJcbiIpOwotICAgIHNiLmFwcGVuZCgiRVJST1I6ICBkb2VzIG5vdCBtYXRjaCB5b3VyIHVzZXIgYWNjb3VudC5cbiIpOwotICAgIHNiLmFwcGVuZCgiRVJST1I6XG4iKTsKLSAgICBpZiAoY3VycmVudFVzZXIuZ2V0RW1haWxBZGRyZXNzZXMoKS5pc0VtcHR5KCkpIHsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBZb3UgaGF2ZSBub3QgcmVnaXN0ZXJlZCBhbnkgZW1haWwgYWRkcmVzc2VzLlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBUaGUgZm9sbG93aW5nIGFkZHJlc3NlcyBhcmUgY3VycmVudGx5IHJlZ2lzdGVyZWQ6XG4iKTsKLSAgICAgIGZvciAoU3RyaW5nIGFkZHJlc3MgOiBjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpKSB7Ci0gICAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICAgICIgKyBhZGRyZXNzICsgIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHNiLmFwcGVuZCgiRVJST1I6XG4iKTsKLSAgICBpZiAoY2Fub25pY2FsV2ViVXJsICE9IG51bGwpIHsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICBUbyByZWdpc3RlciBhbiBlbWFpbCBhZGRyZXNzLCBwbGVhc2UgdmlzaXQ6XG4iKTsKLSAgICAgIHNiLmFwcGVuZCgiRVJST1I6ICAiICsgY2Fub25pY2FsV2ViVXJsICsgIiMiICsgUGFnZUxpbmtzLlNFVFRJTkdTX0NPTlRBQ1QgKyAiXG4iKTsKLSAgICB9Ci0gICAgc2IuYXBwZW5kKCJcbiIpOwotICAgIGFkZE1lc3NhZ2Uoc2IudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd2Fybk1hbGZvcm1lZE1lc3NhZ2UoUmV2Q29tbWl0IGMpIHsKLSAgICBPYmplY3RSZWFkZXIgcmVhZGVyID0gcnAuZ2V0UmV2V2FsaygpLmdldE9iamVjdFJlYWRlcigpOwotICAgIGlmICg2NSA8IGMuZ2V0U2hvcnRNZXNzYWdlKCkubGVuZ3RoKCkpIHsKLSAgICAgIEFiYnJldmlhdGVkT2JqZWN0SWQgaWQ7Ci0gICAgICB0cnkgewotICAgICAgICBpZCA9IHJlYWRlci5hYmJyZXZpYXRlKGMpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgIGlkID0gYy5hYmJyZXZpYXRlKDYpOwotICAgICAgfQotICAgICAgYWRkTWVzc2FnZSgiKFcpICIgKyBpZC5uYW1lKCkgLy8KLSAgICAgICAgICArICI6IGNvbW1pdCBzdWJqZWN0ID42NSBjaGFyYWN0ZXJzOyB1c2Ugc2hvcnRlciBmaXJzdCBwYXJhZ3JhcGgiKTsKLSAgICB9Ci0KLSAgICBpbnQgbG9uZ0xpbmVDbnQgPSAwLCBub25FbXB0eUNudCA9IDA7Ci0gICAgZm9yIChTdHJpbmcgbGluZSA6IGMuZ2V0RnVsbE1lc3NhZ2UoKS5zcGxpdCgiXG4iKSkgewotICAgICAgaWYgKCFsaW5lLnRyaW0oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgbm9uRW1wdHlDbnQrKzsKLSAgICAgIH0KLSAgICAgIGlmICg3MCA8IGxpbmUubGVuZ3RoKCkpIHsKLSAgICAgICAgbG9uZ0xpbmVDbnQrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoMCA8IGxvbmdMaW5lQ250ICYmIDMzIDwgbG9uZ0xpbmVDbnQgKiAxMDAgLyBub25FbXB0eUNudCkgewotICAgICAgQWJicmV2aWF0ZWRPYmplY3RJZCBpZDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGlkID0gcmVhZGVyLmFiYnJldmlhdGUoYyk7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgaWQgPSBjLmFiYnJldmlhdGUoNik7Ci0gICAgICB9Ci0gICAgICBhZGRNZXNzYWdlKCIoVykgIiArIGlkLm5hbWUoKSAvLwotICAgICAgICAgICsgIjogY29tbWl0IG1lc3NhZ2UgbGluZXMgPjcwIGNoYXJhY3RlcnM7IG1hbnVhbGx5IHdyYXAgbGluZXMiKTsKLSAgICB9Ci0gIH0KLQogICBwcml2YXRlIHZvaWQgYXV0b0Nsb3NlQ2hhbmdlcyhmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQpIHsKICAgICBmaW5hbCBSZXZXYWxrIHJ3ID0gcnAuZ2V0UmV2V2FsaygpOwogICAgIHRyeSB7CkBAIC0yMDYwLDIwICsyMDEzLDIyIEBACiAgICAgICAgIHJ3Lm1hcmtVbmludGVyZXN0aW5nKHJ3LnBhcnNlQ29tbWl0KGNtZC5nZXRPbGRJZCgpKSk7CiAgICAgICB9CiAKLSAgICAgIGZpbmFsIE1hcDxPYmplY3RJZCwgUmVmPiBieUNvbW1pdCA9IGNoYW5nZVJlZnNCeUlkKCk7CisgICAgICBmaW5hbCBTZXRNdWx0aW1hcDxPYmplY3RJZCwgUmVmPiBieUNvbW1pdCA9IGNoYW5nZVJlZnNCeUlkKCk7CiAgICAgICBmaW5hbCBNYXA8Q2hhbmdlLktleSwgQ2hhbmdlLklkPiBieUtleSA9IG9wZW5DaGFuZ2VzQnlLZXkoCiAgICAgICAgICAgbmV3IEJyYW5jaC5OYW1lS2V5KHByb2plY3QuZ2V0TmFtZUtleSgpLCBjbWQuZ2V0UmVmTmFtZSgpKSk7CiAgICAgICBmaW5hbCBMaXN0PFJlcGxhY2VSZXF1ZXN0PiB0b0Nsb3NlID0gbmV3IEFycmF5TGlzdDxSZXBsYWNlUmVxdWVzdD4oKTsKICAgICAgIFJldkNvbW1pdCBjOwogICAgICAgd2hpbGUgKChjID0gcncubmV4dCgpKSAhPSBudWxsKSB7Ci0gICAgICAgIGZpbmFsIFJlZiByZWYgPSBieUNvbW1pdC5nZXQoYy5jb3B5KCkpOwotICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKLSAgICAgICAgICBydy5wYXJzZUJvZHkoYyk7Ci0gICAgICAgICAgQ2hhbmdlLktleSBjbG9zZWRDaGFuZ2UgPQotICAgICAgICAgICAgICBjbG9zZUNoYW5nZShjbWQsIFBhdGNoU2V0LklkLmZyb21SZWYocmVmLmdldE5hbWUoKSksIGMpOwotICAgICAgICAgIGNsb3NlUHJvZ3Jlc3MudXBkYXRlKDEpOwotICAgICAgICAgIGlmIChjbG9zZWRDaGFuZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgYnlLZXkucmVtb3ZlKGNsb3NlZENoYW5nZSk7CisgICAgICAgIGZpbmFsIFNldDxSZWY+IHJlZnMgPSBieUNvbW1pdC5nZXQoYy5jb3B5KCkpOworICAgICAgICBmb3IgKFJlZiByZWYgOiByZWZzKSB7CisgICAgICAgICAgaWYgKHJlZiAhPSBudWxsKSB7CisgICAgICAgICAgICBydy5wYXJzZUJvZHkoYyk7CisgICAgICAgICAgICBDaGFuZ2UuS2V5IGNsb3NlZENoYW5nZSA9CisgICAgICAgICAgICAgICAgY2xvc2VDaGFuZ2UoY21kLCBQYXRjaFNldC5JZC5mcm9tUmVmKHJlZi5nZXROYW1lKCkpLCBjKTsKKyAgICAgICAgICAgIGNsb3NlUHJvZ3Jlc3MudXBkYXRlKDEpOworICAgICAgICAgICAgaWYgKGNsb3NlZENoYW5nZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgIGJ5S2V5LnJlbW92ZShjbG9zZWRDaGFuZ2UpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yMDkxLDcgKzIwNDYsOSBAQAogICAgICAgfQogCiAgICAgICBmb3IgKGZpbmFsIFJlcGxhY2VSZXF1ZXN0IHJlcSA6IHRvQ2xvc2UpIHsKLSAgICAgICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNpID0gcmVxLnZhbGlkYXRlKHRydWUpID8gcmVxLmluc2VydFBhdGNoU2V0KCkgOiBudWxsOworICAgICAgICBmaW5hbCBQYXRjaFNldC5JZCBwc2kgPSByZXEudmFsaWRhdGUodHJ1ZSkKKyAgICAgICAgICAgID8gcmVxLmluc2VydFBhdGNoU2V0KCkuY2hlY2tlZEdldCgpCisgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgIGlmIChwc2kgIT0gbnVsbCkgewogICAgICAgICAgIGNsb3NlQ2hhbmdlKHJlcS5pbnB1dENvbW1hbmQsIHBzaSwgcmVxLm5ld0NvbW1pdCk7CiAgICAgICAgICAgY2xvc2VQcm9ncmVzcy51cGRhdGUoMSk7CkBAIC0yMTMxLDEwICsyMDg4LDEwIEBACiAgICAgfQogCiAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLk1FUkdFRCB8fAotICAgICAgICBjaGFuZ2UuZ2V0U3RhdHVzKCkgPT0gQ2hhbmdlLlN0YXR1cy5BQkFORE9ORUQpIHsKLSAgICAgIC8vIElmIGl0cyBhbHJlYWR5IG1lcmdlZCwgZG9uJ3QgbWFrZSBmdXJ0aGVyIHVwZGF0ZXMsIGl0Ci0gICAgICAvLyBtaWdodCBqdXN0IGJlIG1vdmluZyBmcm9tIGFuIGV4cGVyaW1lbnRhbCBicmFuY2ggaW50bwotICAgICAgLy8gYSBtb3JlIHN0YWJsZSBicmFuY2guCisgICAgICAgIGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkFCQU5ET05FRCB8fAorICAgICAgICAhY2hhbmdlLmdldERlc3QoKS5nZXQoKS5lcXVhbHMocmVmTmFtZSkpIHsKKyAgICAgIC8vIElmIGl0J3MgYWxyZWFkeSBtZXJnZWQgb3IgdGhlIGNvbW1pdCBpcyBub3QgYWltZWQgZm9yCisgICAgICAvLyB0aGlzIGNoYW5nZSdzIGRlc3RpbmF0aW9uLCBkb24ndCBtYWtlIGZ1cnRoZXIgdXBkYXRlcy4KICAgICAgIC8vCiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yMTUxLDkgKzIxMDgsOSBAQAogICAgIHJldHVybiBjaGFuZ2UuZ2V0S2V5KCk7CiAgIH0KIAotICBwcml2YXRlIE1hcDxPYmplY3RJZCwgUmVmPiBjaGFuZ2VSZWZzQnlJZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgIHByaXZhdGUgU2V0TXVsdGltYXA8T2JqZWN0SWQsIFJlZj4gY2hhbmdlUmVmc0J5SWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIGlmIChyZWZzQnlJZCA9PSBudWxsKSB7Ci0gICAgICByZWZzQnlJZCA9IG5ldyBIYXNoTWFwPE9iamVjdElkLCBSZWY+KCk7CisgICAgICByZWZzQnlJZCA9ICBIYXNoTXVsdGltYXAuY3JlYXRlKCk7CiAgICAgICBmb3IgKFJlZiByIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoInJlZnMvY2hhbmdlcy8iKS52YWx1ZXMoKSkgewogICAgICAgICBpZiAoUGF0Y2hTZXQuaXNSZWYoci5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgcmVmc0J5SWQucHV0KHIuZ2V0T2JqZWN0SWQoKSwgcik7CkBAIC0yMjIxLDcgKzIxNzgsNyBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgZmluYWwgTWVyZ2VkU2VuZGVyIGNtID0gbWVyZ2VkU2VuZGVyRmFjdG9yeS5jcmVhdGUocmVzdWx0LmNoYW5nZSk7CisgICAgICAgICAgZmluYWwgTWVyZ2VkU2VuZGVyIGNtID0gbWVyZ2VkU2VuZGVyRmFjdG9yeS5jcmVhdGUocmVzdWx0LmNoYW5nZUN0bCk7CiAgICAgICAgICAgY20uc2V0RnJvbShjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7CiAgICAgICAgICAgY20uc2V0UGF0Y2hTZXQocmVzdWx0Lm5ld1BhdGNoU2V0LCByZXN1bHQuaW5mbyk7CiAgICAgICAgICAgY20uc2VuZCgpOwpAQCAtMjIzOCwyMCArMjE5NSw2IEBACiAgICAgfSkpOwogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGluc2VydEFuY2VzdG9ycyhQYXRjaFNldC5JZCBpZCwgUmV2Q29tbWl0IHNyYykKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBjbnQgPSBzcmMuZ2V0UGFyZW50Q291bnQoKTsKLSAgICBMaXN0PFBhdGNoU2V0QW5jZXN0b3I+IHRvSW5zZXJ0ID0gbmV3IEFycmF5TGlzdDxQYXRjaFNldEFuY2VzdG9yPihjbnQpOwotICAgIGZvciAoaW50IHAgPSAwOyBwIDwgY250OyBwKyspIHsKLSAgICAgIFBhdGNoU2V0QW5jZXN0b3IgYTsKLQotICAgICAgYSA9IG5ldyBQYXRjaFNldEFuY2VzdG9yKG5ldyBQYXRjaFNldEFuY2VzdG9yLklkKGlkLCBwICsgMSkpOwotICAgICAgYS5zZXRBbmNlc3RvclJldmlzaW9uKHRvUmV2SWQoc3JjLmdldFBhcmVudChwKSkpOwotICAgICAgdG9JbnNlcnQuYWRkKGEpOwotICAgIH0KLSAgICBkYi5wYXRjaFNldEFuY2VzdG9ycygpLmluc2VydCh0b0luc2VydCk7Ci0gIH0KLQogICBwcml2YXRlIHN0YXRpYyBSZXZJZCB0b1JldklkKGZpbmFsIFJldkNvbW1pdCBzcmMpIHsKICAgICByZXR1cm4gbmV3IFJldklkKHNyYy5nZXRJZCgpLm5hbWUoKSk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzQWR2ZXJ0aXNlUmVmc0hvb2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzQWR2ZXJ0aXNlUmVmc0hvb2suamF2YQppbmRleCBlYzhjMDgwLi4wZWI5YjYxIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWNlaXZlQ29tbWl0c0FkdmVydGlzZVJlZnNIb29rLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbW1pdHNBZHZlcnRpc2VSZWZzSG9vay5qYXZhCkBAIC0xNCwxMiArMTQsMTQgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLk1hZ2ljQnJhbmNoOworCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkFkdmVydGlzZVJlZnNIb29rOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkJhc2VSZWNlaXZlUGFjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrOwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqIEV4cG9zZXMgb25seSB0aGUgbm9uIHJlZnMvY2hhbmdlcy8gcmVmZXJlbmNlIG5hbWVzLiAqLwpAQCAtMzYsMTIgKzM4LDE5IEBACiAgICAgaWYgKG9sZFJlZnMgPT0gbnVsbCkgewogICAgICAgb2xkUmVmcyA9IHJwLmdldFJlcG9zaXRvcnkoKS5nZXRBbGxSZWZzKCk7CiAgICAgfQotICAgIEhhc2hNYXA8U3RyaW5nLCBSZWY+IHIgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlZj4oKTsKKyAgICBNYXA8U3RyaW5nLCBSZWY+IHIgPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKG9sZFJlZnMuc2l6ZSgpKTsKICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFJlZj4gZSA6IG9sZFJlZnMuZW50cnlTZXQoKSkgewotICAgICAgaWYgKCFlLmdldEtleSgpLnN0YXJ0c1dpdGgoInJlZnMvY2hhbmdlcy8iKSkgewotICAgICAgICByLnB1dChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgU3RyaW5nIG5hbWUgPSBlLmdldEtleSgpOworICAgICAgaWYgKCFza2lwKG5hbWUpKSB7CisgICAgICAgIHIucHV0KG5hbWUsIGUuZ2V0VmFsdWUoKSk7CiAgICAgICB9CiAgICAgfQogICAgIHJwLnNldEFkdmVydGlzZWRSZWZzKHIsIHJwLmdldEFkdmVydGlzZWRPYmplY3RzKCkpOwogICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBza2lwKFN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aCgicmVmcy9jaGFuZ2VzLyIpCisgICAgICAgIHx8IG5hbWUuc3RhcnRzV2l0aChHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZTX0NBQ0hFX0FVVE9NRVJHRSkKKyAgICAgICAgfHwgTWFnaWNCcmFuY2guaXNNYWdpY0JyYW5jaChuYW1lKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbW1pdHNFeGVjdXRvck1vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbW1pdHNFeGVjdXRvck1vZHVsZS5qYXZhCmluZGV4IDA2M2RiMmQuLjFjYmQyMjcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb21taXRzRXhlY3V0b3JNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZWNlaXZlQ29tbWl0c0V4ZWN1dG9yTW9kdWxlLmphdmEKQEAgLTE0LDE1ICsxNCwyMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Nb3JlRXhlY3V0b3JzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZS5FeGVjdXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCiAvKiogTW9kdWxlIHByb3ZpZGluZyB0aGUge0BsaW5rIFJlY2VpdmVDb21taXRzRXhlY3V0b3J9LiAqLwogcHVibGljIGNsYXNzIFJlY2VpdmVDb21taXRzRXhlY3V0b3JNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CiAgIEBPdmVycmlkZQpAQCAtMzIsMTAgKzM3LDMxIEBACiAgIEBQcm92aWRlcwogICBAU2luZ2xldG9uCiAgIEBSZWNlaXZlQ29tbWl0c0V4ZWN1dG9yCi0gIHB1YmxpYyBFeGVjdXRvciBnZXRSZWNlaXZlQ29tbWl0c0V4ZWN1dG9yKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNvbmZpZywKKyAgcHVibGljIFdvcmtRdWV1ZS5FeGVjdXRvciBjcmVhdGVSZWNlaXZlQ29tbWl0c0V4ZWN1dG9yKAorICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnLAogICAgICAgV29ya1F1ZXVlIHF1ZXVlcykgewogICAgIGludCBwb29sU2l6ZSA9IGNvbmZpZy5nZXRJbnQoInJlY2VpdmUiLCBudWxsLCAidGhyZWFkUG9vbFNpemUiLAogICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCkpOwogICAgIHJldHVybiBxdWV1ZXMuY3JlYXRlUXVldWUocG9vbFNpemUsICJSZWNlaXZlQ29tbWl0cyIpOwogICB9CisKKyAgQFByb3ZpZGVzCisgIEBTaW5nbGV0b24KKyAgQENoYW5nZVVwZGF0ZUV4ZWN1dG9yCisgIHB1YmxpYyBMaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2UgY3JlYXRlQ2hhbmdlVXBkYXRlRXhlY3V0b3IoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnKSB7CisgICAgaW50IHBvb2xTaXplID0gY29uZmlnLmdldEludCgicmVjZWl2ZSIsIG51bGwsICJjaGFuZ2VVcGRhdGVUaHJlYWRzIiwgMSk7CisgICAgaWYgKHBvb2xTaXplIDw9IDEpIHsKKyAgICAgIHJldHVybiBNb3JlRXhlY3V0b3JzLnNhbWVUaHJlYWRFeGVjdXRvcigpOworICAgIH0KKyAgICByZXR1cm4gTW9yZUV4ZWN1dG9ycy5saXN0ZW5pbmdEZWNvcmF0b3IoCisgICAgICAgIE1vcmVFeGVjdXRvcnMuZ2V0RXhpdGluZ0V4ZWN1dG9yU2VydmljZSgKKyAgICAgICAgICBuZXcgVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIHBvb2xTaXplLAorICAgICAgICAgICAgICAxMCwgVGltZVVuaXQuTUlOVVRFUywKKyAgICAgICAgICAgICAgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4ocG9vbFNpemUpLAorICAgICAgICAgICAgICBuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJDaGFuZ2VVcGRhdGUtJWQiKQorICAgICAgICAgICAgICAgIC5zZXREYWVtb24odHJ1ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgICAgICAgbmV3IFRocmVhZFBvb2xFeGVjdXRvci5DYWxsZXJSdW5zUG9saWN5KCkpKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb25maWcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1JlY2VpdmVDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWEzZTQwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmVjZWl2ZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworQFNpbmdsZXRvbgorY2xhc3MgUmVjZWl2ZUNvbmZpZyB7CisgIGZpbmFsIGJvb2xlYW4gY2hlY2tNYWdpY1JlZnM7CisgIGZpbmFsIGJvb2xlYW4gY2hlY2tSZWZlcmVuY2VkT2JqZWN0c0FyZVJlYWNoYWJsZTsKKworICBASW5qZWN0CisgIFJlY2VpdmVDb25maWcoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY29uZmlnKSB7CisgICAgY2hlY2tNYWdpY1JlZnMgPSBjb25maWcuZ2V0Qm9vbGVhbigKKyAgICAgICAgInJlY2VpdmUiLCBudWxsLCAiY2hlY2tNYWdpY1JlZnMiLAorICAgICAgICB0cnVlKTsKKyAgICBjaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlID0gY29uZmlnLmdldEJvb2xlYW4oCisgICAgICAgICJyZWNlaXZlIiwgbnVsbCwgImNoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUiLAorICAgICAgICB0cnVlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmV2aWV3Tm90ZUhlYWRlckZvcm1hdHRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvUmV2aWV3Tm90ZUhlYWRlckZvcm1hdHRlci5qYXZhCmluZGV4IDdiNjY5YjIuLjcxZGJmODcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1Jldmlld05vdGVIZWFkZXJGb3JtYXR0ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9SZXZpZXdOb3RlSGVhZGVyRm9ybWF0dGVyLmphdmEKQEAgLTE0LDggKzE0LDggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIApAQCAtNTEsOSArNTEsOCBAQAogICAgIHNiLmFwcGVuZCgiQ2hhbmdlLUlkOiAiKS5hcHBlbmQoY2hhbmdlS2V5LmdldCgpKS5hcHBlbmQoIlxuIik7CiAgIH0KIAotICB2b2lkIGFwcGVuZEFwcHJvdmFsKEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnksCi0gICAgICBzaG9ydCB2YWx1ZSwgQWNjb3VudCB1c2VyKSB7Ci0gICAgc2IuYXBwZW5kKGNhdGVnb3J5LmdldExhYmVsTmFtZSgpKTsKKyAgdm9pZCBhcHBlbmRBcHByb3ZhbChMYWJlbFR5cGUgdHlwZSwgc2hvcnQgdmFsdWUsIEFjY291bnQgdXNlcikgeworICAgIHNiLmFwcGVuZCh0eXBlLmdldE5hbWUoKSk7CiAgICAgc2IuYXBwZW5kKHZhbHVlIDwgMCA/ICItIiA6ICIrIikuYXBwZW5kKE1hdGguYWJzKHZhbHVlKSkuYXBwZW5kKCI6ICIpOwogICAgIGFwcGVuZFVzZXJEYXRhKHVzZXIpOwogICAgIHNiLmFwcGVuZCgiXG4iKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1pdFN0cmF0ZWd5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtaXRTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMmJhODYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtaXRTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZGbGFnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBCYXNlIGNsYXNzIHRoYXQgc3VibWl0IHN0cmF0ZWdpZXMgbXVzdCBleHRlbmQuIEEgc3VibWl0IHN0cmF0ZWd5IGZvciBhCisgKiBjZXJ0YWluIHtAbGluayBTdWJtaXRUeXBlfSBkZWZpbmVzIGhvdyB0aGUgc3VibWl0dGVkIGNvbW1pdHMgc2hvdWxkIGJlCisgKiBtZXJnZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJtaXRTdHJhdGVneSB7CisKKyAgcHJpdmF0ZSBQZXJzb25JZGVudCByZWZMb2dJZGVudDsKKworICBzdGF0aWMgY2xhc3MgQXJndW1lbnRzIHsKKyAgICBwcm90ZWN0ZWQgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OworICAgIHByb3RlY3RlZCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50OworICAgIHByb3RlY3RlZCBmaW5hbCBSZXZpZXdEYiBkYjsKKworICAgIHByb3RlY3RlZCBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisgICAgcHJvdGVjdGVkIGZpbmFsIFJldldhbGsgcnc7CisgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyOworICAgIHByb3RlY3RlZCBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZzsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkOworICAgIHByb3RlY3RlZCBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoOworICAgIHByb3RlY3RlZCBmaW5hbCBNZXJnZVV0aWwgbWVyZ2VVdGlsOworICAgIHByb3RlY3RlZCBmaW5hbCBNZXJnZVNvcnRlciBtZXJnZVNvcnRlcjsKKworICAgIEFyZ3VtZW50cyhmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3RvcnksCisgICAgICAgIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQsIGZpbmFsIFJldmlld0RiIGRiLCBmaW5hbCBSZXBvc2l0b3J5IHJlcG8sCisgICAgICAgIGZpbmFsIFJldldhbGsgcncsIGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLAorICAgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZywgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkLAorICAgICAgICBmaW5hbCBCcmFuY2guTmFtZUtleSBkZXN0QnJhbmNoLCBmaW5hbCBNZXJnZVV0aWwgbWVyZ2VVdGlsKSB7CisgICAgICB0aGlzLmlkZW50aWZpZWRVc2VyRmFjdG9yeSA9IGlkZW50aWZpZWRVc2VyRmFjdG9yeTsKKyAgICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7CisgICAgICB0aGlzLmRiID0gZGI7CisKKyAgICAgIHRoaXMucmVwbyA9IHJlcG87CisgICAgICB0aGlzLnJ3ID0gcnc7CisgICAgICB0aGlzLmluc2VydGVyID0gaW5zZXJ0ZXI7CisgICAgICB0aGlzLmNhbk1lcmdlRmxhZyA9IGNhbk1lcmdlRmxhZzsKKyAgICAgIHRoaXMuYWxyZWFkeUFjY2VwdGVkID0gYWxyZWFkeUFjY2VwdGVkOworICAgICAgdGhpcy5kZXN0QnJhbmNoID0gZGVzdEJyYW5jaDsKKyAgICAgIHRoaXMubWVyZ2VVdGlsID0gbWVyZ2VVdGlsOworICAgICAgdGhpcy5tZXJnZVNvcnRlciA9IG5ldyBNZXJnZVNvcnRlcihydywgYWxyZWFkeUFjY2VwdGVkLCBjYW5NZXJnZUZsYWcpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBmaW5hbCBBcmd1bWVudHMgYXJnczsKKworICBTdWJtaXRTdHJhdGVneShmaW5hbCBBcmd1bWVudHMgYXJncykgeworICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgIH0KKworICAvKioKKyAgICogUnVucyB0aGlzIHN1Ym1pdCBzdHJhdGVneS4gSWYgcG9zc2libGUgdGhlIHByb3ZpZGVkIGNvbW1pdHMgd2lsbCBiZSBtZXJnZWQKKyAgICogd2l0aCB0aGlzIHN1Ym1pdCBzdHJhdGVneS4KKyAgICoKKyAgICogQHBhcmFtIG1lcmdlVGlwIHRoZSBtZXJnZVRpcAorICAgKiBAcGFyYW0gdG9NZXJnZSB0aGUgbGlzdCBvZiBzdWJtaXR0ZWQgY29tbWl0cyB0aGF0IHNob3VsZCBiZSBtZXJnZWQgdXNpbmcKKyAgICogICAgICAgIHRoaXMgc3VibWl0IHN0cmF0ZWd5CisgICAqIEByZXR1cm4gdGhlIG5ldyBtZXJnZVRpcAorICAgKiBAdGhyb3dzIE1lcmdlRXhjZXB0aW9uCisgICAqLworICBwdWJsaWMgZmluYWwgQ29kZVJldmlld0NvbW1pdCBydW4oZmluYWwgQ29kZVJldmlld0NvbW1pdCBtZXJnZVRpcCwKKyAgICAgIGZpbmFsIExpc3Q8Q29kZVJldmlld0NvbW1pdD4gdG9NZXJnZSkgdGhyb3dzIE1lcmdlRXhjZXB0aW9uIHsKKyAgICByZWZMb2dJZGVudCA9IG51bGw7CisgICAgcmV0dXJuIF9ydW4obWVyZ2VUaXAsIHRvTWVyZ2UpOworICB9CisKKyAgLyoqCisgICAqIFJ1bnMgdGhpcyBzdWJtaXQgc3RyYXRlZ3kuIElmIHBvc3NpYmxlIHRoZSBwcm92aWRlZCBjb21taXRzIHdpbGwgYmUgbWVyZ2VkCisgICAqIHdpdGggdGhpcyBzdWJtaXQgc3RyYXRlZ3kuCisgICAqCisgICAqIEBwYXJhbSBtZXJnZVRpcCB0aGUgbWVyZ2VUaXAKKyAgICogQHBhcmFtIHRvTWVyZ2UgdGhlIGxpc3Qgb2Ygc3VibWl0dGVkIGNvbW1pdHMgdGhhdCBzaG91bGQgYmUgbWVyZ2VkIHVzaW5nCisgICAqICAgICAgICB0aGlzIHN1Ym1pdCBzdHJhdGVneQorICAgKiBAcmV0dXJuIHRoZSBuZXcgbWVyZ2VUaXAKKyAgICogQHRocm93cyBNZXJnZUV4Y2VwdGlvbgorICAgKi8KKyAgcHJvdGVjdGVkIGFic3RyYWN0IENvZGVSZXZpZXdDb21taXQgX3J1bihDb2RlUmV2aWV3Q29tbWl0IG1lcmdlVGlwLAorICAgICAgTGlzdDxDb2RlUmV2aWV3Q29tbWl0PiB0b01lcmdlKSB0aHJvd3MgTWVyZ2VFeGNlcHRpb247CisKKyAgLyoqCisgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBjb21taXQgY2FuIGJlIG1lcmdlZC4KKyAgICoKKyAgICogU3ViY2xhc3NlcyBtdXN0IGVuc3VyZSB0aGF0IGludm9raW5nIHRoaXMgbWV0aG9kIGRvZXMgbmVpdGhlciBtb2RpZnkgdGhlCisgICAqIGdpdCByZXBvc2l0b3J5IG5vciB0aGUgR2Vycml0IGRhdGFiYXNlLgorICAgKgorICAgKiBAcGFyYW0gbWVyZ2VUaXAgdGhlIG1lcmdlVGlwCisgICAqIEBwYXJhbSB0b01lcmdlIHRoZSBjb21taXQgZm9yIHdoaWNoIGl0IHNob3VsZCBiZSBjaGVja2VkIHdoZXRoZXIgaXQgY2FuIGJlCisgICAqICAgICAgICBtZXJnZWQgb3Igbm90CisgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGNvbW1pdCBjYW4gYmUgbWVyZ2VkLCBvdGhlcndpc2UKKyAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICogQHRocm93cyBNZXJnZUV4Y2VwdGlvbgorICAgKi8KKyAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZHJ5UnVuKENvZGVSZXZpZXdDb21taXQgbWVyZ2VUaXAsCisgICAgICBDb2RlUmV2aWV3Q29tbWl0IHRvTWVyZ2UpIHRocm93cyBNZXJnZUV4Y2VwdGlvbjsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgUGVyc29uSWRlbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHJlZiBsb2cgZW50cmllcyB3aGVuCisgICAqIHVwZGF0aW5nIHRoZSBkZXN0aW5hdGlvbiBicmFuY2guIFRoZSByZWYgbG9nIGlkZW50aXR5IG1heSBiZSBzZXQgYWZ0ZXIgdGhlCisgICAqIHtAbGluayAjcnVuKENvZGVSZXZpZXdDb21taXQsIExpc3QpfSBtZXRob2QgZmluaXNoZWQuCisgICAqCisgICAqIERvIG9ubHkgY2FsbCB0aGlzIG1ldGhvZCBhZnRlciB0aGUge0BsaW5rICNydW4oQ29kZVJldmlld0NvbW1pdCwgTGlzdCl9CisgICAqIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSByZWYgbG9nIGlkZW50aXR5LCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4KKyAgICovCisgIHB1YmxpYyBmaW5hbCBQZXJzb25JZGVudCBnZXRSZWZMb2dJZGVudCgpIHsKKyAgICByZXR1cm4gcmVmTG9nSWRlbnQ7CisgIH0KKworICAvKioKKyAgICogUmV0dXJucyBhbGwgY29tbWl0cyB0aGF0IGhhdmUgYmVlbiBuZXdseSBjcmVhdGVkIGZvciB0aGUgY2hhbmdlcyB0aGF0IGFyZQorICAgKiBnZXR0aW5nIG1lcmdlZC4KKyAgICoKKyAgICogQnkgZGVmYXVsdCB0aGlzIG1ldGhvZCBpcyByZXR1cm5pbmcgYW4gZW1wdHkgbWFwLCBidXQgc3ViY2xhc3NlcyBtYXkKKyAgICogb3ZlcndyaXRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgbmV3bHkgY3JlYXRlZCBjb21taXRzLgorICAgKgorICAgKiBEbyBvbmx5IGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlIHtAbGluayAjcnVuKENvZGVSZXZpZXdDb21taXQsIExpc3QpfQorICAgKiBtZXRob2QgaGFzIGJlZW4gaW52b2tlZC4KKyAgICoKKyAgICogQHJldHVybiBuZXcgY29tbWl0cyBjcmVhdGVkIGZvciBjaGFuZ2VzIHRoYXQgYXJlIGdldHRpbmcgbWVyZ2VkCisgICAqLworICBwdWJsaWMgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gZ2V0TmV3Q29tbWl0cygpIHsKKyAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBtZXJnZSB0aGF0IGZhaWxlZCB3aXRoCisgICAqIHtAbGluayBSZWZVcGRhdGUuUmVzdWx0I0xPQ0tfRkFJTFVSRX0gc2hvdWxkIGJlIHJldHJpZWQuCisgICAqCisgICAqIE1heSBiZSBvdmVyd3JpdHRlbiBieSBzdWJjbGFzc2VzLgorICAgKgorICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgbWVyZ2UgdGhhdCBmYWlsZWQgd2l0aAorICAgKiAgICAgICAgIHtAbGluayBSZWZVcGRhdGUuUmVzdWx0I0xPQ0tfRkFJTFVSRX0gc2hvdWxkIGJlIHJldHJpZWQsIG90aGVyd2lzZQorICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgKi8KKyAgcHVibGljIGJvb2xlYW4gcmV0cnlPbkxvY2tGYWlsdXJlKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHJlZiBsb2cgaWRlbnRpdHkgaWYgaXQgd2Fzbid0IHNldCB5ZXQuCisgICAqCisgICAqIEBwYXJhbSBzdWJtaXRBcHByb3ZhbCB0aGUgYXBwcm92YWwgdGhhdCBzdWJtaXR0ZWQgdGhlIHBhdGNoIHNldAorICAgKi8KKyAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0UmVmTG9nSWRlbnQoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBzdWJtaXRBcHByb3ZhbCkgeworICAgIGlmIChyZWZMb2dJZGVudCA9PSBudWxsICYmIHN1Ym1pdEFwcHJvdmFsICE9IG51bGwpIHsKKyAgICAgIHJlZkxvZ0lkZW50ID0KKyAgICAgICAgICBhcmdzLmlkZW50aWZpZWRVc2VyRmFjdG9yeS5jcmVhdGUoc3VibWl0QXBwcm92YWwuZ2V0QWNjb3VudElkKCkpCisgICAgICAgICAgICAgIC5uZXdSZWZMb2dJZGVudCgpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibWl0U3RyYXRlZ3lGYWN0b3J5LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtaXRTdHJhdGVneUZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY4MzFjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibWl0U3RyYXRlZ3lGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuUmViYXNlQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ2Fub25pY2FsV2ViVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkZsYWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCisvKiogRmFjdG9yeSB0byBjcmVhdGUgYSB7QGxpbmsgU3VibWl0U3RyYXRlZ3l9IGZvciBhIHtAbGluayBTdWJtaXRUeXBlfS4gKi8KK3B1YmxpYyBjbGFzcyBTdWJtaXRTdHJhdGVneUZhY3RvcnkgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQorICAgICAgLmdldExvZ2dlcihTdWJtaXRTdHJhdGVneUZhY3RvcnkuY2xhc3MpOworCisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IG15SWRlbnQ7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5OworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKKyAgcHJpdmF0ZSBmaW5hbCBSZWJhc2VDaGFuZ2UgcmViYXNlQ2hhbmdlOworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CisgIHByaXZhdGUgZmluYWwgTWVyZ2VVdGlsLkZhY3RvcnkgbWVyZ2VVdGlsRmFjdG9yeTsKKworICBASW5qZWN0CisgIFN1Ym1pdFN0cmF0ZWd5RmFjdG9yeSgKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IGlkZW50aWZpZWRVc2VyRmFjdG9yeSwKKyAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAorICAgICAgZmluYWwgUGF0Y2hTZXRJbmZvRmFjdG9yeSBwYXRjaFNldEluZm9GYWN0b3J5LAorICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlciwKKyAgICAgIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZCwgZmluYWwgUmViYXNlQ2hhbmdlIHJlYmFzZUNoYW5nZSwKKyAgICAgIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGUsCisgICAgICBmaW5hbCBNZXJnZVV0aWwuRmFjdG9yeSBtZXJnZVV0aWxGYWN0b3J5KSB7CisgICAgdGhpcy5pZGVudGlmaWVkVXNlckZhY3RvcnkgPSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7CisgICAgdGhpcy5teUlkZW50ID0gbXlJZGVudDsKKyAgICB0aGlzLnBhdGNoU2V0SW5mb0ZhY3RvcnkgPSBwYXRjaFNldEluZm9GYWN0b3J5OworICAgIHRoaXMuZ2l0UmVmVXBkYXRlZCA9IGdpdFJlZlVwZGF0ZWQ7CisgICAgdGhpcy5yZWJhc2VDaGFuZ2UgPSByZWJhc2VDaGFuZ2U7CisgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwcm9qZWN0Q2FjaGU7CisgICAgdGhpcy5tZXJnZVV0aWxGYWN0b3J5ID0gbWVyZ2VVdGlsRmFjdG9yeTsKKyAgfQorCisgIHB1YmxpYyBTdWJtaXRTdHJhdGVneSBjcmVhdGUoZmluYWwgU3VibWl0VHlwZSBzdWJtaXRUeXBlLCBmaW5hbCBSZXZpZXdEYiBkYiwKKyAgICAgIGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgUmV2V2FsayBydywgZmluYWwgT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsCisgICAgICBmaW5hbCBSZXZGbGFnIGNhbk1lcmdlRmxhZywgZmluYWwgU2V0PFJldkNvbW1pdD4gYWxyZWFkeUFjY2VwdGVkLAorICAgICAgZmluYWwgQnJhbmNoLk5hbWVLZXkgZGVzdEJyYW5jaCkKKyAgICAgIHRocm93cyBNZXJnZUV4Y2VwdGlvbiwgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisgICAgUHJvamVjdFN0YXRlIHByb2plY3QgPSBnZXRQcm9qZWN0KGRlc3RCcmFuY2gpOworICAgIGZpbmFsIFN1Ym1pdFN0cmF0ZWd5LkFyZ3VtZW50cyBhcmdzID0KKyAgICAgICAgbmV3IFN1Ym1pdFN0cmF0ZWd5LkFyZ3VtZW50cyhpZGVudGlmaWVkVXNlckZhY3RvcnksIG15SWRlbnQsIGRiLCByZXBvLAorICAgICAgICAgICAgcncsIGluc2VydGVyLCBjYW5NZXJnZUZsYWcsIGFscmVhZHlBY2NlcHRlZCwgZGVzdEJyYW5jaCwKKyAgICAgICAgICAgIG1lcmdlVXRpbEZhY3RvcnkuY3JlYXRlKHByb2plY3QpKTsKKyAgICBzd2l0Y2ggKHN1Ym1pdFR5cGUpIHsKKyAgICAgIGNhc2UgQ0hFUlJZX1BJQ0s6CisgICAgICAgIHJldHVybiBuZXcgQ2hlcnJ5UGljayhhcmdzLCBwYXRjaFNldEluZm9GYWN0b3J5LCBnaXRSZWZVcGRhdGVkKTsKKyAgICAgIGNhc2UgRkFTVF9GT1JXQVJEX09OTFk6CisgICAgICAgIHJldHVybiBuZXcgRmFzdEZvcndhcmRPbmx5KGFyZ3MpOworICAgICAgY2FzZSBNRVJHRV9BTFdBWVM6CisgICAgICAgIHJldHVybiBuZXcgTWVyZ2VBbHdheXMoYXJncyk7CisgICAgICBjYXNlIE1FUkdFX0lGX05FQ0VTU0FSWToKKyAgICAgICAgcmV0dXJuIG5ldyBNZXJnZUlmTmVjZXNzYXJ5KGFyZ3MpOworICAgICAgY2FzZSBSRUJBU0VfSUZfTkVDRVNTQVJZOgorICAgICAgICByZXR1cm4gbmV3IFJlYmFzZUlmTmVjZXNzYXJ5KGFyZ3MsIHJlYmFzZUNoYW5nZSk7CisgICAgICBkZWZhdWx0OgorICAgICAgICBmaW5hbCBTdHJpbmcgZXJyb3JNc2cgPSAiTm8gc3VibWl0IHN0cmF0ZWd5IGZvcjogIiArIHN1Ym1pdFR5cGU7CisgICAgICAgIGxvZy5lcnJvcihlcnJvck1zZyk7CisgICAgICAgIHRocm93IG5ldyBNZXJnZUV4Y2VwdGlvbihlcnJvck1zZyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBQcm9qZWN0U3RhdGUgZ2V0UHJvamVjdChCcmFuY2guTmFtZUtleSBicmFuY2gpCisgICAgICB0aHJvd3MgTm9TdWNoUHJvamVjdEV4Y2VwdGlvbiB7CisgICAgZmluYWwgUHJvamVjdFN0YXRlIHAgPSBwcm9qZWN0Q2FjaGUuZ2V0KGJyYW5jaC5nZXRQYXJlbnRLZXkoKSk7CisgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE5vU3VjaFByb2plY3RFeGNlcHRpb24oYnJhbmNoLmdldFBhcmVudEtleSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHA7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9TdWJtb2R1bGVPcC5qYXZhCmluZGV4IGNjYjkxYTMuLmVlYWI4ZjMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibW9kdWxlT3AuamF2YQpAQCAtODUsNyArODUsNyBAQAogICBwcml2YXRlIGZpbmFsIE1hcDxDaGFuZ2UuSWQsIENvZGVSZXZpZXdDb21taXQ+IGNvbW1pdHM7CiAgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgbXlJZGVudDsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKLSAgcHJpdmF0ZSBmaW5hbCBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlcGxpY2F0aW9uOworICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgZ2l0UmVmVXBkYXRlZDsKICAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWFGYWN0b3J5OwogICBwcml2YXRlIGZpbmFsIFNldDxCcmFuY2guTmFtZUtleT4gdXBkYXRlZFN1YnNjcmliZXJzOwogCkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICBAQXNzaXN0ZWQgUHJvamVjdCBkZXN0UHJvamVjdCwgQEFzc2lzdGVkIExpc3Q8Q2hhbmdlPiBzdWJtaXR0ZWQsCiAgICAgICBAQXNzaXN0ZWQgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gY29tbWl0cywKICAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBmaW5hbCBQZXJzb25JZGVudCBteUlkZW50LAotICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb24pIHsKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLCBHaXRSZWZlcmVuY2VVcGRhdGVkIGdpdFJlZlVwZGF0ZWQpIHsKICAgICB0aGlzLmRlc3RCcmFuY2ggPSBkZXN0QnJhbmNoOwogICAgIHRoaXMubWVyZ2VUaXAgPSBtZXJnZVRpcDsKICAgICB0aGlzLnJ3ID0gcnc7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICB0aGlzLmNvbW1pdHMgPSBjb21taXRzOwogICAgIHRoaXMubXlJZGVudCA9IG15SWRlbnQ7CiAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwotICAgIHRoaXMucmVwbGljYXRpb24gPSByZXBsaWNhdGlvbjsKKyAgICB0aGlzLmdpdFJlZlVwZGF0ZWQgPSBnaXRSZWZVcGRhdGVkOwogCiAgICAgdXBkYXRlZFN1YnNjcmliZXJzID0gbmV3IEhhc2hTZXQ8QnJhbmNoLk5hbWVLZXk+KCk7CiAgIH0KQEAgLTIxNyw3ICsyMTcsOCBAQAogICAgICAgICAgIGZvciAoZmluYWwgQ2hhbmdlIGNoZyA6IHN1Ym1pdHRlZCkgewogICAgICAgICAgICAgZmluYWwgQ29kZVJldmlld0NvbW1pdCBjID0gY29tbWl0cy5nZXQoY2hnLmdldElkKCkpOwogICAgICAgICAgICAgaWYgKGMgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIChjLnN0YXR1c0NvZGUgPT0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fTUVSR0UgfHwgYy5zdGF0dXNDb2RlID09IENvbW1pdE1lcmdlU3RhdHVzLkNMRUFOX1BJQ0spKSB7CisgICAgICAgICAgICAgICAgJiYgKGMuc3RhdHVzQ29kZSA9PSBDb21taXRNZXJnZVN0YXR1cy5DTEVBTl9NRVJHRQorICAgICAgICAgICAgICAgICAgICB8fCBjLnN0YXR1c0NvZGUgPT0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fUElDSyB8fCBjLnN0YXR1c0NvZGUgPT0gQ29tbWl0TWVyZ2VTdGF0dXMuQ0xFQU5fUkVCQVNFKSkgewogICAgICAgICAgICAgICBtc2didWYgKz0gIlxuIjsKICAgICAgICAgICAgICAgbXNnYnVmICs9IGMuZ2V0RnVsbE1lc3NhZ2UoKTsKICAgICAgICAgICAgIH0KQEAgLTMzNiw3ICszMzcsNyBAQAogICAgICAgc3dpdGNoIChyZnUudXBkYXRlKCkpIHsKICAgICAgICAgY2FzZSBORVc6CiAgICAgICAgIGNhc2UgRkFTVF9GT1JXQVJEOgotICAgICAgICAgIHJlcGxpY2F0aW9uLmZpcmUoc3Vic2NyaWJlci5nZXRQYXJlbnRLZXkoKSwgcmZ1LmdldE5hbWUoKSk7CisgICAgICAgICAgZ2l0UmVmVXBkYXRlZC5maXJlKHN1YnNjcmliZXIuZ2V0UGFyZW50S2V5KCksIHJmdSk7CiAgICAgICAgICAgLy8gVE9ETyBzaW5jZSB0aGlzIGlzIHBlcmZvcm1lZCAiaW4gdGhlIGJhY2tncm91bmQiIG5vIG1haWwgd2lsbCBiZQogICAgICAgICAgIC8vIHNlbnQgdG8gaW5mb3JtIHVzZXJzIGFib3V0IHRoZSB1cGRhdGVkIGJyYW5jaAogICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmVyc2lvbmVkTWV0YURhdGEuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1ZlcnNpb25lZE1ldGFEYXRhLmphdmEKaW5kZXggZTljNTUzNi4uN2MzYzBjNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmVyc2lvbmVkTWV0YURhdGEuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9WZXJzaW9uZWRNZXRhRGF0YS5qYXZhCkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgc3dpdGNoIChyZXN1bHQpIHsKICAgICAgICAgICBjYXNlIE5FVzoKICAgICAgICAgICAgIHJldmlzaW9uID0gcncucGFyc2VDb21taXQocnUuZ2V0TmV3T2JqZWN0SWQoKSk7Ci0gICAgICAgICAgICB1cGRhdGUucmVwbGljYXRlKHJ1LmdldE5hbWUoKSk7CisgICAgICAgICAgICB1cGRhdGUuZmlyZUdpdFJlZlVwZGF0ZWRFdmVudChydSk7CiAgICAgICAgICAgICByZXR1cm4gcmV2aXNpb247CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IHVwZGF0ZSAiICsgcnUuZ2V0TmFtZSgpICsgIiBpbiAiCkBAIC0yOTMsNyArMjkzLDcgQEAKICAgICAgICAgICBjYXNlIE5FVzoKICAgICAgICAgICBjYXNlIEZBU1RfRk9SV0FSRDoKICAgICAgICAgICAgIHJldmlzaW9uID0gcncucGFyc2VDb21taXQocnUuZ2V0TmV3T2JqZWN0SWQoKSk7Ci0gICAgICAgICAgICB1cGRhdGUucmVwbGljYXRlKHJ1LmdldE5hbWUoKSk7CisgICAgICAgICAgICB1cGRhdGUuZmlyZUdpdFJlZlVwZGF0ZWRFdmVudChydSk7CiAgICAgICAgICAgICByZXR1cm4gcmV2aXNpb247CiAKICAgICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmlzaWJsZVJlZkZpbHRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvVmlzaWJsZVJlZkZpbHRlci5qYXZhCmluZGV4IDhkMjdjMGUuLjVjZDBkZWYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1Zpc2libGVSZWZGaWx0ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC9WaXNpYmxlUmVmRmlsdGVyLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKLQogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKQEAgLTQ0LDE2ICs0MywxOSBAQAogICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVmlzaWJsZVJlZkZpbHRlci5jbGFzcyk7CiAKICAgcHJpdmF0ZSBmaW5hbCBUYWdDYWNoZSB0YWdDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IGRiOwogICBwcml2YXRlIGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZTsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q3RsOwogICBwcml2YXRlIGZpbmFsIFJldmlld0RiIHJldmlld0RiOwogICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2hvd0NoYW5nZXM7CiAKLSAgcHVibGljIFZpc2libGVSZWZGaWx0ZXIoZmluYWwgVGFnQ2FjaGUgdGFnQ2FjaGUsIGZpbmFsIFJlcG9zaXRvcnkgZGIsCisgIHB1YmxpYyBWaXNpYmxlUmVmRmlsdGVyKGZpbmFsIFRhZ0NhY2hlIHRhZ0NhY2hlLCBmaW5hbCBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZSwKKyAgICAgIGZpbmFsIFJlcG9zaXRvcnkgZGIsCiAgICAgICBmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbCwgZmluYWwgUmV2aWV3RGIgcmV2aWV3RGIsCiAgICAgICBmaW5hbCBib29sZWFuIHNob3dDaGFuZ2VzKSB7CiAgICAgdGhpcy50YWdDYWNoZSA9IHRhZ0NhY2hlOworICAgIHRoaXMuY2hhbmdlQ2FjaGUgPSBjaGFuZ2VDYWNoZTsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3RDb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCk7CiAgICAgdGhpcy5wcm9qZWN0Q3RsID0gcHJvamVjdENvbnRyb2w7CkBAIC03OSw3ICs4MSw3IEBACiAgICAgICB9IGVsc2UgaWYgKFBhdGNoU2V0LmlzUmVmKHJlZi5nZXROYW1lKCkpKSB7CiAgICAgICAgIC8vIFJlZmVyZW5jZSB0byBhIHBhdGNoIHNldCBpcyB2aXNpYmxlIGlmIHRoZSBjaGFuZ2UgaXMgdmlzaWJsZS4KICAgICAgICAgLy8KLSAgICAgICAgaWYgKHZpc2libGVDaGFuZ2VzLmNvbnRhaW5zKENoYW5nZS5JZC5mcm9tUmVmKHJlZi5nZXROYW1lKCkpKSkgeworICAgICAgICBpZiAoc2hvd0NoYW5nZXMgJiYgdmlzaWJsZUNoYW5nZXMuY29udGFpbnMoQ2hhbmdlLklkLmZyb21SZWYocmVmLmdldE5hbWUoKSkpKSB7CiAgICAgICAgICAgcmVzdWx0LnB1dChyZWYuZ2V0TmFtZSgpLCByZWYpOwogICAgICAgICB9CiAKQEAgLTEzNSw3ICsxMzcsNyBAQAogICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCA9IHByb2plY3RDdGwuZ2V0UHJvamVjdCgpOwogICAgIHRyeSB7CiAgICAgICBmaW5hbCBTZXQ8Q2hhbmdlLklkPiB2aXNpYmxlQ2hhbmdlcyA9IG5ldyBIYXNoU2V0PENoYW5nZS5JZD4oKTsKLSAgICAgIGZvciAoQ2hhbmdlIGNoYW5nZSA6IHJldmlld0RiLmNoYW5nZXMoKS5ieVByb2plY3QocHJvamVjdC5nZXROYW1lS2V5KCkpKSB7CisgICAgICBmb3IgKENoYW5nZSBjaGFuZ2UgOiBjaGFuZ2VDYWNoZS5nZXQocHJvamVjdC5nZXROYW1lS2V5KCkpKSB7CiAgICAgICAgIGlmIChwcm9qZWN0Q3RsLmNvbnRyb2xGb3IoY2hhbmdlKS5pc1Zpc2libGUocmV2aWV3RGIpKSB7CiAgICAgICAgICAgdmlzaWJsZUNoYW5nZXMuYWRkKGNoYW5nZS5nZXRJZCgpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC92YWxpZGF0b3JzL0NvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTI3OGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQudmFsaWRhdG9yczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlczsKKworICBwdWJsaWMgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcmVhc29uLCBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcykgeworICAgIHN1cGVyKHJlYXNvbik7CisgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzOworICB9CisKKyAgcHVibGljIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgeworICAgIHN1cGVyKHJlYXNvbik7CisgICAgdGhpcy5tZXNzYWdlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICB9CisKKyAgcHVibGljIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHJlYXNvbiwgVGhyb3dhYmxlIHdoeSkgeworICAgIHN1cGVyKHJlYXNvbiwgd2h5KTsKKyAgICB0aGlzLm1lc3NhZ2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgIH0KKworICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gZ2V0TWVzc2FnZXMoKSB7CisgICAgcmV0dXJuIG1lc3NhZ2VzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC92YWxpZGF0b3JzL0NvbW1pdFZhbGlkYXRpb25MaXN0ZW5lci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjExMjQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC52YWxpZGF0b3JzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5FeHRlbnNpb25Qb2ludDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkNvbW1pdFJlY2VpdmVkRXZlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBMaXN0ZW5lciB0byBwcm92aWRlIHZhbGlkYXRpb24gb24gcmVjZWl2ZWQgY29tbWl0cy4KKyAqCisgKiBJbnZva2VkIGJ5IEdlcnJpdCB3aGVuIGEgbmV3IGNvbW1pdCBpcyByZWNlaXZlZCwgaGFzIHBhc3NlZCBiYXNpYyBHZXJyaXQKKyAqIHZhbGlkYXRpb24gYW5kIGNhbiBiZSB0aGVuIHN1YmplY3QgdG8gZXh0cmEgdmFsaWRhdGlvbiBjaGVja3MuCisgKi8KK0BFeHRlbnNpb25Qb2ludAorcHVibGljIGludGVyZmFjZSBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAvKioKKyAgICogQ29tbWl0IHZhbGlkYXRpb24uCisgICAqCisgICAqIEBwYXJhbSByZWNlaXZlZCBjb21taXQgZXZlbnQgZGV0YWlscworICAgKiBAcmV0dXJuIGxpc3Qgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcworICAgKiBAdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gaWYgdmFsaWRhdGlvbiBmYWlscworICAgKi8KKyAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoQ29tbWl0UmVjZWl2ZWRFdmVudCByZWNlaXZlRXZlbnQpCisgICAgICB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L3ZhbGlkYXRvcnMvQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L3ZhbGlkYXRvcnMvQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjg2MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0aW9uTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnM7CisKK3B1YmxpYyBjbGFzcyBDb21taXRWYWxpZGF0aW9uTWVzc2FnZSB7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Vycm9yOworCisgIHB1YmxpYyBDb21taXRWYWxpZGF0aW9uTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgYm9vbGVhbiBpc0Vycm9yKSB7CisgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB0aGlzLmlzRXJyb3IgPSBpc0Vycm9yOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIHJldHVybiBtZXNzYWdlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNFcnJvcigpIHsKKyAgICByZXR1cm4gaXNFcnJvcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0b3JzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dpdC92YWxpZGF0b3JzL0NvbW1pdFZhbGlkYXRvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdmOTIzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvdmFsaWRhdG9ycy9Db21taXRWYWxpZGF0b3JzLmphdmEKQEAgLTAsMCArMSw1NzkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LnZhbGlkYXRvcnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uUGFnZUxpbmtzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkNvbW1pdFJlY2VpdmVkRXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZWNlaXZlQ29tbWl0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlZhbGlkYXRpb25FcnJvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5SZWZDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5NYWdpY0JyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guSG9zdEtleTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9vdGVyS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJMaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZDb21taXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitwdWJsaWMgY2xhc3MgQ29tbWl0VmFsaWRhdG9ycyB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5CisgICAgICAuZ2V0TG9nZ2VyKENvbW1pdFZhbGlkYXRvcnMuY2xhc3MpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBDSEFOR0VfSUQgPSBuZXcgRm9vdGVyS2V5KCJDaGFuZ2UtSWQiKTsKKworICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgeworICAgIENvbW1pdFZhbGlkYXRvcnMgY3JlYXRlKFJlZkNvbnRyb2wgcmVmQ29udHJvbCwgU3NoSW5mbyBzc2hJbmZvLAorICAgICAgICBSZXBvc2l0b3J5IHJlcG8pOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBnZXJyaXRJZGVudDsKKyAgcHJpdmF0ZSBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2w7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybDsKKyAgcHJpdmF0ZSBmaW5hbCBTc2hJbmZvIHNzaEluZm87CisgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOworICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8Q29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyPiBjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzOworCisgIEBJbmplY3QKKyAgQ29tbWl0VmFsaWRhdG9ycyhAR2Vycml0UGVyc29uSWRlbnQgZmluYWwgUGVyc29uSWRlbnQgZ2Vycml0SWRlbnQsCisgICAgICBAQ2Fub25pY2FsV2ViVXJsIEBOdWxsYWJsZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsLAorICAgICAgZmluYWwgRHluYW1pY1NldDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+IGNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnMsCisgICAgICBAQXNzaXN0ZWQgZmluYWwgU3NoSW5mbyBzc2hJbmZvLAorICAgICAgQEFzc2lzdGVkIGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgQEFzc2lzdGVkIGZpbmFsIFJlZkNvbnRyb2wgcmVmQ29udHJvbCkgeworICAgIHRoaXMuZ2Vycml0SWRlbnQgPSBnZXJyaXRJZGVudDsKKyAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgIHRoaXMuY2Fub25pY2FsV2ViVXJsID0gY2Fub25pY2FsV2ViVXJsOworICAgIHRoaXMuc3NoSW5mbyA9IHNzaEluZm87CisgICAgdGhpcy5yZXBvID0gcmVwbzsKKyAgICB0aGlzLmNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnMgPSBjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzOworICB9CisKKyAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IHZhbGlkYXRlRm9yUmVjZWl2ZUNvbW1pdHMoCisgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworCisgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+IHZhbGlkYXRvcnMgPQorICAgICAgICBuZXcgTGlua2VkTGlzdDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+KCk7CisKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgVXBsb2FkTWVyZ2VzUGVybWlzc2lvblZhbGlkYXRvcihyZWZDb250cm9sKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IEFtZW5kZWRHZXJyaXRNZXJnZUNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgcmVmQ29udHJvbCwgZ2Vycml0SWRlbnQpKTsKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgQXV0aG9yVXBsb2FkZXJWYWxpZGF0b3IocmVmQ29udHJvbCwgY2Fub25pY2FsV2ViVXJsKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IENvbW1pdHRlclVwbG9hZGVyVmFsaWRhdG9yKHJlZkNvbnRyb2wsIGNhbm9uaWNhbFdlYlVybCkpOworICAgIHZhbGlkYXRvcnMuYWRkKG5ldyBTaWduZWRPZmZCeVZhbGlkYXRvcihyZWZDb250cm9sLCBjYW5vbmljYWxXZWJVcmwpKTsKKyAgICBpZiAoTWFnaWNCcmFuY2guaXNNYWdpY0JyYW5jaChyZWNlaXZlRXZlbnQuY29tbWFuZC5nZXRSZWZOYW1lKCkpCisgICAgICAgIHx8IFJlY2VpdmVDb21taXRzLk5FV19QQVRDSFNFVC5tYXRjaGVyKAorICAgICAgICAgICAgcmVjZWl2ZUV2ZW50LmNvbW1hbmQuZ2V0UmVmTmFtZSgpKS5tYXRjaGVzKCkpIHsKKyAgICAgIHZhbGlkYXRvcnMuYWRkKG5ldyBDaGFuZ2VJZFZhbGlkYXRvcihyZWZDb250cm9sLCBjYW5vbmljYWxXZWJVcmwsIHNzaEluZm8pKTsKKyAgICB9CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IENvbmZpZ1ZhbGlkYXRvcihyZWZDb250cm9sLCByZXBvKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IFBsdWdpbkNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcihjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzKSk7CisKKyAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcyA9CisgICAgICAgIG5ldyBMaW5rZWRMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPigpOworCisgICAgdHJ5IHsKKyAgICAgIGZvciAoQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIGNvbW1pdFZhbGlkYXRvciA6IHZhbGlkYXRvcnMpIHsKKyAgICAgICAgbWVzc2FnZXMuYWRkQWxsKGNvbW1pdFZhbGlkYXRvci5vbkNvbW1pdFJlY2VpdmVkKHJlY2VpdmVFdmVudCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgLy8gS2VlcCB0aGUgb2xkIG1lc3NhZ2VzIChhbmQgdGhlaXIgb3JkZXIpIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uCisgICAgICBtZXNzYWdlcy5hZGRBbGwoZS5nZXRNZXNzYWdlcygpKTsKKyAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlcyk7CisgICAgfQorICAgIHJldHVybiBtZXNzYWdlczsKKyAgfQorCisgIHB1YmxpYyBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiB2YWxpZGF0ZUZvckdlcnJpdENvbW1pdHMoCisgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworCisgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+IHZhbGlkYXRvcnMgPQorICAgICAgICBuZXcgTGlua2VkTGlzdDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+KCk7CisKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgVXBsb2FkTWVyZ2VzUGVybWlzc2lvblZhbGlkYXRvcihyZWZDb250cm9sKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IEFtZW5kZWRHZXJyaXRNZXJnZUNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgcmVmQ29udHJvbCwgZ2Vycml0SWRlbnQpKTsKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgQXV0aG9yVXBsb2FkZXJWYWxpZGF0b3IocmVmQ29udHJvbCwgY2Fub25pY2FsV2ViVXJsKSk7CisgICAgdmFsaWRhdG9ycy5hZGQobmV3IFNpZ25lZE9mZkJ5VmFsaWRhdG9yKHJlZkNvbnRyb2wsIGNhbm9uaWNhbFdlYlVybCkpOworICAgIGlmIChNYWdpY0JyYW5jaC5pc01hZ2ljQnJhbmNoKHJlY2VpdmVFdmVudC5jb21tYW5kLmdldFJlZk5hbWUoKSkKKyAgICAgICAgfHwgUmVjZWl2ZUNvbW1pdHMuTkVXX1BBVENIU0VULm1hdGNoZXIoCisgICAgICAgICAgICByZWNlaXZlRXZlbnQuY29tbWFuZC5nZXRSZWZOYW1lKCkpLm1hdGNoZXMoKSkgeworICAgICAgdmFsaWRhdG9ycy5hZGQobmV3IENoYW5nZUlkVmFsaWRhdG9yKHJlZkNvbnRyb2wsIGNhbm9uaWNhbFdlYlVybCwgc3NoSW5mbykpOworICAgIH0KKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgQ29uZmlnVmFsaWRhdG9yKHJlZkNvbnRyb2wsIHJlcG8pKTsKKyAgICB2YWxpZGF0b3JzLmFkZChuZXcgUGx1Z2luQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyKGNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnMpKTsKKworICAgIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG1lc3NhZ2VzID0KKyAgICAgICAgbmV3IExpbmtlZExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+KCk7CisKKyAgICB0cnkgeworICAgICAgZm9yIChDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgY29tbWl0VmFsaWRhdG9yIDogdmFsaWRhdG9ycykgeworICAgICAgICBtZXNzYWdlcy5hZGRBbGwoY29tbWl0VmFsaWRhdG9yLm9uQ29tbWl0UmVjZWl2ZWQocmVjZWl2ZUV2ZW50KSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAvLyBLZWVwIHRoZSBvbGQgbWVzc2FnZXMgKGFuZCB0aGVpciBvcmRlcikgaW4gY2FzZSBvZiBhbiBleGNlcHRpb24KKyAgICAgIG1lc3NhZ2VzLmFkZEFsbChlLmdldE1lc3NhZ2VzKCkpOworICAgICAgdGhyb3cgbmV3IENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIG1lc3NhZ2VzKTsKKyAgICB9CisgICAgcmV0dXJuIG1lc3NhZ2VzOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGFuZ2VJZFZhbGlkYXRvciBpbXBsZW1lbnRzIENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2w7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsOworICAgIHByaXZhdGUgZmluYWwgU3NoSW5mbyBzc2hJbmZvOworCisgICAgcHVibGljIENoYW5nZUlkVmFsaWRhdG9yKFJlZkNvbnRyb2wgcmVmQ29udHJvbCwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybCwKKyAgICAgICAgU3NoSW5mbyBzc2hJbmZvKSB7CisgICAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgICAgdGhpcy5jYW5vbmljYWxXZWJVcmwgPSBjYW5vbmljYWxXZWJVcmw7CisgICAgICB0aGlzLnNzaEluZm8gPSBzc2hJbmZvOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBvbkNvbW1pdFJlY2VpdmVkKAorICAgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworCisgICAgICBmaW5hbCBQcm9qZWN0Q29udHJvbCBwcm9qZWN0Q29udHJvbCA9IHJlZkNvbnRyb2wuZ2V0UHJvamVjdENvbnRyb2woKTsKKyAgICAgIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyID0gKElkZW50aWZpZWRVc2VyKSByZWZDb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CisgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gaWRMaXN0ID0gcmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRGb290ZXJMaW5lcyhDSEFOR0VfSUQpOworCisgICAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcyA9CisgICAgICAgICAgbmV3IExpbmtlZExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+KCk7CisKKyAgICAgIGlmIChpZExpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0U3RhdGUoKS5pc1JlcXVpcmVDaGFuZ2VJRCgpKSB7CisgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJtaXNzaW5nIENoYW5nZS1JZCBpbiBjb21taXQgbWVzc2FnZSBmb290ZXIiOworICAgICAgICAgIG1lc3NhZ2VzLmFkZChnZXRGaXhlZENvbW1pdE1zZ1dpdGhDaGFuZ2VJZChlcnJNc2csIHJlY2VpdmVFdmVudC5jb21taXQsCisgICAgICAgICAgICAgIGN1cnJlbnRVc2VyLCBjYW5vbmljYWxXZWJVcmwsIHNzaEluZm8pKTsKKyAgICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbihlcnJNc2csIG1lc3NhZ2VzKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpZExpc3Quc2l6ZSgpID4gMSkgeworICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJtdWx0aXBsZSBDaGFuZ2UtSWQgbGluZXMgaW4gY29tbWl0IG1lc3NhZ2UgZm9vdGVyIiwgbWVzc2FnZXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHYgPSBpZExpc3QuZ2V0KGlkTGlzdC5zaXplKCkgLSAxKS50cmltKCk7CisgICAgICAgIGlmICghdi5tYXRjaGVzKCJeSVswLTlhLWZdezgsfS4qJCIpKSB7CisgICAgICAgICAgZmluYWwgU3RyaW5nIGVyck1zZyA9CisgICAgICAgICAgICAgICJtaXNzaW5nIG9yIGludmFsaWQgQ2hhbmdlLUlkIGxpbmUgZm9ybWF0IGluIGNvbW1pdCBtZXNzYWdlIGZvb3RlciI7CisgICAgICAgICAgbWVzc2FnZXMuYWRkKGdldEZpeGVkQ29tbWl0TXNnV2l0aENoYW5nZUlkKGVyck1zZywgcmVjZWl2ZUV2ZW50LmNvbW1pdCwKKyAgICAgICAgICAgICAgY3VycmVudFVzZXIsIGNhbm9uaWNhbFdlYlVybCwgc3NoSW5mbykpOworICAgICAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKGVyck1zZywgbWVzc2FnZXMpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPmVtcHR5TGlzdCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBJZiB0aGlzIGlzIHRoZSBzcGVjaWFsIHByb2plY3QgY29uZmlndXJhdGlvbiBicmFuY2gsIHZhbGlkYXRlIHRoZSBjb25maWcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ1ZhbGlkYXRvciBpbXBsZW1lbnRzIENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2w7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXBvc2l0b3J5IHJlcG87CisKKyAgICBwdWJsaWMgQ29uZmlnVmFsaWRhdG9yKFJlZkNvbnRyb2wgcmVmQ29udHJvbCwgUmVwb3NpdG9yeSByZXBvKSB7CisgICAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgICAgdGhpcy5yZXBvID0gcmVwbzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gb25Db21taXRSZWNlaXZlZCgKKyAgICAgICAgQ29tbWl0UmVjZWl2ZWRFdmVudCByZWNlaXZlRXZlbnQpIHRocm93cyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyID0gKElkZW50aWZpZWRVc2VyKSByZWZDb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CisKKyAgICAgIGlmIChHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLmVxdWFscyhyZWZDb250cm9sLmdldFJlZk5hbWUoKSkpIHsKKyAgICAgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMgPQorICAgICAgICAgICAgbmV3IExpbmtlZExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBQcm9qZWN0Q29uZmlnIGNmZyA9CisgICAgICAgICAgICAgIG5ldyBQcm9qZWN0Q29uZmlnKHJlY2VpdmVFdmVudC5wcm9qZWN0LmdldE5hbWVLZXkoKSk7CisgICAgICAgICAgY2ZnLmxvYWQocmVwbywgcmVjZWl2ZUV2ZW50LmNvbW1hbmQuZ2V0TmV3SWQoKSk7CisgICAgICAgICAgaWYgKCFjZmcuZ2V0VmFsaWRhdGlvbkVycm9ycygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYWRkRXJyb3IoIkludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uOiIsIG1lc3NhZ2VzKTsKKyAgICAgICAgICAgIGZvciAoVmFsaWRhdGlvbkVycm9yIGVyciA6IGNmZy5nZXRWYWxpZGF0aW9uRXJyb3JzKCkpIHsKKyAgICAgICAgICAgICAgYWRkRXJyb3IoIiAgIiArIGVyci5nZXRNZXNzYWdlKCksIG1lc3NhZ2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKCJpbnZhbGlkIHByb2plY3QgY29uZmlndXJhdGlvbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICBsb2cuZXJyb3IoIlVzZXIgIiArIGN1cnJlbnRVc2VyLmdldFVzZXJOYW1lKCkKKyAgICAgICAgICAgICAgKyAiIHRyaWVkIHRvIHB1c2ggaW52YWxpZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gIgorICAgICAgICAgICAgICArIHJlY2VpdmVFdmVudC5jb21tYW5kLmdldE5ld0lkKCkubmFtZSgpICsgIiBmb3IgIgorICAgICAgICAgICAgICArIHJlY2VpdmVFdmVudC5wcm9qZWN0LmdldE5hbWUoKSwgZSk7CisgICAgICAgICAgdGhyb3cgbmV3IENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oImludmFsaWQgcHJvamVjdCBjb25maWd1cmF0aW9uIiwKKyAgICAgICAgICAgICAgbWVzc2FnZXMpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPmVtcHR5TGlzdCgpOworICAgIH0KKyAgfQorCisgIC8qKiBSZXF1aXJlIHBlcm1pc3Npb24gdG8gdXBsb2FkIG1lcmdlcy4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBVcGxvYWRNZXJnZXNQZXJtaXNzaW9uVmFsaWRhdG9yIGltcGxlbWVudHMKKyAgICAgIENvbW1pdFZhbGlkYXRpb25MaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2w7CisKKyAgICBwdWJsaWMgVXBsb2FkTWVyZ2VzUGVybWlzc2lvblZhbGlkYXRvcihSZWZDb250cm9sIHJlZkNvbnRyb2wpIHsKKyAgICAgIHRoaXMucmVmQ29udHJvbCA9IHJlZkNvbnRyb2w7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoCisgICAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50KSB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBpZiAocmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRQYXJlbnRDb3VudCgpID4gMQorICAgICAgICAgICYmICFyZWZDb250cm9sLmNhblVwbG9hZE1lcmdlcygpKSB7CisgICAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKCJ5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIHVwbG9hZCBtZXJnZXMiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+ZW1wdHlMaXN0KCk7CisgICAgfQorICB9CisKKyAgLyoqIEV4ZWN1dGUgY29tbWl0IHZhbGlkYXRpb24gcGx1Zy1pbnMgKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBQbHVnaW5Db21taXRWYWxpZGF0aW9uTGlzdGVuZXIgaW1wbGVtZW50cworICAgICAgQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8Q29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyPiBjb21taXRWYWxpZGF0aW9uTGlzdGVuZXJzOworCisgICAgcHVibGljIFBsdWdpbkNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgZmluYWwgRHluYW1pY1NldDxDb21taXRWYWxpZGF0aW9uTGlzdGVuZXI+IGNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnMpIHsKKyAgICAgIHRoaXMuY29tbWl0VmFsaWRhdGlvbkxpc3RlbmVycyA9IGNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoCisgICAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50KSB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcyA9CisgICAgICAgICAgbmV3IExpbmtlZExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+KCk7CisKKyAgICAgIGZvciAoQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIHZhbGlkYXRvciA6IGNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lcnMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBtZXNzYWdlcy5hZGRBbGwodmFsaWRhdG9yLm9uQ29tbWl0UmVjZWl2ZWQocmVjZWl2ZUV2ZW50KSk7CisgICAgICAgIH0gY2F0Y2ggKENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgIG1lc3NhZ2VzLmFkZEFsbChlLmdldE1lc3NhZ2VzKCkpOworICAgICAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBtZXNzYWdlcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBtZXNzYWdlczsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpZ25lZE9mZkJ5VmFsaWRhdG9yIGltcGxlbWVudHMgQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFJlZkNvbnRyb2wgcmVmQ29udHJvbDsKKworICAgIHB1YmxpYyBTaWduZWRPZmZCeVZhbGlkYXRvcihSZWZDb250cm9sIHJlZkNvbnRyb2wsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwpIHsKKyAgICAgIHRoaXMucmVmQ29udHJvbCA9IHJlZkNvbnRyb2w7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+IG9uQ29tbWl0UmVjZWl2ZWQoCisgICAgICAgIENvbW1pdFJlY2VpdmVkRXZlbnQgcmVjZWl2ZUV2ZW50KSB0aHJvd3MgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciA9IChJZGVudGlmaWVkVXNlcikgcmVmQ29udHJvbC5nZXRDdXJyZW50VXNlcigpOworICAgICAgZmluYWwgUGVyc29uSWRlbnQgY29tbWl0dGVyID0gcmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRDb21taXR0ZXJJZGVudCgpOworICAgICAgZmluYWwgUGVyc29uSWRlbnQgYXV0aG9yID0gcmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRBdXRob3JJZGVudCgpOworICAgICAgZmluYWwgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wgPSByZWZDb250cm9sLmdldFByb2plY3RDb250cm9sKCk7CisKKyAgICAgIGlmIChwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0U3RhdGUoKS5pc1VzZVNpZ25lZE9mZkJ5KCkpIHsKKyAgICAgICAgYm9vbGVhbiBzYm9BdXRob3IgPSBmYWxzZSwgc2JvQ29tbWl0dGVyID0gZmFsc2UsIHNib01lID0gZmFsc2U7CisgICAgICAgIGZvciAoZmluYWwgRm9vdGVyTGluZSBmb290ZXIgOiByZWNlaXZlRXZlbnQuY29tbWl0LmdldEZvb3RlckxpbmVzKCkpIHsKKyAgICAgICAgICBpZiAoZm9vdGVyLm1hdGNoZXMoRm9vdGVyS2V5LlNJR05FRF9PRkZfQlkpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZSA9IGZvb3Rlci5nZXRFbWFpbEFkZHJlc3MoKTsKKyAgICAgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgc2JvQXV0aG9yIHw9IGF1dGhvci5nZXRFbWFpbEFkZHJlc3MoKS5lcXVhbHMoZSk7CisgICAgICAgICAgICAgIHNib0NvbW1pdHRlciB8PSBjb21taXR0ZXIuZ2V0RW1haWxBZGRyZXNzKCkuZXF1YWxzKGUpOworICAgICAgICAgICAgICBzYm9NZSB8PSBjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpLmNvbnRhaW5zKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXNib0F1dGhvciAmJiAhc2JvQ29tbWl0dGVyICYmICFzYm9NZQorICAgICAgICAgICAgJiYgIXJlZkNvbnRyb2wuY2FuRm9yZ2VDb21taXR0ZXIoKSkgeworICAgICAgICAgIHRocm93IG5ldyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAibm90IFNpZ25lZC1vZmYtYnkgYXV0aG9yL2NvbW1pdHRlci91cGxvYWRlciBpbiBjb21taXQgbWVzc2FnZSBmb290ZXIiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKworICAvKiogUmVxdWlyZSB0aGF0IGF1dGhvciBtYXRjaGVzIHRoZSB1cGxvYWRlci4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBBdXRob3JVcGxvYWRlclZhbGlkYXRvciBpbXBsZW1lbnRzCisgICAgICBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybDsKKworICAgIHB1YmxpYyBBdXRob3JVcGxvYWRlclZhbGlkYXRvcihSZWZDb250cm9sIHJlZkNvbnRyb2wsIFN0cmluZyBjYW5vbmljYWxXZWJVcmwpIHsKKyAgICAgIHRoaXMucmVmQ29udHJvbCA9IHJlZkNvbnRyb2w7CisgICAgICB0aGlzLmNhbm9uaWNhbFdlYlVybCA9IGNhbm9uaWNhbFdlYlVybDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gb25Db21taXRSZWNlaXZlZCgKKyAgICAgICAgQ29tbWl0UmVjZWl2ZWRFdmVudCByZWNlaXZlRXZlbnQpIHRocm93cyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyID0gKElkZW50aWZpZWRVc2VyKSByZWZDb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CisgICAgICBmaW5hbCBQZXJzb25JZGVudCBhdXRob3IgPSByZWNlaXZlRXZlbnQuY29tbWl0LmdldEF1dGhvcklkZW50KCk7CisKKyAgICAgIGlmICghY3VycmVudFVzZXIuZ2V0RW1haWxBZGRyZXNzZXMoKS5jb250YWlucyhhdXRob3IuZ2V0RW1haWxBZGRyZXNzKCkpCisgICAgICAgICAgJiYgIXJlZkNvbnRyb2wuY2FuRm9yZ2VBdXRob3IoKSkgeworICAgICAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcyA9CisgICAgICAgICAgICBuZXcgTGlua2VkTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4oKTsKKworICAgICAgICBtZXNzYWdlcy5hZGQoZ2V0SW52YWxpZEVtYWlsRXJyb3IocmVjZWl2ZUV2ZW50LmNvbW1pdCwgImF1dGhvciIsIGF1dGhvciwKKyAgICAgICAgICAgIGN1cnJlbnRVc2VyLCBjYW5vbmljYWxXZWJVcmwpKTsKKyAgICAgICAgdGhyb3cgbmV3IENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24oImludmFsaWQgYXV0aG9yIiwgbWVzc2FnZXMpOworICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT5lbXB0eUxpc3QoKTsKKyAgICB9CisgIH0KKworICAvKiogUmVxdWlyZSB0aGF0IGNvbW1pdHRlciBtYXRjaGVzIHRoZSB1cGxvYWRlci4gKi8KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21taXR0ZXJVcGxvYWRlclZhbGlkYXRvciBpbXBsZW1lbnRzCisgICAgICBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgUmVmQ29udHJvbCByZWZDb250cm9sOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybDsKKworICAgIHB1YmxpYyBDb21taXR0ZXJVcGxvYWRlclZhbGlkYXRvcihSZWZDb250cm9sIHJlZkNvbnRyb2wsCisgICAgICAgIFN0cmluZyBjYW5vbmljYWxXZWJVcmwpIHsKKyAgICAgIHRoaXMucmVmQ29udHJvbCA9IHJlZkNvbnRyb2w7CisgICAgICB0aGlzLmNhbm9uaWNhbFdlYlVybCA9IGNhbm9uaWNhbFdlYlVybDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gb25Db21taXRSZWNlaXZlZCgKKyAgICAgICAgQ29tbWl0UmVjZWl2ZWRFdmVudCByZWNlaXZlRXZlbnQpIHRocm93cyBDb21taXRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyID0gKElkZW50aWZpZWRVc2VyKSByZWZDb250cm9sLmdldEN1cnJlbnRVc2VyKCk7CisgICAgICBmaW5hbCBQZXJzb25JZGVudCBjb21taXR0ZXIgPSByZWNlaXZlRXZlbnQuY29tbWl0LmdldENvbW1pdHRlcklkZW50KCk7CisgICAgICBpZiAoIWN1cnJlbnRVc2VyLmdldEVtYWlsQWRkcmVzc2VzKCkKKyAgICAgICAgICAuY29udGFpbnMoY29tbWl0dGVyLmdldEVtYWlsQWRkcmVzcygpKQorICAgICAgICAgICYmICFyZWZDb250cm9sLmNhbkZvcmdlQ29tbWl0dGVyKCkpIHsKKyAgICAgICAgTGlzdDxDb21taXRWYWxpZGF0aW9uTWVzc2FnZT4gbWVzc2FnZXMgPQorICAgICAgICAgICAgbmV3IExpbmtlZExpc3Q8Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+KCk7CisgICAgICAgIG1lc3NhZ2VzLmFkZChnZXRJbnZhbGlkRW1haWxFcnJvcihyZWNlaXZlRXZlbnQuY29tbWl0LCAiY29tbWl0dGVyIiwgY29tbWl0dGVyLAorICAgICAgICAgICAgY3VycmVudFVzZXIsIGNhbm9uaWNhbFdlYlVybCkpOworICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbigiaW52YWxpZCBjb21taXR0ZXIiLCBtZXNzYWdlcyk7CisgICAgICB9CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPmVtcHR5TGlzdCgpOworICAgIH0KKyAgfQorCisgIC8qKgorICAgKiBEb24ndCBhbGxvdyB0aGUgdXNlciB0byBhbWVuZCBhIG1lcmdlIGNyZWF0ZWQgYnkgR2Vycml0IENvZGUgUmV2aWV3LiBUaGlzCisgICAqIHNlZW1zIHRvIGhhcHBlbiBhbGwgdG9vIG9mdGVuLCBkdWUgdG8gdXNlcnMgbm90IHBheWluZyBhbnkgYXR0ZW50aW9uIHRvCisgICAqIHdoYXQgdGhleSBhcmUgZG9pbmcuCisgICAqLworICBwdWJsaWMgc3RhdGljIGNsYXNzIEFtZW5kZWRHZXJyaXRNZXJnZUNvbW1pdFZhbGlkYXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzCisgICAgICBDb21taXRWYWxpZGF0aW9uTGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgUGVyc29uSWRlbnQgZ2Vycml0SWRlbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2w7CisKKyAgICBwdWJsaWMgQW1lbmRlZEdlcnJpdE1lcmdlQ29tbWl0VmFsaWRhdGlvbkxpc3RlbmVyKAorICAgICAgICBmaW5hbCBSZWZDb250cm9sIHJlZkNvbnRyb2wsIGZpbmFsIFBlcnNvbklkZW50IGdlcnJpdElkZW50KSB7CisgICAgICB0aGlzLnJlZkNvbnRyb2wgPSByZWZDb250cm9sOworICAgICAgdGhpcy5nZXJyaXRJZGVudCA9IGdlcnJpdElkZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBvbkNvbW1pdFJlY2VpdmVkKAorICAgICAgICBDb21taXRSZWNlaXZlZEV2ZW50IHJlY2VpdmVFdmVudCkgdGhyb3dzIENvbW1pdFZhbGlkYXRpb25FeGNlcHRpb24geworICAgICAgZmluYWwgUGVyc29uSWRlbnQgYXV0aG9yID0gcmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRBdXRob3JJZGVudCgpOworCisgICAgICBpZiAocmVjZWl2ZUV2ZW50LmNvbW1pdC5nZXRQYXJlbnRDb3VudCgpID4gMQorICAgICAgICAgICYmIGF1dGhvci5nZXROYW1lKCkuZXF1YWxzKGdlcnJpdElkZW50LmdldE5hbWUoKSkKKyAgICAgICAgICAmJiBhdXRob3IuZ2V0RW1haWxBZGRyZXNzKCkuZXF1YWxzKGdlcnJpdElkZW50LmdldEVtYWlsQWRkcmVzcygpKQorICAgICAgICAgICYmICFyZWZDb250cm9sLmNhbkZvcmdlR2Vycml0U2VydmVySWRlbnRpdHkoKSkgeworICAgICAgICB0aHJvdyBuZXcgQ29tbWl0VmFsaWRhdGlvbkV4Y2VwdGlvbigiZG8gbm90IGFtZW5kIG1lcmdlcyBub3QgbWFkZSBieSB5b3UiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q29tbWl0VmFsaWRhdGlvbk1lc3NhZ2U+ZW1wdHlMaXN0KCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UgZ2V0SW52YWxpZEVtYWlsRXJyb3IoUmV2Q29tbWl0IGMsIFN0cmluZyB0eXBlLAorICAgICAgUGVyc29uSWRlbnQgd2hvLCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciwgU3RyaW5nIGNhbm9uaWNhbFdlYlVybCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHNiLmFwcGVuZCgiXG4iKTsKKyAgICBzYi5hcHBlbmQoIkVSUk9SOiAgSW4gY29tbWl0ICIgKyBjLm5hbWUoKSArICJcbiIpOworICAgIHNiLmFwcGVuZCgiRVJST1I6ICAiICsgdHlwZSArICIgZW1haWwgYWRkcmVzcyAiICsgd2hvLmdldEVtYWlsQWRkcmVzcygpCisgICAgICAgICsgIlxuIik7CisgICAgc2IuYXBwZW5kKCJFUlJPUjogIGRvZXMgbm90IG1hdGNoIHlvdXIgdXNlciBhY2NvdW50LlxuIik7CisgICAgc2IuYXBwZW5kKCJFUlJPUjpcbiIpOworICAgIGlmIChjdXJyZW50VXNlci5nZXRFbWFpbEFkZHJlc3NlcygpLmlzRW1wdHkoKSkgeworICAgICAgc2IuYXBwZW5kKCJFUlJPUjogIFlvdSBoYXZlIG5vdCByZWdpc3RlcmVkIGFueSBlbWFpbCBhZGRyZXNzZXMuXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKCJFUlJPUjogIFRoZSBmb2xsb3dpbmcgYWRkcmVzc2VzIGFyZSBjdXJyZW50bHkgcmVnaXN0ZXJlZDpcbiIpOworICAgICAgZm9yIChTdHJpbmcgYWRkcmVzcyA6IGN1cnJlbnRVc2VyLmdldEVtYWlsQWRkcmVzc2VzKCkpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJFUlJPUjogICAgIiArIGFkZHJlc3MgKyAiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgc2IuYXBwZW5kKCJFUlJPUjpcbiIpOworICAgIGlmIChjYW5vbmljYWxXZWJVcmwgIT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJFUlJPUjogIFRvIHJlZ2lzdGVyIGFuIGVtYWlsIGFkZHJlc3MsIHBsZWFzZSB2aXNpdDpcbiIpOworICAgICAgc2IuYXBwZW5kKCJFUlJPUjogICIgKyBjYW5vbmljYWxXZWJVcmwgKyAiIyIgKyBQYWdlTGlua3MuU0VUVElOR1NfQ09OVEFDVAorICAgICAgICAgICsgIlxuIik7CisgICAgfQorICAgIHNiLmFwcGVuZCgiXG4iKTsKKyAgICByZXR1cm4gbmV3IENvbW1pdFZhbGlkYXRpb25NZXNzYWdlKHNiLnRvU3RyaW5nKCksIGZhbHNlKTsKKyAgfQorCisgIC8qKgorICAgKiBXZSBoYW5kbGUgMyBjYXNlczoKKyAgICogMS4gTm8gY2hhbmdlIGlkIGluIHRoZSBjb21taXQgbWVzc2FnZSBhdCBhbGwuCisgICAqIDIuIENoYW5nZSBpZCBsYXN0IGluIHRoZSBjb21taXQgbWVzc2FnZSBidXQgbWlzc2luZyBlbXB0eSBsaW5lIHRvIGNyZWF0ZSB0aGUgZm9vdGVyLgorICAgKiAzLiBUaGVyZSBpcyBhIGNoYW5nZS1pZCBzb21ld2hlcmUgaW4gdGhlIGNvbW1pdCBtZXNzYWdlLCBidXQgd2UgaWdub3JlIGl0LgorICAgKgorICAgKiBAcmV0dXJuIFRoZSBmaXhlZCB1cCBjb21taXQgbWVzc2FnZQorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UgZ2V0Rml4ZWRDb21taXRNc2dXaXRoQ2hhbmdlSWQoZmluYWwgU3RyaW5nIGVyck1zZywKKyAgICAgIGZpbmFsIFJldkNvbW1pdCBjLCBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciwKKyAgICAgIFN0cmluZyBjYW5vbmljYWxXZWJVcmwsIGZpbmFsIFNzaEluZm8gc3NoSW5mbykgeworICAgIGZpbmFsIFN0cmluZyBjaGFuZ2VJZCA9ICJDaGFuZ2UtSWQ6IjsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBzYi5hcHBlbmQoIkVSUk9SOiAiKS5hcHBlbmQoZXJyTXNnKTsKKyAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgc2IuYXBwZW5kKCJTdWdnZXN0aW9uIGZvciBjb21taXQgbWVzc2FnZTpcbiIpOworCisgICAgaWYgKGMuZ2V0RnVsbE1lc3NhZ2UoKS5pbmRleE9mKGNoYW5nZUlkKSA9PSAtMSkgeworICAgICAgc2IuYXBwZW5kKGMuZ2V0RnVsbE1lc3NhZ2UoKSk7CisgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICBzYi5hcHBlbmQoY2hhbmdlSWQpLmFwcGVuZCgiIEkiKS5hcHBlbmQoYy5uYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBTdHJpbmcgbGluZXNbXSA9IGMuZ2V0RnVsbE1lc3NhZ2UoKS50cmltKCkuc3BsaXQoIlxuIik7CisgICAgICBTdHJpbmcgbGFzdExpbmUgPSBsaW5lcy5sZW5ndGggPiAwID8gbGluZXNbbGluZXMubGVuZ3RoIC0gMV0gOiAiIjsKKworICAgICAgaWYgKGxhc3RMaW5lLmluZGV4T2YoY2hhbmdlSWQpID09IDApIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGggLSAxOyBpKyspIHsKKyAgICAgICAgICBzYi5hcHBlbmQobGluZXNbaV0pOworICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorCisgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgc2IuYXBwZW5kKGxhc3RMaW5lKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZChjLmdldEZ1bGxNZXNzYWdlKCkpOworICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHNiLmFwcGVuZChjaGFuZ2VJZCkuYXBwZW5kKCIgSSIpLmFwcGVuZChjLm5hbWUoKSk7CisgICAgICAgIHNiLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgc2IuYXBwZW5kKCJIaW50OiBBIHBvdGVudGlhbCBDaGFuZ2UtSWQgd2FzIGZvdW5kLCBidXQgaXQgd2FzIG5vdCBpbiB0aGUgIik7CisgICAgICAgIHNiLmFwcGVuZCgiZm9vdGVyIChsYXN0IHBhcmFncmFwaCkgb2YgdGhlIGNvbW1pdCBtZXNzYWdlLiIpOworICAgICAgfQorICAgIH0KKyAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgc2IuYXBwZW5kKCdcbicpOworICAgIHNiLmFwcGVuZCgiSGludDogVG8gYXV0b21hdGljYWxseSBpbnNlcnQgQ2hhbmdlLUlkLCBpbnN0YWxsIHRoZSBob29rOlxuIik7CisgICAgc2IuYXBwZW5kKGdldENvbW1pdE1lc3NhZ2VIb29rSW5zdGFsbGF0aW9uSGludChjdXJyZW50VXNlciwKKyAgICAgICAgY2Fub25pY2FsV2ViVXJsLCBzc2hJbmZvKSkuYXBwZW5kKCdcbicpOworICAgIHNiLmFwcGVuZCgnXG4nKTsKKworICAgIHJldHVybiBuZXcgQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2Uoc2IudG9TdHJpbmcoKSwgZmFsc2UpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbW1pdE1lc3NhZ2VIb29rSW5zdGFsbGF0aW9uSGludCgKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyLCBTdHJpbmcgY2Fub25pY2FsV2ViVXJsLAorICAgICAgZmluYWwgU3NoSW5mbyBzc2hJbmZvKSB7CisgICAgZmluYWwgTGlzdDxIb3N0S2V5PiBob3N0S2V5cyA9IHNzaEluZm8uZ2V0SG9zdEtleXMoKTsKKworICAgIC8vIElmIHRoZXJlIGFyZSBubyBTU0gga2V5cywgdGhlIGNvbW1pdC1tc2cgaG9vayBtdXN0IGJlIGluc3RhbGxlZCB2aWEKKyAgICAvLyBIVFRQKFMpCisgICAgaWYgKGhvc3RLZXlzLmlzRW1wdHkoKSkgeworICAgICAgU3RyaW5nIHAgPSAiLmdpdC9ob29rcy9jb21taXQtbXNnIjsKKyAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICIgIGN1cmwgLW8gJXMgJXMvdG9vbHMvaG9va3MvY29tbWl0LW1zZyA7IGNobW9kICt4ICVzIiwgcCwKKyAgICAgICAgICBnZXRHZXJyaXRVcmwoY2Fub25pY2FsV2ViVXJsKSwgcCk7CisgICAgfQorCisgICAgLy8gU1NIIGtleXMgZXhpc3QsIHNvIHRoZSBob29rIGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBzY3AuCisgICAgU3RyaW5nIHNzaEhvc3Q7CisgICAgaW50IHNzaFBvcnQ7CisgICAgU3RyaW5nIGhvc3QgPSBob3N0S2V5cy5nZXQoMCkuZ2V0SG9zdCgpOworICAgIGludCBjID0gaG9zdC5sYXN0SW5kZXhPZignOicpOworICAgIGlmICgwIDw9IGMpIHsKKyAgICAgIGlmIChob3N0LnN0YXJ0c1dpdGgoIio6IikpIHsKKyAgICAgICAgc3NoSG9zdCA9IGdldEdlcnJpdEhvc3QoY2Fub25pY2FsV2ViVXJsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNzaEhvc3QgPSBob3N0LnN1YnN0cmluZygwLCBjKTsKKyAgICAgIH0KKyAgICAgIHNzaFBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KGhvc3Quc3Vic3RyaW5nKGMgKyAxKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNzaEhvc3QgPSBob3N0OworICAgICAgc3NoUG9ydCA9IDIyOworICAgIH0KKworICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIgIHNjcCAtcCAtUCAlZCAlc0Alczpob29rcy9jb21taXQtbXNnIC5naXQvaG9va3MvIiwKKyAgICAgICAgc3NoUG9ydCwgY3VycmVudFVzZXIuZ2V0VXNlck5hbWUoKSwgc3NoSG9zdCk7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBHZXJyaXQgVVJMLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBjYW5vbmljYWwgVVJMICh3aXRoIGFueSB0cmFpbGluZyBzbGFzaCByZW1vdmVkKSBpZiBpdCBpcworICAgKiAgICAgICAgIGNvbmZpZ3VyZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gImh0dHA6Ly9ob3N0bmFtZSIgd2hlcmUgaG9zdG5hbWUKKyAgICogICAgICAgICBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRHZXJyaXRIb3N0KCl9LgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEdlcnJpdFVybChTdHJpbmcgY2Fub25pY2FsV2ViVXJsKSB7CisgICAgaWYgKGNhbm9uaWNhbFdlYlVybCAhPSBudWxsKSB7CisgICAgICBpZiAoY2Fub25pY2FsV2ViVXJsLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgcmV0dXJuIGNhbm9uaWNhbFdlYlVybC5zdWJzdHJpbmcoMCwgY2Fub25pY2FsV2ViVXJsLmxhc3RJbmRleE9mKCIvIikpOworICAgICAgfQorICAgICAgcmV0dXJuIGNhbm9uaWNhbFdlYlVybDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuICJodHRwOi8vIiArIGdldEdlcnJpdEhvc3QoY2Fub25pY2FsV2ViVXJsKTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBHZXJyaXQgaG9zdG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gdGhlIGhvc3RuYW1lIGZyb20gdGhlIGNhbm9uaWNhbCBVUkwgaWYgaXQgaXMgY29uZmlndXJlZCwgb3RoZXJ3aXNlCisgICAqICAgICAgICAgd2hhdGV2ZXIgdGhlIE9TIHNheXMgdGhlIGhvc3RuYW1lIGlzLgorICAgKi8KKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEdlcnJpdEhvc3QoU3RyaW5nIGNhbm9uaWNhbFdlYlVybCkgeworICAgIFN0cmluZyBob3N0OworICAgIGlmIChjYW5vbmljYWxXZWJVcmwgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgaG9zdCA9IG5ldyBVUkwoY2Fub25pY2FsV2ViVXJsKS5nZXRIb3N0KCk7CisgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICBob3N0ID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0SG9zdG5hbWUoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaG9zdCA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEhvc3RuYW1lKCk7CisgICAgfQorICAgIHJldHVybiBob3N0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFcnJvcihTdHJpbmcgZXJyb3IsCisgICAgICBMaXN0PENvbW1pdFZhbGlkYXRpb25NZXNzYWdlPiBtZXNzYWdlcykgeworICAgIG1lc3NhZ2VzLmFkZChuZXcgQ29tbWl0VmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3IsIHRydWUpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9BZGRJbmNsdWRlZEdyb3Vwcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9BZGRJbmNsdWRlZEdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhM2YzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0FkZEluY2x1ZGVkR3JvdXBzLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwSW5jbHVkZUNhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5BZGRJbmNsdWRlZEdyb3Vwcy5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBBZGRJbmNsdWRlZEdyb3VwcyBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBfb25lR3JvdXA7CisKKyAgICBMaXN0PFN0cmluZz4gZ3JvdXBzOworCisgICAgc3RhdGljIElucHV0IGluaXQoSW5wdXQgaW4pIHsKKyAgICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICAgIGluID0gbmV3IElucHV0KCk7CisgICAgICB9CisgICAgICBpZiAoaW4uZ3JvdXBzID09IG51bGwpIHsKKyAgICAgICAgaW4uZ3JvdXBzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KDEpOworICAgICAgfQorICAgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaW4uX29uZUdyb3VwKSkgeworICAgICAgICBpbi5ncm91cHMuYWRkKGluLl9vbmVHcm91cCk7CisgICAgICB9CisgICAgICByZXR1cm4gaW47CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uOworICBwcml2YXRlIGZpbmFsIEdyb3VwSW5jbHVkZUNhY2hlIGdyb3VwSW5jbHVkZUNhY2hlOworICBwcml2YXRlIGZpbmFsIFJldmlld0RiIGRiOworICBwcml2YXRlIGZpbmFsIEdyb3VwSnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgcHVibGljIEFkZEluY2x1ZGVkR3JvdXBzKFByb3ZpZGVyPEdyb3Vwc0NvbGxlY3Rpb24+IGdyb3Vwc0NvbGxlY3Rpb24sCisgICAgICBHcm91cEluY2x1ZGVDYWNoZSBncm91cEluY2x1ZGVDYWNoZSwKKyAgICAgIFJldmlld0RiIGRiLCBHcm91cEpzb24ganNvbikgeworICAgIHRoaXMuZ3JvdXBzQ29sbGVjdGlvbiA9IGdyb3Vwc0NvbGxlY3Rpb247CisgICAgdGhpcy5ncm91cEluY2x1ZGVDYWNoZSA9IGdyb3VwSW5jbHVkZUNhY2hlOworICAgIHRoaXMuZGIgPSBkYjsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PEdyb3VwSW5mbz4gYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwKKyAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaW5wdXQgPSBJbnB1dC5pbml0KGlucHV0KTsKKworICAgIEdyb3VwQ29udHJvbCBjb250cm9sID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZD4gbmV3SW5jbHVkZWRHcm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdD4gbmV3SW5jbHVkZWRHcm91cHNBdWRpdHMgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisgICAgTGlzdDxHcm91cEluZm8+IHJlc3VsdCA9IExpc3RzLm5ld0xpbmtlZExpc3QoKTsKKyAgICBBY2NvdW50LklkIG1lID0gKChJZGVudGlmaWVkVXNlcikgY29udHJvbC5nZXRDdXJyZW50VXNlcigpKS5nZXRBY2NvdW50SWQoKTsKKworICAgIGZvciAoU3RyaW5nIGluY2x1ZGVkR3JvdXAgOiBpbnB1dC5ncm91cHMpIHsKKyAgICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZCA9IGdyb3Vwc0NvbGxlY3Rpb24uZ2V0KCkucGFyc2UoaW5jbHVkZWRHcm91cCk7CisgICAgICBpZiAoIWNvbnRyb2wuY2FuQWRkR3JvdXAoZC5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGFkZCBncm91cDogJXMiLAorICAgICAgICAgICAgZC5nZXROYW1lKCkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFuZXdJbmNsdWRlZEdyb3Vwcy5jb250YWluc0tleShkLmdldEdyb3VwVVVJRCgpKSkgeworICAgICAgICBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkLktleSBhZ2lLZXkgPQorICAgICAgICAgICAgbmV3IEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuS2V5KGdyb3VwLmdldElkKCksCisgICAgICAgICAgICAgICAgZC5nZXRHcm91cFVVSUQoKSk7CisgICAgICAgIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgYWdpID0gZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5nZXQoYWdpS2V5KTsKKyAgICAgICAgaWYgKGFnaSA9PSBudWxsKSB7CisgICAgICAgICAgYWdpID0gbmV3IEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQoYWdpS2V5KTsKKyAgICAgICAgICBuZXdJbmNsdWRlZEdyb3Vwcy5wdXQoZC5nZXRHcm91cFVVSUQoKSwgYWdpKTsKKyAgICAgICAgICBuZXdJbmNsdWRlZEdyb3Vwc0F1ZGl0cy5hZGQobmV3IEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdChhZ2ksIG1lKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hZGQoanNvbi5mb3JtYXQoZCkpOworICAgIH0KKworICAgIGlmICghbmV3SW5jbHVkZWRHcm91cHMuaXNFbXB0eSgpKSB7CisgICAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZEF1ZGl0KCkuaW5zZXJ0KG5ld0luY2x1ZGVkR3JvdXBzQXVkaXRzKTsKKyAgICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkuaW5zZXJ0KG5ld0luY2x1ZGVkR3JvdXBzLnZhbHVlcygpKTsKKyAgICAgIGZvciAoQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBhZ2kgOiBuZXdJbmNsdWRlZEdyb3Vwcy52YWx1ZXMoKSkgeworICAgICAgICBncm91cEluY2x1ZGVDYWNoZS5ldmljdE1lbWJlckluKGFnaS5nZXRJbmNsdWRlVVVJRCgpKTsKKyAgICAgIH0KKyAgICAgIGdyb3VwSW5jbHVkZUNhY2hlLmV2aWN0TWVtYmVyc09mKGdyb3VwLmdldEdyb3VwVVVJRCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgc3RhdGljIGNsYXNzIFB1dEluY2x1ZGVkR3JvdXAgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBQdXRJbmNsdWRlZEdyb3VwLklucHV0PiB7CisgICAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFkZEluY2x1ZGVkR3JvdXBzPiBwdXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisKKyAgICBQdXRJbmNsdWRlZEdyb3VwKFByb3ZpZGVyPEFkZEluY2x1ZGVkR3JvdXBzPiBwdXQsIFN0cmluZyBpZCkgeworICAgICAgdGhpcy5wdXQgPSBwdXQ7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdyb3VwSW5mbyBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgICBBZGRJbmNsdWRlZEdyb3Vwcy5JbnB1dCBpbiA9IG5ldyBBZGRJbmNsdWRlZEdyb3Vwcy5JbnB1dCgpOworICAgICAgaW4uZ3JvdXBzID0gSW1tdXRhYmxlTGlzdC5vZihpZCk7CisgICAgICBMaXN0PEdyb3VwSW5mbz4gbGlzdCA9IHB1dC5nZXQoKS5hcHBseShyZXNvdXJjZSwgaW4pOworICAgICAgaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIGxpc3QuZ2V0KDApOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBVcGRhdGVJbmNsdWRlZEdyb3VwIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlLCBQdXRJbmNsdWRlZEdyb3VwLklucHV0PiB7CisgICAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdldEluY2x1ZGVkR3JvdXA+IGdldDsKKworICAgIEBJbmplY3QKKyAgICBVcGRhdGVJbmNsdWRlZEdyb3VwKFByb3ZpZGVyPEdldEluY2x1ZGVkR3JvdXA+IGdldCkgeworICAgICAgdGhpcy5nZXQgPSBnZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcHBseShJbmNsdWRlZEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UsCisgICAgICAgIFB1dEluY2x1ZGVkR3JvdXAuSW5wdXQgaW5wdXQpIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgICAgLy8gRG8gbm90aGluZywgdGhlIGdyb3VwIGlzIGFscmVhZHkgaW5jbHVkZWQuCisgICAgICByZXR1cm4gZ2V0LmdldCgpLmFwcGx5KHJlc291cmNlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQWRkTWVtYmVycy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9BZGRNZW1iZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzMmE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQWRkTWVtYmVycy5qYXZhCkBAIC0wLDAgKzEsMjIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkF1dGhUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudE1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRzQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BdXRoUmVxdWVzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BdXRoQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5BZGRNZW1iZXJzLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworY2xhc3MgQWRkTWVtYmVycyBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBfb25lTWVtYmVyOworCisgICAgTGlzdDxTdHJpbmc+IG1lbWJlcnM7CisKKyAgICBzdGF0aWMgSW5wdXQgaW5pdChJbnB1dCBpbikgeworICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgaW4gPSBuZXcgSW5wdXQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbi5tZW1iZXJzID09IG51bGwpIHsKKyAgICAgICAgaW4ubWVtYmVycyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eSgxKTsKKyAgICAgIH0KKyAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGluLl9vbmVNZW1iZXIpKSB7CisgICAgICAgIGluLm1lbWJlcnMuYWRkKGluLl9vbmVNZW1iZXIpOworICAgICAgfQorICAgICAgcmV0dXJuIGluOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgYWNjb3VudE1hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgQXV0aFR5cGUgYXV0aFR5cGU7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8QWNjb3VudHNDb2xsZWN0aW9uPiBhY2NvdW50czsKKyAgcHJpdmF0ZSBmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyOworICBwcml2YXRlIGZpbmFsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGU7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisKKyAgQEluamVjdAorICBBZGRNZW1iZXJzKEFjY291bnRNYW5hZ2VyIGFjY291bnRNYW5hZ2VyLAorICAgICAgQXV0aENvbmZpZyBhdXRoQ29uZmlnLAorICAgICAgUHJvdmlkZXI8QWNjb3VudHNDb2xsZWN0aW9uPiBhY2NvdW50cywKKyAgICAgIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXIsCisgICAgICBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlLAorICAgICAgUmV2aWV3RGIgZGIpIHsKKyAgICB0aGlzLmFjY291bnRNYW5hZ2VyID0gYWNjb3VudE1hbmFnZXI7CisgICAgdGhpcy5hdXRoVHlwZSA9IGF1dGhDb25maWcuZ2V0QXV0aFR5cGUoKTsKKyAgICB0aGlzLmFjY291bnRzID0gYWNjb3VudHM7CisgICAgdGhpcy5hY2NvdW50UmVzb2x2ZXIgPSBhY2NvdW50UmVzb2x2ZXI7CisgICAgdGhpcy5hY2NvdW50Q2FjaGUgPSBhY2NvdW50Q2FjaGU7CisgICAgdGhpcy5kYiA9IGRiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBMaXN0PEFjY291bnRJbmZvPiBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLAorICAgICAgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgaW50ZXJuYWxHcm91cCA9IHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCk7CisgICAgaWYgKGludGVybmFsR3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgaW5wdXQgPSBJbnB1dC5pbml0KGlucHV0KTsKKworICAgIEdyb3VwQ29udHJvbCBjb250cm9sID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIE1hcDxBY2NvdW50LklkLCBBY2NvdW50R3JvdXBNZW1iZXI+IG5ld0FjY291bnRHcm91cE1lbWJlcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBMaXN0PEFjY291bnRHcm91cE1lbWJlckF1ZGl0PiBuZXdBY2NvdW50R3JvdXBNZW1iZXJBdWRpdHMgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisgICAgTGlzdDxBY2NvdW50SW5mbz4gcmVzdWx0ID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworICAgIEFjY291bnQuSWQgbWUgPSAoKElkZW50aWZpZWRVc2VyKSBjb250cm9sLmdldEN1cnJlbnRVc2VyKCkpLmdldEFjY291bnRJZCgpOworCisgICAgZm9yIChTdHJpbmcgbmFtZU9yRW1haWwgOiBpbnB1dC5tZW1iZXJzKSB7CisgICAgICBBY2NvdW50IGEgPSBmaW5kQWNjb3VudChuYW1lT3JFbWFpbCk7CisgICAgICBpZiAoIWEuaXNBY3RpdmUoKSkgeworICAgICAgICB0aHJvdyBuZXcgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIkFjY291bnQgSW5hY3RpdmU6ICVzIiwgbmFtZU9yRW1haWwpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFjb250cm9sLmNhbkFkZE1lbWJlcihhLmdldElkKCkpKSB7CisgICAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJDYW5ub3QgYWRkIG1lbWJlcjogIiArIGEuZ2V0RnVsbE5hbWUoKSk7CisgICAgICB9CisKKyAgICAgIGlmICghbmV3QWNjb3VudEdyb3VwTWVtYmVycy5jb250YWluc0tleShhLmdldElkKCkpKSB7CisgICAgICAgIEFjY291bnRHcm91cE1lbWJlci5LZXkga2V5ID0KKyAgICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXBNZW1iZXIuS2V5KGEuZ2V0SWQoKSwgaW50ZXJuYWxHcm91cC5nZXRJZCgpKTsKKyAgICAgICAgQWNjb3VudEdyb3VwTWVtYmVyIG0gPSBkYi5hY2NvdW50R3JvdXBNZW1iZXJzKCkuZ2V0KGtleSk7CisgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICBtID0gbmV3IEFjY291bnRHcm91cE1lbWJlcihrZXkpOworICAgICAgICAgIG5ld0FjY291bnRHcm91cE1lbWJlcnMucHV0KG0uZ2V0QWNjb3VudElkKCksIG0pOworICAgICAgICAgIG5ld0FjY291bnRHcm91cE1lbWJlckF1ZGl0cy5hZGQobmV3IEFjY291bnRHcm91cE1lbWJlckF1ZGl0KG0sIG1lKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hZGQoQWNjb3VudEluZm8ucGFyc2UoYSwgdHJ1ZSkpOworICAgIH0KKworICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpLmluc2VydChuZXdBY2NvdW50R3JvdXBNZW1iZXJBdWRpdHMpOworICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnMoKS5pbnNlcnQobmV3QWNjb3VudEdyb3VwTWVtYmVycy52YWx1ZXMoKSk7CisgICAgZm9yIChBY2NvdW50R3JvdXBNZW1iZXIgbSA6IG5ld0FjY291bnRHcm91cE1lbWJlcnMudmFsdWVzKCkpIHsKKyAgICAgIGFjY291bnRDYWNoZS5ldmljdChtLmdldEFjY291bnRJZCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBBY2NvdW50IGZpbmRBY2NvdW50KFN0cmluZyBuYW1lT3JFbWFpbCkgdGhyb3dzIEF1dGhFeGNlcHRpb24sCisgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gYWNjb3VudHMuZ2V0KCkucGFyc2UobmFtZU9yRW1haWwpLmdldEFjY291bnQoKTsKKyAgICB9IGNhdGNoIChVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIG1pZ2h0IGJlIGJlY2F1c2UgdGhlIGFjY291bnQgZG9lcyBub3QgZXhpc3Qgb3IgYmVjYXVzZSB0aGUgYWNjb3VudCBpcworICAgICAgLy8gbm90IHZpc2libGUKKyAgICAgIHN3aXRjaCAoYXV0aFR5cGUpIHsKKyAgICAgICAgY2FzZSBIVFRQX0xEQVA6CisgICAgICAgIGNhc2UgQ0xJRU5UX1NTTF9DRVJUX0xEQVA6CisgICAgICAgIGNhc2UgTERBUDoKKyAgICAgICAgICBpZiAoYWNjb3VudFJlc29sdmVyLmZpbmQobmFtZU9yRW1haWwpID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGFjY291bnQgZG9lcyBub3QgZXhpc3QsIHRyeSB0byBjcmVhdGUgaXQKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBY2NvdW50QnlMZGFwKG5hbWVPckVtYWlsKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICB9CisgICAgICB0aHJvdyBlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgQWNjb3VudCBjcmVhdGVBY2NvdW50QnlMZGFwKFN0cmluZyB1c2VyKSB7CisgICAgaWYgKCF1c2VyLm1hdGNoZXMoQWNjb3VudC5VU0VSX05BTUVfUEFUVEVSTikpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBBdXRoUmVxdWVzdCByZXEgPSBBdXRoUmVxdWVzdC5mb3JVc2VyKHVzZXIpOworICAgICAgcmVxLnNldFNraXBBdXRoZW50aWNhdGlvbih0cnVlKTsKKyAgICAgIHJldHVybiBhY2NvdW50Q2FjaGUuZ2V0KGFjY291bnRNYW5hZ2VyLmF1dGhlbnRpY2F0ZShyZXEpLmdldEFjY291bnRJZCgpKQorICAgICAgICAgIC5nZXRBY2NvdW50KCk7CisgICAgfSBjYXRjaCAoQWNjb3VudEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgUHV0TWVtYmVyIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8R3JvdXBSZXNvdXJjZSwgUHV0TWVtYmVyLklucHV0PiB7CisgICAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFkZE1lbWJlcnM+IHB1dDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKKworICAgIFB1dE1lbWJlcihQcm92aWRlcjxBZGRNZW1iZXJzPiBwdXQsIFN0cmluZyBpZCkgeworICAgICAgdGhpcy5wdXQgPSBwdXQ7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBQdXRNZW1iZXIuSW5wdXQgaW5wdXQpCisgICAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLAorICAgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgICAgQWRkTWVtYmVycy5JbnB1dCBpbiA9IG5ldyBBZGRNZW1iZXJzLklucHV0KCk7CisgICAgICBpbi5fb25lTWVtYmVyID0gaWQ7CisgICAgICBMaXN0PEFjY291bnRJbmZvPiBsaXN0ID0gcHV0LmdldCgpLmFwcGx5KHJlc291cmNlLCBpbik7CisgICAgICBpZiAobGlzdC5zaXplKCkgPT0gMSkgeworICAgICAgICByZXR1cm4gbGlzdC5nZXQoMCk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIFVwZGF0ZU1lbWJlciBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PE1lbWJlclJlc291cmNlLCBQdXRNZW1iZXIuSW5wdXQ+IHsKKyAgICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8R2V0TWVtYmVyPiBnZXQ7CisKKyAgICBASW5qZWN0CisgICAgVXBkYXRlTWVtYmVyKFByb3ZpZGVyPEdldE1lbWJlcj4gZ2V0KSB7CisgICAgICB0aGlzLmdldCA9IGdldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KE1lbWJlclJlc291cmNlIHJlc291cmNlLCBQdXRNZW1iZXIuSW5wdXQgaW5wdXQpIHsKKyAgICAgIC8vIERvIG5vdGhpbmcsIHRoZSB1c2VyIGlzIGFscmVhZHkgYSBtZW1iZXIuCisgICAgICByZXR1cm4gZ2V0LmdldCgpLmFwcGx5KHJlc291cmNlKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQ3JlYXRlR3JvdXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvQ3JlYXRlR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTE0Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9DcmVhdGVHcm91cC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5OYW1lQWxyZWFkeVVzZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5QZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlBlcmZvcm1DcmVhdGVHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQ3JlYXRlR3JvdXAuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5DUkVBVEVfR1JPVVApCitjbGFzcyBDcmVhdGVHcm91cCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFRvcExldmVsUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgU3RyaW5nIG5hbWU7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgIEJvb2xlYW4gdmlzaWJsZVRvQWxsOworICAgIFN0cmluZyBvd25lcklkOworICB9CisKKyAgc3RhdGljIGludGVyZmFjZSBGYWN0b3J5IHsKKyAgICBDcmVhdGVHcm91cCBjcmVhdGUoQEFzc2lzdGVkIFN0cmluZyBuYW1lKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8SWRlbnRpZmllZFVzZXI+IHNlbGY7CisgIHByaXZhdGUgZmluYWwgR3JvdXBzQ29sbGVjdGlvbiBncm91cHM7CisgIHByaXZhdGUgZmluYWwgUGVyZm9ybUNyZWF0ZUdyb3VwLkZhY3Rvcnkgb3A7CisgIHByaXZhdGUgZmluYWwgR3JvdXBKc29uIGpzb247CisgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmlzaWJsZVRvQWxsOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgIEBJbmplY3QKKyAgQ3JlYXRlR3JvdXAoUHJvdmlkZXI8SWRlbnRpZmllZFVzZXI+IHNlbGYsIEdyb3Vwc0NvbGxlY3Rpb24gZ3JvdXBzLAorICAgICAgUGVyZm9ybUNyZWF0ZUdyb3VwLkZhY3RvcnkgcGVyZm9ybUNyZWF0ZUdyb3VwRmFjdG9yeSwgR3JvdXBKc29uIGpzb24sCisgICAgICBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcsIEBBc3Npc3RlZCBTdHJpbmcgbmFtZSkgeworICAgIHRoaXMuc2VsZiA9IHNlbGY7CisgICAgdGhpcy5ncm91cHMgPSBncm91cHM7CisgICAgdGhpcy5vcCA9IHBlcmZvcm1DcmVhdGVHcm91cEZhY3Rvcnk7CisgICAgdGhpcy5qc29uID0ganNvbjsKKyAgICB0aGlzLmRlZmF1bHRWaXNpYmxlVG9BbGwgPSBjZmcuZ2V0Qm9vbGVhbigiZ3JvdXBzIiwgIm5ld0dyb3Vwc1Zpc2libGVUb0FsbCIsIGZhbHNlKTsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHcm91cEluZm8gYXBwbHkoVG9wTGV2ZWxSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwKKyAgICAgIE5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgaW5wdXQgPSBuZXcgSW5wdXQoKTsKKyAgICB9CisgICAgaWYgKGlucHV0Lm5hbWUgIT0gbnVsbCAmJiAhbmFtZS5lcXVhbHMoaW5wdXQubmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJuYW1lIG11c3QgbWF0Y2ggVVJMIik7CisgICAgfQorCisgICAgQWNjb3VudEdyb3VwLklkIG93bmVySWQgPSBvd25lcihpbnB1dCk7CisgICAgQWNjb3VudEdyb3VwIGdyb3VwOworICAgIHRyeSB7CisgICAgICBncm91cCA9IG9wLmNyZWF0ZSgpLmNyZWF0ZUdyb3VwKAorICAgICAgICAgIG5hbWUsCisgICAgICAgICAgU3RyaW5ncy5lbXB0eVRvTnVsbChpbnB1dC5kZXNjcmlwdGlvbiksCisgICAgICAgICAgT2JqZWN0cy5maXJzdE5vbk51bGwoaW5wdXQudmlzaWJsZVRvQWxsLCBkZWZhdWx0VmlzaWJsZVRvQWxsKSwKKyAgICAgICAgICBvd25lcklkLAorICAgICAgICAgIG93bmVySWQgPT0gbnVsbAorICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5zaW5nbGV0b24oc2VsZi5nZXQoKS5nZXRBY2NvdW50SWQoKSkKKyAgICAgICAgICAgIDogQ29sbGVjdGlvbnMuPEFjY291bnQuSWQ+IGVtcHR5U2V0KCksCisgICAgICAgICAgbnVsbCk7CisgICAgfSBjYXRjaCAoUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIHJldHVybiBqc29uLmZvcm1hdChHcm91cERlc2NyaXB0aW9ucy5mb3JBY2NvdW50R3JvdXAoZ3JvdXApKTsKKyAgfQorCisgIHByaXZhdGUgQWNjb3VudEdyb3VwLklkIG93bmVyKElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24geworICAgIGlmIChpbnB1dC5vd25lcklkICE9IG51bGwpIHsKKyAgICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZCA9IGdyb3Vwcy5wYXJzZUludGVybmFsKFVybC5kZWNvZGUoaW5wdXQub3duZXJJZCkpOworICAgICAgcmV0dXJuIEdyb3VwRGVzY3JpcHRpb25zLnRvQWNjb3VudEdyb3VwKGQpLmdldElkKCk7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0RlbGV0ZUluY2x1ZGVkR3JvdXBzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0RlbGV0ZUluY2x1ZGVkR3JvdXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmOTMyNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvRGVsZXRlSW5jbHVkZWRHcm91cHMuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEluY2x1ZGVDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQWRkSW5jbHVkZWRHcm91cHMuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgRGVsZXRlSW5jbHVkZWRHcm91cHMgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBJbnB1dD4geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdyb3Vwc0NvbGxlY3Rpb24+IGdyb3Vwc0NvbGxlY3Rpb247CisgIHByaXZhdGUgZmluYWwgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGU7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHNlbGY7CisKKyAgQEluamVjdAorICBEZWxldGVJbmNsdWRlZEdyb3VwcyhQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uLAorICAgICAgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlQ2FjaGUsIFJldmlld0RiIGRiLAorICAgICAgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHNlbGYpIHsKKyAgICB0aGlzLmdyb3Vwc0NvbGxlY3Rpb24gPSBncm91cHNDb2xsZWN0aW9uOworICAgIHRoaXMuZ3JvdXBJbmNsdWRlQ2FjaGUgPSBncm91cEluY2x1ZGVDYWNoZTsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5zZWxmID0gc2VsZjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBpbnRlcm5hbEdyb3VwID0gcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKTsKKyAgICBpZiAoaW50ZXJuYWxHcm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKyAgICBpbnB1dCA9IElucHV0LmluaXQoaW5wdXQpOworCisgICAgZmluYWwgR3JvdXBDb250cm9sIGNvbnRyb2wgPSByZXNvdXJjZS5nZXRDb250cm9sKCk7CisgICAgZmluYWwgTWFwPEFjY291bnRHcm91cC5VVUlELCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBpbmNsdWRlZEdyb3VwcyA9IGdldEluY2x1ZGVkR3JvdXBzKGludGVybmFsR3JvdXAuZ2V0SWQoKSk7CisgICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiB0b1JlbW92ZSA9IExpc3RzLm5ld0xpbmtlZExpc3QoKTsKKworICAgIGZvciAoZmluYWwgU3RyaW5nIGluY2x1ZGVkR3JvdXAgOiBpbnB1dC5ncm91cHMpIHsKKyAgICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZCA9IGdyb3Vwc0NvbGxlY3Rpb24uZ2V0KCkucGFyc2UoaW5jbHVkZWRHcm91cCk7CisgICAgICBpZiAoIWNvbnRyb2wuY2FuUmVtb3ZlR3JvdXAoZC5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IGRlbGV0ZSBncm91cDogJXMiLAorICAgICAgICAgICAgZC5nZXROYW1lKCkpKTsKKyAgICAgIH0KKworICAgICAgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBnID0gaW5jbHVkZWRHcm91cHMucmVtb3ZlKGQuZ2V0R3JvdXBVVUlEKCkpOworICAgICAgaWYgKGcgIT0gbnVsbCkgeworICAgICAgICB0b1JlbW92ZS5hZGQoZyk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCF0b1JlbW92ZS5pc0VtcHR5KCkpIHsKKyAgICAgIHdyaXRlQXVkaXRzKHRvUmVtb3ZlKTsKKyAgICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkuZGVsZXRlKHRvUmVtb3ZlKTsKKyAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBnIDogdG9SZW1vdmUpIHsKKyAgICAgICAgZ3JvdXBJbmNsdWRlQ2FjaGUuZXZpY3RNZW1iZXJJbihnLmdldEluY2x1ZGVVVUlEKCkpOworICAgICAgfQorICAgICAgZ3JvdXBJbmNsdWRlQ2FjaGUuZXZpY3RNZW1iZXJzT2YoaW50ZXJuYWxHcm91cC5nZXRHcm91cFVVSUQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIFJlc3BvbnNlLm5vbmUoKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPEFjY291bnRHcm91cC5VVUlELCBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiBnZXRJbmNsdWRlZEdyb3VwcygKKyAgICAgIGZpbmFsIEFjY291bnRHcm91cC5JZCBncm91cElkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBNYXA8QWNjb3VudEdyb3VwLlVVSUQsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IGdyb3VwcyA9CisgICAgICAgIE1hcHMubmV3SGFzaE1hcCgpOworICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBnIDogZGIuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKS5ieUdyb3VwKGdyb3VwSWQpKSB7CisgICAgICBncm91cHMucHV0KGcuZ2V0SW5jbHVkZVVVSUQoKSwgZyk7CisgICAgfQorICAgIHJldHVybiBncm91cHM7CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVBdWRpdHMoZmluYWwgTGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPiB0b0JlUmVtb3ZlZCkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGZpbmFsIEFjY291bnQuSWQgbWUgPSAoKElkZW50aWZpZWRVc2VyKSBzZWxmLmdldCgpKS5nZXRBY2NvdW50SWQoKTsKKyAgICBmaW5hbCBMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdD4gYXVkaXRVcGRhdGVzID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCBnIDogdG9CZVJlbW92ZWQpIHsKKyAgICAgIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdCBhdWRpdCA9IG51bGw7CisgICAgICBmb3IgKEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdCBhIDogZGIKKyAgICAgICAgICAuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWRBdWRpdCgpLmJ5R3JvdXBJbmNsdWRlKGcuZ2V0R3JvdXBJZCgpLAorICAgICAgICAgICAgICBnLmdldEluY2x1ZGVVVUlEKCkpKSB7CisgICAgICAgIGlmIChhLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICBhdWRpdCA9IGE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGF1ZGl0ICE9IG51bGwpIHsKKyAgICAgICAgYXVkaXQucmVtb3ZlZChtZSk7CisgICAgICAgIGF1ZGl0VXBkYXRlcy5hZGQoYXVkaXQpOworICAgICAgfQorICAgIH0KKyAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZEF1ZGl0KCkudXBkYXRlKGF1ZGl0VXBkYXRlcyk7CisgIH0KKworICBzdGF0aWMgY2xhc3MgRGVsZXRlSW5jbHVkZWRHcm91cCBpbXBsZW1lbnRzCisgICAgICBSZXN0TW9kaWZ5VmlldzxJbmNsdWRlZEdyb3VwUmVzb3VyY2UsIERlbGV0ZUluY2x1ZGVkR3JvdXAuSW5wdXQ+IHsKKyAgICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8RGVsZXRlSW5jbHVkZWRHcm91cHM+IGRlbGV0ZTsKKworICAgIEBJbmplY3QKKyAgICBEZWxldGVJbmNsdWRlZEdyb3VwKGZpbmFsIFByb3ZpZGVyPERlbGV0ZUluY2x1ZGVkR3JvdXBzPiBkZWxldGUpIHsKKyAgICAgIHRoaXMuZGVsZXRlID0gZGVsZXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoSW5jbHVkZWRHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgICBBZGRJbmNsdWRlZEdyb3Vwcy5JbnB1dCBpbiA9IG5ldyBBZGRJbmNsdWRlZEdyb3Vwcy5JbnB1dCgpOworICAgICAgaW4uZ3JvdXBzID0gSW1tdXRhYmxlTGlzdC5vZihyZXNvdXJjZS5nZXRNZW1iZXIoKS5nZXQoKSk7CisgICAgICByZXR1cm4gZGVsZXRlLmdldCgpLmFwcGx5KHJlc291cmNlLCBpbik7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0RlbGV0ZU1lbWJlcnMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvRGVsZXRlTWVtYmVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Mjc2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0RlbGV0ZU1lbWJlcnMuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cE1lbWJlckF1ZGl0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5BZGRNZW1iZXJzLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIERlbGV0ZU1lbWJlcnMgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxHcm91cFJlc291cmNlLCBJbnB1dD4geworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHM7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZjsKKworICBASW5qZWN0CisgIERlbGV0ZU1lbWJlcnMoUHJvdmlkZXI8QWNjb3VudHNDb2xsZWN0aW9uPiBhY2NvdW50cywKKyAgICAgIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsIFJldmlld0RiIGRiLCBQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZikgeworICAgIHRoaXMuYWNjb3VudHMgPSBhY2NvdW50czsKKyAgICB0aGlzLmFjY291bnRDYWNoZSA9IGFjY291bnRDYWNoZTsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5zZWxmID0gc2VsZjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sCisgICAgICBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBpbnRlcm5hbEdyb3VwID0gcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKTsKKyAgICBpZiAoaW50ZXJuYWxHcm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKyAgICBpbnB1dCA9IElucHV0LmluaXQoaW5wdXQpOworCisgICAgZmluYWwgR3JvdXBDb250cm9sIGNvbnRyb2wgPSByZXNvdXJjZS5nZXRDb250cm9sKCk7CisgICAgZmluYWwgTWFwPEFjY291bnQuSWQsIEFjY291bnRHcm91cE1lbWJlcj4gbWVtYmVycyA9IGdldE1lbWJlcnMoaW50ZXJuYWxHcm91cC5nZXRJZCgpKTsKKyAgICBmaW5hbCBMaXN0PEFjY291bnRHcm91cE1lbWJlcj4gdG9SZW1vdmUgPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7CisKKyAgICBmb3IgKGZpbmFsIFN0cmluZyBuYW1lT3JFbWFpbCA6IGlucHV0Lm1lbWJlcnMpIHsKKyAgICAgIEFjY291bnQgYSA9IGFjY291bnRzLmdldCgpLnBhcnNlKG5hbWVPckVtYWlsKS5nZXRBY2NvdW50KCk7CisKKyAgICAgIGlmICghY29udHJvbC5jYW5SZW1vdmVNZW1iZXIoYS5nZXRJZCgpKSkgeworICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiQ2Fubm90IGRlbGV0ZSBtZW1iZXI6ICIgKyBhLmdldEZ1bGxOYW1lKCkpOworICAgICAgfQorCisgICAgICBmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgbSA9IG1lbWJlcnMucmVtb3ZlKGEuZ2V0SWQoKSk7CisgICAgICBpZiAobSAhPSBudWxsKSB7CisgICAgICAgIHRvUmVtb3ZlLmFkZChtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB3cml0ZUF1ZGl0cyh0b1JlbW92ZSk7CisgICAgZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmRlbGV0ZSh0b1JlbW92ZSk7CisgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXBNZW1iZXIgbSA6IHRvUmVtb3ZlKSB7CisgICAgICBhY2NvdW50Q2FjaGUuZXZpY3QobS5nZXRBY2NvdW50SWQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIFJlc3BvbnNlLm5vbmUoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZUF1ZGl0cyhmaW5hbCBMaXN0PEFjY291bnRHcm91cE1lbWJlcj4gdG9CZVJlbW92ZWQpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBBY2NvdW50LklkIG1lID0gKChJZGVudGlmaWVkVXNlcikgc2VsZi5nZXQoKSkuZ2V0QWNjb3VudElkKCk7CisgICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXBNZW1iZXJBdWRpdD4gYXVkaXRVcGRhdGVzID0gTGlzdHMubmV3TGlua2VkTGlzdCgpOworICAgIGZpbmFsIExpc3Q8QWNjb3VudEdyb3VwTWVtYmVyQXVkaXQ+IGF1ZGl0SW5zZXJ0cyA9IExpc3RzLm5ld0xpbmtlZExpc3QoKTsKKyAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cE1lbWJlciBtIDogdG9CZVJlbW92ZWQpIHsKKyAgICAgIEFjY291bnRHcm91cE1lbWJlckF1ZGl0IGF1ZGl0ID0gbnVsbDsKKyAgICAgIGZvciAoQWNjb3VudEdyb3VwTWVtYmVyQXVkaXQgYSA6IGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpCisgICAgICAgICAgLmJ5R3JvdXBBY2NvdW50KG0uZ2V0QWNjb3VudEdyb3VwSWQoKSwgbS5nZXRBY2NvdW50SWQoKSkpIHsKKyAgICAgICAgaWYgKGEuaXNBY3RpdmUoKSkgeworICAgICAgICAgIGF1ZGl0ID0gYTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYXVkaXQgIT0gbnVsbCkgeworICAgICAgICBhdWRpdC5yZW1vdmVkKG1lKTsKKyAgICAgICAgYXVkaXRVcGRhdGVzLmFkZChhdWRpdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhdWRpdCA9IG5ldyBBY2NvdW50R3JvdXBNZW1iZXJBdWRpdChtLCBtZSk7CisgICAgICAgIGF1ZGl0LnJlbW92ZWRMZWdhY3koKTsKKyAgICAgICAgYXVkaXRJbnNlcnRzLmFkZChhdWRpdCk7CisgICAgICB9CisgICAgfQorICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpLnVwZGF0ZShhdWRpdFVwZGF0ZXMpOworICAgIGRiLmFjY291bnRHcm91cE1lbWJlcnNBdWRpdCgpLmluc2VydChhdWRpdEluc2VydHMpOworICB9CisKKyAgcHJpdmF0ZSBNYXA8QWNjb3VudC5JZCwgQWNjb3VudEdyb3VwTWVtYmVyPiBnZXRNZW1iZXJzKAorICAgICAgZmluYWwgQWNjb3VudEdyb3VwLklkIGdyb3VwSWQpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGZpbmFsIE1hcDxBY2NvdW50LklkLCBBY2NvdW50R3JvdXBNZW1iZXI+IG1lbWJlcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cE1lbWJlciBtIDogZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmJ5R3JvdXAoZ3JvdXBJZCkpIHsKKyAgICAgIG1lbWJlcnMucHV0KG0uZ2V0QWNjb3VudElkKCksIG0pOworICAgIH0KKyAgICByZXR1cm4gbWVtYmVyczsKKyAgfQorCisgIHN0YXRpYyBjbGFzcyBEZWxldGVNZW1iZXIgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxNZW1iZXJSZXNvdXJjZSwgRGVsZXRlTWVtYmVyLklucHV0PiB7CisgICAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPERlbGV0ZU1lbWJlcnM+IGRlbGV0ZTsKKworICAgIEBJbmplY3QKKyAgICBEZWxldGVNZW1iZXIoZmluYWwgUHJvdmlkZXI8RGVsZXRlTWVtYmVycz4gZGVsZXRlKSB7CisgICAgICB0aGlzLmRlbGV0ZSA9IGRlbGV0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KE1lbWJlclJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sCisgICAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgTm9TdWNoR3JvdXBFeGNlcHRpb24geworICAgICAgQWRkTWVtYmVycy5JbnB1dCBpbiA9IG5ldyBBZGRNZW1iZXJzLklucHV0KCk7CisgICAgICBpbi5fb25lTWVtYmVyID0gcmVzb3VyY2UuZ2V0TWVtYmVyKCkuZ2V0QWNjb3VudElkKCkudG9TdHJpbmcoKTsKKyAgICAgIHJldHVybiBkZWxldGUuZ2V0KCkuYXBwbHkocmVzb3VyY2UsIGluKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0RGVzY3JpcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0RGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc0YTIxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXREZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworCitjbGFzcyBHZXREZXNjcmlwdGlvbiBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxHcm91cFJlc291cmNlPiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgZ3JvdXAgPSByZXNvdXJjZS50b0FjY291bnRHcm91cCgpOworICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5ncy5udWxsVG9FbXB0eShncm91cC5nZXREZXNjcmlwdGlvbigpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXREZXRhaWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0RGV0YWlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMmUxNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0RGV0YWlsLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5ncm91cHMuTGlzdEdyb3Vwc09wdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cEpzb24uR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitwdWJsaWMgY2xhc3MgR2V0RGV0YWlsIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEdyb3VwUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldERldGFpbChHcm91cEpzb24ganNvbikgeworICAgIHRoaXMuanNvbiA9IGpzb24uYWRkT3B0aW9uKExpc3RHcm91cHNPcHRpb24uTUVNQkVSUykKKyAgICAgICAgLmFkZE9wdGlvbihMaXN0R3JvdXBzT3B0aW9uLklOQ0xVREVTKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR3JvdXBJbmZvIGFwcGx5KEdyb3VwUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJzcmMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldEdyb3VwLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldEdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkxODBkZAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0R3JvdXAuamF2YQpAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworY2xhc3MgR2V0R3JvdXAgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8R3JvdXBSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIEdyb3VwSnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgR2V0R3JvdXAoR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHcm91cEluZm8gYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJlc291cmNlLmdldEdyb3VwKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldEluY2x1ZGVkR3JvdXAuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0SW5jbHVkZWRHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZjIwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldEluY2x1ZGVkR3JvdXAuamF2YQpAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworcHVibGljIGNsYXNzIEdldEluY2x1ZGVkR3JvdXAgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlPiAgeworICBwcml2YXRlIGZpbmFsIEdyb3VwSnNvbiBqc29uOworCisgIEBJbmplY3QKKyAgR2V0SW5jbHVkZWRHcm91cChHcm91cEpzb24ganNvbikgeworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEdyb3VwSW5mbyBhcHBseShJbmNsdWRlZEdyb3VwUmVzb3VyY2UgcnNyYykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGpzb24uZm9ybWF0KHJzcmMuZ2V0TWVtYmVyRGVzY3JpcHRpb24oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR2V0TWVtYmVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldE1lbWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTEwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldE1lbWJlci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRJbmZvOworCitwdWJsaWMgY2xhc3MgR2V0TWVtYmVyIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PE1lbWJlclJlc291cmNlPiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgQWNjb3VudEluZm8gYXBwbHkoTWVtYmVyUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICByZXR1cm4gQWNjb3VudEluZm8ucGFyc2UocmVzb3VyY2UuZ2V0TWVtYmVyKCkuZ2V0QWNjb3VudCgpLCB0cnVlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXROYW1lLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldE5hbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRhN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXROYW1lLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CisKK3B1YmxpYyBjbGFzcyBHZXROYW1lIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEdyb3VwUmVzb3VyY2U+IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlKSB7CisgICAgcmV0dXJuIHJlc291cmNlLmdldE5hbWUoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRPcHRpb25zLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dldE9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmJmYzcwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRPcHRpb25zLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CisKK3B1YmxpYyBjbGFzcyBHZXRPcHRpb25zIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PEdyb3VwUmVzb3VyY2U+IHsKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEdyb3VwT3B0aW9uc0luZm8gYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIHJldHVybiBuZXcgR3JvdXBPcHRpb25zSW5mbyhyZXNvdXJjZS5nZXRHcm91cCgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRPd25lci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRPd25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTNhMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9HZXRPd25lci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkdyb3VwSnNvbi5Hcm91cEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK3B1YmxpYyBjbGFzcyBHZXRPd25lciBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxHcm91cFJlc291cmNlPiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENvbnRyb2wuRmFjdG9yeSBjb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEpzb24ganNvbjsKKworICBASW5qZWN0CisgIEdldE93bmVyKEdyb3VwQ29udHJvbC5GYWN0b3J5IGNvbnRyb2xGYWN0b3J5LCBHcm91cEpzb24ganNvbikgeworICAgIHRoaXMuY29udHJvbEZhY3RvcnkgPSBjb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHcm91cEluZm8gYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIEFjY291bnRHcm91cCBncm91cCA9IHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCk7CisgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBHcm91cENvbnRyb2wgYyA9IGNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkpOworICAgICAgcmV0dXJuIGpzb24uZm9ybWF0KGMuZ2V0R3JvdXAoKSk7CisgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBKc29uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3VwSnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGU2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0dyb3VwSnNvbi5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5ncm91cHMuTGlzdEdyb3Vwc09wdGlvbi5JTkNMVURFUzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmdyb3Vwcy5MaXN0R3JvdXBzT3B0aW9uLk1FTUJFUlM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZ3JvdXBzLkxpc3RHcm91cHNPcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQmFja2VuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEdyb3VwSnNvbiB7CisgIHByaXZhdGUgZmluYWwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZDsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENvbnRyb2wuRmFjdG9yeSBncm91cENvbnRyb2xGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3RNZW1iZXJzPiBsaXN0TWVtYmVyczsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0SW5jbHVkZWRHcm91cHM+IGxpc3RJbmNsdWRlczsKKyAgcHJpdmF0ZSBFbnVtU2V0PExpc3RHcm91cHNPcHRpb24+IG9wdGlvbnM7CisKKyAgQEluamVjdAorICBHcm91cEpzb24oR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZCwKKyAgICAgIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICBQcm92aWRlcjxMaXN0TWVtYmVycz4gbGlzdE1lbWJlcnMsCisgICAgICBQcm92aWRlcjxMaXN0SW5jbHVkZWRHcm91cHM+IGxpc3RJbmNsdWRlcykgeworICAgIHRoaXMuZ3JvdXBCYWNrZW5kID0gZ3JvdXBCYWNrZW5kOworICAgIHRoaXMuZ3JvdXBDb250cm9sRmFjdG9yeSA9IGdyb3VwQ29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5saXN0TWVtYmVycyA9IGxpc3RNZW1iZXJzOworICAgIHRoaXMubGlzdEluY2x1ZGVzID0gbGlzdEluY2x1ZGVzOworCisgICAgb3B0aW9ucyA9IEVudW1TZXQubm9uZU9mKExpc3RHcm91cHNPcHRpb24uY2xhc3MpOworICB9CisKKyAgcHVibGljIEdyb3VwSnNvbiBhZGRPcHRpb24oTGlzdEdyb3Vwc09wdGlvbiBvKSB7CisgICAgb3B0aW9ucy5hZGQobyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgR3JvdXBKc29uIGFkZE9wdGlvbnMoQ29sbGVjdGlvbjxMaXN0R3JvdXBzT3B0aW9uPiBvKSB7CisgICAgb3B0aW9ucy5hZGRBbGwobyk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgR3JvdXBJbmZvIGZvcm1hdChHcm91cFJlc291cmNlIHJzcmMpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIEdyb3VwSW5mbyBpbmZvID0gaW5pdChyc3JjLmdldEdyb3VwKCkpOworICAgIGluaXRNZW1iZXJzQW5kSW5jbHVkZXMocnNyYywgaW5mbyk7CisgICAgcmV0dXJuIGluZm87CisgIH0KKworICBwdWJsaWMgR3JvdXBJbmZvIGZvcm1hdChHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBHcm91cEluZm8gaW5mbyA9IGluaXQoZ3JvdXApOworICAgIGlmIChvcHRpb25zLmNvbnRhaW5zKE1FTUJFUlMpIHx8IG9wdGlvbnMuY29udGFpbnMoSU5DTFVERVMpKSB7CisgICAgICBHcm91cFJlc291cmNlIHJzcmMgPQorICAgICAgICAgIG5ldyBHcm91cFJlc291cmNlKGdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihncm91cCkpOworICAgICAgaW5pdE1lbWJlcnNBbmRJbmNsdWRlcyhyc3JjLCBpbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIGluZm87CisgIH0KKworICBwcml2YXRlIEdyb3VwSW5mbyBpbml0KEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZ3JvdXApIHsKKyAgICBHcm91cEluZm8gaW5mbyA9IG5ldyBHcm91cEluZm8oKTsKKyAgICBpbmZvLmlkID0gVXJsLmVuY29kZShncm91cC5nZXRHcm91cFVVSUQoKS5nZXQoKSk7CisgICAgaW5mby5uYW1lID0gU3RyaW5ncy5lbXB0eVRvTnVsbChncm91cC5nZXROYW1lKCkpOworICAgIGluZm8udXJsID0gU3RyaW5ncy5lbXB0eVRvTnVsbChncm91cC5nZXRVcmwoKSk7CisgICAgaW5mby5vcHRpb25zID0gbmV3IEdyb3VwT3B0aW9uc0luZm8oZ3JvdXApOworCisgICAgQWNjb3VudEdyb3VwIGcgPSBHcm91cERlc2NyaXB0aW9ucy50b0FjY291bnRHcm91cChncm91cCk7CisgICAgaWYgKGcgIT0gbnVsbCkgeworICAgICAgaW5mby5kZXNjcmlwdGlvbiA9IFN0cmluZ3MuZW1wdHlUb051bGwoZy5nZXREZXNjcmlwdGlvbigpKTsKKyAgICAgIGluZm8uZ3JvdXBJZCA9IGcuZ2V0SWQoKS5nZXQoKTsKKyAgICAgIGlmIChnLmdldE93bmVyR3JvdXBVVUlEKCkgIT0gbnVsbCkgeworICAgICAgICBpbmZvLm93bmVySWQgPSBVcmwuZW5jb2RlKGcuZ2V0T3duZXJHcm91cFVVSUQoKS5nZXQoKSk7CisgICAgICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgbyA9IGdyb3VwQmFja2VuZC5nZXQoZy5nZXRPd25lckdyb3VwVVVJRCgpKTsKKyAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgIGluZm8ub3duZXIgPSBvLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbmZvOworICB9CisKKyAgcHJpdmF0ZSBHcm91cEluZm8gaW5pdE1lbWJlcnNBbmRJbmNsdWRlcyhHcm91cFJlc291cmNlIHJzcmMsIEdyb3VwSW5mbyBpbmZvKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKHJzcmMudG9BY2NvdW50R3JvdXAoKSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGlmIChvcHRpb25zLmNvbnRhaW5zKE1FTUJFUlMpKSB7CisgICAgICAgIGluZm8ubWVtYmVycyA9IGxpc3RNZW1iZXJzLmdldCgpLmFwcGx5KHJzcmMpOworICAgICAgfQorCisgICAgICBpZiAob3B0aW9ucy5jb250YWlucyhJTkNMVURFUykpIHsKKyAgICAgICAgaW5mby5pbmNsdWRlcyA9IGxpc3RJbmNsdWRlcy5nZXQoKS5hcHBseShyc3JjKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBpbmZvOworICAgIH0gY2F0Y2ggKE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24gZSkgeworICAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgdGhpcyBleGNlcHRpb24gaXMgb25seSB0aHJvd24gaWYgd2Ugd291bGQgdHJ5IHRvCisgICAgICAvLyBsaXN0IG1lbWJlcnMvaW5jbHVkZXMgb2YgYW4gZXh0ZXJuYWwgZ3JvdXAsIGJ1dCBpbiBjYXNlIG9mIGFuIGV4dGVybmFsCisgICAgICAvLyBncm91cCB3ZSByZXR1cm4gYmVmb3JlCisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JvdXBJbmZvIHsKKyAgICBmaW5hbCBTdHJpbmcga2luZCA9ICJnZXJyaXRjb2RlcmV2aWV3I2dyb3VwIjsKKyAgICBwdWJsaWMgU3RyaW5nIGlkOworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgU3RyaW5nIHVybDsKKyAgICBwdWJsaWMgR3JvdXBPcHRpb25zSW5mbyBvcHRpb25zOworCisgICAgLy8gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHN1cHBsaWVkIGZvciBpbnRlcm5hbCBncm91cHMuCisgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICBwdWJsaWMgSW50ZWdlciBncm91cElkOworICAgIHB1YmxpYyBTdHJpbmcgb3duZXI7CisgICAgcHVibGljIFN0cmluZyBvd25lcklkOworCisgICAgLy8gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHN1cHBsaWVkIGZvciBpbnRlcm5hbCBncm91cHMsIGJ1dCBvbmx5IGlmIHJlcXVlc3RlZAorICAgIHB1YmxpYyBMaXN0PEFjY291bnRJbmZvPiBtZW1iZXJzOworICAgIHB1YmxpYyBMaXN0PEdyb3VwSW5mbz4gaW5jbHVkZXM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBPcHRpb25zSW5mby5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Hcm91cE9wdGlvbnNJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlOTJkMQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBPcHRpb25zSW5mby5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CisKK3B1YmxpYyBjbGFzcyBHcm91cE9wdGlvbnNJbmZvIHsKKyAgcHVibGljIEJvb2xlYW4gdmlzaWJsZVRvQWxsOworCisgIHB1YmxpYyBHcm91cE9wdGlvbnNJbmZvKEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZ3JvdXApIHsKKyAgICBBY2NvdW50R3JvdXAgYWcgPSBHcm91cERlc2NyaXB0aW9ucy50b0FjY291bnRHcm91cChncm91cCk7CisgICAgdmlzaWJsZVRvQWxsID0gYWcgIT0gbnVsbCAmJiBhZy5pc1Zpc2libGVUb0FsbCgpID8gdHJ1ZSA6IG51bGw7CisgIH0KKworICBwdWJsaWMgR3JvdXBPcHRpb25zSW5mbyhBY2NvdW50R3JvdXAgZ3JvdXApIHsKKyAgICB2aXNpYmxlVG9BbGwgPSBncm91cC5pc1Zpc2libGVUb0FsbCgpID8gdHJ1ZSA6IG51bGw7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBSZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Hcm91cFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1MTNhNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworCitwdWJsaWMgY2xhc3MgR3JvdXBSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc3RSZXNvdXJjZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUxpdGVyYWw8UmVzdFZpZXc8R3JvdXBSZXNvdXJjZT4+IEdST1VQX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PEdyb3VwUmVzb3VyY2U+PigpIHt9OworCisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sIGNvbnRyb2w7CisKKyAgR3JvdXBSZXNvdXJjZShHcm91cENvbnRyb2wgY29udHJvbCkgeworICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7CisgIH0KKworICBHcm91cFJlc291cmNlKEdyb3VwUmVzb3VyY2UgcnNyYykgeworICAgIHRoaXMuY29udHJvbCA9IHJzcmMuZ2V0Q29udHJvbCgpOworICB9CisKKyAgcHVibGljIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZ2V0R3JvdXAoKSB7CisgICAgcmV0dXJuIGNvbnRyb2wuZ2V0R3JvdXAoKTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gZ2V0R3JvdXAoKS5nZXROYW1lKCk7CisgIH0KKworICBwdWJsaWMgQWNjb3VudEdyb3VwLlVVSUQgZ2V0R3JvdXBVVUlEKCkgeworICAgIHJldHVybiBnZXRHcm91cCgpLmdldEdyb3VwVVVJRCgpOworICB9CisKKyAgcHVibGljIEFjY291bnRHcm91cCB0b0FjY291bnRHcm91cCgpIHsKKyAgICByZXR1cm4gR3JvdXBEZXNjcmlwdGlvbnMudG9BY2NvdW50R3JvdXAoZ2V0R3JvdXAoKSk7CisgIH0KKworICBwdWJsaWMgR3JvdXBDb250cm9sIGdldENvbnRyb2woKSB7CisgICAgcmV0dXJuIGNvbnRyb2w7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBzQ29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Hcm91cHNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE4YTUzMAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvR3JvdXBzQ29sbGVjdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkFjY2VwdHNDcmVhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0Q29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQW5vbnltb3VzVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQmFja2VuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEJhY2tlbmRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBHcm91cHNDb2xsZWN0aW9uIGltcGxlbWVudHMKKyAgICBSZXN0Q29sbGVjdGlvbjxUb3BMZXZlbFJlc291cmNlLCBHcm91cFJlc291cmNlPiwKKyAgICBBY2NlcHRzQ3JlYXRlPFRvcExldmVsUmVzb3VyY2U+IHsKKyAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljTWFwPFJlc3RWaWV3PEdyb3VwUmVzb3VyY2U+PiB2aWV3czsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0R3JvdXBzPiBsaXN0OworICBwcml2YXRlIGZpbmFsIENyZWF0ZUdyb3VwLkZhY3RvcnkgY3JlYXRlR3JvdXA7CisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBzZWxmOworCisgIEBJbmplY3QKKyAgR3JvdXBzQ29sbGVjdGlvbihmaW5hbCBEeW5hbWljTWFwPFJlc3RWaWV3PEdyb3VwUmVzb3VyY2U+PiB2aWV3cywKKyAgICAgIGZpbmFsIFByb3ZpZGVyPExpc3RHcm91cHM+IGxpc3QsCisgICAgICBmaW5hbCBDcmVhdGVHcm91cC5GYWN0b3J5IGNyZWF0ZUdyb3VwLAorICAgICAgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSwKKyAgICAgIGZpbmFsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQsCisgICAgICBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gc2VsZikgeworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLmxpc3QgPSBsaXN0OworICAgIHRoaXMuY3JlYXRlR3JvdXAgPSBjcmVhdGVHcm91cDsKKyAgICB0aGlzLmdyb3VwQ29udHJvbEZhY3RvcnkgPSBncm91cENvbnRyb2xGYWN0b3J5OworICAgIHRoaXMuZ3JvdXBCYWNrZW5kID0gZ3JvdXBCYWNrZW5kOworICAgIHRoaXMuc2VsZiA9IHNlbGY7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PFRvcExldmVsUmVzb3VyY2U+IGxpc3QoKSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgIEF1dGhFeGNlcHRpb24geworICAgIGZpbmFsIEN1cnJlbnRVc2VyIHVzZXIgPSBzZWxmLmdldCgpOworICAgIGlmICh1c2VyIGluc3RhbmNlb2YgQW5vbnltb3VzVXNlcikgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkIik7CisgICAgfSBlbHNlIGlmKCEodXNlciBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICByZXR1cm4gbGlzdC5nZXQoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgR3JvdXBSZXNvdXJjZSBwYXJzZShUb3BMZXZlbFJlc291cmNlIHBhcmVudCwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgZmluYWwgQ3VycmVudFVzZXIgdXNlciA9IHNlbGYuZ2V0KCk7CisgICAgaWYgKHVzZXIgaW5zdGFuY2VvZiBBbm9ueW1vdXNVc2VyKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiQXV0aGVudGljYXRpb24gcmVxdWlyZWQiKTsKKyAgICB9IGVsc2UgaWYoISh1c2VyIGluc3RhbmNlb2YgSWRlbnRpZmllZFVzZXIpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorCisgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBncm91cCA9IF9wYXJzZShpZC5nZXQoKSk7CisgICAgaWYgKGdyb3VwID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkLmdldCgpKTsKKyAgICB9CisgICAgR3JvdXBDb250cm9sIGN0bCA9IGdyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihncm91cCk7CisgICAgaWYgKCFjdGwuaXNWaXNpYmxlKCkpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBHcm91cFJlc291cmNlKGN0bCk7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIGEgZ3JvdXAgSUQgZnJvbSBhIHJlcXVlc3QgYm9keSBhbmQgcmV0dXJucyB0aGUgZ3JvdXAuCisgICAqCisgICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgZ3JvdXAsIGNhbiBiZSBhIGdyb3VwIFVVSUQsIGEgZ3JvdXAgbmFtZSBvciBhIGxlZ2FjeQorICAgKiAgICAgICAgZ3JvdXAgSUQKKyAgICogQHJldHVybiB0aGUgZ3JvdXAKKyAgICogQHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHRocm93biBpZiB0aGUgZ3JvdXAgSUQgY2Fubm90IGJlCisgICAqICAgICAgICAgcmVzb2x2ZWQgb3IgaWYgdGhlIGdyb3VwIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHVzZXIKKyAgICovCisgIHB1YmxpYyBHcm91cERlc2NyaXB0aW9uLkJhc2ljIHBhcnNlKFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHsKKyAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwID0gX3BhcnNlKGlkKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCB8fCAhZ3JvdXBDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGdyb3VwKS5pc1Zpc2libGUoKSkgeworICAgICAgdGhyb3cgbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiR3JvdXAgTm90IEZvdW5kOiAlcyIsIGlkKSk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKKyAgfQorCisgIC8qKgorICAgKiBQYXJzZXMgYSBncm91cCBJRCBmcm9tIGEgcmVxdWVzdCBib2R5IGFuZCByZXR1cm5zIHRoZSBncm91cCBpZiBpdCBpcyBhCisgICAqIEdlcnJpdCBpbnRlcm5hbCBncm91cC4KKyAgICoKKyAgICogQHBhcmFtIGlkIElEIG9mIHRoZSBncm91cCwgY2FuIGJlIGEgZ3JvdXAgVVVJRCwgYSBncm91cCBuYW1lIG9yIGEgbGVnYWN5CisgICAqICAgICAgICBncm91cCBJRAorICAgKiBAcmV0dXJuIHRoZSBncm91cAorICAgKiBAdGhyb3dzIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24gdGhyb3duIGlmIHRoZSBncm91cCBJRCBjYW5ub3QgYmUKKyAgICogICAgICAgICByZXNvbHZlZCwgaWYgdGhlIGdyb3VwIGlzIG5vdCB2aXNpYmxlIHRvIHRoZSBjYWxsaW5nIHVzZXIgb3IgaWYKKyAgICogICAgICAgICBpdCdzIGFuIGV4dGVybmFsIGdyb3VwCisgICAqLworICBwdWJsaWMgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBwYXJzZUludGVybmFsKFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHsKKyAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwID0gcGFyc2UoaWQpOworICAgIGlmIChHcm91cERlc2NyaXB0aW9ucy50b0FjY291bnRHcm91cChncm91cCkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiRXh0ZXJuYWwgR3JvdXAgTm90IEFsbG93ZWQ6ICVzIiwgaWQpKTsKKyAgICB9CisgICAgcmV0dXJuIGdyb3VwOworICB9CisKKyAgcHJpdmF0ZSBHcm91cERlc2NyaXB0aW9uLkJhc2ljIF9wYXJzZShTdHJpbmcgaWQpIHsKKyAgICBBY2NvdW50R3JvdXAuVVVJRCB1dWlkID0gbmV3IEFjY291bnRHcm91cC5VVUlEKGlkKTsKKyAgICBpZiAoZ3JvdXBCYWNrZW5kLmhhbmRsZXModXVpZCkpIHsKKyAgICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgZCA9IGdyb3VwQmFja2VuZC5nZXQodXVpZCk7CisgICAgICBpZiAoZCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBkOworICAgICAgfQorICAgIH0KKworICAgIC8vIE1pZ2h0IGJlIGEgbGVnYWN5IEFjY291bnRHcm91cC5JZC4KKyAgICBpZiAoaWQubWF0Y2hlcygiXlsxLTldWzAtOV0qJCIpKSB7CisgICAgICB0cnkgeworICAgICAgICBBY2NvdW50R3JvdXAuSWQgbGVnYWN5SWQgPSBBY2NvdW50R3JvdXAuSWQucGFyc2UoaWQpOworICAgICAgICByZXR1cm4gZ3JvdXBDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGxlZ2FjeUlkKS5nZXRHcm91cCgpOworICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGludmFsaWRJZCkgeworICAgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZSkgeworICAgICAgfQorICAgIH0KKworICAgIC8vIE1pZ2h0IGJlIGEgZ3JvdXAgbmFtZSwgYmUgbmljZSBhbmQgYWNjZXB0IHVuaXF1ZSBuYW1lcy4KKyAgICBHcm91cFJlZmVyZW5jZSByZWYgPSBHcm91cEJhY2tlbmRzLmZpbmRFeGFjdFN1Z2dlc3Rpb24oZ3JvdXBCYWNrZW5kLCBpZCk7CisgICAgaWYgKHJlZiAhPSBudWxsKSB7CisgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGQgPSBncm91cEJhY2tlbmQuZ2V0KHJlZi5nZXRVVUlEKCkpOworICAgICAgaWYgKGQgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAT3ZlcnJpZGUKKyAgcHVibGljIENyZWF0ZUdyb3VwIGNyZWF0ZShUb3BMZXZlbFJlc291cmNlIHJvb3QsIElkU3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gY3JlYXRlR3JvdXAuY3JlYXRlKG5hbWUuZ2V0KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PEdyb3VwUmVzb3VyY2U+PiB2aWV3cygpIHsKKyAgICByZXR1cm4gdmlld3M7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvSW5jbHVkZWRHcm91cFJlc291cmNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0luY2x1ZGVkR3JvdXBSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Yjk5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0luY2x1ZGVkR3JvdXBSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworCitwdWJsaWMgY2xhc3MgSW5jbHVkZWRHcm91cFJlc291cmNlIGV4dGVuZHMgR3JvdXBSZXNvdXJjZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUxpdGVyYWw8UmVzdFZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlPj4gSU5DTFVERURfR1JPVVBfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgbWVtYmVyOworCisgIEluY2x1ZGVkR3JvdXBSZXNvdXJjZShHcm91cFJlc291cmNlIGdyb3VwLCBHcm91cERlc2NyaXB0aW9uLkJhc2ljIG1lbWJlcikgeworICAgIHN1cGVyKGdyb3VwKTsKKyAgICB0aGlzLm1lbWJlciA9IG1lbWJlcjsKKyAgfQorCisgIHB1YmxpYyBBY2NvdW50R3JvdXAuVVVJRCBnZXRNZW1iZXIoKSB7CisgICAgcmV0dXJuIGdldE1lbWJlckRlc2NyaXB0aW9uKCkuZ2V0R3JvdXBVVUlEKCk7CisgIH0KKworICBwdWJsaWMgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBnZXRNZW1iZXJEZXNjcmlwdGlvbigpIHsKKyAgICByZXR1cm4gbWVtYmVyOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0luY2x1ZGVkR3JvdXBzQ29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9JbmNsdWRlZEdyb3Vwc0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzUyY2FjCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9JbmNsdWRlZEdyb3Vwc0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDk3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BY2NlcHRzQ3JlYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5DaGlsZENvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQWRkSW5jbHVkZWRHcm91cHMuUHV0SW5jbHVkZWRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIEluY2x1ZGVkR3JvdXBzQ29sbGVjdGlvbiBpbXBsZW1lbnRzCisgICAgQ2hpbGRDb2xsZWN0aW9uPEdyb3VwUmVzb3VyY2UsIEluY2x1ZGVkR3JvdXBSZXNvdXJjZT4sCisgICAgQWNjZXB0c0NyZWF0ZTxHcm91cFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxJbmNsdWRlZEdyb3VwUmVzb3VyY2U+PiB2aWV3czsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0SW5jbHVkZWRHcm91cHM+IGxpc3Q7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBZGRJbmNsdWRlZEdyb3Vwcz4gcHV0OworCisgIEBJbmplY3QKKyAgSW5jbHVkZWRHcm91cHNDb2xsZWN0aW9uKER5bmFtaWNNYXA8UmVzdFZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlPj4gdmlld3MsCisgICAgICBQcm92aWRlcjxMaXN0SW5jbHVkZWRHcm91cHM+IGxpc3QsCisgICAgICBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uLAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiUHJvdmlkZXIsIFByb3ZpZGVyPEFkZEluY2x1ZGVkR3JvdXBzPiBwdXQpIHsKKyAgICB0aGlzLnZpZXdzID0gdmlld3M7CisgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgICB0aGlzLmdyb3Vwc0NvbGxlY3Rpb24gPSBncm91cHNDb2xsZWN0aW9uOworICAgIHRoaXMuZGJQcm92aWRlciA9IGRiUHJvdmlkZXI7CisgICAgdGhpcy5wdXQgPSBwdXQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PEdyb3VwUmVzb3VyY2U+IGxpc3QoKSB7CisgICAgcmV0dXJuIGxpc3QuZ2V0KCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEluY2x1ZGVkR3JvdXBSZXNvdXJjZSBwYXJzZShHcm91cFJlc291cmNlIHJlc291cmNlLCBJZFN0cmluZyBpZCkKKyAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLAorICAgICAgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBBY2NvdW50R3JvdXAgcGFyZW50ID0gcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKTsKKyAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBtZW1iZXIgPQorICAgICAgICBncm91cHNDb2xsZWN0aW9uLmdldCgpLnBhcnNlKFRvcExldmVsUmVzb3VyY2UuSU5TVEFOQ0UsIGlkKS5nZXRHcm91cCgpOworICAgIGlmIChpc01lbWJlcihwYXJlbnQsIG1lbWJlcikKKyAgICAgICAgJiYgcmVzb3VyY2UuZ2V0Q29udHJvbCgpLmNhblNlZUdyb3VwKG1lbWJlci5nZXRHcm91cFVVSUQoKSkpIHsKKyAgICAgIHJldHVybiBuZXcgSW5jbHVkZWRHcm91cFJlc291cmNlKHJlc291cmNlLCBtZW1iZXIpOworICAgIH0KKyAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gaXNNZW1iZXIoQWNjb3VudEdyb3VwIHBhcmVudCwgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBtZW1iZXIpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gZGJQcm92aWRlci5nZXQoKS5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZCgpLmdldCgKKyAgICAgICAgbmV3IEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQuS2V5KAorICAgICAgICAgICAgcGFyZW50LmdldElkKCksCisgICAgICAgICAgICBtZW1iZXIuZ2V0R3JvdXBVVUlEKCkpKSAhPSBudWxsOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIEBPdmVycmlkZQorICBwdWJsaWMgUHV0SW5jbHVkZWRHcm91cCBjcmVhdGUoR3JvdXBSZXNvdXJjZSBncm91cCwgSWRTdHJpbmcgaWQpIHsKKyAgICByZXR1cm4gbmV3IFB1dEluY2x1ZGVkR3JvdXAocHV0LCBpZC5nZXQoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8SW5jbHVkZWRHcm91cFJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RHcm91cHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTGlzdEdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWMwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RHcm91cHMuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwUmVmZXJlbmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoR3JvdXBFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmdyb3Vwcy5MaXN0R3JvdXBzT3B0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5HZXRHcm91cHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENvbXBhcmF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cEpzb24uR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqIExpc3QgZ3JvdXBzIHZpc2libGUgdG8gdGhlIGNhbGxpbmcgdXNlci4gKi8KK3B1YmxpYyBjbGFzcyBMaXN0R3JvdXBzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFRvcExldmVsUmVzb3VyY2U+IHsKKworICBwcm90ZWN0ZWQgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlOworCisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgZ2VuZXJpY0dyb3VwQ29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8SWRlbnRpZmllZFVzZXI+IGlkZW50aWZpZWRVc2VyOworICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdldEdyb3Vwcz4gYWNjb3VudEdldEdyb3VwczsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEpzb24ganNvbjsKKyAgcHJpdmF0ZSBFbnVtU2V0PExpc3RHcm91cHNPcHRpb24+IG9wdGlvbnM7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tcHJvamVjdCIsIGFsaWFzZXMgPSB7Ii1wIn0sCisgICAgICB1c2FnZSA9ICJwcm9qZWN0cyBmb3Igd2hpY2ggdGhlIGdyb3VwcyBzaG91bGQgYmUgbGlzdGVkIikKKyAgcHJpdmF0ZSBmaW5hbCBMaXN0PFByb2plY3RDb250cm9sPiBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8UHJvamVjdENvbnRyb2w+KCk7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tdmlzaWJsZS10by1hbGwiLCB1c2FnZSA9ICJ0byBsaXN0IG9ubHkgZ3JvdXBzIHRoYXQgYXJlIHZpc2libGUgdG8gYWxsIHJlZ2lzdGVyZWQgdXNlcnMiKQorICBwcml2YXRlIGJvb2xlYW4gdmlzaWJsZVRvQWxsOworCisgIEBPcHRpb24obmFtZSA9ICItLXR5cGUiLCB1c2FnZSA9ICJ0eXBlIG9mIGdyb3VwIikKKyAgcHJpdmF0ZSBBY2NvdW50R3JvdXAuVHlwZSBncm91cFR5cGU7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tdXNlciIsIGFsaWFzZXMgPSB7Ii11In0sCisgICAgICB1c2FnZSA9ICJ1c2VyIGZvciB3aGljaCB0aGUgZ3JvdXBzIHNob3VsZCBiZSBsaXN0ZWQiKQorICBwcml2YXRlIEFjY291bnQuSWQgdXNlcjsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1vd25lZCIsIHVzYWdlID0gInRvIGxpc3Qgb25seSBncm91cHMgdGhhdCBhcmUgb3duZWQgYnkgdGhlIHNwZWNpZmllZCB1c2VyIgorICAgICAgKyAiIG9yIGJ5IHRoZSBjYWxsaW5nIHVzZXIgaWYgbm8gdXNlciB3YXMgc3BlY2lmZWQiKQorICBwcml2YXRlIGJvb2xlYW4gb3duZWQ7CisKKyAgcHJpdmF0ZSBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3Vwc1RvSW5zcGVjdCA9IFNldHMubmV3SGFzaFNldCgpOworCisgIEBPcHRpb24obmFtZSA9ICItcSIsIHVzYWdlID0gImdyb3VwIHRvIGluc3BlY3QiKQorICB2b2lkIGFkZEdyb3VwKGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGlkKSB7CisgICAgZ3JvdXBzVG9JbnNwZWN0LmFkZChpZCk7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLW0iLCBtZXRhVmFyID0gIk1BVENIIiwgdXNhZ2UgPSAibWF0Y2ggZ3JvdXAgc3Vic3RyaW5nIikKKyAgcHJpdmF0ZSBTdHJpbmcgbWF0Y2hTdWJzdHJpbmc7CisKKyAgQE9wdGlvbihuYW1lID0gIi1vIiwgbXVsdGlWYWx1ZWQgPSB0cnVlLCB1c2FnZSA9ICJPdXRwdXQgb3B0aW9ucyBwZXIgZ3JvdXAiKQorICBwdWJsaWMgdm9pZCBhZGRPcHRpb24oTGlzdEdyb3Vwc09wdGlvbiBvKSB7CisgICAgb3B0aW9ucy5hZGQobyk7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLU8iLCB1c2FnZSA9ICJPdXRwdXQgb3B0aW9uIGZsYWdzLCBpbiBoZXgiKQorICB2b2lkIHNldE9wdGlvbkZsYWdzSGV4KFN0cmluZyBoZXgpIHsKKyAgICBvcHRpb25zLmFkZEFsbChMaXN0R3JvdXBzT3B0aW9uLmZyb21CaXRzKEludGVnZXIucGFyc2VJbnQoaGV4LCAxNikpKTsKKyAgfQorCisgIEBJbmplY3QKKyAgcHJvdGVjdGVkIExpc3RHcm91cHMoZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlLAorICAgICAgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSwKKyAgICAgIGZpbmFsIEdyb3VwQ29udHJvbC5HZW5lcmljRmFjdG9yeSBnZW5lcmljR3JvdXBDb250cm9sRmFjdG9yeSwKKyAgICAgIGZpbmFsIFByb3ZpZGVyPElkZW50aWZpZWRVc2VyPiBpZGVudGlmaWVkVXNlciwKKyAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5LAorICAgICAgZmluYWwgUHJvdmlkZXI8R2V0R3JvdXBzPiBhY2NvdW50R2V0R3JvdXBzLCBHcm91cEpzb24ganNvbikgeworICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7CisgICAgdGhpcy5ncm91cENvbnRyb2xGYWN0b3J5ID0gZ3JvdXBDb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLmdlbmVyaWNHcm91cENvbnRyb2xGYWN0b3J5ID0gZ2VuZXJpY0dyb3VwQ29udHJvbEZhY3Rvcnk7CisgICAgdGhpcy5pZGVudGlmaWVkVXNlciA9IGlkZW50aWZpZWRVc2VyOworICAgIHRoaXMudXNlckZhY3RvcnkgPSB1c2VyRmFjdG9yeTsKKyAgICB0aGlzLmFjY291bnRHZXRHcm91cHMgPSBhY2NvdW50R2V0R3JvdXBzOworICAgIHRoaXMuanNvbiA9IGpzb247CisgICAgdGhpcy5vcHRpb25zID0gRW51bVNldC5ub25lT2YoTGlzdEdyb3Vwc09wdGlvbi5jbGFzcyk7CisgIH0KKworICBwdWJsaWMgQWNjb3VudC5JZCBnZXRVc2VyKCkgeworICAgIHJldHVybiB1c2VyOworICB9CisKKyAgcHVibGljIExpc3Q8UHJvamVjdENvbnRyb2w+IGdldFByb2plY3RzKCkgeworICAgIHJldHVybiBwcm9qZWN0czsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFRvcExldmVsUmVzb3VyY2UgcmVzb3VyY2UpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKyAgICBmaW5hbCBNYXA8U3RyaW5nLCBHcm91cEluZm8+IG91dHB1dCA9IE1hcHMubmV3VHJlZU1hcCgpOworICAgIGZvciAoR3JvdXBJbmZvIGluZm8gOiBnZXQoKSkgeworICAgICAgb3V0cHV0LnB1dChPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgICBpbmZvLm5hbWUsCisgICAgICAgICAgIkdyb3VwICIgKyBVcmwuZGVjb2RlKGluZm8uaWQpKSwgaW5mbyk7CisgICAgICBpbmZvLm5hbWUgPSBudWxsOworICAgIH0KKyAgICByZXR1cm4gT3V0cHV0Rm9ybWF0LkpTT04ubmV3R3NvbigpLnRvSnNvblRyZWUob3V0cHV0LAorICAgICAgICBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIEdyb3VwSW5mbz4+KCkge30uZ2V0VHlwZSgpKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PEdyb3VwSW5mbz4gZ2V0KCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgTGlzdDxHcm91cEluZm8+IGdyb3VwSW5mb3M7CisgICAgaWYgKHVzZXIgIT0gbnVsbCkgeworICAgICAgaWYgKG93bmVkKSB7CisgICAgICAgIGdyb3VwSW5mb3MgPSBnZXRHcm91cHNPd25lZEJ5KHVzZXJGYWN0b3J5LmNyZWF0ZSh1c2VyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBncm91cEluZm9zID0gYWNjb3VudEdldEdyb3Vwcy5nZXQoKS5hcHBseSgKKyAgICAgICAgICAgIG5ldyBBY2NvdW50UmVzb3VyY2UodXNlckZhY3RvcnkuY3JlYXRlKHVzZXIpKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChvd25lZCkgeworICAgICAgICBncm91cEluZm9zID0gZ2V0R3JvdXBzT3duZWRCeShpZGVudGlmaWVkVXNlci5nZXQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMaXN0PEFjY291bnRHcm91cD4gZ3JvdXBMaXN0OworICAgICAgICBpZiAoIXByb2plY3RzLmlzRW1wdHkoKSkgeworICAgICAgICAgIE1hcDxBY2NvdW50R3JvdXAuVVVJRCwgQWNjb3VudEdyb3VwPiBncm91cHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIFByb2plY3RDb250cm9sIHByb2plY3RDb250cm9sIDogcHJvamVjdHMpIHsKKyAgICAgICAgICAgIGZpbmFsIFNldDxHcm91cFJlZmVyZW5jZT4gZ3JvdXBzUmVmcyA9IHByb2plY3RDb250cm9sLmdldEFsbEdyb3VwcygpOworICAgICAgICAgICAgZm9yIChmaW5hbCBHcm91cFJlZmVyZW5jZSBncm91cFJlZiA6IGdyb3Vwc1JlZnMpIHsKKyAgICAgICAgICAgICAgZmluYWwgQWNjb3VudEdyb3VwIGdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoZ3JvdXBSZWYuZ2V0VVVJRCgpKTsKKyAgICAgICAgICAgICAgaWYgKGdyb3VwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBncm91cHMucHV0KGdyb3VwLmdldEdyb3VwVVVJRCgpLCBncm91cCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZ3JvdXBMaXN0ID0gZmlsdGVyR3JvdXBzKGdyb3Vwcy52YWx1ZXMoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ3JvdXBMaXN0ID0gZmlsdGVyR3JvdXBzKGdyb3VwQ2FjaGUuYWxsKCkpOworICAgICAgICB9CisgICAgICAgIGdyb3VwSW5mb3MgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoZ3JvdXBMaXN0LnNpemUoKSk7CisgICAgICAgIGZvciAoQWNjb3VudEdyb3VwIGdyb3VwIDogZ3JvdXBMaXN0KSB7CisgICAgICAgICAgZ3JvdXBJbmZvcy5hZGQoanNvbi5hZGRPcHRpb25zKG9wdGlvbnMpLmZvcm1hdCgKKyAgICAgICAgICAgICAgR3JvdXBEZXNjcmlwdGlvbnMuZm9yQWNjb3VudEdyb3VwKGdyb3VwKSkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBncm91cEluZm9zOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PEdyb3VwSW5mbz4gZ2V0R3JvdXBzT3duZWRCeShJZGVudGlmaWVkVXNlciB1c2VyKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgTGlzdDxHcm91cEluZm8+IGdyb3VwcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoQWNjb3VudEdyb3VwIGcgOiBmaWx0ZXJHcm91cHMoZ3JvdXBDYWNoZS5hbGwoKSkpIHsKKyAgICAgIEdyb3VwQ29udHJvbCBjdGwgPSBncm91cENvbnRyb2xGYWN0b3J5LmNvbnRyb2xGb3IoZyk7CisgICAgICB0cnkgeworICAgICAgICBpZiAoZ2VuZXJpY0dyb3VwQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcih1c2VyLCBnLmdldEdyb3VwVVVJRCgpKQorICAgICAgICAgICAgLmlzT3duZXIoKSkgeworICAgICAgICAgIGdyb3Vwcy5hZGQoanNvbi5hZGRPcHRpb25zKG9wdGlvbnMpLmZvcm1hdChjdGwuZ2V0R3JvdXAoKSkpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZ3JvdXBzOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PEFjY291bnRHcm91cD4gZmlsdGVyR3JvdXBzKGZpbmFsIEl0ZXJhYmxlPEFjY291bnRHcm91cD4gZ3JvdXBzKSB7CisgICAgZmluYWwgTGlzdDxBY2NvdW50R3JvdXA+IGZpbHRlcmVkR3JvdXBzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZmluYWwgYm9vbGVhbiBpc0FkbWluID0KKyAgICAgICAgaWRlbnRpZmllZFVzZXIuZ2V0KCkuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCk7CisgICAgZm9yIChmaW5hbCBBY2NvdW50R3JvdXAgZ3JvdXAgOiBncm91cHMpIHsKKyAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KG1hdGNoU3Vic3RyaW5nKSkgeworICAgICAgICBpZiAoIWdyb3VwLmdldE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpCisgICAgICAgICAgICAuY29udGFpbnMobWF0Y2hTdWJzdHJpbmcudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFpc0FkbWluKSB7CisgICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbCBjID0gZ3JvdXBDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGdyb3VwKTsKKyAgICAgICAgaWYgKCFjLmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICgodmlzaWJsZVRvQWxsICYmICFncm91cC5pc1Zpc2libGVUb0FsbCgpKQorICAgICAgICAgIHx8IChncm91cFR5cGUgIT0gbnVsbCAmJiAhZ3JvdXBUeXBlLmVxdWFscyhncm91cC5nZXRUeXBlKCkpKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICghZ3JvdXBzVG9JbnNwZWN0LmlzRW1wdHkoKQorICAgICAgICAgICYmICFncm91cHNUb0luc3BlY3QuY29udGFpbnMoZ3JvdXAuZ2V0R3JvdXBVVUlEKCkpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZmlsdGVyZWRHcm91cHMuYWRkKGdyb3VwKTsKKyAgICB9CisgICAgQ29sbGVjdGlvbnMuc29ydChmaWx0ZXJlZEdyb3VwcywgbmV3IEdyb3VwQ29tcGFyYXRvcigpKTsKKyAgICByZXR1cm4gZmlsdGVyZWRHcm91cHM7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTGlzdEluY2x1ZGVkR3JvdXBzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RJbmNsdWRlZEdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTFlODAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL0xpc3RJbmNsdWRlZEdyb3Vwcy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXA7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzLm51bGxUb0VtcHR5OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBMaXN0SW5jbHVkZWRHcm91cHMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8R3JvdXBSZXNvdXJjZT4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpc3RJbmNsdWRlZEdyb3Vwcy5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENvbnRyb2wuRmFjdG9yeSBjb250cm9sRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cEpzb24ganNvbjsKKworICBASW5qZWN0CisgIExpc3RJbmNsdWRlZEdyb3VwcyhHcm91cENvbnRyb2wuRmFjdG9yeSBjb250cm9sRmFjdG9yeSwKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLCBHcm91cEpzb24ganNvbikgeworICAgIHRoaXMuY29udHJvbEZhY3RvcnkgPSBjb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLmRiUHJvdmlkZXIgPSBkYlByb3ZpZGVyOworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIExpc3Q8R3JvdXBJbmZvPiBhcHBseShHcm91cFJlc291cmNlIHJzcmMpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAocnNyYy50b0FjY291bnRHcm91cCgpID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgYm9vbGVhbiBvd25lck9mUGFyZW50ID0gcnNyYy5nZXRDb250cm9sKCkuaXNPd25lcigpOworICAgIExpc3Q8R3JvdXBJbmZvPiBpbmNsdWRlZCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCB1IDogZGJQcm92aWRlci5nZXQoKQorICAgICAgICAuYWNjb3VudEdyb3VwSW5jbHVkZXNCeVV1aWQoKQorICAgICAgICAuYnlHcm91cChyc3JjLnRvQWNjb3VudEdyb3VwKCkuZ2V0SWQoKSkpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIEdyb3VwQ29udHJvbCBpID0gY29udHJvbEZhY3RvcnkuY29udHJvbEZvcih1LmdldEluY2x1ZGVVVUlEKCkpOworICAgICAgICBpZiAob3duZXJPZlBhcmVudCB8fCBpLmlzVmlzaWJsZSgpKSB7CisgICAgICAgICAgaW5jbHVkZWQuYWRkKGpzb24uZm9ybWF0KGkuZ2V0R3JvdXAoKSkpOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBub3RGb3VuZCkgeworICAgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KCJHcm91cCAlcyBubyBsb25nZXIgYXZhaWxhYmxlLCBpbmNsdWRlZCBpbnRvICIsCisgICAgICAgICAgICB1LmdldEluY2x1ZGVVVUlEKCksCisgICAgICAgICAgICByc3JjLmdldEdyb3VwKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBDb2xsZWN0aW9ucy5zb3J0KGluY2x1ZGVkLCBuZXcgQ29tcGFyYXRvcjxHcm91cEluZm8+KCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoR3JvdXBJbmZvIGEsIEdyb3VwSW5mbyBiKSB7CisgICAgICAgIGludCBjbXAgPSBudWxsVG9FbXB0eShhLm5hbWUpLmNvbXBhcmVUbyhudWxsVG9FbXB0eShiLm5hbWUpKTsKKyAgICAgICAgaWYgKGNtcCAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGNtcDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbFRvRW1wdHkoYS5pZCkuY29tcGFyZVRvKG51bGxUb0VtcHR5KGIuaWQpKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgICByZXR1cm4gaW5jbHVkZWQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTGlzdE1lbWJlcnMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTGlzdE1lbWJlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzJjNjMyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9MaXN0TWVtYmVycy5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db21wYXJpc29uQ2hhaW47CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5PcmRlcmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERldGFpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBEZXRhaWxGYWN0b3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgTGlzdE1lbWJlcnMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8R3JvdXBSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cERldGFpbEZhY3RvcnkuRmFjdG9yeSBncm91cERldGFpbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgQWNjb3VudEluZm8uTG9hZGVyIGFjY291bnRMb2FkZXI7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tcmVjdXJzaXZlIiwgdXNhZ2UgPSAidG8gcmVzb2x2ZSBpbmNsdWRlZCBncm91cHMgcmVjdXJzaXZlbHkiKQorICBwcml2YXRlIGJvb2xlYW4gcmVjdXJzaXZlOworCisgIEBJbmplY3QKKyAgTGlzdE1lbWJlcnMoR3JvdXBDYWNoZSBncm91cENhY2hlLAorICAgICAgR3JvdXBEZXRhaWxGYWN0b3J5LkZhY3RvcnkgZ3JvdXBEZXRhaWxGYWN0b3J5LAorICAgICAgQWNjb3VudEluZm8uTG9hZGVyLkZhY3RvcnkgYWNjb3VudExvYWRlckZhY3RvcnkpIHsKKyAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOworICAgIHRoaXMuZ3JvdXBEZXRhaWxGYWN0b3J5ID0gZ3JvdXBEZXRhaWxGYWN0b3J5OworICAgIHRoaXMuYWNjb3VudExvYWRlciA9IGFjY291bnRMb2FkZXJGYWN0b3J5LmNyZWF0ZSh0cnVlKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgTGlzdDxBY2NvdW50SW5mbz4gYXBwbHkoZmluYWwgR3JvdXBSZXNvdXJjZSByZXNvdXJjZSkKKyAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIGlmIChyZXNvdXJjZS50b0FjY291bnRHcm91cCgpID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfQorICAgIGZpbmFsIE1hcDxBY2NvdW50LklkLCBBY2NvdW50SW5mbz4gbWVtYmVycyA9CisgICAgICAgIGdldE1lbWJlcnMocmVzb3VyY2UuZ2V0R3JvdXBVVUlEKCksIG5ldyBIYXNoU2V0PEFjY291bnRHcm91cC5VVUlEPigpKTsKKyAgICBmaW5hbCBMaXN0PEFjY291bnRJbmZvPiBtZW1iZXJJbmZvcyA9IExpc3RzLm5ld0FycmF5TGlzdChtZW1iZXJzLnZhbHVlcygpKTsKKyAgICBDb2xsZWN0aW9ucy5zb3J0KG1lbWJlckluZm9zLCBuZXcgQ29tcGFyYXRvcjxBY2NvdW50SW5mbz4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShBY2NvdW50SW5mbyBhLCBBY2NvdW50SW5mbyBiKSB7CisgICAgICAgIHJldHVybiBDb21wYXJpc29uQ2hhaW4uc3RhcnQoKQorICAgICAgICAgICAgLmNvbXBhcmUoYS5uYW1lLCBiLm5hbWUsIE9yZGVyaW5nLm5hdHVyYWwoKS5udWxsc0ZpcnN0KCkpCisgICAgICAgICAgICAuY29tcGFyZShhLmVtYWlsLCBiLmVtYWlsLCBPcmRlcmluZy5uYXR1cmFsKCkubnVsbHNGaXJzdCgpKQorICAgICAgICAgICAgLmNvbXBhcmUoYS5fYWNjb3VudF9pZCwgYi5fYWNjb3VudF9pZCwgT3JkZXJpbmcubmF0dXJhbCgpLm51bGxzRmlyc3QoKSkucmVzdWx0KCk7CisgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIG1lbWJlckluZm9zOworICB9CisKKyAgcHJpdmF0ZSBNYXA8QWNjb3VudC5JZCwgQWNjb3VudEluZm8+IGdldE1lbWJlcnMoCisgICAgICBmaW5hbCBBY2NvdW50R3JvdXAuVVVJRCBncm91cFVVSUQsCisgICAgICBmaW5hbCBIYXNoU2V0PEFjY291bnRHcm91cC5VVUlEPiBzZWVuR3JvdXBzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBzZWVuR3JvdXBzLmFkZChncm91cFVVSUQpOworCisgICAgZmluYWwgTWFwPEFjY291bnQuSWQsIEFjY291bnRJbmZvPiBtZW1iZXJzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZmluYWwgQWNjb3VudEdyb3VwIGdyb3VwID0gZ3JvdXBDYWNoZS5nZXQoZ3JvdXBVVUlEKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgLy8gdGhlIGluY2x1ZGVkIGdyb3VwIGlzIGFuIGV4dGVybmFsIGdyb3VwIGFuZCBjYW4ndCBiZSByZXNvbHZlZAorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorCisgICAgZmluYWwgR3JvdXBEZXRhaWwgZ3JvdXBEZXRhaWw7CisgICAgdHJ5IHsKKyAgICAgIGdyb3VwRGV0YWlsID0gZ3JvdXBEZXRhaWxGYWN0b3J5LmNyZWF0ZShncm91cC5nZXRJZCgpKS5jYWxsKCk7CisgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZSkgeworICAgICAgLy8gdGhlIGluY2x1ZGVkIGdyb3VwIGlzIG5vdCB2aXNpYmxlCisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICB9CisKKyAgICBpZiAoZ3JvdXBEZXRhaWwubWVtYmVycyAhPSBudWxsKSB7CisgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cE1lbWJlciBtIDogZ3JvdXBEZXRhaWwubWVtYmVycykgeworICAgICAgICBpZiAoIW1lbWJlcnMuY29udGFpbnNLZXkobS5nZXRBY2NvdW50SWQoKSkpIHsKKyAgICAgICAgICBtZW1iZXJzLnB1dChtLmdldEFjY291bnRJZCgpLCBhY2NvdW50TG9hZGVyLmdldChtLmdldEFjY291bnRJZCgpKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVjdXJzaXZlKSB7CisgICAgICBpZiAoZ3JvdXBEZXRhaWwuaW5jbHVkZXMgIT0gbnVsbCkgeworICAgICAgICBmb3IgKGZpbmFsIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQgaW5jbHVkZWRHcm91cCA6IGdyb3VwRGV0YWlsLmluY2x1ZGVzKSB7CisgICAgICAgICAgaWYgKCFzZWVuR3JvdXBzLmNvbnRhaW5zKGluY2x1ZGVkR3JvdXAuZ2V0SW5jbHVkZVVVSUQoKSkpIHsKKyAgICAgICAgICAgIG1lbWJlcnMucHV0QWxsKGdldE1lbWJlcnMoaW5jbHVkZWRHcm91cC5nZXRJbmNsdWRlVVVJRCgpLCBzZWVuR3JvdXBzKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGFjY291bnRMb2FkZXIuZmlsbCgpOworICAgIHJldHVybiBtZW1iZXJzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL01lbWJlclJlc291cmNlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL01lbWJlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhMzdhOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvTWVtYmVyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworcHVibGljIGNsYXNzIE1lbWJlclJlc291cmNlIGV4dGVuZHMgR3JvdXBSZXNvdXJjZSB7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZUxpdGVyYWw8UmVzdFZpZXc8TWVtYmVyUmVzb3VyY2U+PiBNRU1CRVJfS0lORCA9CisgICAgICBuZXcgVHlwZUxpdGVyYWw8UmVzdFZpZXc8TWVtYmVyUmVzb3VyY2U+PigpIHt9OworCisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlcjsKKworICBwdWJsaWMgTWVtYmVyUmVzb3VyY2UoR3JvdXBSZXNvdXJjZSBncm91cCwgSWRlbnRpZmllZFVzZXIgdXNlcikgeworICAgIHN1cGVyKGdyb3VwKTsKKyAgICB0aGlzLnVzZXIgPSB1c2VyOworICB9CisKKyAgcHVibGljIElkZW50aWZpZWRVc2VyIGdldE1lbWJlcigpIHsKKyAgICByZXR1cm4gdXNlcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9NZW1iZXJzQ29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9NZW1iZXJzQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWQxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL01lbWJlcnNDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkFjY2VwdHNDcmVhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkNoaWxkQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50c0NvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkFkZE1lbWJlcnMuUHV0TWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgTWVtYmVyc0NvbGxlY3Rpb24gaW1wbGVtZW50cworICAgIENoaWxkQ29sbGVjdGlvbjxHcm91cFJlc291cmNlLCBNZW1iZXJSZXNvdXJjZT4sCisgICAgQWNjZXB0c0NyZWF0ZTxHcm91cFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxNZW1iZXJSZXNvdXJjZT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPExpc3RNZW1iZXJzPiBsaXN0OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFjY291bnRzQ29sbGVjdGlvbj4gYWNjb3VudHM7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFkZE1lbWJlcnM+IHB1dDsKKworICBASW5qZWN0CisgIE1lbWJlcnNDb2xsZWN0aW9uKER5bmFtaWNNYXA8UmVzdFZpZXc8TWVtYmVyUmVzb3VyY2U+PiB2aWV3cywKKyAgICAgIFByb3ZpZGVyPExpc3RNZW1iZXJzPiBsaXN0LAorICAgICAgUHJvdmlkZXI8QWNjb3VudHNDb2xsZWN0aW9uPiBhY2NvdW50cywKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYiwKKyAgICAgIFByb3ZpZGVyPEFkZE1lbWJlcnM+IHB1dCkgeworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLmxpc3QgPSBsaXN0OworICAgIHRoaXMuYWNjb3VudHMgPSBhY2NvdW50czsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5wdXQgPSBwdXQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PEdyb3VwUmVzb3VyY2U+IGxpc3QoKSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwKKyAgICAgIEF1dGhFeGNlcHRpb24geworICAgIHJldHVybiBsaXN0LmdldCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNZW1iZXJSZXNvdXJjZSBwYXJzZShHcm91cFJlc291cmNlIHBhcmVudCwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKHBhcmVudC50b0FjY291bnRHcm91cCgpID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgSWRlbnRpZmllZFVzZXIgdXNlciA9IGFjY291bnRzLmdldCgpLnBhcnNlKFRvcExldmVsUmVzb3VyY2UuSU5TVEFOQ0UsIGlkKS5nZXRVc2VyKCk7CisgICAgQWNjb3VudEdyb3VwTWVtYmVyLktleSBrZXkgPQorICAgICAgICBuZXcgQWNjb3VudEdyb3VwTWVtYmVyLktleSh1c2VyLmdldEFjY291bnRJZCgpLCBwYXJlbnQudG9BY2NvdW50R3JvdXAoKS5nZXRJZCgpKTsKKyAgICBpZiAoZGIuZ2V0KCkuYWNjb3VudEdyb3VwTWVtYmVycygpLmdldChrZXkpICE9IG51bGwKKyAgICAgICAgJiYgcGFyZW50LmdldENvbnRyb2woKS5jYW5TZWVNZW1iZXIodXNlci5nZXRBY2NvdW50SWQoKSkpIHsKKyAgICAgIHJldHVybiBuZXcgTWVtYmVyUmVzb3VyY2UocGFyZW50LCB1c2VyKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIEBPdmVycmlkZQorICBwdWJsaWMgUHV0TWVtYmVyIGNyZWF0ZShHcm91cFJlc291cmNlIGdyb3VwLCBJZFN0cmluZyBpZCkgeworICAgIHJldHVybiBuZXcgUHV0TWVtYmVyKHB1dCwgaWQuZ2V0KCkpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBEeW5hbWljTWFwPFJlc3RWaWV3PE1lbWJlclJlc291cmNlPj4gdmlld3MoKSB7CisgICAgcmV0dXJuIHZpZXdzOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL01vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Nb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMzOGYxCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9Nb2R1bGUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cFJlc291cmNlLkdST1VQX0tJTkQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5JbmNsdWRlZEdyb3VwUmVzb3VyY2UuSU5DTFVERURfR1JPVVBfS0lORDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLk1lbWJlclJlc291cmNlLk1FTUJFUl9LSU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdEFwaU1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQWRkSW5jbHVkZWRHcm91cHMuVXBkYXRlSW5jbHVkZWRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQWRkTWVtYmVycy5VcGRhdGVNZW1iZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkRlbGV0ZUluY2x1ZGVkR3JvdXBzLkRlbGV0ZUluY2x1ZGVkR3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLkRlbGV0ZU1lbWJlcnMuRGVsZXRlTWVtYmVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkZhY3RvcnlNb2R1bGVCdWlsZGVyOworCitwdWJsaWMgY2xhc3MgTW9kdWxlIGV4dGVuZHMgUmVzdEFwaU1vZHVsZSB7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgYmluZChHcm91cHNDb2xsZWN0aW9uLmNsYXNzKTsKKworICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIEdST1VQX0tJTkQpOworICAgIER5bmFtaWNNYXAubWFwT2YoYmluZGVyKCksIE1FTUJFUl9LSU5EKTsKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBJTkNMVURFRF9HUk9VUF9LSU5EKTsKKworICAgIGdldChHUk9VUF9LSU5EKS50byhHZXRHcm91cC5jbGFzcyk7CisgICAgcHV0KEdST1VQX0tJTkQpLnRvKFB1dEdyb3VwLmNsYXNzKTsKKyAgICBnZXQoR1JPVVBfS0lORCwgImRldGFpbCIpLnRvKEdldERldGFpbC5jbGFzcyk7CisgICAgcG9zdChHUk9VUF9LSU5ELCAibWVtYmVycyIpLnRvKEFkZE1lbWJlcnMuY2xhc3MpOworICAgIHBvc3QoR1JPVVBfS0lORCwgIm1lbWJlcnMuYWRkIikudG8oQWRkTWVtYmVycy5jbGFzcyk7CisgICAgcG9zdChHUk9VUF9LSU5ELCAibWVtYmVycy5kZWxldGUiKS50byhEZWxldGVNZW1iZXJzLmNsYXNzKTsKKyAgICBwb3N0KEdST1VQX0tJTkQsICJncm91cHMiKS50byhBZGRJbmNsdWRlZEdyb3Vwcy5jbGFzcyk7CisgICAgcG9zdChHUk9VUF9LSU5ELCAiZ3JvdXBzLmFkZCIpLnRvKEFkZEluY2x1ZGVkR3JvdXBzLmNsYXNzKTsKKyAgICBwb3N0KEdST1VQX0tJTkQsICJncm91cHMuZGVsZXRlIikudG8oRGVsZXRlSW5jbHVkZWRHcm91cHMuY2xhc3MpOworICAgIGdldChHUk9VUF9LSU5ELCAiZGVzY3JpcHRpb24iKS50byhHZXREZXNjcmlwdGlvbi5jbGFzcyk7CisgICAgcHV0KEdST1VQX0tJTkQsICJkZXNjcmlwdGlvbiIpLnRvKFB1dERlc2NyaXB0aW9uLmNsYXNzKTsKKyAgICBkZWxldGUoR1JPVVBfS0lORCwgImRlc2NyaXB0aW9uIikudG8oUHV0RGVzY3JpcHRpb24uY2xhc3MpOworICAgIGdldChHUk9VUF9LSU5ELCAibmFtZSIpLnRvKEdldE5hbWUuY2xhc3MpOworICAgIHB1dChHUk9VUF9LSU5ELCAibmFtZSIpLnRvKFB1dE5hbWUuY2xhc3MpOworICAgIGdldChHUk9VUF9LSU5ELCAib3duZXIiKS50byhHZXRPd25lci5jbGFzcyk7CisgICAgcHV0KEdST1VQX0tJTkQsICJvd25lciIpLnRvKFB1dE93bmVyLmNsYXNzKTsKKyAgICBnZXQoR1JPVVBfS0lORCwgIm9wdGlvbnMiKS50byhHZXRPcHRpb25zLmNsYXNzKTsKKyAgICBwdXQoR1JPVVBfS0lORCwgIm9wdGlvbnMiKS50byhQdXRPcHRpb25zLmNsYXNzKTsKKworICAgIGNoaWxkKEdST1VQX0tJTkQsICJtZW1iZXJzIikudG8oTWVtYmVyc0NvbGxlY3Rpb24uY2xhc3MpOworICAgIGdldChNRU1CRVJfS0lORCkudG8oR2V0TWVtYmVyLmNsYXNzKTsKKyAgICBwdXQoTUVNQkVSX0tJTkQpLnRvKFVwZGF0ZU1lbWJlci5jbGFzcyk7CisgICAgZGVsZXRlKE1FTUJFUl9LSU5EKS50byhEZWxldGVNZW1iZXIuY2xhc3MpOworCisgICAgY2hpbGQoR1JPVVBfS0lORCwgImdyb3VwcyIpLnRvKEluY2x1ZGVkR3JvdXBzQ29sbGVjdGlvbi5jbGFzcyk7CisgICAgZ2V0KElOQ0xVREVEX0dST1VQX0tJTkQpLnRvKEdldEluY2x1ZGVkR3JvdXAuY2xhc3MpOworICAgIHB1dChJTkNMVURFRF9HUk9VUF9LSU5EKS50byhVcGRhdGVJbmNsdWRlZEdyb3VwLmNsYXNzKTsKKyAgICBkZWxldGUoSU5DTFVERURfR1JPVVBfS0lORCkudG8oRGVsZXRlSW5jbHVkZWRHcm91cC5jbGFzcyk7CisKKyAgICBpbnN0YWxsKG5ldyBGYWN0b3J5TW9kdWxlQnVpbGRlcigpLmJ1aWxkKENyZWF0ZUdyb3VwLkZhY3RvcnkuY2xhc3MpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXREZXNjcmlwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXREZXNjcmlwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzBhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dERlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5QdXREZXNjcmlwdGlvbi5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworcHVibGljIGNsYXNzIFB1dERlc2NyaXB0aW9uIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8R3JvdXBSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisKKyAgQEluamVjdAorICBQdXREZXNjcmlwdGlvbihHcm91cENhY2hlIGdyb3VwQ2FjaGUsIFJldmlld0RiIGRiKSB7CisgICAgdGhpcy5ncm91cENhY2hlID0gZ3JvdXBDYWNoZTsKKyAgICB0aGlzLmRiID0gZGI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLCBBdXRoRXhjZXB0aW9uLCBOb1N1Y2hHcm91cEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgIGlucHV0ID0gbmV3IElucHV0KCk7IC8vIERlbGV0ZSB3b3VsZCBzZXQgZGVzY3JpcHRpb24gdG8gbnVsbC4KKyAgICB9CisKKyAgICBpZiAocmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAoIXJlc291cmNlLmdldENvbnRyb2woKS5pc093bmVyKCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJOb3QgZ3JvdXAgb3duZXIiKTsKKyAgICB9CisKKyAgICBBY2NvdW50R3JvdXAgZ3JvdXAgPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KAorICAgICAgICByZXNvdXJjZS50b0FjY291bnRHcm91cCgpLmdldElkKCkpOworICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGdyb3VwLnNldERlc2NyaXB0aW9uKFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQuZGVzY3JpcHRpb24pKTsKKyAgICBkYi5hY2NvdW50R3JvdXBzKCkudXBkYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbihncm91cCkpOworICAgIGdyb3VwQ2FjaGUuZXZpY3QoZ3JvdXApOworCisgICAgcmV0dXJuIFN0cmluZ3MuaXNOdWxsT3JFbXB0eShpbnB1dC5kZXNjcmlwdGlvbikKKyAgICAgICAgPyBSZXNwb25zZS5ub25lKCkKKyAgICAgICAgOiBpbnB1dC5kZXNjcmlwdGlvbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRHcm91cC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRHcm91cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYmVkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dEdyb3VwLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuQ3JlYXRlR3JvdXAuSW5wdXQ7CisKK3B1YmxpYyBjbGFzcyBQdXRHcm91cCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIElucHV0PiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24geworICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJHcm91cCBhbHJlYWR5IGV4aXN0cyIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dE5hbWUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0TmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODMzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dE5hbWUuamF2YQpAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuSW52YWxpZE5hbWVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5OYW1lQWxyZWFkeVVzZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5QZXJmb3JtUmVuYW1lR3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwLlB1dE5hbWUuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK3B1YmxpYyBjbGFzcyBQdXROYW1lIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8R3JvdXBSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgU3RyaW5nIG5hbWU7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFBlcmZvcm1SZW5hbWVHcm91cC5GYWN0b3J5IHBlcmZvcm1SZW5hbWVHcm91cEZhY3Rvcnk7CisKKyAgQEluamVjdAorICBQdXROYW1lKFBlcmZvcm1SZW5hbWVHcm91cC5GYWN0b3J5IHBlcmZvcm1SZW5hbWVHcm91cEZhY3RvcnkpIHsKKyAgICB0aGlzLnBlcmZvcm1SZW5hbWVHcm91cEZhY3RvcnkgPSBwZXJmb3JtUmVuYW1lR3JvdXBGYWN0b3J5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgYXBwbHkoR3JvdXBSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKHJlc291cmNlLnRvQWNjb3VudEdyb3VwKCkgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKCFyZXNvdXJjZS5nZXRDb250cm9sKCkuaXNPd25lcigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiTm90IGdyb3VwIG93bmVyIik7CisgICAgfSBlbHNlIGlmIChpbnB1dCA9PSBudWxsIHx8IFN0cmluZ3MuaXNOdWxsT3JFbXB0eShpbnB1dC5uYW1lKSkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIm5hbWUgaXMgcmVxdWlyZWQiKTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgbmV3TmFtZSA9IGlucHV0Lm5hbWUudHJpbSgpOworICAgIGlmIChyZXNvdXJjZS50b0FjY291bnRHcm91cCgpLmdldE5hbWUoKS5lcXVhbHMobmV3TmFtZSkpIHsKKyAgICAgIHJldHVybiBuZXdOYW1lOworICAgIH0KKworICAgIHRyeSB7CisgICAgICByZXR1cm4gcGVyZm9ybVJlbmFtZUdyb3VwRmFjdG9yeS5jcmVhdGUoKS5yZW5hbWVHcm91cCgKKyAgICAgICAgICByZXNvdXJjZS50b0FjY291bnRHcm91cCgpLmdldElkKCksIG5ld05hbWUpLmdyb3VwLmdldE5hbWUoKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0gY2F0Y2ggKEludmFsaWROYW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICB9IGNhdGNoIChOYW1lQWxyZWFkeVVzZWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRPcHRpb25zLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dE9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDA2MGRlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9ncm91cC9QdXRPcHRpb25zLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5NZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5QdXRPcHRpb25zLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitwdWJsaWMgY2xhc3MgUHV0T3B0aW9ucyBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQm9vbGVhbiB2aXNpYmxlVG9BbGw7CisgIH0KKworICBwcml2YXRlIGZpbmFsIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKKworICBASW5qZWN0CisgIFB1dE9wdGlvbnMoR3JvdXBDYWNoZSBncm91cENhY2hlLCBSZXZpZXdEYiBkYikgeworICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7CisgICAgdGhpcy5kYiA9IGRiOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBHcm91cE9wdGlvbnNJbmZvIGFwcGx5KEdyb3VwUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24sIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sCisgICAgICBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24geworICAgIGlmIChyZXNvdXJjZS50b0FjY291bnRHcm91cCgpID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uKCk7CisgICAgfSBlbHNlIGlmICghcmVzb3VyY2UuZ2V0Q29udHJvbCgpLmlzT3duZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIk5vdCBncm91cCBvd25lciIpOworICAgIH0KKworICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigib3B0aW9ucyBhcmUgcmVxdWlyZWQiKTsKKyAgICB9CisgICAgaWYgKGlucHV0LnZpc2libGVUb0FsbCA9PSBudWxsKSB7CisgICAgICBpbnB1dC52aXNpYmxlVG9BbGwgPSBmYWxzZTsKKyAgICB9CisKKyAgICBBY2NvdW50R3JvdXAgZ3JvdXAgPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KAorICAgICAgICByZXNvdXJjZS50b0FjY291bnRHcm91cCgpLmdldElkKCkpOworICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIGdyb3VwLnNldFZpc2libGVUb0FsbChpbnB1dC52aXNpYmxlVG9BbGwpOworICAgIGRiLmFjY291bnRHcm91cHMoKS51cGRhdGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGdyb3VwKSk7CisgICAgZ3JvdXBDYWNoZS5ldmljdChncm91cCk7CisKKyAgICByZXR1cm4gbmV3IEdyb3VwT3B0aW9uc0luZm8oZ3JvdXApOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dE93bmVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2dyb3VwL1B1dE93bmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2YzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ3JvdXAvUHV0T3duZXIuamF2YQpAQCAtMCwwICsxLDg2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdyb3VwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uLkdyb3VwSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuUHV0T3duZXIuSW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK3B1YmxpYyBjbGFzcyBQdXRPd25lciBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PEdyb3VwUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBvd25lcjsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8R3JvdXBzQ29sbGVjdGlvbj4gZ3JvdXBzQ29sbGVjdGlvbjsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgZmluYWwgR3JvdXBKc29uIGpzb247CisKKyAgQEluamVjdAorICBQdXRPd25lcihQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uLCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCisgICAgICBSZXZpZXdEYiBkYiwgR3JvdXBKc29uIGpzb24pIHsKKyAgICB0aGlzLmdyb3Vwc0NvbGxlY3Rpb24gPSBncm91cHNDb2xsZWN0aW9uOworICAgIHRoaXMuZ3JvdXBDYWNoZSA9IGdyb3VwQ2FjaGU7CisgICAgdGhpcy5kYiA9IGRiOworICAgIHRoaXMuanNvbiA9IGpzb247CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEdyb3VwSW5mbyBhcHBseShHcm91cFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uLAorICAgICAgQXV0aEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwKKyAgICAgIE9ybUV4Y2VwdGlvbiB7CisgICAgQWNjb3VudEdyb3VwIGdyb3VwID0gcmVzb3VyY2UudG9BY2NvdW50R3JvdXAoKTsKKyAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgICB9IGVsc2UgaWYgKCFyZXNvdXJjZS5nZXRDb250cm9sKCkuaXNPd25lcigpKSB7CisgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiTm90IGdyb3VwIG93bmVyIik7CisgICAgfQorCisgICAgaWYgKGlucHV0ID09IG51bGwgfHwgU3RyaW5ncy5pc051bGxPckVtcHR5KGlucHV0Lm93bmVyKSkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIm93bmVyIGlzIHJlcXVpcmVkIik7CisgICAgfQorCisgICAgZ3JvdXAgPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KGdyb3VwLmdldElkKCkpOworICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEdyb3VwRGVzY3JpcHRpb24uQmFzaWMgb3duZXIgPSBncm91cHNDb2xsZWN0aW9uLmdldCgpLnBhcnNlKGlucHV0Lm93bmVyKTsKKyAgICBpZiAoIWdyb3VwLmdldE93bmVyR3JvdXBVVUlEKCkuZXF1YWxzKG93bmVyLmdldEdyb3VwVVVJRCgpKSkgeworICAgICAgZ3JvdXAuc2V0T3duZXJHcm91cFVVSUQob3duZXIuZ2V0R3JvdXBVVUlEKCkpOworICAgICAgZGIuYWNjb3VudEdyb3VwcygpLnVwZGF0ZShDb2xsZWN0aW9ucy5zaW5nbGV0b24oZ3JvdXApKTsKKyAgICAgIGdyb3VwQ2FjaGUuZXZpY3QoZ3JvdXApOworICAgIH0KKyAgICByZXR1cm4ganNvbi5mb3JtYXQob3duZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQWJhbmRvbmVkU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQWJhbmRvbmVkU2VuZGVyLmphdmEKaW5kZXggMGViM2RmZS4uODM4N2Y1MSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0FiYW5kb25lZFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9BYmFuZG9uZWRTZW5kZXIuamF2YQpAQCAtMTQsOSArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC0yOCw5ICsyOCw4IEBACiAgIH0KIAogICBASW5qZWN0Ci0gIHB1YmxpYyBBYmFuZG9uZWRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsIGMsICJhYmFuZG9uIik7CisgIHB1YmxpYyBBYmFuZG9uZWRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIEBBc3Npc3RlZCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjLCAiYWJhbmRvbiIpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC0zOSw3ICszOCw4IEBACiAKICAgICBjY0FsbEFwcHJvdmFscygpOwogICAgIGJjY1N0YXJyZWRCeSgpOwotICAgIGJjY1dhdGNoZXMoTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMpOworICAgIGluY2x1ZGVXYXRjaGVycyhOb3RpZnlUeXBlLkFCQU5ET05FRF9DSEFOR0VTKTsKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQWRkUmV2aWV3ZXJTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9BZGRSZXZpZXdlclNlbmRlci5qYXZhCmluZGV4IGY3YWNlMjcuLmMxODFhOWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9BZGRSZXZpZXdlclNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9BZGRSZXZpZXdlclNlbmRlci5qYXZhCkBAIC0xNCw5ICsxNCw4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CiAKQEAgLTI3LDEwICsyNiw4IEBACiAgIH0KIAogICBASW5qZWN0Ci0gIHB1YmxpYyBBZGRSZXZpZXdlclNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLCBTc2hJbmZvIHNzaEluZm8sCi0gICAgICBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgc3NoSW5mbywgYyk7CisgIHB1YmxpYyBBZGRSZXZpZXdlclNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMpOwogICB9CiAKICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ2hhbmdlRW1haWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DaGFuZ2VFbWFpbC5qYXZhCmluZGV4IDZjMzM5NDkuLjg4NWYxYWEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DaGFuZ2VFbWFpbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DaGFuZ2VFbWFpbC5qYXZhCkBAIC0xNCwxNSArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOwpAQCAtMzAsMzUgKzI0LDM1IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm87Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlN0YXJyZWRDaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTm90aWZ5Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLlByb2plY3RXYXRjaC5XYXRjaGVyczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3RFbnRyeTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0Tm90QXZhaWxhYmxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5QcmVkaWNhdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LlF1ZXJ5UGFyc2VFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VEYXRhOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuQ2hhbmdlUXVlcnlCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2UuU2luZ2xlR3JvdXBVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlRlbXBvcmFyeUJ1ZmZlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlF1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CiAKIC8qKiBTZW5kcyBhbiBlbWFpbCB0byBvbmUgb3IgbW9yZSBpbnRlcmVzdGVkIHBhcnRpZXMuICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlRW1haWwgZXh0ZW5kcyBPdXRnb2luZ0VtYWlsIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaGFuZ2VFbWFpbCBleHRlbmRzIE5vdGlmaWNhdGlvbkVtYWlsIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENoYW5nZUVtYWlsLmNsYXNzKTsKIAogICBwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlIGNoYW5nZTsKQEAgLTcxLDExICs2NSwxMCBAQAogICBwcm90ZWN0ZWQgU2V0PEFjY291bnQuSWQ+IGF1dGhvcnM7CiAgIHByb3RlY3RlZCBib29sZWFuIGVtYWlsT25seUF1dGhvcnM7CiAKLSAgcHJvdGVjdGVkIENoYW5nZUVtYWlsKEVtYWlsQXJndW1lbnRzIGVhLCBmaW5hbCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKLSAgICAgIGZpbmFsIENoYW5nZSBjLCBmaW5hbCBTdHJpbmcgbWMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgbWMpOworICBwcm90ZWN0ZWQgQ2hhbmdlRW1haWwoRW1haWxBcmd1bWVudHMgZWEsIENoYW5nZSBjLCBTdHJpbmcgbWMpIHsKKyAgICBzdXBlcihlYSwgbWMsIGMuZ2V0UHJvamVjdCgpLCBjLmdldERlc3QoKSk7CiAgICAgY2hhbmdlID0gYzsKLSAgICBjaGFuZ2VEYXRhID0gY2hhbmdlICE9IG51bGwgPyBuZXcgQ2hhbmdlRGF0YShjaGFuZ2UpIDogbnVsbDsKKyAgICBjaGFuZ2VEYXRhID0gbmV3IENoYW5nZURhdGEoY2hhbmdlKTsKICAgICBlbWFpbE9ubHlBdXRob3JzID0gZmFsc2U7CiAgIH0KIApAQCAtMTIxLDExICsxMTQsMTYgQEAKICAgICAgIH0KICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZSkgewogICAgIH0KKyAgICBmb3JtYXRGb290ZXIoKTsKICAgfQogCiAgIC8qKiBGb3JtYXQgdGhlIG1lc3NhZ2UgYm9keSBieSBjYWxsaW5nIHtAbGluayAjYXBwZW5kVGV4dChTdHJpbmcpfS4gKi8KICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0Q2hhbmdlKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uOwogCisgIC8qKiBGb3JtYXQgdGhlIG1lc3NhZ2UgZm9vdGVyIGJ5IGNhbGxpbmcge0BsaW5rICNhcHBlbmRUZXh0KFN0cmluZyl9LiAqLworICBwcm90ZWN0ZWQgdm9pZCBmb3JtYXRGb290ZXIoKSB0aHJvd3MgRW1haWxFeGNlcHRpb24geworICB9CisKICAgLyoqIFNldHVwIHRoZSBtZXNzYWdlIGhlYWRlcnMgYW5kIGVudmVsb3BlIChUTywgQ0MsIEJDQykuICovCiAgIHByb3RlY3RlZCB2b2lkIGluaXQoKSB0aHJvd3MgRW1haWxFeGNlcHRpb24gewogICAgIGlmIChhcmdzLnByb2plY3RDYWNoZSAhPSBudWxsKSB7CkBAIC0xNTgsMjMgKzE1NiwxMCBAQAogICAgIH0KICAgICBzZXRDaGFuZ2VTdWJqZWN0SGVhZGVyKCk7CiAgICAgc2V0SGVhZGVyKCJYLUdlcnJpdC1DaGFuZ2UtSWQiLCAiIiArIGNoYW5nZS5nZXRLZXkoKS5nZXQoKSk7Ci0gICAgc2V0TGlzdElkSGVhZGVyKCk7CiAgICAgc2V0Q2hhbmdlVXJsSGVhZGVyKCk7CiAgICAgc2V0Q29tbWl0SWRIZWFkZXIoKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBzZXRMaXN0SWRIZWFkZXIoKSB0aHJvd3MgRW1haWxFeGNlcHRpb24gewotICAgIC8vIFNldCBhIHJlYXNvbmFibGUgbGlzdCBpZCBzbyB0aGF0IGZpbHRlcnMgY2FuIGJlIHVzZWQgdG8gc29ydCBtZXNzYWdlcwotICAgIHNldFZIZWFkZXIoIkxpc3QtSWQiLCAiPCRlbWFpbC5saXN0SWQucmVwbGFjZSgnQCcsICcuJyk+Iik7Ci0gICAgaWYgKGdldFNldHRpbmdzVXJsKCkgIT0gbnVsbCkgewotICAgICAgc2V0VkhlYWRlcigiTGlzdC1VbnN1YnNjcmliZSIsICI8JGVtYWlsLnNldHRpbmdzVXJsPiIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TGlzdElkKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gdmVsb2NpZnkoImdlcnJpdC0kcHJvamVjdE5hbWUucmVwbGFjZSgnLycsICctJylAJGVtYWlsLmdlcnJpdEhvc3QiKTsKLSAgfQotCiAgIHByaXZhdGUgdm9pZCBzZXRDaGFuZ2VVcmxIZWFkZXIoKSB7CiAgICAgZmluYWwgU3RyaW5nIHUgPSBnZXRDaGFuZ2VVcmwoKTsKICAgICBpZiAodSAhPSBudWxsKSB7CkBAIC0xOTYsNyArMTgxLDcgQEAKIAogICAvKiogR2V0IGEgbGluayB0byB0aGUgY2hhbmdlOyBudWxsIGlmIHRoZSBzZXJ2ZXIgZG9lc24ndCBrbm93IGl0cyBvd24gYWRkcmVzcy4gKi8KICAgcHVibGljIFN0cmluZyBnZXRDaGFuZ2VVcmwoKSB7Ci0gICAgaWYgKGNoYW5nZSAhPSBudWxsICYmIGdldEdlcnJpdFVybCgpICE9IG51bGwpIHsKKyAgICBpZiAoZ2V0R2Vycml0VXJsKCkgIT0gbnVsbCkgewogICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgIHIuYXBwZW5kKGdldEdlcnJpdFVybCgpKTsKICAgICAgIHIuYXBwZW5kKGNoYW5nZS5nZXRDaGFuZ2VJZCgpKTsKQEAgLTMxNiwxNjQgKzMwMSwxMCBAQAogICAgIH0KICAgfQogCi0gIC8qKiBCQ0MgdXNlcnMgYW5kIGdyb3VwcyB0aGF0IHdhbnQgbm90aWZpY2F0aW9uIG9mIGV2ZW50cy4gKi8KLSAgcHJvdGVjdGVkIHZvaWQgYmNjV2F0Y2hlcyhOb3RpZnlUeXBlIHR5cGUpIHsKLSAgICB0cnkgewotICAgICAgV2F0Y2hlcnMgbWF0Y2hpbmcgPSBnZXRXYXRjaGVzKHR5cGUpOwotICAgICAgZm9yIChBY2NvdW50LklkIHVzZXIgOiBtYXRjaGluZy5hY2NvdW50cykgewotICAgICAgICBhZGQoUmVjaXBpZW50VHlwZS5CQ0MsIHVzZXIpOwotICAgICAgfQotICAgICAgZm9yIChBZGRyZXNzIGFkZHIgOiBtYXRjaGluZy5lbWFpbHMpIHsKLSAgICAgICAgYWRkKFJlY2lwaWVudFR5cGUuQkNDLCBhZGRyKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7Ci0gICAgICAvLyBKdXN0IGRvbid0IENDIGV2ZXJ5b25lLiBCZXR0ZXIgdG8gc2VuZCBhIHBhcnRpYWwgbWVzc2FnZSB0byB0aG9zZQotICAgICAgLy8gd2UgYWxyZWFkeSBoYXZlIHF1ZXVlZCB1cCB0aGVuIHRvIGZhaWwgZGVsaXZlciBlbnRpcmVseSB0byBwZW9wbGUKLSAgICAgIC8vIHdobyBoYXZlIGEgbG93ZXIgaW50ZXJlc3QgaW4gdGhlIGNoYW5nZS4KLSAgICAgIGxvZy53YXJuKCJDYW5ub3QgQkNDIHdhdGNoZXJzIGZvciAiICsgdHlwZSwgZXJyKTsKLSAgICB9Ci0gIH0KLQotICAvKiogUmV0dXJucyBhbGwgd2F0Y2hlcyB0aGF0IGFyZSByZWxldmFudCAqLwotICBwcm90ZWN0ZWQgZmluYWwgV2F0Y2hlcnMgZ2V0V2F0Y2hlcyhOb3RpZnlUeXBlIHR5cGUpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIFdhdGNoZXJzIG1hdGNoaW5nID0gbmV3IFdhdGNoZXJzKCk7Ci0gICAgaWYgKGNoYW5nZURhdGEgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG1hdGNoaW5nOwotICAgIH0KLQotICAgIFNldDxBY2NvdW50LklkPiBwcm9qZWN0V2F0Y2hlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOwotCi0gICAgZm9yIChBY2NvdW50UHJvamVjdFdhdGNoIHcgOiBhcmdzLmRiLmdldCgpLmFjY291bnRQcm9qZWN0V2F0Y2hlcygpCi0gICAgICAgIC5ieVByb2plY3QoY2hhbmdlLmdldFByb2plY3QoKSkpIHsKLSAgICAgIHByb2plY3RXYXRjaGVycy5hZGQody5nZXRBY2NvdW50SWQoKSk7Ci0gICAgICBpZiAody5pc05vdGlmeSh0eXBlKSkgewotICAgICAgICBhZGQobWF0Y2hpbmcsIHcpOwotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoQWNjb3VudFByb2plY3RXYXRjaCB3IDogYXJncy5kYi5nZXQoKS5hY2NvdW50UHJvamVjdFdhdGNoZXMoKQotICAgICAgICAuYnlQcm9qZWN0KGFyZ3MuYWxsUHJvamVjdHNOYW1lKSkgewotICAgICAgaWYgKCFwcm9qZWN0V2F0Y2hlcnMuY29udGFpbnMody5nZXRBY2NvdW50SWQoKSkgJiYgdy5pc05vdGlmeSh0eXBlKSkgewotICAgICAgICBhZGQobWF0Y2hpbmcsIHcpOwotICAgICAgfQotICAgIH0KLQotICAgIFByb2plY3RTdGF0ZSBzdGF0ZSA9IHByb2plY3RTdGF0ZTsKLSAgICB3aGlsZSAoc3RhdGUgIT0gbnVsbCkgewotICAgICAgZm9yIChOb3RpZnlDb25maWcgbmMgOiBzdGF0ZS5nZXRDb25maWcoKS5nZXROb3RpZnlDb25maWdzKCkpIHsKLSAgICAgICAgaWYgKG5jLmlzTm90aWZ5KHR5cGUpKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZChtYXRjaGluZywgbmMsIHN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOwotICAgICAgICAgIH0gY2F0Y2ggKFF1ZXJ5UGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAiUHJvamVjdCAlcyBoYXMgaW52YWxpZCBub3RpZnkgJXMgZmlsdGVyIFwiJXNcIjogJXMiLAotICAgICAgICAgICAgICAgIHN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCksIG5jLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICBuYy5nZXRGaWx0ZXIoKSwgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHN0YXRlID0gc3RhdGUuZ2V0UGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF0Y2hpbmc7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFdhdGNoZXJzIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PEFjY291bnQuSWQ+IGFjY291bnRzID0gU2V0cy5uZXdIYXNoU2V0KCk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxBZGRyZXNzPiBlbWFpbHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIHZvaWQgYWRkKFdhdGNoZXJzIG1hdGNoaW5nLCBOb3RpZnlDb25maWcgbmMsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0KQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgUXVlcnlQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgZm9yIChHcm91cFJlZmVyZW5jZSByZWYgOiBuYy5nZXRHcm91cHMoKSkgewotICAgICAgQWNjb3VudEdyb3VwIGdyb3VwID0KLSAgICAgICAgICBHcm91cERlc2NyaXB0aW9ucy50b0FjY291bnRHcm91cChhcmdzLmdyb3VwQmFja2VuZC5nZXQocmVmLmdldFVVSUQoKSkpOwotICAgICAgaWYgKGdyb3VwID09IG51bGwpIHsKLSAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICJQcm9qZWN0ICVzIGhhcyBpbnZhbGlkIGdyb3VwICVzIGluIG5vdGlmeSBzZWN0aW9uICVzIiwKLSAgICAgICAgICAgIHByb2plY3QuZ2V0KCksIHJlZi5nZXROYW1lKCksIG5jLmdldE5hbWUoKSkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGdyb3VwLmdldFR5cGUoKSAhPSBBY2NvdW50R3JvdXAuVHlwZS5JTlRFUk5BTCkgewotICAgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgIlByb2plY3QgJXMgY2Fubm90IHVzZSBncm91cCAlcyBvZiB0eXBlICVzIGluIG5vdGlmeSBzZWN0aW9uICVzIiwKLSAgICAgICAgICAgIHByb2plY3QuZ2V0KCksIHJlZi5nZXROYW1lKCksIGdyb3VwLmdldFR5cGUoKSwgbmMuZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBDaGFuZ2VRdWVyeUJ1aWxkZXIgcWIgPSBhcmdzLnF1ZXJ5QnVpbGRlci5jcmVhdGUobmV3IFNpbmdsZUdyb3VwVXNlcigKLSAgICAgICAgICBhcmdzLmNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKLSAgICAgICAgICByZWYuZ2V0VVVJRCgpKSk7Ci0gICAgICBxYi5zZXRBbGxvd0ZpbGUodHJ1ZSk7Ci0gICAgICBQcmVkaWNhdGU8Q2hhbmdlRGF0YT4gcCA9IHFiLmlzX3Zpc2libGUoKTsKLSAgICAgIGlmIChuYy5nZXRGaWx0ZXIoKSAhPSBudWxsKSB7Ci0gICAgICAgIHAgPSBQcmVkaWNhdGUuYW5kKHFiLnBhcnNlKG5jLmdldEZpbHRlcigpKSwgcCk7Ci0gICAgICAgIHAgPSBhcmdzLnF1ZXJ5UmV3cml0ZXIuZ2V0KCkucmV3cml0ZShwKTsKLSAgICAgIH0KLSAgICAgIGlmIChwLm1hdGNoKGNoYW5nZURhdGEpKSB7Ci0gICAgICAgIHJlY3Vyc2l2ZWx5QWRkQWxsQWNjb3VudHMobWF0Y2hpbmcsIGdyb3VwKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW5jLmdldEFkZHJlc3NlcygpLmlzRW1wdHkoKSkgewotICAgICAgaWYgKG5jLmdldEZpbHRlcigpICE9IG51bGwpIHsKLSAgICAgICAgQ2hhbmdlUXVlcnlCdWlsZGVyIHFiID0gYXJncy5xdWVyeUJ1aWxkZXIuY3JlYXRlKGFyZ3MuYW5vbnltb3VzVXNlcik7Ci0gICAgICAgIHFiLnNldEFsbG93RmlsZSh0cnVlKTsKLSAgICAgICAgUHJlZGljYXRlPENoYW5nZURhdGE+IHAgPSBxYi5wYXJzZShuYy5nZXRGaWx0ZXIoKSk7Ci0gICAgICAgIHAgPSBhcmdzLnF1ZXJ5UmV3cml0ZXIuZ2V0KCkucmV3cml0ZShwKTsKLSAgICAgICAgaWYgKHAubWF0Y2goY2hhbmdlRGF0YSkpIHsKLSAgICAgICAgICBtYXRjaGluZy5lbWFpbHMuYWRkQWxsKG5jLmdldEFkZHJlc3NlcygpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWF0Y2hpbmcuZW1haWxzLmFkZEFsbChuYy5nZXRBZGRyZXNzZXMoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlY3Vyc2l2ZWx5QWRkQWxsQWNjb3VudHMoV2F0Y2hlcnMgbWF0Y2hpbmcsIEFjY291bnRHcm91cCBncm91cCkKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIFNldDxBY2NvdW50R3JvdXAuSWQ+IHNlZW4gPSBTZXRzLm5ld0hhc2hTZXQoKTsKLSAgICBRdWV1ZTxBY2NvdW50R3JvdXAuSWQ+IHNjYW4gPSBMaXN0cy5uZXdMaW5rZWRMaXN0KCk7Ci0gICAgc2Nhbi5hZGQoZ3JvdXAuZ2V0SWQoKSk7Ci0gICAgc2Vlbi5hZGQoZ3JvdXAuZ2V0SWQoKSk7Ci0gICAgd2hpbGUgKCFzY2FuLmlzRW1wdHkoKSkgewotICAgICAgQWNjb3VudEdyb3VwLklkIG5leHQgPSBzY2FuLnJlbW92ZSgpOwotICAgICAgZm9yIChBY2NvdW50R3JvdXBNZW1iZXIgbSA6IGFyZ3MuZGIuZ2V0KCkuYWNjb3VudEdyb3VwTWVtYmVycygpCi0gICAgICAgICAgLmJ5R3JvdXAobmV4dCkpIHsKLSAgICAgICAgbWF0Y2hpbmcuYWNjb3VudHMuYWRkKG0uZ2V0QWNjb3VudElkKCkpOwotICAgICAgfQotICAgICAgZm9yIChBY2NvdW50R3JvdXBJbmNsdWRlIG0gOiBhcmdzLmRiLmdldCgpLmFjY291bnRHcm91cEluY2x1ZGVzKCkKLSAgICAgICAgICAuYnlHcm91cChuZXh0KSkgewotICAgICAgICBpZiAoc2Vlbi5hZGQobS5nZXRJbmNsdWRlSWQoKSkpIHsKLSAgICAgICAgICBzY2FuLmFkZChtLmdldEluY2x1ZGVJZCgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIHZvaWQgYWRkKFdhdGNoZXJzIG1hdGNoaW5nLCBBY2NvdW50UHJvamVjdFdhdGNoIHcpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBJZGVudGlmaWVkVXNlciB1c2VyID0KLSAgICAgICAgYXJncy5pZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGFyZ3MuZGIsIHcuZ2V0QWNjb3VudElkKCkpOwotICAgIENoYW5nZVF1ZXJ5QnVpbGRlciBxYiA9IGFyZ3MucXVlcnlCdWlsZGVyLmNyZWF0ZSh1c2VyKTsKLSAgICBQcmVkaWNhdGU8Q2hhbmdlRGF0YT4gcCA9IHFiLmlzX3Zpc2libGUoKTsKLSAgICBpZiAody5nZXRGaWx0ZXIoKSAhPSBudWxsKSB7Ci0gICAgICB0cnkgewotICAgICAgICBxYi5zZXRBbGxvd0ZpbGUodHJ1ZSk7Ci0gICAgICAgIHAgPSBQcmVkaWNhdGUuYW5kKHFiLnBhcnNlKHcuZ2V0RmlsdGVyKCkpLCBwKTsKLSAgICAgICAgcCA9IGFyZ3MucXVlcnlSZXdyaXRlci5nZXQoKS5yZXdyaXRlKHApOwotICAgICAgICBpZiAocC5tYXRjaChjaGFuZ2VEYXRhKSkgewotICAgICAgICAgIG1hdGNoaW5nLmFjY291bnRzLmFkZCh3LmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoUXVlcnlQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIElnbm9yZSBicm9rZW4gZmlsdGVyIGV4cHJlc3Npb25zLgotICAgICAgfQotICAgIH0gZWxzZSBpZiAocC5tYXRjaChjaGFuZ2VEYXRhKSkgewotICAgICAgbWF0Y2hpbmcuYWNjb3VudHMuYWRkKHcuZ2V0QWNjb3VudElkKCkpOwotICAgIH0KKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBmaW5hbCBXYXRjaGVycyBnZXRXYXRjaGVycyhOb3RpZnlUeXBlIHR5cGUpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIFByb2plY3RXYXRjaCB3YXRjaCA9IG5ldyBQcm9qZWN0V2F0Y2goYXJncywgcHJvamVjdCwgcHJvamVjdFN0YXRlLCBjaGFuZ2VEYXRhKTsKKyAgICByZXR1cm4gd2F0Y2guZ2V0V2F0Y2hlcnModHlwZSk7CiAgIH0KIAogICAvKiogQW55IHVzZXIgd2hvIGhhcyBwdWJsaXNoZWQgY29tbWVudHMgb24gdGhpcyBjaGFuZ2UuICovCkBAIC01MDksNyArMzQwLDYgQEAKIAogICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1Zpc2libGVUbyhmaW5hbCBBY2NvdW50LklkIHRvKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICByZXR1cm4gcHJvamVjdFN0YXRlID09IG51bGwKLSAgICAgICAgfHwgY2hhbmdlID09IG51bGwKICAgICAgICAgfHwgcHJvamVjdFN0YXRlLmNvbnRyb2xGb3IoYXJncy5pZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKHRvKSkKICAgICAgICAgICAgIC5jb250cm9sRm9yKGNoYW5nZSkuaXNWaXNpYmxlKGFyZ3MuZGIuZ2V0KCkpOwogICB9CkBAIC01MzksMTEgKzM2OSw1NCBAQAogICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoImNoYW5nZSIsIGNoYW5nZSk7CiAgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgiY2hhbmdlSWQiLCBjaGFuZ2UuZ2V0S2V5KCkpOwogICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoImNvdmVyTGV0dGVyIiwgZ2V0Q292ZXJMZXR0ZXIoKSk7Ci0gICAgdmVsb2NpdHlDb250ZXh0LnB1dCgiYnJhbmNoIiwgY2hhbmdlLmdldERlc3QoKSk7CiAgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgiZnJvbU5hbWUiLCBnZXROYW1lRm9yKGZyb21JZCkpOwotICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoInByb2plY3ROYW1lIiwgLy8KLSAgICAgICAgcHJvamVjdFN0YXRlICE9IG51bGwgPyBwcm9qZWN0U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSA6IG51bGwpOwogICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoInBhdGNoU2V0IiwgcGF0Y2hTZXQpOwogICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoInBhdGNoU2V0SW5mbyIsIHBhdGNoU2V0SW5mbyk7CiAgIH0KKworICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlRGlmZigpIHsKKyAgICByZXR1cm4gYXJncy5zZXR0aW5ncy5pbmNsdWRlRGlmZjsKKyAgfQorCisgIC8qKiBTaG93IHBhdGNoIHNldCBhcyB1bmlmaWVkIGRpZmZlcmVuY2UuICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0VW5pZmllZERpZmYoKSB7CisgICAgUGF0Y2hMaXN0IHBhdGNoTGlzdDsKKyAgICB0cnkgeworICAgICAgcGF0Y2hMaXN0ID0gZ2V0UGF0Y2hMaXN0KCk7CisgICAgICBpZiAocGF0Y2hMaXN0LmdldE9sZElkKCkgPT0gbnVsbCkgeworICAgICAgICAvLyBPY3RvcHVzIG1lcmdlcyBhcmUgbm90IHdlbGwgc3VwcG9ydGVkIGZvciBkaWZmIG91dHB1dCBieSBHZXJyaXQuCisgICAgICAgIC8vIEN1cnJlbnRseSB0aGVzZSBhbHdheXMgaGF2ZSBhIG51bGwgb2xkSWQgaW4gdGhlIFBhdGNoTGlzdC4KKyAgICAgICAgcmV0dXJuICJbT2N0b3B1cyBtZXJnZTsgY2Fubm90IGJlIGZvcm1hdHRlZCBhcyBhIGRpZmYuXVxuIjsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChQYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgeworICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZm9ybWF0IHBhdGNoIiwgZSk7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYnVmID0KKyAgICAgICAgbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKGFyZ3Muc2V0dGluZ3MubWF4aW11bURpZmZTaXplKTsKKyAgICBEaWZmRm9ybWF0dGVyIGZtdCA9IG5ldyBEaWZmRm9ybWF0dGVyKGJ1Zik7CisgICAgUmVwb3NpdG9yeSBnaXQ7CisgICAgdHJ5IHsKKyAgICAgIGdpdCA9IGFyZ3Muc2VydmVyLm9wZW5SZXBvc2l0b3J5KGNoYW5nZS5nZXRQcm9qZWN0KCkpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IG9wZW4gcmVwb3NpdG9yeSB0byBmb3JtYXQgcGF0Y2giLCBlKTsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIGZtdC5zZXRSZXBvc2l0b3J5KGdpdCk7CisgICAgICBmbXQuc2V0RGV0ZWN0UmVuYW1lcyh0cnVlKTsKKyAgICAgIGZtdC5mb3JtYXQocGF0Y2hMaXN0LmdldE9sZElkKCksIHBhdGNoTGlzdC5nZXROZXdJZCgpKTsKKyAgICAgIHJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShidWYudG9CeXRlQXJyYXkoKSk7CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgaWYgKEpHaXRUZXh0LmdldCgpLmluTWVtb3J5QnVmZmVyTGltaXRFeGNlZWRlZC5lcXVhbHMoZS5nZXRNZXNzYWdlKCkpKSB7CisgICAgICAgIHJldHVybiAiIjsKKyAgICAgIH0KKyAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGZvcm1hdCBwYXRjaCIsIGUpOworICAgICAgcmV0dXJuICIiOworICAgIH0gZmluYWxseSB7CisgICAgICBmbXQucmVsZWFzZSgpOworICAgICAgZ2l0LmNsb3NlKCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1lbnRTZW5kZXIuamF2YQppbmRleCBlN2NjMWZmLi5iMTZhYjJhIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50U2VuZGVyLmphdmEKQEAgLTE0LDExICsxNCwxMiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaExpbmVDb21tZW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUG9zdFJldmlldy5Ob3RpZnlIYW5kbGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hGaWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbjsKQEAgLTM3LDE1ICszOCwxOCBAQAogLyoqIFNlbmQgY29tbWVudHMsIGFmdGVyIHRoZSBhdXRob3Igb2YgdGhlbSBoaXQgdXNlZCBQdWJsaXNoIENvbW1lbnRzIGluIHRoZSBVSS4gKi8KIHB1YmxpYyBjbGFzcyBDb21tZW50U2VuZGVyIGV4dGVuZHMgUmVwbHlUb0NoYW5nZVNlbmRlciB7CiAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIHB1YmxpYyBDb21tZW50U2VuZGVyIGNyZWF0ZShDaGFuZ2UgY2hhbmdlKTsKKyAgICBwdWJsaWMgQ29tbWVudFNlbmRlciBjcmVhdGUoTm90aWZ5SGFuZGxpbmcgbm90aWZ5LCBDaGFuZ2UgY2hhbmdlKTsKICAgfQogCisgIHByaXZhdGUgZmluYWwgTm90aWZ5SGFuZGxpbmcgbm90aWZ5OwogICBwcml2YXRlIExpc3Q8UGF0Y2hMaW5lQ29tbWVudD4gaW5saW5lQ29tbWVudHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKIAogICBASW5qZWN0CiAgIHB1YmxpYyBDb21tZW50U2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLAotICAgICAgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsIEBBc3Npc3RlZCBDaGFuZ2UgYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBjLCAiY29tbWVudCIpOworICAgICAgQEFzc2lzdGVkIE5vdGlmeUhhbmRsaW5nIG5vdGlmeSwKKyAgICAgIEBBc3Npc3RlZCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjLCAiY29tbWVudCIpOworICAgIHRoaXMubm90aWZ5ID0gbm90aWZ5OwogICB9CiAKICAgcHVibGljIHZvaWQgc2V0UGF0Y2hMaW5lQ29tbWVudHMoZmluYWwgTGlzdDxQYXRjaExpbmVDb21tZW50PiBwbGMpIHsKQEAgLTY3LDkgKzcxLDEzIEBACiAgIHByb3RlY3RlZCB2b2lkIGluaXQoKSB0aHJvd3MgRW1haWxFeGNlcHRpb24gewogICAgIHN1cGVyLmluaXQoKTsKIAotICAgIGNjQWxsQXBwcm92YWxzKCk7Ci0gICAgYmNjU3RhcnJlZEJ5KCk7Ci0gICAgYmNjV2F0Y2hlcyhOb3RpZnlUeXBlLkFMTF9DT01NRU5UUyk7CisgICAgaWYgKG5vdGlmeS5jb21wYXJlVG8oTm90aWZ5SGFuZGxpbmcuT1dORVJfUkVWSUVXRVJTKSA+PSAwKSB7CisgICAgICBjY0FsbEFwcHJvdmFscygpOworICAgIH0KKyAgICBpZiAobm90aWZ5LmNvbXBhcmVUbyhOb3RpZnlIYW5kbGluZy5BTEwpID49IDApIHsKKyAgICAgIGJjY1N0YXJyZWRCeSgpOworICAgICAgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKKyAgICB9CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTc3LDYgKzg1LDE1IEBACiAgICAgYXBwZW5kVGV4dCh2ZWxvY2lmeUZpbGUoIkNvbW1lbnQudm0iKSk7CiAgIH0KIAorICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgZm9ybWF0Rm9vdGVyKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKKyAgICBhcHBlbmRUZXh0KHZlbG9jaWZ5RmlsZSgiQ29tbWVudEZvb3Rlci52bSIpKTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGhhc0lubGluZUNvbW1lbnRzKCkgeworICAgIHJldHVybiAhaW5saW5lQ29tbWVudHMuaXNFbXB0eSgpOworICB9CisKICAgcHVibGljIFN0cmluZyBnZXRJbmxpbmVDb21tZW50cygpIHsKICAgICByZXR1cm4gZ2V0SW5saW5lQ29tbWVudHMoMSk7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21taXRNZXNzYWdlRWRpdGVkU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODhmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CisKK3B1YmxpYyBjbGFzcyBDb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyIGV4dGVuZHMgUmVwbGFjZVBhdGNoU2V0U2VuZGVyIHsKKyAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgQ29tbWl0TWVzc2FnZUVkaXRlZFNlbmRlciBjcmVhdGUoQ2hhbmdlIGNoYW5nZSk7CisgIH0KKworICBASW5qZWN0CisgIHB1YmxpYyBDb21taXRNZXNzYWdlRWRpdGVkU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKKyAgICBzdXBlcihlYSwgYyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hhbmdlKCkgdGhyb3dzIEVtYWlsRXhjZXB0aW9uIHsKKyAgICBhcHBlbmRUZXh0KHZlbG9jaWZ5RmlsZSgiQ29tbWl0TWVzc2FnZUVkaXRlZC52bSIpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NyZWF0ZUNoYW5nZVNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NyZWF0ZUNoYW5nZVNlbmRlci5qYXZhCmluZGV4IDliODJjNzEuLjNjOWYzOWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DcmVhdGVDaGFuZ2VTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ3JlYXRlQ2hhbmdlU2VuZGVyLmphdmEKQEAgLTE0LDExICsxNCwxMiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoSW5mbzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5Qcm9qZWN0V2F0Y2guV2F0Y2hlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CkBAIC0zNiwxMCArMzcsOCBAQAogICB9CiAKICAgQEluamVjdAotICBwdWJsaWMgQ3JlYXRlQ2hhbmdlU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLAotICAgICAgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsIFNzaEluZm8gc3NoSW5mbywKLSAgICAgIEBBc3Npc3RlZCBDaGFuZ2UgYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBzc2hJbmZvLCBjKTsKKyAgcHVibGljIENyZWF0ZUNoYW5nZVNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC00NywzMSArNDYsMzMgQEAKICAgICBzdXBlci5pbml0KCk7CiAKICAgICB0cnkgewotICAgICAgLy8gQkNDIGFueW9uZSB3aG8gaGFzIGludGVyZXN0IGluIHRoaXMgcHJvamVjdCdzIGNoYW5nZXMKLSAgICAgIC8vIFRyeSB0byBtYXJrIGludGVyZXN0ZWQgb3duZXJzIHdpdGggYSBUTyBhbmQgbm90IGEgQkNDIGxpbmUuCi0gICAgICAvLwotICAgICAgV2F0Y2hlcnMgbWF0Y2hpbmcgPSBnZXRXYXRjaGVzKE5vdGlmeVR5cGUuTkVXX0NIQU5HRVMpOwotICAgICAgZm9yIChBY2NvdW50LklkIHVzZXIgOiBtYXRjaGluZy5hY2NvdW50cykgeworICAgICAgLy8gVHJ5IHRvIG1hcmsgaW50ZXJlc3RlZCBvd25lcnMgd2l0aCBUTyBhbmQgQ0Mgb3IgQkNDIGxpbmUuCisgICAgICBXYXRjaGVycyBtYXRjaGluZyA9IGdldFdhdGNoZXJzKE5vdGlmeVR5cGUuTkVXX0NIQU5HRVMpOworICAgICAgZm9yIChBY2NvdW50LklkIHVzZXIgOiBJdGVyYWJsZXMuY29uY2F0KAorICAgICAgICAgIG1hdGNoaW5nLnRvLmFjY291bnRzLAorICAgICAgICAgIG1hdGNoaW5nLmNjLmFjY291bnRzLAorICAgICAgICAgIG1hdGNoaW5nLmJjYy5hY2NvdW50cykpIHsKICAgICAgICAgaWYgKGlzT3duZXJPZlByb2plY3RPckJyYW5jaCh1c2VyKSkgewogICAgICAgICAgIGFkZChSZWNpcGllbnRUeXBlLlRPLCB1c2VyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBhZGQoUmVjaXBpZW50VHlwZS5CQ0MsIHVzZXIpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBmb3IgKEFkZHJlc3MgYWRkciA6IG1hdGNoaW5nLmVtYWlscykgewotICAgICAgICBhZGQoUmVjaXBpZW50VHlwZS5CQ0MsIGFkZHIpOwotICAgICAgfQorCisgICAgICAvLyBBZGQgZXZlcnlvbmUgZWxzZS4gT3duZXJzIGFkZGVkIGFib3ZlIHdpbGwgbm90IGJlIGR1cGxpY2F0ZWQuCisgICAgICBhZGQoUmVjaXBpZW50VHlwZS5UTywgbWF0Y2hpbmcudG8pOworICAgICAgYWRkKFJlY2lwaWVudFR5cGUuQ0MsIG1hdGNoaW5nLmNjKTsKKyAgICAgIGFkZChSZWNpcGllbnRUeXBlLkJDQywgbWF0Y2hpbmcuYmNjKTsKICAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CiAgICAgICAvLyBKdXN0IGRvbid0IENDIGV2ZXJ5b25lLiBCZXR0ZXIgdG8gc2VuZCBhIHBhcnRpYWwgbWVzc2FnZSB0byB0aG9zZQogICAgICAgLy8gd2UgYWxyZWFkeSBoYXZlIHF1ZXVlZCB1cCB0aGVuIHRvIGZhaWwgZGVsaXZlciBlbnRpcmVseSB0byBwZW9wbGUKICAgICAgIC8vIHdobyBoYXZlIGEgbG93ZXIgaW50ZXJlc3QgaW4gdGhlIGNoYW5nZS4KLSAgICAgIGxvZy53YXJuKCJDYW5ub3QgQkNDIHdhdGNoZXJzIGZvciBuZXcgY2hhbmdlIiwgZXJyKTsKKyAgICAgIGxvZy53YXJuKCJDYW5ub3Qgbm90aWZ5IHdhdGNoZXJzIGZvciBuZXcgY2hhbmdlIiwgZXJyKTsKICAgICB9CisKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5ORVdfUEFUQ0hTRVRTKTsKICAgfQogCiAgIHByaXZhdGUgYm9vbGVhbiBpc093bmVyT2ZQcm9qZWN0T3JCcmFuY2goQWNjb3VudC5JZCB1c2VyKSB7CiAgICAgcmV0dXJuIHByb2plY3RTdGF0ZSAhPSBudWxsCi0gICAgICAgICYmIGNoYW5nZSAhPSBudWxsCiAgICAgICAgICYmIHByb2plY3RTdGF0ZS5jb250cm9sRm9yKGFyZ3MuaWRlbnRpZmllZFVzZXJGYWN0b3J5LmNyZWF0ZSh1c2VyKSkKICAgICAgICAgICAuY29udHJvbEZvclJlZihjaGFuZ2UuZ2V0RGVzdCgpKQogICAgICAgICAgIC5pc093bmVyKCk7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxBcmd1bWVudHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbEFyZ3VtZW50cy5qYXZhCmluZGV4IGU2ZWRhODIuLjNlNTAyODMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbEFyZ3VtZW50cy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbEFyZ3VtZW50cy5qYXZhCkBAIC0yMSw3ICsyMSw5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkNhcGFiaWxpdHlDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQmFja2VuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cEluY2x1ZGVDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0Q2FjaGU7CkBAIC0yOSwxNyArMzEsMjEgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VRdWVyeUJ1aWxkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VRdWVyeVJld3JpdGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoQWR2ZXJ0aXNlZEFkZHJlc3NlczsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LnJ1bnRpbWUuUnVudGltZUluc3RhbmNlOwogCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBjbGFzcyBFbWFpbEFyZ3VtZW50cyB7CiAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHNlcnZlcjsKICAgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZTsKICAgZmluYWwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZDsKKyAgZmluYWwgR3JvdXBJbmNsdWRlQ2FjaGUgZ3JvdXBJbmNsdWRlczsKICAgZmluYWwgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZTsKICAgZmluYWwgUGF0Y2hMaXN0Q2FjaGUgcGF0Y2hMaXN0Q2FjaGU7CiAgIGZpbmFsIEZyb21BZGRyZXNzR2VuZXJhdG9yIGZyb21BZGRyZXNzR2VuZXJhdG9yOwpAQCAtNDgsOCArNTQsMTAgQEAKICAgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OwogICBmaW5hbCBDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeTsKICAgZmluYWwgQW5vbnltb3VzVXNlciBhbm9ueW1vdXNVc2VyOworICBmaW5hbCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZTsKICAgZmluYWwgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlcjsKICAgZmluYWwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZTsKKyAgZmluYWwgTGlzdDxTdHJpbmc+IHNzaEFkZHJlc3NlczsKIAogICBmaW5hbCBDaGFuZ2VRdWVyeUJ1aWxkZXIuRmFjdG9yeSBxdWVyeUJ1aWxkZXI7CiAgIGZpbmFsIFByb3ZpZGVyPENoYW5nZVF1ZXJ5UmV3cml0ZXI+IHF1ZXJ5UmV3cml0ZXI7CkBAIC01OSwyMSArNjcsMjUgQEAKIAogICBASW5qZWN0CiAgIEVtYWlsQXJndW1lbnRzKEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHNlcnZlciwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZSwKLSAgICAgIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQsIEFjY291bnRDYWNoZSBhY2NvdW50Q2FjaGUsCisgICAgICBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLCBHcm91cEluY2x1ZGVDYWNoZSBncm91cEluY2x1ZGVzLAorICAgICAgQWNjb3VudENhY2hlIGFjY291bnRDYWNoZSwKICAgICAgIFBhdGNoTGlzdENhY2hlIHBhdGNoTGlzdENhY2hlLCBGcm9tQWRkcmVzc0dlbmVyYXRvciBmcm9tQWRkcmVzc0dlbmVyYXRvciwKICAgICAgIEVtYWlsU2VuZGVyIGVtYWlsU2VuZGVyLCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3RvcnksCiAgICAgICBHZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3RvcnksCiAgICAgICBDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKICAgICAgIEFub255bW91c1VzZXIgYW5vbnltb3VzVXNlciwKKyAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLAogICAgICAgQENhbm9uaWNhbFdlYlVybCBATnVsbGFibGUgUHJvdmlkZXI8U3RyaW5nPiB1cmxQcm92aWRlciwKICAgICAgIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWUsCiAgICAgICBDaGFuZ2VRdWVyeUJ1aWxkZXIuRmFjdG9yeSBxdWVyeUJ1aWxkZXIsCiAgICAgICBQcm92aWRlcjxDaGFuZ2VRdWVyeVJld3JpdGVyPiBxdWVyeVJld3JpdGVyLCBQcm92aWRlcjxSZXZpZXdEYj4gZGIsCiAgICAgICBSdW50aW1lSW5zdGFuY2UgdmVsb2NpdHlSdW50aW1lLAotICAgICAgRW1haWxTZXR0aW5ncyBzZXR0aW5ncykgeworICAgICAgRW1haWxTZXR0aW5ncyBzZXR0aW5ncywKKyAgICAgIEBTc2hBZHZlcnRpc2VkQWRkcmVzc2VzIExpc3Q8U3RyaW5nPiBzc2hBZGRyZXNzZXMpIHsKICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKICAgICB0aGlzLnByb2plY3RDYWNoZSA9IHByb2plY3RDYWNoZTsKICAgICB0aGlzLmdyb3VwQmFja2VuZCA9IGdyb3VwQmFja2VuZDsKKyAgICB0aGlzLmdyb3VwSW5jbHVkZXMgPSBncm91cEluY2x1ZGVzOwogICAgIHRoaXMuYWNjb3VudENhY2hlID0gYWNjb3VudENhY2hlOwogICAgIHRoaXMucGF0Y2hMaXN0Q2FjaGUgPSBwYXRjaExpc3RDYWNoZTsKICAgICB0aGlzLmZyb21BZGRyZXNzR2VuZXJhdG9yID0gZnJvbUFkZHJlc3NHZW5lcmF0b3I7CkBAIC04Miw2ICs5NCw3IEBACiAgICAgdGhpcy5pZGVudGlmaWVkVXNlckZhY3RvcnkgPSBpZGVudGlmaWVkVXNlckZhY3Rvcnk7CiAgICAgdGhpcy5jYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkgPSBjYXBhYmlsaXR5Q29udHJvbEZhY3Rvcnk7CiAgICAgdGhpcy5hbm9ueW1vdXNVc2VyID0gYW5vbnltb3VzVXNlcjsKKyAgICB0aGlzLmFub255bW91c0Nvd2FyZE5hbWUgPSBhbm9ueW1vdXNDb3dhcmROYW1lOwogICAgIHRoaXMudXJsUHJvdmlkZXIgPSB1cmxQcm92aWRlcjsKICAgICB0aGlzLmFsbFByb2plY3RzTmFtZSA9IGFsbFByb2plY3RzTmFtZTsKICAgICB0aGlzLnF1ZXJ5QnVpbGRlciA9IHF1ZXJ5QnVpbGRlcjsKQEAgLTg5LDUgKzEwMiw2IEBACiAgICAgdGhpcy5kYiA9IGRiOwogICAgIHRoaXMudmVsb2NpdHlSdW50aW1lID0gdmVsb2NpdHlSdW50aW1lOwogICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsKKyAgICB0aGlzLnNzaEFkZHJlc3NlcyA9IHNzaEFkZHJlc3NlczsKICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsRXhjZXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMzY2I2My4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKLQotcHVibGljIGNsYXNzIEVtYWlsRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgcHVibGljIEVtYWlsRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLSAgICBzdXBlcihtc2cpOwotICB9Ci0KLSAgcHVibGljIEVtYWlsRXhjZXB0aW9uKFN0cmluZyBtc2csIFRocm93YWJsZSB3aHkpIHsKLSAgICBzdXBlcihtc2csIHdoeSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbE1vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwZjUzOAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9FbWFpbE1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuRmFjdG9yeU1vZHVsZTsKKworcHVibGljIGNsYXNzIEVtYWlsTW9kdWxlIGV4dGVuZHMgRmFjdG9yeU1vZHVsZSB7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgZmFjdG9yeShBYmFuZG9uZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShDb21tZW50U2VuZGVyLkZhY3RvcnkuY2xhc3MpOworICAgIGZhY3RvcnkoUmV2ZXJ0ZWRTZW5kZXIuRmFjdG9yeS5jbGFzcyk7CisgICAgZmFjdG9yeShSZXN0b3JlZFNlbmRlci5GYWN0b3J5LmNsYXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0VtYWlsU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxTZW5kZXIuamF2YQppbmRleCA5YzRmNGM0Li5hN2ExMDI4IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRW1haWxTZW5kZXIuamF2YQpAQCAtMTQsNiArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKKwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Gcm9tQWRkcmVzc0dlbmVyYXRvclByb3ZpZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRnJvbUFkZHJlc3NHZW5lcmF0b3JQcm92aWRlci5qYXZhCmluZGV4IDg2Y2ViZGMuLjk5OGZjM2IgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Gcm9tQWRkcmVzc0dlbmVyYXRvclByb3ZpZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0Zyb21BZGRyZXNzR2VuZXJhdG9yUHJvdmlkZXIuamF2YQpAQCAtOTgsMTAgKzk4LDExIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFkZHJlc3MgZnJvbShmaW5hbCBBY2NvdW50LklkIGZyb21JZCkgewogICAgICAgaWYgKGZyb21JZCAhPSBudWxsKSB7Ci0gICAgICAgIGZpbmFsIEFjY291bnQgYSA9IGFjY291bnRDYWNoZS5nZXQoZnJvbUlkKS5nZXRBY2NvdW50KCk7Ci0gICAgICAgIGlmIChhLmdldFByZWZlcnJlZEVtYWlsKCkgIT0gbnVsbCkgewotICAgICAgICAgIHJldHVybiBuZXcgQWRkcmVzcyhhLmdldEZ1bGxOYW1lKCksIGEuZ2V0UHJlZmVycmVkRW1haWwoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgQWNjb3VudCBhID0gYWNjb3VudENhY2hlLmdldChmcm9tSWQpLmdldEFjY291bnQoKTsKKyAgICAgICAgU3RyaW5nIHVzZXJFbWFpbCA9IGEuZ2V0UHJlZmVycmVkRW1haWwoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzKAorICAgICAgICAgICAgYS5nZXRGdWxsTmFtZSgpLAorICAgICAgICAgICAgdXNlckVtYWlsICE9IG51bGwgPyB1c2VyRW1haWwgOiBzcnZBZGRyLmdldEVtYWlsKCkpOwogICAgICAgfQogICAgICAgcmV0dXJuIHNydkFkZHI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01haWxVdGlsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWFpbFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjJjNmU0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01haWxVdGlsLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm9TdWNoQWNjb3VudEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9vdGVyS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5Gb290ZXJMaW5lOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK3B1YmxpYyBjbGFzcyBNYWlsVXRpbCB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBSRVZJRVdFRF9CWSA9IG5ldyBGb290ZXJLZXkoIlJldmlld2VkLWJ5Iik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvb3RlcktleSBURVNURURfQlkgPSBuZXcgRm9vdGVyS2V5KCJUZXN0ZWQtYnkiKTsKKworICBwdWJsaWMgc3RhdGljIE1haWxSZWNpcGllbnRzIGdldFJlY2lwaWVudHNGcm9tRm9vdGVycygKKyAgICAgIGZpbmFsIEFjY291bnRSZXNvbHZlciBhY2NvdW50UmVzb2x2ZXIsIGZpbmFsIFBhdGNoU2V0IHBzLAorICAgICAgZmluYWwgTGlzdDxGb290ZXJMaW5lPiBmb290ZXJMaW5lcykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgZmluYWwgTWFpbFJlY2lwaWVudHMgcmVjaXBpZW50cyA9IG5ldyBNYWlsUmVjaXBpZW50cygpOworICAgIGlmICghcHMuaXNEcmFmdCgpKSB7CisgICAgICBmb3IgKGZpbmFsIEZvb3RlckxpbmUgZm9vdGVyTGluZSA6IGZvb3RlckxpbmVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaWYgKGlzUmV2aWV3ZXIoZm9vdGVyTGluZSkpIHsKKyAgICAgICAgICAgIHJlY2lwaWVudHMucmV2aWV3ZXJzLmFkZCh0b0FjY291bnRJZChhY2NvdW50UmVzb2x2ZXIsIGZvb3RlckxpbmUKKyAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKS50cmltKCkpKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGZvb3RlckxpbmUubWF0Y2hlcyhGb290ZXJLZXkuQ0MpKSB7CisgICAgICAgICAgICByZWNpcGllbnRzLmNjLmFkZCh0b0FjY291bnRJZChhY2NvdW50UmVzb2x2ZXIsIGZvb3RlckxpbmUKKyAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKS50cmltKCkpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFjY291bnRFeGNlcHRpb24gZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWNpcGllbnRzOworICB9CisKKyAgcHVibGljIHN0YXRpYyBNYWlsUmVjaXBpZW50cyBnZXRSZWNpcGllbnRzRnJvbUFwcHJvdmFscygKKyAgICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKSB7CisgICAgZmluYWwgTWFpbFJlY2lwaWVudHMgcmVjaXBpZW50cyA9IG5ldyBNYWlsUmVjaXBpZW50cygpOworICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYXBwcm92YWxzKSB7CisgICAgICBpZiAoYS5nZXRWYWx1ZSgpICE9IDApIHsKKyAgICAgICAgcmVjaXBpZW50cy5yZXZpZXdlcnMuYWRkKGEuZ2V0QWNjb3VudElkKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjaXBpZW50cy5jYy5hZGQoYS5nZXRBY2NvdW50SWQoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZWNpcGllbnRzOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgQWNjb3VudC5JZCB0b0FjY291bnRJZChmaW5hbCBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyLAorICAgICAgZmluYWwgU3RyaW5nIG5hbWVPckVtYWlsKSB0aHJvd3MgT3JtRXhjZXB0aW9uLCBOb1N1Y2hBY2NvdW50RXhjZXB0aW9uIHsKKyAgICBmaW5hbCBBY2NvdW50IGEgPSBhY2NvdW50UmVzb2x2ZXIuZmluZEJ5TmFtZU9yRW1haWwobmFtZU9yRW1haWwpOworICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hBY2NvdW50RXhjZXB0aW9uKCJcIiIgKyBuYW1lT3JFbWFpbAorICAgICAgICAgICsgIlwiIGlzIG5vdCByZWdpc3RlcmVkIik7CisgICAgfQorICAgIHJldHVybiBhLmdldElkKCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUmV2aWV3ZXIoZmluYWwgRm9vdGVyTGluZSBjYW5kaWRhdGVGb290ZXJMaW5lKSB7CisgICAgcmV0dXJuIGNhbmRpZGF0ZUZvb3RlckxpbmUubWF0Y2hlcyhGb290ZXJLZXkuU0lHTkVEX09GRl9CWSkKKyAgICAgICAgfHwgY2FuZGlkYXRlRm9vdGVyTGluZS5tYXRjaGVzKEZvb3RlcktleS5BQ0tFRF9CWSkKKyAgICAgICAgfHwgY2FuZGlkYXRlRm9vdGVyTGluZS5tYXRjaGVzKFJFVklFV0VEX0JZKQorICAgICAgICB8fCBjYW5kaWRhdGVGb290ZXJMaW5lLm1hdGNoZXMoVEVTVEVEX0JZKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFpbFJlY2lwaWVudHMgeworICAgIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnQuSWQ+IHJldmlld2VyczsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50LklkPiBjYzsKKworICAgIHB1YmxpYyBNYWlsUmVjaXBpZW50cygpIHsKKyAgICAgIHRoaXMucmV2aWV3ZXJzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKKyAgICAgIHRoaXMuY2MgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOworICAgIH0KKworICAgIHB1YmxpYyBNYWlsUmVjaXBpZW50cyhmaW5hbCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJzLAorICAgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gY2MpIHsKKyAgICAgIHRoaXMucmV2aWV3ZXJzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4ocmV2aWV3ZXJzKTsKKyAgICAgIHRoaXMuY2MgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPihjYyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKGZpbmFsIE1haWxSZWNpcGllbnRzIHJlY2lwaWVudHMpIHsKKyAgICAgIHJldmlld2Vycy5hZGRBbGwocmVjaXBpZW50cy5yZXZpZXdlcnMpOworICAgICAgY2MuYWRkQWxsKHJlY2lwaWVudHMuY2MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShmaW5hbCBBY2NvdW50LklkIHRvUmVtb3ZlKSB7CisgICAgICByZXZpZXdlcnMucmVtb3ZlKHRvUmVtb3ZlKTsKKyAgICAgIGNjLnJlbW92ZSh0b1JlbW92ZSk7CisgICAgfQorCisgICAgcHVibGljIFNldDxBY2NvdW50LklkPiBnZXRSZXZpZXdlcnMoKSB7CisgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHJldmlld2Vycyk7CisgICAgfQorCisgICAgcHVibGljIFNldDxBY2NvdW50LklkPiBnZXRDY09ubHkoKSB7CisgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gY2MgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPih0aGlzLmNjKTsKKyAgICAgIGNjLnJlbW92ZUFsbChyZXZpZXdlcnMpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChjYyk7CisgICAgfQorCisgICAgcHVibGljIFNldDxBY2NvdW50LklkPiBnZXRBbGwoKSB7CisgICAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gYWxsID0KKyAgICAgICAgICBuZXcgSGFzaFNldDxBY2NvdW50LklkPihyZXZpZXdlcnMuc2l6ZSgpICsgY2Muc2l6ZSgpKTsKKyAgICAgIGFsbC5hZGRBbGwocmV2aWV3ZXJzKTsKKyAgICAgIGFsbC5hZGRBbGwoY2MpOworICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChhbGwpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlRmFpbFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlRmFpbFNlbmRlci5qYXZhCmluZGV4IGI2OTVmYjQuLjNhNWY3ZWIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9NZXJnZUZhaWxTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VGYWlsU2VuZGVyLmphdmEKQEAgLTE0LDggKzE0LDggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC0yNiw5ICsyNiw4IEBACiAgIH0KIAogICBASW5qZWN0Ci0gIHB1YmxpYyBNZXJnZUZhaWxTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsIGMsICJtZXJnZS1mYWlsZWQiKTsKKyAgcHVibGljIE1lcmdlRmFpbFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMsICJtZXJnZS1mYWlsZWQiKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlZFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlZFNlbmRlci5qYXZhCmluZGV4IDcwYjJkN2YuLjM3ZDgwMGQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9NZXJnZWRTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VkU2VuZGVyLmphdmEKQEAgLTE0LDM2ICsxNCwzMiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoQmFzZWRUYWJsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlRhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KIC8qKiBTZW5kIG5vdGljZSBhYm91dCBhIGNoYW5nZSBzdWNjZXNzZnVsbHkgbWVyZ2VkLiAqLwogcHVibGljIGNsYXNzIE1lcmdlZFNlbmRlciBleHRlbmRzIFJlcGx5VG9DaGFuZ2VTZW5kZXIgewogICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBwdWJsaWMgTWVyZ2VkU2VuZGVyIGNyZWF0ZShDaGFuZ2UgY2hhbmdlKTsKKyAgICBwdWJsaWMgTWVyZ2VkU2VuZGVyIGNyZWF0ZShDaGFuZ2VDb250cm9sIGNoYW5nZSk7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKKyAgcHJpdmF0ZSBmaW5hbCBMYWJlbFR5cGVzIGxhYmVsVHlwZXM7CiAKICAgQEluamVjdAotICBwdWJsaWMgTWVyZ2VkU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLAotICAgICAgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsIEFwcHJvdmFsVHlwZXMgYXQsCi0gICAgICBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgYywgIm1lcmdlZCIpOwotICAgIGFwcHJvdmFsVHlwZXMgPSBhdDsKKyAgcHVibGljIE1lcmdlZFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZUNvbnRyb2wgYykgeworICAgIHN1cGVyKGVhLCBjLmdldENoYW5nZSgpLCAibWVyZ2VkIik7CisgICAgbGFiZWxUeXBlcyA9IGMuZ2V0TGFiZWxUeXBlcygpOwogICB9CiAKICAgQE92ZXJyaWRlCkBAIC01Miw4ICs0OCw4IEBACiAKICAgICBjY0FsbEFwcHJvdmFscygpOwogICAgIGJjY1N0YXJyZWRCeSgpOwotICAgIGJjY1dhdGNoZXMoTm90aWZ5VHlwZS5BTExfQ09NTUVOVFMpOwotICAgIGJjY1dhdGNoZXMoTm90aWZ5VHlwZS5TVUJNSVRURURfQ0hBTkdFUyk7CisgICAgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKKyAgICBpbmNsdWRlV2F0Y2hlcnMoTm90aWZ5VHlwZS5TVUJNSVRURURfQ0hBTkdFUyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTYzLDE4ICs1OSwxOCBAQAogCiAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwcm92YWxzKCkgewogICAgIHRyeSB7Ci0gICAgICBmaW5hbCBNYXA8QWNjb3VudC5JZCwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+PiBwb3MgPQotICAgICAgICAgIG5ldyBIYXNoTWFwPEFjY291bnQuSWQsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPj4oKTsKLQotICAgICAgZmluYWwgTWFwPEFjY291bnQuSWQsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPj4gbmVnID0KLSAgICAgICAgICBuZXcgSGFzaE1hcDxBY2NvdW50LklkLCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4+KCk7Ci0KKyAgICAgIFRhYmxlPEFjY291bnQuSWQsIFN0cmluZywgUGF0Y2hTZXRBcHByb3ZhbD4gcG9zID0gSGFzaEJhc2VkVGFibGUuY3JlYXRlKCk7CisgICAgICBUYWJsZTxBY2NvdW50LklkLCBTdHJpbmcsIFBhdGNoU2V0QXBwcm92YWw+IG5lZyA9IEhhc2hCYXNlZFRhYmxlLmNyZWF0ZSgpOwogICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGNhIDogYXJncy5kYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpCiAgICAgICAgICAgLmJ5UGF0Y2hTZXQocGF0Y2hTZXQuZ2V0SWQoKSkpIHsKKyAgICAgICAgTGFiZWxUeXBlIGx0ID0gbGFiZWxUeXBlcy5ieUxhYmVsKGNhLmdldExhYmVsSWQoKSk7CisgICAgICAgIGlmIChsdCA9PSBudWxsKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgaWYgKGNhLmdldFZhbHVlKCkgPiAwKSB7Ci0gICAgICAgICAgaW5zZXJ0KHBvcywgY2EpOworICAgICAgICAgIHBvcy5wdXQoY2EuZ2V0QWNjb3VudElkKCksIGx0LmdldE5hbWUoKSwgY2EpOwogICAgICAgICB9IGVsc2UgaWYgKGNhLmdldFZhbHVlKCkgPCAwKSB7Ci0gICAgICAgICAgaW5zZXJ0KG5lZywgY2EpOworICAgICAgICAgIG5lZy5wdXQoY2EuZ2V0QWNjb3VudElkKCksIGx0LmdldE5hbWUoKSwgY2EpOwogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTg1LDIyICs4MSwyMCBAQAogICAgIHJldHVybiAiIjsKICAgfQogCi0gIHByaXZhdGUgU3RyaW5nIGZvcm1hdChmaW5hbCBTdHJpbmcgdHlwZSwKLSAgICAgIGZpbmFsIE1hcDxBY2NvdW50LklkLCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4+IGxpc3QpIHsKKyAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KFN0cmluZyB0eXBlLAorICAgICAgVGFibGU8QWNjb3VudC5JZCwgU3RyaW5nLCBQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMpIHsKICAgICBTdHJpbmdCdWlsZGVyIHR4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7CisgICAgaWYgKGFwcHJvdmFscy5pc0VtcHR5KCkpIHsKICAgICAgIHJldHVybiAiIjsKICAgICB9Ci0gICAgdHh0LmFwcGVuZCh0eXBlICsgIjpcbiIpOwotICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEFjY291bnQuSWQsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPj4gZW50IDogbGlzdAotICAgICAgICAuZW50cnlTZXQoKSkgewotICAgICAgZmluYWwgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+IGwgPSBlbnQuZ2V0VmFsdWUoKTsKKyAgICB0eHQuYXBwZW5kKHR5cGUpLmFwcGVuZCgiOlxuIik7CisgICAgZm9yIChBY2NvdW50LklkIGlkIDogYXBwcm92YWxzLnJvd0tleVNldCgpKSB7CiAgICAgICB0eHQuYXBwZW5kKCIgICIpOwotICAgICAgdHh0LmFwcGVuZChnZXROYW1lRm9yKGVudC5nZXRLZXkoKSkpOworICAgICAgdHh0LmFwcGVuZChnZXROYW1lRm9yKGlkKSk7CiAgICAgICB0eHQuYXBwZW5kKCI6ICIpOwogICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICBmb3IgKEFwcHJvdmFsVHlwZSBhdCA6IGFwcHJvdmFsVHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpKSB7Ci0gICAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2EgPSBsLmdldChhdC5nZXRDYXRlZ29yeSgpLmdldElkKCkpOworICAgICAgZm9yIChMYWJlbFR5cGUgbHQgOiBsYWJlbFR5cGVzLmdldExhYmVsVHlwZXMoKSkgeworICAgICAgICBQYXRjaFNldEFwcHJvdmFsIGNhID0gYXBwcm92YWxzLmdldChpZCwgbHQuZ2V0TmFtZSgpKTsKICAgICAgICAgaWYgKGNhID09IG51bGwpIHsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMTExLDMyICsxMDUsMTggQEAKICAgICAgICAgICB0eHQuYXBwZW5kKCI7ICIpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIHYgPSBhdC5nZXRWYWx1ZShjYSk7CisgICAgICAgIExhYmVsVmFsdWUgdiA9IGx0LmdldFZhbHVlKGNhKTsKICAgICAgICAgaWYgKHYgIT0gbnVsbCkgewotICAgICAgICAgIHR4dC5hcHBlbmQodi5nZXROYW1lKCkpOworICAgICAgICAgIHR4dC5hcHBlbmQodi5nZXRUZXh0KCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHR4dC5hcHBlbmQoYXQuZ2V0Q2F0ZWdvcnkoKS5nZXROYW1lKCkpOwotICAgICAgICAgIHR4dC5hcHBlbmQoIj0iKTsKLSAgICAgICAgICBpZiAoY2EuZ2V0VmFsdWUoKSA+IDApIHsKLSAgICAgICAgICAgIHR4dC5hcHBlbmQoIisiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdHh0LmFwcGVuZCgiIiArIGNhLmdldFZhbHVlKCkpOworICAgICAgICAgIHR4dC5hcHBlbmQobHQuZ2V0TmFtZSgpKTsKKyAgICAgICAgICB0eHQuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgdHh0LmFwcGVuZChMYWJlbFZhbHVlLmZvcm1hdFZhbHVlKGNhLmdldFZhbHVlKCkpKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgdHh0LmFwcGVuZCgiXG4iKTsKKyAgICAgIHR4dC5hcHBlbmQoJ1xuJyk7CiAgICAgfQotICAgIHR4dC5hcHBlbmQoIlxuIik7CisgICAgdHh0LmFwcGVuZCgnXG4nKTsKICAgICByZXR1cm4gdHh0LnRvU3RyaW5nKCk7CiAgIH0KLQotICBwcml2YXRlIHZvaWQgaW5zZXJ0KAotICAgICAgZmluYWwgTWFwPEFjY291bnQuSWQsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPj4gbGlzdCwKLSAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgY2EpIHsKLSAgICBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gbSA9IGxpc3QuZ2V0KGNhLmdldEFjY291bnRJZCgpKTsKLSAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICBtID0gbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICAgIGxpc3QucHV0KGNhLmdldEFjY291bnRJZCgpLCBtKTsKLSAgICB9Ci0gICAgbS5wdXQoY2EuZ2V0Q2F0ZWdvcnlJZCgpLCBjYSk7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9OZXdDaGFuZ2VTZW5kZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9OZXdDaGFuZ2VTZW5kZXIuamF2YQppbmRleCA4MmMxNDA1Li45ZmYwZGJkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTmV3Q2hhbmdlU2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL05ld0NoYW5nZVNlbmRlci5qYXZhCkBAIC0xNCwyMyArMTQsMTAgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOwogCi1pbXBvcnQgY29tLmpjcmFmdC5qc2NoLkhvc3RLZXk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYuRGlmZkZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlRlbXBvcmFyeUJ1ZmZlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtMzksMTcgKzI2LDExIEBACiAKIC8qKiBTZW5kcyBhbiBlbWFpbCBhbGVydGluZyBhIHVzZXIgdG8gYSBuZXcgY2hhbmdlIGZvciB0aGVtIHRvIHJldmlldy4gKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOZXdDaGFuZ2VTZW5kZXIgZXh0ZW5kcyBDaGFuZ2VFbWFpbCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQotICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTmV3Q2hhbmdlU2VuZGVyLmNsYXNzKTsKLQotICBwcml2YXRlIGZpbmFsIFNzaEluZm8gc3NoSW5mbzsKICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gcmV2aWV3ZXJzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gZXh0cmFDQyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7CiAKLSAgcHJvdGVjdGVkIE5ld0NoYW5nZVNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsCi0gICAgICBTc2hJbmZvIHNzaEluZm8sIENoYW5nZSBjKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsIGMsICJuZXdjaGFuZ2UiKTsKLSAgICB0aGlzLnNzaEluZm8gPSBzc2hJbmZvOworICBwcm90ZWN0ZWQgTmV3Q2hhbmdlU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjLCAibmV3Y2hhbmdlIik7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBhZGRSZXZpZXdlcnMoZmluYWwgQ29sbGVjdGlvbjxBY2NvdW50LklkPiBjYykgewpAQCAtODYsNjMgKzY3LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIG5hbWVzOwogICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRTc2hIb3N0KCkgewotICAgIGZpbmFsIExpc3Q8SG9zdEtleT4gaG9zdEtleXMgPSBzc2hJbmZvLmdldEhvc3RLZXlzKCk7Ci0gICAgaWYgKGhvc3RLZXlzLmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIGhvc3QgPSBob3N0S2V5cy5nZXQoMCkuZ2V0SG9zdCgpOwotICAgIGlmIChob3N0LnN0YXJ0c1dpdGgoIio6IikpIHsKLSAgICAgIHJldHVybiBnZXRHZXJyaXRIb3N0KCkgKyBob3N0LnN1YnN0cmluZygxKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhvc3Q7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlRGlmZigpIHsKLSAgICByZXR1cm4gYXJncy5zZXR0aW5ncy5pbmNsdWRlRGlmZjsKLSAgfQotCi0gIC8qKiBTaG93IHBhdGNoIHNldCBhcyB1bmlmaWVkIGRpZmZlcmVuY2UuICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFVuaWZpZWREaWZmKCkgewotICAgIFBhdGNoTGlzdCBwYXRjaExpc3Q7Ci0gICAgdHJ5IHsKLSAgICAgIHBhdGNoTGlzdCA9IGdldFBhdGNoTGlzdCgpOwotICAgICAgaWYgKHBhdGNoTGlzdC5nZXRPbGRJZCgpID09IG51bGwpIHsKLSAgICAgICAgLy8gT2N0b3B1cyBtZXJnZXMgYXJlIG5vdCB3ZWxsIHN1cHBvcnRlZCBmb3IgZGlmZiBvdXRwdXQgYnkgR2Vycml0LgotICAgICAgICAvLyBDdXJyZW50bHkgdGhlc2UgYWx3YXlzIGhhdmUgYSBudWxsIG9sZElkIGluIHRoZSBQYXRjaExpc3QuCi0gICAgICAgIHJldHVybiAiIjsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChQYXRjaExpc3ROb3RBdmFpbGFibGVFeGNlcHRpb24gZSkgewotICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZm9ybWF0IHBhdGNoIiwgZSk7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfQotCi0gICAgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgYnVmID0KLSAgICAgICAgbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKGFyZ3Muc2V0dGluZ3MubWF4aW11bURpZmZTaXplKTsKLSAgICBEaWZmRm9ybWF0dGVyIGZtdCA9IG5ldyBEaWZmRm9ybWF0dGVyKGJ1Zik7Ci0gICAgUmVwb3NpdG9yeSBnaXQ7Ci0gICAgdHJ5IHsKLSAgICAgIGdpdCA9IGFyZ3Muc2VydmVyLm9wZW5SZXBvc2l0b3J5KGNoYW5nZS5nZXRQcm9qZWN0KCkpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGxvZy5lcnJvcigiQ2Fubm90IG9wZW4gcmVwb3NpdG9yeSB0byBmb3JtYXQgcGF0Y2giLCBlKTsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGZtdC5zZXRSZXBvc2l0b3J5KGdpdCk7Ci0gICAgICBmbXQuc2V0RGV0ZWN0UmVuYW1lcyh0cnVlKTsKLSAgICAgIGZtdC5mb3JtYXQocGF0Y2hMaXN0LmdldE9sZElkKCksIHBhdGNoTGlzdC5nZXROZXdJZCgpKTsKLSAgICAgIHJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShidWYudG9CeXRlQXJyYXkoKSk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgaWYgKEpHaXRUZXh0LmdldCgpLmluTWVtb3J5QnVmZmVyTGltaXRFeGNlZWRlZC5lcXVhbHMoZS5nZXRNZXNzYWdlKCkpKSB7Ci0gICAgICAgIHJldHVybiAiIjsKLSAgICAgIH0KLSAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGZvcm1hdCBwYXRjaCIsIGUpOwotICAgICAgcmV0dXJuICIiOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBmbXQucmVsZWFzZSgpOwotICAgICAgZ2l0LmNsb3NlKCk7Ci0gICAgfQotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTm90aWZpY2F0aW9uRW1haWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Ob3RpZmljYXRpb25FbWFpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzQzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTm90aWZpY2F0aW9uRW1haWwuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5CcmFuY2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuUHJvamVjdFdhdGNoLldhdGNoZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIENvbW1vbiBjbGFzcyBmb3Igbm90aWZpY2F0aW9ucyB0aGF0IGFyZSByZWxhdGVkIHRvIGEgcHJvamVjdCBhbmQgYnJhbmNoCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb3RpZmljYXRpb25FbWFpbCBleHRlbmRzIE91dGdvaW5nRW1haWwgeworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KKyAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5vdGlmaWNhdGlvbkVtYWlsLmNsYXNzKTsKKworICBwcm90ZWN0ZWQgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CisgIHByb3RlY3RlZCBCcmFuY2guTmFtZUtleSBicmFuY2g7CisKKyAgcHJvdGVjdGVkIE5vdGlmaWNhdGlvbkVtYWlsKEVtYWlsQXJndW1lbnRzIGVhLAorICAgICAgU3RyaW5nIG1jLCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgQnJhbmNoLk5hbWVLZXkgYnJhbmNoKSB7CisgICAgc3VwZXIoZWEsIG1jKTsKKworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgdGhpcy5icmFuY2ggPSBicmFuY2g7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiB7CisgICAgc3VwZXIuaW5pdCgpOworICAgIHNldExpc3RJZEhlYWRlcigpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHNldExpc3RJZEhlYWRlcigpIHRocm93cyBFbWFpbEV4Y2VwdGlvbiB7CisgICAgLy8gU2V0IGEgcmVhc29uYWJsZSBsaXN0IGlkIHNvIHRoYXQgZmlsdGVycyBjYW4gYmUgdXNlZCB0byBzb3J0IG1lc3NhZ2VzCisgICAgc2V0VkhlYWRlcigiTGlzdC1JZCIsICI8JGVtYWlsLmxpc3RJZC5yZXBsYWNlKCdAJywgJy4nKT4iKTsKKyAgICBpZiAoZ2V0U2V0dGluZ3NVcmwoKSAhPSBudWxsKSB7CisgICAgICBzZXRWSGVhZGVyKCJMaXN0LVVuc3Vic2NyaWJlIiwgIjwkZW1haWwuc2V0dGluZ3NVcmw+Iik7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRMaXN0SWQoKSB0aHJvd3MgRW1haWxFeGNlcHRpb24geworICAgIHJldHVybiB2ZWxvY2lmeSgiZ2Vycml0LSRwcm9qZWN0TmFtZS5yZXBsYWNlKCcvJywgJy0nKUAkZW1haWwuZ2Vycml0SG9zdCIpOworICB9CisKKyAgLyoqIEluY2x1ZGUgdXNlcnMgYW5kIGdyb3VwcyB0aGF0IHdhbnQgbm90aWZpY2F0aW9uIG9mIGV2ZW50cy4gKi8KKyAgcHJvdGVjdGVkIHZvaWQgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUgdHlwZSkgeworICAgIHRyeSB7CisgICAgICBXYXRjaGVycyBtYXRjaGluZyA9IGdldFdhdGNoZXJzKHR5cGUpOworICAgICAgYWRkKFJlY2lwaWVudFR5cGUuVE8sIG1hdGNoaW5nLnRvKTsKKyAgICAgIGFkZChSZWNpcGllbnRUeXBlLkNDLCBtYXRjaGluZy5jYyk7CisgICAgICBhZGQoUmVjaXBpZW50VHlwZS5CQ0MsIG1hdGNoaW5nLmJjYyk7CisgICAgfSBjYXRjaCAoT3JtRXhjZXB0aW9uIGVycikgeworICAgICAgLy8gSnVzdCBkb24ndCBDQyBldmVyeW9uZS4gQmV0dGVyIHRvIHNlbmQgYSBwYXJ0aWFsIG1lc3NhZ2UgdG8gdGhvc2UKKyAgICAgIC8vIHdlIGFscmVhZHkgaGF2ZSBxdWV1ZWQgdXAgdGhlbiB0byBmYWlsIGRlbGl2ZXIgZW50aXJlbHkgdG8gcGVvcGxlCisgICAgICAvLyB3aG8gaGF2ZSBhIGxvd2VyIGludGVyZXN0IGluIHRoZSBjaGFuZ2UuCisgICAgICBsb2cud2FybigiQ2Fubm90IEJDQyB3YXRjaGVycyBmb3IgIiArIHR5cGUsIGVycik7CisgICAgfQorICB9CisKKyAgLyoqIFJldHVybnMgYWxsIHdhdGNoZXJzIHRoYXQgYXJlIHJlbGV2YW50ICovCisgIHByb3RlY3RlZCBhYnN0cmFjdCBXYXRjaGVycyBnZXRXYXRjaGVycyhOb3RpZnlUeXBlIHR5cGUpIHRocm93cyBPcm1FeGNlcHRpb247CisKKyAgLyoqIEFkZCB1c2VycyBvciBlbWFpbCBhZGRyZXNzZXMgdG8gdGhlIFRPLCBDQywgb3IgQkNDIGxpc3QuICovCisgIHByb3RlY3RlZCB2b2lkIGFkZChSZWNpcGllbnRUeXBlIHR5cGUsIFdhdGNoZXJzLkxpc3QgbGlzdCkgeworICAgIGZvciAoQWNjb3VudC5JZCB1c2VyIDogbGlzdC5hY2NvdW50cykgeworICAgICAgYWRkKHR5cGUsIHVzZXIpOworICAgIH0KKyAgICBmb3IgKEFkZHJlc3MgYWRkciA6IGxpc3QuZW1haWxzKSB7CisgICAgICBhZGQodHlwZSwgYWRkcik7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRTc2hIb3N0KCkgeworICAgIFN0cmluZyBob3N0ID0gSXRlcmFibGVzLmdldEZpcnN0KGFyZ3Muc3NoQWRkcmVzc2VzLCBudWxsKTsKKyAgICBpZiAoaG9zdCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKGhvc3Quc3RhcnRzV2l0aCgiKjoiKSkgeworICAgICAgcmV0dXJuIGdldEdlcnJpdEhvc3QoKSArIGhvc3Quc3Vic3RyaW5nKDEpOworICAgIH0KKyAgICByZXR1cm4gaG9zdDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZlbG9jaXR5Q29udGV4dCgpIHsKKyAgICBzdXBlci5zZXR1cFZlbG9jaXR5Q29udGV4dCgpOworICAgIHZlbG9jaXR5Q29udGV4dC5wdXQoInByb2plY3ROYW1lIiwgcHJvamVjdC5nZXQoKSk7CisgICAgdmVsb2NpdHlDb250ZXh0LnB1dCgiYnJhbmNoIiwgYnJhbmNoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL091dGdvaW5nRW1haWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9PdXRnb2luZ0VtYWlsLmphdmEKaW5kZXggY2FhNDQxZC4uOTk3YmMwMyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL091dGdvaW5nRW1haWwuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvT3V0Z29pbmdFbWFpbC5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlVzZXJJZGVudGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5BY2NvdW50U3RhdGU7CkBAIC01OSwxNCArNjAsMTEgQEAKICAgcHJvdGVjdGVkIFZlbG9jaXR5Q29udGV4dCB2ZWxvY2l0eUNvbnRleHQ7CiAKICAgcHJvdGVjdGVkIGZpbmFsIEVtYWlsQXJndW1lbnRzIGFyZ3M7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWU7CiAgIHByb3RlY3RlZCBBY2NvdW50LklkIGZyb21JZDsKIAogCi0gIHByb3RlY3RlZCBPdXRnb2luZ0VtYWlsKEVtYWlsQXJndW1lbnRzIGVhLCBmaW5hbCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKLSAgICAgIGZpbmFsIFN0cmluZyBtYykgeworICBwcm90ZWN0ZWQgT3V0Z29pbmdFbWFpbChFbWFpbEFyZ3VtZW50cyBlYSwgU3RyaW5nIG1jKSB7CiAgICAgYXJncyA9IGVhOwotICAgIHRoaXMuYW5vbnltb3VzQ293YXJkTmFtZSA9IGFub255bW91c0Nvd2FyZE5hbWU7CiAgICAgbWVzc2FnZUNsYXNzID0gbWM7CiAgICAgaGVhZGVycyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgRW1haWxIZWFkZXI+KCk7CiAgIH0KQEAgLTIzNSw3ICsyMzMsNyBAQAogICAvKiogTG9va3VwIGEgaHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgYW4gYWNjb3VudCwgdXN1YWxseSB0aGUgImZ1bGwgbmFtZSIuICovCiAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUZvcihmaW5hbCBBY2NvdW50LklkIGFjY291bnRJZCkgewogICAgIGlmIChhY2NvdW50SWQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGFub255bW91c0Nvd2FyZE5hbWU7CisgICAgICByZXR1cm4gYXJncy5hbm9ueW1vdXNDb3dhcmROYW1lOwogICAgIH0KIAogICAgIGZpbmFsIEFjY291bnQgdXNlckFjY291bnQgPSBhcmdzLmFjY291bnRDYWNoZS5nZXQoYWNjb3VudElkKS5nZXRBY2NvdW50KCk7CkBAIC0yNDQsNyArMjQyLDcgQEAKICAgICAgIG5hbWUgPSB1c2VyQWNjb3VudC5nZXRQcmVmZXJyZWRFbWFpbCgpOwogICAgIH0KICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICBuYW1lID0gYW5vbnltb3VzQ293YXJkTmFtZSArICIgIyIgKyBhY2NvdW50SWQ7CisgICAgICBuYW1lID0gYXJncy5hbm9ueW1vdXNDb3dhcmROYW1lICsgIiAjIiArIGFjY291bnRJZDsKICAgICB9CiAgICAgcmV0dXJuIG5hbWU7CiAgIH0KQEAgLTI2Myw3ICsyNjEsNyBAQAogICAgICAgcmV0dXJuIGVtYWlsOwogCiAgICAgfSBlbHNlIC8qIChuYW1lID09IG51bGwgJiYgZW1haWwgPT0gbnVsbCkgKi97Ci0gICAgICByZXR1cm4gYW5vbnltb3VzQ293YXJkTmFtZSArICIgIyIgKyBhY2NvdW50SWQ7CisgICAgICByZXR1cm4gYXJncy5hbm9ueW1vdXNDb3dhcmROYW1lICsgIiAjIiArIGFjY291bnRJZDsKICAgICB9CiAgIH0KIApAQCAtMzMyLDYgKzMzMCw4IEBACiAgICAgICAgICAgICBjYXNlIENDOgogICAgICAgICAgICAgICAoKEVtYWlsSGVhZGVyLkFkZHJlc3NMaXN0KSBoZWFkZXJzLmdldChIRFJfQ0MpKS5hZGQoYWRkcik7CiAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCQ0M6CisgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Qcm9qZWN0V2F0Y2guamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Qcm9qZWN0V2F0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMwNGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1Byb2plY3RXYXRjaC5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cERlc2NyaXB0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBNZW1iZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2g7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2guTm90aWZ5VHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk5vdGlmeUNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0U3RhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUXVlcnlQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZURhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VRdWVyeUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5TaW5nbGVHcm91cFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgUHJvamVjdFdhdGNoIHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFByb2plY3RXYXRjaC5jbGFzcyk7CisKKyAgcHJvdGVjdGVkIGZpbmFsIEVtYWlsQXJndW1lbnRzIGFyZ3M7CisgIHByb3RlY3RlZCBmaW5hbCBQcm9qZWN0U3RhdGUgcHJvamVjdFN0YXRlOworICBwcm90ZWN0ZWQgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CisgIHByb3RlY3RlZCBmaW5hbCBDaGFuZ2VEYXRhIGNoYW5nZURhdGE7CisKKyAgcHVibGljIFByb2plY3RXYXRjaChFbWFpbEFyZ3VtZW50cyBhcmdzLCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwKKyAgICBQcm9qZWN0U3RhdGUgcHJvamVjdFN0YXRlLCBDaGFuZ2VEYXRhIGNoYW5nZURhdGEpIHsKKyAgICB0aGlzLmFyZ3MgPSBhcmdzOworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgdGhpcy5wcm9qZWN0U3RhdGUgPSBwcm9qZWN0U3RhdGU7CisgICAgdGhpcy5jaGFuZ2VEYXRhID0gY2hhbmdlRGF0YTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIGFsbCB3YXRjaGVycyB0aGF0IGFyZSByZWxldmFudCAqLworICBwdWJsaWMgZmluYWwgV2F0Y2hlcnMgZ2V0V2F0Y2hlcnMoTm90aWZ5VHlwZSB0eXBlKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBXYXRjaGVycyBtYXRjaGluZyA9IG5ldyBXYXRjaGVycygpOworICAgIFNldDxBY2NvdW50LklkPiBwcm9qZWN0V2F0Y2hlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOworCisgICAgZm9yIChBY2NvdW50UHJvamVjdFdhdGNoIHcgOiBhcmdzLmRiLmdldCgpLmFjY291bnRQcm9qZWN0V2F0Y2hlcygpCisgICAgICAgIC5ieVByb2plY3QocHJvamVjdCkpIHsKKyAgICAgIGlmICh3LmlzTm90aWZ5KHR5cGUpKSB7CisgICAgICAgIHByb2plY3RXYXRjaGVycy5hZGQody5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgIGFkZChtYXRjaGluZywgdyk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChBY2NvdW50UHJvamVjdFdhdGNoIHcgOiBhcmdzLmRiLmdldCgpLmFjY291bnRQcm9qZWN0V2F0Y2hlcygpCisgICAgICAgIC5ieVByb2plY3QoYXJncy5hbGxQcm9qZWN0c05hbWUpKSB7CisgICAgICBpZiAoIXByb2plY3RXYXRjaGVycy5jb250YWlucyh3LmdldEFjY291bnRJZCgpKSAmJiB3LmlzTm90aWZ5KHR5cGUpKSB7CisgICAgICAgIGFkZChtYXRjaGluZywgdyk7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChQcm9qZWN0U3RhdGUgc3RhdGUgOiBwcm9qZWN0U3RhdGUudHJlZSgpKSB7CisgICAgICBmb3IgKE5vdGlmeUNvbmZpZyBuYyA6IHN0YXRlLmdldENvbmZpZygpLmdldE5vdGlmeUNvbmZpZ3MoKSkgeworICAgICAgICBpZiAobmMuaXNOb3RpZnkodHlwZSkpIHsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgYWRkKG1hdGNoaW5nLCBuYywgc3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgICAgICAgfSBjYXRjaCAoUXVlcnlQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cud2FybihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJQcm9qZWN0ICVzIGhhcyBpbnZhbGlkIG5vdGlmeSAlcyBmaWx0ZXIgXCIlc1wiOiAlcyIsCisgICAgICAgICAgICAgICAgc3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgbmMuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIG5jLmdldEZpbHRlcigpLCBlLmdldE1lc3NhZ2UoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXRjaGluZzsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2F0Y2hlcnMgeworICAgIHN0YXRpYyBjbGFzcyBMaXN0IHsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gYWNjb3VudHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8QWRkcmVzcz4gZW1haWxzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgfQorICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0IHRvID0gbmV3IExpc3QoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdCBjYyA9IG5ldyBMaXN0KCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIExpc3QgYmNjID0gbmV3IExpc3QoKTsKKworICAgIExpc3QgbGlzdChOb3RpZnlDb25maWcuSGVhZGVyIGhlYWRlcikgeworICAgICAgc3dpdGNoIChoZWFkZXIpIHsKKyAgICAgICAgY2FzZSBUTzoKKyAgICAgICAgICByZXR1cm4gdG87CisgICAgICAgIGNhc2UgQ0M6CisgICAgICAgICAgcmV0dXJuIGNjOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIEJDQzoKKyAgICAgICAgICByZXR1cm4gYmNjOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhZGQoV2F0Y2hlcnMgbWF0Y2hpbmcsIE5vdGlmeUNvbmZpZyBuYywgUHJvamVjdC5OYW1lS2V5IHByb2plY3QpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uLCBRdWVyeVBhcnNlRXhjZXB0aW9uIHsKKyAgICBmb3IgKEdyb3VwUmVmZXJlbmNlIHJlZiA6IG5jLmdldEdyb3VwcygpKSB7CisgICAgICBDdXJyZW50VXNlciB1c2VyID0gbmV3IFNpbmdsZUdyb3VwVXNlcihhcmdzLmNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwKKyAgICAgICAgICByZWYuZ2V0VVVJRCgpKTsKKyAgICAgIGlmIChmaWx0ZXJNYXRjaCh1c2VyLCBuYy5nZXRGaWx0ZXIoKSkpIHsKKyAgICAgICAgZGVsaXZlclRvTWVtYmVycyhtYXRjaGluZy5saXN0KG5jLmdldEhlYWRlcigpKSwgcmVmLmdldFVVSUQoKSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFuYy5nZXRBZGRyZXNzZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgIGlmIChmaWx0ZXJNYXRjaChudWxsLCBuYy5nZXRGaWx0ZXIoKSkpIHsKKyAgICAgICAgbWF0Y2hpbmcubGlzdChuYy5nZXRIZWFkZXIoKSkuZW1haWxzLmFkZEFsbChuYy5nZXRBZGRyZXNzZXMoKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIGRlbGl2ZXJUb01lbWJlcnMoCisgICAgICBXYXRjaGVycy5MaXN0IG1hdGNoaW5nLAorICAgICAgQWNjb3VudEdyb3VwLlVVSUQgc3RhcnRVVUlEKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBSZXZpZXdEYiBkYiA9IGFyZ3MuZGIuZ2V0KCk7CisgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBzZWVuID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgTGlzdDxBY2NvdW50R3JvdXAuVVVJRD4gcSA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworCisgICAgc2Vlbi5hZGQoc3RhcnRVVUlEKTsKKyAgICBxLmFkZChzdGFydFVVSUQpOworCisgICAgd2hpbGUgKCFxLmlzRW1wdHkoKSkgeworICAgICAgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCA9IHEucmVtb3ZlKHEuc2l6ZSgpIC0gMSk7CisgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGdyb3VwID0gYXJncy5ncm91cEJhY2tlbmQuZ2V0KHV1aWQpOworICAgICAgaWYgKCFTdHJpbmdzLmlzTnVsbE9yRW1wdHkoZ3JvdXAuZ2V0RW1haWxBZGRyZXNzKCkpKSB7CisgICAgICAgIC8vIElmIHRoZSBncm91cCBoYXMgYW4gZW1haWwgYWRkcmVzcywgZG8gbm90IGV4cGFuZCBtZW1iZXJzaGlwLgorICAgICAgICBtYXRjaGluZy5lbWFpbHMuYWRkKG5ldyBBZGRyZXNzKGdyb3VwLmdldEVtYWlsQWRkcmVzcygpKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBBY2NvdW50R3JvdXAgaWcgPSBHcm91cERlc2NyaXB0aW9ucy50b0FjY291bnRHcm91cChncm91cCk7CisgICAgICBpZiAoaWcgPT0gbnVsbCkgeworICAgICAgICAvLyBOb24taW50ZXJuYWwgZ3JvdXBzIGNhbm5vdCBiZSBleHBhbmRlZCBieSB0aGUgc2VydmVyLgorICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgZm9yIChBY2NvdW50R3JvdXBNZW1iZXIgbSA6IGRiLmFjY291bnRHcm91cE1lbWJlcnMoKS5ieUdyb3VwKGlnLmdldElkKCkpKSB7CisgICAgICAgIG1hdGNoaW5nLmFjY291bnRzLmFkZChtLmdldEFjY291bnRJZCgpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgbSA6IGFyZ3MuZ3JvdXBJbmNsdWRlcy5tZW1iZXJzT2YodXVpZCkpIHsKKyAgICAgICAgaWYgKHNlZW4uYWRkKG0pKSB7CisgICAgICAgICAgcS5hZGQobSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgYWRkKFdhdGNoZXJzIG1hdGNoaW5nLCBBY2NvdW50UHJvamVjdFdhdGNoIHcpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBJZGVudGlmaWVkVXNlciB1c2VyID0KKyAgICAgICAgYXJncy5pZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGFyZ3MuZGIsIHcuZ2V0QWNjb3VudElkKCkpOworCisgICAgdHJ5IHsKKyAgICAgIGlmIChmaWx0ZXJNYXRjaCh1c2VyLCB3LmdldEZpbHRlcigpKSkgeworICAgICAgICBtYXRjaGluZy5iY2MuYWNjb3VudHMuYWRkKHcuZ2V0QWNjb3VudElkKCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKFF1ZXJ5UGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgLy8gSWdub3JlIGJyb2tlbiBmaWx0ZXIgZXhwcmVzc2lvbnMuCisgICAgfQorICB9CisKKyAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJNYXRjaChDdXJyZW50VXNlciB1c2VyLCBTdHJpbmcgZmlsdGVyKQorICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgUXVlcnlQYXJzZUV4Y2VwdGlvbiB7CisgICAgQ2hhbmdlUXVlcnlCdWlsZGVyIHFiOworICAgIFByZWRpY2F0ZTxDaGFuZ2VEYXRhPiBwID0gbnVsbDsKKworICAgIGlmICh1c2VyID09IG51bGwpIHsKKyAgICAgIHFiID0gYXJncy5xdWVyeUJ1aWxkZXIuY3JlYXRlKGFyZ3MuYW5vbnltb3VzVXNlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHFiID0gYXJncy5xdWVyeUJ1aWxkZXIuY3JlYXRlKHVzZXIpOworICAgICAgcCA9IHFiLmlzX3Zpc2libGUoKTsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKKyAgICAgIHFiLnNldEFsbG93RmlsZSh0cnVlKTsKKyAgICAgIFByZWRpY2F0ZTxDaGFuZ2VEYXRhPiBmaWx0ZXJQcmVkaWNhdGUgPSBxYi5wYXJzZShmaWx0ZXIpOworICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICBwID0gZmlsdGVyUHJlZGljYXRlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcCA9IFByZWRpY2F0ZS5hbmQoZmlsdGVyUHJlZGljYXRlLCBwKTsKKyAgICAgIH0KKyAgICAgIHAgPSBhcmdzLnF1ZXJ5UmV3cml0ZXIuZ2V0KCkucmV3cml0ZShwKTsKKyAgICB9CisgICAgcmV0dXJuIHAgPT0gbnVsbCA/IHRydWUgOiBwLm1hdGNoKGNoYW5nZURhdGEpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmViYXNlZFBhdGNoU2V0U2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmViYXNlZFBhdGNoU2V0U2VuZGVyLmphdmEKaW5kZXggOGZjODIzOC4uZjlhODViOSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlYmFzZWRQYXRjaFNldFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZWJhc2VkUGF0Y2hTZXRTZW5kZXIuamF2YQpAQCAtMTQsOSArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC0yNywxMCArMjYsOCBAQAogICB9CiAKICAgQEluamVjdAotICBwdWJsaWMgUmViYXNlZFBhdGNoU2V0U2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLAotICAgICAgQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91c0Nvd2FyZE5hbWUsIFNzaEluZm8gc2ksCi0gICAgICBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgc2ksIGMpOworICBwdWJsaWMgUmViYXNlZFBhdGNoU2V0U2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKKyAgICBzdXBlcihlYSwgYyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZWdpc3Rlck5ld0VtYWlsU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVnaXN0ZXJOZXdFbWFpbFNlbmRlci5qYXZhCmluZGV4IDE3ZmU5YzYuLmViMzI3MDAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZWdpc3Rlck5ld0VtYWlsU2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlZ2lzdGVyTmV3RW1haWxTZW5kZXIuamF2YQpAQCAtMTQsOCArMTQsOCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIApAQCAtMzIsMTAgKzMyLDkgQEAKICAgQEluamVjdAogICBwdWJsaWMgUmVnaXN0ZXJOZXdFbWFpbFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKICAgICAgIEVtYWlsVG9rZW5WZXJpZmllciBldHYsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKICAgICAgIElkZW50aWZpZWRVc2VyIGNhbGxpbmdVc2VyLAogICAgICAgQEFzc2lzdGVkIGZpbmFsIFN0cmluZyBhZGRyZXNzKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsICJyZWdpc3Rlcm5ld2VtYWlsIik7CisgICAgc3VwZXIoZWEsICJyZWdpc3Rlcm5ld2VtYWlsIik7CiAgICAgdG9rZW5WZXJpZmllciA9IGV0djsKICAgICB1c2VyID0gY2FsbGluZ1VzZXI7CiAgICAgYWRkciA9IGFkZHJlc3M7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVwbGFjZVBhdGNoU2V0U2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVwbGFjZVBhdGNoU2V0U2VuZGVyLmphdmEKaW5kZXggOTcwNWI4YS4uZDgwZmI1MCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlcGxhY2VQYXRjaFNldFNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXBsYWNlUGF0Y2hTZXRTZW5kZXIuamF2YQpAQCAtMTQsMTUgKzE0LDEzIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIAotaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Ib3N0S2V5OwotCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKQEAgLTM3LDE0ICszNSwxMCBAQAogCiAgIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnQuSWQ+IHJldmlld2VycyA9IG5ldyBIYXNoU2V0PEFjY291bnQuSWQ+KCk7CiAgIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnQuSWQ+IGV4dHJhQ0MgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOwotICBwcml2YXRlIGZpbmFsIFNzaEluZm8gc3NoSW5mbzsKIAogICBASW5qZWN0Ci0gIHB1YmxpYyBSZXBsYWNlUGF0Y2hTZXRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwgU3NoSW5mbyBzaSwKLSAgICAgIEBBc3Npc3RlZCBDaGFuZ2UgYykgewotICAgIHN1cGVyKGVhLCBhbm9ueW1vdXNDb3dhcmROYW1lLCBjLCAibmV3cGF0Y2hzZXQiKTsKLSAgICBzc2hJbmZvID0gc2k7CisgIHB1YmxpYyBSZXBsYWNlUGF0Y2hTZXRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIEBBc3Npc3RlZCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjLCAibmV3cGF0Y2hzZXQiKTsKICAgfQogCiAgIHB1YmxpYyB2b2lkIGFkZFJldmlld2VycyhmaW5hbCBDb2xsZWN0aW9uPEFjY291bnQuSWQ+IGNjKSB7CkBAIC02OCw2ICs2Miw3IEBACiAgICAgYWRkKFJlY2lwaWVudFR5cGUuQ0MsIGV4dHJhQ0MpOwogICAgIHJjcHRUb0F1dGhvcnMoUmVjaXBpZW50VHlwZS5DQyk7CiAgICAgYmNjU3RhcnJlZEJ5KCk7CisgICAgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUuTkVXX1BBVENIU0VUUyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTg1LDE3ICs4MCw0IEBACiAgICAgfQogICAgIHJldHVybiBuYW1lczsKICAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3NoSG9zdCgpIHsKLSAgICBmaW5hbCBMaXN0PEhvc3RLZXk+IGhvc3RLZXlzID0gc3NoSW5mby5nZXRIb3N0S2V5cygpOwotICAgIGlmIChob3N0S2V5cy5pc0VtcHR5KCkpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIGZpbmFsIFN0cmluZyBob3N0ID0gaG9zdEtleXMuZ2V0KDApLmdldEhvc3QoKTsKLSAgICBpZiAoaG9zdC5zdGFydHNXaXRoKCIqOiIpKSB7Ci0gICAgICByZXR1cm4gZ2V0R2Vycml0SG9zdCgpICsgaG9zdC5zdWJzdHJpbmcoMSk7Ci0gICAgfQotICAgIHJldHVybiBob3N0OwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVwbHlUb0NoYW5nZVNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JlcGx5VG9DaGFuZ2VTZW5kZXIuamF2YQppbmRleCAyYTc3ZDM5Li40MmFjOTE3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmVwbHlUb0NoYW5nZVNlbmRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXBseVRvQ2hhbmdlU2VuZGVyLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuRW1haWxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKIAogLyoqIEFsZXJ0IGEgdXNlciB0byBhIHJlcGx5IHRvIGEgY2hhbmdlLCB1c3VhbGx5IGNvbW1lbnRhcnkgbWFkZSBkdXJpbmcgcmV2aWV3LiAqLwpAQCAtMjIsOSArMjMsOCBAQAogICAgIHB1YmxpYyBUIGNyZWF0ZShDaGFuZ2UgY2hhbmdlKTsKICAgfQogCi0gIHByb3RlY3RlZCBSZXBseVRvQ2hhbmdlU2VuZGVyKEVtYWlsQXJndW1lbnRzIGVhLCBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwKLSAgICAgIENoYW5nZSBjLCBTdHJpbmcgbWMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgYywgbWMpOworICBwcm90ZWN0ZWQgUmVwbHlUb0NoYW5nZVNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQ2hhbmdlIGMsIFN0cmluZyBtYykgeworICAgIHN1cGVyKGVhLCBjLCBtYyk7CiAgIH0KIAogICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9SZXN0b3JlZFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1Jlc3RvcmVkU2VuZGVyLmphdmEKaW5kZXggOTQ2YzI5Zi4uN2Y0NjRmNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1Jlc3RvcmVkU2VuZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1Jlc3RvcmVkU2VuZGVyLmphdmEKQEAgLTE0LDkgKzE0LDkgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5FbWFpbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudFByb2plY3RXYXRjaC5Ob3RpZnlUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKIApAQCAtMjgsOSArMjgsOCBAQAogICB9CiAKICAgQEluamVjdAotICBwdWJsaWMgUmVzdG9yZWRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsCi0gICAgICBAQW5vbnltb3VzQ293YXJkTmFtZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7Ci0gICAgc3VwZXIoZWEsIGFub255bW91c0Nvd2FyZE5hbWUsIGMsICJyZXN0b3JlIik7CisgIHB1YmxpYyBSZXN0b3JlZFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwgQEFzc2lzdGVkIENoYW5nZSBjKSB7CisgICAgc3VwZXIoZWEsIGMsICJyZXN0b3JlIik7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTM5LDcgKzM4LDcgQEAKIAogICAgIGNjQWxsQXBwcm92YWxzKCk7CiAgICAgYmNjU3RhcnJlZEJ5KCk7Ci0gICAgYmNjV2F0Y2hlcyhOb3RpZnlUeXBlLkFMTF9DT01NRU5UUyk7CisgICAgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1JldmVydGVkU2VuZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmV2ZXJ0ZWRTZW5kZXIuamF2YQppbmRleCAwMzNiZDU2Li5kMTM4OWZiIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmV2ZXJ0ZWRTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvUmV2ZXJ0ZWRTZW5kZXIuamF2YQpAQCAtMTQsOSArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50UHJvamVjdFdhdGNoLk5vdGlmeVR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Bbm9ueW1vdXNDb3dhcmROYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCkBAIC0yNyw5ICsyNyw4IEBACiAgIH0KIAogICBASW5qZWN0Ci0gIHB1YmxpYyBSZXZlcnRlZFNlbmRlcihFbWFpbEFyZ3VtZW50cyBlYSwKLSAgICAgIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lLCBAQXNzaXN0ZWQgQ2hhbmdlIGMpIHsKLSAgICBzdXBlcihlYSwgYW5vbnltb3VzQ293YXJkTmFtZSwgYywgInJldmVydCIpOworICBwdWJsaWMgUmV2ZXJ0ZWRTZW5kZXIoRW1haWxBcmd1bWVudHMgZWEsIEBBc3Npc3RlZCBDaGFuZ2UgYykgeworICAgIHN1cGVyKGVhLCBjLCAicmV2ZXJ0Iik7CiAgIH0KIAogICBAT3ZlcnJpZGUKQEAgLTM4LDcgKzM3LDcgQEAKIAogICAgIGNjQWxsQXBwcm92YWxzKCk7CiAgICAgYmNjU3RhcnJlZEJ5KCk7Ci0gICAgYmNjV2F0Y2hlcyhOb3RpZnlUeXBlLkFMTF9DT01NRU5UUyk7CisgICAgaW5jbHVkZVdhdGNoZXJzKE5vdGlmeVR5cGUuQUxMX0NPTU1FTlRTKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1NtdHBFbWFpbFNlbmRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL1NtdHBFbWFpbFNlbmRlci5qYXZhCmluZGV4IGNlNDVmZmUuLjcyZGY1NjAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9TbXRwRW1haWxTZW5kZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvU210cEVtYWlsU2VuZGVyLmphdmEKQEAgLTE1LDYgKzE1LDcgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWw7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uVmVyc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLkVtYWlsRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ29uZmlnVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvQWRkUmV2aWV3ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvQWRkUmV2aWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5Mzg1Mi4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0FkZFJldmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUmV2aWV3ZXJSZXN1bHQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRSZXNvbHZlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5Hcm91cENhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwTWVtYmVyczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIubWFpbC5BZGRSZXZpZXdlclNlbmRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotCi1wdWJsaWMgY2xhc3MgQWRkUmV2aWV3ZXIgaW1wbGVtZW50cyBDYWxsYWJsZTxSZXZpZXdlclJlc3VsdD4gewotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX01BWF9SRVZJRVdFUlNfV0lUSE9VVF9DSEVDSyA9IDEwOwotICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX01BWF9SRVZJRVdFUlMgPSAyMDsKLQotICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIEFkZFJldmlld2VyIGNyZWF0ZShDaGFuZ2UuSWQgY2hhbmdlSWQsCi0gICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB1c2VyTmFtZU9yRW1haWxPckdyb3VwTmFtZXMsIGJvb2xlYW4gY29uZmlybWVkKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgQWRkUmV2aWV3ZXJTZW5kZXIuRmFjdG9yeSBhZGRSZXZpZXdlclNlbmRlckZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlcjsKLSAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7Ci0gIHByaXZhdGUgZmluYWwgR3JvdXBNZW1iZXJzLkZhY3RvcnkgZ3JvdXBNZW1iZXJzRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7Ci0gIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgaWRlbnRpZmllZFVzZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgYWRkUmV2aWV3ZXJDYXRlZ29yeUlkOwotICBwcml2YXRlIGZpbmFsIENvbmZpZyBjZmc7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2UuSWQgY2hhbmdlSWQ7Ci0gIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHJldmlld2VyczsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbmZpcm1lZDsKLQotICBASW5qZWN0Ci0gIEFkZFJldmlld2VyKGZpbmFsIEFkZFJldmlld2VyU2VuZGVyLkZhY3RvcnkgYWRkUmV2aWV3ZXJTZW5kZXJGYWN0b3J5LAotICAgICAgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlciwgZmluYWwgR3JvdXBDYWNoZSBncm91cENhY2hlLAotICAgICAgZmluYWwgR3JvdXBNZW1iZXJzLkZhY3RvcnkgZ3JvdXBNZW1iZXJzRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwgZmluYWwgUmV2aWV3RGIgZGIsCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSBpZGVudGlmaWVkVXNlckZhY3RvcnksCi0gICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciBjdXJyZW50VXNlciwgZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzLAotICAgICAgZmluYWwgQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnLCBAQXNzaXN0ZWQgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkLAotICAgICAgQEFzc2lzdGVkIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiByZXZpZXdlcnMsCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgYm9vbGVhbiBjb25maXJtZWQpIHsKLSAgICB0aGlzLmFkZFJldmlld2VyU2VuZGVyRmFjdG9yeSA9IGFkZFJldmlld2VyU2VuZGVyRmFjdG9yeTsKLSAgICB0aGlzLmFjY291bnRSZXNvbHZlciA9IGFjY291bnRSZXNvbHZlcjsKLSAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOwotICAgIHRoaXMuZ3JvdXBNZW1iZXJzRmFjdG9yeSA9IGdyb3VwTWVtYmVyc0ZhY3Rvcnk7Ci0gICAgdGhpcy5kYiA9IGRiOwotICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmlkZW50aWZpZWRVc2VyRmFjdG9yeSA9IGlkZW50aWZpZWRVc2VyRmFjdG9yeTsKLSAgICB0aGlzLmN1cnJlbnRVc2VyID0gY3VycmVudFVzZXI7Ci0gICAgdGhpcy5jZmcgPSBjZmc7Ci0KLSAgICBmaW5hbCBMaXN0PEFwcHJvdmFsVHlwZT4gYWxsVHlwZXMgPSBhcHByb3ZhbFR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKTsKLSAgICBhZGRSZXZpZXdlckNhdGVnb3J5SWQgPQotICAgICAgICBhbGxUeXBlcy5nZXQoYWxsVHlwZXMuc2l6ZSgpIC0gMSkuZ2V0Q2F0ZWdvcnkoKS5nZXRJZCgpOwotCi0gICAgdGhpcy5jaGFuZ2VJZCA9IGNoYW5nZUlkOwotICAgIHRoaXMucmV2aWV3ZXJzID0gcmV2aWV3ZXJzOwotICAgIHRoaXMuY29uZmlybWVkID0gY29uZmlybWVkOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBSZXZpZXdlclJlc3VsdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgU2V0PEFjY291bnQuSWQ+IHJldmlld2VySWRzID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKLSAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSBjaGFuZ2VDb250cm9sRmFjdG9yeS52YWxpZGF0ZUZvcihjaGFuZ2VJZCk7Ci0KLSAgICBmaW5hbCBSZXZpZXdlclJlc3VsdCByZXN1bHQgPSBuZXcgUmV2aWV3ZXJSZXN1bHQoKTsKLSAgICBmb3IgKGZpbmFsIFN0cmluZyByZXZpZXdlciA6IHJldmlld2VycykgewotICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50ID0gYWNjb3VudFJlc29sdmVyLmZpbmQocmV2aWV3ZXIpOwotICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgewotICAgICAgICBBY2NvdW50R3JvdXAgZ3JvdXAgPSBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLk5hbWVLZXkocmV2aWV3ZXIpKTsKLQotICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgewotICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihuZXcgUmV2aWV3ZXJSZXN1bHQuRXJyb3IoCi0gICAgICAgICAgICAgIFJldmlld2VyUmVzdWx0LkVycm9yLlR5cGUuUkVWSUVXRVJfTk9UX0ZPVU5ELCByZXZpZXdlcikpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFpc0xlZ2FsUmV2aWV3ZXJHcm91cChncm91cC5nZXRHcm91cFVVSUQoKSkpIHsKLSAgICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld2VyUmVzdWx0LkVycm9yKAotICAgICAgICAgICAgICBSZXZpZXdlclJlc3VsdC5FcnJvci5UeXBlLkdST1VQX05PVF9BTExPV0VELCByZXZpZXdlcikpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU2V0PEFjY291bnQ+IG1lbWJlcnMgPQotICAgICAgICAgICAgZ3JvdXBNZW1iZXJzRmFjdG9yeS5jcmVhdGUoKS5saXN0QWNjb3VudHMoZ3JvdXAuZ2V0R3JvdXBVVUlEKCksCi0gICAgICAgICAgICAgICAgY29udHJvbC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKLSAgICAgICAgaWYgKG1lbWJlcnMgPT0gbnVsbCB8fCBtZW1iZXJzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdlclJlc3VsdC5FcnJvcigKLSAgICAgICAgICAgICAgUmV2aWV3ZXJSZXN1bHQuRXJyb3IuVHlwZS5HUk9VUF9FTVBUWSwgcmV2aWV3ZXIpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIG1heEFsbG93ZWQgaXMgc2V0IHRvIDAsIGl0IGlzIGFsbG93ZWQgdG8gYWRkIGFueSBudW1iZXIgb2YKLSAgICAgICAgLy8gcmV2aWV3ZXJzCi0gICAgICAgIGZpbmFsIGludCBtYXhBbGxvd2VkID0KLSAgICAgICAgICAgIGNmZy5nZXRJbnQoImFkZHJldmlld2VyIiwgIm1heEFsbG93ZWQiLCBERUZBVUxUX01BWF9SRVZJRVdFUlMpOwotICAgICAgICBpZiAobWF4QWxsb3dlZCA+IDAgJiYgbWVtYmVycy5zaXplKCkgPiBtYXhBbGxvd2VkKSB7Ci0gICAgICAgICAgcmVzdWx0LnNldE1lbWJlckNvdW50KG1lbWJlcnMuc2l6ZSgpKTsKLSAgICAgICAgICByZXN1bHQuc2V0QXNrRm9yQ29uZmlybWF0aW9uKGZhbHNlKTsKLSAgICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld2VyUmVzdWx0LkVycm9yKAotICAgICAgICAgICAgICBSZXZpZXdlclJlc3VsdC5FcnJvci5UeXBlLkdST1VQX0hBU19UT09fTUFOWV9NRU1CRVJTLCByZXZpZXdlcikpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgbWF4V2l0aG91dENoZWNrIGlzIHNldCB0byAwLCB3ZSBuZXZlciBhc2sgZm9yIGNvbmZpcm1hdGlvbgotICAgICAgICBmaW5hbCBpbnQgbWF4V2l0aG91dENvbmZpcm1hdGlvbiA9Ci0gICAgICAgICAgICBjZmcuZ2V0SW50KCJhZGRyZXZpZXdlciIsICJtYXhXaXRob3V0Q29uZmlybWF0aW9uIiwKLSAgICAgICAgICAgICAgICBERUZBVUxUX01BWF9SRVZJRVdFUlNfV0lUSE9VVF9DSEVDSyk7Ci0gICAgICAgIGlmICghY29uZmlybWVkICYmIG1heFdpdGhvdXRDb25maXJtYXRpb24gPiAwCi0gICAgICAgICAgICAmJiBtZW1iZXJzLnNpemUoKSA+IG1heFdpdGhvdXRDb25maXJtYXRpb24pIHsKLSAgICAgICAgICByZXN1bHQuc2V0TWVtYmVyQ291bnQobWVtYmVycy5zaXplKCkpOwotICAgICAgICAgIHJlc3VsdC5zZXRBc2tGb3JDb25maXJtYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdlclJlc3VsdC5FcnJvcigKLSAgICAgICAgICAgICAgUmV2aWV3ZXJSZXN1bHQuRXJyb3IuVHlwZS5HUk9VUF9IQVNfVE9PX01BTllfTUVNQkVSUywgcmV2aWV3ZXIpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoZmluYWwgQWNjb3VudCBtZW1iZXIgOiBtZW1iZXJzKSB7Ci0gICAgICAgICAgaWYgKG1lbWJlci5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyID0KLSAgICAgICAgICAgICAgICBpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKG1lbWJlci5nZXRJZCgpKTsKLSAgICAgICAgICAgIC8vIERvZXMgbm90IGFjY291bnQgZm9yIGRyYWZ0IHN0YXR1cyBhcyBhIHVzZXIgbWlnaHQgd2FudCB0byBsZXQgYQotICAgICAgICAgICAgLy8gcmV2aWV3ZXIgc2VlIGEgZHJhZnQuCi0gICAgICAgICAgICBpZiAoY29udHJvbC5mb3JVc2VyKHVzZXIpLmlzUmVmVmlzaWJsZSgpKSB7Ci0gICAgICAgICAgICAgIHJldmlld2VySWRzLmFkZChtZW1iZXIuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIWFjY291bnQuaXNBY3RpdmUoKSkgewotICAgICAgICByZXN1bHQuYWRkRXJyb3IobmV3IFJldmlld2VyUmVzdWx0LkVycm9yKAotICAgICAgICAgICAgUmV2aWV3ZXJSZXN1bHQuRXJyb3IuVHlwZS5BQ0NPVU5UX0lOQUNUSVZFLAotICAgICAgICAgICAgZm9ybWF0VXNlcihhY2NvdW50LCByZXZpZXdlcikpKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIgPSBpZGVudGlmaWVkVXNlckZhY3RvcnkuY3JlYXRlKGFjY291bnQuZ2V0SWQoKSk7Ci0gICAgICAvLyBEb2VzIG5vdCBhY2NvdW50IGZvciBkcmFmdCBzdGF0dXMgYXMgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gbGV0IGEKLSAgICAgIC8vIHJldmlld2VyIHNlZSBhIGRyYWZ0LgotICAgICAgaWYgKCFjb250cm9sLmZvclVzZXIodXNlcikuaXNSZWZWaXNpYmxlKCkpIHsKLSAgICAgICAgcmVzdWx0LmFkZEVycm9yKG5ldyBSZXZpZXdlclJlc3VsdC5FcnJvcigKLSAgICAgICAgICAgIFJldmlld2VyUmVzdWx0LkVycm9yLlR5cGUuQ0hBTkdFX05PVF9WSVNJQkxFLAotICAgICAgICAgICAgZm9ybWF0VXNlcihhY2NvdW50LCByZXZpZXdlcikpKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHJldmlld2VySWRzLmFkZChhY2NvdW50LmdldElkKCkpOwotICAgIH0KLQotICAgIGlmIChyZXZpZXdlcklkcy5pc0VtcHR5KCkpIHsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gQWRkIHRoZSByZXZpZXdlcnMgdG8gdGhlIGRhdGFiYXNlCi0gICAgLy8KLSAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gYWRkZWQgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOwotICAgIGZpbmFsIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gdG9JbnNlcnQgPSBuZXcgQXJyYXlMaXN0PFBhdGNoU2V0QXBwcm92YWw+KCk7Ci0gICAgZmluYWwgUGF0Y2hTZXQuSWQgcHNpZCA9IGNvbnRyb2wuZ2V0Q2hhbmdlKCkuY3VycmVudFBhdGNoU2V0SWQoKTsKLSAgICBmb3IgKGZpbmFsIEFjY291bnQuSWQgcmV2aWV3ZXIgOiByZXZpZXdlcklkcykgewotICAgICAgaWYgKCFleGlzdHMocHNpZCwgcmV2aWV3ZXIpKSB7Ci0gICAgICAgIC8vIFRoaXMgcmV2aWV3ZXIgaGFzIG5vdCBlbnRlcmVkIGFuIGFwcHJvdmFsIGZvciB0aGlzIGNoYW5nZSB5ZXQuCi0gICAgICAgIC8vCi0gICAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgbXljYSA9Ci0gICAgICAgICAgICBkdW1teUFwcHJvdmFsKGNvbnRyb2wuZ2V0Q2hhbmdlKCksIHBzaWQsIHJldmlld2VyKTsKLSAgICAgICAgdG9JbnNlcnQuYWRkKG15Y2EpOwotICAgICAgICBhZGRlZC5hZGQocmV2aWV3ZXIpOwotICAgICAgfQotICAgIH0KLSAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLmluc2VydCh0b0luc2VydCk7Ci0KLSAgICAvLyBFbWFpbCB0aGUgcmV2aWV3ZXJzCi0gICAgLy8KLSAgICAvLyBUaGUgdXNlciBrbm93cyB0aGV5IGFkZGVkIHRoZW1zZWx2ZXMsIGRvbid0IGJvdGhlciBlbWFpbGluZyB0aGVtLgotICAgIGFkZGVkLnJlbW92ZShjdXJyZW50VXNlci5nZXRBY2NvdW50SWQoKSk7Ci0gICAgaWYgKCFhZGRlZC5pc0VtcHR5KCkpIHsKLSAgICAgIGZpbmFsIEFkZFJldmlld2VyU2VuZGVyIGNtOwotCi0gICAgICBjbSA9IGFkZFJldmlld2VyU2VuZGVyRmFjdG9yeS5jcmVhdGUoY29udHJvbC5nZXRDaGFuZ2UoKSk7Ci0gICAgICBjbS5zZXRGcm9tKGN1cnJlbnRVc2VyLmdldEFjY291bnRJZCgpKTsKLSAgICAgIGNtLmFkZFJldmlld2VycyhhZGRlZCk7Ci0gICAgICBjbS5zZW5kKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGZvcm1hdFVzZXIoQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgbmFtZU9yRW1haWwpIHsKLSAgICBpZiAobmFtZU9yRW1haWwubWF0Y2hlcygiXlsxLTldWzAtOV0qJCIpKSB7Ci0gICAgICByZXR1cm4gUmVtb3ZlUmV2aWV3ZXIuZm9ybWF0VXNlcihhY2NvdW50LCBuYW1lT3JFbWFpbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBuYW1lT3JFbWFpbDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gZXhpc3RzKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBmaW5hbCBBY2NvdW50LklkIHJldmlld2VySWQpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIHJldHVybiBkYi5wYXRjaFNldEFwcHJvdmFscygpLmJ5UGF0Y2hTZXRVc2VyKHBhdGNoU2V0SWQsIHJldmlld2VySWQpCi0gICAgICAgIC5pdGVyYXRvcigpLmhhc05leHQoKTsKLSAgfQotCi0gIHByaXZhdGUgUGF0Y2hTZXRBcHByb3ZhbCBkdW1teUFwcHJvdmFsKGZpbmFsIENoYW5nZSBjaGFuZ2UsCi0gICAgICBmaW5hbCBQYXRjaFNldC5JZCBwYXRjaFNldElkLCBmaW5hbCBBY2NvdW50LklkIHJldmlld2VySWQpIHsKLSAgICBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGR1bW15QXBwcm92YWwgPQotICAgICAgICBuZXcgUGF0Y2hTZXRBcHByb3ZhbChuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkocGF0Y2hTZXRJZCwgcmV2aWV3ZXJJZCwKLSAgICAgICAgICAgIGFkZFJldmlld2VyQ2F0ZWdvcnlJZCksIChzaG9ydCkgMCk7Ci0gICAgZHVtbXlBcHByb3ZhbC5jYWNoZShjaGFuZ2UpOwotICAgIHJldHVybiBkdW1teUFwcHJvdmFsOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWxSZXZpZXdlckdyb3VwKGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGdyb3VwVVVJRCkgewotICAgIHJldHVybiAhKEFjY291bnRHcm91cC5BTk9OWU1PVVNfVVNFUlMuZXF1YWxzKGdyb3VwVVVJRCkKLSAgICAgICAgICAgICB8fCBBY2NvdW50R3JvdXAuUkVHSVNURVJFRF9VU0VSUy5lcXVhbHMoZ3JvdXBVVUlEKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvSW50cmFMaW5lRGlmZktleS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVEaWZmS2V5LmphdmEKaW5kZXggNjJlZDVlNC4uNWIzN2I5MiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVEaWZmS2V5LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVEaWZmS2V5LmphdmEKQEAgLTgyLDYgKzgyLDEwIEBACiAgICAgcmV0dXJuIGJJZDsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlV2hpdGVzcGFjZSgpIHsKKyAgICByZXR1cm4gaWdub3JlV2hpdGVzcGFjZTsKKyAgfQorCiAgIFByb2plY3QuTmFtZUtleSBnZXRQcm9qZWN0KCkgewogICAgIHJldHVybiBwcm9qZWN0S2V5OwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZUxvYWRlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVMb2FkZXIuamF2YQppbmRleCA1YjY1OTIwLi5iOTU5OTRmIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZUxvYWRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvSW50cmFMaW5lTG9hZGVyLmphdmEKQEAgLTI5LDEwICsyOSw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBjbGFzcyBJbnRyYUxpbmVMb2FkZXIgZXh0ZW5kcyBDYWNoZUxvYWRlcjxJbnRyYUxpbmVEaWZmS2V5LCBJbnRyYUxpbmVEaWZmPiB7CkBAIC00NCwxNiArNDEsMTIgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBDT05UUk9MX0JMT0NLX1NUQVJUX1JFID0gUGF0dGVybgogICAgICAgLmNvbXBpbGUoIlt7Ol1bIFxcdF0qJCIpOwogCi0gIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxXb3JrZXI+IHdvcmtlclBvb2w7CisgIHByaXZhdGUgZmluYWwgSW50cmFMaW5lV29ya2VyUG9vbCB3b3JrZXJQb29sOwogICBwcml2YXRlIGZpbmFsIGxvbmcgdGltZW91dE1pbGxpczsKIAogICBASW5qZWN0Ci0gIEludHJhTGluZUxvYWRlcihmaW5hbCBAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcpIHsKLSAgICBmaW5hbCBpbnQgd29ya2VycyA9Ci0gICAgICAgIGNmZy5nZXRJbnQoImNhY2hlIiwgUGF0Y2hMaXN0Q2FjaGVJbXBsLklOVFJBX05BTUUsICJtYXhJZGxlV29ya2VycyIsCi0gICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCkgKiAzIC8gMik7Ci0gICAgd29ya2VyUG9vbCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8V29ya2VyPih3b3JrZXJzLCB0cnVlIC8qIGZhaXIgKi8pOwotCisgIEludHJhTGluZUxvYWRlcihJbnRyYUxpbmVXb3JrZXJQb29sIHBvb2wsIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZykgeworICAgIHdvcmtlclBvb2wgPSBwb29sOwogICAgIHRpbWVvdXRNaWxsaXMgPQogICAgICAgICBDb25maWdVdGlsLmdldFRpbWVVbml0KGNmZywgImNhY2hlIiwgUGF0Y2hMaXN0Q2FjaGVJbXBsLklOVFJBX05BTUUsCiAgICAgICAgICAgICAidGltZW91dCIsIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KDUsIFRpbWVVbml0LlNFQ09ORFMpLApAQCAtNjIsMjYgKzU1LDE3IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBJbnRyYUxpbmVEaWZmIGxvYWQoSW50cmFMaW5lRGlmZktleSBrZXkpIHRocm93cyBFeGNlcHRpb24gewotICAgIFdvcmtlciB3ID0gd29ya2VyUG9vbC5wb2xsKCk7Ci0gICAgaWYgKHcgPT0gbnVsbCkgewotICAgICAgdyA9IG5ldyBXb3JrZXIoKTsKLSAgICB9CisgICAgSW50cmFMaW5lV29ya2VyUG9vbC5Xb3JrZXIgdyA9IHdvcmtlclBvb2wuYWNxdWlyZSgpOworICAgIEludHJhTGluZVdvcmtlclBvb2wuV29ya2VyLlJlc3VsdCByID0gdy5jb21wdXRlV2l0aFRpbWVvdXQoa2V5LCB0aW1lb3V0TWlsbGlzKTsKIAotICAgIFdvcmtlci5SZXN1bHQgciA9IHcuY29tcHV0ZVdpdGhUaW1lb3V0KGtleSwgdGltZW91dE1pbGxpcyk7Ci0KLSAgICBpZiAociA9PSBXb3JrZXIuUmVzdWx0LlRJTUVPVVQpIHsKKyAgICBpZiAociA9PSBJbnRyYUxpbmVXb3JrZXJQb29sLldvcmtlci5SZXN1bHQuVElNRU9VVCkgewogICAgICAgLy8gRG9uJ3Qga2VlcCB0aGlzIHRocmVhZC4gV2UgaGF2ZSB0byBtdXJkZXIgaXQgdW5zYWZlbHksIHdoaWNoCiAgICAgICAvLyBtZWFucyBpdHMgdW5hYmxlIHRvIGJlIHJldXNlZCBpbiB0aGUgZnV0dXJlLiBSZXR1cm4gYmFjayBhCiAgICAgICAvLyBudWxsIHJlc3VsdCwgaW5kaWNhdGluZyB0aGUgY2FjaGUgY2Fubm90IGxvYWQgdGhpcyBrZXkuCiAgICAgICAvLwogICAgICAgcmV0dXJuIG5ldyBJbnRyYUxpbmVEaWZmKEludHJhTGluZURpZmYuU3RhdHVzLlRJTUVPVVQpOwogICAgIH0KLQotICAgIGlmICghd29ya2VyUG9vbC5vZmZlcih3KSkgewotICAgICAgLy8gSWYgdGhlIGlkbGUgd29ya2VyIHBvb2wgaXMgZnVsbCwgdGVybWluYXRlIHRoaXMgdGhyZWFkLgotICAgICAgLy8KLSAgICAgIHcuZW5kKCk7Ci0gICAgfQorICAgIHdvcmtlclBvb2wucmVsZWFzZSh3KTsKIAogICAgIGlmIChyLmVycm9yICE9IG51bGwpIHsKICAgICAgIC8vIElmIHRoZXJlIHdhcyBhbiBlcnJvciBjb21wdXRpbmcgdGhlIHJlc3VsdCwgY2FycnkgaXQKQEAgLTkzLDEyNyArNzcsNyBAQAogICAgIHJldHVybiByLmRpZmY7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXb3JrZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlPElucHV0PiBpbnB1dDsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5QmxvY2tpbmdRdWV1ZTxSZXN1bHQ+IHJlc3VsdDsKLSAgICBwcml2YXRlIGZpbmFsIFRocmVhZCB0aHJlYWQ7Ci0KLSAgICBXb3JrZXIoKSB7Ci0gICAgICBpbnB1dCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8SW5wdXQ+KDEpOwotICAgICAgcmVzdWx0ID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSZXN1bHQ+KDEpOwotCi0gICAgICB0aHJlYWQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgIHdvcmtlckxvb3AoKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICB0aHJlYWQuc2V0TmFtZSgiSW50cmFMaW5lRGlmZi0iICsgY291bnQuZ2V0QW5kSW5jcmVtZW50KCkpOwotICAgICAgdGhyZWFkLnNldERhZW1vbih0cnVlKTsKLSAgICAgIHRocmVhZC5zdGFydCgpOwotICAgIH0KLQotICAgIFJlc3VsdCBjb21wdXRlV2l0aFRpbWVvdXQoSW50cmFMaW5lRGlmZktleSBrZXksIGxvbmcgdGltZW91dE1pbGxpcykKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBpZiAoIWlucHV0Lm9mZmVyKG5ldyBJbnB1dChrZXkpKSkgewotICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBlbnF1ZXVlIHRhc2sgdG8gdGhyZWFkICIgKyB0aHJlYWQuZ2V0TmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIFJlc3VsdC5USU1FT1VUOwotICAgICAgfQotCi0gICAgICBSZXN1bHQgciA9IHJlc3VsdC5wb2xsKHRpbWVvdXRNaWxsaXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7Ci0gICAgICBpZiAociAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiByOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbG9nLndhcm4odGltZW91dE1pbGxpcyArICIgbXMgdGltZW91dCByZWFjaGVkIGZvciBJbnRyYUxpbmVEaWZmIgotICAgICAgICAgICAgKyAiIGluIHByb2plY3QgIiArIGtleS5nZXRQcm9qZWN0KCkuZ2V0KCkgLy8KLSAgICAgICAgICAgICsgIiBvbiBjb21taXQgIiArIGtleS5nZXRDb21taXQoKS5uYW1lKCkgLy8KLSAgICAgICAgICAgICsgIiBmb3IgcGF0aCAiICsga2V5LmdldFBhdGgoKSAvLwotICAgICAgICAgICAgKyAiIGNvbXBhcmluZyAiICsga2V5LmdldEJsb2JBKCkubmFtZSgpIC8vCi0gICAgICAgICAgICArICIuLiIgKyBrZXkuZ2V0QmxvYkIoKS5uYW1lKCkgLy8KLSAgICAgICAgICAgICsgIi4gIEtpbGxpbmcgIiArIHRocmVhZC5nZXROYW1lKCkpOwotICAgICAgICBmb3JjZWZ1bGx5S2lsbFRocmVhZEluQW5VZ2x5V2F5KCk7Ci0gICAgICAgIHJldHVybiBSZXN1bHQuVElNRU9VVDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHByaXZhdGUgdm9pZCBmb3JjZWZ1bGx5S2lsbFRocmVhZEluQW5VZ2x5V2F5KCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgdGhyZWFkLnN0b3AoKTsKLSAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlcnJvcikgewotICAgICAgICAvLyBJZ25vcmUgYW55IHJlYXNvbiB0aGUgdGhyZWFkIHdvbid0IHN0b3AuCi0gICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHN0b3AgcnVuYXdheSB0aHJlYWQgIiArIHRocmVhZC5nZXROYW1lKCksIGVycm9yKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGVuZCgpIHsKLSAgICAgIGlmICghaW5wdXQub2ZmZXIoSW5wdXQuRU5EX1RIUkVBRCkpIHsKLSAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZ3JhY2VmdWxseSBzdG9wIHRocmVhZCAiICsgdGhyZWFkLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdvcmtlckxvb3AoKSB7Ci0gICAgICB0cnkgewotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgSW5wdXQgaW47Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gaW5wdXQudGFrZSgpOwotICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiVW5leHBlY3RlZCBpbnRlcnJ1cHQgb24gIiArIHRocmVhZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKGluID09IElucHV0LkVORF9USFJFQUQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBSZXN1bHQgcjsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgciA9IG5ldyBSZXN1bHQoSW50cmFMaW5lTG9hZGVyLmNvbXB1dGUoaW4ua2V5KSk7Ci0gICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVycm9yKSB7Ci0gICAgICAgICAgICByID0gbmV3IFJlc3VsdChlcnJvcik7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCFyZXN1bHQub2ZmZXIocikpIHsKLSAgICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IHJldHVybiByZXN1bHQgZnJvbSAiICsgdGhyZWFkLmdldE5hbWUoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChUaHJlYWREZWF0aCBpSGF2ZUJlZW5TaG90KSB7Ci0gICAgICAgIC8vIEhhbmRsZSB0aHJlYWQgZGVhdGggYnkgZ3JhY2VmdWxseSByZXR1cm5pbmcgdG8gdGhlIGNhbGxlciwKLSAgICAgICAgLy8gYWxsb3dpbmcgdGhlIHRocmVhZCB0byBiZSBkZXN0cm95ZWQuCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5wdXQgewotICAgICAgc3RhdGljIGZpbmFsIElucHV0IEVORF9USFJFQUQgPSBuZXcgSW5wdXQobnVsbCk7Ci0KLSAgICAgIGZpbmFsIEludHJhTGluZURpZmZLZXkga2V5OwotCi0gICAgICBJbnB1dChJbnRyYUxpbmVEaWZmS2V5IGtleSkgewotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUmVzdWx0IHsKLSAgICAgIHN0YXRpYyBmaW5hbCBSZXN1bHQgVElNRU9VVCA9IG5ldyBSZXN1bHQoKEludHJhTGluZURpZmYpIG51bGwpOwotCi0gICAgICBmaW5hbCBJbnRyYUxpbmVEaWZmIGRpZmY7Ci0gICAgICBmaW5hbCBFeGNlcHRpb24gZXJyb3I7Ci0KLSAgICAgIFJlc3VsdChJbnRyYUxpbmVEaWZmIGRpZmYpIHsKLSAgICAgICAgdGhpcy5kaWZmID0gZGlmZjsKLSAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIFJlc3VsdChFeGNlcHRpb24gZXJyb3IpIHsKLSAgICAgICAgdGhpcy5kaWZmID0gbnVsbDsKLSAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEludHJhTGluZURpZmYgY29tcHV0ZShJbnRyYUxpbmVEaWZmS2V5IGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgIHN0YXRpYyBJbnRyYUxpbmVEaWZmIGNvbXB1dGUoSW50cmFMaW5lRGlmZktleSBrZXkpIHRocm93cyBFeGNlcHRpb24gewogICAgIExpc3Q8RWRpdD4gZWRpdHMgPSBuZXcgQXJyYXlMaXN0PEVkaXQ+KGtleS5nZXRFZGl0cygpKTsKICAgICBUZXh0IGFDb250ZW50ID0ga2V5LmdldFRleHRBKCk7CiAgICAgVGV4dCBiQ29udGVudCA9IGtleS5nZXRUZXh0QigpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9JbnRyYUxpbmVXb3JrZXJQb29sLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BhdGNoL0ludHJhTGluZVdvcmtlclBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzYzMzhmZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvSW50cmFMaW5lV29ya2VyUG9vbC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisvLworCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guSW50cmFMaW5lTG9hZGVyLmxvZzsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEludHJhTGluZVdvcmtlclBvb2wgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICBiaW5kKEludHJhTGluZVdvcmtlclBvb2wuY2xhc3MpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZmluYWwgQmxvY2tpbmdRdWV1ZTxXb3JrZXI+IHdvcmtlclBvb2w7CisKKyAgQEluamVjdAorICBwdWJsaWMgSW50cmFMaW5lV29ya2VyUG9vbChAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcpIHsKKyAgICBpbnQgd29ya2VycyA9IGNmZy5nZXRJbnQoCisgICAgICAgICJjYWNoZSIsIFBhdGNoTGlzdENhY2hlSW1wbC5JTlRSQV9OQU1FLCAibWF4SWRsZVdvcmtlcnMiLAorICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCkgKiAzIC8gMik7CisgICAgd29ya2VyUG9vbCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8V29ya2VyPih3b3JrZXJzLCB0cnVlIC8qIGZhaXIgKi8pOworICB9CisKKyAgV29ya2VyIGFjcXVpcmUoKSB7CisgICAgV29ya2VyIHcgPSB3b3JrZXJQb29sLnBvbGwoKTsKKyAgICBpZiAodyA9PSBudWxsKSB7CisgICAgICAvLyBJZiBubyB3b3JrZXIgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLCBzdGFydCBhIG5ldyBvbmUuCisgICAgICAvLyBNYXhpbXVtIHBhcmFsbGVsaXNtIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHdlYiBzZXJ2ZXIuCisgICAgICB3ID0gbmV3IFdvcmtlcigpOworICAgICAgdy5zdGFydCgpOworICAgIH0KKyAgICByZXR1cm4gdzsKKyAgfQorCisgIHZvaWQgcmVsZWFzZShXb3JrZXIgdykgeworICAgIGlmICghd29ya2VyUG9vbC5vZmZlcih3KSkgeworICAgICAgLy8gSWYgdGhlIGlkbGUgd29ya2VyIHBvb2wgaXMgZnVsbCwgdGVybWluYXRlIHRoZSB3b3JrZXIuCisgICAgICB3LnNodXRkb3duR3JhY2VmdWxseSgpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBjbGFzcyBXb3JrZXIgZXh0ZW5kcyBUaHJlYWQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKKworICAgIHByaXZhdGUgZmluYWwgQXJyYXlCbG9ja2luZ1F1ZXVlPElucHV0PiBpbnB1dDsKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5QmxvY2tpbmdRdWV1ZTxSZXN1bHQ+IHJlc3VsdDsKKworICAgIFdvcmtlcigpIHsKKyAgICAgIGlucHV0ID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxJbnB1dD4oMSk7CisgICAgICByZXN1bHQgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFJlc3VsdD4oMSk7CisKKyAgICAgIHNldE5hbWUoIkludHJhTGluZURpZmYtIiArIGNvdW50LmdldEFuZEluY3JlbWVudCgpKTsKKyAgICAgIHNldERhZW1vbih0cnVlKTsKKyAgICB9CisKKyAgICBSZXN1bHQgY29tcHV0ZVdpdGhUaW1lb3V0KEludHJhTGluZURpZmZLZXkga2V5LCBsb25nIHRpbWVvdXRNaWxsaXMpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgaWYgKCFpbnB1dC5vZmZlcihuZXcgSW5wdXQoa2V5KSkpIHsKKyAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgZW5xdWV1ZSB0YXNrIHRvIHRocmVhZCAiICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5USU1FT1VUOworICAgICAgfQorCisgICAgICBSZXN1bHQgciA9IHJlc3VsdC5wb2xsKHRpbWVvdXRNaWxsaXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiByOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nLndhcm4odGltZW91dE1pbGxpcyArICIgbXMgdGltZW91dCByZWFjaGVkIGZvciBJbnRyYUxpbmVEaWZmIgorICAgICAgICAgICAgKyAiIGluIHByb2plY3QgIiArIGtleS5nZXRQcm9qZWN0KCkuZ2V0KCkKKyAgICAgICAgICAgICsgIiBvbiBjb21taXQgIiArIGtleS5nZXRDb21taXQoKS5uYW1lKCkKKyAgICAgICAgICAgICsgIiBmb3IgcGF0aCAiICsga2V5LmdldFBhdGgoKQorICAgICAgICAgICAgKyAiIGNvbXBhcmluZyAiICsga2V5LmdldEJsb2JBKCkubmFtZSgpCisgICAgICAgICAgICArICIuLiIgKyBrZXkuZ2V0QmxvYkIoKS5uYW1lKCkKKyAgICAgICAgICAgICsgIi4gIEtpbGxpbmcgIiArIGdldE5hbWUoKSk7CisgICAgICAgIGZvcmNlZnVsbHlLaWxsVGhyZWFkSW5BblVnbHlXYXkoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5USU1FT1VUOworICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgcHJpdmF0ZSB2b2lkIGZvcmNlZnVsbHlLaWxsVGhyZWFkSW5BblVnbHlXYXkoKSB7CisgICAgICB0cnkgeworICAgICAgICBzdG9wKCk7CisgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgLy8gSWdub3JlIGFueSByZWFzb24gdGhlIHRocmVhZCB3b24ndCBzdG9wLgorICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBzdG9wIHJ1bmF3YXkgdGhyZWFkICIgKyBnZXROYW1lKCksIGVycm9yKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2h1dGRvd25HcmFjZWZ1bGx5KCkgeworICAgICAgaWYgKCFpbnB1dC5vZmZlcihJbnB1dC5FTkRfVEhSRUFEKSkgeworICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCBncmFjZWZ1bGx5IHN0b3AgdGhyZWFkICIgKyBnZXROYW1lKCkpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICBJbnB1dCBpbjsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4gPSBpbnB1dC50YWtlKCk7CisgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLmVycm9yKCJVbmV4cGVjdGVkIGludGVycnVwdCBvbiAiICsgZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChpbiA9PSBJbnB1dC5FTkRfVEhSRUFEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorCisgICAgICAgICAgUmVzdWx0IHI7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIgPSBuZXcgUmVzdWx0KEludHJhTGluZUxvYWRlci5jb21wdXRlKGluLmtleSkpOworICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICAgICAgciA9IG5ldyBSZXN1bHQoZXJyb3IpOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghcmVzdWx0Lm9mZmVyKHIpKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCByZXR1cm4gcmVzdWx0IGZyb20gIiArIGdldE5hbWUoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGNhdGNoIChUaHJlYWREZWF0aCBpSGF2ZUJlZW5TaG90KSB7CisgICAgICAgIC8vIEhhbmRsZSB0aHJlYWQgZGVhdGggYnkgZ3JhY2VmdWxseSByZXR1cm5pbmcgdG8gdGhlIGNhbGxlciwKKyAgICAgICAgLy8gYWxsb3dpbmcgdGhlIHRocmVhZCB0byBiZSBkZXN0cm95ZWQuCisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgICAgc3RhdGljIGZpbmFsIElucHV0IEVORF9USFJFQUQgPSBuZXcgSW5wdXQobnVsbCk7CisKKyAgICAgIGZpbmFsIEludHJhTGluZURpZmZLZXkga2V5OworCisgICAgICBJbnB1dChJbnRyYUxpbmVEaWZmS2V5IGtleSkgeworICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUmVzdWx0IHsKKyAgICAgIHN0YXRpYyBmaW5hbCBSZXN1bHQgVElNRU9VVCA9IG5ldyBSZXN1bHQoKEludHJhTGluZURpZmYpIG51bGwpOworCisgICAgICBmaW5hbCBJbnRyYUxpbmVEaWZmIGRpZmY7CisgICAgICBmaW5hbCBFeGNlcHRpb24gZXJyb3I7CisKKyAgICAgIFJlc3VsdChJbnRyYUxpbmVEaWZmIGRpZmYpIHsKKyAgICAgICAgdGhpcy5kaWZmID0gZGlmZjsKKyAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7CisgICAgICB9CisKKyAgICAgIFJlc3VsdChFeGNlcHRpb24gZXJyb3IpIHsKKyAgICAgICAgdGhpcy5kaWZmID0gbnVsbDsKKyAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9QdWJsaXNoQ29tbWVudHMuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGF0Y2gvUHVibGlzaENvbW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWJjYWEuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wYXRjaC9QdWJsaXNoQ29tbWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoOwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLkNoYW5nZUhvb2tzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0SW5mbzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNoYW5nZVV0aWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5tYWlsLkNvbW1lbnRTZW5kZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5JbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci53b3JrZmxvdy5GdW5jdGlvblN0YXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0anNvbnJwYy5jb21tb24uVm9pZFJlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5hc3Npc3RlZGluamVjdC5Bc3Npc3RlZDsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoQ29tbWVudHMgaW1wbGVtZW50cyBDYWxsYWJsZTxWb2lkUmVzdWx0PiB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQotICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHVibGlzaENvbW1lbnRzLmNsYXNzKTsKLQotICBwdWJsaWMgaW50ZXJmYWNlIEZhY3RvcnkgewotICAgIFB1Ymxpc2hDb21tZW50cyBjcmVhdGUoUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCwgU3RyaW5nIG1lc3NhZ2VUZXh0LAotICAgICAgICBTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHByb3ZhbHMsIGJvb2xlYW4gZm9yY2VNZXNzYWdlKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBSZXZpZXdEYiBkYjsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlciB1c2VyOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgdHlwZXM7Ci0gIHByaXZhdGUgZmluYWwgQ29tbWVudFNlbmRlci5GYWN0b3J5IGNvbW1lbnRTZW5kZXJGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgRnVuY3Rpb25TdGF0ZS5GYWN0b3J5IGZ1bmN0aW9uU3RhdGVGYWN0b3J5OwotICBwcml2YXRlIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzOwotICBwcml2YXRlIGZpbmFsIFdvcmtRdWV1ZSB3b3JrUXVldWU7Ci0gIHByaXZhdGUgZmluYWwgUmVxdWVzdFNjb3BlUHJvcGFnYXRvciByZXF1ZXN0U2NvcGVQcm9wYWdhdG9yOwotCi0gIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZDsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZVRleHQ7Ci0gIHByaXZhdGUgZmluYWwgU2V0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYXBwcm92YWxzOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZm9yY2VNZXNzYWdlOwotCi0gIHByaXZhdGUgQ2hhbmdlIGNoYW5nZTsKLSAgcHJpdmF0ZSBQYXRjaFNldCBwYXRjaFNldDsKLSAgcHJpdmF0ZSBDaGFuZ2VNZXNzYWdlIG1lc3NhZ2U7Ci0gIHByaXZhdGUgTGlzdDxQYXRjaExpbmVDb21tZW50PiBkcmFmdHM7Ci0KLSAgQEluamVjdAotICBQdWJsaXNoQ29tbWVudHMoZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YsIGZpbmFsIFJldmlld0RiIGRiLAotICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIgdXNlciwKLSAgICAgIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlcywKLSAgICAgIGZpbmFsIENvbW1lbnRTZW5kZXIuRmFjdG9yeSBjb21tZW50U2VuZGVyRmFjdG9yeSwKLSAgICAgIGZpbmFsIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcGF0Y2hTZXRJbmZvRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSwKLSAgICAgIGZpbmFsIEZ1bmN0aW9uU3RhdGUuRmFjdG9yeSBmdW5jdGlvblN0YXRlRmFjdG9yeSwKLSAgICAgIGZpbmFsIENoYW5nZUhvb2tzIGhvb2tzLAotICAgICAgZmluYWwgV29ya1F1ZXVlIHdvcmtRdWV1ZSwKLSAgICAgIGZpbmFsIFJlcXVlc3RTY29wZVByb3BhZ2F0b3IgcmVxdWVzdFNjb3BlUHJvcGFnYXRvciwKLQotICAgICAgQEFzc2lzdGVkIGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQsCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgU3RyaW5nIG1lc3NhZ2VUZXh0LAotICAgICAgQEFzc2lzdGVkIGZpbmFsIFNldDxBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGFwcHJvdmFscywKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBib29sZWFuIGZvcmNlTWVzc2FnZSkgewotICAgIHRoaXMuc2NoZW1hRmFjdG9yeSA9IHNmOwotICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLnVzZXIgPSB1c2VyOwotICAgIHRoaXMudHlwZXMgPSBhcHByb3ZhbFR5cGVzOwotICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci0gICAgdGhpcy5jb21tZW50U2VuZGVyRmFjdG9yeSA9IGNvbW1lbnRTZW5kZXJGYWN0b3J5OwotICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgICB0aGlzLmZ1bmN0aW9uU3RhdGVGYWN0b3J5ID0gZnVuY3Rpb25TdGF0ZUZhY3Rvcnk7Ci0gICAgdGhpcy5ob29rcyA9IGhvb2tzOwotICAgIHRoaXMud29ya1F1ZXVlID0gd29ya1F1ZXVlOwotICAgIHRoaXMucmVxdWVzdFNjb3BlUHJvcGFnYXRvciA9IHJlcXVlc3RTY29wZVByb3BhZ2F0b3I7Ci0KLSAgICB0aGlzLnBhdGNoU2V0SWQgPSBwYXRjaFNldElkOwotICAgIHRoaXMubWVzc2FnZVRleHQgPSBtZXNzYWdlVGV4dDsKLSAgICB0aGlzLmFwcHJvdmFscyA9IGFwcHJvdmFsczsKLSAgICB0aGlzLmZvcmNlTWVzc2FnZSA9IGZvcmNlTWVzc2FnZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgVm9pZFJlc3VsdCBjYWxsKCkgdGhyb3dzIE5vU3VjaENoYW5nZUV4Y2VwdGlvbiwKLSAgICAgIEludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQ2hhbmdlLklkIGNoYW5nZUlkID0gcGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKTsKLSAgICBmaW5hbCBDaGFuZ2VDb250cm9sIGN0bCA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5LnZhbGlkYXRlRm9yKGNoYW5nZUlkKTsKLSAgICBjaGFuZ2UgPSBjdGwuZ2V0Q2hhbmdlKCk7Ci0gICAgcGF0Y2hTZXQgPSBkYi5wYXRjaFNldHMoKS5nZXQocGF0Y2hTZXRJZCk7Ci0gICAgaWYgKHBhdGNoU2V0ID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24oY2hhbmdlSWQpOwotICAgIH0KLSAgICBkcmFmdHMgPSBkcmFmdHMoKTsKLQotICAgIGRiLmNoYW5nZXMoKS5iZWdpblRyYW5zYWN0aW9uKGNoYW5nZUlkKTsKLSAgICB0cnkgewotICAgICAgcHVibGlzaERyYWZ0cygpOwotCi0gICAgICBmaW5hbCBib29sZWFuIGlzQ3VycmVudCA9IHBhdGNoU2V0SWQuZXF1YWxzKGNoYW5nZS5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKLSAgICAgIGlmIChpc0N1cnJlbnQgJiYgY2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpKSB7Ci0gICAgICAgIHB1Ymxpc2hBcHByb3ZhbHMoY3RsKTsKLSAgICAgIH0gZWxzZSBpZiAoYXBwcm92YWxzLmlzRW1wdHkoKSB8fCBmb3JjZU1lc3NhZ2UpIHsKLSAgICAgICAgcHVibGlzaE1lc3NhZ2VPbmx5KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENoYW5nZU9wZXJhdGlvbkV4Y2VwdGlvbigiQ2hhbmdlIGlzIGNsb3NlZCIpOwotICAgICAgfQotCi0gICAgICB0b3VjaENoYW5nZSgpOwotICAgICAgZGIuY29tbWl0KCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGRiLnJvbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgZW1haWwoKTsKLSAgICBmaXJlSG9vaygpOwotICAgIHJldHVybiBWb2lkUmVzdWx0LklOU1RBTkNFOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHB1Ymxpc2hEcmFmdHMoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBmb3IgKGZpbmFsIFBhdGNoTGluZUNvbW1lbnQgYyA6IGRyYWZ0cykgewotICAgICAgYy5zZXRTdGF0dXMoUGF0Y2hMaW5lQ29tbWVudC5TdGF0dXMuUFVCTElTSEVEKTsKLSAgICAgIGMudXBkYXRlZCgpOwotICAgIH0KLSAgICBkYi5wYXRjaENvbW1lbnRzKCkudXBkYXRlKGRyYWZ0cyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcHVibGlzaEFwcHJvdmFscyhDaGFuZ2VDb250cm9sIGN0bCkKLSAgICAgIHRocm93cyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uLCBPcm1FeGNlcHRpb24gewotICAgIENoYW5nZVV0aWwudXBkYXRlZChjaGFuZ2UpOwotCi0gICAgZmluYWwgU2V0PEFwcHJvdmFsQ2F0ZWdvcnkuSWQ+IGRpcnR5ID0gbmV3IEhhc2hTZXQ8QXBwcm92YWxDYXRlZ29yeS5JZD4oKTsKLSAgICBmaW5hbCBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IGlucyA9IG5ldyBBcnJheUxpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICBmaW5hbCBMaXN0PFBhdGNoU2V0QXBwcm92YWw+IHVwZCA9IG5ldyBBcnJheUxpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICBmaW5hbCBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFsbCA9Ci0gICAgICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuYnlQYXRjaFNldChwYXRjaFNldElkKS50b0xpc3QoKTsKLSAgICBmaW5hbCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gbWluZSA9IG1pbmUoYWxsKTsKLQotICAgIC8vIEVuc3VyZSBhbnkgbmV3IGFwcHJvdmFscyBhcmUgc3RvcmVkIHByb3Blcmx5LgotICAgIC8vCi0gICAgZm9yIChmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQgd2FudCA6IGFwcHJvdmFscykgewotICAgICAgUGF0Y2hTZXRBcHByb3ZhbCBhID0gbWluZS5nZXQod2FudC5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgICBpZiAoYSA9PSBudWxsKSB7Ci0gICAgICAgIGEgPSBuZXcgUGF0Y2hTZXRBcHByb3ZhbChuZXcgUGF0Y2hTZXRBcHByb3ZhbC5LZXkoLy8KLSAgICAgICAgICAgIHBhdGNoU2V0SWQsIHVzZXIuZ2V0QWNjb3VudElkKCksIHdhbnQuZ2V0UGFyZW50S2V5KCkpLCB3YW50LmdldCgpKTsKLSAgICAgICAgYS5jYWNoZShjaGFuZ2UpOwotICAgICAgICBpbnMuYWRkKGEpOwotICAgICAgICBhbGwuYWRkKGEpOwotICAgICAgICBtaW5lLnB1dChhLmdldENhdGVnb3J5SWQoKSwgYSk7Ci0gICAgICAgIGRpcnR5LmFkZChhLmdldENhdGVnb3J5SWQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm9ybWFsaXplIGFsbCBvZiB0aGUgaXRlbXMgdGhlIHVzZXIgaXMgY2hhbmdpbmcuCi0gICAgLy8KLSAgICBmaW5hbCBGdW5jdGlvblN0YXRlIGZ1bmN0aW9uU3RhdGUgPQotICAgICAgICBmdW5jdGlvblN0YXRlRmFjdG9yeS5jcmVhdGUoY3RsLCBwYXRjaFNldElkLCBhbGwpOwotICAgIGZvciAoZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkIHdhbnQgOiBhcHByb3ZhbHMpIHsKLSAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSA9IG1pbmUuZ2V0KHdhbnQuZ2V0UGFyZW50S2V5KCkpOwotICAgICAgZmluYWwgc2hvcnQgbyA9IGEuZ2V0VmFsdWUoKTsKLSAgICAgIGEuc2V0VmFsdWUod2FudC5nZXQoKSk7Ci0gICAgICBhLmNhY2hlKGNoYW5nZSk7Ci0gICAgICBpZiAoIUFwcHJvdmFsQ2F0ZWdvcnkuU1VCTUlULmVxdWFscyhhLmdldENhdGVnb3J5SWQoKSkpIHsKLSAgICAgICAgZnVuY3Rpb25TdGF0ZS5ub3JtYWxpemUodHlwZXMuYnlJZChhLmdldENhdGVnb3J5SWQoKSksIGEpOwotICAgICAgfQotICAgICAgaWYgKHdhbnQuZ2V0KCkgIT0gYS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgdHlwZXMuYnlJZChhLmdldENhdGVnb3J5SWQoKSkuZ2V0Q2F0ZWdvcnkoKS5nZXRMYWJlbE5hbWUoKQotICAgICAgICAgICAgKyAiPSIgKyB3YW50LmdldCgpICsgIiBub3QgcGVybWl0dGVkIik7Ci0gICAgICB9Ci0gICAgICBpZiAobyAhPSBhLmdldFZhbHVlKCkpIHsKLSAgICAgICAgLy8gVmFsdWUgY2hhbmdlZCwgZW5zdXJlIHdlIHVwZGF0ZSB0aGUgZGF0YWJhc2UuCi0gICAgICAgIC8vCi0gICAgICAgIGEuc2V0R3JhbnRlZCgpOwotICAgICAgICBkaXJ0eS5hZGQoYS5nZXRDYXRlZ29yeUlkKCkpOwotICAgICAgfQotICAgICAgaWYgKCFpbnMuY29udGFpbnMoYSkpIHsKLSAgICAgICAgdXBkLmFkZChhKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBGb3JtYXQgYSBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIGFjdGlvbnMgdGFrZW4uCi0gICAgLy8KLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1zZ2J1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgZm9yIChmaW5hbCBBcHByb3ZhbFR5cGUgYXQgOiB0eXBlcy5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKLSAgICAgIGlmIChkaXJ0eS5jb250YWlucyhhdC5nZXRDYXRlZ29yeSgpLmdldElkKCkpKSB7Ci0gICAgICAgIGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSA9IG1pbmUuZ2V0KGF0LmdldENhdGVnb3J5KCkuZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChhLmdldFZhbHVlKCkgPT0gMCAmJiBpbnMuY29udGFpbnMoYSkpIHsKLSAgICAgICAgICAvLyBEb24ndCBzYXkgIm5vIHNjb3JlIiBmb3IgYW4gaW5pdGlhbCBlbnRyeS4KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB2YWwgPSBhdC5nZXRWYWx1ZShhKTsKLSAgICAgICAgaWYgKG1zZ2J1Zi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBtc2didWYuYXBwZW5kKCI7ICIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh2YWwgIT0gbnVsbCAmJiB2YWwuZ2V0TmFtZSgpICE9IG51bGwgJiYgIXZhbC5nZXROYW1lKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgbXNnYnVmLmFwcGVuZCh2YWwuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtc2didWYuYXBwZW5kKGF0LmdldENhdGVnb3J5KCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBtc2didWYuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgaWYgKGEuZ2V0VmFsdWUoKSA+IDApIG1zZ2J1Zi5hcHBlbmQoJysnKTsKLSAgICAgICAgICBtc2didWYuYXBwZW5kKGEuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBVcGRhdGUgZGFzaGJvYXJkcyBmb3IgZXZlcnlvbmUgZWxzZS4KLSAgICAvLwotICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBhIDogYWxsKSB7Ci0gICAgICBpZiAoIXVzZXIuZ2V0QWNjb3VudElkKCkuZXF1YWxzKGEuZ2V0QWNjb3VudElkKCkpKSB7Ci0gICAgICAgIGEuY2FjaGUoY2hhbmdlKTsKLSAgICAgICAgdXBkLmFkZChhKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkYi5wYXRjaFNldEFwcHJvdmFscygpLnVwZGF0ZSh1cGQpOwotICAgIGRiLnBhdGNoU2V0QXBwcm92YWxzKCkuaW5zZXJ0KGlucyk7Ci0KLSAgICBzdW1tYXJpemVJbmxpbmVDb21tZW50cyhtc2didWYpOwotICAgIG1lc3NhZ2UobXNnYnVmLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHB1Ymxpc2hNZXNzYWdlT25seSgpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIFN0cmluZ0J1aWxkZXIgbXNnYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzdW1tYXJpemVJbmxpbmVDb21tZW50cyhtc2didWYpOwotICAgIG1lc3NhZ2UobXNnYnVmLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIG1lc3NhZ2UoU3RyaW5nIGFjdGlvbnMpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGlmICgoYWN0aW9ucyA9PSBudWxsIHx8IGFjdGlvbnMuaXNFbXB0eSgpKQotICAgICAgICAmJiAobWVzc2FnZVRleHQgPT0gbnVsbCB8fCBtZXNzYWdlVGV4dC5pc0VtcHR5KCkpKSB7Ci0gICAgICAvLyBUaGV5IGhhZCBub3RoaW5nIHRvIHNheT8KLSAgICAgIC8vCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2didWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIG1zZ2J1Zi5hcHBlbmQoIlBhdGNoIFNldCAiICsgcGF0Y2hTZXRJZC5nZXQoKSArICI6Iik7Ci0gICAgaWYgKGFjdGlvbnMgIT0gbnVsbCAmJiAhYWN0aW9ucy5pc0VtcHR5KCkpIHsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoIiAiKTsKLSAgICAgIG1zZ2J1Zi5hcHBlbmQoYWN0aW9ucyk7Ci0gICAgfQotICAgIG1zZ2J1Zi5hcHBlbmQoIlxuXG4iKTsKLSAgICBtc2didWYuYXBwZW5kKG1lc3NhZ2VUZXh0ICE9IG51bGwgPyBtZXNzYWdlVGV4dCA6ICIiKTsKLQotICAgIG1lc3NhZ2UgPSBuZXcgQ2hhbmdlTWVzc2FnZShuZXcgQ2hhbmdlTWVzc2FnZS5LZXkoY2hhbmdlLmdldElkKCksLy8KLSAgICAgICAgQ2hhbmdlVXRpbC5tZXNzYWdlVVVJRChkYikpLCB1c2VyLmdldEFjY291bnRJZCgpLCBwYXRjaFNldElkKTsKLSAgICBtZXNzYWdlLnNldE1lc3NhZ2UobXNnYnVmLnRvU3RyaW5nKCkpOwotICAgIGRiLmNoYW5nZU1lc3NhZ2VzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihtZXNzYWdlKSk7Ci0gIH0KLQotICBwcml2YXRlIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBQYXRjaFNldEFwcHJvdmFsPiBtaW5lKAotICAgICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBhbGwpIHsKLSAgICBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gciA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIFBhdGNoU2V0QXBwcm92YWw+KCk7Ci0gICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIGEgOiBhbGwpIHsKLSAgICAgIGlmICh1c2VyLmdldEFjY291bnRJZCgpLmVxdWFscyhhLmdldEFjY291bnRJZCgpKSkgewotICAgICAgICByLnB1dChhLmdldENhdGVnb3J5SWQoKSwgYSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHRvdWNoQ2hhbmdlKCkgewotICAgIHRyeSB7Ci0gICAgICBDaGFuZ2VVdGlsLnRvdWNoKGNoYW5nZSwgZGIpOwotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBMaXN0PFBhdGNoTGluZUNvbW1lbnQ+IGRyYWZ0cygpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIHJldHVybiBkYi5wYXRjaENvbW1lbnRzKCkuZHJhZnRCeVBhdGNoU2V0QXV0aG9yKHBhdGNoU2V0SWQsIHVzZXIuZ2V0QWNjb3VudElkKCkpLnRvTGlzdCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGVtYWlsKCkgewotICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3b3JrUXVldWUuZ2V0RGVmYXVsdFF1ZXVlKCkKLSAgICAgICAgLnN1Ym1pdChyZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLndyYXAobmV3IFJ1bm5hYmxlKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIFBhdGNoU2V0SW5mbyBwYXRjaFNldEluZm87Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgUmV2aWV3RGIgcmV2aWV3RGIgPSBzY2hlbWFGYWN0b3J5Lm9wZW4oKTsKLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgcGF0Y2hTZXRJbmZvID0gcGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQocmV2aWV3RGIsIHBhdGNoU2V0SWQpOwotICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZXZpZXdEYi5jbG9zZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICBsb2cuZXJyb3IoIkNhbm5vdCByZWFkIFBhdGNoU2V0SW5mbyBvZiAiICsgcGF0Y2hTZXRJZCwgZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGVtYWlsIGNvbW1lbnRzIGZvciAiICsgcGF0Y2hTZXRJZCwgZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBmaW5hbCBDb21tZW50U2VuZGVyIGNtID0gY29tbWVudFNlbmRlckZhY3RvcnkuY3JlYXRlKGNoYW5nZSk7Ci0gICAgICAgICAgY20uc2V0RnJvbSh1c2VyLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICBjbS5zZXRQYXRjaFNldChwYXRjaFNldCwgcGF0Y2hTZXRJbmZvKTsKLSAgICAgICAgICBjbS5zZXRDaGFuZ2VNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICAgIGNtLnNldFBhdGNoTGluZUNvbW1lbnRzKGRyYWZ0cyk7Ci0gICAgICAgICAgY20uc2VuZCgpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgIGxvZy5lcnJvcigiQ2Fubm90IGVtYWlsIGNvbW1lbnRzIGZvciAiICsgcGF0Y2hTZXRJZCwgZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gInNlbmQtZW1haWwgY29tbWVudHMiOwotICAgICAgfQotICAgIH0pKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBmaXJlSG9vaygpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGZpbmFsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+IGNoYW5nZWQgPQotICAgICAgICBuZXcgSGFzaE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+KCk7Ci0gICAgZm9yIChBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQgdiA6IGFwcHJvdmFscykgewotICAgICAgY2hhbmdlZC5wdXQodi5nZXRQYXJlbnRLZXkoKSwgdik7Ci0gICAgfQotCi0gICAgaG9va3MuZG9Db21tZW50QWRkZWRIb29rKGNoYW5nZSwgdXNlci5nZXRBY2NvdW50KCksIHBhdGNoU2V0LCBtZXNzYWdlVGV4dCwgY2hhbmdlZCwgZGIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHN1bW1hcml6ZUlubGluZUNvbW1lbnRzKFN0cmluZ0J1aWxkZXIgaW4pIHsKLSAgICBpZiAoIWRyYWZ0cy5pc0VtcHR5KCkpIHsKLSAgICAgIGlmIChpbi5sZW5ndGgoKSAhPSAwKSB7Ci0gICAgICAgIGluLmFwcGVuZCgiXG5cbiIpOwotICAgICAgfQotICAgICAgaWYgKGRyYWZ0cy5zaXplKCkgPT0gMSkgewotICAgICAgICBpbi5hcHBlbmQoIigxIGlubGluZSBjb21tZW50KSIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW4uYXBwZW5kKCIoIiArIGRyYWZ0cy5zaXplKCkgKyAiIGlubGluZSBjb21tZW50cykiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9BdXRvUmVnaXN0ZXJNb2R1bGVzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQXV0b1JlZ2lzdGVyTW9kdWxlcy5qYXZhCmluZGV4IGU4YWYwNjAuLjYwNjJhZTkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9BdXRvUmVnaXN0ZXJNb2R1bGVzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0F1dG9SZWdpc3Rlck1vZHVsZXMuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLkF1dG9SZWdpc3RlclV0aWwuY2FsY3VsYXRlQmluZEFubm90YXRpb247CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpbkd1aWNlRW52aXJvbm1lbnQuaXM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkxpbmtlZExpc3RNdWx0aW1hcDsKQEAgLTI2LDcgKzI3LDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2NvcGVzOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmludGVybmFsLlVuaXF1ZUFubm90YXRpb25zOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOwogaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOwpAQCAtMTE2LDE2ICsxMTYsNyBAQAogICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgICAgICAgIENsYXNzPE9iamVjdD4gaW1wbCA9IChDbGFzczxPYmplY3Q+KSBlLmdldFZhbHVlKCk7CiAKLSAgICAgICAgICBBbm5vdGF0aW9uIG4gPSBpbXBsLmdldEFubm90YXRpb24oRXhwb3J0LmNsYXNzKTsKLSAgICAgICAgICBpZiAobiA9PSBudWxsKSB7Ci0gICAgICAgICAgICBuID0gaW1wbC5nZXRBbm5vdGF0aW9uKGphdmF4LmluamVjdC5OYW1lZC5jbGFzcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChuID09IG51bGwpIHsKLSAgICAgICAgICAgIG4gPSBpbXBsLmdldEFubm90YXRpb24oY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lZC5jbGFzcyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChuID09IG51bGwpIHsKLSAgICAgICAgICAgIG4gPSBVbmlxdWVBbm5vdGF0aW9ucy5jcmVhdGUoKTsKLSAgICAgICAgICB9CisgICAgICAgICAgQW5ub3RhdGlvbiBuID0gY2FsY3VsYXRlQmluZEFubm90YXRpb24oaW1wbCk7CiAgICAgICAgICAgYmluZCh0eXBlKS5hbm5vdGF0ZWRXaXRoKG4pLnRvKGltcGwpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0yNDUsOSArMjM2LDE2IEBACiAKICAgICAgIGlmIChyYXdUeXBlLmdldEFubm90YXRpb24oRXh0ZW5zaW9uUG9pbnQuY2xhc3MpICE9IG51bGwpIHsKICAgICAgICAgVHlwZUxpdGVyYWw8Pz4gdGwgPSBUeXBlTGl0ZXJhbC5nZXQodHlwZSk7Ci0gICAgICAgIGlmIChlbnYuaGFzRHluYW1pY1NldCh0bCkpIHsKKyAgICAgICAgaWYgKGVudi5oYXNEeW5hbWljSXRlbSh0bCkpIHsKICAgICAgICAgICBzeXNTaW5nbGV0b25zLmFkZChjbGF6eik7CiAgICAgICAgICAgc3lzTGlzdGVuLnB1dCh0bCwgY2xhenopOworICAgICAgICAgIGh0dHBHZW4ubGlzdGVuKHRsLCBjbGF6eik7CisgICAgICAgICAgc3NoR2VuLmxpc3Rlbih0bCwgY2xhenopOworICAgICAgICB9IGVsc2UgaWYgKGVudi5oYXNEeW5hbWljU2V0KHRsKSkgeworICAgICAgICAgIHN5c1NpbmdsZXRvbnMuYWRkKGNsYXp6KTsKKyAgICAgICAgICBzeXNMaXN0ZW4ucHV0KHRsLCBjbGF6eik7CisgICAgICAgICAgaHR0cEdlbi5saXN0ZW4odGwsIGNsYXp6KTsKKyAgICAgICAgICBzc2hHZW4ubGlzdGVuKHRsLCBjbGF6eik7CiAgICAgICAgIH0gZWxzZSBpZiAoZW52Lmhhc0R5bmFtaWNNYXAodGwpKSB7CiAgICAgICAgICAgaWYgKGNsYXp6LmdldEFubm90YXRpb24oRXhwb3J0LmNsYXNzKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBsdWdpbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KApAQCAtMjU2LDYgKzI1NCw4IEBACiAgICAgICAgICAgfQogICAgICAgICAgIHN5c1NpbmdsZXRvbnMuYWRkKGNsYXp6KTsKICAgICAgICAgICBzeXNMaXN0ZW4ucHV0KHRsLCBjbGF6eik7CisgICAgICAgICAgaHR0cEdlbi5saXN0ZW4odGwsIGNsYXp6KTsKKyAgICAgICAgICBzc2hHZW4ubGlzdGVuKHRsLCBjbGF6eik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQbHVnaW5FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgIkNhbm5vdCByZWdpc3RlciAlcywgc2VydmVyIGRvZXMgbm90IGFjY2VwdCAlcyIsCkBAIC0yOTksNyArMjk5LDcgQEAKICAgICByZXR1cm4gZGF0YTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIENsYXNzRGF0YSBpbXBsZW1lbnRzIENsYXNzVmlzaXRvciB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIENsYXNzRGF0YSBleHRlbmRzIENsYXNzVmlzaXRvciB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUE9SVCA9IFR5cGUuZ2V0VHlwZShFeHBvcnQuY2xhc3MpLmdldERlc2NyaXB0b3IoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVEVOID0gVHlwZS5nZXRUeXBlKExpc3Rlbi5jbGFzcykuZ2V0RGVzY3JpcHRvcigpOwogCkBAIC0zMDgsNiArMzA4LDEwIEBACiAgICAgU3RyaW5nIGV4cG9ydGVkQXNOYW1lOwogICAgIGJvb2xlYW4gbGlzdGVuOwogCisgICAgQ2xhc3NEYXRhKCkgeworICAgICAgc3VwZXIoT3Bjb2Rlcy5BU000KTsKKyAgICB9CisKICAgICBib29sZWFuIGlzQ29uY3JldGUoKSB7CiAgICAgICByZXR1cm4gKGFjY2VzcyAmIE9wY29kZXMuQUNDX0FCU1RSQUNUKSA9PSAwCiAgICAgICAgICAgJiYgKGFjY2VzcyAmIE9wY29kZXMuQUNDX0lOVEVSRkFDRSkgPT0gMDsKQEAgLTM3MCw4ICszNzQsMTIgQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25WaXNpdG9yIGltcGxlbWVudHMKKyAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbm5vdGF0aW9uVmlzaXRvciBleHRlbmRzCiAgICAgICBBbm5vdGF0aW9uVmlzaXRvciB7CisgICAgQWJzdHJhY3RBbm5vdGF0aW9uVmlzaXRvcigpIHsKKyAgICAgIHN1cGVyKE9wY29kZXMuQVNNNCk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpIHsKICAgICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0F1dG9SZWdpc3RlclV0aWwuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9BdXRvUmVnaXN0ZXJVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1NmQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9BdXRvUmVnaXN0ZXJVdGlsLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5FeHBvcnQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuaW50ZXJuYWwuVW5pcXVlQW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgQXV0b1JlZ2lzdGVyVXRpbCB7CisKKyAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uIGNhbGN1bGF0ZUJpbmRBbm5vdGF0aW9uKENsYXNzPE9iamVjdD4gaW1wbCkgeworICAgIEFubm90YXRpb24gbiA9IGltcGwuZ2V0QW5ub3RhdGlvbihFeHBvcnQuY2xhc3MpOworICAgIGlmIChuID09IG51bGwpIHsKKyAgICAgIG4gPSBpbXBsLmdldEFubm90YXRpb24oamF2YXguaW5qZWN0Lk5hbWVkLmNsYXNzKTsKKyAgICB9CisgICAgaWYgKG4gPT0gbnVsbCkgeworICAgICAgbiA9IGltcGwuZ2V0QW5ub3RhdGlvbihjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVkLmNsYXNzKTsKKyAgICB9CisgICAgaWYgKG4gPT0gbnVsbCkgeworICAgICAgbiA9IFVuaXF1ZUFubm90YXRpb25zLmNyZWF0ZSgpOworICAgIH0KKyAgICByZXR1cm4gbjsKKyAgfQorCisgIHByaXZhdGUgQXV0b1JlZ2lzdGVyVXRpbCgpIHsKKyAgICAvLyBoaWRlIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0NsZWFudXBIYW5kbGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9DbGVhbnVwSGFuZGxlLmphdmEKaW5kZXggNzAxOGEzYi4uYjA0ZjMzNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0NsZWFudXBIYW5kbGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQ2xlYW51cEhhbmRsZS5qYXZhCkBAIC0xNiwxOSArMTYsMTQgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKIAotY2xhc3MgQ2xlYW51cEhhbmRsZSBleHRlbmRzIFdlYWtSZWZlcmVuY2U8Q2xhc3NMb2FkZXI+IHsKK2NsYXNzIENsZWFudXBIYW5kbGUgewogICBwcml2YXRlIGZpbmFsIEZpbGUgdG1wRmlsZTsKICAgcHJpdmF0ZSBmaW5hbCBKYXJGaWxlIGphckZpbGU7CiAKICAgQ2xlYW51cEhhbmRsZShGaWxlIHRtcEZpbGUsCi0gICAgICBKYXJGaWxlIGphckZpbGUsCi0gICAgICBDbGFzc0xvYWRlciByZWYsCi0gICAgICBSZWZlcmVuY2VRdWV1ZTxDbGFzc0xvYWRlcj4gcXVldWUpIHsKLSAgICBzdXBlcihyZWYsIHF1ZXVlKTsKKyAgICAgIEphckZpbGUgamFyRmlsZSkgewogICAgIHRoaXMudG1wRmlsZSA9IHRtcEZpbGU7CiAgICAgdGhpcy5qYXJGaWxlID0gamFyRmlsZTsKICAgfQpAQCAtMzksNyArMzQsOSBAQAogICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewogICAgIH0KICAgICBpZiAoIXRtcEZpbGUuZGVsZXRlKCkgJiYgdG1wRmlsZS5leGlzdHMoKSkgewotICAgICAgUGx1Z2luTG9hZGVyLmxvZy53YXJuKCJDYW5ub3QgZGVsZXRlICIgKyB0bXBGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgIFBsdWdpbkxvYWRlci5sb2cud2FybigiQ2Fubm90IGRlbGV0ZSAiICsgdG1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICsgIiwgcmV0cnlpbmcgdG8gZGVsZXRlIGl0IG9uIHRlcm1pbmF0aW9uIG9mIHRoZSB2aXJ0dWFsIG1hY2hpbmUiKTsKKyAgICAgIHRtcEZpbGUuZGVsZXRlT25FeGl0KCk7CiAgICAgfSBlbHNlIHsKICAgICAgIFBsdWdpbkxvYWRlci5sb2cuaW5mbygiQ2xlYW5lZCBwbHVnaW4gIiArIHRtcEZpbGUuZ2V0TmFtZSgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQ29weUNvbmZpZ01vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0NvcHlDb25maWdNb2R1bGUuamF2YQppbmRleCBmMzQ4MjZkLi42N2VlN2I0IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvQ29weUNvbmZpZ01vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9Db3B5Q29uZmlnTW9kdWxlLmphdmEKQEAgLTE1LDYgKzE1LDkgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudFByb3ZpZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwpAQCAtMjcsNiArMzAsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIApAQCAtOTMsNiArOTcsMjUgQEAKICAgfQogCiAgIEBJbmplY3QKKyAgQEFub255bW91c0Nvd2FyZE5hbWUKKyAgcHJpdmF0ZSBTdHJpbmcgYW5vbnltb3VzQ293YXJkTmFtZTsKKworICBAUHJvdmlkZXMKKyAgQEFub255bW91c0Nvd2FyZE5hbWUKKyAgU3RyaW5nIGdldEFub255bW91c0Nvd2FyZE5hbWUoKSB7CisgICAgcmV0dXJuIGFub255bW91c0Nvd2FyZE5hbWU7CisgIH0KKworICBASW5qZWN0CisgIHByaXZhdGUgR2Vycml0UGVyc29uSWRlbnRQcm92aWRlciBzZXJ2ZXJJZGVudFByb3ZpZGVyOworCisgIEBQcm92aWRlcworICBAR2Vycml0UGVyc29uSWRlbnQKKyAgUGVyc29uSWRlbnQgZ2V0U2VydmVySWRlbnQoKSB7CisgICAgcmV0dXJuIHNlcnZlcklkZW50UHJvdmlkZXIuZ2V0KCk7CisgIH0KKworICBASW5qZWN0CiAgIENvcHlDb25maWdNb2R1bGUoKSB7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0Rpc2FibGVQbHVnaW4uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9EaXNhYmxlUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlNWNlNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9EaXNhYmxlUGx1Z2luLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuRGlzYWJsZVBsdWdpbi5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSKQorY2xhc3MgRGlzYWJsZVBsdWdpbiBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFBsdWdpblJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5Mb2FkZXIgbG9hZGVyOworCisgIEBJbmplY3QKKyAgRGlzYWJsZVBsdWdpbihQbHVnaW5Mb2FkZXIgbG9hZGVyKSB7CisgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQbHVnaW5SZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpIHsKKyAgICBTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKKyAgICBsb2FkZXIuZGlzYWJsZVBsdWdpbnMoSW1tdXRhYmxlU2V0Lm9mKG5hbWUpKTsKKyAgICByZXR1cm4gbmV3IExpc3RQbHVnaW5zLlBsdWdpbkluZm8obG9hZGVyLmdldChuYW1lKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9FbmFibGVQbHVnaW4uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9FbmFibGVQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNkODE0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0VuYWJsZVBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2luczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLkVuYWJsZVBsdWdpbi5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUikKK2NsYXNzIEVuYWJsZVBsdWdpbiBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFBsdWdpblJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5Mb2FkZXIgbG9hZGVyOworCisgIEBJbmplY3QKKyAgRW5hYmxlUGx1Z2luKFBsdWdpbkxvYWRlciBsb2FkZXIpIHsKKyAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFBsdWdpblJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uIHsKKyAgICBTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKKyAgICB0cnkgeworICAgICAgbG9hZGVyLmVuYWJsZVBsdWdpbnMoSW1tdXRhYmxlU2V0Lm9mKG5hbWUpKTsKKyAgICB9IGNhdGNoIChQbHVnaW5JbnN0YWxsRXhjZXB0aW9uIGUpIHsKKyAgICAgIFN0cmluZ1dyaXRlciBidWYgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICBidWYud3JpdGUoU3RyaW5nLmZvcm1hdCgiY2Fubm90IGVuYWJsZSAlc1xuIiwgbmFtZSkpOworICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoYnVmKTsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgIHB3LmZsdXNoKCk7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihidWYudG9TdHJpbmcoKSk7CisgICAgfQorICAgIHJldHVybiBuZXcgTGlzdFBsdWdpbnMuUGx1Z2luSW5mbyhsb2FkZXIuZ2V0KG5hbWUpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0dldFN0YXR1cy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0dldFN0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDdkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvR2V0U3RhdHVzLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKKworY2xhc3MgR2V0U3RhdHVzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFBsdWdpblJlc291cmNlPiB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFBsdWdpblJlc291cmNlIHJlc291cmNlKSB7CisgICAgcmV0dXJuIG5ldyBMaXN0UGx1Z2lucy5QbHVnaW5JbmZvKHJlc291cmNlLmdldFBsdWdpbigpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0luc3RhbGxQbHVnaW4uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9JbnN0YWxsUGx1Z2luLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjYWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9JbnN0YWxsUGx1Z2luLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2luczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUHV0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5JbnN0YWxsUGx1Z2luLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CisKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSKQorY2xhc3MgSW5zdGFsbFBsdWdpbiBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFRvcExldmVsUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyB1cmw7CisgICAgUHV0SW5wdXQgcmF3OworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5Mb2FkZXIgbG9hZGVyOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY3JlYXRlZDsKKworICBJbnN0YWxsUGx1Z2luKFBsdWdpbkxvYWRlciBsb2FkZXIsIFN0cmluZyBuYW1lLCBib29sZWFuIGNyZWF0ZWQpIHsKKyAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIHRoaXMuY3JlYXRlZCA9IGNyZWF0ZWQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3BvbnNlPExpc3RQbHVnaW5zLlBsdWdpbkluZm8+IGFwcGx5KFRvcExldmVsUmVzb3VyY2UgcmVzb3VyY2UsCisgICAgICBJbnB1dCBpbnB1dCkgdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgSW5wdXRTdHJlYW0gaW47CisgICAgICBpZiAoaW5wdXQucmF3ICE9IG51bGwpIHsKKyAgICAgICAgaW4gPSBpbnB1dC5yYXcuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgaW4gPSBuZXcgVVJMKGlucHV0LnVybCkub3BlblN0cmVhbSgpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgbG9hZGVyLmluc3RhbGxQbHVnaW5Gcm9tU3RyZWFtKG5hbWUsIGluKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGluLmNsb3NlKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoUGx1Z2luSW5zdGFsbEV4Y2VwdGlvbiBlKSB7CisgICAgICBTdHJpbmdXcml0ZXIgYnVmID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgYnVmLndyaXRlKFN0cmluZy5mb3JtYXQoImNhbm5vdCBpbnN0YWxsICVzIiwgbmFtZSkpOworICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFppcEV4Y2VwdGlvbikgeworICAgICAgICBidWYud3JpdGUoIjogIik7CisgICAgICAgIGJ1Zi53cml0ZShlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJ1Zi53cml0ZSgiOlxuIik7CisgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKGJ1Zik7CisgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKHB3KTsKKyAgICAgICAgcHcuZmx1c2goKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBMaXN0UGx1Z2lucy5QbHVnaW5JbmZvIGluZm8gPSBuZXcgTGlzdFBsdWdpbnMuUGx1Z2luSW5mbyhsb2FkZXIuZ2V0KG5hbWUpKTsKKyAgICByZXR1cm4gY3JlYXRlZCA/IFJlc3BvbnNlLmNyZWF0ZWQoaW5mbykgOiBSZXNwb25zZS5vayhpbmZvKTsKKyAgfQorCisgIEBSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSKQorICBzdGF0aWMgY2xhc3MgT3ZlcndyaXRlIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UGx1Z2luUmVzb3VyY2UsIElucHV0PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5Mb2FkZXIgbG9hZGVyOworCisgICAgQEluamVjdAorICAgIE92ZXJ3cml0ZShQbHVnaW5Mb2FkZXIgbG9hZGVyKSB7CisgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2U8TGlzdFBsdWdpbnMuUGx1Z2luSW5mbz4gYXBwbHkoUGx1Z2luUmVzb3VyY2UgcmVzb3VyY2UsCisgICAgICAgIElucHV0IGlucHV0KSB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgcmV0dXJuIG5ldyBJbnN0YWxsUGx1Z2luKGxvYWRlciwgcmVzb3VyY2UuZ2V0TmFtZSgpLCBmYWxzZSkKKyAgICAgICAgLmFwcGx5KFRvcExldmVsUmVzb3VyY2UuSU5TVEFOQ0UsIGlucHV0KTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9MaXN0UGx1Z2lucy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0xpc3RQbHVnaW5zLmphdmEKaW5kZXggM2Y3YmM5Ny4uY2I2NWU4YyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0xpc3RQbHVnaW5zLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL0xpc3RQbHVnaW5zLmphdmEKQEAgLTE3LDcgKzE3LDE2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25FbGVtZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTM0LDEwICs0MywxMiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKiBMaXN0IHRoZSBpbnN0YWxsZWQgcGx1Z2lucy4gKi8KLXB1YmxpYyBjbGFzcyBMaXN0UGx1Z2lucyB7CitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUikKK3B1YmxpYyBjbGFzcyBMaXN0UGx1Z2lucyBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxUb3BMZXZlbFJlc291cmNlPiB7CiAgIHByaXZhdGUgZmluYWwgUGx1Z2luTG9hZGVyIHBsdWdpbkxvYWRlcjsKIAotICBAT3B0aW9uKG5hbWUgPSAiLS1mb3JtYXQiLCBtZXRhVmFyID0gIkZNVCIsIHVzYWdlID0gIk91dHB1dCBkaXNwbGF5IGZvcm1hdCIpCisgIEBEZXByZWNhdGVkCisgIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIHVzYWdlID0gIihkZXByZWNhdGVkKSBvdXRwdXQgZm9ybWF0IikKICAgcHJpdmF0ZSBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LlRFWFQ7CiAKICAgQE9wdGlvbihuYW1lID0gIi0tYWxsIiwgYWxpYXNlcyA9IHsiLWEifSwgdXNhZ2UgPSAiTGlzdCBhbGwgcGx1Z2lucywgaW5jbHVkaW5nIGRpc2FibGVkIHBsdWdpbnMiKQpAQCAtNTcsMTkgKzY4LDI2IEBACiAgICAgcmV0dXJuIHRoaXM7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBkaXNwbGF5KE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICBmaW5hbCBQcmludFdyaXRlciBzdGRvdXQ7Ci0gICAgdHJ5IHsKLSAgICAgIHN0ZG91dCA9Ci0gICAgICAgICAgbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwKLSAgICAgICAgICAgICAgIlVURi04IikpKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIE91ciBlbmNvZGluZyBpcyByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBydW50aW1lLgotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpWTSBsYWNrcyBVVEYtOCBlbmNvZGluZyIsIGUpOworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShUb3BMZXZlbFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sIEV4Y2VwdGlvbiB7CisgICAgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LkpTT047CisgICAgcmV0dXJuIGRpc3BsYXkobnVsbCk7CisgIH0KKworICBwdWJsaWMgSnNvbkVsZW1lbnQgZGlzcGxheShPdXRwdXRTdHJlYW0gZGlzcGxheU91dHB1dFN0cmVhbSkKKyAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBQcmludFdyaXRlciBzdGRvdXQgPSBudWxsOworICAgIGlmIChkaXNwbGF5T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0ZG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIoCisgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGRpc3BsYXlPdXRwdXRTdHJlYW0sICJVVEYtOCIpKSk7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpWTSBsYWNrcyBVVEYtOCBlbmNvZGluZyIsIGUpOworICAgICAgfQogICAgIH0KIAogICAgIE1hcDxTdHJpbmcsIFBsdWdpbkluZm8+IG91dHB1dCA9IE1hcHMubmV3VHJlZU1hcCgpOwotCiAgICAgTGlzdDxQbHVnaW4+IHBsdWdpbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QocGx1Z2luTG9hZGVyLmdldFBsdWdpbnMoYWxsKSk7CiAgICAgQ29sbGVjdGlvbnMuc29ydChwbHVnaW5zLCBuZXcgQ29tcGFyYXRvcjxQbHVnaW4+KCkgewogICAgICAgQE92ZXJyaWRlCkBAIC04MCwxNSArOTgsMTEgQEAKIAogICAgIGlmICghZm9ybWF0LmlzSnNvbigpKSB7CiAgICAgICBzdGRvdXQuZm9ybWF0KCIlLTMwcyAlLTEwcyAlLThzXG4iLCAiTmFtZSIsICJWZXJzaW9uIiwgIlN0YXR1cyIpOwotICAgICAgc3Rkb3V0Ci0gICAgICAgICAgLnByaW50KCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgIHN0ZG91dC5wcmludCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgfQogCiAgICAgZm9yIChQbHVnaW4gcCA6IHBsdWdpbnMpIHsKLSAgICAgIFBsdWdpbkluZm8gaW5mbyA9IG5ldyBQbHVnaW5JbmZvKCk7Ci0gICAgICBpbmZvLnZlcnNpb24gPSBwLmdldFZlcnNpb24oKTsKLSAgICAgIGluZm8uZGlzYWJsZWQgPSBwLmlzRGlzYWJsZWQoKSA/IHRydWUgOiBudWxsOwotCisgICAgICBQbHVnaW5JbmZvIGluZm8gPSBuZXcgUGx1Z2luSW5mbyhwKTsKICAgICAgIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKICAgICAgICAgb3V0cHV0LnB1dChwLmdldE5hbWUoKSwgaW5mbyk7CiAgICAgICB9IGVsc2UgewpAQCAtOTgsMTkgKzExMiwyOSBAQAogICAgICAgfQogICAgIH0KIAotICAgIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKKyAgICBpZiAoc3Rkb3V0ID09IG51bGwpIHsKKyAgICAgIHJldHVybiBPdXRwdXRGb3JtYXQuSlNPTi5uZXdHc29uKCkudG9Kc29uVHJlZSgKKyAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgbmV3IFR5cGVUb2tlbjxNYXA8U3RyaW5nLCBPYmplY3Q+PigpIHt9LmdldFR5cGUoKSk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKICAgICAgIGZvcm1hdC5uZXdHc29uKCkudG9Kc29uKG91dHB1dCwKICAgICAgICAgICBuZXcgVHlwZVRva2VuPE1hcDxTdHJpbmcsIFBsdWdpbkluZm8+PigpIHt9LmdldFR5cGUoKSwgc3Rkb3V0KTsKICAgICAgIHN0ZG91dC5wcmludCgnXG4nKTsKICAgICB9CiAgICAgc3Rkb3V0LmZsdXNoKCk7CisgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQbHVnaW5JbmZvIHsKKyAgc3RhdGljIGNsYXNzIFBsdWdpbkluZm8geworICAgIGZpbmFsIFN0cmluZyBraW5kID0gImdlcnJpdGNvZGVyZXZpZXcjcGx1Z2luIjsKKyAgICBTdHJpbmcgaWQ7CiAgICAgU3RyaW5nIHZlcnNpb247Ci0gICAgLy8gZGlzYWJsZWQgaXMgb25seSByZWFkIHZpYSByZWZsZWN0aW9uIHdoZW4gYnVpbGRpbmcgdGhlIGpzb24gb3V0cHV0LiAgV2UKLSAgICAvLyBkbyBub3Qgd2FudCB0byBzaG93IGEgY29tcGlsZXIgZXJyb3IgdGhhdCBpdCBpc24ndCB1c2VkLgotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIEJvb2xlYW4gZGlzYWJsZWQ7CisKKyAgICBQbHVnaW5JbmZvKFBsdWdpbiBwKSB7CisgICAgICBpZCA9IFVybC5lbmNvZGUocC5nZXROYW1lKCkpOworICAgICAgdmVyc2lvbiA9IHAuZ2V0VmVyc2lvbigpOworICAgICAgZGlzYWJsZWQgPSBwLmlzRGlzYWJsZWQoKSA/IHRydWUgOiBudWxsOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL01vZHVsZUdlbmVyYXRvci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL01vZHVsZUdlbmVyYXRvci5qYXZhCmluZGV4IDkyZTNiMWQuLjIwMTFlOWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9Nb2R1bGVHZW5lcmF0b3IuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvTW9kdWxlR2VuZXJhdG9yLmphdmEKQEAgLTE2LDExICsxNiwxNCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5FeHBvcnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOwogCiBwdWJsaWMgaW50ZXJmYWNlIE1vZHVsZUdlbmVyYXRvciB7CiAgIHZvaWQgc2V0UGx1Z2luTmFtZShTdHJpbmcgbmFtZSk7CiAKICAgdm9pZCBleHBvcnQoRXhwb3J0IGV4cG9ydCwgQ2xhc3M8Pz4gdHlwZSkgdGhyb3dzIEludmFsaWRQbHVnaW5FeGNlcHRpb247CiAKKyAgdm9pZCBsaXN0ZW4oVHlwZUxpdGVyYWw8Pz4gdGwsIENsYXNzPD8+IGNsYXp6KTsKKwogICBNb2R1bGUgY3JlYXRlKCkgdGhyb3dzIEludmFsaWRQbHVnaW5FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luLmphdmEKaW5kZXggOTFmZmJiYS4uOGU3MTkyZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbi5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW4uamF2YQpAQCAtMjAsOCArMjAsOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUGx1Z2luTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5SZWdpc3RyYXRpb25IYW5kbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uUmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnN5c3RlbXN0YXR1cy5TZXJ2ZXJJbmZvcm1hdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUGx1Z2luVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0Q29udGV4dDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5BYnN0cmFjdE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5HdWljZTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKQEAgLTI5LDcgKzMwLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aXNpb25FeGNlcHRpb247CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZS5GaWxlU25hcHNob3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuRmlsZVNuYXBzaG90OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTQyLDcgKzQzLDcgQEAKIAogcHVibGljIGNsYXNzIFBsdWdpbiB7CiAgIHB1YmxpYyBzdGF0aWMgZW51bSBBcGlUeXBlIHsKLSAgICBFWFRFTlNJT04sIFBMVUdJTjsKKyAgICBFWFRFTlNJT04sIFBMVUdJTiwgSlM7CiAgIH0KIAogICAvKiogVW5pcXVlIGtleSB0aGF0IGNoYW5nZXMgd2hlbmV2ZXIgYSBwbHVnaW4gcmVsb2Fkcy4gKi8KQEAgLTc1LDYgKzc2LDggQEAKICAgICAgIHJldHVybiBBcGlUeXBlLkVYVEVOU0lPTjsKICAgICB9IGVsc2UgaWYgKEFwaVR5cGUuUExVR0lOLm5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHYpKSB7CiAgICAgICByZXR1cm4gQXBpVHlwZS5QTFVHSU47CisgICAgfSBlbHNlIGlmIChBcGlUeXBlLkpTLm5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHYpKSB7CisgICAgICByZXR1cm4gQXBpVHlwZS5KUzsKICAgICB9IGVsc2UgewogICAgICAgdGhyb3cgbmV3IEludmFsaWRQbHVnaW5FeGNlcHRpb24oIkludmFsaWQgR2Vycml0LUFwaVR5cGU6ICIgKyB2KTsKICAgICB9CkBAIC04Miw2ICs4NSw3IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBDYWNoZUtleSBjYWNoZUtleTsKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5Vc2VyIHBsdWdpblVzZXI7CiAgIHByaXZhdGUgZmluYWwgRmlsZSBzcmNKYXI7CiAgIHByaXZhdGUgZmluYWwgRmlsZVNuYXBzaG90IHNuYXBzaG90OwogICBwcml2YXRlIGZpbmFsIEphckZpbGUgamFyRmlsZTsKQEAgLTEwMSw2ICsxMDUsNyBAQAogICBwcml2YXRlIExpc3Q8UmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTw/Pj4gcmVsb2FkYWJsZUhhbmRsZXM7CiAKICAgcHVibGljIFBsdWdpbihTdHJpbmcgbmFtZSwKKyAgICAgIFBsdWdpblVzZXIgcGx1Z2luVXNlciwKICAgICAgIEZpbGUgc3JjSmFyLAogICAgICAgRmlsZVNuYXBzaG90IHNuYXBzaG90LAogICAgICAgSmFyRmlsZSBqYXJGaWxlLApAQCAtMTEyLDYgKzExNyw3IEBACiAgICAgICBATnVsbGFibGUgQ2xhc3M8PyBleHRlbmRzIE1vZHVsZT4gc3NoTW9kdWxlLAogICAgICAgQE51bGxhYmxlIENsYXNzPD8gZXh0ZW5kcyBNb2R1bGU+IGh0dHBNb2R1bGUpIHsKICAgICB0aGlzLmNhY2hlS2V5ID0gbmV3IENhY2hlS2V5KG5hbWUpOworICAgIHRoaXMucGx1Z2luVXNlciA9IHBsdWdpblVzZXI7CiAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB0aGlzLnNyY0phciA9IHNyY0phcjsKICAgICB0aGlzLnNuYXBzaG90ID0gc25hcHNob3Q7CkBAIC0xMzAsNiArMTM2LDEwIEBACiAgICAgcmV0dXJuIHNyY0phcjsKICAgfQogCisgIFBsdWdpblVzZXIgZ2V0UGx1Z2luVXNlcigpIHsKKyAgICByZXR1cm4gcGx1Z2luVXNlcjsKKyAgfQorCiAgIHB1YmxpYyBDYWNoZUtleSBnZXRDYWNoZUtleSgpIHsKICAgICByZXR1cm4gY2FjaGVLZXk7CiAgIH0KQEAgLTE3MSw3ICsxODEsMTYgQEAKICAgICByZXR1cm4gZGlzYWJsZWQ7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzdGFydChQbHVnaW5HdWljZUVudmlyb25tZW50IGVudikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgIHZvaWQgc3RhcnQoUGx1Z2luR3VpY2VFbnZpcm9ubWVudCBlbnYpIHRocm93cyBFeGNlcHRpb24geworICAgIFJlcXVlc3RDb250ZXh0IG9sZENvbnRleHQgPSBlbnYuZW50ZXIodGhpcyk7CisgICAgdHJ5IHsKKyAgICAgIHN0YXJ0UGx1Z2luKGVudik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGVudi5leGl0KG9sZENvbnRleHQpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBzdGFydFBsdWdpbihQbHVnaW5HdWljZUVudmlyb25tZW50IGVudikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgSW5qZWN0b3Igcm9vdCA9IG5ld1Jvb3RJbmplY3RvcihlbnYpOwogICAgIG1hbmFnZXIgPSBuZXcgTGlmZWN5Y2xlTWFuYWdlcigpOwogCkBAIC0yMjgsMjAgKzI0NywxMyBAQAogCiAgIHByaXZhdGUgSW5qZWN0b3IgbmV3Um9vdEluamVjdG9yKGZpbmFsIFBsdWdpbkd1aWNlRW52aXJvbm1lbnQgZW52KSB7CiAgICAgTGlzdDxNb2R1bGU+IG1vZHVsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoNCk7Ci0gICAgbW9kdWxlcy5hZGQoZW52LmdldFN5c01vZHVsZSgpKTsKICAgICBpZiAoYXBpVHlwZSA9PSBBcGlUeXBlLlBMVUdJTikgewogICAgICAgbW9kdWxlcy5hZGQoZW52LmdldFN5c01vZHVsZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgbW9kdWxlcy5hZGQobmV3IEFic3RyYWN0TW9kdWxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICAgIGJpbmQoU2VydmVySW5mb3JtYXRpb24uY2xhc3MpLnRvSW5zdGFuY2UoZW52LmdldFNlcnZlckluZm9ybWF0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICB9KTsKICAgICB9CiAgICAgbW9kdWxlcy5hZGQobmV3IEFic3RyYWN0TW9kdWxlKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoUGx1Z2luVXNlci5jbGFzcykudG9JbnN0YW5jZShwbHVnaW5Vc2VyKTsKICAgICAgICAgYmluZChTdHJpbmcuY2xhc3MpCiAgICAgICAgICAgLmFubm90YXRlZFdpdGgoUGx1Z2luTmFtZS5jbGFzcykKICAgICAgICAgICAudG9JbnN0YW5jZShuYW1lKTsKQEAgLTI3MSw5ICsyODMsMTQgQEAKICAgICByZXR1cm4gR3VpY2UuY3JlYXRlSW5qZWN0b3IobW9kdWxlcyk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICB2b2lkIHN0b3AoUGx1Z2luR3VpY2VFbnZpcm9ubWVudCBlbnYpIHsKICAgICBpZiAobWFuYWdlciAhPSBudWxsKSB7Ci0gICAgICBtYW5hZ2VyLnN0b3AoKTsKKyAgICAgIFJlcXVlc3RDb250ZXh0IG9sZENvbnRleHQgPSBlbnYuZW50ZXIodGhpcyk7CisgICAgICB0cnkgeworICAgICAgICBtYW5hZ2VyLnN0b3AoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIGVudi5leGl0KG9sZENvbnRleHQpOworICAgICAgfQogICAgICAgbWFuYWdlciA9IG51bGw7CiAgICAgICBzeXNJbmplY3RvciA9IG51bGw7CiAgICAgICBzc2hJbmplY3RvciA9IG51bGw7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luR3VpY2VFbnZpcm9ubWVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbkd1aWNlRW52aXJvbm1lbnQuamF2YQppbmRleCAxODQ2MGZmLi4zODdmZmE0IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luR3VpY2VFbnZpcm9ubWVudC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5HdWljZUVudmlyb25tZW50LmphdmEKQEAgLTEzLDYgKzEzLDggQEAKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLlByaXZhdGVJbnRlcm5hbHNfRHluYW1pY1R5cGVzLmR5bmFtaWNJdGVtc09mOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5Qcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNUeXBlcy5keW5hbWljTWFwc09mOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5Qcml2YXRlSW50ZXJuYWxzX0R5bmFtaWNUeXBlcy5keW5hbWljU2V0c09mOwogCkBAIC0yMiw2ICsyNCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljSXRlbTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5EeW5hbWljTWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uUHJpdmF0ZUludGVybmFsc19EeW5hbWljTWFwSW1wbDsKQEAgLTI5LDYgKzMyLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlZ2lzdHJhdGlvbi5SZWdpc3RyYXRpb25IYW5kbGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uUmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnN5c3RlbXN0YXR1cy5TZXJ2ZXJJbmZvcm1hdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5QbHVnaW5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5UaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7CkBAIC02Miw2ICs2OCw3IEBACiBwdWJsaWMgY2xhc3MgUGx1Z2luR3VpY2VFbnZpcm9ubWVudCB7CiAgIHByaXZhdGUgZmluYWwgSW5qZWN0b3Igc3lzSW5qZWN0b3I7CiAgIHByaXZhdGUgZmluYWwgU2VydmVySW5mb3JtYXRpb24gc3J2SW5mbzsKKyAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsOwogICBwcml2YXRlIGZpbmFsIENvcHlDb25maWdNb2R1bGUgY29weUNvbmZpZ01vZHVsZTsKICAgcHJpdmF0ZSBmaW5hbCBTZXQ8S2V5PD8+PiBjb3B5Q29uZmlnS2V5czsKICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0YXJ0UGx1Z2luTGlzdGVuZXI+IG9uU3RhcnQ7CkBAIC03NCw2ICs4MSw4IEBACiAgIHByaXZhdGUgUHJvdmlkZXI8TW9kdWxlR2VuZXJhdG9yPiBzc2hHZW47CiAgIHByaXZhdGUgUHJvdmlkZXI8TW9kdWxlR2VuZXJhdG9yPiBodHRwR2VuOwogCisgIHByaXZhdGUgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljSXRlbTw/Pj4gc3lzSXRlbXM7CisKICAgcHJpdmF0ZSBNYXA8VHlwZUxpdGVyYWw8Pz4sIER5bmFtaWNTZXQ8Pz4+IHN5c1NldHM7CiAgIHByaXZhdGUgTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljU2V0PD8+PiBzc2hTZXRzOwogICBwcml2YXRlIE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY1NldDw/Pj4gaHR0cFNldHM7CkBAIC04NSwxMCArOTQsMTIgQEAKICAgQEluamVjdAogICBQbHVnaW5HdWljZUVudmlyb25tZW50KAogICAgICAgSW5qZWN0b3Igc3lzSW5qZWN0b3IsCisgICAgICBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsLAogICAgICAgU2VydmVySW5mb3JtYXRpb24gc3J2SW5mbywKICAgICAgIENvcHlDb25maWdNb2R1bGUgY2NtKSB7CiAgICAgdGhpcy5zeXNJbmplY3RvciA9IHN5c0luamVjdG9yOwogICAgIHRoaXMuc3J2SW5mbyA9IHNydkluZm87CisgICAgdGhpcy5sb2NhbCA9IGxvY2FsOwogICAgIHRoaXMuY29weUNvbmZpZ01vZHVsZSA9IGNjbTsKICAgICB0aGlzLmNvcHlDb25maWdLZXlzID0gR3VpY2UuY3JlYXRlSW5qZWN0b3IoY2NtKS5nZXRBbGxCaW5kaW5ncygpLmtleVNldCgpOwogCkBAIC05OCw2ICsxMDksNyBAQAogICAgIG9uUmVsb2FkID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PFJlbG9hZFBsdWdpbkxpc3RlbmVyPigpOwogICAgIG9uUmVsb2FkLmFkZEFsbChsaXN0ZW5lcnMoc3lzSW5qZWN0b3IsIFJlbG9hZFBsdWdpbkxpc3RlbmVyLmNsYXNzKSk7CiAKKyAgICBzeXNJdGVtcyA9IGR5bmFtaWNJdGVtc09mKHN5c0luamVjdG9yKTsKICAgICBzeXNTZXRzID0gZHluYW1pY1NldHNPZihzeXNJbmplY3Rvcik7CiAgICAgc3lzTWFwcyA9IGR5bmFtaWNNYXBzT2Yoc3lzSW5qZWN0b3IpOwogICB9CkBAIC0xMDYsNiArMTE4LDEwIEBACiAgICAgcmV0dXJuIHNydkluZm87CiAgIH0KIAorICBib29sZWFuIGhhc0R5bmFtaWNJdGVtKFR5cGVMaXRlcmFsPD8+IHR5cGUpIHsKKyAgICByZXR1cm4gc3lzSXRlbXMuY29udGFpbnNLZXkodHlwZSk7CisgIH0KKwogICBib29sZWFuIGhhc0R5bmFtaWNTZXQoVHlwZUxpdGVyYWw8Pz4gdHlwZSkgewogICAgIHJldHVybiBzeXNTZXRzLmNvbnRhaW5zS2V5KHR5cGUpCiAgICAgICAgIHx8IChzc2hTZXRzICE9IG51bGwgJiYgc3NoU2V0cy5jb250YWluc0tleSh0eXBlKSkKQEAgLTE3NywxOCArMTkzLDQyIEBACiAgICAgcmV0dXJuIGh0dHBHZW4uZ2V0KCk7CiAgIH0KIAorICBSZXF1ZXN0Q29udGV4dCBlbnRlcihQbHVnaW4gcGx1Z2luKSB7CisgICAgcmV0dXJuIGxvY2FsLnNldENvbnRleHQobmV3IFBsdWdpblJlcXVlc3RDb250ZXh0KHBsdWdpbi5nZXRQbHVnaW5Vc2VyKCkpKTsKKyAgfQorCisgIHZvaWQgZXhpdChSZXF1ZXN0Q29udGV4dCBvbGQpIHsKKyAgICBsb2NhbC5zZXRDb250ZXh0KG9sZCk7CisgIH0KKwogICB2b2lkIG9uU3RhcnRQbHVnaW4oUGx1Z2luIHBsdWdpbikgewogICAgIGZvciAoU3RhcnRQbHVnaW5MaXN0ZW5lciBsIDogb25TdGFydCkgewogICAgICAgbC5vblN0YXJ0UGx1Z2luKHBsdWdpbik7CiAgICAgfQogCi0gICAgYXR0YWNoU2V0KHN5c1NldHMsIHBsdWdpbi5nZXRTeXNJbmplY3RvcigpLCBwbHVnaW4pOwotICAgIGF0dGFjaFNldChzc2hTZXRzLCBwbHVnaW4uZ2V0U3NoSW5qZWN0b3IoKSwgcGx1Z2luKTsKLSAgICBhdHRhY2hTZXQoaHR0cFNldHMsIHBsdWdpbi5nZXRIdHRwSW5qZWN0b3IoKSwgcGx1Z2luKTsKKyAgICBSZXF1ZXN0Q29udGV4dCBvbGRDb250ZXh0ID0gZW50ZXIocGx1Z2luKTsKKyAgICB0cnkgeworICAgICAgYXR0YWNoSXRlbShzeXNJdGVtcywgcGx1Z2luLmdldFN5c0luamVjdG9yKCksIHBsdWdpbik7CiAKLSAgICBhdHRhY2hNYXAoc3lzTWFwcywgcGx1Z2luLmdldFN5c0luamVjdG9yKCksIHBsdWdpbik7Ci0gICAgYXR0YWNoTWFwKHNzaE1hcHMsIHBsdWdpbi5nZXRTc2hJbmplY3RvcigpLCBwbHVnaW4pOwotICAgIGF0dGFjaE1hcChodHRwTWFwcywgcGx1Z2luLmdldEh0dHBJbmplY3RvcigpLCBwbHVnaW4pOworICAgICAgYXR0YWNoU2V0KHN5c1NldHMsIHBsdWdpbi5nZXRTeXNJbmplY3RvcigpLCBwbHVnaW4pOworICAgICAgYXR0YWNoU2V0KHNzaFNldHMsIHBsdWdpbi5nZXRTc2hJbmplY3RvcigpLCBwbHVnaW4pOworICAgICAgYXR0YWNoU2V0KGh0dHBTZXRzLCBwbHVnaW4uZ2V0SHR0cEluamVjdG9yKCksIHBsdWdpbik7CisKKyAgICAgIGF0dGFjaE1hcChzeXNNYXBzLCBwbHVnaW4uZ2V0U3lzSW5qZWN0b3IoKSwgcGx1Z2luKTsKKyAgICAgIGF0dGFjaE1hcChzc2hNYXBzLCBwbHVnaW4uZ2V0U3NoSW5qZWN0b3IoKSwgcGx1Z2luKTsKKyAgICAgIGF0dGFjaE1hcChodHRwTWFwcywgcGx1Z2luLmdldEh0dHBJbmplY3RvcigpLCBwbHVnaW4pOworICAgIH0gZmluYWxseSB7CisgICAgICBleGl0KG9sZENvbnRleHQpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBhdHRhY2hJdGVtKE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY0l0ZW08Pz4+IGl0ZW1zLAorICAgICAgQE51bGxhYmxlIEluamVjdG9yIHNyYywKKyAgICAgIFBsdWdpbiBwbHVnaW4pIHsKKyAgICBmb3IgKFJlZ2lzdHJhdGlvbkhhbmRsZSBoIDogUHJpdmF0ZUludGVybmFsc19EeW5hbWljVHlwZXMKKyAgICAgICAgLmF0dGFjaEl0ZW1zKHNyYywgaXRlbXMsIHBsdWdpbi5nZXROYW1lKCkpKSB7CisgICAgICBwbHVnaW4uYWRkKGgpOworICAgIH0KICAgfQogCiAgIHByaXZhdGUgdm9pZCBhdHRhY2hTZXQoTWFwPFR5cGVMaXRlcmFsPD8+LCBEeW5hbWljU2V0PD8+PiBzZXRzLApAQCAtMjIzLDEzICsyNjMsMjAgQEAKICAgICAgIG9sZC5wdXQoaC5nZXRLZXkoKS5nZXRUeXBlTGl0ZXJhbCgpLCBoKTsKICAgICB9CiAKLSAgICByZWF0dGFjaE1hcChvbGQsIHN5c01hcHMsIG5ld1BsdWdpbi5nZXRTeXNJbmplY3RvcigpLCBuZXdQbHVnaW4pOwotICAgIHJlYXR0YWNoTWFwKG9sZCwgc3NoTWFwcywgbmV3UGx1Z2luLmdldFNzaEluamVjdG9yKCksIG5ld1BsdWdpbik7Ci0gICAgcmVhdHRhY2hNYXAob2xkLCBodHRwTWFwcywgbmV3UGx1Z2luLmdldEh0dHBJbmplY3RvcigpLCBuZXdQbHVnaW4pOworICAgIFJlcXVlc3RDb250ZXh0IG9sZENvbnRleHQgPSBlbnRlcihuZXdQbHVnaW4pOworICAgIHRyeSB7CisgICAgICByZWF0dGFjaE1hcChvbGQsIHN5c01hcHMsIG5ld1BsdWdpbi5nZXRTeXNJbmplY3RvcigpLCBuZXdQbHVnaW4pOworICAgICAgcmVhdHRhY2hNYXAob2xkLCBzc2hNYXBzLCBuZXdQbHVnaW4uZ2V0U3NoSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKKyAgICAgIHJlYXR0YWNoTWFwKG9sZCwgaHR0cE1hcHMsIG5ld1BsdWdpbi5nZXRIdHRwSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKIAotICAgIHJlYXR0YWNoU2V0KG9sZCwgc3lzU2V0cywgbmV3UGx1Z2luLmdldFN5c0luamVjdG9yKCksIG5ld1BsdWdpbik7Ci0gICAgcmVhdHRhY2hTZXQob2xkLCBzc2hTZXRzLCBuZXdQbHVnaW4uZ2V0U3NoSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKLSAgICByZWF0dGFjaFNldChvbGQsIGh0dHBTZXRzLCBuZXdQbHVnaW4uZ2V0SHR0cEluamVjdG9yKCksIG5ld1BsdWdpbik7CisgICAgICByZWF0dGFjaFNldChvbGQsIHN5c1NldHMsIG5ld1BsdWdpbi5nZXRTeXNJbmplY3RvcigpLCBuZXdQbHVnaW4pOworICAgICAgcmVhdHRhY2hTZXQob2xkLCBzc2hTZXRzLCBuZXdQbHVnaW4uZ2V0U3NoSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKKyAgICAgIHJlYXR0YWNoU2V0KG9sZCwgaHR0cFNldHMsIG5ld1BsdWdpbi5nZXRIdHRwSW5qZWN0b3IoKSwgbmV3UGx1Z2luKTsKKworICAgICAgcmVhdHRhY2hJdGVtKG9sZCwgc3lzSXRlbXMsIG5ld1BsdWdpbi5nZXRTeXNJbmplY3RvcigpLCBuZXdQbHVnaW4pOworICAgIH0gZmluYWxseSB7CisgICAgICBleGl0KG9sZENvbnRleHQpOworICAgIH0KICAgfQogCiAgIHByaXZhdGUgdm9pZCByZWF0dGFjaE1hcCgKQEAgLTM1MCw2ICszOTcsNDEgQEAKICAgICAgIH0KICAgICB9CiAgIH0KKyAgcHJpdmF0ZSB2b2lkIHJlYXR0YWNoSXRlbSgKKyAgICAgIExpc3RNdWx0aW1hcDxUeXBlTGl0ZXJhbDw/PiwgUmVsb2FkYWJsZVJlZ2lzdHJhdGlvbkhhbmRsZTw/Pj4gb2xkSGFuZGxlcywKKyAgICAgIE1hcDxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY0l0ZW08Pz4+IGl0ZW1zLAorICAgICAgQE51bGxhYmxlIEluamVjdG9yIHNyYywKKyAgICAgIFBsdWdpbiBuZXdQbHVnaW4pIHsKKyAgICBpZiAoc3JjID09IG51bGwgfHwgaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKE1hcC5FbnRyeTxUeXBlTGl0ZXJhbDw/PiwgRHluYW1pY0l0ZW08Pz4+IGUgOiBpdGVtcy5lbnRyeVNldCgpKSB7CisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIFR5cGVMaXRlcmFsPE9iamVjdD4gdHlwZSA9IChUeXBlTGl0ZXJhbDxPYmplY3Q+KSBlLmdldEtleSgpOworCisgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgIER5bmFtaWNJdGVtPE9iamVjdD4gaXRlbSA9IChEeW5hbWljSXRlbTxPYmplY3Q+KSBlLmdldFZhbHVlKCk7CisKKyAgICAgIEl0ZXJhdG9yPFJlbG9hZGFibGVSZWdpc3RyYXRpb25IYW5kbGU8Pz4+IG9pID0KKyAgICAgICAgICBvbGRIYW5kbGVzLmdldCh0eXBlKS5pdGVyYXRvcigpOworCisgICAgICBmb3IgKEJpbmRpbmc8Pz4gYmluZGluZyA6IGJpbmRpbmdzKHNyYywgdHlwZSkpIHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEJpbmRpbmc8T2JqZWN0PiBiID0gKEJpbmRpbmc8T2JqZWN0PikgYmluZGluZzsKKyAgICAgICAgaWYgKG9pLmhhc05leHQoKSkgeworICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgIFJlbG9hZGFibGVSZWdpc3RyYXRpb25IYW5kbGU8T2JqZWN0PiBoID0KKyAgICAgICAgICAgIChSZWxvYWRhYmxlUmVnaXN0cmF0aW9uSGFuZGxlPE9iamVjdD4pIG9pLm5leHQoKTsKKyAgICAgICAgICBvaS5yZW1vdmUoKTsKKyAgICAgICAgICByZXBsYWNlKG5ld1BsdWdpbiwgaCwgYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV3UGx1Z2luLmFkZChpdGVtLnNldChiLmdldEtleSgpLCBiLmdldFByb3ZpZGVyKCksCisgICAgICAgICAgICAgIG5ld1BsdWdpbi5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCiAgIHByaXZhdGUgc3RhdGljIDxUPiB2b2lkIHJlcGxhY2UoUGx1Z2luIG5ld1BsdWdpbiwKICAgICAgIFJlbG9hZGFibGVSZWdpc3RyYXRpb25IYW5kbGU8VD4gaCwgQmluZGluZzxUPiBiKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luTG9hZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luTG9hZGVyLmphdmEKaW5kZXggZDFjMmFhNC4uMDM1NTkyYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbkxvYWRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5Mb2FkZXIuamF2YQpAQCAtMTgsMTAgKzE4LDEzIEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUXVldWVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlBsdWdpbk5hbWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuTGlmZWN5Y2xlTGlzdGVuZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5zeXN0ZW1zdGF0dXMuU2VydmVySW5mb3JtYXRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy53ZWJ1aS5KYXZhU2NyaXB0UGx1Z2luOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5QbHVnaW5Vc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ29uZmlnVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKQEAgLTMwLDggKzMzLDggQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZS5GaWxlU25hcHNob3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLkZpbGVTbmFwc2hvdDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC00MSw3ICs0NCw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKQEAgLTQ5LDggKzUxLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTYwLDYgKzY0LDcgQEAKIAogQFNpbmdsZXRvbgogcHVibGljIGNsYXNzIFBsdWdpbkxvYWRlciBpbXBsZW1lbnRzIExpZmVjeWNsZUxpc3RlbmVyIHsKKyAgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fVE1QX1BSRUZJWCA9ICJwbHVnaW5fIjsKICAgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQbHVnaW5Mb2FkZXIuY2xhc3MpOwogCiAgIHByaXZhdGUgZmluYWwgRmlsZSBwbHVnaW5zRGlyOwpAQCAtNjcsMTEgKzcyLDEyIEBACiAgIHByaXZhdGUgZmluYWwgRmlsZSB0bXBEaXI7CiAgIHByaXZhdGUgZmluYWwgUGx1Z2luR3VpY2VFbnZpcm9ubWVudCBlbnY7CiAgIHByaXZhdGUgZmluYWwgU2VydmVySW5mb3JtYXRpb25JbXBsIHNydkluZm9JbXBsOworICBwcml2YXRlIGZpbmFsIFBsdWdpblVzZXIuRmFjdG9yeSBwbHVnaW5Vc2VyRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgUGx1Z2luPiBydW5uaW5nOwogICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBQbHVnaW4+IGRpc2FibGVkOwogICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEZpbGVTbmFwc2hvdD4gYnJva2VuOwotICBwcml2YXRlIGZpbmFsIFJlZmVyZW5jZVF1ZXVlPENsYXNzTG9hZGVyPiBjbGVhbnVwUXVldWU7Ci0gIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxDbGVhbnVwSGFuZGxlLCBCb29sZWFuPiBjbGVhbnVwSGFuZGxlczsKKyAgcHJpdmF0ZSBmaW5hbCBNYXA8UGx1Z2luLCBDbGVhbnVwSGFuZGxlPiBjbGVhbnVwSGFuZGxlczsKKyAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxQbHVnaW4+IHRvQ2xlYW51cDsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxQbHVnaW5DbGVhbmVyVGFzaz4gY2xlYW5lcjsKICAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5TY2FubmVyVGhyZWFkIHNjYW5uZXI7CiAKQEAgLTc5LDYgKzg1LDcgQEAKICAgcHVibGljIFBsdWdpbkxvYWRlcihTaXRlUGF0aHMgc2l0ZVBhdGhzLAogICAgICAgUGx1Z2luR3VpY2VFbnZpcm9ubWVudCBwZSwKICAgICAgIFNlcnZlckluZm9ybWF0aW9uSW1wbCBzaWksCisgICAgICBQbHVnaW5Vc2VyLkZhY3RvcnkgcHVmLAogICAgICAgUHJvdmlkZXI8UGx1Z2luQ2xlYW5lclRhc2s+IHBjdCwKICAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZykgewogICAgIHBsdWdpbnNEaXIgPSBzaXRlUGF0aHMucGx1Z2luc19kaXI7CkBAIC04NiwxMCArOTMsMTEgQEAKICAgICB0bXBEaXIgPSBzaXRlUGF0aHMudG1wX2RpcjsKICAgICBlbnYgPSBwZTsKICAgICBzcnZJbmZvSW1wbCA9IHNpaTsKKyAgICBwbHVnaW5Vc2VyRmFjdG9yeSA9IHB1ZjsKICAgICBydW5uaW5nID0gTWFwcy5uZXdDb25jdXJyZW50TWFwKCk7CiAgICAgZGlzYWJsZWQgPSBNYXBzLm5ld0NvbmN1cnJlbnRNYXAoKTsKICAgICBicm9rZW4gPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICBjbGVhbnVwUXVldWUgPSBuZXcgUmVmZXJlbmNlUXVldWU8Q2xhc3NMb2FkZXI+KCk7CisgICAgdG9DbGVhbnVwID0gUXVldWVzLm5ld0FycmF5RGVxdWUoKTsKICAgICBjbGVhbnVwSGFuZGxlcyA9IE1hcHMubmV3Q29uY3VycmVudE1hcCgpOwogICAgIGNsZWFuZXIgPSBwY3Q7CiAKQEAgLTEwMyw2ICsxMTEsMTQgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgUGx1Z2luIGdldChTdHJpbmcgbmFtZSkgeworICAgIFBsdWdpbiBwID0gcnVubmluZy5nZXQobmFtZSk7CisgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHA7CisgICAgfQorICAgIHJldHVybiBkaXNhYmxlZC5nZXQobmFtZSk7CisgIH0KKwogICBwdWJsaWMgSXRlcmFibGU8UGx1Z2luPiBnZXRQbHVnaW5zKGJvb2xlYW4gYWxsKSB7CiAgICAgaWYgKCFhbGwpIHsKICAgICAgIHJldHVybiBydW5uaW5nLnZhbHVlcygpOwpAQCAtMTc4LDYgKzE5NCwxNSBAQAogICAgIH0KICAgfQogCisgIHN5bmNocm9uaXplZCBwcml2YXRlIHZvaWQgdW5sb2FkUGx1Z2luKFBsdWdpbiBwbHVnaW4pIHsKKyAgICBTdHJpbmcgbmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7CisgICAgbG9nLmluZm8oU3RyaW5nLmZvcm1hdCgiVW5sb2FkaW5nIHBsdWdpbiAlcyIsIG5hbWUpKTsKKyAgICBwbHVnaW4uc3RvcChlbnYpOworICAgIHJ1bm5pbmcucmVtb3ZlKG5hbWUpOworICAgIGRpc2FibGVkLnJlbW92ZShuYW1lKTsKKyAgICB0b0NsZWFudXAuYWRkKHBsdWdpbik7CisgIH0KKwogICBwdWJsaWMgdm9pZCBkaXNhYmxlUGx1Z2lucyhTZXQ8U3RyaW5nPiBuYW1lcykgewogICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7CkBAIC0xOTAsOCArMjE1LDcgQEAKICAgICAgICAgRmlsZSBvZmYgPSBuZXcgRmlsZShwbHVnaW5zRGlyLCBhY3RpdmUuZ2V0TmFtZSgpICsgIi5qYXIuZGlzYWJsZWQiKTsKICAgICAgICAgYWN0aXZlLmdldFNyY0phcigpLnJlbmFtZVRvKG9mZik7CiAKLSAgICAgICAgYWN0aXZlLnN0b3AoKTsKLSAgICAgICAgcnVubmluZy5yZW1vdmUobmFtZSk7CisgICAgICAgIHVubG9hZFBsdWdpbihhY3RpdmUpOwogICAgICAgICB0cnkgewogICAgICAgICAgIEZpbGVTbmFwc2hvdCBzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKG9mZik7CiAgICAgICAgICAgUGx1Z2luIG9mZlBsdWdpbiA9IGxvYWRQbHVnaW4obmFtZSwgb2ZmLCBzbmFwc2hvdCk7CkBAIC0yNDQsMTIgKzI2OCwxMiBAQAogICAgIHNydkluZm9JbXBsLnN0YXRlID0gU2VydmVySW5mb3JtYXRpb24uU3RhdGUuU0hVVERPV047CiAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICBmb3IgKFBsdWdpbiBwIDogcnVubmluZy52YWx1ZXMoKSkgewotICAgICAgICBwLnN0b3AoKTsKKyAgICAgICAgdW5sb2FkUGx1Z2luKHApOwogICAgICAgfQogICAgICAgcnVubmluZy5jbGVhcigpOwogICAgICAgZGlzYWJsZWQuY2xlYXIoKTsKICAgICAgIGJyb2tlbi5jbGVhcigpOwotICAgICAgaWYgKGNsZWFudXBIYW5kbGVzLnNpemUoKSA+IHJ1bm5pbmcuc2l6ZSgpKSB7CisgICAgICBpZiAoIXRvQ2xlYW51cC5pc0VtcHR5KCkpIHsKICAgICAgICAgU3lzdGVtLmdjKCk7CiAgICAgICAgIHByb2Nlc3NQZW5kaW5nQ2xlYW51cHMoKTsKICAgICAgIH0KQEAgLTI5Niw2ICszMjAsMTAgQEAKICAgICBkcm9wUmVtb3ZlZERpc2FibGVkUGx1Z2lucyhqYXJzKTsKIAogICAgIGZvciAoRmlsZSBqYXIgOiBqYXJzKSB7CisgICAgICBpZiAoamFyLmdldE5hbWUoKS5lbmRzV2l0aCgiLmRpc2FibGVkIikpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKICAgICAgIFN0cmluZyBuYW1lID0gbmFtZU9mKGphcik7CiAgICAgICBGaWxlU25hcHNob3QgYnJva2VuVGltZSA9IGJyb2tlbi5nZXQobmFtZSk7CiAgICAgICBpZiAoYnJva2VuVGltZSAhPSBudWxsICYmICFicm9rZW5UaW1lLmlzTW9kaWZpZWQoamFyKSkgewpAQCAtMzMzLDE1ICszNjEsMTQgQEAKICAgICAgICAgICAmJiBvbGRQbHVnaW4uY2FuUmVsb2FkKCkKICAgICAgICAgICAmJiBuZXdQbHVnaW4uY2FuUmVsb2FkKCk7CiAgICAgICBpZiAoIXJlbG9hZCAmJiBvbGRQbHVnaW4gIT0gbnVsbCkgewotICAgICAgICBvbGRQbHVnaW4uc3RvcCgpOwotICAgICAgICBydW5uaW5nLnJlbW92ZShuYW1lKTsKKyAgICAgICAgdW5sb2FkUGx1Z2luKG9sZFBsdWdpbik7CiAgICAgICB9CiAgICAgICBpZiAoIW5ld1BsdWdpbi5pc0Rpc2FibGVkKCkpIHsKICAgICAgICAgbmV3UGx1Z2luLnN0YXJ0KGVudik7CiAgICAgICB9CiAgICAgICBpZiAocmVsb2FkKSB7CiAgICAgICAgIGVudi5vblJlbG9hZFBsdWdpbihvbGRQbHVnaW4sIG5ld1BsdWdpbik7Ci0gICAgICAgIG9sZFBsdWdpbi5zdG9wKCk7CisgICAgICAgIHVubG9hZFBsdWdpbihvbGRQbHVnaW4pOwogICAgICAgfSBlbHNlIGlmICghbmV3UGx1Z2luLmlzRGlzYWJsZWQoKSkgewogICAgICAgICBlbnYub25TdGFydFBsdWdpbihuZXdQbHVnaW4pOwogICAgICAgfQpAQCAtMzY2LDggKzM5Myw3IEBACiAgICAgICB9CiAgICAgfQogICAgIGZvciAoU3RyaW5nIG5hbWUgOiB1bmxvYWQpewotICAgICAgbG9nLmluZm8oU3RyaW5nLmZvcm1hdCgiVW5sb2FkaW5nIHBsdWdpbiAlcyIsIG5hbWUpKTsKLSAgICAgIHJ1bm5pbmcucmVtb3ZlKG5hbWUpLnN0b3AoKTsKKyAgICAgIHVubG9hZFBsdWdpbihydW5uaW5nLmdldChuYW1lKSk7CiAgICAgfQogICB9CiAKQEAgLTM4NCwxNiArNDEwLDE5IEBACiAgIH0KIAogICBzeW5jaHJvbml6ZWQgaW50IHByb2Nlc3NQZW5kaW5nQ2xlYW51cHMoKSB7Ci0gICAgQ2xlYW51cEhhbmRsZSBoOwotICAgIHdoaWxlICgoaCA9IChDbGVhbnVwSGFuZGxlKSBjbGVhbnVwUXVldWUucG9sbCgpKSAhPSBudWxsKSB7Ci0gICAgICBoLmNsZWFudXAoKTsKLSAgICAgIGNsZWFudXBIYW5kbGVzLnJlbW92ZShoKTsKKyAgICBJdGVyYXRvcjxQbHVnaW4+IGl0ZXJhdG9yID0gdG9DbGVhbnVwLml0ZXJhdG9yKCk7CisgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgUGx1Z2luIHBsdWdpbiA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworCisgICAgICBDbGVhbnVwSGFuZGxlIGNsZWFudXBIYW5kbGUgPSBjbGVhbnVwSGFuZGxlcy5yZW1vdmUocGx1Z2luKTsKKyAgICAgIGNsZWFudXBIYW5kbGUuY2xlYW51cCgpOwogICAgIH0KLSAgICByZXR1cm4gTWF0aC5tYXgoMCwgY2xlYW51cEhhbmRsZXMuc2l6ZSgpIC0gcnVubmluZy5zaXplKCkpOworICAgIHJldHVybiB0b0NsZWFudXAuc2l6ZSgpOwogICB9CiAKICAgcHJpdmF0ZSB2b2lkIGNsZWFuSW5CYWNrZ3JvdW5kKCkgewotICAgIGludCBjbnQgPSBNYXRoLm1heCgwLCBjbGVhbnVwSGFuZGxlcy5zaXplKCkgLSBydW5uaW5nLnNpemUoKSk7CisgICAgaW50IGNudCA9IHRvQ2xlYW51cC5zaXplKCk7CiAgICAgaWYgKDAgPCBjbnQpIHsKICAgICAgIGNsZWFuZXIuZ2V0KCkuY2xlYW4oY250KTsKICAgICB9CkBAIC00MzcsMTkgKzQ2NiwxNyBAQAogICAgICAgVVJMW10gdXJscyA9IHt0bXAudG9VUkkoKS50b1VSTCgpfTsKICAgICAgIENsYXNzTG9hZGVyIHBhcmVudExvYWRlciA9IHBhcmVudEZvcih0eXBlKTsKICAgICAgIENsYXNzTG9hZGVyIHBsdWdpbkxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcih1cmxzLCBwYXJlbnRMb2FkZXIpOwotICAgICAgY2xlYW51cEhhbmRsZXMucHV0KAotICAgICAgICAgIG5ldyBDbGVhbnVwSGFuZGxlKHRtcCwgamFyRmlsZSwgcGx1Z2luTG9hZGVyLCBjbGVhbnVwUXVldWUpLAotICAgICAgICAgIEJvb2xlYW4uVFJVRSk7Ci0KICAgICAgIENsYXNzPD8gZXh0ZW5kcyBNb2R1bGU+IHN5c01vZHVsZSA9IGxvYWQoc3lzTmFtZSwgcGx1Z2luTG9hZGVyKTsKICAgICAgIENsYXNzPD8gZXh0ZW5kcyBNb2R1bGU+IHNzaE1vZHVsZSA9IGxvYWQoc3NoTmFtZSwgcGx1Z2luTG9hZGVyKTsKICAgICAgIENsYXNzPD8gZXh0ZW5kcyBNb2R1bGU+IGh0dHBNb2R1bGUgPSBsb2FkKGh0dHBOYW1lLCBwbHVnaW5Mb2FkZXIpOwotICAgICAga2VlcCA9IHRydWU7Ci0gICAgICByZXR1cm4gbmV3IFBsdWdpbihuYW1lLAorICAgICAgUGx1Z2luIHBsdWdpbiA9IG5ldyBQbHVnaW4obmFtZSwgcGx1Z2luVXNlckZhY3RvcnkuY3JlYXRlKG5hbWUpLAogICAgICAgICAgIHNyY0phciwgc25hcHNob3QsCiAgICAgICAgICAgamFyRmlsZSwgbWFuaWZlc3QsCiAgICAgICAgICAgbmV3IEZpbGUoZGF0YURpciwgbmFtZSksIHR5cGUsIHBsdWdpbkxvYWRlciwKICAgICAgICAgICBzeXNNb2R1bGUsIHNzaE1vZHVsZSwgaHR0cE1vZHVsZSk7CisgICAgICBjbGVhbnVwSGFuZGxlcy5wdXQocGx1Z2luLCBuZXcgQ2xlYW51cEhhbmRsZSh0bXAsIGphckZpbGUpKTsKKyAgICAgIGtlZXAgPSB0cnVlOworICAgICAgcmV0dXJuIHBsdWdpbjsKICAgICB9IGZpbmFsbHkgewogICAgICAgaWYgKCFrZWVwKSB7CiAgICAgICAgIGphckZpbGUuY2xvc2UoKTsKQEAgLTQ2NCw2ICs0OTEsOCBAQAogICAgICAgICByZXR1cm4gUGx1Z2luTmFtZS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwogICAgICAgY2FzZSBQTFVHSU46CiAgICAgICAgIHJldHVybiBQbHVnaW5Mb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgIGNhc2UgSlM6CisgICAgICAgIHJldHVybiBKYXZhU2NyaXB0UGx1Z2luLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CiAgICAgICBkZWZhdWx0OgogICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBsdWdpbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgQXBpVHlwZSAiICsgdHlwZSk7CiAgICAgfQpAQCAtNDcxLDcgKzUwMCw3IEBACiAKICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlbXBOYW1lRm9yKFN0cmluZyBuYW1lKSB7CiAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmbXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXlNTWRkX0hIbW0iKTsKLSAgICByZXR1cm4gInBsdWdpbl8iICsgbmFtZSArICJfIiArIGZtdC5mb3JtYXQobmV3IERhdGUoKSkgKyAiXyI7CisgICAgcmV0dXJuIFBMVUdJTl9UTVBfUFJFRklYICsgbmFtZSArICJfIiArIGZtdC5mb3JtYXQobmV3IERhdGUoKSkgKyAiXyI7CiAgIH0KIAogICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBNb2R1bGU+IGxvYWQoU3RyaW5nIG5hbWUsIENsYXNzTG9hZGVyIHBsdWdpbkxvYWRlcikKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5Nb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5Nb2R1bGUuamF2YQppbmRleCBhYjdkYzNjLi40Y2RhZmIzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbk1vZHVsZS5qYXZhCkBAIC0xNCwyMCArMTQsMzcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2luczsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW5SZXNvdXJjZS5QTFVHSU5fS0lORDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RBcGlNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5zeXN0ZW1zdGF0dXMuU2VydmVySW5mb3JtYXRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQubGlmZWN5Y2xlLkxpZmVjeWNsZU1vZHVsZTsKIAotcHVibGljIGNsYXNzIFBsdWdpbk1vZHVsZSBleHRlbmRzIExpZmVjeWNsZU1vZHVsZSB7CitwdWJsaWMgY2xhc3MgUGx1Z2luTW9kdWxlIGV4dGVuZHMgUmVzdEFwaU1vZHVsZSB7CiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CiAgICAgYmluZChTZXJ2ZXJJbmZvcm1hdGlvbkltcGwuY2xhc3MpOwogICAgIGJpbmQoU2VydmVySW5mb3JtYXRpb24uY2xhc3MpLnRvKFNlcnZlckluZm9ybWF0aW9uSW1wbC5jbGFzcyk7CiAKICAgICBiaW5kKFBsdWdpbkNsZWFuZXJUYXNrLmNsYXNzKTsKKyAgICBiaW5kKFBsdWdpbnNDb2xsZWN0aW9uLmNsYXNzKTsKICAgICBiaW5kKFBsdWdpbkd1aWNlRW52aXJvbm1lbnQuY2xhc3MpOwogICAgIGJpbmQoUGx1Z2luTG9hZGVyLmNsYXNzKTsKLQogICAgIGJpbmQoQ29weUNvbmZpZ01vZHVsZS5jbGFzcyk7Ci0gICAgbGlzdGVuZXIoKS50byhQbHVnaW5Mb2FkZXIuY2xhc3MpOworICAgIGluc3RhbGwobmV3IExpZmVjeWNsZU1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBsaXN0ZW5lcigpLnRvKFBsdWdpbkxvYWRlci5jbGFzcyk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBQTFVHSU5fS0lORCk7CisgICAgcHV0KFBMVUdJTl9LSU5EKS50byhJbnN0YWxsUGx1Z2luLk92ZXJ3cml0ZS5jbGFzcyk7CisgICAgZGVsZXRlKFBMVUdJTl9LSU5EKS50byhEaXNhYmxlUGx1Z2luLmNsYXNzKTsKKyAgICBnZXQoUExVR0lOX0tJTkQsICJzdGF0dXMiKS50byhHZXRTdGF0dXMuY2xhc3MpOworICAgIHBvc3QoUExVR0lOX0tJTkQsICJkaXNhYmxlIikudG8oRGlzYWJsZVBsdWdpbi5jbGFzcyk7CisgICAgcG9zdChQTFVHSU5fS0lORCwgImVuYWJsZSIpLnRvKEVuYWJsZVBsdWdpbi5jbGFzcyk7CisgICAgcG9zdChQTFVHSU5fS0lORCwgInJlbG9hZCIpLnRvKFJlbG9hZFBsdWdpbi5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5SZXNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3MjI3MQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9QbHVnaW5SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2luczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworCitwdWJsaWMgY2xhc3MgUGx1Z2luUmVzb3VyY2UgaW1wbGVtZW50cyBSZXN0UmVzb3VyY2UgeworICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVMaXRlcmFsPFJlc3RWaWV3PFBsdWdpblJlc291cmNlPj4gUExVR0lOX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PFBsdWdpblJlc291cmNlPj4oKSB7fTsKKworICBwcml2YXRlIGZpbmFsIFBsdWdpbiBwbHVnaW47CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgUGx1Z2luUmVzb3VyY2UoUGx1Z2luIHBsdWdpbikgeworICAgIHRoaXMucGx1Z2luID0gcGx1Z2luOworICAgIHRoaXMubmFtZSA9IHBsdWdpbi5nZXROYW1lKCk7CisgIH0KKworICBQbHVnaW5SZXNvdXJjZShTdHJpbmcgbmFtZSkgeworICAgIHRoaXMucGx1Z2luID0gbnVsbDsKKyAgICB0aGlzLm5hbWUgPSBuYW1lOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgIHJldHVybiBuYW1lOworICB9CisKKyAgcHVibGljIFBsdWdpbiBnZXRQbHVnaW4oKSB7CisgICAgcmV0dXJuIHBsdWdpbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbnNDb2xsZWN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3BsdWdpbnMvUGx1Z2luc0NvbGxlY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDMwYjQyCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wbHVnaW5zL1BsdWdpbnNDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQWNjZXB0c0NyZWF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBQbHVnaW5zQ29sbGVjdGlvbiBpbXBsZW1lbnRzCisgICAgUmVzdENvbGxlY3Rpb248VG9wTGV2ZWxSZXNvdXJjZSwgUGx1Z2luUmVzb3VyY2U+LAorICAgIEFjY2VwdHNDcmVhdGU8VG9wTGV2ZWxSZXNvdXJjZT4geworCisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxQbHVnaW5SZXNvdXJjZT4+IHZpZXdzOworICBwcml2YXRlIGZpbmFsIFBsdWdpbkxvYWRlciBsb2FkZXI7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TGlzdFBsdWdpbnM+IGxpc3Q7CisKKyAgQEluamVjdAorICBQbHVnaW5zQ29sbGVjdGlvbihEeW5hbWljTWFwPFJlc3RWaWV3PFBsdWdpblJlc291cmNlPj4gdmlld3MsCisgICAgICBQbHVnaW5Mb2FkZXIgbG9hZGVyLCBQcm92aWRlcjxMaXN0UGx1Z2lucz4gbGlzdCkgeworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKKyAgICB0aGlzLmxpc3QgPSBsaXN0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxUb3BMZXZlbFJlc291cmNlPiBsaXN0KCkgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24geworICAgIHJldHVybiBsaXN0LmdldCgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQbHVnaW5SZXNvdXJjZSBwYXJzZShUb3BMZXZlbFJlc291cmNlIHBhcmVudCwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgUGx1Z2luIHAgPSBsb2FkZXIuZ2V0KGlkLmdldCgpKTsKKyAgICBpZiAocCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorICAgIHJldHVybiBuZXcgUGx1Z2luUmVzb3VyY2UocCk7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBJbnN0YWxsUGx1Z2luIGNyZWF0ZShUb3BMZXZlbFJlc291cmNlIHBhcmVudCwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIG5ldyBJbnN0YWxsUGx1Z2luKGxvYWRlciwgaWQuZ2V0KCksIHRydWUgLyogY3JlYXRlZCAqLyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8UGx1Z2luUmVzb3VyY2U+PiB2aWV3cygpIHsKKyAgICByZXR1cm4gdmlld3M7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9SZWxvYWRQbHVnaW4uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9SZWxvYWRQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjllZjJkYgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcGx1Z2lucy9SZWxvYWRQbHVnaW4uamF2YQpAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUmVsb2FkUGx1Z2luLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK0BSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSKQorY2xhc3MgUmVsb2FkUGx1Z2luIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UGx1Z2luUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFBsdWdpbkxvYWRlciBsb2FkZXI7CisKKyAgQEluamVjdAorICBSZWxvYWRQbHVnaW4oUGx1Z2luTG9hZGVyIGxvYWRlcikgeworICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUGx1Z2luUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KSB0aHJvd3MgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIG5hbWUgPSByZXNvdXJjZS5nZXROYW1lKCk7CisgICAgdHJ5IHsKKyAgICAgIGxvYWRlci5yZWxvYWQoSW1tdXRhYmxlTGlzdC5vZihuYW1lKSk7CisgICAgfSBjYXRjaCAoSW52YWxpZFBsdWdpbkV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfSBjYXRjaCAoUGx1Z2luSW5zdGFsbEV4Y2VwdGlvbiBlKSB7CisgICAgICBTdHJpbmdXcml0ZXIgYnVmID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgYnVmLndyaXRlKFN0cmluZy5mb3JtYXQoImNhbm5vdCByZWxvYWQgJXNcbiIsIG5hbWUpKTsKKyAgICAgIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKGJ1Zik7CisgICAgICBlLnByaW50U3RhY2tUcmFjZShwdyk7CisgICAgICBwdy5mbHVzaCgpOworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oYnVmLnRvU3RyaW5nKCkpOworICAgIH0KKyAgICByZXR1cm4gbmV3IExpc3RQbHVnaW5zLlBsdWdpbkluZm8obG9hZGVyLmdldChuYW1lKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DaGFuZ2VDb250cm9sLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvQ2hhbmdlQ29udHJvbC5qYXZhCmluZGV4IGRiNGIwMjEuLjYzOTdiOTYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DaGFuZ2VDb250cm9sLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NoYW5nZUNvbnRyb2wuamF2YQpAQCAtMTQsMTYgKzE0LDE2IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5TdWJtaXRSZWNvcmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0VHlwZVJlY29yZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuU3RvcmVkVmFsdWVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5DaGFuZ2VEYXRhOwpAQCAtMzIsMjMgKzMyLDE5IEBACiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QudXRpbC5Qcm92aWRlcnM7CiAKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5jb21waWxlci5Db21waWxlRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuSW50ZWdlclRlcm07CiBpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5MaXN0VGVybTsKIGltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZzsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZ0V4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlN0cnVjdHVyZVRlcm07CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5TeW1ib2xUZXJtOwogaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlZhcmlhYmxlVGVybTsKIAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIApAQCAtMTk1LDEyICsxOTEsMTQgQEAKIAogICAvKiogQ2FuIHRoaXMgdXNlciBwdWJsaXNoIHRoaXMgZHJhZnQgY2hhbmdlIG9yIGFueSBkcmFmdCBwYXRjaCBzZXQgb2YgdGhpcyBjaGFuZ2U/ICovCiAgIHB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2goZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIHJldHVybiBpc093bmVyKCkgJiYgaXNWaXNpYmxlKGRiKTsKKyAgICByZXR1cm4gKGlzT3duZXIoKSB8fCBnZXRSZWZDb250cm9sKCkuY2FuUHVibGlzaERyYWZ0cygpKQorICAgICAgICAmJiBpc1Zpc2libGUoZGIpOwogICB9CiAKICAgLyoqIENhbiB0aGlzIHVzZXIgZGVsZXRlIHRoaXMgZHJhZnQgY2hhbmdlIG9yIGFueSBkcmFmdCBwYXRjaCBzZXQgb2YgdGhpcyBjaGFuZ2U/ICovCiAgIHB1YmxpYyBib29sZWFuIGNhbkRlbGV0ZURyYWZ0KGZpbmFsIFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gaXNPd25lcigpICYmIGlzVmlzaWJsZShkYik7CisgICAgcmV0dXJuIChpc093bmVyKCkgfHwgZ2V0UmVmQ29udHJvbCgpLmNhbkRlbGV0ZURyYWZ0cygpKQorICAgICAgICAmJiBpc1Zpc2libGUoZGIpOwogICB9CiAKICAgLyoqIENhbiB0aGlzIHVzZXIgcmViYXNlIHRoaXMgY2hhbmdlPyAqLwpAQCAtMjE1LDYgKzIxMywxMSBAQAogICAgICAgICAmJiBnZXRSZWZDb250cm9sKCkuY2FuVXBsb2FkKCk7IC8vIGFzIGxvbmcgYXMgeW91IGNhbiB1cGxvYWQgdG9vCiAgIH0KIAorICAvKiogQWxsIGF2YWlsYWJsZSBsYWJlbCB0eXBlcyBmb3IgdGhpcyBwcm9qZWN0LiAqLworICBwdWJsaWMgTGFiZWxUeXBlcyBnZXRMYWJlbFR5cGVzKCkgeworICAgIHJldHVybiBnZXRQcm9qZWN0Q29udHJvbCgpLmdldExhYmVsVHlwZXMoKTsKKyAgfQorCiAgIC8qKiBBbGwgdmFsdWUgcmFuZ2VzIG9mIGFueSBhbGxvd2VkIGxhYmVsIHBlcm1pc3Npb24uICovCiAgIHB1YmxpYyBMaXN0PFBlcm1pc3Npb25SYW5nZT4gZ2V0TGFiZWxSYW5nZXMoKSB7CiAgICAgcmV0dXJuIGdldFJlZkNvbnRyb2woKS5nZXRMYWJlbFJhbmdlcygpOwpAQCAtMjY2LDI1ICsyNjksMzAgQEAKIAogICAvKiogQHJldHVybiB0cnVlIGlmIHRoZSB1c2VyIGlzIGFsbG93ZWQgdG8gcmVtb3ZlIHRoaXMgcmV2aWV3ZXIuICovCiAgIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZVJldmlld2VyKFBhdGNoU2V0QXBwcm92YWwgYXBwcm92YWwpIHsKKyAgICByZXR1cm4gY2FuUmVtb3ZlUmV2aWV3ZXIoYXBwcm92YWwuZ2V0QWNjb3VudElkKCksIGFwcHJvdmFsLmdldFZhbHVlKCkpOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlUmV2aWV3ZXIoQWNjb3VudC5JZCByZXZpZXdlciwgaW50IHZhbHVlKSB7CiAgICAgaWYgKGdldENoYW5nZSgpLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CiAgICAgICAvLyBBIHVzZXIgY2FuIGFsd2F5cyByZW1vdmUgdGhlbXNlbHZlcy4KICAgICAgIC8vCiAgICAgICBpZiAoZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSB7CiAgICAgICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIGkgPSAoSWRlbnRpZmllZFVzZXIpIGdldEN1cnJlbnRVc2VyKCk7Ci0gICAgICAgIGlmIChpLmdldEFjY291bnRJZCgpLmVxdWFscyhhcHByb3ZhbC5nZXRBY2NvdW50SWQoKSkpIHsKKyAgICAgICAgaWYgKGkuZ2V0QWNjb3VudElkKCkuZXF1YWxzKHJldmlld2VyKSkgewogICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBjYW4gcmVtb3ZlIHNlbGYKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICAvLyBUaGUgY2hhbmdlIG93bmVyIG1heSByZW1vdmUgYW55IHplcm8gb3IgcG9zaXRpdmUgc2NvcmUuCiAgICAgICAvLwotICAgICAgaWYgKGlzT3duZXIoKSAmJiAwIDw9IGFwcHJvdmFsLmdldFZhbHVlKCkpIHsKKyAgICAgIGlmIChpc093bmVyKCkgJiYgMCA8PSB2YWx1ZSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KIAotICAgICAgLy8gVGhlIGJyYW5jaCBvd25lciwgcHJvamVjdCBvd25lciwgc2l0ZSBhZG1pbiBjYW4gcmVtb3ZlIGFueW9uZS4KLSAgICAgIC8vCi0gICAgICBpZiAoZ2V0UmVmQ29udHJvbCgpLmlzT3duZXIoKSAvLyBicmFuY2ggb3duZXIKKyAgICAgIC8vIFVzZXJzIHdpdGggdGhlIHJlbW92ZSByZXZpZXdlciBwZXJtaXNzaW9uLCB0aGUgYnJhbmNoIG93bmVyLCBwcm9qZWN0CisgICAgICAvLyBvd25lciBhbmQgc2l0ZSBhZG1pbiBjYW4gcmVtb3ZlIGFueW9uZQorICAgICAgaWYgKGdldFJlZkNvbnRyb2woKS5jYW5SZW1vdmVSZXZpZXdlcigpIC8vIGhhcyByZW1vdmFsIHBlcm1pc3Npb25zCisgICAgICAgICAgfHwgZ2V0UmVmQ29udHJvbCgpLmlzT3duZXIoKSAvLyBicmFuY2ggb3duZXIKICAgICAgICAgICB8fCBnZXRQcm9qZWN0Q29udHJvbCgpLmlzT3duZXIoKSAvLyBwcm9qZWN0IG93bmVyCiAgICAgICAgICAgfHwgZ2V0Q3VycmVudFVzZXIoKS5nZXRDYXBhYmlsaXRpZXMoKS5jYW5BZG1pbmlzdHJhdGVTZXJ2ZXIoKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTI5NCwxNiArMzAyLDM1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKKyAgLyoqIENhbiB0aGlzIHVzZXIgZWRpdCB0aGUgdG9waWMgbmFtZT8gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuRWRpdFRvcGljTmFtZSgpIHsKKyAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpLmlzT3BlbigpKSB7CisgICAgICByZXR1cm4gaXNPd25lcigpIC8vIG93bmVyIChha2EgY3JlYXRvcikgb2YgdGhlIGNoYW5nZSBjYW4gZWRpdCB0b3BpYworICAgICAgICAgIHx8IGdldFJlZkNvbnRyb2woKS5pc093bmVyKCkgLy8gYnJhbmNoIG93bmVyIGNhbiBlZGl0IHRvcGljCisgICAgICAgICAgfHwgZ2V0UHJvamVjdENvbnRyb2woKS5pc093bmVyKCkgLy8gcHJvamVjdCBvd25lciBjYW4gZWRpdCB0b3BpYworICAgICAgICAgIHx8IGdldEN1cnJlbnRVc2VyKCkuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCkgLy8gc2l0ZSBhZG1pbmlzdGVycyBhcmUgZ29kCisgICAgICAgICAgfHwgZ2V0UmVmQ29udHJvbCgpLmNhbkVkaXRUb3BpY05hbWUoKSAvLyB1c2VyIGNhbiBlZGl0IHRvcGljIG9uIGEgc3BlY2lmaWMgcmVmCisgICAgICA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBnZXRSZWZDb250cm9sKCkuY2FuRm9yY2VFZGl0VG9waWNOYW1lKCk7CisgICAgfQorICB9CisKICAgcHVibGljIExpc3Q8U3VibWl0UmVjb3JkPiBnZXRTdWJtaXRSZWNvcmRzKFJldmlld0RiIGRiLCBQYXRjaFNldCBwYXRjaFNldCkgewotICAgIHJldHVybiBjYW5TdWJtaXQoZGIsIHBhdGNoU2V0LCBudWxsLCBmYWxzZSwgdHJ1ZSk7CisgICAgcmV0dXJuIGNhblN1Ym1pdChkYiwgcGF0Y2hTZXQsIG51bGwsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBjYW5TdWJtaXQoKSB7CisgICAgcmV0dXJuIGdldFJlZkNvbnRyb2woKS5jYW5TdWJtaXQoKTsKICAgfQogCiAgIHB1YmxpYyBMaXN0PFN1Ym1pdFJlY29yZD4gY2FuU3VibWl0KFJldmlld0RiIGRiLCBQYXRjaFNldCBwYXRjaFNldCkgewotICAgIHJldHVybiBjYW5TdWJtaXQoZGIsIHBhdGNoU2V0LCBudWxsLCBmYWxzZSwgZmFsc2UpOworICAgIHJldHVybiBjYW5TdWJtaXQoZGIsIHBhdGNoU2V0LCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgfQogCiAgIHB1YmxpYyBMaXN0PFN1Ym1pdFJlY29yZD4gY2FuU3VibWl0KFJldmlld0RiIGRiLCBQYXRjaFNldCBwYXRjaFNldCwKLSAgICAgIEBOdWxsYWJsZSBDaGFuZ2VEYXRhIGNkLCBib29sZWFuIGZhc3RFdmFsTGFiZWxzLCBib29sZWFuIGFsbG93Q2xvc2VkKSB7CisgICAgICBATnVsbGFibGUgQ2hhbmdlRGF0YSBjZCwgYm9vbGVhbiBmYXN0RXZhbExhYmVscywgYm9vbGVhbiBhbGxvd0Nsb3NlZCwKKyAgICAgIGJvb2xlYW4gYWxsb3dEcmFmdCkgewogICAgIGlmICghYWxsb3dDbG9zZWQgJiYgY2hhbmdlLmdldFN0YXR1cygpLmlzQ2xvc2VkKCkpIHsKICAgICAgIFN1Ym1pdFJlY29yZCByZWMgPSBuZXcgU3VibWl0UmVjb3JkKCk7CiAgICAgICByZWMuc3RhdHVzID0gU3VibWl0UmVjb3JkLlN0YXR1cy5DTE9TRUQ7CkBAIC0zMTQsMTIyICszNDEsMjMgQEAKICAgICAgIHJldHVybiBydWxlRXJyb3IoIlBhdGNoIHNldCAiICsgcGF0Y2hTZXQuZ2V0UGF0Y2hTZXRJZCgpICsgIiBpcyBub3QgY3VycmVudCIpOwogICAgIH0KIAotICAgIHRyeSB7Ci0gICAgICBpZiAoY2hhbmdlLmdldFN0YXR1cygpID09IENoYW5nZS5TdGF0dXMuRFJBRlQpIHsKLSAgICAgICAgaWYgKCFpc0RyYWZ0VmlzaWJsZShkYiwgY2QpKSB7Ci0gICAgICAgICAgcmV0dXJuIHJ1bGVFcnJvcigiUGF0Y2ggc2V0ICIgKyBwYXRjaFNldC5nZXRQYXRjaFNldElkKCkgKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBydWxlRXJyb3IoIkNhbm5vdCBzdWJtaXQgZHJhZnQgY2hhbmdlcyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocGF0Y2hTZXQuaXNEcmFmdCgpKSB7Ci0gICAgICAgIGlmICghaXNEcmFmdFZpc2libGUoZGIsIGNkKSkgewotICAgICAgICAgIHJldHVybiBydWxlRXJyb3IoIlBhdGNoIHNldCAiICsgcGF0Y2hTZXQuZ2V0UGF0Y2hTZXRJZCgpICsgIiBub3QgZm91bmQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gcnVsZUVycm9yKCJDYW5ub3Qgc3VibWl0IGRyYWZ0IHBhdGNoIHNldHMiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIkNhbm5vdCByZWFkIHBhdGNoIHNldCAiICsgcGF0Y2hTZXQuZ2V0SWQoKSwgZXJyKTsKKyAgICBpZiAoKGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkRSQUZUIHx8IHBhdGNoU2V0LmlzRHJhZnQoKSkKKyAgICAgICAgJiYgIWFsbG93RHJhZnQpIHsKKyAgICAgIHJldHVybiBjYW5ub3RTdWJtaXREcmFmdChkYiwgcGF0Y2hTZXQsIGNkKTsKICAgICB9CiAKLSAgICBMaXN0PFRlcm0+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFRlcm0+KCk7Ci0gICAgVGVybSBzdWJtaXRSdWxlOwotICAgIFByb2plY3RTdGF0ZSBwcm9qZWN0U3RhdGUgPSBnZXRQcm9qZWN0Q29udHJvbCgpLmdldFByb2plY3RTdGF0ZSgpOwotICAgIFByb2xvZ0Vudmlyb25tZW50IGVudjsKLQorICAgIExpc3Q8VGVybT4gcmVzdWx0czsKKyAgICBTdWJtaXRSdWxlRXZhbHVhdG9yIGV2YWx1YXRvcjsKICAgICB0cnkgewotICAgICAgZW52ID0gcHJvamVjdFN0YXRlLm5ld1Byb2xvZ0Vudmlyb25tZW50KCk7Ci0gICAgfSBjYXRjaCAoQ29tcGlsZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIkNhbm5vdCBjb25zdWx0IHJ1bGVzLnBsIGZvciAiCi0gICAgICAgICAgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlcnIpOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5SRVZJRVdfREIsIGRiKTsKLSAgICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLkNIQU5HRSwgY2hhbmdlKTsKLSAgICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLkNIQU5HRV9EQVRBLCBjZCk7Ci0gICAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5QQVRDSF9TRVQsIHBhdGNoU2V0KTsKLSAgICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLkNIQU5HRV9DT05UUk9MLCB0aGlzKTsKLQotICAgICAgc3VibWl0UnVsZSA9IGVudi5vbmNlKAotICAgICAgICAiZ2Vycml0IiwgImxvY2F0ZV9zdWJtaXRfcnVsZSIsCi0gICAgICAgIG5ldyBWYXJpYWJsZVRlcm0oKSk7Ci0gICAgICBpZiAoc3VibWl0UnVsZSA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIk5vIHVzZXI6c3VibWl0X3J1bGUgZm91bmQgZm9yICIKLSAgICAgICAgICAgICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmYXN0RXZhbExhYmVscykgewotICAgICAgICBlbnYub25jZSgiZ2Vycml0IiwgImFzc3VtZV9yYW5nZV9mcm9tX2xhYmVsIik7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGZvciAoVGVybVtdIHRlbXBsYXRlIDogZW52LmFsbCgKLSAgICAgICAgICAgICJnZXJyaXQiLCAiY2FuX3N1Ym1pdCIsCi0gICAgICAgICAgICBzdWJtaXRSdWxlLAotICAgICAgICAgICAgbmV3IFZhcmlhYmxlVGVybSgpKSkgewotICAgICAgICAgIHJlc3VsdHMuYWRkKHRlbXBsYXRlWzFdKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoUHJvbG9nRXhjZXB0aW9uIGVycikgewotICAgICAgICByZXR1cm4gbG9nUnVsZUVycm9yKCJFeGNlcHRpb24gY2FsbGluZyAiICsgc3VibWl0UnVsZSArICIgb24gY2hhbmdlICIKLSAgICAgICAgICAgICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlcnIpOwotICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgcmV0dXJuIGxvZ1J1bGVFcnJvcigiRXhjZXB0aW9uIGNhbGxpbmcgIiArIHN1Ym1pdFJ1bGUgKyAiIG9uIGNoYW5nZSAiCi0gICAgICAgICAgICArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgZXJyKTsKLSAgICAgIH0KLQotICAgICAgUHJvamVjdFN0YXRlIHBhcmVudFN0YXRlID0gcHJvamVjdFN0YXRlLmdldFBhcmVudFN0YXRlKCk7Ci0gICAgICBQcm9sb2dFbnZpcm9ubWVudCBjaGlsZEVudiA9IGVudjsKLSAgICAgIFNldDxQcm9qZWN0Lk5hbWVLZXk+IHByb2plY3RzU2VlbiA9IG5ldyBIYXNoU2V0PFByb2plY3QuTmFtZUtleT4oKTsKLSAgICAgIHByb2plY3RzU2Vlbi5hZGQoZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7Ci0KLSAgICAgIHdoaWxlIChwYXJlbnRTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgIGlmICghcHJvamVjdHNTZWVuLmFkZChwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKSkgewotICAgICAgICAgIC8vcGFyZW50IGhhcyBiZWVuIHNlZW4gYmVmb3JlLCBzdG9wIHdhbGsgdXAgaW5oZXJpdGFuY2UgdHJlZQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIFByb2xvZ0Vudmlyb25tZW50IHBhcmVudEVudjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBwYXJlbnRFbnYgPSBwYXJlbnRTdGF0ZS5uZXdQcm9sb2dFbnZpcm9ubWVudCgpOwotICAgICAgICB9IGNhdGNoIChDb21waWxlRXhjZXB0aW9uIGVycikgewotICAgICAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIkNhbm5vdCBjb25zdWx0IHJ1bGVzLnBsIGZvciAiCi0gICAgICAgICAgICAgICsgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcmVudEVudi5jb3B5U3RvcmVkVmFsdWVzKGNoaWxkRW52KTsKLSAgICAgICAgVGVybSBmaWx0ZXJSdWxlID0KLSAgICAgICAgICAgIHBhcmVudEVudi5vbmNlKCJnZXJyaXQiLCAibG9jYXRlX3N1Ym1pdF9maWx0ZXIiLCBuZXcgVmFyaWFibGVUZXJtKCkpOwotICAgICAgICBpZiAoZmlsdGVyUnVsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChmYXN0RXZhbExhYmVscykgewotICAgICAgICAgICAgICBlbnYub25jZSgiZ2Vycml0IiwgImFzc3VtZV9yYW5nZV9mcm9tX2xhYmVsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRlcm0gcmVzdWx0c1Rlcm0gPSB0b0xpc3RUZXJtKHJlc3VsdHMpOwotICAgICAgICAgICAgcmVzdWx0cy5jbGVhcigpOwotICAgICAgICAgICAgVGVybVtdIHRlbXBsYXRlID0gcGFyZW50RW52Lm9uY2UoCi0gICAgICAgICAgICAgICAgImdlcnJpdCIsICJmaWx0ZXJfc3VibWl0X3Jlc3VsdHMiLAotICAgICAgICAgICAgICAgIGZpbHRlclJ1bGUsCi0gICAgICAgICAgICAgICAgcmVzdWx0c1Rlcm0sCi0gICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlVGVybSgpKTsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgZmluYWwgTGlzdDw/IGV4dGVuZHMgVGVybT4gdGVybUxpc3QgPSAoKExpc3RUZXJtKSB0ZW1wbGF0ZVsyXSkudG9KYXZhKCk7Ci0gICAgICAgICAgICByZXN1bHRzLmFkZEFsbCh0ZXJtTGlzdCk7Ci0gICAgICAgICAgfSBjYXRjaCAoUHJvbG9nRXhjZXB0aW9uIGVycikgewotICAgICAgICAgICAgcmV0dXJuIGxvZ1J1bGVFcnJvcigiRXhjZXB0aW9uIGNhbGxpbmcgIiArIGZpbHRlclJ1bGUgKyAiIG9uIGNoYW5nZSAiCi0gICAgICAgICAgICAgICAgKyBjaGFuZ2UuZ2V0SWQoKSArICIgb2YgIiArIHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCksIGVycik7Ci0gICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgICAgIHJldHVybiBsb2dSdWxlRXJyb3IoIkV4Y2VwdGlvbiBjYWxsaW5nICIgKyBmaWx0ZXJSdWxlICsgIiBvbiBjaGFuZ2UgIgotICAgICAgICAgICAgICAgICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIgKyBwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBlcnIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBhcmVudFN0YXRlID0gcGFyZW50U3RhdGUuZ2V0UGFyZW50U3RhdGUoKTsKLSAgICAgICAgY2hpbGRFbnYgPSBwYXJlbnRFbnY7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIGVudi5jbG9zZSgpOworICAgICAgZXZhbHVhdG9yID0gbmV3IFN1Ym1pdFJ1bGVFdmFsdWF0b3IoZGIsIHBhdGNoU2V0LAorICAgICAgICAgIGdldFByb2plY3RDb250cm9sKCksCisgICAgICAgICAgdGhpcywgY2hhbmdlLCBjZCwKKyAgICAgICAgICBmYXN0RXZhbExhYmVscywKKyAgICAgICAgICAibG9jYXRlX3N1Ym1pdF9ydWxlIiwgImNhbl9zdWJtaXQiLAorICAgICAgICAgICJsb2NhdGVfc3VibWl0X2ZpbHRlciIsICJmaWx0ZXJfc3VibWl0X3Jlc3VsdHMiKTsKKyAgICAgIHJlc3VsdHMgPSBldmFsdWF0b3IuZXZhbHVhdGUoKTsKKyAgICB9IGNhdGNoIChSdWxlRXZhbEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbG9nUnVsZUVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKICAgICB9CiAKICAgICBpZiAocmVzdWx0cy5pc0VtcHR5KCkpIHsKQEAgLTQzNywxMiArMzY1LDI4IEBACiAgICAgICAvLyBhdCBsZWFzdCBvbmUgcmVzdWx0IGluZm9ybWluZyB0aGUgY2FsbGVyIG9mIHRoZSBsYWJlbHMgdGhhdCBhcmUKICAgICAgIC8vIHJlcXVpcmVkIGZvciB0aGlzIGNoYW5nZSB0byBiZSBzdWJtaXR0YWJsZS4gRWFjaCBsYWJlbCB3aWxsIGluZGljYXRlCiAgICAgICAvLyB3aGV0aGVyIG9yIG5vdCB0aGF0IGlzIGFjdHVhbGx5IHBvc3NpYmxlIGdpdmVuIHRoZSBwZXJtaXNzaW9ucy4KLSAgICAgIGxvZy5lcnJvcigiU3VibWl0IHJ1bGUgIiArIHN1Ym1pdFJ1bGUgKyAiIGZvciBjaGFuZ2UgIiArIGNoYW5nZS5nZXRJZCgpCi0gICAgICAgICAgKyAiIG9mICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIiBoYXMgbm8gc29sdXRpb24uIik7CisgICAgICBsb2cuZXJyb3IoIlN1Ym1pdCBydWxlICciICsgZXZhbHVhdG9yLmdldFN1Ym1pdFJ1bGUoKSArICInIGZvciBjaGFuZ2UgIgorICAgICAgICAgICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpCisgICAgICAgICAgKyAiIGhhcyBubyBzb2x1dGlvbi4iKTsKICAgICAgIHJldHVybiBydWxlRXJyb3IoIlByb2plY3Qgc3VibWl0IHJ1bGUgaGFzIG5vIHNvbHV0aW9uIik7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlc3VsdHNUb1N1Ym1pdFJlY29yZChzdWJtaXRSdWxlLCByZXN1bHRzKTsKKyAgICByZXR1cm4gcmVzdWx0c1RvU3VibWl0UmVjb3JkKGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCksIHJlc3VsdHMpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PFN1Ym1pdFJlY29yZD4gY2Fubm90U3VibWl0RHJhZnQoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0LAorICAgICAgQ2hhbmdlRGF0YSBjZCkgeworICAgIHRyeSB7CisgICAgICBpZiAoIWlzRHJhZnRWaXNpYmxlKGRiLCBjZCkpIHsKKyAgICAgICAgcmV0dXJuIHJ1bGVFcnJvcigiUGF0Y2ggc2V0ICIgKyBwYXRjaFNldC5nZXRQYXRjaFNldElkKCkgKyAiIG5vdCBmb3VuZCIpOworICAgICAgfSBlbHNlIGlmIChwYXRjaFNldC5pc0RyYWZ0KCkpIHsKKyAgICAgICAgcmV0dXJuIHJ1bGVFcnJvcigiQ2Fubm90IHN1Ym1pdCBkcmFmdCBwYXRjaCBzZXRzIik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcnVsZUVycm9yKCJDYW5ub3Qgc3VibWl0IGRyYWZ0IGNoYW5nZXMiKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CisgICAgICByZXR1cm4gbG9nUnVsZUVycm9yKCJDYW5ub3QgcmVhZCBwYXRjaCBzZXQgIiArIHBhdGNoU2V0LmdldElkKCksIGVycik7CisgICAgfQogICB9CiAKICAgLyoqCkBAIC01MjcsNiArNDcxLDY0IEBACiAgICAgcmV0dXJuIG91dDsKICAgfQogCisgIHB1YmxpYyBTdWJtaXRUeXBlUmVjb3JkIGdldFN1Ym1pdFR5cGVSZWNvcmQoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0KSB7CisgICAgcmV0dXJuIGdldFN1Ym1pdFR5cGVSZWNvcmQoZGIsIHBhdGNoU2V0LCBudWxsKTsKKyAgfQorCisgIHB1YmxpYyBTdWJtaXRUeXBlUmVjb3JkIGdldFN1Ym1pdFR5cGVSZWNvcmQoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0LAorICAgICAgQE51bGxhYmxlIENoYW5nZURhdGEgY2QpIHsKKyAgICB0cnkgeworICAgICAgaWYgKGNoYW5nZS5nZXRTdGF0dXMoKSA9PSBDaGFuZ2UuU3RhdHVzLkRSQUZUICYmICFpc0RyYWZ0VmlzaWJsZShkYiwgY2QpKSB7CisgICAgICAgIHJldHVybiB0eXBlUnVsZUVycm9yKCJQYXRjaCBzZXQgIiArIHBhdGNoU2V0LmdldFBhdGNoU2V0SWQoKQorICAgICAgICAgICAgKyAiIG5vdCBmb3VuZCIpOworICAgICAgfQorICAgICAgaWYgKHBhdGNoU2V0LmlzRHJhZnQoKSAmJiAhaXNEcmFmdFZpc2libGUoZGIsIGNkKSkgeworICAgICAgICByZXR1cm4gdHlwZVJ1bGVFcnJvcigiUGF0Y2ggc2V0ICIgKyBwYXRjaFNldC5nZXRQYXRjaFNldElkKCkKKyAgICAgICAgICAgICsgIiBub3QgZm91bmQiKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChPcm1FeGNlcHRpb24gZXJyKSB7CisgICAgICByZXR1cm4gbG9nVHlwZVJ1bGVFcnJvcigiQ2Fubm90IHJlYWQgcGF0Y2ggc2V0ICIgKyBwYXRjaFNldC5nZXRJZCgpLAorICAgICAgICAgIGVycik7CisgICAgfQorCisgICAgTGlzdDxUZXJtPiByZXN1bHRzOworICAgIFN1Ym1pdFJ1bGVFdmFsdWF0b3IgZXZhbHVhdG9yOworICAgIHRyeSB7CisgICAgICBldmFsdWF0b3IgPSBuZXcgU3VibWl0UnVsZUV2YWx1YXRvcihkYiwgcGF0Y2hTZXQsCisgICAgICAgICAgZ2V0UHJvamVjdENvbnRyb2woKSwgdGhpcywgY2hhbmdlLCBjZCwKKyAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAibG9jYXRlX3N1Ym1pdF90eXBlIiwgImdldF9zdWJtaXRfdHlwZSIsCisgICAgICAgICAgImxvY2F0ZV9zdWJtaXRfdHlwZV9maWx0ZXIiLCAiZmlsdGVyX3N1Ym1pdF90eXBlX3Jlc3VsdHMiKTsKKyAgICAgIHJlc3VsdHMgPSBldmFsdWF0b3IuZXZhbHVhdGUoKTsKKyAgICB9IGNhdGNoIChSdWxlRXZhbEV4Y2VwdGlvbiBlKSB7CisgICAgICByZXR1cm4gbG9nVHlwZVJ1bGVFcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdHMuaXNFbXB0eSgpKSB7CisgICAgICAvLyBTaG91bGQgbmV2ZXIgb2NjdXIgZm9yIGEgd2VsbCB3cml0dGVuIHJ1bGUKKyAgICAgIGxvZy5lcnJvcigiU3VibWl0IHJ1bGUgJyIgKyBldmFsdWF0b3IuZ2V0U3VibWl0UnVsZSgpICsgIicgZm9yIGNoYW5nZSAiCisgICAgICAgICAgKyBjaGFuZ2UuZ2V0SWQoKSArICIgb2YgIiArIGdldFByb2plY3QoKS5nZXROYW1lKCkKKyAgICAgICAgICArICIgaGFzIG5vIHNvbHV0aW9uLiIpOworICAgICAgcmV0dXJuIHR5cGVSdWxlRXJyb3IoIlByb2plY3Qgc3VibWl0IHJ1bGUgaGFzIG5vIHNvbHV0aW9uIik7CisgICAgfQorCisgICAgVGVybSB0eXBlVGVybSA9IHJlc3VsdHMuZ2V0KDApOworICAgIGlmICghdHlwZVRlcm0uaXNTeW1ib2woKSkgeworICAgICAgbG9nLmVycm9yKCJTdWJtaXQgcnVsZSAnIiArIGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCkgKyAiJyBmb3IgY2hhbmdlICIKKyAgICAgICAgICArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKQorICAgICAgICAgICsgIiBkaWQgbm90IHJldHVybiBhIHN5bWJvbC4iKTsKKyAgICAgIHJldHVybiB0eXBlUnVsZUVycm9yKCJQcm9qZWN0IHN1Ym1pdCBydWxlIGhhcyBpbnZhbGlkIHNvbHV0aW9uIik7CisgICAgfQorCisgICAgU3RyaW5nIHR5cGVOYW1lID0gKChTeW1ib2xUZXJtKXR5cGVUZXJtKS5uYW1lKCk7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBTdWJtaXRUeXBlUmVjb3JkLk9LKAorICAgICAgICAgIFByb2plY3QuU3VibWl0VHlwZS52YWx1ZU9mKHR5cGVOYW1lLnRvVXBwZXJDYXNlKCkpKTsKKyAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIGxvZ0ludmFsaWRUeXBlKGV2YWx1YXRvci5nZXRTdWJtaXRSdWxlKCksIHR5cGVOYW1lKTsKKyAgICB9CisgIH0KKwogICBwcml2YXRlIExpc3Q8U3VibWl0UmVjb3JkPiBsb2dJbnZhbGlkUmVzdWx0KFRlcm0gcnVsZSwgVGVybSByZWNvcmQpIHsKICAgICByZXR1cm4gbG9nUnVsZUVycm9yKCJTdWJtaXQgcnVsZSAiICsgcnVsZSArICIgZm9yIGNoYW5nZSAiICsgY2hhbmdlLmdldElkKCkKICAgICAgICAgKyAiIG9mICIgKyBnZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgIiBvdXRwdXQgaW52YWxpZCByZXN1bHQ6ICIgKyByZWNvcmQpOwpAQCAtNTQ5LDYgKzU1MSwyOSBAQAogICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlYyk7CiAgIH0KIAorICBwcml2YXRlIFN1Ym1pdFR5cGVSZWNvcmQgbG9nSW52YWxpZFR5cGUoVGVybSBydWxlLCBTdHJpbmcgcmVjb3JkKSB7CisgICAgcmV0dXJuIGxvZ1R5cGVSdWxlRXJyb3IoIlN1Ym1pdCB0eXBlIHJ1bGUgIiArIHJ1bGUgKyAiIGZvciBjaGFuZ2UgIgorICAgICAgICArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiICsgZ2V0UHJvamVjdCgpLmdldE5hbWUoKQorICAgICAgICArICIgb3V0cHV0IGludmFsaWQgcmVzdWx0OiAiICsgcmVjb3JkKTsKKyAgfQorCisgIHByaXZhdGUgU3VibWl0VHlwZVJlY29yZCBsb2dUeXBlUnVsZUVycm9yKFN0cmluZyBlcnIsIEV4Y2VwdGlvbiBlKSB7CisgICAgbG9nLmVycm9yKGVyciwgZSk7CisgICAgcmV0dXJuIHR5cGVSdWxlRXJyb3IoIkVycm9yIGV2YWx1YXRpbmcgcHJvamVjdCB0eXBlIHJ1bGVzLCBjaGVjayBzZXJ2ZXIgbG9nIik7CisgIH0KKworICBwcml2YXRlIFN1Ym1pdFR5cGVSZWNvcmQgbG9nVHlwZVJ1bGVFcnJvcihTdHJpbmcgZXJyKSB7CisgICAgbG9nLmVycm9yKGVycik7CisgICAgcmV0dXJuIHR5cGVSdWxlRXJyb3IoIkVycm9yIGV2YWx1YXRpbmcgcHJvamVjdCB0eXBlIHJ1bGVzLCBjaGVjayBzZXJ2ZXIgbG9nIik7CisgIH0KKworICBwcml2YXRlIFN1Ym1pdFR5cGVSZWNvcmQgdHlwZVJ1bGVFcnJvcihTdHJpbmcgZXJyKSB7CisgICAgU3VibWl0VHlwZVJlY29yZCByZWMgPSBuZXcgU3VibWl0VHlwZVJlY29yZCgpOworICAgIHJlYy5zdGF0dXMgPSBTdWJtaXRUeXBlUmVjb3JkLlN0YXR1cy5SVUxFX0VSUk9SOworICAgIHJlYy5lcnJvck1lc3NhZ2UgPSBlcnI7CisgICAgcmV0dXJuIHJlYzsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCBhcHBsaWVkQnkoU3VibWl0UmVjb3JkLkxhYmVsIGxhYmVsLCBUZXJtIHN0YXR1cykgewogICAgIGlmIChzdGF0dXMuaXNTdHJ1Y3R1cmUoKSAmJiBzdGF0dXMuYXJpdHkoKSA9PSAxKSB7CiAgICAgICBUZXJtIHdobyA9IHN0YXR1cy5hcmcoMCk7CkBAIC01NjAsNyArNTg1LDcgQEAKIAogICBwcml2YXRlIGJvb2xlYW4gaXNEcmFmdFZpc2libGUoUmV2aWV3RGIgZGIsIENoYW5nZURhdGEgY2QpCiAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gaXNPd25lcigpIHx8IGlzUmV2aWV3ZXIoZGIsIGNkKTsKKyAgICByZXR1cm4gaXNPd25lcigpIHx8IGlzUmV2aWV3ZXIoZGIsIGNkKSB8fCBnZXRSZWZDb250cm9sKCkuY2FuVmlld0RyYWZ0cygpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VzZXIoVGVybSB3aG8pIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DcmVhdGVQcm9qZWN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvQ3JlYXRlUHJvamVjdC5qYXZhCmluZGV4IDNkYmQ3YjcuLjU0OTQxNDYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DcmVhdGVQcm9qZWN0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0NyZWF0ZVByb2plY3QuamF2YQpAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogLy8KIC8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTAsMjg5ICsxMCwxMTUgQEAKIC8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBEZXNjcmlwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLk5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY1NldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Ub3BMZXZlbFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5VbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBCYWNrZW5kOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUHJvamVjdE93bmVyR3JvdXBzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5leHRlbnNpb25zLmV2ZW50cy5HaXRSZWZlcmVuY2VVcGRhdGVkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5SZXBvc2l0b3J5Q2FzZU1pc21hdGNoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cHNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNyZWF0ZVByb2plY3QuSW5wdXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkFzc2lzdGVkOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SW5zZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZlVwZGF0ZS5SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogCi0KLS8qKiBDb21tb24gY2xhc3MgdGhhdCBob2xkcyB0aGUgY29kZSB0byBjcmVhdGUgcHJvamVjdHMgKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVQcm9qZWN0IHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkKLSAgICAgIC5nZXRMb2dnZXIoQ3JlYXRlUHJvamVjdC5jbGFzcyk7Ci0KLSAgcHVibGljIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBDcmVhdGVQcm9qZWN0IGNyZWF0ZShDcmVhdGVQcm9qZWN0QXJncyBjcmVhdGVQcm9qZWN0QXJncyk7CitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX1BST0pFQ1QpCitjbGFzcyBDcmVhdGVQcm9qZWN0IGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8VG9wTGV2ZWxSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBTdHJpbmcgbmFtZTsKKyAgICBTdHJpbmcgcGFyZW50OworICAgIFN0cmluZyBkZXNjcmlwdGlvbjsKKyAgICBib29sZWFuIHBlcm1pc3Npb25zT25seTsKKyAgICBib29sZWFuIGNyZWF0ZUVtcHR5Q29tbWl0OworICAgIFN1Ym1pdFR5cGUgc3VibWl0VHlwZTsKKyAgICBMaXN0PFN0cmluZz4gYnJhbmNoZXM7CisgICAgTGlzdDxTdHJpbmc+IG93bmVyczsKKyAgICBJbmhlcml0YWJsZUJvb2xlYW4gdXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzOworICAgIEluaGVyaXRhYmxlQm9vbGVhbiB1c2VTaWduZWRPZmZCeTsKKyAgICBJbmhlcml0YWJsZUJvb2xlYW4gdXNlQ29udGVudE1lcmdlOworICAgIEluaGVyaXRhYmxlQm9vbGVhbiByZXF1aXJlQ2hhbmdlSWQ7CiAgIH0KIAotICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gcHJvamVjdE93bmVyR3JvdXBzOwotICBwcml2YXRlIGZpbmFsIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOwotICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwotICBwcml2YXRlIGZpbmFsIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVmZXJlbmNlVXBkYXRlZDsKLSAgcHJpdmF0ZSBmaW5hbCBEeW5hbWljU2V0PE5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXI+IGNyZWF0ZWRMaXN0ZW5lcjsKLSAgcHJpdmF0ZSBmaW5hbCBQZXJzb25JZGVudCBzZXJ2ZXJJZGVudDsKLSAgcHJpdmF0ZSBDcmVhdGVQcm9qZWN0QXJncyBjcmVhdGVQcm9qZWN0QXJnczsKLSAgcHJpdmF0ZSBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlOwotICBwcml2YXRlIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQ7Ci0gIHByaXZhdGUgTWV0YURhdGFVcGRhdGUuVXNlciBtZXRhRGF0YVVwZGF0ZUZhY3Rvcnk7CisgIHN0YXRpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgQ3JlYXRlUHJvamVjdCBjcmVhdGUoU3RyaW5nIG5hbWUpOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQZXJmb3JtQ3JlYXRlUHJvamVjdC5GYWN0b3J5IGNyZWF0ZVByb2plY3RGYWN0b3J5OworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFByb2plY3RzQ29sbGVjdGlvbj4gcHJvamVjdHNDb2xsZWN0aW9uOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEdyb3Vwc0NvbGxlY3Rpb24+IGdyb3Vwc0NvbGxlY3Rpb247CisgIHByaXZhdGUgZmluYWwgUHJvamVjdEpzb24ganNvbjsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKIAogICBASW5qZWN0Ci0gIENyZWF0ZVByb2plY3QoQFByb2plY3RPd25lckdyb3VwcyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IHBPd25lckdyb3VwcywKLSAgICAgIElkZW50aWZpZWRVc2VyIGlkZW50aWZpZWRVc2VyLCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRSZXBvTWFuYWdlciwKLSAgICAgIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVmZXJlbmNlVXBkYXRlZCwKLSAgICAgIER5bmFtaWNTZXQ8TmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lcj4gY3JlYXRlZExpc3RlbmVyLAotICAgICAgUmV2aWV3RGIgZGIsCi0gICAgICBAR2Vycml0UGVyc29uSWRlbnQgUGVyc29uSWRlbnQgcGVyc29uSWRlbnQsIEdyb3VwQmFja2VuZCBncm91cEJhY2tlbmQsCi0gICAgICBNZXRhRGF0YVVwZGF0ZS5Vc2VyIG1ldGFEYXRhVXBkYXRlRmFjdG9yeSwKLSAgICAgIEBBc3Npc3RlZCBDcmVhdGVQcm9qZWN0QXJncyBjcmVhdGVQQXJncywgUHJvamVjdENhY2hlIHBDYWNoZSkgewotICAgIHRoaXMucHJvamVjdE93bmVyR3JvdXBzID0gcE93bmVyR3JvdXBzOwotICAgIHRoaXMuY3VycmVudFVzZXIgPSBpZGVudGlmaWVkVXNlcjsKLSAgICB0aGlzLnJlcG9NYW5hZ2VyID0gZ2l0UmVwb01hbmFnZXI7Ci0gICAgdGhpcy5yZWZlcmVuY2VVcGRhdGVkID0gcmVmZXJlbmNlVXBkYXRlZDsKLSAgICB0aGlzLmNyZWF0ZWRMaXN0ZW5lciA9IGNyZWF0ZWRMaXN0ZW5lcjsKLSAgICB0aGlzLnNlcnZlcklkZW50ID0gcGVyc29uSWRlbnQ7Ci0gICAgdGhpcy5jcmVhdGVQcm9qZWN0QXJncyA9IGNyZWF0ZVBBcmdzOwotICAgIHRoaXMucHJvamVjdENhY2hlID0gcENhY2hlOwotICAgIHRoaXMuZ3JvdXBCYWNrZW5kID0gZ3JvdXBCYWNrZW5kOwotICAgIHRoaXMubWV0YURhdGFVcGRhdGVGYWN0b3J5ID0gbWV0YURhdGFVcGRhdGVGYWN0b3J5OworICBDcmVhdGVQcm9qZWN0KFBlcmZvcm1DcmVhdGVQcm9qZWN0LkZhY3RvcnkgcGVyZm9ybUNyZWF0ZVByb2plY3RGYWN0b3J5LAorICAgICAgUHJvdmlkZXI8UHJvamVjdHNDb2xsZWN0aW9uPiBwcm9qZWN0c0NvbGxlY3Rpb24sCisgICAgICBQcm92aWRlcjxHcm91cHNDb2xsZWN0aW9uPiBncm91cHNDb2xsZWN0aW9uLCBQcm9qZWN0SnNvbiBqc29uLAorICAgICAgQEFzc2lzdGVkIFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5jcmVhdGVQcm9qZWN0RmFjdG9yeSA9IHBlcmZvcm1DcmVhdGVQcm9qZWN0RmFjdG9yeTsKKyAgICB0aGlzLnByb2plY3RzQ29sbGVjdGlvbiA9IHByb2plY3RzQ29sbGVjdGlvbjsKKyAgICB0aGlzLmdyb3Vwc0NvbGxlY3Rpb24gPSBncm91cHNDb2xsZWN0aW9uOworICAgIHRoaXMuanNvbiA9IGpzb247CisgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgfQogCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZVByb2plY3QoKSB0aHJvd3MgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKLSAgICB2YWxpZGF0ZVBhcmFtZXRlcnMoKTsKLSAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgbmFtZUtleSA9IGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3QoKTsKLSAgICB0cnkgewotICAgICAgZmluYWwgU3RyaW5nIGhlYWQgPQotICAgICAgICAgIGNyZWF0ZVByb2plY3RBcmdzLnBlcm1pc3Npb25zT25seSA/IEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcKLSAgICAgICAgICAgICAgOiBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2guZ2V0KDApOwotICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvID0gcmVwb01hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShuYW1lS2V5KTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIE5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXIuRXZlbnQgZXZlbnQgPSBuZXcgTmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lci5FdmVudCgpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWVLZXkuZ2V0KCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBoZWFkOwotICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgZm9yIChOZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyIGwgOiBjcmVhdGVkTGlzdGVuZXIpIHsKLSAgICAgICAgICBsLm9uTmV3UHJvamVjdENyZWF0ZWQoZXZlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgUmVmVXBkYXRlIHUgPSByZXBvLnVwZGF0ZVJlZihDb25zdGFudHMuSEVBRCk7Ci0gICAgICAgIHUuZGlzYWJsZVJlZkxvZygpOwotICAgICAgICB1LmxpbmsoaGVhZCk7Ci0KLSAgICAgICAgY3JlYXRlUHJvamVjdENvbmZpZygpOwotCi0gICAgICAgIGlmICghY3JlYXRlUHJvamVjdEFyZ3MucGVybWlzc2lvbnNPbmx5Ci0gICAgICAgICAgICAmJiBjcmVhdGVQcm9qZWN0QXJncy5jcmVhdGVFbXB0eUNvbW1pdCkgewotICAgICAgICAgIGNyZWF0ZUVtcHR5Q29tbWl0cyhyZXBvLCBuYW1lS2V5LCBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2gpOwotICAgICAgICB9Ci0gICAgICB9IGZpbmFsbHkgewotICAgICAgICByZXBvLmNsb3NlKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoUmVwb3NpdG9yeUNhc2VNaXNtYXRjaEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlICIgKyBuYW1lS2V5LmdldCgpCi0gICAgICAgICAgKyAiIGJlY2F1c2UgdGhlIG5hbWUgaXMgYWxyZWFkeSBvY2N1cGllZCBieSBhbm90aGVyIHByb2plY3QuIgotICAgICAgICAgICsgIiBUaGUgb3RoZXIgcHJvamVjdCBoYXMgdGhlIHNhbWUgbmFtZSwgb25seSBzcGVsbGVkIGluIGEiCi0gICAgICAgICAgKyAiIGRpZmZlcmVudCBjYXNlLiIsIGUpOwotICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBiYWROYW1lKSB7Ci0gICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlICIgKyBuYW1lS2V5LCBiYWROYW1lKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXJyKSB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBSZXBvc2l0b3J5IHJlcG8gPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShuYW1lS2V5KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpZiAocmVwby5nZXRPYmplY3REYXRhYmFzZSgpLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKCJwcm9qZWN0IFwiIiArIG5hbWVLZXkgKyAiXCIgZXhpc3RzIik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgIHJlcG8uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9FcnIpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9ICJDYW5ub3QgY3JlYXRlICIgKyBuYW1lS2V5OwotICAgICAgICBsb2cuZXJyb3IobXNnLCBlcnIpOwotICAgICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKG1zZywgaW9FcnIpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXk7Ci0gICAgICBsb2cuZXJyb3IobXNnLCBlKTsKLSAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24obXNnLCBlKTsKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoVG9wTGV2ZWxSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiwKKyAgICAgIFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgIGlucHV0ID0gbmV3IElucHV0KCk7CiAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewotICAgIGZpbmFsIE1ldGFEYXRhVXBkYXRlIG1kID0KLSAgICAgICAgbWV0YURhdGFVcGRhdGVGYWN0b3J5LmNyZWF0ZShjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0KCkpOwotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IFByb2plY3RDb25maWcucmVhZChtZCk7Ci0gICAgICBjb25maWcubG9hZChtZCk7Ci0KLSAgICAgIFByb2plY3QgbmV3UHJvamVjdCA9IGNvbmZpZy5nZXRQcm9qZWN0KCk7Ci0gICAgICBuZXdQcm9qZWN0LnNldERlc2NyaXB0aW9uKGNyZWF0ZVByb2plY3RBcmdzLnByb2plY3REZXNjcmlwdGlvbik7Ci0gICAgICBuZXdQcm9qZWN0LnNldFN1Ym1pdFR5cGUoY3JlYXRlUHJvamVjdEFyZ3Muc3VibWl0VHlwZSk7Ci0gICAgICBuZXdQcm9qZWN0Ci0gICAgICAgICAgLnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhjcmVhdGVQcm9qZWN0QXJncy5jb250cmlidXRvckFncmVlbWVudHMpOwotICAgICAgbmV3UHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeShjcmVhdGVQcm9qZWN0QXJncy5zaWduZWRPZmZCeSk7Ci0gICAgICBuZXdQcm9qZWN0LnNldFVzZUNvbnRlbnRNZXJnZShjcmVhdGVQcm9qZWN0QXJncy5jb250ZW50TWVyZ2UpOwotICAgICAgbmV3UHJvamVjdC5zZXRSZXF1aXJlQ2hhbmdlSUQoY3JlYXRlUHJvamVjdEFyZ3MuY2hhbmdlSWRSZXF1aXJlZCk7Ci0gICAgICBpZiAoY3JlYXRlUHJvamVjdEFyZ3MubmV3UGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgbmV3UHJvamVjdC5zZXRQYXJlbnROYW1lKGNyZWF0ZVByb2plY3RBcmdzLm5ld1BhcmVudC5nZXRQcm9qZWN0KCkKLSAgICAgICAgICAgIC5nZXROYW1lS2V5KCkpOwotICAgICAgfQotCi0gICAgICBpZiAoIWNyZWF0ZVByb2plY3RBcmdzLm93bmVySWRzLmlzRW1wdHkoKSkgewotICAgICAgICBmaW5hbCBBY2Nlc3NTZWN0aW9uIGFsbCA9Ci0gICAgICAgICAgICBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbihBY2Nlc3NTZWN0aW9uLkFMTCwgdHJ1ZSk7Ci0gICAgICAgIGZvciAoQWNjb3VudEdyb3VwLlVVSUQgb3duZXJJZCA6IGNyZWF0ZVByb2plY3RBcmdzLm93bmVySWRzKSB7Ci0gICAgICAgICAgR3JvdXBEZXNjcmlwdGlvbi5CYXNpYyBnID0gZ3JvdXBCYWNrZW5kLmdldChvd25lcklkKTsKLSAgICAgICAgICBpZiAoZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBHcm91cFJlZmVyZW5jZSBncm91cCA9IGNvbmZpZy5yZXNvbHZlKEdyb3VwUmVmZXJlbmNlLmZvckdyb3VwKGcpKTsKLSAgICAgICAgICAgIGFsbC5nZXRQZXJtaXNzaW9uKFBlcm1pc3Npb24uT1dORVIsIHRydWUpLmFkZCgKLSAgICAgICAgICAgICAgICBuZXcgUGVybWlzc2lvblJ1bGUoZ3JvdXApKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgbWQuc2V0TWVzc2FnZSgiQ3JlYXRlZCBwcm9qZWN0XG4iKTsKLSAgICAgIGNvbmZpZy5jb21taXQobWQpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBtZC5jbG9zZSgpOwotICAgIH0KLSAgICBwcm9qZWN0Q2FjaGUub25DcmVhdGVQcm9qZWN0KGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3QoKSk7Ci0gICAgcmVwb01hbmFnZXIuc2V0UHJvamVjdERlc2NyaXB0aW9uKGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3QoKSwKLSAgICAgICAgY3JlYXRlUHJvamVjdEFyZ3MucHJvamVjdERlc2NyaXB0aW9uKTsKLSAgICByZWZlcmVuY2VVcGRhdGVkLmZpcmUoY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdCgpLAotICAgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVBhcmFtZXRlcnMoKSB0aHJvd3MgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uIHsKLSAgICBpZiAoY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdE5hbWUoKSA9PSBudWxsCi0gICAgICAgIHx8IGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3ROYW1lKCkuaXNFbXB0eSgpKSB7Ci0gICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKCJQcm9qZWN0IG5hbWUgaXMgcmVxdWlyZWQiKTsKKyAgICBpZiAoaW5wdXQubmFtZSAhPSBudWxsICYmICFuYW1lLmVxdWFscyhpbnB1dC5uYW1lKSkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIm5hbWUgbXVzdCBtYXRjaCBVUkwiKTsKICAgICB9CiAKLSAgICBpZiAoY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdE5hbWUoKS5lbmRzV2l0aChDb25zdGFudHMuRE9UX0dJVF9FWFQpKSB7Ci0gICAgICBjcmVhdGVQcm9qZWN0QXJncy5zZXRQcm9qZWN0TmFtZShjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpCi0gICAgICAgICAgLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdE5hbWUoKS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgLSBDb25zdGFudHMuRE9UX0dJVF9FWFQubGVuZ3RoKCkpKTsKKyAgICBmaW5hbCBDcmVhdGVQcm9qZWN0QXJncyBhcmdzID0gbmV3IENyZWF0ZVByb2plY3RBcmdzKCk7CisgICAgYXJncy5zZXRQcm9qZWN0TmFtZShuYW1lKTsKKyAgICBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShpbnB1dC5wYXJlbnQpKSB7CisgICAgICBhcmdzLm5ld1BhcmVudCA9IHByb2plY3RzQ29sbGVjdGlvbi5nZXQoKS5wYXJzZShpbnB1dC5wYXJlbnQpLmdldENvbnRyb2woKTsKICAgICB9Ci0KLSAgICBpZiAoIWN1cnJlbnRVc2VyLmdldENhcGFiaWxpdGllcygpLmNhbkNyZWF0ZVByb2plY3QoKSkgewotICAgICAgdGhyb3cgbmV3IFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICIlcyBkb2VzIG5vdCBoYXZlIFwiQ3JlYXRlIFByb2plY3RcIiBjYXBhYmlsaXR5LiIsCi0gICAgICAgICAgY3VycmVudFVzZXIuZ2V0VXNlck5hbWUoKSkpOwotICAgIH0KLQotICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5vd25lcklkcyA9PSBudWxsCi0gICAgICAgIHx8IGNyZWF0ZVByb2plY3RBcmdzLm93bmVySWRzLmlzRW1wdHkoKSkgewotICAgICAgY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMgPQotICAgICAgICAgIG5ldyBBcnJheUxpc3Q8QWNjb3VudEdyb3VwLlVVSUQ+KHByb2plY3RPd25lckdyb3Vwcyk7Ci0gICAgfQotCi0gICAgTGlzdDxTdHJpbmc+IHRyYW5zZm9ybWVkQnJhbmNoZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBpZiAoY3JlYXRlUHJvamVjdEFyZ3MuYnJhbmNoID09IG51bGwgfHwKLSAgICAgICAgY3JlYXRlUHJvamVjdEFyZ3MuYnJhbmNoLmlzRW1wdHkoKSkgewotICAgICAgY3JlYXRlUHJvamVjdEFyZ3MuYnJhbmNoID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChDb25zdGFudHMuTUFTVEVSKTsKLSAgICB9Ci0gICAgZm9yIChTdHJpbmcgYnJhbmNoIDogY3JlYXRlUHJvamVjdEFyZ3MuYnJhbmNoKSB7Ci0gICAgICB3aGlsZSAoYnJhbmNoLnN0YXJ0c1dpdGgoIi8iKSkgewotICAgICAgICBicmFuY2ggPSBicmFuY2guc3Vic3RyaW5nKDEpOworICAgIGFyZ3MuY3JlYXRlRW1wdHlDb21taXQgPSBpbnB1dC5jcmVhdGVFbXB0eUNvbW1pdDsKKyAgICBhcmdzLnBlcm1pc3Npb25zT25seSA9IGlucHV0LnBlcm1pc3Npb25zT25seTsKKyAgICBhcmdzLnByb2plY3REZXNjcmlwdGlvbiA9IFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQuZGVzY3JpcHRpb24pOworICAgIGFyZ3Muc3VibWl0VHlwZSA9CisgICAgICAgIE9iamVjdHMuZmlyc3ROb25OdWxsKGlucHV0LnN1Ym1pdFR5cGUsIFN1Ym1pdFR5cGUuTUVSR0VfSUZfTkVDRVNTQVJZKTsKKyAgICBhcmdzLmJyYW5jaCA9IGlucHV0LmJyYW5jaGVzOworICAgIGlmIChpbnB1dC5vd25lcnMgIT0gbnVsbCkgeworICAgICAgTGlzdDxBY2NvdW50R3JvdXAuVVVJRD4gb3duZXJJZHMgPQorICAgICAgICAgIExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShpbnB1dC5vd25lcnMuc2l6ZSgpKTsKKyAgICAgIGZvciAoU3RyaW5nIG93bmVyIDogaW5wdXQub3duZXJzKSB7CisgICAgICAgIG93bmVySWRzLmFkZChncm91cHNDb2xsZWN0aW9uLmdldCgpLnBhcnNlKG93bmVyKS5nZXRHcm91cFVVSUQoKSk7CiAgICAgICB9Ci0gICAgICBpZiAoIWJyYW5jaC5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkgewotICAgICAgICBicmFuY2ggPSBDb25zdGFudHMuUl9IRUFEUyArIGJyYW5jaDsKLSAgICAgIH0KLSAgICAgIGlmICghUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShicmFuY2gpKSB7Ci0gICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICJCcmFuY2ggXCIlc1wiIGlzIG5vdCBhIHZhbGlkIG5hbWUuIiwgYnJhbmNoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAoIXRyYW5zZm9ybWVkQnJhbmNoZXMuY29udGFpbnMoYnJhbmNoKSkgewotICAgICAgICB0cmFuc2Zvcm1lZEJyYW5jaGVzLmFkZChicmFuY2gpOwotICAgICAgfQorICAgICAgYXJncy5vd25lcklkcyA9IG93bmVySWRzOwogICAgIH0KLSAgICBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2ggPSB0cmFuc2Zvcm1lZEJyYW5jaGVzOwotICB9CisgICAgYXJncy5jb250cmlidXRvckFncmVlbWVudHMgPQorICAgICAgICBPYmplY3RzLmZpcnN0Tm9uTnVsbChpbnB1dC51c2VDb250cmlidXRvckFncmVlbWVudHMsCisgICAgICAgICAgICBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVCk7CisgICAgYXJncy5zaWduZWRPZmZCeSA9CisgICAgICAgIE9iamVjdHMuZmlyc3ROb25OdWxsKGlucHV0LnVzZVNpZ25lZE9mZkJ5LCBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVCk7CisgICAgYXJncy5jb250ZW50TWVyZ2UgPQorICAgICAgICBpbnB1dC5zdWJtaXRUeXBlID09IFN1Ym1pdFR5cGUuRkFTVF9GT1JXQVJEX09OTFkKKyAgICAgICAgICAgID8gSW5oZXJpdGFibGVCb29sZWFuLkZBTFNFIDogT2JqZWN0cy5maXJzdE5vbk51bGwoCisgICAgICAgICAgICAgICAgaW5wdXQudXNlQ29udGVudE1lcmdlLCBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVCk7CisgICAgYXJncy5jaGFuZ2VJZFJlcXVpcmVkID0KKyAgICAgICAgT2JqZWN0cy5maXJzdE5vbk51bGwoaW5wdXQucmVxdWlyZUNoYW5nZUlkLCBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVCk7CiAKLSAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtcHR5Q29tbWl0cyhmaW5hbCBSZXBvc2l0b3J5IHJlcG8sCi0gICAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgZmluYWwgTGlzdDxTdHJpbmc+IHJlZnMpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIE9iamVjdEluc2VydGVyIG9pID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOwotICAgIHRyeSB7Ci0gICAgICBDb21taXRCdWlsZGVyIGNiID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKLSAgICAgIGNiLnNldFRyZWVJZChvaS5pbnNlcnQoQ29uc3RhbnRzLk9CSl9UUkVFLCBuZXcgYnl0ZVtdIHt9KSk7Ci0gICAgICBjYi5zZXRBdXRob3IobWV0YURhdGFVcGRhdGVGYWN0b3J5LmdldFVzZXJQZXJzb25JZGVudCgpKTsKLSAgICAgIGNiLnNldENvbW1pdHRlcihzZXJ2ZXJJZGVudCk7Ci0gICAgICBjYi5zZXRNZXNzYWdlKCJJbml0aWFsIGVtcHR5IHJlcG9zaXRvcnlcbiIpOwotCi0gICAgICBPYmplY3RJZCBpZCA9IG9pLmluc2VydChjYik7Ci0gICAgICBvaS5mbHVzaCgpOwotCi0gICAgICBmb3IgKFN0cmluZyByZWYgOiByZWZzKSB7Ci0gICAgICAgIFJlZlVwZGF0ZSBydSA9IHJlcG8udXBkYXRlUmVmKHJlZik7Ci0gICAgICAgIHJ1LnNldE5ld09iamVjdElkKGlkKTsKLSAgICAgICAgZmluYWwgUmVzdWx0IHJlc3VsdCA9IHJ1LnVwZGF0ZSgpOwotICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICAgIGNhc2UgTkVXOgotICAgICAgICAgICAgcmVmZXJlbmNlVXBkYXRlZC5maXJlKHByb2plY3QsIHJlZik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKLSAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgcmVmIFwiJXNcIjogJXMiLCByZWYsIHJlc3VsdC5uYW1lKCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBsb2cuZXJyb3IoCi0gICAgICAgICAgIkNhbm5vdCBjcmVhdGUgZW1wdHkgY29tbWl0IGZvciAiCi0gICAgICAgICAgICAgICsgY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdE5hbWUoKSwgZSk7Ci0gICAgICB0aHJvdyBlOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBvaS5yZWxlYXNlKCk7Ci0gICAgfQorICAgIFByb2plY3QgcCA9IGNyZWF0ZVByb2plY3RGYWN0b3J5LmNyZWF0ZShhcmdzKS5jcmVhdGVQcm9qZWN0KCk7CisgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoanNvbi5mb3JtYXQocCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvQ3JlYXRlUHJvamVjdEFyZ3MuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DcmVhdGVQcm9qZWN0QXJncy5qYXZhCmluZGV4IDJkZWU0ZjQuLjdiYmQyZTcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DcmVhdGVQcm9qZWN0QXJncy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9DcmVhdGVQcm9qZWN0QXJncy5qYXZhCkBAIC0xNiw2ICsxNiw3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0yNywxNSArMjgsMjAgQEAKICAgcHVibGljIFByb2plY3RDb250cm9sIG5ld1BhcmVudDsKICAgcHVibGljIFN0cmluZyBwcm9qZWN0RGVzY3JpcHRpb247CiAgIHB1YmxpYyBTdWJtaXRUeXBlIHN1Ym1pdFR5cGU7Ci0gIHB1YmxpYyBib29sZWFuIGNvbnRyaWJ1dG9yQWdyZWVtZW50czsKLSAgcHVibGljIGJvb2xlYW4gc2lnbmVkT2ZmQnk7CisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gY29udHJpYnV0b3JBZ3JlZW1lbnRzOworICBwdWJsaWMgSW5oZXJpdGFibGVCb29sZWFuIHNpZ25lZE9mZkJ5OwogICBwdWJsaWMgYm9vbGVhbiBwZXJtaXNzaW9uc09ubHk7CiAgIHB1YmxpYyBMaXN0PFN0cmluZz4gYnJhbmNoOwotICBwdWJsaWMgYm9vbGVhbiBjb250ZW50TWVyZ2U7Ci0gIHB1YmxpYyBib29sZWFuIGNoYW5nZUlkUmVxdWlyZWQ7CisgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gY29udGVudE1lcmdlOworICBwdWJsaWMgSW5oZXJpdGFibGVCb29sZWFuIGNoYW5nZUlkUmVxdWlyZWQ7CiAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZUVtcHR5Q29tbWl0OwogCiAgIHB1YmxpYyBDcmVhdGVQcm9qZWN0QXJncygpIHsKKyAgICBjb250cmlidXRvckFncmVlbWVudHMgPSBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgICBzaWduZWRPZmZCeSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICAgIGNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworICAgIGNoYW5nZUlkUmVxdWlyZWQgPSBJbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgICBzdWJtaXRUeXBlID0gU3VibWl0VHlwZS5NRVJHRV9JRl9ORUNFU1NBUlk7CiAgIH0KIAogICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGdldFByb2plY3QoKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvRGFzaGJvYXJkUmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9EYXNoYm9hcmRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmRiNDgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvRGFzaGJvYXJkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworcHVibGljIGNsYXNzIERhc2hib2FyZFJlc291cmNlIGltcGxlbWVudHMgUmVzdFJlc291cmNlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlTGl0ZXJhbDxSZXN0VmlldzxEYXNoYm9hcmRSZXNvdXJjZT4+IERBU0hCT0FSRF9LSU5EID0KKyAgICAgIG5ldyBUeXBlTGl0ZXJhbDxSZXN0VmlldzxEYXNoYm9hcmRSZXNvdXJjZT4+KCkge307CisKKyAgc3RhdGljIERhc2hib2FyZFJlc291cmNlIHByb2plY3REZWZhdWx0KFByb2plY3RDb250cm9sIGN0bCkgeworICAgIHJldHVybiBuZXcgRGFzaGJvYXJkUmVzb3VyY2UoY3RsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvamVjdENvbnRyb2wgY29udHJvbDsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVmTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aE5hbWU7CisgIHByaXZhdGUgZmluYWwgQ29uZmlnIGNvbmZpZzsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHByb2plY3REZWZhdWx0OworCisgIERhc2hib2FyZFJlc291cmNlKFByb2plY3RDb250cm9sIGNvbnRyb2wsCisgICAgICBTdHJpbmcgcmVmTmFtZSwKKyAgICAgIFN0cmluZyBwYXRoTmFtZSwKKyAgICAgIENvbmZpZyBjb25maWcsCisgICAgICBib29sZWFuIHByb2plY3REZWZhdWx0KSB7CisgICAgdGhpcy5jb250cm9sID0gY29udHJvbDsKKyAgICB0aGlzLnJlZk5hbWUgPSByZWZOYW1lOworICAgIHRoaXMucGF0aE5hbWUgPSBwYXRoTmFtZTsKKyAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB0aGlzLnByb2plY3REZWZhdWx0ID0gcHJvamVjdERlZmF1bHQ7CisgIH0KKworICBwdWJsaWMgUHJvamVjdENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKKyAgICByZXR1cm4gY29udHJvbDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmTmFtZSgpIHsKKyAgICByZXR1cm4gcmVmTmFtZTsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aE5hbWUoKSB7CisgICAgcmV0dXJuIHBhdGhOYW1lOworICB9CisKKyAgcHVibGljIENvbmZpZyBnZXRDb25maWcoKSB7CisgICAgcmV0dXJuIGNvbmZpZzsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzUHJvamVjdERlZmF1bHQoKSB7CisgICAgcmV0dXJuIHByb2plY3REZWZhdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvRGFzaGJvYXJkc0NvbGxlY3Rpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9EYXNoYm9hcmRzQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MGU3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvRGFzaGJvYXJkc0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXIuUkVGU19EQVNIQk9BUkRTOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQWNjZXB0c0NyZWF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQ2hpbGRDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdEFwaUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5Vcmw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5VcmxFbmNvZGVkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nc29uLmFubm90YXRpb25zLlNlcmlhbGl6ZWROYW1lOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkFtYmlndW91c09iamVjdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkJsb2JCYXNlZENvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitjbGFzcyBEYXNoYm9hcmRzQ29sbGVjdGlvbiBpbXBsZW1lbnRzCisgICAgQ2hpbGRDb2xsZWN0aW9uPFByb2plY3RSZXNvdXJjZSwgRGFzaGJvYXJkUmVzb3VyY2U+LAorICAgIEFjY2VwdHNDcmVhdGU8UHJvamVjdFJlc291cmNlPnsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOworICBwcml2YXRlIGZpbmFsIER5bmFtaWNNYXA8UmVzdFZpZXc8RGFzaGJvYXJkUmVzb3VyY2U+PiB2aWV3czsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0RGFzaGJvYXJkcz4gbGlzdDsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTZXREZWZhdWx0RGFzaGJvYXJkLkNyZWF0ZURlZmF1bHQ+IGNyZWF0ZURlZmF1bHQ7CisKKyAgQEluamVjdAorICBEYXNoYm9hcmRzQ29sbGVjdGlvbihHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyLAorICAgICAgRHluYW1pY01hcDxSZXN0VmlldzxEYXNoYm9hcmRSZXNvdXJjZT4+IHZpZXdzLAorICAgICAgUHJvdmlkZXI8TGlzdERhc2hib2FyZHM+IGxpc3QsCisgICAgICBQcm92aWRlcjxTZXREZWZhdWx0RGFzaGJvYXJkLkNyZWF0ZURlZmF1bHQ+IGNyZWF0ZURlZmF1bHQpIHsKKyAgICB0aGlzLmdpdE1hbmFnZXIgPSBnaXRNYW5hZ2VyOworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLmxpc3QgPSBsaXN0OworICAgIHRoaXMuY3JlYXRlRGVmYXVsdCA9IGNyZWF0ZURlZmF1bHQ7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RWaWV3PFByb2plY3RSZXNvdXJjZT4gbGlzdCgpIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gbGlzdC5nZXQoKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlc3RNb2RpZnlWaWV3PFByb2plY3RSZXNvdXJjZSwgPz4gY3JlYXRlKFByb2plY3RSZXNvdXJjZSBwYXJlbnQsCisgICAgICBJZFN0cmluZyBpZCkgdGhyb3dzIFJlc3RBcGlFeGNlcHRpb24geworICAgIGlmIChpZC5lcXVhbHMoImRlZmF1bHQiKSkgeworICAgICAgcmV0dXJuIGNyZWF0ZURlZmF1bHQuZ2V0KCk7CisgICAgfQorICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRGFzaGJvYXJkUmVzb3VyY2UgcGFyc2UoUHJvamVjdFJlc291cmNlIHBhcmVudCwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworICAgIFByb2plY3RDb250cm9sIG15Q3RsID0gcGFyZW50LmdldENvbnRyb2woKTsKKyAgICBpZiAoaWQuZXF1YWxzKCJkZWZhdWx0IikpIHsKKyAgICAgIHJldHVybiBEYXNoYm9hcmRSZXNvdXJjZS5wcm9qZWN0RGVmYXVsdChteUN0bCk7CisgICAgfQorCisgICAgTGlzdDxTdHJpbmc+IHBhcnRzID0gTGlzdHMubmV3QXJyYXlMaXN0KAorICAgICAgICBTcGxpdHRlci5vbignOicpLmxpbWl0KDIpLnNwbGl0KGlkLmdldCgpKSk7CisgICAgaWYgKHBhcnRzLnNpemUoKSAhPSAyKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorCisgICAgQ3VycmVudFVzZXIgdXNlciA9IG15Q3RsLmdldEN1cnJlbnRVc2VyKCk7CisgICAgU3RyaW5nIHJlZiA9IHBhcnRzLmdldCgwKTsKKyAgICBTdHJpbmcgcGF0aCA9IHBhcnRzLmdldCgxKTsKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBwcyA6IG15Q3RsLmdldFByb2plY3RTdGF0ZSgpLnRyZWUoKSkgeworICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKHBzLmNvbnRyb2xGb3IodXNlciksIHJlZiwgcGF0aCwgbXlDdGwpOworICAgICAgfSBjYXRjaCAoQW1iaWd1b3VzT2JqZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgICAgfSBjYXRjaCAoSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgICB9IGNhdGNoIChSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgfQorCisgIHByaXZhdGUgRGFzaGJvYXJkUmVzb3VyY2UgcGFyc2UoUHJvamVjdENvbnRyb2wgY3RsLCBTdHJpbmcgcmVmLCBTdHJpbmcgcGF0aCwKKyAgICAgIFByb2plY3RDb250cm9sIG15Q3RsKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sCisgICAgICAgICAgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGlkID0gcmVmICsgIjoiICsgcGF0aDsKKyAgICBpZiAoIXJlZi5zdGFydHNXaXRoKFJFRlNfREFTSEJPQVJEUykpIHsKKyAgICAgIHJlZiA9IFJFRlNfREFTSEJPQVJEUyArIHJlZjsKKyAgICB9CisgICAgaWYgKCFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKHJlZikKKyAgICAgICAgfHwgIWN0bC5jb250cm9sRm9yUmVmKHJlZikuY2FuUmVhZCgpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorCisgICAgUmVwb3NpdG9yeSBnaXQ7CisgICAgdHJ5IHsKKyAgICAgIGdpdCA9IGdpdE1hbmFnZXIub3BlblJlcG9zaXRvcnkoY3RsLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihpZCk7CisgICAgfQorICAgIHRyeSB7CisgICAgICBPYmplY3RJZCBvYmpJZCA9IGdpdC5yZXNvbHZlKHJlZiArICI6IiArIHBhdGgpOworICAgICAgaWYgKG9iaklkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oaWQpOworICAgICAgfQorICAgICAgQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcobnVsbCwgZ2l0LCBvYmpJZCk7CisgICAgICByZXR1cm4gbmV3IERhc2hib2FyZFJlc291cmNlKG15Q3RsLCByZWYsIHBhdGgsIGNmZywgZmFsc2UpOworICAgIH0gZmluYWxseSB7CisgICAgICBnaXQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIER5bmFtaWNNYXA8UmVzdFZpZXc8RGFzaGJvYXJkUmVzb3VyY2U+PiB2aWV3cygpIHsKKyAgICByZXR1cm4gdmlld3M7CisgIH0KKworICBzdGF0aWMgRGFzaGJvYXJkSW5mbyBwYXJzZShQcm9qZWN0IGRlZmluaW5nUHJvamVjdCwgU3RyaW5nIHJlZk5hbWUsCisgICAgICBTdHJpbmcgcGF0aCwgQ29uZmlnIGNvbmZpZywgU3RyaW5nIHByb2plY3QsIGJvb2xlYW4gc2V0RGVmYXVsdCkKKyAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICBEYXNoYm9hcmRJbmZvIGluZm8gPSBuZXcgRGFzaGJvYXJkSW5mbyhyZWZOYW1lLCBwYXRoKTsKKyAgICBpbmZvLnByb2plY3QgPSBwcm9qZWN0OworICAgIGluZm8uZGVmaW5pbmdQcm9qZWN0ID0gZGVmaW5pbmdQcm9qZWN0LmdldE5hbWUoKTsKKyAgICBpbmZvLnRpdGxlID0gcmVwbGFjZShwcm9qZWN0LCBjb25maWcuZ2V0U3RyaW5nKCJkYXNoYm9hcmQiLCBudWxsLCAidGl0bGUiKSk7CisgICAgaW5mby5kZXNjcmlwdGlvbiA9IHJlcGxhY2UocHJvamVjdCwgY29uZmlnLmdldFN0cmluZygiZGFzaGJvYXJkIiwgbnVsbCwgImRlc2NyaXB0aW9uIikpOworICAgIGluZm8uZm9yZWFjaCA9IGNvbmZpZy5nZXRTdHJpbmcoImRhc2hib2FyZCIsIG51bGwsICJmb3JlYWNoIik7CisKKyAgICBpZiAoc2V0RGVmYXVsdCkgeworICAgICAgU3RyaW5nIGlkID0gcmVmTmFtZSArICI6IiArIHBhdGg7CisgICAgICBpbmZvLmlzRGVmYXVsdCA9IGlkLmVxdWFscyhkZWZhdWx0T2YoZGVmaW5pbmdQcm9qZWN0KSkgPyB0cnVlIDogbnVsbDsKKyAgICB9CisKKyAgICBVcmxFbmNvZGVkIHUgPSBuZXcgVXJsRW5jb2RlZCgiL2Rhc2hib2FyZC8iKTsKKyAgICB1LnB1dCgidGl0bGUiLCBPYmplY3RzLmZpcnN0Tm9uTnVsbChpbmZvLnRpdGxlLCBpbmZvLnBhdGgpKTsKKyAgICBpZiAoaW5mby5mb3JlYWNoICE9IG51bGwpIHsKKyAgICAgIHUucHV0KCJmb3JlYWNoIiwgcmVwbGFjZShwcm9qZWN0LCBpbmZvLmZvcmVhY2gpKTsKKyAgICB9CisgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNvbmZpZy5nZXRTdWJzZWN0aW9ucygic2VjdGlvbiIpKSB7CisgICAgICBTZWN0aW9uIHMgPSBuZXcgU2VjdGlvbigpOworICAgICAgcy5uYW1lID0gbmFtZTsKKyAgICAgIHMucXVlcnkgPSBjb25maWcuZ2V0U3RyaW5nKCJzZWN0aW9uIiwgbmFtZSwgInF1ZXJ5Iik7CisgICAgICB1LnB1dChzLm5hbWUsIHJlcGxhY2UocHJvamVjdCwgcy5xdWVyeSkpOworICAgICAgaW5mby5zZWN0aW9ucy5hZGQocyk7CisgICAgfQorICAgIGluZm8udXJsID0gdS50b1N0cmluZygpLnJlcGxhY2UoIiUzQSIsICI6Iik7CisKKyAgICByZXR1cm4gaW5mbzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXBsYWNlKFN0cmluZyBwcm9qZWN0LCBTdHJpbmcgcXVlcnkpIHsKKyAgICByZXR1cm4gcXVlcnkucmVwbGFjZSgiJHtwcm9qZWN0fSIsIHByb2plY3QpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlZmF1bHRPZihQcm9qZWN0IHByb2opIHsKKyAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdElkID0gT2JqZWN0cy5maXJzdE5vbk51bGwoCisgICAgICAgIHByb2ouZ2V0TG9jYWxEZWZhdWx0RGFzaGJvYXJkKCksCisgICAgICAgIFN0cmluZ3MubnVsbFRvRW1wdHkocHJvai5nZXREZWZhdWx0RGFzaGJvYXJkKCkpKTsKKyAgICBpZiAoZGVmYXVsdElkLnN0YXJ0c1dpdGgoUkVGU19EQVNIQk9BUkRTKSkgeworICAgICAgcmV0dXJuIGRlZmF1bHRJZC5zdWJzdHJpbmcoUkVGU19EQVNIQk9BUkRTLmxlbmd0aCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGRlZmF1bHRJZDsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgRGFzaGJvYXJkSW5mbyB7CisgICAgZmluYWwgU3RyaW5nIGtpbmQgPSAiZ2Vycml0Y29kZXJldmlldyNkYXNoYm9hcmQiOworICAgIFN0cmluZyBpZDsKKyAgICBTdHJpbmcgcHJvamVjdDsKKyAgICBTdHJpbmcgZGVmaW5pbmdQcm9qZWN0OworICAgIFN0cmluZyByZWY7CisgICAgU3RyaW5nIHBhdGg7CisgICAgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgIFN0cmluZyBmb3JlYWNoOworICAgIFN0cmluZyB1cmw7CisKKyAgICBAU2VyaWFsaXplZE5hbWUoImRlZmF1bHQiKQorICAgIEJvb2xlYW4gaXNEZWZhdWx0OworCisgICAgU3RyaW5nIHRpdGxlOworICAgIExpc3Q8U2VjdGlvbj4gc2VjdGlvbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgIERhc2hib2FyZEluZm8oU3RyaW5nIHJlZiwgU3RyaW5nIG5hbWUpCisgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgIHRoaXMucmVmID0gcmVmOworICAgICAgdGhpcy5wYXRoID0gbmFtZTsKKyAgICAgIHRoaXMuaWQgPSBKb2luZXIub24oJzonKS5qb2luKFVybC5lbmNvZGUocmVmKSwgVXJsLmVuY29kZShwYXRoKSk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIFNlY3Rpb24geworICAgIFN0cmluZyBuYW1lOworICAgIFN0cmluZyBxdWVyeTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0RlbGV0ZURhc2hib2FyZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0RlbGV0ZURhc2hib2FyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWU0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvRGVsZXRlRGFzaGJvYXJkLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLk1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkRlbGV0ZURhc2hib2FyZC5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK2NsYXNzIERlbGV0ZURhc2hib2FyZCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PERhc2hib2FyZFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIFN0cmluZyBjb21taXRNZXNzYWdlOworICB9CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTZXREZWZhdWx0RGFzaGJvYXJkPiBkZWZhdWx0U2V0dGVyOworCisgIEBJbmplY3QKKyAgRGVsZXRlRGFzaGJvYXJkKFByb3ZpZGVyPFNldERlZmF1bHREYXNoYm9hcmQ+IGRlZmF1bHRTZXR0ZXIpIHsKKyAgICB0aGlzLmRlZmF1bHRTZXR0ZXIgPSBkZWZhdWx0U2V0dGVyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoRGFzaGJvYXJkUmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sCisgICAgICBFeGNlcHRpb24geworICAgIGlmIChyZXNvdXJjZS5pc1Byb2plY3REZWZhdWx0KCkpIHsKKyAgICAgIFNldERhc2hib2FyZC5JbnB1dCBpbiA9IG5ldyBTZXREYXNoYm9hcmQuSW5wdXQoKTsKKyAgICAgIGluLmNvbW1pdE1lc3NhZ2UgPSBpbnB1dCAhPSBudWxsID8gaW5wdXQuY29tbWl0TWVzc2FnZSA6IG51bGw7CisgICAgICByZXR1cm4gZGVmYXVsdFNldHRlci5nZXQoKS5hcHBseShyZXNvdXJjZSwgaW4pOworICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCBkZWxldGUgb2YgZGFzaGJvYXJkcyBieSBBUEkuCisgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dhcmJhZ2VDb2xsZWN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2FyYmFnZUNvbGxlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQ5MjNlCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dhcmJhZ2VDb2xsZWN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HYXJiYWdlQ29sbGVjdGlvblJlc3VsdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuU3RyZWFtaW5nUmVzcG9uc2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HYXJiYWdlQ29sbGVjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5HYXJiYWdlQ29sbGVjdC5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuUlVOX0dDKQorcHVibGljIGNsYXNzIEdhcmJhZ2VDb2xsZWN0IGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UHJvamVjdFJlc291cmNlLCBJbnB1dD4geworICBwdWJsaWMgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgfQorCisgIHByaXZhdGUgR2FyYmFnZUNvbGxlY3Rpb24uRmFjdG9yeSBnYXJiYWdlQ29sbGVjdGlvbkZhY3Rvcnk7CisKKyAgQEluamVjdAorICBHYXJiYWdlQ29sbGVjdChHYXJiYWdlQ29sbGVjdGlvbi5GYWN0b3J5IGdhcmJhZ2VDb2xsZWN0aW9uRmFjdG9yeSkgeworICAgIHRoaXMuZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5ID0gZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJlYW1pbmdSZXNwb25zZSBhcHBseShmaW5hbCBQcm9qZWN0UmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpIHsKKyAgICByZXR1cm4gbmV3IFN0cmVhbWluZ1Jlc3BvbnNlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICByZXR1cm4gInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOCI7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgc3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcigKKyAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBDaGFyc2V0cy5VVEZfOCkpIHsKKyAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICBwdWJsaWMgdm9pZCBwcmludGxuKCkgeworICAgICAgICAgICAgd3JpdGUoJ1xuJyk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB0cnkgeworICAgICAgICAgIEdhcmJhZ2VDb2xsZWN0aW9uUmVzdWx0IHJlc3VsdCA9IGdhcmJhZ2VDb2xsZWN0aW9uRmFjdG9yeS5jcmVhdGUoKS5ydW4oCisgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocnNyYy5nZXROYW1lS2V5KCkpLCB3cml0ZXIpOworICAgICAgICAgIGlmIChyZXN1bHQuaGFzRXJyb3JzKCkpIHsKKyAgICAgICAgICAgIGZvciAoR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQuRXJyb3IgZSA6IHJlc3VsdC5nZXRFcnJvcnMoKSkgeworICAgICAgICAgICAgICBTdHJpbmcgbXNnOworICAgICAgICAgICAgICBzd2l0Y2ggKGUuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBSRVBPU0lUT1JZX05PVF9GT1VORDoKKyAgICAgICAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogcHJvamVjdCBcIiIgKyBlLmdldFByb2plY3ROYW1lKCkgKyAiXCIgbm90IGZvdW5kIjsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgR0NfQUxSRUFEWV9TQ0hFRFVMRUQ6CisgICAgICAgICAgICAgICAgICBtc2cgPSAiZXJyb3I6IGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgcHJvamVjdCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0UHJvamVjdE5hbWUoKSArICJcIiB3YXMgYWxyZWFkeSBzY2hlZHVsZWQiOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBHQ19GQUlMRUQ6CisgICAgICAgICAgICAgICAgICBtc2cgPSAiZXJyb3I6IGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgcHJvamVjdCBcIiIgKyBlLmdldFByb2plY3ROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICArICJcIiBmYWlsZWQiOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBwcm9qZWN0IFwiIiArIGUuZ2V0UHJvamVjdE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGZhaWxlZDogIiArIGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldERhc2hib2FyZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldERhc2hib2FyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDYxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0RGFzaGJvYXJkLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRlNfREFTSEJPQVJEUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5EYXNoYm9hcmRzQ29sbGVjdGlvbi5EYXNoYm9hcmRJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2NsYXNzIEdldERhc2hib2FyZCBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxEYXNoYm9hcmRSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIERhc2hib2FyZHNDb2xsZWN0aW9uIGRhc2hib2FyZHM7CisKKyAgQE9wdGlvbihuYW1lID0gIi0taW5oZXJpdGVkIiwgdXNhZ2UgPSAiaW5jbHVkZSBpbmhlcml0ZWQgZGFzaGJvYXJkcyIpCisgIHByaXZhdGUgYm9vbGVhbiBpbmhlcml0ZWQ7CisKKyAgQEluamVjdAorICBHZXREYXNoYm9hcmQoRGFzaGJvYXJkc0NvbGxlY3Rpb24gZGFzaGJvYXJkcykgeworICAgIHRoaXMuZGFzaGJvYXJkcyA9IGRhc2hib2FyZHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIERhc2hib2FyZEluZm8gYXBwbHkoRGFzaGJvYXJkUmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworICAgIGlmIChpbmhlcml0ZWQgJiYgIXJlc291cmNlLmlzUHJvamVjdERlZmF1bHQoKSkgeworICAgICAgLy8gaW5oZXJpdGVkIGZsYWcgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGRlZmF1bHQuCisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigiaW5oZXJpdGVkIik7CisgICAgfQorCisgICAgU3RyaW5nIHByb2plY3QgPSByZXNvdXJjZS5nZXRDb250cm9sKCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKKyAgICBpZiAocmVzb3VyY2UuaXNQcm9qZWN0RGVmYXVsdCgpKSB7CisgICAgICAvLyBUaGUgZGVmYXVsdCBpcyBub3QgcmVzb2x2ZWQgdG8gYSBkZWZpbml0aW9uIHlldC4KKyAgICAgIHJlc291cmNlID0gZGVmYXVsdE9mKHJlc291cmNlLmdldENvbnRyb2woKSk7CisgICAgfQorCisgICAgcmV0dXJuIERhc2hib2FyZHNDb2xsZWN0aW9uLnBhcnNlKAorICAgICAgICByZXNvdXJjZS5nZXRDb250cm9sKCkuZ2V0UHJvamVjdCgpLAorICAgICAgICByZXNvdXJjZS5nZXRSZWZOYW1lKCkuc3Vic3RyaW5nKFJFRlNfREFTSEJPQVJEUy5sZW5ndGgoKSksCisgICAgICAgIHJlc291cmNlLmdldFBhdGhOYW1lKCksCisgICAgICAgIHJlc291cmNlLmdldENvbmZpZygpLAorICAgICAgICBwcm9qZWN0LAorICAgICAgICB0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgRGFzaGJvYXJkUmVzb3VyY2UgZGVmYXVsdE9mKFByb2plY3RDb250cm9sIGN0bCkKKyAgICAgIHRocm93cyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisgICAgU3RyaW5nIGlkID0gY3RsLmdldFByb2plY3QoKS5nZXRMb2NhbERlZmF1bHREYXNoYm9hcmQoKTsKKyAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KGlkKSkgeworICAgICAgaWQgPSBjdGwuZ2V0UHJvamVjdCgpLmdldERlZmF1bHREYXNoYm9hcmQoKTsKKyAgICB9CisgICAgaWYgKCJkZWZhdWx0Ii5lcXVhbHMoaWQpKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgIH0gZWxzZSBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShpZCkpIHsKKyAgICAgIHJldHVybiBwYXJzZShjdGwsIGlkKTsKKyAgICB9IGVsc2UgaWYgKCFpbmhlcml0ZWQpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgZm9yIChQcm9qZWN0U3RhdGUgcHMgOiBjdGwuZ2V0UHJvamVjdFN0YXRlKCkudHJlZSgpKSB7CisgICAgICBpZCA9IHBzLmdldFByb2plY3QoKS5nZXREZWZhdWx0RGFzaGJvYXJkKCk7CisgICAgICBpZiAoImRlZmF1bHQiLmVxdWFscyhpZCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgIH0gZWxzZSBpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShpZCkpIHsKKyAgICAgICAgY3RsID0gcHMuY29udHJvbEZvcihjdGwuZ2V0Q3VycmVudFVzZXIoKSk7CisgICAgICAgIHJldHVybiBwYXJzZShjdGwsIGlkKTsKKyAgICAgIH0KKyAgICB9CisgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgfQorCisgIHByaXZhdGUgRGFzaGJvYXJkUmVzb3VyY2UgcGFyc2UoUHJvamVjdENvbnRyb2wgY3RsLCBTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworICAgIExpc3Q8U3RyaW5nPiBwID0gTGlzdHMubmV3QXJyYXlMaXN0KFNwbGl0dGVyLm9uKCc6JykubGltaXQoMikuc3BsaXQoaWQpKTsKKyAgICBTdHJpbmcgcmVmID0gVXJsLmVuY29kZShwLmdldCgwKSk7CisgICAgU3RyaW5nIHBhdGggPSBVcmwuZW5jb2RlKHAuZ2V0KDEpKTsKKyAgICByZXR1cm4gZGFzaGJvYXJkcy5wYXJzZSgKKyAgICAgICAgbmV3IFByb2plY3RSZXNvdXJjZShjdGwpLAorICAgICAgICBJZFN0cmluZy5mcm9tVXJsKHJlZiArICc6JyArIHBhdGgpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldERlc2NyaXB0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0RGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGZhYmFiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldERlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CisKK2NsYXNzIEdldERlc2NyaXB0aW9uIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFByb2plY3RSZXNvdXJjZT4geworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQcm9qZWN0UmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICBQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRDb250cm9sKCkuZ2V0UHJvamVjdCgpOworICAgIHJldHVybiBTdHJpbmdzLm51bGxUb0VtcHR5KHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRIZWFkLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0SGVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzlmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0SGVhZC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmF1dGguQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgR2V0SGVhZCBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxQcm9qZWN0UmVzb3VyY2U+IHsKKworICBwcml2YXRlIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOworCisgIEBJbmplY3QKKyAgR2V0SGVhZChHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcikgeworICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGFwcGx5KFByb2plY3RSZXNvdXJjZSByc3JjKSB0aHJvd3MgQXV0aEV4Y2VwdGlvbiwKKyAgICAgIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBudWxsOworICAgIHRyeSB7CisgICAgICByZXBvID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkocnNyYy5nZXROYW1lS2V5KCkpOworICAgICAgUmVmIGhlYWQgPSByZXBvLmdldFJlZihDb25zdGFudHMuSEVBRCk7CisgICAgICBpZiAoaGVhZCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKENvbnN0YW50cy5IRUFEKTsKKyAgICAgIH0gZWxzZSBpZiAoaGVhZC5pc1N5bWJvbGljKCkpIHsKKyAgICAgICAgU3RyaW5nIG4gPSBoZWFkLmdldFRhcmdldCgpLmdldE5hbWUoKTsKKyAgICAgICAgaWYgKHJzcmMuZ2V0Q29udHJvbCgpLmNvbnRyb2xGb3JSZWYobikuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigpOworICAgICAgfSBlbHNlIGlmIChoZWFkLmdldE9iamVjdElkKCkgIT0gbnVsbCkgeworICAgICAgICBpZiAocnNyYy5nZXRDb250cm9sKCkuaXNPd25lcigpKSB7CisgICAgICAgICAgcmV0dXJuIGhlYWQuZ2V0T2JqZWN0SWQoKS5uYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKENvbnN0YW50cy5IRUFEKTsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24ocnNyYy5nZXROYW1lKCkpOworICAgIH0gZmluYWxseSB7CisgICAgICBpZiAocmVwbyAhPSBudWxsKSB7CisgICAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRQYXJlbnQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRQYXJlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2ViZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldFBhcmVudC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitjbGFzcyBHZXRQYXJlbnQgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UHJvamVjdFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZTsKKworICBASW5qZWN0CisgIEdldFBhcmVudChBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lKSB7CisgICAgdGhpcy5hbGxQcm9qZWN0c05hbWUgPSBhbGxQcm9qZWN0c05hbWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQcm9qZWN0UmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICBQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRDb250cm9sKCkuZ2V0UHJvamVjdCgpOworICAgIFByb2plY3QuTmFtZUtleSBwYXJlbnROYW1lID0gcHJvamVjdC5nZXRQYXJlbnQoYWxsUHJvamVjdHNOYW1lKTsKKyAgICByZXR1cm4gcGFyZW50TmFtZSAhPSBudWxsID8gcGFyZW50TmFtZS5nZXQoKSA6ICIiOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0UHJvamVjdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldFByb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDgyMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0dldFByb2plY3QuamF2YQpAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdFJlYWRWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworY2xhc3MgR2V0UHJvamVjdCBpbXBsZW1lbnRzIFJlc3RSZWFkVmlldzxQcm9qZWN0UmVzb3VyY2U+IHsKKworICBwcml2YXRlIGZpbmFsIFByb2plY3RKc29uIGpzb247CisKKyAgQEluamVjdAorICBHZXRQcm9qZWN0KFByb2plY3RKc29uIGpzb24pIHsKKyAgICB0aGlzLmpzb24gPSBqc29uOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUHJvamVjdFJlc291cmNlIHJzcmMpIHsKKyAgICByZXR1cm4ganNvbi5mb3JtYXQocnNyYyk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9HZXRTdGF0aXN0aWNzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0U3RhdGlzdGljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OGI4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvR2V0U3RhdGlzdGljcy5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLkdhcmJhZ2VDb2xsZWN0Q29tbWFuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkdpdEFQSUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuSkdpdEludGVybmFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuUlVOX0dDKQorcHVibGljIGNsYXNzIEdldFN0YXRpc3RpY3MgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UHJvamVjdFJlc291cmNlPiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKKworICBASW5qZWN0CisgIEdldFN0YXRpc3RpY3MoR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXIpIHsKKyAgICB0aGlzLnJlcG9NYW5hZ2VyID0gcmVwb01hbmFnZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFJlcG9zaXRvcnlTdGF0aXN0aWNzIGFwcGx5KFByb2plY3RSZXNvdXJjZSByc3JjKQorICAgICAgdGhyb3dzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBSZXBvc2l0b3J5IHJlcG8gPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShyc3JjLmdldE5hbWVLZXkoKSk7CisgICAgICB0cnkgeworICAgICAgICBHYXJiYWdlQ29sbGVjdENvbW1hbmQgZ2MgPSBHaXQud3JhcChyZXBvKS5nYygpOworICAgICAgICByZXR1cm4gbmV3IFJlcG9zaXRvcnlTdGF0aXN0aWNzKGdjLmdldFN0YXRpc3RpY3MoKSk7CisgICAgICB9IGNhdGNoIChHaXRBUElFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9IGNhdGNoIChKR2l0SW50ZXJuYWxFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICB9IGZpbmFsbHkgeworICAgICAgICByZXBvLmNsb3NlKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24ocnNyYy5nZXROYW1lKCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0xpc3REYXNoYm9hcmRzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTGlzdERhc2hib2FyZHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDYzNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0xpc3REYXNoYm9hcmRzLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRlNfREFTSEJPQVJEUzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkRhc2hib2FyZHNDb2xsZWN0aW9uLkRhc2hib2FyZEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29uZmlnSW52YWxpZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQmxvYkJhc2VkQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworY2xhc3MgTGlzdERhc2hib2FyZHMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8UHJvamVjdFJlc291cmNlPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEYXNoYm9hcmRzQ29sbGVjdGlvbi5jbGFzcyk7CisKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNYW5hZ2VyOworCisgIEBPcHRpb24obmFtZSA9ICItLWluaGVyaXRlZCIsIHVzYWdlID0gImluY2x1ZGUgaW5oZXJpdGVkIGRhc2hib2FyZHMiKQorICBwcml2YXRlIGJvb2xlYW4gaW5oZXJpdGVkOworCisgIEBJbmplY3QKKyAgTGlzdERhc2hib2FyZHMoR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWFuYWdlcikgeworICAgIHRoaXMuZ2l0TWFuYWdlciA9IGdpdE1hbmFnZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQcm9qZWN0UmVzb3VyY2UgcmVzb3VyY2UpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFByb2plY3RDb250cm9sIGN0bCA9IHJlc291cmNlLmdldENvbnRyb2woKTsKKyAgICBTdHJpbmcgcHJvamVjdCA9IGN0bC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOworICAgIGlmICghaW5oZXJpdGVkKSB7CisgICAgICByZXR1cm4gc2NhbihyZXNvdXJjZS5nZXRDb250cm9sKCksIHByb2plY3QsIHRydWUpOworICAgIH0KKworICAgIExpc3Q8TGlzdDxEYXNoYm9hcmRJbmZvPj4gYWxsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgYm9vbGVhbiBzZXREZWZhdWx0ID0gdHJ1ZTsKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBwcyA6IGN0bC5nZXRQcm9qZWN0U3RhdGUoKS50cmVlKCkpIHsKKyAgICAgIGN0bCA9IHBzLmNvbnRyb2xGb3IoY3RsLmdldEN1cnJlbnRVc2VyKCkpOworICAgICAgaWYgKGN0bC5pc1Zpc2libGUoKSkgeworICAgICAgICBMaXN0PERhc2hib2FyZEluZm8+IGxpc3QgPSBzY2FuKGN0bCwgcHJvamVjdCwgc2V0RGVmYXVsdCk7CisgICAgICAgIGZvciAoRGFzaGJvYXJkSW5mbyBkIDogbGlzdCkgeworICAgICAgICAgIGlmIChkLmlzRGVmYXVsdCAhPSBudWxsICYmIEJvb2xlYW4uVFJVRS5lcXVhbHMoZC5pc0RlZmF1bHQpKSB7CisgICAgICAgICAgICBzZXREZWZhdWx0ID0gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICBhbGwuYWRkKGxpc3QpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBhbGw7CisgIH0KKworICBwcml2YXRlIExpc3Q8RGFzaGJvYXJkSW5mbz4gc2NhbihQcm9qZWN0Q29udHJvbCBjdGwsIFN0cmluZyBwcm9qZWN0LAorICAgICAgYm9vbGVhbiBzZXREZWZhdWx0KSB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIFJlcG9zaXRvcnkgZ2l0OworICAgIHRyeSB7CisgICAgICBnaXQgPSBnaXRNYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KGN0bC5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICB9CisgICAgdHJ5IHsKKyAgICAgIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhnaXQpOworICAgICAgdHJ5IHsKKyAgICAgICAgTGlzdDxEYXNoYm9hcmRJbmZvPiBhbGwgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgZm9yIChSZWYgcmVmIDogZ2l0LmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhSRUZTX0RBU0hCT0FSRFMpLnZhbHVlcygpKSB7CisgICAgICAgICAgaWYgKGN0bC5jb250cm9sRm9yUmVmKHJlZi5nZXROYW1lKCkpLmNhblJlYWQoKSkgeworICAgICAgICAgICAgYWxsLmFkZEFsbChzY2FuRGFzaGJvYXJkcyhjdGwuZ2V0UHJvamVjdCgpLCBnaXQsIHJ3LCByZWYsCisgICAgICAgICAgICAgICAgcHJvamVjdCwgc2V0RGVmYXVsdCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgcncucmVsZWFzZSgpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBnaXQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIExpc3Q8RGFzaGJvYXJkSW5mbz4gc2NhbkRhc2hib2FyZHMoUHJvamVjdCBkZWZpbmluZ1Byb2plY3QsCisgICAgICBSZXBvc2l0b3J5IGdpdCwgUmV2V2FsayBydywgUmVmIHJlZiwgU3RyaW5nIHByb2plY3QsIGJvb2xlYW4gc2V0RGVmYXVsdCkKKyAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgTGlzdDxEYXNoYm9hcmRJbmZvPiBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocncuZ2V0T2JqZWN0UmVhZGVyKCkpOworICAgIHRyeSB7CisgICAgICB0dy5hZGRUcmVlKHJ3LnBhcnNlVHJlZShyZWYuZ2V0T2JqZWN0SWQoKSkpOworICAgICAgdHcuc2V0UmVjdXJzaXZlKHRydWUpOworICAgICAgd2hpbGUgKHR3Lm5leHQoKSkgeworICAgICAgICBpZiAodHcuZ2V0RmlsZU1vZGUoMCkgPT0gRmlsZU1vZGUuUkVHVUxBUl9GSUxFKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxpc3QuYWRkKERhc2hib2FyZHNDb2xsZWN0aW9uLnBhcnNlKAorICAgICAgICAgICAgICAgIGRlZmluaW5nUHJvamVjdCwKKyAgICAgICAgICAgICAgICByZWYuZ2V0TmFtZSgpLnN1YnN0cmluZyhSRUZTX0RBU0hCT0FSRFMubGVuZ3RoKCkpLAorICAgICAgICAgICAgICAgIHR3LmdldFBhdGhTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBuZXcgQmxvYkJhc2VkQ29uZmlnKG51bGwsIGdpdCwgdHcuZ2V0T2JqZWN0SWQoMCkpLAorICAgICAgICAgICAgICAgIHByb2plY3QsCisgICAgICAgICAgICAgICAgc2V0RGVmYXVsdCkpOworICAgICAgICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbG9nLndhcm4oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHBhcnNlIGRhc2hib2FyZCAlczolczolczogJXMiLAorICAgICAgICAgICAgICAgIGRlZmluaW5nUHJvamVjdC5nZXROYW1lKCksIHJlZi5nZXROYW1lKCksIHR3LmdldFBhdGhTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICB0dy5yZWxlYXNlKCk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTGlzdFByb2plY3RzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTGlzdFByb2plY3RzLmphdmEKaW5kZXggZTVhMTFjYS4uNTliNTQ0YSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L0xpc3RQcm9qZWN0cy5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9MaXN0UHJvamVjdHMuamF2YQpAQCAtMTQsMTMgKzE0LDI1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5Ob1N1Y2hHcm91cEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmluYXJ5UmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVhZFZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5OYW1lS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuT3V0cHV0Rm9ybWF0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5TdHJpbmdVdGlsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdEpzb24uUHJvamVjdEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuVHJlZUZvcm1hdHRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24ucmVmbGVjdC5UeXBlVG9rZW47CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMzQsNiArNDYsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwpAQCAtNDIsNiArNTUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKQEAgLTQ5LDcgKzYzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIAogLyoqIExpc3QgcHJvamVjdHMgdmlzaWJsZSB0byB0aGUgY2FsbGluZyB1c2VyLiAqLwotcHVibGljIGNsYXNzIExpc3RQcm9qZWN0cyB7CitwdWJsaWMgY2xhc3MgTGlzdFByb2plY3RzIGltcGxlbWVudHMgUmVzdFJlYWRWaWV3PFRvcExldmVsUmVzb3VyY2U+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpc3RQcm9qZWN0cy5jbGFzcyk7CiAKICAgcHVibGljIHN0YXRpYyBlbnVtIEZpbHRlclR5cGUgewpAQCAtODYsNDEgKzEwMCw4MiBAQAogCiAgIHByaXZhdGUgZmluYWwgQ3VycmVudFVzZXIgY3VycmVudFVzZXI7CiAgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGU7CisgIHByaXZhdGUgZmluYWwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlcjsKICAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Tm9kZS5GYWN0b3J5IHByb2plY3ROb2RlRmFjdG9yeTsKIAotICBAT3B0aW9uKG5hbWUgPSAiLS1mb3JtYXQiLCBtZXRhVmFyID0gIkZNVCIsIHVzYWdlID0gIk91dHB1dCBkaXNwbGF5IGZvcm1hdCIpCisgIEBEZXByZWNhdGVkCisgIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIHVzYWdlID0gIihkZXByZWNhdGVkKSBvdXRwdXQgZm9ybWF0IikKICAgcHJpdmF0ZSBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LlRFWFQ7CiAKICAgQE9wdGlvbihuYW1lID0gIi0tc2hvdy1icmFuY2giLCBhbGlhc2VzID0geyItYiJ9LCBtdWx0aVZhbHVlZCA9IHRydWUsCiAgICAgICB1c2FnZSA9ICJkaXNwbGF5cyB0aGUgc2hhIG9mIGVhY2ggcHJvamVjdCBpbiB0aGUgc3BlY2lmaWVkIGJyYW5jaCIpCi0gIHByaXZhdGUgTGlzdDxTdHJpbmc+IHNob3dCcmFuY2g7CisgIHB1YmxpYyB2b2lkIGFkZFNob3dCcmFuY2goU3RyaW5nIGJyYW5jaCkgeworICAgIHNob3dCcmFuY2guYWRkKGJyYW5jaCk7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS10cmVlIiwgYWxpYXNlcyA9IHsiLXQifSwgdXNhZ2UgPQogICAgICAgImRpc3BsYXlzIHByb2plY3QgaW5oZXJpdGFuY2UgaW4gYSB0cmVlLWxpa2UgZm9ybWF0XG4iCiAgICAgICArICJ0aGlzIG9wdGlvbiBkb2VzIG5vdCB3b3JrIHRvZ2V0aGVyIHdpdGggdGhlIHNob3ctYnJhbmNoIG9wdGlvbiIpCi0gIHByaXZhdGUgYm9vbGVhbiBzaG93VHJlZTsKKyAgcHVibGljIHZvaWQgc2V0U2hvd1RyZWUoYm9vbGVhbiBzaG93VHJlZSkgeworICAgIHRoaXMuc2hvd1RyZWUgPSBzaG93VHJlZTsKKyAgfQogCiAgIEBPcHRpb24obmFtZSA9ICItLXR5cGUiLCB1c2FnZSA9ICJ0eXBlIG9mIHByb2plY3QiKQotICBwcml2YXRlIEZpbHRlclR5cGUgdHlwZSA9IEZpbHRlclR5cGUuQ09ERTsKKyAgcHVibGljIHZvaWQgc2V0RmlsdGVyVHlwZShGaWx0ZXJUeXBlIHR5cGUpIHsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tZGVzY3JpcHRpb24iLCBhbGlhc2VzID0geyItZCJ9LCB1c2FnZSA9ICJpbmNsdWRlIGRlc2NyaXB0aW9uIG9mIHByb2plY3QgaW4gbGlzdCIpCi0gIHByaXZhdGUgYm9vbGVhbiBzaG93RGVzY3JpcHRpb247CisgIHB1YmxpYyB2b2lkIHNldFNob3dEZXNjcmlwdGlvbihib29sZWFuIHNob3dEZXNjcmlwdGlvbikgeworICAgIHRoaXMuc2hvd0Rlc2NyaXB0aW9uID0gc2hvd0Rlc2NyaXB0aW9uOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tYWxsIiwgdXNhZ2UgPSAiZGlzcGxheSBhbGwgcHJvamVjdHMgdGhhdCBhcmUgYWNjZXNzaWJsZSBieSB0aGUgY2FsbGluZyB1c2VyIikKLSAgcHJpdmF0ZSBib29sZWFuIGFsbDsKKyAgcHVibGljIHZvaWQgc2V0QWxsKGJvb2xlYW4gYWxsKSB7CisgICAgdGhpcy5hbGwgPSBhbGw7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1saW1pdCIsIGFsaWFzZXMgPSB7Ii1uIn0sIG1ldGFWYXIgPSAiQ05UIiwgdXNhZ2UgPSAibWF4aW11bSBudW1iZXIgb2YgcHJvamVjdHMgdG8gbGlzdCIpCi0gIHByaXZhdGUgaW50IGxpbWl0OworICBwdWJsaWMgdm9pZCBzZXRMaW1pdChpbnQgbGltaXQpIHsKKyAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgIH0KIAorICBAT3B0aW9uKG5hbWUgPSAiLXAiLCBtZXRhVmFyID0gIlBSRUZJWCIsIHVzYWdlID0gIm1hdGNoIHByb2plY3QgcHJlZml4IikKKyAgcHVibGljIHZvaWQgc2V0TWF0Y2hQcmVmaXgoU3RyaW5nIG1hdGNoUHJlZml4KSB7CisgICAgdGhpcy5tYXRjaFByZWZpeCA9IG1hdGNoUHJlZml4OworICB9CisKKyAgQE9wdGlvbihuYW1lID0gIi1tIiwgbWV0YVZhciA9ICJNQVRDSCIsIHVzYWdlID0gIm1hdGNoIHByb2plY3Qgc3Vic3RyaW5nIikKKyAgcHVibGljIHZvaWQgc2V0TWF0Y2hTdWJzdHJpbmcoU3RyaW5nIG1hdGNoU3Vic3RyaW5nKSB7CisgICAgdGhpcy5tYXRjaFN1YnN0cmluZyA9IG1hdGNoU3Vic3RyaW5nOworICB9CisKKyAgQE9wdGlvbihuYW1lID0gIi0taGFzLWFjbC1mb3IiLCBtZXRhVmFyID0gIkdST1VQIiwgdXNhZ2UgPQorICAgICAgImRpc3BsYXlzIG9ubHkgcHJvamVjdHMgb24gd2hpY2ggYWNjZXNzIHJpZ2h0cyBmb3IgdGhpcyBncm91cCBhcmUgZGlyZWN0bHkgYXNzaWduZWQiKQorICBwdWJsaWMgdm9pZCBzZXRHcm91cFV1aWQoQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVdWlkKSB7CisgICAgdGhpcy5ncm91cFV1aWQgPSBncm91cFV1aWQ7CisgIH0KKworICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBzaG93QnJhbmNoID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgIHByaXZhdGUgYm9vbGVhbiBzaG93VHJlZTsKKyAgcHJpdmF0ZSBGaWx0ZXJUeXBlIHR5cGUgPSBGaWx0ZXJUeXBlLkNPREU7CisgIHByaXZhdGUgYm9vbGVhbiBzaG93RGVzY3JpcHRpb247CisgIHByaXZhdGUgYm9vbGVhbiBhbGw7CisgIHByaXZhdGUgaW50IGxpbWl0OwogICBwcml2YXRlIFN0cmluZyBtYXRjaFByZWZpeDsKKyAgcHJpdmF0ZSBTdHJpbmcgbWF0Y2hTdWJzdHJpbmc7CisgIHByaXZhdGUgQWNjb3VudEdyb3VwLlVVSUQgZ3JvdXBVdWlkOwogCiAgIEBJbmplY3QKICAgcHJvdGVjdGVkIExpc3RQcm9qZWN0cyhDdXJyZW50VXNlciBjdXJyZW50VXNlciwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZSwKLSAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLAotICAgICAgUHJvamVjdE5vZGUuRmFjdG9yeSBwcm9qZWN0Tm9kZUZhY3RvcnkpIHsKKyAgICAgIEdyb3VwQ2FjaGUgZ3JvdXBDYWNoZSwgR3JvdXBDb250cm9sLkZhY3RvcnkgZ3JvdXBDb250cm9sRmFjdG9yeSwKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLCBQcm9qZWN0Tm9kZS5GYWN0b3J5IHByb2plY3ROb2RlRmFjdG9yeSkgewogICAgIHRoaXMuY3VycmVudFVzZXIgPSBjdXJyZW50VXNlcjsKICAgICB0aGlzLnByb2plY3RDYWNoZSA9IHByb2plY3RDYWNoZTsKKyAgICB0aGlzLmdyb3VwQ2FjaGUgPSBncm91cENhY2hlOworICAgIHRoaXMuZ3JvdXBDb250cm9sRmFjdG9yeSA9IGdyb3VwQ29udHJvbEZhY3Rvcnk7CiAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwogICAgIHRoaXMucHJvamVjdE5vZGVGYWN0b3J5ID0gcHJvamVjdE5vZGVGYWN0b3J5OwogICB9CkBAIC0xNDIsMjIgKzE5NywzNiBAQAogICB9CiAKICAgcHVibGljIExpc3RQcm9qZWN0cyBzZXRGb3JtYXQoT3V0cHV0Rm9ybWF0IGZtdCkgewotICAgIHRoaXMuZm9ybWF0ID0gZm10OworICAgIGZvcm1hdCA9IGZtdDsKICAgICByZXR1cm4gdGhpczsKICAgfQogCi0gIHB1YmxpYyBMaXN0UHJvamVjdHMgc2V0TWF0Y2hQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotICAgIHRoaXMubWF0Y2hQcmVmaXggPSBwcmVmaXg7Ci0gICAgcmV0dXJuIHRoaXM7CisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KFRvcExldmVsUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICBpZiAoZm9ybWF0ID09IE91dHB1dEZvcm1hdC5URVhUKSB7CisgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgZGlzcGxheShidWYpOworICAgICAgcmV0dXJuIEJpbmFyeVJlc3VsdC5jcmVhdGUoYnVmLnRvQnl0ZUFycmF5KCkpCisgICAgICAgICAgLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAuc2V0Q2hhcmFjdGVyRW5jb2RpbmcoIlVURi04Iik7CisgICAgfQorICAgIHJldHVybiBhcHBseSgpOwogICB9CiAKLSAgcHVibGljIHZvaWQgZGlzcGxheShPdXRwdXRTdHJlYW0gb3V0KSB7Ci0gICAgZmluYWwgUHJpbnRXcml0ZXIgc3Rkb3V0OwotICAgIHRyeSB7Ci0gICAgICBzdGRvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGLTgiKSkpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgLy8gT3VyIGVuY29kaW5nIGlzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIHJ1bnRpbWUuCi0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSlZNIGxhY2tzIFVURi04IGVuY29kaW5nIiwgZSk7CisgIHB1YmxpYyBNYXA8U3RyaW5nLCBQcm9qZWN0SW5mbz4gYXBwbHkoKSB7CisgICAgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LkpTT047CisgICAgcmV0dXJuIGRpc3BsYXkobnVsbCk7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZywgUHJvamVjdEluZm8+IGRpc3BsYXkoT3V0cHV0U3RyZWFtIGRpc3BsYXlPdXRwdXRTdHJlYW0pIHsKKyAgICBQcmludFdyaXRlciBzdGRvdXQgPSBudWxsOworICAgIGlmIChkaXNwbGF5T3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0ZG91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIoCisgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGRpc3BsYXlPdXRwdXRTdHJlYW0sICJVVEYtOCIpKSk7CisgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkpWTSBsYWNrcyBVVEYtOCBlbmNvZGluZyIsIGUpOworICAgICAgfQogICAgIH0KIAogICAgIGludCBmb3VuZCA9IDA7CkBAIC0xNzUsMTYgKzI0NCwzMyBAQAogICAgICAgICAgIC8vCiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQcm9qZWN0Q29udHJvbCBwY3RsID0gZS5jb250cm9sRm9yKGN1cnJlbnRVc2VyKTsKKyAgICAgICAgaWYgKGdyb3VwVXVpZCAhPSBudWxsKSB7CisgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghZ3JvdXBDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGdyb3VwVXVpZCkuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoR3JvdXBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXBjdGwuZ2V0TG9jYWxHcm91cHMoKS5jb250YWlucygKKyAgICAgICAgICAgICAgR3JvdXBSZWZlcmVuY2UuZm9yR3JvdXAoZ3JvdXBDYWNoZS5nZXQoZ3JvdXBVdWlkKSkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBQcm9qZWN0SW5mbyBpbmZvID0gbmV3IFByb2plY3RJbmZvKCk7CiAgICAgICAgIGlmICh0eXBlID09IEZpbHRlclR5cGUuUEFSRU5UX0NBTkRJREFURVMpIHsKLSAgICAgICAgICBQcm9qZWN0U3RhdGUgcGFyZW50U3RhdGUgPSBlLmdldFBhcmVudFN0YXRlKCk7CisgICAgICAgICAgUHJvamVjdFN0YXRlIHBhcmVudFN0YXRlID0gSXRlcmFibGVzLmdldEZpcnN0KGUucGFyZW50cygpLCBudWxsKTsKICAgICAgICAgICBpZiAocGFyZW50U3RhdGUgIT0gbnVsbAogICAgICAgICAgICAgICAmJiAhb3V0cHV0LmtleVNldCgpLmNvbnRhaW5zKHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCkpCiAgICAgICAgICAgICAgICYmICFyZWplY3RlZC5jb250YWlucyhwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgUHJvamVjdENvbnRyb2wgcGFyZW50Q3RybCA9IHBhcmVudFN0YXRlLmNvbnRyb2xGb3IoY3VycmVudFVzZXIpOwogICAgICAgICAgICAgaWYgKHBhcmVudEN0cmwuaXNWaXNpYmxlKCkgfHwgcGFyZW50Q3RybC5pc093bmVyKCkpIHsKICAgICAgICAgICAgICAgaW5mby5uYW1lID0gcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgaW5mby5kZXNjcmlwdGlvbiA9IHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgICAgICBpbmZvLmRlc2NyaXB0aW9uID0gU3RyaW5ncy5lbXB0eVRvTnVsbCgKKyAgICAgICAgICAgICAgICAgIHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIHJlamVjdGVkLmFkZChwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xOTQsNyArMjgwLDYgQEAKICAgICAgICAgICB9CiAKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaW5hbCBQcm9qZWN0Q29udHJvbCBwY3RsID0gZS5jb250cm9sRm9yKGN1cnJlbnRVc2VyKTsKICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzVmlzaWJsZSA9IHBjdGwuaXNWaXNpYmxlKCkgfHwgKGFsbCAmJiBwY3RsLmlzT3duZXIoKSk7CiAgICAgICAgICAgaWYgKHNob3dUcmVlICYmICFmb3JtYXQuaXNKc29uKCkpIHsKICAgICAgICAgICAgIHRyZWVNYXAucHV0KHByb2plY3ROYW1lLApAQCAtMjEwLDcgKzI5NSw3IEBACiAKICAgICAgICAgICBpbmZvLm5hbWUgPSBwcm9qZWN0TmFtZS5nZXQoKTsKICAgICAgICAgICBpZiAoc2hvd1RyZWUgJiYgZm9ybWF0LmlzSnNvbigpKSB7Ci0gICAgICAgICAgICBQcm9qZWN0U3RhdGUgcGFyZW50ID0gZS5nZXRQYXJlbnRTdGF0ZSgpOworICAgICAgICAgICAgUHJvamVjdFN0YXRlIHBhcmVudCA9IEl0ZXJhYmxlcy5nZXRGaXJzdChlLnBhcmVudHMoKSwgbnVsbCk7CiAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgUHJvamVjdENvbnRyb2wgcGFyZW50Q3RybCA9IHBhcmVudC5jb250cm9sRm9yKGN1cnJlbnRVc2VyKTsKICAgICAgICAgICAgICAgaWYgKHBhcmVudEN0cmwuaXNWaXNpYmxlKCkgfHwgcGFyZW50Q3RybC5pc093bmVyKCkpIHsKQEAgLTIyNCwxMiArMzA5LDEyIEBACiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHNob3dEZXNjcmlwdGlvbiAmJiAhZS5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGluZm8uZGVzY3JpcHRpb24gPSBlLmdldFByb2plY3QoKS5nZXREZXNjcmlwdGlvbigpOworICAgICAgICAgIGlmIChzaG93RGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIGluZm8uZGVzY3JpcHRpb24gPSBTdHJpbmdzLmVtcHR5VG9OdWxsKGUuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCkpOwogICAgICAgICAgIH0KIAogICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2hvd0JyYW5jaCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIXNob3dCcmFuY2guaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgIFJlcG9zaXRvcnkgZ2l0ID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkocHJvamVjdE5hbWUpOwogICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmICghdHlwZS5tYXRjaGVzKGdpdCkpIHsKQEAgLTI3NywxMiArMzYyLDEyIEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZm9ybWF0LmlzSnNvbigpKSB7CisgICAgICAgIGlmIChzdGRvdXQgPT0gbnVsbCB8fCBmb3JtYXQuaXNKc29uKCkpIHsKICAgICAgICAgICBvdXRwdXQucHV0KGluZm8ubmFtZSwgaW5mbyk7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc2hvd0JyYW5jaCAhPSBudWxsKSB7CisgICAgICAgIGlmICghc2hvd0JyYW5jaC5pc0VtcHR5KCkpIHsKICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogc2hvd0JyYW5jaCkgewogICAgICAgICAgICAgU3RyaW5nIHJlZiA9IGluZm8uYnJhbmNoZXMgIT0gbnVsbCA/IGluZm8uYnJhbmNoZXMuZ2V0KG5hbWUpIDogbnVsbDsKICAgICAgICAgICAgIGlmIChyZWYgPT0gbnVsbCkgewpAQCAtMzAyLDIxICszODcsMzggQEAKICAgICAgICAgc3Rkb3V0LnByaW50KCdcbicpOwogICAgICAgfQogCi0gICAgICBpZiAoZm9ybWF0LmlzSnNvbigpKSB7CisgICAgICBmb3IgKFByb2plY3RJbmZvIGluZm8gOiBvdXRwdXQudmFsdWVzKCkpIHsKKyAgICAgICAgaW5mby5maW5pc2goKTsKKyAgICAgICAgaW5mby5uYW1lID0gbnVsbDsKKyAgICAgIH0KKyAgICAgIGlmIChzdGRvdXQgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgfSBlbHNlIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKICAgICAgICAgZm9ybWF0Lm5ld0dzb24oKS50b0pzb24oCiAgICAgICAgICAgICBvdXRwdXQsIG5ldyBUeXBlVG9rZW48TWFwPFN0cmluZywgUHJvamVjdEluZm8+PigpIHt9LmdldFR5cGUoKSwgc3Rkb3V0KTsKICAgICAgICAgc3Rkb3V0LnByaW50KCdcbicpOwogICAgICAgfSBlbHNlIGlmIChzaG93VHJlZSAmJiB0cmVlTWFwLnNpemUoKSA+IDApIHsKICAgICAgICAgcHJpbnRQcm9qZWN0VHJlZShzdGRvdXQsIHRyZWVNYXApOwogICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CiAgICAgfSBmaW5hbGx5IHsKLSAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgaWYgKHN0ZG91dCAhPSBudWxsKSB7CisgICAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgfQogICAgIH0KICAgfQogCi0gIHByaXZhdGUgSXRlcmFibGU8TmFtZUtleT4gc2NhbigpIHsKKyAgcHJpdmF0ZSBJdGVyYWJsZTxQcm9qZWN0Lk5hbWVLZXk+IHNjYW4oKSB7CiAgICAgaWYgKG1hdGNoUHJlZml4ICE9IG51bGwpIHsKICAgICAgIHJldHVybiBwcm9qZWN0Q2FjaGUuYnlOYW1lKG1hdGNoUHJlZml4KTsKKyAgICB9IGVsc2UgaWYgKG1hdGNoU3Vic3RyaW5nICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBJdGVyYWJsZXMuZmlsdGVyKHByb2plY3RDYWNoZS5hbGwoKSwKKyAgICAgICAgICBuZXcgUHJlZGljYXRlPFByb2plY3QuTmFtZUtleT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShQcm9qZWN0Lk5hbWVLZXkgaW4pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGluLmdldCgpLnRvTG93ZXJDYXNlKExvY2FsZS5VUykKKyAgICAgICAgICAgICAgICAgIC5jb250YWlucyhtYXRjaFN1YnN0cmluZy50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKICAgICB9IGVsc2UgewogICAgICAgcmV0dXJuIHByb2plY3RDYWNoZS5hbGwoKTsKICAgICB9CkBAIC0zNzksMTEgKzQ4MSw0IEBACiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2plY3RJbmZvIHsKLSAgICB0cmFuc2llbnQgU3RyaW5nIG5hbWU7Ci0gICAgU3RyaW5nIHBhcmVudDsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb247Ci0gICAgTWFwPFN0cmluZywgU3RyaW5nPiBicmFuY2hlczsKLSAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L01vZHVsZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTMxNjIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTW9kdWxlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkRhc2hib2FyZFJlc291cmNlLkRBU0hCT0FSRF9LSU5EOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0UmVzb3VyY2UuUFJPSkVDVF9LSU5EOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdEFwaU1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DcmVhdGVQcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LmFzc2lzdGVkaW5qZWN0LkZhY3RvcnlNb2R1bGVCdWlsZGVyOworCitwdWJsaWMgY2xhc3MgTW9kdWxlIGV4dGVuZHMgUmVzdEFwaU1vZHVsZSB7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgYmluZChQcm9qZWN0c0NvbGxlY3Rpb24uY2xhc3MpOworICAgIGJpbmQoRGFzaGJvYXJkc0NvbGxlY3Rpb24uY2xhc3MpOworCisgICAgRHluYW1pY01hcC5tYXBPZihiaW5kZXIoKSwgUFJPSkVDVF9LSU5EKTsKKyAgICBEeW5hbWljTWFwLm1hcE9mKGJpbmRlcigpLCBEQVNIQk9BUkRfS0lORCk7CisKKyAgICBwdXQoUFJPSkVDVF9LSU5EKS50byhQdXRQcm9qZWN0LmNsYXNzKTsKKyAgICBnZXQoUFJPSkVDVF9LSU5EKS50byhHZXRQcm9qZWN0LmNsYXNzKTsKKyAgICBnZXQoUFJPSkVDVF9LSU5ELCAiZGVzY3JpcHRpb24iKS50byhHZXREZXNjcmlwdGlvbi5jbGFzcyk7CisgICAgcHV0KFBST0pFQ1RfS0lORCwgImRlc2NyaXB0aW9uIikudG8oUHV0RGVzY3JpcHRpb24uY2xhc3MpOworICAgIGRlbGV0ZShQUk9KRUNUX0tJTkQsICJkZXNjcmlwdGlvbiIpLnRvKFB1dERlc2NyaXB0aW9uLmNsYXNzKTsKKworICAgIGdldChQUk9KRUNUX0tJTkQsICJwYXJlbnQiKS50byhHZXRQYXJlbnQuY2xhc3MpOworICAgIHB1dChQUk9KRUNUX0tJTkQsICJwYXJlbnQiKS50byhTZXRQYXJlbnQuY2xhc3MpOworCisgICAgZ2V0KFBST0pFQ1RfS0lORCwgIkhFQUQiKS50byhHZXRIZWFkLmNsYXNzKTsKKyAgICBwdXQoUFJPSkVDVF9LSU5ELCAiSEVBRCIpLnRvKFNldEhlYWQuY2xhc3MpOworCisgICAgZ2V0KFBST0pFQ1RfS0lORCwgInN0YXRpc3RpY3MuZ2l0IikudG8oR2V0U3RhdGlzdGljcy5jbGFzcyk7CisgICAgcG9zdChQUk9KRUNUX0tJTkQsICJnYyIpLnRvKEdhcmJhZ2VDb2xsZWN0LmNsYXNzKTsKKworICAgIGNoaWxkKFBST0pFQ1RfS0lORCwgImRhc2hib2FyZHMiKS50byhEYXNoYm9hcmRzQ29sbGVjdGlvbi5jbGFzcyk7CisgICAgZ2V0KERBU0hCT0FSRF9LSU5EKS50byhHZXREYXNoYm9hcmQuY2xhc3MpOworICAgIHB1dChEQVNIQk9BUkRfS0lORCkudG8oU2V0RGFzaGJvYXJkLmNsYXNzKTsKKyAgICBkZWxldGUoREFTSEJPQVJEX0tJTkQpLnRvKERlbGV0ZURhc2hib2FyZC5jbGFzcyk7CisgICAgaW5zdGFsbChuZXcgRmFjdG9yeU1vZHVsZUJ1aWxkZXIoKS5idWlsZChDcmVhdGVQcm9qZWN0LkZhY3RvcnkuY2xhc3MpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L05vU3VjaFByb2plY3RFeGNlcHRpb24uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Ob1N1Y2hQcm9qZWN0RXhjZXB0aW9uLmphdmEKaW5kZXggMmFjNDk0ZC4uYWE2ZmIxNiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L05vU3VjaFByb2plY3RFeGNlcHRpb24uamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvTm9TdWNoUHJvamVjdEV4Y2VwdGlvbi5qYXZhCkBAIC0yMCwxMSArMjAsMTMgQEAKIHB1YmxpYyBjbGFzcyBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiUHJvamVjdCBub3QgZm91bmQ6ICI7CisKICAgcHVibGljIE5vU3VjaFByb2plY3RFeGNlcHRpb24oZmluYWwgUHJvamVjdC5OYW1lS2V5IGtleSkgewogICAgIHRoaXMoa2V5LCBudWxsKTsKICAgfQogCiAgIHB1YmxpYyBOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uKGZpbmFsIFByb2plY3QuTmFtZUtleSBrZXksIGZpbmFsIFRocm93YWJsZSB3aHkpIHsKLSAgICBzdXBlcihrZXkudG9TdHJpbmcoKSwgd2h5KTsKKyAgICBzdXBlcihNRVNTQUdFICsga2V5LnRvU3RyaW5nKCksIHdoeSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9QZXJmb3JtQ3JlYXRlUHJvamVjdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1BlcmZvcm1DcmVhdGVQcm9qZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY4NzI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9QZXJmb3JtQ3JlYXRlUHJvamVjdC5qYXZhCkBAIC0wLDAgKzEsMjkzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5Qcm9qZWN0VXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwRGVzY3JpcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUnVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLlByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5OZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVnaXN0cmF0aW9uLkR5bmFtaWNTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQmFja2VuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlByb2plY3RPd25lckdyb3VwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWV0YURhdGFVcGRhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Qcm9qZWN0Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUmVwb3NpdG9yeUNhc2VNaXNtYXRjaEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db21taXRCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlLlJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKworLyoqIENvbW1vbiBjbGFzcyB0aGF0IGhvbGRzIHRoZSBjb2RlIHRvIGNyZWF0ZSBwcm9qZWN0cyAqLworcHVibGljIGNsYXNzIFBlcmZvcm1DcmVhdGVQcm9qZWN0IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkKKyAgICAgIC5nZXRMb2dnZXIoUGVyZm9ybUNyZWF0ZVByb2plY3QuY2xhc3MpOworCisgIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7CisgICAgUGVyZm9ybUNyZWF0ZVByb2plY3QgY3JlYXRlKENyZWF0ZVByb2plY3RBcmdzIGNyZWF0ZVByb2plY3RBcmdzKTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnRHcm91cC5VVUlEPiBwcm9qZWN0T3duZXJHcm91cHM7CisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgY3VycmVudFVzZXI7CisgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgR2l0UmVmZXJlbmNlVXBkYXRlZCByZWZlcmVuY2VVcGRhdGVkOworICBwcml2YXRlIGZpbmFsIER5bmFtaWNTZXQ8TmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lcj4gY3JlYXRlZExpc3RlbmVyOworICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IHNlcnZlcklkZW50OworICBwcml2YXRlIGZpbmFsIENyZWF0ZVByb2plY3RBcmdzIGNyZWF0ZVByb2plY3RBcmdzOworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CisgIHByaXZhdGUgZmluYWwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZDsKKyAgcHJpdmF0ZSBmaW5hbCBNZXRhRGF0YVVwZGF0ZS5Vc2VyIG1ldGFEYXRhVXBkYXRlRmFjdG9yeTsKKworICBASW5qZWN0CisgIFBlcmZvcm1DcmVhdGVQcm9qZWN0KEBQcm9qZWN0T3duZXJHcm91cHMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBwT3duZXJHcm91cHMsCisgICAgICBJZGVudGlmaWVkVXNlciBpZGVudGlmaWVkVXNlciwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0UmVwb01hbmFnZXIsCisgICAgICBHaXRSZWZlcmVuY2VVcGRhdGVkIHJlZmVyZW5jZVVwZGF0ZWQsCisgICAgICBEeW5hbWljU2V0PE5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXI+IGNyZWF0ZWRMaXN0ZW5lciwKKyAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBQZXJzb25JZGVudCBwZXJzb25JZGVudCwgR3JvdXBCYWNrZW5kIGdyb3VwQmFja2VuZCwKKyAgICAgIE1ldGFEYXRhVXBkYXRlLlVzZXIgbWV0YURhdGFVcGRhdGVGYWN0b3J5LAorICAgICAgQEFzc2lzdGVkIENyZWF0ZVByb2plY3RBcmdzIGNyZWF0ZVBBcmdzLCBQcm9qZWN0Q2FjaGUgcENhY2hlKSB7CisgICAgdGhpcy5wcm9qZWN0T3duZXJHcm91cHMgPSBwT3duZXJHcm91cHM7CisgICAgdGhpcy5jdXJyZW50VXNlciA9IGlkZW50aWZpZWRVc2VyOworICAgIHRoaXMucmVwb01hbmFnZXIgPSBnaXRSZXBvTWFuYWdlcjsKKyAgICB0aGlzLnJlZmVyZW5jZVVwZGF0ZWQgPSByZWZlcmVuY2VVcGRhdGVkOworICAgIHRoaXMuY3JlYXRlZExpc3RlbmVyID0gY3JlYXRlZExpc3RlbmVyOworICAgIHRoaXMuc2VydmVySWRlbnQgPSBwZXJzb25JZGVudDsKKyAgICB0aGlzLmNyZWF0ZVByb2plY3RBcmdzID0gY3JlYXRlUEFyZ3M7CisgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwQ2FjaGU7CisgICAgdGhpcy5ncm91cEJhY2tlbmQgPSBncm91cEJhY2tlbmQ7CisgICAgdGhpcy5tZXRhRGF0YVVwZGF0ZUZhY3RvcnkgPSBtZXRhRGF0YVVwZGF0ZUZhY3Rvcnk7CisgIH0KKworICBwdWJsaWMgUHJvamVjdCBjcmVhdGVQcm9qZWN0KCkgdGhyb3dzIFByb2plY3RDcmVhdGlvbkZhaWxlZEV4Y2VwdGlvbiB7CisgICAgdmFsaWRhdGVQYXJhbWV0ZXJzKCk7CisgICAgZmluYWwgUHJvamVjdC5OYW1lS2V5IG5hbWVLZXkgPSBjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0KCk7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIFN0cmluZyBoZWFkID0KKyAgICAgICAgICBjcmVhdGVQcm9qZWN0QXJncy5wZXJtaXNzaW9uc09ubHkgPyBHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHCisgICAgICAgICAgICAgIDogY3JlYXRlUHJvamVjdEFyZ3MuYnJhbmNoLmdldCgwKTsKKyAgICAgIGZpbmFsIFJlcG9zaXRvcnkgcmVwbyA9IHJlcG9NYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkobmFtZUtleSk7CisgICAgICB0cnkgeworICAgICAgICBOZXdQcm9qZWN0Q3JlYXRlZExpc3RlbmVyLkV2ZW50IGV2ZW50ID0gbmV3IE5ld1Byb2plY3RDcmVhdGVkTGlzdGVuZXIuRXZlbnQoKSB7CisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lS2V5LmdldCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZDsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZvciAoTmV3UHJvamVjdENyZWF0ZWRMaXN0ZW5lciBsIDogY3JlYXRlZExpc3RlbmVyKSB7CisgICAgICAgICAgbC5vbk5ld1Byb2plY3RDcmVhdGVkKGV2ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlZlVwZGF0ZSB1ID0gcmVwby51cGRhdGVSZWYoQ29uc3RhbnRzLkhFQUQpOworICAgICAgICB1LmRpc2FibGVSZWZMb2coKTsKKyAgICAgICAgdS5saW5rKGhlYWQpOworCisgICAgICAgIGNyZWF0ZVByb2plY3RDb25maWcoKTsKKworICAgICAgICBpZiAoIWNyZWF0ZVByb2plY3RBcmdzLnBlcm1pc3Npb25zT25seQorICAgICAgICAgICAgJiYgY3JlYXRlUHJvamVjdEFyZ3MuY3JlYXRlRW1wdHlDb21taXQpIHsKKyAgICAgICAgICBjcmVhdGVFbXB0eUNvbW1pdHMocmVwbywgbmFtZUtleSwgY3JlYXRlUHJvamVjdEFyZ3MuYnJhbmNoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9qZWN0Q2FjaGUuZ2V0KG5hbWVLZXkpLmdldFByb2plY3QoKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Q2FzZU1pc21hdGNoRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXkuZ2V0KCkKKyAgICAgICAgICArICIgYmVjYXVzZSB0aGUgbmFtZSBpcyBhbHJlYWR5IG9jY3VwaWVkIGJ5IGFub3RoZXIgcHJvamVjdC4iCisgICAgICAgICAgKyAiIFRoZSBvdGhlciBwcm9qZWN0IGhhcyB0aGUgc2FtZSBuYW1lLCBvbmx5IHNwZWxsZWQgaW4gYSIKKyAgICAgICAgICArICIgZGlmZmVyZW50IGNhc2UuIiwgZSk7CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGJhZE5hbWUpIHsKKyAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXksIGJhZE5hbWUpOworICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIHRyeSB7CisgICAgICAgIGZpbmFsIFJlcG9zaXRvcnkgcmVwbyA9IHJlcG9NYW5hZ2VyLm9wZW5SZXBvc2l0b3J5KG5hbWVLZXkpOworICAgICAgICB0cnkgeworICAgICAgICAgIGlmIChyZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oInByb2plY3QgXCIiICsgbmFtZUtleSArICJcIiBleGlzdHMiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGhyb3cgZXJyOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9FcnIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9ICJDYW5ub3QgY3JlYXRlICIgKyBuYW1lS2V5OworICAgICAgICBsb2cuZXJyb3IobXNnLCBlcnIpOworICAgICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKG1zZywgaW9FcnIpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIkNhbm5vdCBjcmVhdGUgIiArIG5hbWVLZXk7CisgICAgICBsb2cuZXJyb3IobXNnLCBlKTsKKyAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24obXNnLCBlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdENvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CisgICAgZmluYWwgTWV0YURhdGFVcGRhdGUgbWQgPQorICAgICAgICBtZXRhRGF0YVVwZGF0ZUZhY3RvcnkuY3JlYXRlKGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3QoKSk7CisgICAgdHJ5IHsKKyAgICAgIGZpbmFsIFByb2plY3RDb25maWcgY29uZmlnID0gUHJvamVjdENvbmZpZy5yZWFkKG1kKTsKKyAgICAgIGNvbmZpZy5sb2FkKG1kKTsKKworICAgICAgUHJvamVjdCBuZXdQcm9qZWN0ID0gY29uZmlnLmdldFByb2plY3QoKTsKKyAgICAgIG5ld1Byb2plY3Quc2V0RGVzY3JpcHRpb24oY3JlYXRlUHJvamVjdEFyZ3MucHJvamVjdERlc2NyaXB0aW9uKTsKKyAgICAgIG5ld1Byb2plY3Quc2V0U3VibWl0VHlwZShjcmVhdGVQcm9qZWN0QXJncy5zdWJtaXRUeXBlKTsKKyAgICAgIG5ld1Byb2plY3QKKyAgICAgICAgICAuc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKGNyZWF0ZVByb2plY3RBcmdzLmNvbnRyaWJ1dG9yQWdyZWVtZW50cyk7CisgICAgICBuZXdQcm9qZWN0LnNldFVzZVNpZ25lZE9mZkJ5KGNyZWF0ZVByb2plY3RBcmdzLnNpZ25lZE9mZkJ5KTsKKyAgICAgIG5ld1Byb2plY3Quc2V0VXNlQ29udGVudE1lcmdlKGNyZWF0ZVByb2plY3RBcmdzLmNvbnRlbnRNZXJnZSk7CisgICAgICBuZXdQcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChjcmVhdGVQcm9qZWN0QXJncy5jaGFuZ2VJZFJlcXVpcmVkKTsKKyAgICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5uZXdQYXJlbnQgIT0gbnVsbCkgeworICAgICAgICBuZXdQcm9qZWN0LnNldFBhcmVudE5hbWUoY3JlYXRlUHJvamVjdEFyZ3MubmV3UGFyZW50LmdldFByb2plY3QoKQorICAgICAgICAgICAgLmdldE5hbWVLZXkoKSk7CisgICAgICB9CisKKyAgICAgIGlmICghY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGZpbmFsIEFjY2Vzc1NlY3Rpb24gYWxsID0KKyAgICAgICAgICAgIGNvbmZpZy5nZXRBY2Nlc3NTZWN0aW9uKEFjY2Vzc1NlY3Rpb24uQUxMLCB0cnVlKTsKKyAgICAgICAgZm9yIChBY2NvdW50R3JvdXAuVVVJRCBvd25lcklkIDogY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMpIHsKKyAgICAgICAgICBHcm91cERlc2NyaXB0aW9uLkJhc2ljIGcgPSBncm91cEJhY2tlbmQuZ2V0KG93bmVySWQpOworICAgICAgICAgIGlmIChnICE9IG51bGwpIHsKKyAgICAgICAgICAgIEdyb3VwUmVmZXJlbmNlIGdyb3VwID0gY29uZmlnLnJlc29sdmUoR3JvdXBSZWZlcmVuY2UuZm9yR3JvdXAoZykpOworICAgICAgICAgICAgYWxsLmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5PV05FUiwgdHJ1ZSkuYWRkKAorICAgICAgICAgICAgICAgIG5ldyBQZXJtaXNzaW9uUnVsZShncm91cCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBtZC5zZXRNZXNzYWdlKCJDcmVhdGVkIHByb2plY3RcbiIpOworICAgICAgY29uZmlnLmNvbW1pdChtZCk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG1kLmNsb3NlKCk7CisgICAgfQorICAgIHByb2plY3RDYWNoZS5vbkNyZWF0ZVByb2plY3QoY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdCgpKTsKKyAgICByZXBvTWFuYWdlci5zZXRQcm9qZWN0RGVzY3JpcHRpb24oY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdCgpLAorICAgICAgICBjcmVhdGVQcm9qZWN0QXJncy5wcm9qZWN0RGVzY3JpcHRpb24pOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGFyYW1ldGVycygpIHRocm93cyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24geworICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpID09IG51bGwKKyAgICAgICAgfHwgY3JlYXRlUHJvamVjdEFyZ3MuZ2V0UHJvamVjdE5hbWUoKS5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oIlByb2plY3QgbmFtZSBpcyByZXF1aXJlZCIpOworICAgIH0KKworICAgIFN0cmluZyBuYW1lV2l0aG91dFN1ZmZpeCA9IFByb2plY3RVdGlsLnN0cmlwR2l0U3VmZml4KGNyZWF0ZVByb2plY3RBcmdzLmdldFByb2plY3ROYW1lKCkpOworICAgIGNyZWF0ZVByb2plY3RBcmdzLnNldFByb2plY3ROYW1lKG5hbWVXaXRob3V0U3VmZml4KTsKKworICAgIGlmICghY3VycmVudFVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQ3JlYXRlUHJvamVjdCgpKSB7CisgICAgICB0aHJvdyBuZXcgUHJvamVjdENyZWF0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIiVzIGRvZXMgbm90IGhhdmUgXCJDcmVhdGUgUHJvamVjdFwiIGNhcGFiaWxpdHkuIiwKKyAgICAgICAgICBjdXJyZW50VXNlci5nZXRVc2VyTmFtZSgpKSk7CisgICAgfQorCisgICAgaWYgKGNyZWF0ZVByb2plY3RBcmdzLm93bmVySWRzID09IG51bGwKKyAgICAgICAgfHwgY3JlYXRlUHJvamVjdEFyZ3Mub3duZXJJZHMuaXNFbXB0eSgpKSB7CisgICAgICBjcmVhdGVQcm9qZWN0QXJncy5vd25lcklkcyA9CisgICAgICAgICAgbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXAuVVVJRD4ocHJvamVjdE93bmVyR3JvdXBzKTsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gdHJhbnNmb3JtZWRCcmFuY2hlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIGlmIChjcmVhdGVQcm9qZWN0QXJncy5icmFuY2ggPT0gbnVsbCB8fAorICAgICAgICBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2guaXNFbXB0eSgpKSB7CisgICAgICBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2ggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KENvbnN0YW50cy5NQVNURVIpOworICAgIH0KKyAgICBmb3IgKFN0cmluZyBicmFuY2ggOiBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2gpIHsKKyAgICAgIHdoaWxlIChicmFuY2guc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgIGJyYW5jaCA9IGJyYW5jaC5zdWJzdHJpbmcoMSk7CisgICAgICB9CisgICAgICBpZiAoIWJyYW5jaC5zdGFydHNXaXRoKENvbnN0YW50cy5SX0hFQURTKSkgeworICAgICAgICBicmFuY2ggPSBDb25zdGFudHMuUl9IRUFEUyArIGJyYW5jaDsKKyAgICAgIH0KKyAgICAgIGlmICghUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShicmFuY2gpKSB7CisgICAgICAgIHRocm93IG5ldyBQcm9qZWN0Q3JlYXRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICJCcmFuY2ggXCIlc1wiIGlzIG5vdCBhIHZhbGlkIG5hbWUuIiwgYnJhbmNoKSk7CisgICAgICB9CisgICAgICBpZiAoIXRyYW5zZm9ybWVkQnJhbmNoZXMuY29udGFpbnMoYnJhbmNoKSkgeworICAgICAgICB0cmFuc2Zvcm1lZEJyYW5jaGVzLmFkZChicmFuY2gpOworICAgICAgfQorICAgIH0KKyAgICBjcmVhdGVQcm9qZWN0QXJncy5icmFuY2ggPSB0cmFuc2Zvcm1lZEJyYW5jaGVzOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtcHR5Q29tbWl0cyhmaW5hbCBSZXBvc2l0b3J5IHJlcG8sCisgICAgICBmaW5hbCBQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgZmluYWwgTGlzdDxTdHJpbmc+IHJlZnMpCisgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIE9iamVjdEluc2VydGVyIG9pID0gcmVwby5uZXdPYmplY3RJbnNlcnRlcigpOworICAgIHRyeSB7CisgICAgICBDb21taXRCdWlsZGVyIGNiID0gbmV3IENvbW1pdEJ1aWxkZXIoKTsKKyAgICAgIGNiLnNldFRyZWVJZChvaS5pbnNlcnQoQ29uc3RhbnRzLk9CSl9UUkVFLCBuZXcgYnl0ZVtdIHt9KSk7CisgICAgICBjYi5zZXRBdXRob3IobWV0YURhdGFVcGRhdGVGYWN0b3J5LmdldFVzZXJQZXJzb25JZGVudCgpKTsKKyAgICAgIGNiLnNldENvbW1pdHRlcihzZXJ2ZXJJZGVudCk7CisgICAgICBjYi5zZXRNZXNzYWdlKCJJbml0aWFsIGVtcHR5IHJlcG9zaXRvcnlcbiIpOworCisgICAgICBPYmplY3RJZCBpZCA9IG9pLmluc2VydChjYik7CisgICAgICBvaS5mbHVzaCgpOworCisgICAgICBmb3IgKFN0cmluZyByZWYgOiByZWZzKSB7CisgICAgICAgIFJlZlVwZGF0ZSBydSA9IHJlcG8udXBkYXRlUmVmKHJlZik7CisgICAgICAgIHJ1LnNldE5ld09iamVjdElkKGlkKTsKKyAgICAgICAgZmluYWwgUmVzdWx0IHJlc3VsdCA9IHJ1LnVwZGF0ZSgpOworICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgICAgICAgIGNhc2UgTkVXOgorICAgICAgICAgICAgcmVmZXJlbmNlVXBkYXRlZC5maXJlKHByb2plY3QsIHJ1KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSByZWYgXCIlc1wiOiAlcyIsIHJlZiwgcmVzdWx0Lm5hbWUoKSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIGxvZy5lcnJvcigKKyAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBlbXB0eSBjb21taXQgZm9yICIKKyAgICAgICAgICAgICAgKyBjcmVhdGVQcm9qZWN0QXJncy5nZXRQcm9qZWN0TmFtZSgpLCBlKTsKKyAgICAgIHRocm93IGU7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIG9pLnJlbGVhc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9QZXJtaXNzaW9uQ29sbGVjdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKaW5kZXggZTQxNmVkNy4uNDgzZWNhZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Blcm1pc3Npb25Db2xsZWN0aW9uLmphdmEKQEAgLTE2LDEwICsxNiwxMyBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlJlZkNvbnRyb2wuaXNSRTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUnVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CiAKQEAgLTczLDcgKzc2LDcgQEAKICAgICAgIH0KIAogICAgICAgYm9vbGVhbiBwZXJVc2VyID0gZmFsc2U7Ci0gICAgICBMaXN0PEFjY2Vzc1NlY3Rpb24+IHNlY3Rpb25zID0gbmV3IEFycmF5TGlzdDxBY2Nlc3NTZWN0aW9uPigpOworICAgICAgTWFwPEFjY2Vzc1NlY3Rpb24sIFByb2plY3QuTmFtZUtleT4gc2VjdGlvblRvUHJvamVjdCA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOwogICAgICAgZm9yIChTZWN0aW9uTWF0Y2hlciBtYXRjaGVyIDogbWF0Y2hlckxpc3QpIHsKICAgICAgICAgLy8gSWYgdGhlIG1hdGNoZXIgaGFzIHRvIGV4cGFuZCBwYXJhbWV0ZXJzIGFuZCBpdHMgcHJlZml4IG1hdGNoZXMgdGhlCiAgICAgICAgIC8vIHJlZmVyZW5jZSB0aGVyZSBpcyBhIHZlcnkgZ29vZCBjaGFuY2UgdGhlIHJlZmVyZW5jZSBpcyBhY3R1YWxseSB1c2VyCkBAIC05Myw5ICs5NiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1hdGNoZXIubWF0Y2gocmVmLCB1c2VybmFtZSkpIHsKLSAgICAgICAgICBzZWN0aW9ucy5hZGQobWF0Y2hlci5zZWN0aW9uKTsKKyAgICAgICAgICBzZWN0aW9uVG9Qcm9qZWN0LnB1dChtYXRjaGVyLnNlY3Rpb24sIG1hdGNoZXIucHJvamVjdCk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIExpc3Q8QWNjZXNzU2VjdGlvbj4gc2VjdGlvbnMgPSBMaXN0cy5uZXdBcnJheUxpc3Qoc2VjdGlvblRvUHJvamVjdC5rZXlTZXQoKSk7CiAgICAgICBzb3J0ZXIuc29ydChyZWYsIHNlY3Rpb25zKTsKIAogICAgICAgU2V0PFNlZW5SdWxlPiBzZWVuID0gbmV3IEhhc2hTZXQ8U2VlblJ1bGU+KCk7CkBAIC0xMDQsNyArMTA4LDkgQEAKIAogICAgICAgSGFzaE1hcDxTdHJpbmcsIExpc3Q8UGVybWlzc2lvblJ1bGU+PiBwZXJtaXNzaW9ucyA9CiAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFBlcm1pc3Npb25SdWxlPj4oKTsKKyAgICAgIE1hcDxQZXJtaXNzaW9uUnVsZSwgUHJvamVjdFJlZj4gcnVsZVByb3BzID0gTWFwcy5uZXdJZGVudGl0eUhhc2hNYXAoKTsKICAgICAgIGZvciAoQWNjZXNzU2VjdGlvbiBzZWN0aW9uIDogc2VjdGlvbnMpIHsKKyAgICAgICAgUHJvamVjdC5OYW1lS2V5IHByb2plY3QgPSBzZWN0aW9uVG9Qcm9qZWN0LmdldChzZWN0aW9uKTsKICAgICAgICAgZm9yIChQZXJtaXNzaW9uIHBlcm1pc3Npb24gOiBzZWN0aW9uLmdldFBlcm1pc3Npb25zKCkpIHsKICAgICAgICAgICBib29sZWFuIGV4Y2x1c2l2ZVBlcm1pc3Npb25FeGlzdHMgPQogICAgICAgICAgICAgICBleGNsdXNpdmVHcm91cFBlcm1pc3Npb25zLmNvbnRhaW5zKHBlcm1pc3Npb24uZ2V0TmFtZSgpKTsKQEAgLTEyNCw2ICsxMzAsNyBAQAogICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLnB1dChwZXJtaXNzaW9uLmdldE5hbWUoKSwgcik7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgci5hZGQocnVsZSk7CisgICAgICAgICAgICAgIHJ1bGVQcm9wcy5wdXQocnVsZSwgbmV3IFByb2plY3RSZWYocHJvamVjdCwgc2VjdGlvbi5nZXROYW1lKCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAKQEAgLTEzMywxNiArMTQwLDIwIEBACiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgcmV0dXJuIG5ldyBQZXJtaXNzaW9uQ29sbGVjdGlvbihwZXJtaXNzaW9ucywgcGVyVXNlciA/IHVzZXJuYW1lIDogbnVsbCk7CisgICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25Db2xsZWN0aW9uKHBlcm1pc3Npb25zLCBydWxlUHJvcHMsCisgICAgICAgICAgcGVyVXNlciA/IHVzZXJuYW1lIDogbnVsbCk7CiAgICAgfQogICB9CiAKICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFBlcm1pc3Npb25SdWxlPj4gcnVsZXM7CisgIHByaXZhdGUgZmluYWwgTWFwPFBlcm1pc3Npb25SdWxlLCBQcm9qZWN0UmVmPiBydWxlUHJvcHM7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVzZXJuYW1lOwogCiAgIHByaXZhdGUgUGVybWlzc2lvbkNvbGxlY3Rpb24oTWFwPFN0cmluZywgTGlzdDxQZXJtaXNzaW9uUnVsZT4+IHJ1bGVzLAorICAgICAgTWFwPFBlcm1pc3Npb25SdWxlLCBQcm9qZWN0UmVmPiBydWxlUHJvcHMsCiAgICAgICBTdHJpbmcgdXNlcm5hbWUpIHsKICAgICB0aGlzLnJ1bGVzID0gcnVsZXM7CisgICAgdGhpcy5ydWxlUHJvcHMgPSBydWxlUHJvcHM7CiAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOwogICB9CiAKQEAgLTE2Nyw2ICsxNzgsMTAgQEAKICAgICByZXR1cm4gciAhPSBudWxsID8gciA6IENvbGxlY3Rpb25zLjxQZXJtaXNzaW9uUnVsZT4gZW1wdHlMaXN0KCk7CiAgIH0KIAorICBQcm9qZWN0UmVmIGdldFJ1bGVQcm9wcyhQZXJtaXNzaW9uUnVsZSBydWxlKSB7CisgICAgcmV0dXJuIHJ1bGVQcm9wcy5nZXQocnVsZSk7CisgIH0KKwogICAvKioKICAgICogT2J0YWluIGFsbCBkZWNsYXJlZCBwZXJtaXNzaW9uIHJ1bGVzIHRoYXQgbWF0Y2ggdGhlIHJlZmVyZW5jZS4KICAgICoKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGUuamF2YQppbmRleCA3YTExMTMxMS4uNjk3YjgzOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZS5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGUuamF2YQpAQCAtMTQsOCArMTQsMTEgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKIAoraW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiAKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCiAvKiogQ2FjaGUgb2YgcHJvamVjdCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGFjY2VzcyByaWdodHMuICovCiBwdWJsaWMgaW50ZXJmYWNlIFByb2plY3RDYWNoZSB7CiAgIC8qKiBAcmV0dXJuIHRoZSBwYXJlbnQgc3RhdGUgZm9yIGFsbCBwcm9qZWN0cyBvbiB0aGlzIHNlcnZlci4gKi8KQEAgLTQyLDYgKzQ1LDEzIEBACiAgIHB1YmxpYyBhYnN0cmFjdCBJdGVyYWJsZTxQcm9qZWN0Lk5hbWVLZXk+IGFsbCgpOwogCiAgIC8qKgorICAgKiBAcmV0dXJuIGVzdGltYXRlZCBzZXQgb2YgcmVsZXZhbnQgZ3JvdXBzIGV4dHJhY3RlZCBmcm9tIGhvdCBwcm9qZWN0IGFjY2VzcworICAgKiAgICAgICAgIHJ1bGVzLiBJZiB0aGUgY2FjaGUgaXMgY29sZCBvciB0b28gc21hbGwgZm9yIHRoZSBlbnRpcmUgcHJvamVjdCBzZXQKKyAgICogICAgICAgICBvZiB0aGUgc2VydmVyLCB0aGlzIHNldCBtYXkgYmUgaW5jb21wbGV0ZS4KKyAgICovCisgIHB1YmxpYyBhYnN0cmFjdCBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGd1ZXNzUmVsZXZhbnRHcm91cFVVSURzKCk7CisKKyAgLyoqCiAgICAqIEZpbHRlciB0aGUgc2V0IG9mIHJlZ2lzdGVyZWQgcHJvamVjdCBuYW1lcyBieSBjb21tb24gcHJlZml4LgogICAgKgogICAgKiBAcGFyYW0gcHJlZml4IGNvbW1vbiBwcmVmaXguCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENhY2hlQ2xvY2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGVDbG9jay5qYXZhCmluZGV4IGY4NjU2MmMuLmM5NmViZGYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGVDbG9jay5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGVDbG9jay5qYXZhCkBAIC0xNCw2ICsxNCw3IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTIzLDkgKzI0LDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAogLyoqIFRpY2tzIHBlcmlvZGljYWxseSB0byBmb3JjZSByZWZyZXNoIGV2ZW50cyBmb3Ige0BsaW5rIFByb2plY3RDYWNoZUltcGx9LiAqLwogQFNpbmdsZXRvbgpAQCAtMzQsMjkgKzMzLDI0IEBACiAKICAgQEluamVjdAogICBwdWJsaWMgUHJvamVjdENhY2hlQ2xvY2soQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgc2VydmVyQ29uZmlnKSB7Ci0gICAgdGhpcyhUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCgKLSAgICAgICAgQ29uZmlnVXRpbC5nZXRUaW1lVW5pdChzZXJ2ZXJDb25maWcsCi0gICAgICAgICAgICAiY2FjaGUiLCAicHJvamVjdHMiLCAiY2hlY2tGcmVxdWVuY3kiLAotICAgICAgICAgICAgNSwgVGltZVVuaXQuTUlOVVRFUyksIFRpbWVVbml0Lk1JTlVURVMpKTsKKyAgICB0aGlzKGNoZWNrRnJlcXVlbmN5KHNlcnZlckNvbmZpZykpOwogICB9CiAKICAgcHVibGljIFByb2plY3RDYWNoZUNsb2NrKGxvbmcgY2hlY2tGcmVxdWVuY3lNaWxsaXMpIHsKLSAgICBpZiAoMTAgPCBjaGVja0ZyZXF1ZW5jeU1pbGxpcykgeworICAgIGlmIChjaGVja0ZyZXF1ZW5jeU1pbGxpcyA9PSBMb25nLk1BWF9WQUxVRSkgeworICAgICAgLy8gU3RhcnQgd2l0aCBnZW5lcmF0aW9uIDEgKHRvIGF2b2lkIG1hZ2ljIDAgYmVsb3cpLgorICAgICAgLy8gRG8gbm90IGJlZ2luIGJhY2tncm91bmQgdGhyZWFkLCBkaXNhYmxpbmcgdGhlIGNsb2NrLgorICAgICAgZ2VuZXJhdGlvbiA9IDE7CisgICAgfSBlbHNlIGlmICgxMCA8IGNoZWNrRnJlcXVlbmN5TWlsbGlzKSB7CiAgICAgICAvLyBTdGFydCB3aXRoIGdlbmVyYXRpb24gMSAodG8gYXZvaWQgbWFnaWMgMCBiZWxvdykuCiAgICAgICBnZW5lcmF0aW9uID0gMTsKLSAgICAgIFRocmVhZEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBUaHJlYWRGYWN0b3J5KCkgewotICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgaWQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICAgIFRocmVhZCB0aHJlYWQgPSBFeGVjdXRvcnMuZGVmYXVsdFRocmVhZEZhY3RvcnkoKS5uZXdUaHJlYWQocnVubmFibGUpOwotICAgICAgICAgIHRocmVhZC5zZXROYW1lKFN0cmluZy5mb3JtYXQoIlByb2plY3RDYWNoZUNsb2NrLSVkIiwgaWQuaW5jcmVtZW50QW5kR2V0KCkpKTsKLSAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotICAgICAgICAgIHRocmVhZC5zZXRQcmlvcml0eShUaHJlYWQuTUlOX1BSSU9SSVRZKTsKLSAgICAgICAgICByZXR1cm4gdGhyZWFkOwotICAgICAgICB9Ci0gICAgICB9OwotICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NjaGVkdWxlZFRocmVhZFBvb2woMSwgZmFjdG9yeSk7CisgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgKKyAgICAgICAgICAxLAorICAgICAgICAgIG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiUHJvamVjdENhY2hlQ2xvY2stJWQiKQorICAgICAgICAgICAgLnNldERhZW1vbih0cnVlKQorICAgICAgICAgICAgLnNldFByaW9yaXR5KFRocmVhZC5NSU5fUFJJT1JJVFkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgICBleGVjdXRvci5zY2hlZHVsZUF0Rml4ZWRSYXRlKG5ldyBSdW5uYWJsZSgpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKQEAgLTc1LDQgKzY5LDE2IEBACiAgIGxvbmcgcmVhZCgpIHsKICAgICByZXR1cm4gZ2VuZXJhdGlvbjsKICAgfQorCisgIHByaXZhdGUgc3RhdGljIGxvbmcgY2hlY2tGcmVxdWVuY3koQ29uZmlnIHNlcnZlckNvbmZpZykgeworICAgIFN0cmluZyBmcmVxID0gc2VydmVyQ29uZmlnLmdldFN0cmluZygiY2FjaGUiLCAicHJvamVjdHMiLCAiY2hlY2tGcmVxdWVuY3kiKTsKKyAgICBpZiAoZnJlcSAhPSBudWxsCisgICAgICAgICYmICgiZGlzYWJsZWQiLmVxdWFsc0lnbm9yZUNhc2UoZnJlcSkgfHwgIm9mZiIuZXF1YWxzSWdub3JlQ2FzZShmcmVxKSkpIHsKKyAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KAorICAgICAgICBDb25maWdVdGlsLmdldFRpbWVVbml0KHNlcnZlckNvbmZpZywKKyAgICAgICAgICAgICJjYWNoZSIsICJwcm9qZWN0cyIsICJjaGVja0ZyZXF1ZW5jeSIsCisgICAgICAgICAgICA1LCBUaW1lVW5pdC5NSU5VVEVTKSwgVGltZVVuaXQuTUlOVVRFUyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGVJbXBsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENhY2hlSW1wbC5qYXZhCmluZGV4IGE3ZmRiNGUuLjI3MmMxMjggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0Q2FjaGVJbXBsLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDYWNoZUltcGwuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkNhY2hlTG9hZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNhY2hlLkxvYWRpbmdDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2FjaGUuQ2FjaGVNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CkBAIC0zNiw2ICszNyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7CkBAIC0xNzEsNiArMTczLDE4IEBACiAgIH0KIAogICBAT3ZlcnJpZGUKKyAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3Vlc3NSZWxldmFudEdyb3VwVVVJRHMoKSB7CisgICAgU2V0PEFjY291bnRHcm91cC5VVUlEPiBncm91cHMgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBmb3IgKFByb2plY3QuTmFtZUtleSBuIDogYWxsKCkpIHsKKyAgICAgIFByb2plY3RTdGF0ZSBwID0gYnlOYW1lLmdldElmUHJlc2VudChuLmdldCgpKTsKKyAgICAgIGlmIChwICE9IG51bGwpIHsKKyAgICAgICAgZ3JvdXBzLmFkZEFsbChwLmdldENvbmZpZygpLmdldEFsbEdyb3VwVVVJRHMoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBncm91cHM7CisgIH0KKworICBAT3ZlcnJpZGUKICAgcHVibGljIEl0ZXJhYmxlPFByb2plY3QuTmFtZUtleT4gYnlOYW1lKGZpbmFsIFN0cmluZyBwZngpIHsKICAgICBmaW5hbCBJdGVyYWJsZTxQcm9qZWN0Lk5hbWVLZXk+IHNyYzsKICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RDb250cm9sLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENvbnRyb2wuamF2YQppbmRleCA1MTNmMWIxLi41NmQ0YmUzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENvbnRyb2wuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdENvbnRyb2wuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkNhcGFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQ29udHJpYnV0b3JBZ3JlZW1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlLkFjdGlvbjsKQEAgLTEyMCwxMCArMTIxLDExIEBACiAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxDb250cmlidXRvckFncmVlbWVudD4gY29udHJpYnV0b3JBZ3JlZW1lbnRzOwogCiAgIHByaXZhdGUgTGlzdDxTZWN0aW9uTWF0Y2hlcj4gYWxsU2VjdGlvbnM7CisgIHByaXZhdGUgTGlzdDxTZWN0aW9uTWF0Y2hlcj4gbG9jYWxTZWN0aW9uczsKKyAgcHJpdmF0ZSBMYWJlbFR5cGVzIGxhYmVsVHlwZXM7CiAgIHByaXZhdGUgTWFwPFN0cmluZywgUmVmQ29udHJvbD4gcmVmQ29udHJvbHM7CiAgIHByaXZhdGUgQm9vbGVhbiBkZWNsYXJlZE93bmVyOwogCi0KICAgQEluamVjdAogICBQcm9qZWN0Q29udHJvbChAR2l0VXBsb2FkUGFja0dyb3VwcyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IHVwbG9hZEdyb3VwcywKICAgICAgIEBHaXRSZWNlaXZlUGFja0dyb3VwcyBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IHJlY2VpdmVHcm91cHMsCkBAIC0xODAsNiArMTgyLDEzIEBACiAgICAgcmV0dXJuIHN0YXRlLmdldFByb2plY3QoKTsKICAgfQogCisgIHB1YmxpYyBMYWJlbFR5cGVzIGdldExhYmVsVHlwZXMoKSB7CisgICAgaWYgKGxhYmVsVHlwZXMgPT0gbnVsbCkgeworICAgICAgbGFiZWxUeXBlcyA9IHN0YXRlLmdldExhYmVsVHlwZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGxhYmVsVHlwZXM7CisgIH0KKwogICBwcml2YXRlIGJvb2xlYW4gaXNIaWRkZW4oKSB7CiAgICAgcmV0dXJuIGdldFByb2plY3QoKS5nZXRTdGF0ZSgpLmVxdWFscyhQcm9qZWN0LlN0YXRlLkhJRERFTik7CiAgIH0KQEAgLTIzMSwxNiArMjQwLDI0IEBACiAgICAgICBTdHJpbmcgcE5hbWUgPSBzdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwogICAgICAgcmV0dXJuIG5ldyBDYXBhYmxlKCJVcGxvYWQgZGVuaWVkIGZvciBwcm9qZWN0ICciICsgcE5hbWUgKyAiJyIpOwogICAgIH0KLSAgICBQcm9qZWN0IHByb2plY3QgPSBzdGF0ZS5nZXRQcm9qZWN0KCk7Ci0gICAgaWYgKHByb2plY3QuaXNVc2VDb250cmlidXRvckFncmVlbWVudHMoKSkgeworICAgIGlmIChzdGF0ZS5pc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKSB7CiAgICAgICByZXR1cm4gdmVyaWZ5QWN0aXZlQ29udHJpYnV0b3JBZ3JlZW1lbnQoKTsKICAgICB9CiAgICAgcmV0dXJuIENhcGFibGUuT0s7CiAgIH0KIAogICBwdWJsaWMgU2V0PEdyb3VwUmVmZXJlbmNlPiBnZXRBbGxHcm91cHMoKSB7CisgICAgcmV0dXJuIGdldEdyb3VwcyhhY2Nlc3MoKSk7CisgIH0KKworICBwdWJsaWMgU2V0PEdyb3VwUmVmZXJlbmNlPiBnZXRMb2NhbEdyb3VwcygpIHsKKyAgICByZXR1cm4gZ2V0R3JvdXBzKGxvY2FsQWNjZXNzKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgU2V0PEdyb3VwUmVmZXJlbmNlPiBnZXRHcm91cHMoCisgICAgICBmaW5hbCBMaXN0PFNlY3Rpb25NYXRjaGVyPiBzZWN0aW9uTWF0Y2hlckxpc3QpIHsKICAgICBmaW5hbCBTZXQ8R3JvdXBSZWZlcmVuY2U+IGFsbCA9IG5ldyBIYXNoU2V0PEdyb3VwUmVmZXJlbmNlPigpOwotICAgIGZvciAoZmluYWwgU2VjdGlvbk1hdGNoZXIgbWF0Y2hlciA6IGFjY2VzcygpKSB7CisgICAgZm9yIChmaW5hbCBTZWN0aW9uTWF0Y2hlciBtYXRjaGVyIDogc2VjdGlvbk1hdGNoZXJMaXN0KSB7CiAgICAgICBmaW5hbCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24gPSBtYXRjaGVyLnNlY3Rpb247CiAgICAgICBmb3IgKGZpbmFsIFBlcm1pc3Npb24gcGVybWlzc2lvbiA6IHNlY3Rpb24uZ2V0UGVybWlzc2lvbnMoKSkgewogICAgICAgICBmb3IgKGZpbmFsIFBlcm1pc3Npb25SdWxlIHJ1bGUgOiBwZXJtaXNzaW9uLmdldFJ1bGVzKCkpIHsKQEAgLTM5Miw2ICs0MDksMTMgQEAKICAgICByZXR1cm4gYWxsU2VjdGlvbnM7CiAgIH0KIAorICBwcml2YXRlIExpc3Q8U2VjdGlvbk1hdGNoZXI+IGxvY2FsQWNjZXNzKCkgeworICAgIGlmIChsb2NhbFNlY3Rpb25zID09IG51bGwpIHsKKyAgICAgIGxvY2FsU2VjdGlvbnMgPSBzdGF0ZS5nZXRMb2NhbEFjY2Vzc1NlY3Rpb25zKCk7CisgICAgfQorICAgIHJldHVybiBsb2NhbFNlY3Rpb25zOworICB9CisKICAgYm9vbGVhbiBtYXRjaChQZXJtaXNzaW9uUnVsZSBydWxlKSB7CiAgICAgcmV0dXJuIG1hdGNoKHJ1bGUuZ2V0R3JvdXAoKS5nZXRVVUlEKCkpOwogICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdEhpZXJhcmNoeUl0ZXJhdG9yLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdEhpZXJhcmNoeUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyNGNlOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0SGllcmFyY2h5SXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogSXRlcmF0ZXMgZnJvbSBhIHByb2plY3QgdXAgdGhyb3VnaCBpdHMgcGFyZW50cyB0byBBbGwtUHJvamVjdHMuCisgKiA8cD4KKyAqIElmIGEgY3ljbGUgaXMgZGV0ZWN0ZWQgdGhlIGN5Y2xlIGlzIGJyb2tlbiBhbmQgQWxsLVByb2plY3RzIGlzIHZpc2l0ZWQuCisgKi8KK2NsYXNzIFByb2plY3RIaWVyYXJjaHlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFByb2plY3RTdGF0ZT4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvamVjdEhpZXJhcmNoeUl0ZXJhdG9yLmNsYXNzKTsKKworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBjYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lOworICBwcml2YXRlIGZpbmFsIFNldDxQcm9qZWN0Lk5hbWVLZXk+IHNlZW47CisgIHByaXZhdGUgUHJvamVjdFN0YXRlIG5leHQ7CisKKyAgUHJvamVjdEhpZXJhcmNoeUl0ZXJhdG9yKFByb2plY3RDYWNoZSBjLAorICAgICAgQWxsUHJvamVjdHNOYW1lIGFsbCwKKyAgICAgIFByb2plY3RTdGF0ZSBmaXJzdFJlc3VsdCkgeworICAgIGNhY2hlID0gYzsKKyAgICBhbGxQcm9qZWN0c05hbWUgPSBhbGw7CisKKyAgICBzZWVuID0gU2V0cy5uZXdMaW5rZWRIYXNoU2V0KCk7CisgICAgc2Vlbi5hZGQoZmlyc3RSZXN1bHQuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgbmV4dCA9IGZpcnN0UmVzdWx0OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUHJvamVjdFN0YXRlIG5leHQoKSB7CisgICAgUHJvamVjdFN0YXRlIG4gPSBuZXh0OworICAgIGlmIChuID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgfQorICAgIG5leHQgPSBjb21wdXRlTmV4dChuKTsKKyAgICByZXR1cm4gbjsKKyAgfQorCisgIHByaXZhdGUgUHJvamVjdFN0YXRlIGNvbXB1dGVOZXh0KFByb2plY3RTdGF0ZSBuKSB7CisgICAgUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUgPSBuLmdldFByb2plY3QoKS5nZXRQYXJlbnQoKTsKKyAgICBpZiAocGFyZW50TmFtZSAhPSBudWxsICYmIHZpc2l0KHBhcmVudE5hbWUpKSB7CisgICAgICBQcm9qZWN0U3RhdGUgcCA9IGNhY2hlLmdldChwYXJlbnROYW1lKTsKKyAgICAgIGlmIChwICE9IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIHdhcyBhbHJlYWR5IHZpc2l0ZWQuCisgICAgLy8gRmFsbCBiYWNrIHRvIHZpc2l0IEFsbC1Qcm9qZWN0cyBleGFjdGx5IG9uY2UuCisgICAgaWYgKHNlZW4uYWRkKGFsbFByb2plY3RzTmFtZSkpIHsKKyAgICAgIHJldHVybiBjYWNoZS5nZXQoYWxsUHJvamVjdHNOYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gdmlzaXQoUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUpIHsKKyAgICBpZiAoc2Vlbi5hZGQocGFyZW50TmFtZSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIExpc3Q8U3RyaW5nPiBvcmRlciA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShzZWVuLnNpemUoKSArIDEpOworICAgIGZvciAoUHJvamVjdC5OYW1lS2V5IHAgOiBzZWVuKSB7CisgICAgICBvcmRlci5hZGQocC5nZXQoKSk7CisgICAgfQorICAgIGludCBpZHggPSBvcmRlci5sYXN0SW5kZXhPZihwYXJlbnROYW1lLmdldCgpKTsKKyAgICBvcmRlci5hZGQocGFyZW50TmFtZS5nZXQoKSk7CisgICAgbG9nLndhcm4oIkN5Y2xlIGRldGVjdGVkIGluIHByb2plY3RzOiAiCisgICAgICAgICsgSm9pbmVyLm9uKCIgLT4gIikuam9pbihvcmRlci5zdWJMaXN0KGlkeCwgb3JkZXIuc2l6ZSgpKSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0SnNvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RKc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNWNiYgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0SnNvbi5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVXJsOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQWxsUHJvamVjdHNOYW1lOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0SnNvbiB7CisKKyAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHM7CisKKyAgQEluamVjdAorICBQcm9qZWN0SnNvbihBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHMpIHsKKyAgICB0aGlzLmFsbFByb2plY3RzID0gYWxsUHJvamVjdHM7CisgIH0KKworICBwdWJsaWMgUHJvamVjdEluZm8gZm9ybWF0KFByb2plY3RSZXNvdXJjZSByc3JjKSB7CisgICAgcmV0dXJuIGZvcm1hdChyc3JjLmdldENvbnRyb2woKS5nZXRQcm9qZWN0KCkpOworICB9CisKKyAgcHVibGljIFByb2plY3RJbmZvIGZvcm1hdChQcm9qZWN0IHApIHsKKyAgICBQcm9qZWN0SW5mbyBpbmZvID0gbmV3IFByb2plY3RJbmZvKCk7CisgICAgaW5mby5uYW1lID0gcC5nZXROYW1lKCk7CisgICAgUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUgPSBwLmdldFBhcmVudChhbGxQcm9qZWN0cyk7CisgICAgaW5mby5wYXJlbnQgPSBwYXJlbnROYW1lICE9IG51bGwgPyBwYXJlbnROYW1lLmdldCgpIDogbnVsbDsKKyAgICBpbmZvLmRlc2NyaXB0aW9uID0gU3RyaW5ncy5lbXB0eVRvTnVsbChwLmdldERlc2NyaXB0aW9uKCkpOworICAgIGluZm8uZmluaXNoKCk7CisgICAgcmV0dXJuIGluZm87CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2plY3RJbmZvIHsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGtpbmQgPSAiZ2Vycml0Y29kZXJldmlldyNwcm9qZWN0IjsKKyAgICBwdWJsaWMgU3RyaW5nIGlkOworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgU3RyaW5nIHBhcmVudDsKKyAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGJyYW5jaGVzOworCisgICAgdm9pZCBmaW5pc2goKSB7CisgICAgICBpZCA9IFVybC5lbmNvZGUobmFtZSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdFJlZi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RSZWYuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzE1ZmFkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RSZWYuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKKworY2xhc3MgUHJvamVjdFJlZiB7CisKKyAgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CisgIGZpbmFsIFN0cmluZyByZWY7CisKKyAgUHJvamVjdFJlZihQcm9qZWN0Lk5hbWVLZXkgcHJvamVjdCwgU3RyaW5nIHJlZikgeworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgdGhpcy5yZWYgPSByZWY7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgeworICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFByb2plY3RSZWYKKyAgICAgICAgJiYgcHJvamVjdC5lcXVhbHMoKChQcm9qZWN0UmVmKSBvdGhlcikucHJvamVjdCkKKyAgICAgICAgJiYgcmVmLmVxdWFscygoKFByb2plY3RSZWYpIG90aGVyKS5yZWYpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgcmV0dXJuIHByb2plY3QuaGFzaENvZGUoKSAqIDMxICsgcmVmLmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gcHJvamVjdCArICIsICIgKyByZWY7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0UmVzb3VyY2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNhMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0UmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlR5cGVMaXRlcmFsOworCitwdWJsaWMgY2xhc3MgUHJvamVjdFJlc291cmNlIGltcGxlbWVudHMgUmVzdFJlc291cmNlIHsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlTGl0ZXJhbDxSZXN0VmlldzxQcm9qZWN0UmVzb3VyY2U+PiBQUk9KRUNUX0tJTkQgPQorICAgICAgbmV3IFR5cGVMaXRlcmFsPFJlc3RWaWV3PFByb2plY3RSZXNvdXJjZT4+KCkge307CisKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q29udHJvbCBjb250cm9sOworCisgIFByb2plY3RSZXNvdXJjZShQcm9qZWN0Q29udHJvbCBjb250cm9sKSB7CisgICAgdGhpcy5jb250cm9sID0gY29udHJvbDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICByZXR1cm4gY29udHJvbC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOworICB9CisKKyAgcHVibGljIFByb2plY3QuTmFtZUtleSBnZXROYW1lS2V5KCkgeworICAgIHJldHVybiBjb250cm9sLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCk7CisgIH0KKworICBwdWJsaWMgUHJvamVjdENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKKyAgICByZXR1cm4gY29udHJvbDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RTdGF0ZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1Byb2plY3RTdGF0ZS5qYXZhCmluZGV4IGUwNmM5NDguLjYxNTBhM2YgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0U3RhdGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdFN0YXRlLmphdmEKQEAgLTE0LDEzICsxNCwyMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwUmVmZXJlbmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5Jbmhlcml0YWJsZUJvb2xlYW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUnVsZXNDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CkBAIC0zOSwxMSArNDYsMTQgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKiBDYWNoZWQgaW5mb3JtYXRpb24gb24gYSBwcm9qZWN0LiAqLwpAQCAtNzYsNyArODYsNyBAQAogICBwcml2YXRlIGZpbmFsIENhcGFiaWxpdHlDb2xsZWN0aW9uIGNhcGFiaWxpdGllczsKIAogICBASW5qZWN0Ci0gIHByb3RlY3RlZCBQcm9qZWN0U3RhdGUoCisgIHB1YmxpYyBQcm9qZWN0U3RhdGUoCiAgICAgICBmaW5hbCBQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlLAogICAgICAgZmluYWwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZSwKICAgICAgIGZpbmFsIFByb2plY3RDb250cm9sLkFzc2lzdGVkRmFjdG9yeSBwcm9qZWN0Q29udHJvbEZhY3RvcnksCkBAIC0xNjUsNiArMTc1LDIwIEBACiAgICAgcmV0dXJuIGVudkZhY3RvcnkuY3JlYXRlKHBtYyk7CiAgIH0KIAorICAvKioKKyAgICogTGlrZSB7QGxpbmsgI25ld1Byb2xvZ0Vudmlyb25tZW50KCl9IGJ1dCBpbnN0ZWFkIG9mIHJlYWRpbmcgdGhlIHJ1bGVzLnBsCisgICAqIHJlYWQgdGhlIHByb3ZpZGVkIGlucHV0IHN0cmVhbS4KKyAgICoKKyAgICogQHBhcmFtIG5hbWUgYSBuYW1lIG9mIHRoZSBpbnB1dCBzdHJlYW0uIENvdWxkIGJlIGFueSBuYW1lLgorICAgKiBAcGFyYW0gaW4gSW5wdXRTdHJlYW0gdG8gcmVhZCBwcm9sb2cgcnVsZXMgZnJvbQorICAgKiBAdGhyb3dzIENvbXBpbGVFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBQcm9sb2dFbnZpcm9ubWVudCBuZXdQcm9sb2dFbnZpcm9ubWVudChTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gaW4pCisgICAgICB0aHJvd3MgQ29tcGlsZUV4Y2VwdGlvbiB7CisgICAgUHJvbG9nTWFjaGluZUNvcHkgcG1jID0gcnVsZXNDYWNoZS5sb2FkTWFjaGluZShuYW1lLCBpbik7CisgICAgcmV0dXJuIGVudkZhY3RvcnkuY3JlYXRlKHBtYyk7CisgIH0KKwogICBwdWJsaWMgUHJvamVjdCBnZXRQcm9qZWN0KCkgewogICAgIHJldHVybiBjb25maWcuZ2V0UHJvamVjdCgpOwogICB9CkBAIC0xNzQsNyArMTk4LDcgQEAKICAgfQogCiAgIC8qKiBHZXQgdGhlIHNlY3Rpb25zIHRoYXQgcGVydGFpbiBvbmx5IHRvIHRoaXMgcHJvamVjdC4gKi8KLSAgcHJpdmF0ZSBMaXN0PFNlY3Rpb25NYXRjaGVyPiBnZXRMb2NhbEFjY2Vzc1NlY3Rpb25zKCkgeworICBMaXN0PFNlY3Rpb25NYXRjaGVyPiBnZXRMb2NhbEFjY2Vzc1NlY3Rpb25zKCkgewogICAgIExpc3Q8U2VjdGlvbk1hdGNoZXI+IHNtID0gbG9jYWxBY2Nlc3NTZWN0aW9uczsKICAgICBpZiAoc20gPT0gbnVsbCkgewogICAgICAgQ29sbGVjdGlvbjxBY2Nlc3NTZWN0aW9uPiBmcm9tQ29uZmlnID0gY29uZmlnLmdldEFjY2Vzc1NlY3Rpb25zKCk7CkBAIC0xOTIsNyArMjE2LDggQEAKICAgICAgICAgICBzZWN0aW9uLnNldFBlcm1pc3Npb25zKGNvcHkpOwogICAgICAgICB9CiAKLSAgICAgICAgU2VjdGlvbk1hdGNoZXIgbWF0Y2hlciA9IFNlY3Rpb25NYXRjaGVyLndyYXAoc2VjdGlvbik7CisgICAgICAgIFNlY3Rpb25NYXRjaGVyIG1hdGNoZXIgPSBTZWN0aW9uTWF0Y2hlci53cmFwKGdldFByb2plY3QoKS5nZXROYW1lS2V5KCksCisgICAgICAgICAgICBzZWN0aW9uKTsKICAgICAgICAgaWYgKG1hdGNoZXIgIT0gbnVsbCkgewogICAgICAgICAgIHNtLmFkZChtYXRjaGVyKTsKICAgICAgICAgfQpAQCAtMjEyLDIzICsyMzcsOSBAQAogICAgICAgcmV0dXJuIGdldExvY2FsQWNjZXNzU2VjdGlvbnMoKTsKICAgICB9CiAKLSAgICBMaXN0PFNlY3Rpb25NYXRjaGVyPiBhbGwgPSBuZXcgQXJyYXlMaXN0PFNlY3Rpb25NYXRjaGVyPigpOwotICAgIFNldDxQcm9qZWN0Lk5hbWVLZXk+IHNlZW4gPSBuZXcgSGFzaFNldDxQcm9qZWN0Lk5hbWVLZXk+KCk7Ci0gICAgUHJvamVjdFN0YXRlIGFsbFByb2plY3RzID0gcHJvamVjdENhY2hlLmdldEFsbFByb2plY3RzKCk7Ci0gICAgc2Vlbi5hZGQoZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7Ci0KLSAgICBQcm9qZWN0U3RhdGUgcyA9IHRoaXM7Ci0gICAgZG8geworICAgIExpc3Q8U2VjdGlvbk1hdGNoZXI+IGFsbCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIGZvciAoUHJvamVjdFN0YXRlIHMgOiB0cmVlKCkpIHsKICAgICAgIGFsbC5hZGRBbGwocy5nZXRMb2NhbEFjY2Vzc1NlY3Rpb25zKCkpOwotCi0gICAgICBQcm9qZWN0Lk5hbWVLZXkgcGFyZW50ID0gcy5nZXRQcm9qZWN0KCkuZ2V0UGFyZW50KCk7Ci0gICAgICBpZiAocGFyZW50ID09IG51bGwgfHwgIXNlZW4uYWRkKHBhcmVudCkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBzID0gcHJvamVjdENhY2hlLmdldChwYXJlbnQpOwotICAgIH0gd2hpbGUgKHMgIT0gbnVsbCk7Ci0gICAgaWYgKHNlZW4uYWRkKGFsbFByb2plY3RzLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpKSB7Ci0gICAgICBhbGwuYWRkQWxsKGFsbFByb2plY3RzLmdldExvY2FsQWNjZXNzU2VjdGlvbnMoKSk7CiAgICAgfQogICAgIHJldHVybiBhbGw7CiAgIH0KQEAgLTI0MCwxNiArMjUxLDExIEBACiAgICAqICAgICAgICAgdGhhdCBoYXMgbG9jYWwgb3duZXJzIGFyZSByZXR1cm5lZAogICAgKi8KICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ2V0T3duZXJzKCkgewotICAgIFByb2plY3QuTmFtZUtleSBwYXJlbnROYW1lID0gZ2V0UHJvamVjdCgpLmdldFBhcmVudCgpOwotICAgIGlmICghbG9jYWxPd25lcnMuaXNFbXB0eSgpIHx8IHBhcmVudE5hbWUgPT0gbnVsbCB8fCBpc0FsbFByb2plY3RzKSB7Ci0gICAgICByZXR1cm4gbG9jYWxPd25lcnM7CisgICAgZm9yIChQcm9qZWN0U3RhdGUgcCA6IHRyZWUoKSkgeworICAgICAgaWYgKCFwLmxvY2FsT3duZXJzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gcC5sb2NhbE93bmVyczsKKyAgICAgIH0KICAgICB9Ci0KLSAgICBQcm9qZWN0U3RhdGUgcGFyZW50ID0gcHJvamVjdENhY2hlLmdldChwYXJlbnROYW1lKTsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBwYXJlbnQuZ2V0T3duZXJzKCk7Ci0gICAgfQotCiAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAgIH0KIApAQCAtMjU3LDIzICsyNjMsMTMgQEAKICAgICogQHJldHVybiB0cnVlIGlmIGFueSBvZiB0aGUgZ3JvdXBzIGxpc3RlZCBpbiB7QGNvZGUgZ3JvdXBzfSB3YXMgZGVjbGFyZWQgdG8KICAgICogICAgICAgICBiZSBhbiBvd25lciBvZiB0aGlzIHByb2plY3QsIG9yIG9uZSBvZiBpdHMgcGFyZW50IHByb2plY3RzLi4KICAgICovCi0gIGJvb2xlYW4gaXNPd25lcihHcm91cE1lbWJlcnNoaXAgZ3JvdXBzKSB7Ci0gICAgU2V0PFByb2plY3QuTmFtZUtleT4gc2VlbiA9IG5ldyBIYXNoU2V0PFByb2plY3QuTmFtZUtleT4oKTsKLSAgICBzZWVuLmFkZChnZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpKTsKLQotICAgIFByb2plY3RTdGF0ZSBzID0gdGhpczsKLSAgICBkbyB7Ci0gICAgICBpZiAoZ3JvdXBzLmNvbnRhaW5zQW55T2Yocy5sb2NhbE93bmVycykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgIGJvb2xlYW4gaXNPd25lcihmaW5hbCBHcm91cE1lbWJlcnNoaXAgZ3JvdXBzKSB7CisgICAgcmV0dXJuIEl0ZXJhYmxlcy5hbnkodHJlZSgpLCBuZXcgUHJlZGljYXRlPFByb2plY3RTdGF0ZT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBib29sZWFuIGFwcGx5KFByb2plY3RTdGF0ZSBpbikgeworICAgICAgICByZXR1cm4gZ3JvdXBzLmNvbnRhaW5zQW55T2YoaW4ubG9jYWxPd25lcnMpOwogICAgICAgfQotCi0gICAgICBQcm9qZWN0Lk5hbWVLZXkgcGFyZW50ID0gcy5nZXRQcm9qZWN0KCkuZ2V0UGFyZW50KCk7Ci0gICAgICBpZiAocGFyZW50ID09IG51bGwgfHwgIXNlZW4uYWRkKHBhcmVudCkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBzID0gcHJvamVjdENhY2hlLmdldChwYXJlbnQpOwotICAgIH0gd2hpbGUgKHMgIT0gbnVsbCk7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIH0pOwogICB9CiAKICAgcHVibGljIFByb2plY3RDb250cm9sIGNvbnRyb2xGb3IoZmluYWwgQ3VycmVudFVzZXIgdXNlcikgewpAQCAtMjgxLDE4ICsyNzcsMTA0IEBACiAgIH0KIAogICAvKioKLSAgICogQHJldHVybiBQcm9qZWN0U3RhdGUgb2YgcHJvamVjdCdzIHBhcmVudC4gSWYgdGhlIHByb2plY3QgZG9lcyBub3QgaGF2ZSBhCi0gICAqICAgICAgICAgcGFyZW50LCByZXR1cm4gc3RhdGUgb2YgdGhlIHRvcCBsZXZlbCBwcm9qZWN0LCBBbGwtUHJvamVjdHMuIElmCi0gICAqICAgICAgICAgdGhpcyBwcm9qZWN0IGlzIEFsbC1Qcm9qZWN0cywgcmV0dXJuIG51bGwuCisgICAqIEByZXR1cm4gYW4gaXRlcmFibGUgdGhhdCB3YWxrcyB0aHJvdWdoIHRoaXMgcHJvamVjdCBhbmQgdGhlbiB0aGUgcGFyZW50cyBvZgorICAgKiAgICAgICAgIHRoaXMgcHJvamVjdC4gU3RhcnRzIGZyb20gdGhpcyBwcm9qZWN0IGFuZCBwcm9ncmVzc2VzIHVwIHRoZQorICAgKiAgICAgICAgIGhpZXJhcmNoeSB0byBBbGwtUHJvamVjdHMuCiAgICAqLwotICBwdWJsaWMgUHJvamVjdFN0YXRlIGdldFBhcmVudFN0YXRlKCkgewotICAgIGlmIChpc0FsbFByb2plY3RzKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2plY3RDYWNoZS5nZXQoZ2V0UHJvamVjdCgpLmdldFBhcmVudChhbGxQcm9qZWN0c05hbWUpKTsKKyAgcHVibGljIEl0ZXJhYmxlPFByb2plY3RTdGF0ZT4gdHJlZSgpIHsKKyAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFByb2plY3RTdGF0ZT4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBJdGVyYXRvcjxQcm9qZWN0U3RhdGU+IGl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IFByb2plY3RIaWVyYXJjaHlJdGVyYXRvcigKKyAgICAgICAgICAgIHByb2plY3RDYWNoZSwgYWxsUHJvamVjdHNOYW1lLAorICAgICAgICAgICAgUHJvamVjdFN0YXRlLnRoaXMpOworICAgICAgfQorICAgIH07CisgIH0KKworICAvKioKKyAgICogQHJldHVybiBhbiBpdGVyYWJsZSB0aGF0IHdhbGtzIHRocm91Z2ggdGhlIHBhcmVudHMgb2YgdGhpcyBwcm9qZWN0LiBTdGFydHMKKyAgICogICAgICAgICBmcm9tIHRoZSBpbW1lZGlhdGUgcGFyZW50IG9mIHRoaXMgcHJvamVjdCBhbmQgcHJvZ3Jlc3NlcyB1cCB0aGUKKyAgICogICAgICAgICBoaWVyYXJjaHkgdG8gQWxsLVByb2plY3RzLgorICAgKi8KKyAgcHVibGljIEl0ZXJhYmxlPFByb2plY3RTdGF0ZT4gcGFyZW50cygpIHsKKyAgICByZXR1cm4gSXRlcmFibGVzLnNraXAodHJlZSgpLCAxKTsKICAgfQogCiAgIHB1YmxpYyBib29sZWFuIGlzQWxsUHJvamVjdHMoKSB7CiAgICAgcmV0dXJuIGlzQWxsUHJvamVjdHM7CiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKyAgcHVibGljIGJvb2xlYW4gaXNVc2VDb250cmlidXRvckFncmVlbWVudHMoKSB7CisgICAgcmV0dXJuIGdldEluaGVyaXRhYmxlQm9vbGVhbihuZXcgRnVuY3Rpb248UHJvamVjdCwgSW5oZXJpdGFibGVCb29sZWFuPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIEluaGVyaXRhYmxlQm9vbGVhbiBhcHBseShQcm9qZWN0IGlucHV0KSB7CisgICAgICAgIHJldHVybiBpbnB1dC5nZXRVc2VDb250cmlidXRvckFncmVlbWVudHMoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzVXNlQ29udGVudE1lcmdlKCkgeworICAgIHJldHVybiBnZXRJbmhlcml0YWJsZUJvb2xlYW4obmV3IEZ1bmN0aW9uPFByb2plY3QsIEluaGVyaXRhYmxlQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gYXBwbHkoUHJvamVjdCBpbnB1dCkgeworICAgICAgICByZXR1cm4gaW5wdXQuZ2V0VXNlQ29udGVudE1lcmdlKCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBpc1VzZVNpZ25lZE9mZkJ5KCkgeworICAgIHJldHVybiBnZXRJbmhlcml0YWJsZUJvb2xlYW4obmV3IEZ1bmN0aW9uPFByb2plY3QsIEluaGVyaXRhYmxlQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gYXBwbHkoUHJvamVjdCBpbnB1dCkgeworICAgICAgICByZXR1cm4gaW5wdXQuZ2V0VXNlU2lnbmVkT2ZmQnkoKTsKKyAgICAgIH0KKyAgICB9KTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZUNoYW5nZUlEKCkgeworICAgIHJldHVybiBnZXRJbmhlcml0YWJsZUJvb2xlYW4obmV3IEZ1bmN0aW9uPFByb2plY3QsIEluaGVyaXRhYmxlQm9vbGVhbj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBJbmhlcml0YWJsZUJvb2xlYW4gYXBwbHkoUHJvamVjdCBpbnB1dCkgeworICAgICAgICByZXR1cm4gaW5wdXQuZ2V0UmVxdWlyZUNoYW5nZUlEKCk7CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwdWJsaWMgTGFiZWxUeXBlcyBnZXRMYWJlbFR5cGVzKCkgeworICAgIE1hcDxTdHJpbmcsIExhYmVsVHlwZT4gdHlwZXMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKKyAgICBMaXN0PFByb2plY3RTdGF0ZT4gcHJvamVjdHMgPSBMaXN0cy5uZXdBcnJheUxpc3QodHJlZSgpKTsKKyAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHByb2plY3RzKTsKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBzIDogcHJvamVjdHMpIHsKKyAgICAgIGZvciAoTGFiZWxUeXBlIHR5cGUgOiBzLmdldENvbmZpZygpLmdldExhYmVsU2VjdGlvbnMoKS52YWx1ZXMoKSkgeworICAgICAgICBTdHJpbmcgbG93ZXIgPSB0eXBlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICBMYWJlbFR5cGUgb2xkID0gdHlwZXMuZ2V0KGxvd2VyKTsKKyAgICAgICAgaWYgKG9sZCA9PSBudWxsIHx8IG9sZC5jYW5PdmVycmlkZSgpKSB7CisgICAgICAgICAgdHlwZXMucHV0KGxvd2VyLCB0eXBlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBMaXN0PExhYmVsVHlwZT4gYWxsID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHR5cGVzLnNpemUoKSk7CisgICAgZm9yIChMYWJlbFR5cGUgdHlwZSA6IHR5cGVzLnZhbHVlcygpKSB7CisgICAgICBpZiAoIXR5cGUuZ2V0VmFsdWVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIGFsbC5hZGQodHlwZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgTGFiZWxUeXBlcyhDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGFsbCkpOworICB9CisKKyAgcHJpdmF0ZSBib29sZWFuIGdldEluaGVyaXRhYmxlQm9vbGVhbihGdW5jdGlvbjxQcm9qZWN0LCBJbmhlcml0YWJsZUJvb2xlYW4+IGZ1bmMpIHsKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBzIDogdHJlZSgpKSB7CisgICAgICBzd2l0Y2ggKGZ1bmMuYXBwbHkocy5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgIGNhc2UgVFJVRToKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBGQUxTRToKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgSU5IRVJJVDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdHNDb2xsZWN0aW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUHJvamVjdHNDb2xsZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMDQzOQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9Qcm9qZWN0c0NvbGxlY3Rpb24uamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZWdpc3RyYXRpb24uRHluYW1pY01hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQWNjZXB0c0NyZWF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuSWRTdHJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBQcm9qZWN0c0NvbGxlY3Rpb24gaW1wbGVtZW50cworICAgIFJlc3RDb2xsZWN0aW9uPFRvcExldmVsUmVzb3VyY2UsIFByb2plY3RSZXNvdXJjZT4sCisgICAgQWNjZXB0c0NyZWF0ZTxUb3BMZXZlbFJlc291cmNlPiB7CisgIHByaXZhdGUgZmluYWwgRHluYW1pY01hcDxSZXN0VmlldzxQcm9qZWN0UmVzb3VyY2U+PiB2aWV3czsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxMaXN0UHJvamVjdHM+IGxpc3Q7CisgIHByaXZhdGUgZmluYWwgUHJvamVjdENvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY29udHJvbEZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q3VycmVudFVzZXI+IHVzZXI7CisgIHByaXZhdGUgZmluYWwgQ3JlYXRlUHJvamVjdC5GYWN0b3J5IGNyZWF0ZVByb2plY3RGYWN0b3J5OworCisgIEBJbmplY3QKKyAgUHJvamVjdHNDb2xsZWN0aW9uKER5bmFtaWNNYXA8UmVzdFZpZXc8UHJvamVjdFJlc291cmNlPj4gdmlld3MsCisgICAgICBQcm92aWRlcjxMaXN0UHJvamVjdHM+IGxpc3QsCisgICAgICBQcm9qZWN0Q29udHJvbC5HZW5lcmljRmFjdG9yeSBjb250cm9sRmFjdG9yeSwKKyAgICAgIENyZWF0ZVByb2plY3QuRmFjdG9yeSBmYWN0b3J5LCBQcm92aWRlcjxDdXJyZW50VXNlcj4gdXNlcikgeworICAgIHRoaXMudmlld3MgPSB2aWV3czsKKyAgICB0aGlzLmxpc3QgPSBsaXN0OworICAgIHRoaXMuY29udHJvbEZhY3RvcnkgPSBjb250cm9sRmFjdG9yeTsKKyAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgIHRoaXMuY3JlYXRlUHJvamVjdEZhY3RvcnkgPSBmYWN0b3J5OworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXN0VmlldzxUb3BMZXZlbFJlc291cmNlPiBsaXN0KCkgeworICAgIHJldHVybiBsaXN0LmdldCgpLnNldEZvcm1hdChPdXRwdXRGb3JtYXQuSlNPTik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFByb2plY3RSZXNvdXJjZSBwYXJzZShUb3BMZXZlbFJlc291cmNlIHBhcmVudCwgSWRTdHJpbmcgaWQpCisgICAgICB0aHJvd3MgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgUHJvamVjdFJlc291cmNlIHJzcmMgPSBfcGFyc2UoaWQuZ2V0KCkpOworICAgIGlmIChyc3JjID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGlkKTsKKyAgICB9CisgICAgcmV0dXJuIHJzcmM7CisgIH0KKworICAvKioKKyAgICogUGFyc2VzIGEgcHJvamVjdCBJRCBmcm9tIGEgcmVxdWVzdCBib2R5IGFuZCByZXR1cm5zIHRoZSBwcm9qZWN0LgorICAgKgorICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIHByb2plY3QsIGNhbiBiZSBhIHByb2plY3QgbmFtZQorICAgKiBAcmV0dXJuIHRoZSBwcm9qZWN0CisgICAqIEB0aHJvd3MgVW5wcm9jZXNzYWJsZUVudGl0eUV4Y2VwdGlvbiB0aHJvd24gaWYgdGhlIHByb2plY3QgSUQgY2Fubm90IGJlCisgICAqICAgICAgICAgcmVzb2x2ZWQgb3IgaWYgdGhlIHByb2plY3QgaXMgbm90IHZpc2libGUgdG8gdGhlIGNhbGxpbmcgdXNlcgorICAgKi8KKyAgcHVibGljIFByb2plY3RSZXNvdXJjZSBwYXJzZShTdHJpbmcgaWQpIHRocm93cyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uIHsKKyAgICBQcm9qZWN0UmVzb3VyY2UgcnNyYyA9IF9wYXJzZShpZCk7CisgICAgaWYgKHJzcmMgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiUHJvamVjdCBOb3QgRm91bmQ6ICVzIiwgaWQpKTsKKyAgICB9CisgICAgcmV0dXJuIHJzcmM7CisgIH0KKworICBwcml2YXRlIFByb2plY3RSZXNvdXJjZSBfcGFyc2UoU3RyaW5nIGlkKSB7CisgICAgUHJvamVjdENvbnRyb2wgY3RsOworICAgIHRyeSB7CisgICAgICBjdGwgPSBjb250cm9sRmFjdG9yeS5jb250cm9sRm9yKAorICAgICAgICAgIG5ldyBQcm9qZWN0Lk5hbWVLZXkoaWQpLAorICAgICAgICAgIHVzZXIuZ2V0KCkpOworICAgIH0gY2F0Y2ggKE5vU3VjaFByb2plY3RFeGNlcHRpb24gZSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIGlmICghY3RsLmlzVmlzaWJsZSgpICYmICFjdGwuaXNPd25lcigpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBQcm9qZWN0UmVzb3VyY2UoY3RsKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgRHluYW1pY01hcDxSZXN0VmlldzxQcm9qZWN0UmVzb3VyY2U+PiB2aWV3cygpIHsKKyAgICByZXR1cm4gdmlld3M7CisgIH0KKworICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBDcmVhdGVQcm9qZWN0IGNyZWF0ZShUb3BMZXZlbFJlc291cmNlIHBhcmVudCwgSWRTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBjcmVhdGVQcm9qZWN0RmFjdG9yeS5jcmVhdGUobmFtZS5nZXQoKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9QdXREZXNjcmlwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1B1dERlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkZDNjYgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9QdXREZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5EZWZhdWx0SW5wdXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3BvbnNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0Lk1ldGFEYXRhVXBkYXRlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUHJvamVjdENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5QdXREZXNjcmlwdGlvbi5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db25maWdJbnZhbGlkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2NsYXNzIFB1dERlc2NyaXB0aW9uIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UHJvamVjdFJlc291cmNlLCBJbnB1dD4geworICBzdGF0aWMgY2xhc3MgSW5wdXQgeworICAgIEBEZWZhdWx0SW5wdXQKKyAgICBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgU3RyaW5nIGNvbW1pdE1lc3NhZ2U7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBjYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBNZXRhRGF0YVVwZGF0ZS5TZXJ2ZXIgdXBkYXRlRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBnaXRNZ3I7CisKKyAgQEluamVjdAorICBQdXREZXNjcmlwdGlvbihQcm9qZWN0Q2FjaGUgY2FjaGUsCisgICAgICBNZXRhRGF0YVVwZGF0ZS5TZXJ2ZXIgdXBkYXRlRmFjdG9yeSwKKyAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIGdpdE1ncikgeworICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKKyAgICB0aGlzLnVwZGF0ZUZhY3RvcnkgPSB1cGRhdGVGYWN0b3J5OworICAgIHRoaXMuZ2l0TWdyID0gZ2l0TWdyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPYmplY3QgYXBwbHkoUHJvamVjdFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLAorICAgICAgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICBpbnB1dCA9IG5ldyBJbnB1dCgpOyAvLyBEZWxldGUgd291bGQgc2V0IGRlc2NyaXB0aW9uIHRvIG51bGwuCisgICAgfQorCisgICAgUHJvamVjdENvbnRyb2wgY3RsID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSAoSWRlbnRpZmllZFVzZXIpIGN0bC5nZXRDdXJyZW50VXNlcigpOworICAgIGlmICghY3RsLmlzT3duZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIm5vdCBwcm9qZWN0IG93bmVyIik7CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIE1ldGFEYXRhVXBkYXRlIG1kID0gdXBkYXRlRmFjdG9yeS5jcmVhdGUocmVzb3VyY2UuZ2V0TmFtZUtleSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIFByb2plY3RDb25maWcgY29uZmlnID0gUHJvamVjdENvbmZpZy5yZWFkKG1kKTsKKyAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gY29uZmlnLmdldFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihTdHJpbmdzLmVtcHR5VG9OdWxsKGlucHV0LmRlc2NyaXB0aW9uKSk7CisKKyAgICAgICAgU3RyaW5nIG1zZyA9IE9iamVjdHMuZmlyc3ROb25OdWxsKAorICAgICAgICAgIFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQuY29tbWl0TWVzc2FnZSksCisgICAgICAgICAgIlVwZGF0ZWQgZGVzY3JpcHRpb24uXG4iKTsKKyAgICAgICAgaWYgKCFtc2cuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgICBtc2cgKz0gIlxuIjsKKyAgICAgICAgfQorICAgICAgICBtZC5zZXRBdXRob3IodXNlcik7CisgICAgICAgIG1kLnNldE1lc3NhZ2UobXNnKTsKKyAgICAgICAgY29uZmlnLmNvbW1pdChtZCk7CisgICAgICAgIGNhY2hlLmV2aWN0KGN0bC5nZXRQcm9qZWN0KCkpOworICAgICAgICBnaXRNZ3Iuc2V0UHJvamVjdERlc2NyaXB0aW9uKAorICAgICAgICAgICAgcmVzb3VyY2UuZ2V0TmFtZUtleSgpLAorICAgICAgICAgICAgcHJvamVjdC5nZXREZXNjcmlwdGlvbigpKTsKKworICAgICAgICByZXR1cm4gU3RyaW5ncy5pc051bGxPckVtcHR5KHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSkKKyAgICAgICAgICAgID8gUmVzcG9uc2Uubm9uZSgpCisgICAgICAgICAgICA6IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIG1kLmNsb3NlKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIG5vdEZvdW5kKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihyZXNvdXJjZS5nZXROYW1lKCkpOworICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiaW52YWxpZCBwcm9qZWN0LmNvbmZpZzogJXMiLCBlLmdldE1lc3NhZ2UoKSkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1B1dFByb2plY3QuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9QdXRQcm9qZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5NmNiNQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9QdXRQcm9qZWN0LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc291cmNlQ29uZmxpY3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkNyZWF0ZVByb2plY3QuSW5wdXQ7CisKK3B1YmxpYyBjbGFzcyBQdXRQcm9qZWN0IGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8UHJvamVjdFJlc291cmNlLCBJbnB1dD4geworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShQcm9qZWN0UmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24geworICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKCJQcm9qZWN0IFwiIiArIHJlc291cmNlLmdldE5hbWUoKQorICAgICAgICArICJcIiBhbHJlYWR5IGV4aXN0cyIpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlZkNvbnRyb2wuamF2YQppbmRleCBhNjE4MmQxLi41OWI3NjcwIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SZWZDb250cm9sLmphdmEKQEAgLTE0LDEyICsxNCwxNSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BY2Nlc3NTZWN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJlZkNvbmZpZ1NlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5JbnZhbGlkTmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CkBAIC00MSw2ICs0NCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAKIC8qKiBNYW5hZ2VzIGFjY2VzcyBjb250cm9sIGZvciBHaXQgcmVmZXJlbmNlcyAoYWthIGJyYW5jaGVzLCB0YWdzKS4gKi8KQEAgLTU3LDYgKzYxLDcgQEAKICAgcHJpdmF0ZSBCb29sZWFuIG93bmVyOwogICBwcml2YXRlIEJvb2xlYW4gY2FuRm9yZ2VBdXRob3I7CiAgIHByaXZhdGUgQm9vbGVhbiBjYW5Gb3JnZUNvbW1pdHRlcjsKKyAgcHJpdmF0ZSBCb29sZWFuIGlzVmlzaWJsZTsKIAogICBSZWZDb250cm9sKFByb2plY3RDb250cm9sIHByb2plY3RDb250cm9sLCBTdHJpbmcgcmVmLAogICAgICAgUGVybWlzc2lvbkNvbGxlY3Rpb24gcmVsZXZhbnQpIHsKQEAgLTEwMiw4ICsxMDcsMzEgQEAKIAogICAvKiogQ2FuIHRoaXMgdXNlciBzZWUgdGhpcyByZWZlcmVuY2UgZXhpc3RzPyAqLwogICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgcmV0dXJuIChnZXRDdXJyZW50VXNlcigpIGluc3RhbmNlb2YgSW50ZXJuYWxVc2VyIHx8IGNhblBlcmZvcm0oUGVybWlzc2lvbi5SRUFEKSkKLSAgICAgICAgJiYgY2FuUmVhZCgpOworICAgIGlmIChpc1Zpc2libGUgPT0gbnVsbCkgeworICAgICAgaXNWaXNpYmxlID0KKyAgICAgICAgICAoZ2V0Q3VycmVudFVzZXIoKSBpbnN0YW5jZW9mIEludGVybmFsVXNlciB8fCBjYW5QZXJmb3JtKFBlcm1pc3Npb24uUkVBRCkpCisgICAgICAgICAgICAgICYmIGNhblJlYWQoKTsKKyAgICB9CisgICAgcmV0dXJuIGlzVmlzaWJsZTsKKyAgfQorCisgIC8qKgorICAgKiBUcnVlIGlmIHRoaXMgcmVmZXJlbmNlIGlzIHZpc2libGUgYnkgYWxsIFJFR0lTVEVSRURfVVNFUlMKKyAgICovCisgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZUJ5UmVnaXN0ZXJlZFVzZXJzKCkgeworICAgIExpc3Q8UGVybWlzc2lvblJ1bGU+IGFjY2VzcyA9IHJlbGV2YW50LmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5SRUFEKTsKKyAgICBTZXQ8UHJvamVjdFJlZj4gYWxsb3dzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgU2V0PFByb2plY3RSZWY+IGJsb2NrcyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIGZvciAoUGVybWlzc2lvblJ1bGUgcnVsZSA6IGFjY2VzcykgeworICAgICAgaWYgKHJ1bGUuaXNCbG9jaygpKSB7CisgICAgICAgIGJsb2Nrcy5hZGQocmVsZXZhbnQuZ2V0UnVsZVByb3BzKHJ1bGUpKTsKKyAgICAgIH0gZWxzZSBpZiAocnVsZS5nZXRHcm91cCgpLmdldFVVSUQoKS5lcXVhbHMoQWNjb3VudEdyb3VwLkFOT05ZTU9VU19VU0VSUykKKyAgICAgICAgICB8fCBydWxlLmdldEdyb3VwKCkuZ2V0VVVJRCgpLmVxdWFscyhBY2NvdW50R3JvdXAuUkVHSVNURVJFRF9VU0VSUykpIHsKKyAgICAgICAgYWxsb3dzLmFkZChyZWxldmFudC5nZXRSdWxlUHJvcHMocnVsZSkpOworICAgICAgfQorICAgIH0KKyAgICBibG9ja3MucmVtb3ZlQWxsKGFsbG93cyk7CisgICAgcmV0dXJuIGJsb2Nrcy5pc0VtcHR5KCkgJiYgIWFsbG93cy5pc0VtcHR5KCk7CiAgIH0KIAogICAvKioKQEAgLTE5MywxNiArMjIxLDcgQEAKICAgICAgIC8vIGdyYW50aW5nIG9mIHBvd2VycyBiZXlvbmQgcHVzaGluZyB0byB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBmb3IgKFBlcm1pc3Npb25SdWxlIHJ1bGUgOiBhY2Nlc3MoUGVybWlzc2lvbi5QVVNIKSkgewotICAgICAgaWYgKHJ1bGUuaXNCbG9jaygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChydWxlLmdldEZvcmNlKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY2FuRm9yY2VQZXJmb3JtKFBlcm1pc3Npb24uUFVTSCk7CiAgIH0KIAogICAvKioKQEAgLTIxOCw3ICsyMzcsOCBAQAogICAgIH0KICAgICBib29sZWFuIG93bmVyOwogICAgIHN3aXRjaCAoZ2V0Q3VycmVudFVzZXIoKS5nZXRBY2Nlc3NQYXRoKCkpIHsKLSAgICAgIGNhc2UgV0VCX1VJOgorICAgICAgY2FzZSBSRVNUX0FQSToKKyAgICAgIGNhc2UgSlNPTl9SUEM6CiAgICAgICAgIG93bmVyID0gaXNPd25lcigpOwogICAgICAgICBicmVhazsKIApAQCAtMjU4LDExICsyNzgsMTAgQEAKICAgICAgIC8vIHRoYW4gaWYgaXQgZG9lc24ndCBoYXZlIGEgUEdQIHNpZ25hdHVyZS4KICAgICAgIC8vCiAgICAgICBpZiAodGFnLmdldEZ1bGxNZXNzYWdlKCkuY29udGFpbnMoIi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tXG4iKSkgewotICAgICAgICByZXR1cm4gb3duZXIgfHwgY2FuUGVyZm9ybShQZXJtaXNzaW9uLlBVU0hfVEFHKTsKKyAgICAgICAgcmV0dXJuIG93bmVyIHx8IGNhblBlcmZvcm0oUGVybWlzc2lvbi5QVVNIX1NJR05FRF9UQUcpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIG93bmVyIHx8IGNhblBlcmZvcm0oUGVybWlzc2lvbi5QVVNIX1RBRyk7CiAgICAgICB9Ci0KICAgICB9IGVsc2UgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTI4NSw3ICszMDQsOCBAQAogICAgIH0KIAogICAgIHN3aXRjaCAoZ2V0Q3VycmVudFVzZXIoKS5nZXRBY2Nlc3NQYXRoKCkpIHsKLSAgICAgIGNhc2UgV0VCX1VJOgorICAgICAgY2FzZSBSRVNUX0FQSToKKyAgICAgIGNhc2UgSlNPTl9SUEM6CiAgICAgICAgIHJldHVybiBpc093bmVyKCkgfHwgY2FuUHVzaFdpdGhGb3JjZSgpOwogCiAgICAgICBjYXNlIEdJVDoKQEAgLTMyMiw2ICszNDIsMzYgQEAKICAgICByZXR1cm4gY2FuUGVyZm9ybShQZXJtaXNzaW9uLkFCQU5ET04pOwogICB9CiAKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHVzZXIgY2FuIHJlbW92ZSBhIHJldmlld2VyIGZvciBhIGNoYW5nZS4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlUmV2aWV3ZXIoKSB7CisgICAgcmV0dXJuIGNhblBlcmZvcm0oUGVybWlzc2lvbi5SRU1PVkVfUkVWSUVXRVIpOworICB9CisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHVzZXIgY2FuIHZpZXcgZHJhZnQgY2hhbmdlcy4gKi8KKyAgcHVibGljIGJvb2xlYW4gY2FuVmlld0RyYWZ0cygpIHsKKyAgICByZXR1cm4gY2FuUGVyZm9ybShQZXJtaXNzaW9uLlZJRVdfRFJBRlRTKTsKKyAgfQorCisgIC8qKiBAcmV0dXJuIHRydWUgaWYgdGhpcyB1c2VyIGNhbiBwdWJsaXNoIGRyYWZ0IGNoYW5nZXMuICovCisgIHB1YmxpYyBib29sZWFuIGNhblB1Ymxpc2hEcmFmdHMoKSB7CisgICAgcmV0dXJuIGNhblBlcmZvcm0oUGVybWlzc2lvbi5QVUJMSVNIX0RSQUZUUyk7CisgIH0KKworICAvKiogQHJldHVybiB0cnVlIGlmIHRoaXMgdXNlciBjYW4gZGVsZXRlIGRyYWZ0IGNoYW5nZXMuICovCisgIHB1YmxpYyBib29sZWFuIGNhbkRlbGV0ZURyYWZ0cygpIHsKKyAgICByZXR1cm4gY2FuUGVyZm9ybShQZXJtaXNzaW9uLkRFTEVURV9EUkFGVFMpOworICB9CisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHVzZXIgY2FuIGVkaXQgdG9waWMgbmFtZXMuICovCisgIHB1YmxpYyBib29sZWFuIGNhbkVkaXRUb3BpY05hbWUoKSB7CisgICAgcmV0dXJuIGNhblBlcmZvcm0oUGVybWlzc2lvbi5FRElUX1RPUElDX05BTUUpOworICB9CisKKyAgLyoqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHVzZXIgY2FuIGZvcmNlIGVkaXQgdG9waWMgbmFtZXMuICovCisgIHB1YmxpYyBib29sZWFuIGNhbkZvcmNlRWRpdFRvcGljTmFtZSgpIHsKKyAgICByZXR1cm4gY2FuRm9yY2VQZXJmb3JtKFBlcm1pc3Npb24uRURJVF9UT1BJQ19OQU1FKTsKKyAgfQorCiAgIC8qKiBBbGwgdmFsdWUgcmFuZ2VzIG9mIGFueSBhbGxvd2VkIGxhYmVsIHBlcm1pc3Npb24uICovCiAgIHB1YmxpYyBMaXN0PFBlcm1pc3Npb25SYW5nZT4gZ2V0TGFiZWxSYW5nZXMoKSB7CiAgICAgTGlzdDxQZXJtaXNzaW9uUmFuZ2U+IHIgPSBuZXcgQXJyYXlMaXN0PFBlcm1pc3Npb25SYW5nZT4oKTsKQEAgLTM1MSwzOSArNDAxLDk3IEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBQZXJtaXNzaW9uUmFuZ2UgdG9SYW5nZShTdHJpbmcgcGVybWlzc2lvbk5hbWUsCi0gICAgICBMaXN0PFBlcm1pc3Npb25SdWxlPiBydWxlTGlzdCkgewotICAgIGludCBtaW4gPSAwOwotICAgIGludCBtYXggPSAwOwotICAgIGludCBibG9ja01pbiA9IEludGVnZXIuTUlOX1ZBTFVFOwotICAgIGludCBibG9ja01heCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgIGZvciAoUGVybWlzc2lvblJ1bGUgcnVsZSA6IHJ1bGVMaXN0KSB7CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFsbG93ZWRSYW5nZSB7CisgICAgcHJpdmF0ZSBpbnQgYWxsb3dNaW4gPSAwOworICAgIHByaXZhdGUgaW50IGFsbG93TWF4ID0gMDsKKyAgICBwcml2YXRlIGludCBibG9ja01pbiA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgIHByaXZhdGUgaW50IGJsb2NrTWF4ID0gSW50ZWdlci5NQVhfVkFMVUU7CisKKyAgICB2b2lkIHVwZGF0ZShQZXJtaXNzaW9uUnVsZSBydWxlKSB7CiAgICAgICBpZiAocnVsZS5pc0Jsb2NrKCkpIHsKICAgICAgICAgYmxvY2tNaW4gPSBNYXRoLm1heChibG9ja01pbiwgcnVsZS5nZXRNaW4oKSk7CiAgICAgICAgIGJsb2NrTWF4ID0gTWF0aC5taW4oYmxvY2tNYXgsIHJ1bGUuZ2V0TWF4KCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBydWxlLmdldE1pbigpKTsKLSAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBydWxlLmdldE1heCgpKTsKKyAgICAgICAgYWxsb3dNaW4gPSBNYXRoLm1pbihhbGxvd01pbiwgcnVsZS5nZXRNaW4oKSk7CisgICAgICAgIGFsbG93TWF4ID0gTWF0aC5tYXgoYWxsb3dNYXgsIHJ1bGUuZ2V0TWF4KCkpOwogICAgICAgfQogICAgIH0KLSAgICBpZiAoYmxvY2tNaW4gPiBJbnRlZ2VyLk1JTl9WQUxVRSkgewotICAgICAgbWluID0gTWF0aC5tYXgobWluLCBibG9ja01pbiArIDEpOworCisgICAgaW50IGdldEFsbG93TWluKCkgeworICAgICAgcmV0dXJuIGFsbG93TWluOwogICAgIH0KLSAgICBpZiAoYmxvY2tNYXggPCBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgbWF4ID0gTWF0aC5taW4obWF4LCBibG9ja01heCAtIDEpOworICAgIGludCBnZXRBbGxvd01heCgpIHsKKyAgICAgIHJldHVybiBhbGxvd01heDsKICAgICB9CisgICAgaW50IGdldEJsb2NrTWluKCkgeworICAgICAgLy8gQUxMT1cgd2lucyBvdmVyIEJMT0NLIG9uIHRoZSBzYW1lIHByb2plY3QKKyAgICAgIHJldHVybiBNYXRoLm1pbihibG9ja01pbiwgYWxsb3dNaW4gLSAxKTsKKyAgICB9CisgICAgaW50IGdldEJsb2NrTWF4KCkgeworICAgICAgLy8gQUxMT1cgd2lucyBvdmVyIEJMT0NLIG9uIHRoZSBzYW1lIHByb2plY3QKKyAgICAgIHJldHVybiBNYXRoLm1heChibG9ja01heCwgYWxsb3dNYXggKyAxKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFBlcm1pc3Npb25SYW5nZSB0b1JhbmdlKFN0cmluZyBwZXJtaXNzaW9uTmFtZSwKKyAgICAgIExpc3Q8UGVybWlzc2lvblJ1bGU+IHJ1bGVMaXN0KSB7CisgICAgTWFwPFByb2plY3RSZWYsIEFsbG93ZWRSYW5nZT4gcmFuZ2VzID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChQZXJtaXNzaW9uUnVsZSBydWxlIDogcnVsZUxpc3QpIHsKKyAgICAgIFByb2plY3RSZWYgcCA9IHJlbGV2YW50LmdldFJ1bGVQcm9wcyhydWxlKTsKKyAgICAgIEFsbG93ZWRSYW5nZSByID0gcmFuZ2VzLmdldChwKTsKKyAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgciA9IG5ldyBBbGxvd2VkUmFuZ2UoKTsKKyAgICAgICAgcmFuZ2VzLnB1dChwLCByKTsKKyAgICAgIH0KKyAgICAgIHIudXBkYXRlKHJ1bGUpOworICAgIH0KKyAgICBpbnQgYWxsb3dNaW4gPSAwOworICAgIGludCBhbGxvd01heCA9IDA7CisgICAgaW50IGJsb2NrTWluID0gSW50ZWdlci5NSU5fVkFMVUU7CisgICAgaW50IGJsb2NrTWF4ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgZm9yIChBbGxvd2VkUmFuZ2UgciA6IHJhbmdlcy52YWx1ZXMoKSkgeworICAgICAgYWxsb3dNaW4gPSBNYXRoLm1pbihhbGxvd01pbiwgci5nZXRBbGxvd01pbigpKTsKKyAgICAgIGFsbG93TWF4ID0gTWF0aC5tYXgoYWxsb3dNYXgsIHIuZ2V0QWxsb3dNYXgoKSk7CisgICAgICBibG9ja01pbiA9IE1hdGgubWF4KGJsb2NrTWluLCByLmdldEJsb2NrTWluKCkpOworICAgICAgYmxvY2tNYXggPSBNYXRoLm1pbihibG9ja01heCwgci5nZXRCbG9ja01heCgpKTsKKyAgICB9CisKKyAgICAvLyBCTE9DSyB3aW5zIG92ZXIgQUxMT1cgYWNyb3NzIHByb2plY3RzCisgICAgaW50IG1pbiA9IE1hdGgubWF4KGFsbG93TWluLCBibG9ja01pbiArIDEpOworICAgIGludCBtYXggPSBNYXRoLm1pbihhbGxvd01heCwgYmxvY2tNYXggLSAxKTsKICAgICByZXR1cm4gbmV3IFBlcm1pc3Npb25SYW5nZShwZXJtaXNzaW9uTmFtZSwgbWluLCBtYXgpOwogICB9CiAKICAgLyoqIFRydWUgaWYgdGhlIHVzZXIgaGFzIHRoaXMgcGVybWlzc2lvbi4gV29ya3Mgb25seSBmb3Igbm9uIGxhYmVscy4gKi8KICAgYm9vbGVhbiBjYW5QZXJmb3JtKFN0cmluZyBwZXJtaXNzaW9uTmFtZSkgewogICAgIExpc3Q8UGVybWlzc2lvblJ1bGU+IGFjY2VzcyA9IGFjY2VzcyhwZXJtaXNzaW9uTmFtZSk7CisgICAgU2V0PFByb2plY3RSZWY+IGFsbG93cyA9IFNldHMubmV3SGFzaFNldCgpOworICAgIFNldDxQcm9qZWN0UmVmPiBibG9ja3MgPSBTZXRzLm5ld0hhc2hTZXQoKTsKICAgICBmb3IgKFBlcm1pc3Npb25SdWxlIHJ1bGUgOiBhY2Nlc3MpIHsKICAgICAgIGlmIChydWxlLmlzQmxvY2soKSAmJiAhcnVsZS5nZXRGb3JjZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYmxvY2tzLmFkZChyZWxldmFudC5nZXRSdWxlUHJvcHMocnVsZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYWxsb3dzLmFkZChyZWxldmFudC5nZXRSdWxlUHJvcHMocnVsZSkpOwogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gIWFjY2Vzcy5pc0VtcHR5KCk7CisgICAgYmxvY2tzLnJlbW92ZUFsbChhbGxvd3MpOworICAgIHJldHVybiBibG9ja3MuaXNFbXB0eSgpICYmICFhbGxvd3MuaXNFbXB0eSgpOworICB9CisKKyAgLyoqIFRydWUgaWYgdGhlIHVzZXIgaGFzIGZvcmNlIHRoaXMgcGVybWlzc2lvbi4gV29ya3Mgb25seSBmb3Igbm9uIGxhYmVscy4gKi8KKyAgcHJpdmF0ZSBib29sZWFuIGNhbkZvcmNlUGVyZm9ybShTdHJpbmcgcGVybWlzc2lvbk5hbWUpIHsKKyAgICBMaXN0PFBlcm1pc3Npb25SdWxlPiBhY2Nlc3MgPSBhY2Nlc3MocGVybWlzc2lvbk5hbWUpOworICAgIFNldDxQcm9qZWN0UmVmPiBhbGxvd3MgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICBTZXQ8UHJvamVjdFJlZj4gYmxvY2tzID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgZm9yIChQZXJtaXNzaW9uUnVsZSBydWxlIDogYWNjZXNzKSB7CisgICAgICBpZiAocnVsZS5pc0Jsb2NrKCkpIHsKKyAgICAgICAgYmxvY2tzLmFkZChyZWxldmFudC5nZXRSdWxlUHJvcHMocnVsZSkpOworICAgICAgfSBlbHNlIGlmIChydWxlLmdldEZvcmNlKCkpIHsKKyAgICAgICAgYWxsb3dzLmFkZChyZWxldmFudC5nZXRSdWxlUHJvcHMocnVsZSkpOworICAgICAgfQorICAgIH0KKyAgICBibG9ja3MucmVtb3ZlQWxsKGFsbG93cyk7CisgICAgcmV0dXJuIGJsb2Nrcy5pc0VtcHR5KCkgJiYgIWFsbG93cy5pc0VtcHR5KCk7CiAgIH0KIAogICAvKiogUnVsZXMgZm9yIHRoZSBnaXZlbiBwZXJtaXNzaW9uLCBvciB0aGUgZW1wdHkgbGlzdC4gKi8KQEAgLTQyOCw3ICs1MzYsMTIgQEAKIAogICBwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVzdEV4YW1wbGUoU3RyaW5nIHBhdHRlcm4pIHsKICAgICBpZiAoaXNSRShwYXR0ZXJuKSkgewotICAgICAgcmV0dXJuIHRvUmVnRXhwKHBhdHRlcm4pLnRvQXV0b21hdG9uKCkuZ2V0U2hvcnRlc3RFeGFtcGxlKHRydWUpOworICAgICAgLy8gU2luY2UgQnJpY3Mgd2lsbCBzdWJzdGl0dXRlIGRvdCBbLl0gd2l0aCBcMCB3aGVuIGdlbmVyYXRpbmcKKyAgICAgIC8vIHNob3J0ZXN0IGV4YW1wbGUsIGFueSB1c2FnZSBvZiBkb3Qgd2lsbCBmYWlsIGluCisgICAgICAvLyBSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKCkgaWYgbm90IGNvbWJpbmVkIHdpdGggc3RhciBbKl0uCisgICAgICAvLyBUbyBnZXQgYXJvdW5kIHRoaXMsIHdlIHN1YnN0aXR1dGUgdGhlIFwwIHdpdGggYW4gYXJiaXRyYXJ5CisgICAgICAvLyBhY2NlcHRlZCBjaGFyYWN0ZXIuCisgICAgICByZXR1cm4gdG9SZWdFeHAocGF0dGVybikudG9BdXRvbWF0b24oKS5nZXRTaG9ydGVzdEV4YW1wbGUodHJ1ZSkucmVwbGFjZSgnXDAnLCAnLScpOwogICAgIH0gZWxzZSBpZiAocGF0dGVybi5lbmRzV2l0aCgiLyoiKSkgewogICAgICAgcmV0dXJuIHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCkgLSAxKSArICcxJzsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlcG9zaXRvcnlTdGF0aXN0aWNzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVwb3NpdG9yeVN0YXRpc3RpY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODI5NGMwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlcG9zaXRvcnlTdGF0aXN0aWNzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DYXNlRm9ybWF0OworCitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworY2xhc3MgUmVwb3NpdG9yeVN0YXRpc3RpY3MgZXh0ZW5kcyBUcmVlTWFwPFN0cmluZywgT2JqZWN0PiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIHB1YmxpYyBSZXBvc2l0b3J5U3RhdGlzdGljcyhQcm9wZXJ0aWVzIHApIHsKKyAgICBmb3IgKEVudHJ5PE9iamVjdCwgT2JqZWN0PiBlIDogcC5lbnRyeVNldCgpKSB7CisgICAgICBwdXQoQ2FzZUZvcm1hdC5MT1dFUl9DQU1FTC50byhDYXNlRm9ybWF0LkxPV0VSX1VOREVSU0NPUkUsCisgICAgICAgICAgZS5nZXRLZXkoKS50b1N0cmluZygpKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SdWxlRXZhbEV4Y2VwdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1J1bGVFdmFsRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhZTExYwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9SdWxlRXZhbEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCitwdWJsaWMgY2xhc3MgUnVsZUV2YWxFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworICBwdWJsaWMgUnVsZUV2YWxFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgfQorCisgIFJ1bGVFdmFsRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TZWN0aW9uTWF0Y2hlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NlY3Rpb25NYXRjaGVyLmphdmEKaW5kZXggMWM3MGIwNC4uNmY4YWY4MCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NlY3Rpb25NYXRjaGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NlY3Rpb25NYXRjaGVyLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY2Vzc1NlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGFyYW1ldGVyaXplZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKIAogaW1wb3J0IGRrLmJyaWNzLmF1dG9tYXRvbi5BdXRvbWF0b247CiAKQEAgLTMxLDMzICszMiwzNyBAQAogICogZmFzdGVyIHNlbGVjdGlvbiBvZiB3aGljaCBzZWN0aW9ucyBhcmUgcmVsZXZhbnQgdG8gYW55IGdpdmVuIGlucHV0IHJlZmVyZW5jZS4KICAqLwogYWJzdHJhY3QgY2xhc3MgU2VjdGlvbk1hdGNoZXIgewotICBzdGF0aWMgU2VjdGlvbk1hdGNoZXIgd3JhcChBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKKyAgc3RhdGljIFNlY3Rpb25NYXRjaGVyIHdyYXAoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgewogICAgIFN0cmluZyByZWYgPSBzZWN0aW9uLmdldE5hbWUoKTsKICAgICBpZiAoQWNjZXNzU2VjdGlvbi5pc1ZhbGlkKHJlZikpIHsKLSAgICAgIHJldHVybiB3cmFwKHJlZiwgc2VjdGlvbik7CisgICAgICByZXR1cm4gd3JhcChwcm9qZWN0LCByZWYsIHNlY3Rpb24pOwogICAgIH0gZWxzZSB7CiAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAgIH0KIAotICBzdGF0aWMgU2VjdGlvbk1hdGNoZXIgd3JhcChTdHJpbmcgcGF0dGVybiwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7CisgIHN0YXRpYyBTZWN0aW9uTWF0Y2hlciB3cmFwKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgcGF0dGVybiwKKyAgICAgIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgewogICAgIGlmIChwYXR0ZXJuLmNvbnRhaW5zKCIkeyIpKSB7Ci0gICAgICByZXR1cm4gbmV3IEV4cGFuZFBhcmFtZXRlcnMocGF0dGVybiwgc2VjdGlvbik7CisgICAgICByZXR1cm4gbmV3IEV4cGFuZFBhcmFtZXRlcnMocHJvamVjdCwgcGF0dGVybiwgc2VjdGlvbik7CiAKICAgICB9IGVsc2UgaWYgKGlzUkUocGF0dGVybikpIHsKLSAgICAgIHJldHVybiBuZXcgUmVnZXhwKHBhdHRlcm4sIHNlY3Rpb24pOworICAgICAgcmV0dXJuIG5ldyBSZWdleHAocHJvamVjdCwgcGF0dGVybiwgc2VjdGlvbik7CiAKICAgICB9IGVsc2UgaWYgKHBhdHRlcm4uZW5kc1dpdGgoIi8qIikpIHsKLSAgICAgIHJldHVybiBuZXcgUHJlZml4KHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCkgLSAxKSwgc2VjdGlvbik7CisgICAgICByZXR1cm4gbmV3IFByZWZpeChwcm9qZWN0LCBwYXR0ZXJuLnN1YnN0cmluZygwLCBwYXR0ZXJuLmxlbmd0aCgpIC0gMSksCisgICAgICAgICAgc2VjdGlvbik7CiAKICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBFeGFjdChwYXR0ZXJuLCBzZWN0aW9uKTsKKyAgICAgIHJldHVybiBuZXcgRXhhY3QocHJvamVjdCwgcGF0dGVybiwgc2VjdGlvbik7CiAgICAgfQogICB9CiAKKyAgZmluYWwgUHJvamVjdC5OYW1lS2V5IHByb2plY3Q7CiAgIGZpbmFsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbjsKIAotICBTZWN0aW9uTWF0Y2hlcihBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKKyAgU2VjdGlvbk1hdGNoZXIoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgdGhpcy5zZWN0aW9uID0gc2VjdGlvbjsKICAgfQogCkBAIC02Niw4ICs3MSw4IEBACiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4YWN0IGV4dGVuZHMgU2VjdGlvbk1hdGNoZXIgewogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGV4cGVjdDsKIAotICAgIEV4YWN0KFN0cmluZyBuYW1lLCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKLSAgICAgIHN1cGVyKHNlY3Rpb24pOworICAgIEV4YWN0KFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgbmFtZSwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7CisgICAgICBzdXBlcihwcm9qZWN0LCBzZWN0aW9uKTsKICAgICAgIGV4cGVjdCA9IG5hbWU7CiAgICAgfQogCkBAIC04MCw4ICs4NSw4IEBACiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByZWZpeCBleHRlbmRzIFNlY3Rpb25NYXRjaGVyIHsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcmVmaXg7CiAKLSAgICBQcmVmaXgoU3RyaW5nIHBmeCwgQWNjZXNzU2VjdGlvbiBzZWN0aW9uKSB7Ci0gICAgICBzdXBlcihzZWN0aW9uKTsKKyAgICBQcmVmaXgoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFN0cmluZyBwZngsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICAgICAgc3VwZXIocHJvamVjdCwgc2VjdGlvbik7CiAgICAgICBwcmVmaXggPSBwZng7CiAgICAgfQogCkBAIC05NCw4ICs5OSw4IEBACiAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZ2V4cCBleHRlbmRzIFNlY3Rpb25NYXRjaGVyIHsKICAgICBwcml2YXRlIGZpbmFsIFBhdHRlcm4gcGF0dGVybjsKIAotICAgIFJlZ2V4cChTdHJpbmcgcmUsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgewotICAgICAgc3VwZXIoc2VjdGlvbik7CisgICAgUmVnZXhwKFByb2plY3QuTmFtZUtleSBwcm9qZWN0LCBTdHJpbmcgcmUsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbikgeworICAgICAgc3VwZXIocHJvamVjdCwgc2VjdGlvbik7CiAgICAgICBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHJlKTsKICAgICB9CiAKQEAgLTEwOSw4ICsxMTQsOSBAQAogICAgIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyaXplZFN0cmluZyB0ZW1wbGF0ZTsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcmVmaXg7CiAKLSAgICBFeHBhbmRQYXJhbWV0ZXJzKFN0cmluZyBwYXR0ZXJuLCBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKLSAgICAgIHN1cGVyKHNlY3Rpb24pOworICAgIEV4cGFuZFBhcmFtZXRlcnMoUHJvamVjdC5OYW1lS2V5IHByb2plY3QsIFN0cmluZyBwYXR0ZXJuLAorICAgICAgICBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24pIHsKKyAgICAgIHN1cGVyKHByb2plY3QsIHNlY3Rpb24pOwogICAgICAgdGVtcGxhdGUgPSBuZXcgUGFyYW1ldGVyaXplZFN0cmluZyhwYXR0ZXJuKTsKIAogICAgICAgaWYgKGlzUkUocGF0dGVybikpIHsKQEAgLTE0MSw3ICsxNDcsNyBAQAogICAgICAgICB1ID0gdXNlcm5hbWU7CiAgICAgICB9CiAKLSAgICAgIFNlY3Rpb25NYXRjaGVyIG5leHQgPSB3cmFwKAorICAgICAgU2VjdGlvbk1hdGNoZXIgbmV4dCA9IHdyYXAocHJvamVjdCwKICAgICAgICAgICB0ZW1wbGF0ZS5yZXBsYWNlKENvbGxlY3Rpb25zLnNpbmdsZXRvbk1hcCgidXNlcm5hbWUiLCB1KSksCiAgICAgICAgICAgc2VjdGlvbik7CiAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsID8gbmV4dC5tYXRjaChyZWYsIHVzZXJuYW1lKSA6IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldERhc2hib2FyZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldERhc2hib2FyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMGRhMTIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0RGFzaGJvYXJkLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuTWV0aG9kTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuU2V0RGFzaGJvYXJkLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworY2xhc3MgU2V0RGFzaGJvYXJkIGltcGxlbWVudHMgUmVzdE1vZGlmeVZpZXc8RGFzaGJvYXJkUmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBpZDsKKyAgICBTdHJpbmcgY29tbWl0TWVzc2FnZTsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U2V0RGVmYXVsdERhc2hib2FyZD4gZGVmYXVsdFNldHRlcjsKKworICBASW5qZWN0CisgIFNldERhc2hib2FyZChQcm92aWRlcjxTZXREZWZhdWx0RGFzaGJvYXJkPiBkZWZhdWx0U2V0dGVyKSB7CisgICAgdGhpcy5kZWZhdWx0U2V0dGVyID0gZGVmYXVsdFNldHRlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KERhc2hib2FyZFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLAorICAgICAgRXhjZXB0aW9uIHsKKyAgICBpZiAocmVzb3VyY2UuaXNQcm9qZWN0RGVmYXVsdCgpKSB7CisgICAgICByZXR1cm4gZGVmYXVsdFNldHRlci5nZXQoKS5hcHBseShyZXNvdXJjZSwgaW5wdXQpOworICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCBjcmVhdGlvbi91cGRhdGUgb2YgZGFzaGJvYXJkcyBieSBBUEkuCisgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldERlZmF1bHREYXNoYm9hcmQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TZXREZWZhdWx0RGFzaGJvYXJkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3MGJjMgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TZXREZWZhdWx0RGFzaGJvYXJkLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLklkU3RyaW5nOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNwb25zZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWV0YURhdGFVcGRhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Qcm9qZWN0Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkRhc2hib2FyZHNDb2xsZWN0aW9uLkRhc2hib2FyZEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuU2V0RGFzaGJvYXJkLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2NsYXNzIFNldERlZmF1bHREYXNoYm9hcmQgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxEYXNoYm9hcmRSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgcHJpdmF0ZSBmaW5hbCBQcm9qZWN0Q2FjaGUgY2FjaGU7CisgIHByaXZhdGUgZmluYWwgTWV0YURhdGFVcGRhdGUuU2VydmVyIHVwZGF0ZUZhY3Rvcnk7CisgIHByaXZhdGUgZmluYWwgRGFzaGJvYXJkc0NvbGxlY3Rpb24gZGFzaGJvYXJkczsKKyAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxHZXREYXNoYm9hcmQ+IGdldDsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1pbmhlcml0ZWQiLCB1c2FnZSA9ICJzZXQgZGFzaGJvYXJkIGluaGVyaXRlZCBieSBjaGlsZHJlbiIpCisgIHByaXZhdGUgYm9vbGVhbiBpbmhlcml0ZWQ7CisKKyAgQEluamVjdAorICBTZXREZWZhdWx0RGFzaGJvYXJkKFByb2plY3RDYWNoZSBjYWNoZSwKKyAgICAgIE1ldGFEYXRhVXBkYXRlLlNlcnZlciB1cGRhdGVGYWN0b3J5LAorICAgICAgRGFzaGJvYXJkc0NvbGxlY3Rpb24gZGFzaGJvYXJkcywKKyAgICAgIFByb3ZpZGVyPEdldERhc2hib2FyZD4gZ2V0KSB7CisgICAgdGhpcy5jYWNoZSA9IGNhY2hlOworICAgIHRoaXMudXBkYXRlRmFjdG9yeSA9IHVwZGF0ZUZhY3Rvcnk7CisgICAgdGhpcy5kYXNoYm9hcmRzID0gZGFzaGJvYXJkczsKKyAgICB0aGlzLmdldCA9IGdldDsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgT2JqZWN0IGFwcGx5KERhc2hib2FyZFJlc291cmNlIHJlc291cmNlLCBJbnB1dCBpbnB1dCkKKyAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLAorICAgICAgRXhjZXB0aW9uIHsKKyAgICBpZiAoaW5wdXQgPT0gbnVsbCkgeworICAgICAgaW5wdXQgPSBuZXcgSW5wdXQoKTsgLy8gRGVsZXRlIHdvdWxkIHNldCBpbnB1dCB0byBudWxsLgorICAgIH0KKyAgICBpbnB1dC5pZCA9IFN0cmluZ3MuZW1wdHlUb051bGwoaW5wdXQuaWQpOworCisgICAgUHJvamVjdENvbnRyb2wgY3RsID0gcmVzb3VyY2UuZ2V0Q29udHJvbCgpOworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSAoSWRlbnRpZmllZFVzZXIpIGN0bC5nZXRDdXJyZW50VXNlcigpOworICAgIGlmICghY3RsLmlzT3duZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oIm5vdCBwcm9qZWN0IG93bmVyIik7CisgICAgfQorCisgICAgRGFzaGJvYXJkUmVzb3VyY2UgdGFyZ2V0ID0gbnVsbDsKKyAgICBpZiAoaW5wdXQuaWQgIT0gbnVsbCkgeworICAgICAgdHJ5IHsKKyAgICAgICAgdGFyZ2V0ID0gZGFzaGJvYXJkcy5wYXJzZSgKKyAgICAgICAgICAgIG5ldyBQcm9qZWN0UmVzb3VyY2UoY3RsKSwKKyAgICAgICAgICAgIElkU3RyaW5nLmZyb21VcmwoaW5wdXQuaWQpKTsKKyAgICAgIH0gY2F0Y2ggKFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiZGFzaGJvYXJkICIgKyBpbnB1dC5pZCArICIgbm90IGZvdW5kIik7CisgICAgICB9CisgICAgfQorCisgICAgdHJ5IHsKKyAgICAgIE1ldGFEYXRhVXBkYXRlIG1kID0gdXBkYXRlRmFjdG9yeS5jcmVhdGUoY3RsLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpOworICAgICAgdHJ5IHsKKyAgICAgICAgUHJvamVjdENvbmZpZyBjb25maWcgPSBQcm9qZWN0Q29uZmlnLnJlYWQobWQpOworICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBjb25maWcuZ2V0UHJvamVjdCgpOworICAgICAgICBpZiAoaW5oZXJpdGVkKSB7CisgICAgICAgICAgcHJvamVjdC5zZXREZWZhdWx0RGFzaGJvYXJkKGlucHV0LmlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcm9qZWN0LnNldExvY2FsRGVmYXVsdERhc2hib2FyZChpbnB1dC5pZCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbXNnID0gT2JqZWN0cy5maXJzdE5vbk51bGwoCisgICAgICAgICAgU3RyaW5ncy5lbXB0eVRvTnVsbChpbnB1dC5jb21taXRNZXNzYWdlKSwKKyAgICAgICAgICBpbnB1dC5pZCA9PSBudWxsCisgICAgICAgICAgICA/ICJSZW1vdmVkIGRlZmF1bHQgZGFzaGJvYXJkLlxuIgorICAgICAgICAgICAgOiBTdHJpbmcuZm9ybWF0KCJDaGFuZ2VkIGRlZmF1bHQgZGFzaGJvYXJkIHRvICVzLlxuIiwgaW5wdXQuaWQpKTsKKyAgICAgICAgaWYgKCFtc2cuZW5kc1dpdGgoIlxuIikpIHsKKyAgICAgICAgICBtc2cgKz0gIlxuIjsKKyAgICAgICAgfQorICAgICAgICBtZC5zZXRBdXRob3IodXNlcik7CisgICAgICAgIG1kLnNldE1lc3NhZ2UobXNnKTsKKyAgICAgICAgY29uZmlnLmNvbW1pdChtZCk7CisgICAgICAgIGNhY2hlLmV2aWN0KGN0bC5nZXRQcm9qZWN0KCkpOworCisgICAgICAgIGlmICh0YXJnZXQgIT0gbnVsbCkgeworICAgICAgICAgIERhc2hib2FyZEluZm8gaW5mbyA9IGdldC5nZXQoKS5hcHBseSh0YXJnZXQpOworICAgICAgICAgIGluZm8uaXNEZWZhdWx0ID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gaW5mbzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9uZSgpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgbWQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gbm90Rm91bmQpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKGN0bC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKKyAgICB9IGNhdGNoIChDb25maWdJbnZhbGlkRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgImludmFsaWQgcHJvamVjdC5jb25maWc6ICVzIiwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY2xhc3MgQ3JlYXRlRGVmYXVsdCBpbXBsZW1lbnRzCisgICAgICBSZXN0TW9kaWZ5VmlldzxQcm9qZWN0UmVzb3VyY2UsIFNldERhc2hib2FyZC5JbnB1dD4geworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8U2V0RGVmYXVsdERhc2hib2FyZD4gc2V0RGVmYXVsdDsKKworICAgIEBPcHRpb24obmFtZSA9ICItLWluaGVyaXRlZCIsIHVzYWdlID0gInNldCBkYXNoYm9hcmQgaW5oZXJpdGVkIGJ5IGNoaWxkcmVuIikKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5oZXJpdGVkOworCisgICAgQEluamVjdAorICAgIENyZWF0ZURlZmF1bHQoUHJvdmlkZXI8U2V0RGVmYXVsdERhc2hib2FyZD4gc2V0RGVmYXVsdCkgeworICAgICAgdGhpcy5zZXREZWZhdWx0ID0gc2V0RGVmYXVsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KFByb2plY3RSZXNvdXJjZSByZXNvdXJjZSwgSW5wdXQgaW5wdXQpCisgICAgICAgIHRocm93cyBBdXRoRXhjZXB0aW9uLCBCYWRSZXF1ZXN0RXhjZXB0aW9uLCBSZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uLAorICAgICAgICBFeGNlcHRpb24geworICAgICAgU2V0RGVmYXVsdERhc2hib2FyZCBzZXQgPSBzZXREZWZhdWx0LmdldCgpOworICAgICAgc2V0LmluaGVyaXRlZCA9IGluaGVyaXRlZDsKKyAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKHNldC5hcHBseSgKKyAgICAgICAgICBEYXNoYm9hcmRSZXNvdXJjZS5wcm9qZWN0RGVmYXVsdChyZXNvdXJjZS5nZXRDb250cm9sKCkpLAorICAgICAgICAgIGlucHV0KSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0SGVhZC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldEhlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdhNDJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldEhlYWQuamF2YQpAQCAtMCwwICsxLDk3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkRlZmF1bHRJbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hdXRoLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TZXRIZWFkLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmVXBkYXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgU2V0SGVhZCBpbXBsZW1lbnRzIFJlc3RNb2RpZnlWaWV3PFByb2plY3RSZXNvdXJjZSwgSW5wdXQ+IHsKKyAgc3RhdGljIGNsYXNzIElucHV0IHsKKyAgICBARGVmYXVsdElucHV0CisgICAgU3RyaW5nIHJlZjsKKyAgfQorCisgIHByaXZhdGUgZmluYWwgR2l0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7CisgIHByaXZhdGUgZmluYWwgSWRlbnRpZmllZFVzZXIgaWRlbnRpZmllZFVzZXI7CisKKyAgQEluamVjdAorICBTZXRIZWFkKEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyLCBJZGVudGlmaWVkVXNlciBpZGVudGlmaWVkVXNlcikgeworICAgIHRoaXMucmVwb01hbmFnZXIgPSByZXBvTWFuYWdlcjsKKyAgICB0aGlzLmlkZW50aWZpZWRVc2VyID0gaWRlbnRpZmllZFVzZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBhcHBseShQcm9qZWN0UmVzb3VyY2UgcnNyYywgSW5wdXQgaW5wdXQpIHRocm93cyBBdXRoRXhjZXB0aW9uLAorICAgICAgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiwgQmFkUmVxdWVzdEV4Y2VwdGlvbiwKKyAgICAgIFVucHJvY2Vzc2FibGVFbnRpdHlFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBpZiAoIXJzcmMuZ2V0Q29udHJvbCgpLmlzT3duZXIoKSkgeworICAgICAgdGhyb3cgbmV3IEF1dGhFeGNlcHRpb24oInJlc3RyaWN0ZWQgdG8gcHJvamVjdCBvd25lciIpOworICAgIH0KKyAgICBpZiAoaW5wdXQgPT0gbnVsbCB8fCBTdHJpbmdzLmlzTnVsbE9yRW1wdHkoaW5wdXQucmVmKSkgeworICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oInJlZiByZXF1aXJlZCIpOworICAgIH0KKyAgICBTdHJpbmcgcmVmID0gaW5wdXQucmVmOworICAgIGlmICghcmVmLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfUkVGUykpIHsKKyAgICAgIHJlZiA9IENvbnN0YW50cy5SX0hFQURTICsgcmVmOworICAgIH0KKworICAgIFJlcG9zaXRvcnkgcmVwbyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHJlcG8gPSByZXBvTWFuYWdlci5vcGVuUmVwb3NpdG9yeShyc3JjLmdldE5hbWVLZXkoKSk7CisgICAgICBpZiAocmVwby5nZXRSZWYocmVmKSA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBVbnByb2Nlc3NhYmxlRW50aXR5RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiUmVmIE5vdCBGb3VuZDogJXMiLCByZWYpKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFyZXBvLmdldFJlZihDb25zdGFudHMuSEVBRCkuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpLmVxdWFscyhyZWYpKSB7CisgICAgICAgIGZpbmFsIFJlZlVwZGF0ZSB1ID0gcmVwby51cGRhdGVSZWYoQ29uc3RhbnRzLkhFQUQsIHRydWUpOworICAgICAgICB1LnNldFJlZkxvZ0lkZW50KGlkZW50aWZpZWRVc2VyLm5ld1JlZkxvZ0lkZW50KCkpOworICAgICAgICBSZWZVcGRhdGUuUmVzdWx0IHJlcyA9IHUubGluayhyZWYpOworICAgICAgICBzd2l0Y2gocmVzKSB7CisgICAgICAgICAgY2FzZSBOT19DSEFOR0U6CisgICAgICAgICAgY2FzZSBSRU5BTUVEOgorICAgICAgICAgIGNhc2UgRk9SQ0VEOgorICAgICAgICAgIGNhc2UgTkVXOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU2V0dGluZyBIRUFEIGZhaWxlZCB3aXRoICIgKyByZXMpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVmOworICAgIH0gY2F0Y2ggKFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihyc3JjLmdldE5hbWUoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChyZXBvICE9IG51bGwpIHsKKyAgICAgICAgcmVwby5jbG9zZSgpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldFBhcmVudC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1NldFBhcmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZmI1ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvU2V0UGFyZW50LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQXV0aEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuRGVmYXVsdElucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXN0TW9kaWZ5VmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuU2V0UGFyZW50LklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworCitjbGFzcyBTZXRQYXJlbnQgaW1wbGVtZW50cyBSZXN0TW9kaWZ5VmlldzxQcm9qZWN0UmVzb3VyY2UsIElucHV0PiB7CisgIHN0YXRpYyBjbGFzcyBJbnB1dCB7CisgICAgQERlZmF1bHRJbnB1dAorICAgIFN0cmluZyBwYXJlbnQ7CisgICAgU3RyaW5nIGNvbW1pdE1lc3NhZ2U7CisgIH0KKworICBwcml2YXRlIGZpbmFsIFByb2plY3RDYWNoZSBjYWNoZTsKKyAgcHJpdmF0ZSBmaW5hbCBNZXRhRGF0YVVwZGF0ZS5TZXJ2ZXIgdXBkYXRlRmFjdG9yeTsKKyAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHM7CisKKyAgQEluamVjdAorICBTZXRQYXJlbnQoUHJvamVjdENhY2hlIGNhY2hlLAorICAgICAgTWV0YURhdGFVcGRhdGUuU2VydmVyIHVwZGF0ZUZhY3RvcnksCisgICAgICBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHMpIHsKKyAgICB0aGlzLmNhY2hlID0gY2FjaGU7CisgICAgdGhpcy51cGRhdGVGYWN0b3J5ID0gdXBkYXRlRmFjdG9yeTsKKyAgICB0aGlzLmFsbFByb2plY3RzID0gYWxsUHJvamVjdHM7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBhcHBseShQcm9qZWN0UmVzb3VyY2UgcmVzb3VyY2UsIElucHV0IGlucHV0KQorICAgICAgdGhyb3dzIEF1dGhFeGNlcHRpb24sIEJhZFJlcXVlc3RFeGNlcHRpb24sIFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24sCisgICAgICBFeGNlcHRpb24geworICAgIFByb2plY3RDb250cm9sIGN0bCA9IHJlc291cmNlLmdldENvbnRyb2woKTsKKyAgICBJZGVudGlmaWVkVXNlciB1c2VyID0gKElkZW50aWZpZWRVc2VyKSBjdGwuZ2V0Q3VycmVudFVzZXIoKTsKKyAgICBpZiAoIXVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCkuY2FuQWRtaW5pc3RyYXRlU2VydmVyKCkpIHsKKyAgICAgIHRocm93IG5ldyBBdXRoRXhjZXB0aW9uKCJub3QgYWRtaW5pc3RyYXRvciIpOworICAgIH0KKworICAgIHRyeSB7CisgICAgICBNZXRhRGF0YVVwZGF0ZSBtZCA9IHVwZGF0ZUZhY3RvcnkuY3JlYXRlKHJlc291cmNlLmdldE5hbWVLZXkoKSk7CisgICAgICB0cnkgeworICAgICAgICBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IFByb2plY3RDb25maWcucmVhZChtZCk7CisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGNvbmZpZy5nZXRQcm9qZWN0KCk7CisgICAgICAgIHByb2plY3Quc2V0UGFyZW50TmFtZShTdHJpbmdzLmVtcHR5VG9OdWxsKGlucHV0LnBhcmVudCkpOworCisgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmdzLmVtcHR5VG9OdWxsKGlucHV0LmNvbW1pdE1lc3NhZ2UpOworICAgICAgICBpZiAobXNnID09IG51bGwpIHsKKyAgICAgICAgICBtc2cgPSBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAiQ2hhbmdlZCBwYXJlbnQgdG8gJXMuXG4iLAorICAgICAgICAgICAgICBPYmplY3RzLmZpcnN0Tm9uTnVsbChwcm9qZWN0LmdldFBhcmVudE5hbWUoKSwgYWxsUHJvamVjdHMuZ2V0KCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICghbXNnLmVuZHNXaXRoKCJcbiIpKSB7CisgICAgICAgICAgbXNnICs9ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgbWQuc2V0QXV0aG9yKHVzZXIpOworICAgICAgICBtZC5zZXRNZXNzYWdlKG1zZyk7CisgICAgICAgIGNvbmZpZy5jb21taXQobWQpOworICAgICAgICBjYWNoZS5ldmljdChjdGwuZ2V0UHJvamVjdCgpKTsKKworICAgICAgICBQcm9qZWN0Lk5hbWVLZXkgcGFyZW50TmFtZSA9IHByb2plY3QuZ2V0UGFyZW50KGFsbFByb2plY3RzKTsKKyAgICAgICAgcmV0dXJuIHBhcmVudE5hbWUgIT0gbnVsbCA/IHBhcmVudE5hbWUuZ2V0KCkgOiAiIjsKKyAgICAgIH0gZmluYWxseSB7CisgICAgICAgIG1kLmNsb3NlKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIG5vdEZvdW5kKSB7CisgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbihyZXNvdXJjZS5nZXROYW1lKCkpOworICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAiaW52YWxpZCBwcm9qZWN0LmNvbmZpZzogJXMiLCBlLmdldE1lc3NhZ2UoKSkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1N1Ym1pdFJ1bGVFdmFsdWF0b3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TdWJtaXRSdWxlRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5NTY3YwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcHJvamVjdC9TdWJtaXRSdWxlRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSwyNDkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlByb2xvZ0Vudmlyb25tZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlN0b3JlZFZhbHVlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZURhdGE7CisKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5jb21waWxlci5Db21waWxlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuTGlzdFRlcm07CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2c7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2dFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVmFyaWFibGVUZXJtOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKKy8qKgorICogRXZhbHVhdGVzIGEgc3VibWl0LWxpa2UgUHJvbG9nIHJ1bGUgZm91bmQgaW4gdGhlIHJ1bGVzLnBsIGZpbGUgb2YgdGhlIGN1cnJlbnQKKyAqIHByb2plY3QgYW5kIGZpbHRlcnMgdGhlIHJlc3VsdHMgdGhyb3VnaCBydWxlcyBmb3VuZCBpbiB0aGUgcGFyZW50IHByb2plY3RzLAorICogYWxsIHRoZSB3YXkgdXAgdG8gQWxsLVByb2plY3RzLgorICovCitwdWJsaWMgY2xhc3MgU3VibWl0UnVsZUV2YWx1YXRvciB7CisgIHByaXZhdGUgZmluYWwgUmV2aWV3RGIgZGI7CisgIHByaXZhdGUgZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQ7CisgIHByaXZhdGUgZmluYWwgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2w7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlQ29udHJvbCBjaGFuZ2VDb250cm9sOworICBwcml2YXRlIGZpbmFsIENoYW5nZSBjaGFuZ2U7CisgIHByaXZhdGUgZmluYWwgQ2hhbmdlRGF0YSBjZDsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZhc3RFdmFsTGFiZWxzOworICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VyUnVsZUxvY2F0b3JOYW1lOworICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VyUnVsZVdyYXBwZXJOYW1lOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWx0ZXJSdWxlTG9jYXRvck5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZpbHRlclJ1bGVXcmFwcGVyTmFtZTsKKyAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNraXBGaWx0ZXJzOworICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIHJ1bGVzSW5wdXRTdHJlYW07CisKKyAgcHJpdmF0ZSBUZXJtIHN1Ym1pdFJ1bGU7CisgIHByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOworCisgIC8qKgorICAgKiBAcGFyYW0gdXNlclJ1bGVMb2NhdG9yTmFtZSBUaGUgbmFtZSBvZiB0aGUgcnVsZSB1c2VkIHRvIGxvY2F0ZSB0aGUKKyAgICogICAgICAgIHVzZXItc3VwcGxpZWQgcnVsZS4KKyAgICogQHBhcmFtIHVzZXJSdWxlV3JhcHBlck5hbWUgVGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgcnVsZSB1c2VkIHRvIGV2YWx1YXRlCisgICAqICAgICAgICB0aGUgdXNlci1zdXBwbGllZCBydWxlLgorICAgKiBAcGFyYW0gZmlsdGVyUnVsZUxvY2F0b3JOYW1lIFRoZSBuYW1lIG9mIHRoZSBydWxlIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWx0ZXIKKyAgICogICAgICAgIHJ1bGUuCisgICAqIEBwYXJhbSBmaWx0ZXJSdWxlV3JhcHBlck5hbWUgVGhlIG5hbWUgb2YgdGhlIHJ1bGUgdXNlZCB0byBldmFsdWF0ZSB0aGUKKyAgICogICAgICAgIGZpbHRlciBydWxlLgorICAgKi8KKyAgcHVibGljIFN1Ym1pdFJ1bGVFdmFsdWF0b3IoUmV2aWV3RGIgZGIsIFBhdGNoU2V0IHBhdGNoU2V0LAorICAgICAgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2wsCisgICAgICBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2wsIENoYW5nZSBjaGFuZ2UsIEBOdWxsYWJsZSBDaGFuZ2VEYXRhIGNkLAorICAgICAgYm9vbGVhbiBmYXN0RXZhbExhYmVscywKKyAgICAgIFN0cmluZyB1c2VyUnVsZUxvY2F0b3JOYW1lLCBTdHJpbmcgdXNlclJ1bGVXcmFwcGVyTmFtZSwKKyAgICAgIFN0cmluZyBmaWx0ZXJSdWxlTG9jYXRvck5hbWUsIFN0cmluZyBmaWx0ZXJSdWxlV3JhcHBlck5hbWUpIHsKKyAgICB0aGlzKGRiLCBwYXRjaFNldCwgcHJvamVjdENvbnRyb2wsIGNoYW5nZUNvbnRyb2wsIGNoYW5nZSwgY2QsCisgICAgICAgIGZhc3RFdmFsTGFiZWxzLCB1c2VyUnVsZUxvY2F0b3JOYW1lLCB1c2VyUnVsZVdyYXBwZXJOYW1lLAorICAgICAgICBmaWx0ZXJSdWxlTG9jYXRvck5hbWUsIGZpbHRlclJ1bGVXcmFwcGVyTmFtZSwgZmFsc2UsIG51bGwpOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSB1c2VyUnVsZUxvY2F0b3JOYW1lIFRoZSBuYW1lIG9mIHRoZSBydWxlIHVzZWQgdG8gbG9jYXRlIHRoZQorICAgKiAgICAgICAgdXNlci1zdXBwbGllZCBydWxlLgorICAgKiBAcGFyYW0gdXNlclJ1bGVXcmFwcGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgd3JhcHBlciBydWxlIHVzZWQgdG8gZXZhbHVhdGUKKyAgICogICAgICAgIHRoZSB1c2VyLXN1cHBsaWVkIHJ1bGUuCisgICAqIEBwYXJhbSBmaWx0ZXJSdWxlTG9jYXRvck5hbWUgVGhlIG5hbWUgb2YgdGhlIHJ1bGUgdXNlZCB0byBsb2NhdGUgdGhlIGZpbHRlcgorICAgKiAgICAgICAgcnVsZS4KKyAgICogQHBhcmFtIGZpbHRlclJ1bGVXcmFwcGVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgcnVsZSB1c2VkIHRvIGV2YWx1YXRlIHRoZQorICAgKiAgICAgICAgZmlsdGVyIHJ1bGUuCisgICAqIEBwYXJhbSBza2lwU3VibWl0RmlsdGVycyBpZiA8Y29kZT50cnVlPC9jb2RlPiBzdWJtaXQgZmlsdGVyIHdpbGwgbm90IGJlCisgICAqICAgICAgICBhcHBsaWVkCisgICAqIEBwYXJhbSBydWxlcyB3aGVuIG5vbi1udWxsIHRoZSBydWxlcyB3aWxsIGJlIHJlYWQgZnJvbSB0aGlzIGlucHV0IHN0cmVhbQorICAgKiAgICAgICAgaW5zdGVhZCBvZiByZWZzL21ldGEvY29uZmlnOnJ1bGVzLnBsIGZpbGUKKyAgICovCisgIHB1YmxpYyBTdWJtaXRSdWxlRXZhbHVhdG9yKFJldmlld0RiIGRiLCBQYXRjaFNldCBwYXRjaFNldCwKKyAgICAgIFByb2plY3RDb250cm9sIHByb2plY3RDb250cm9sLAorICAgICAgQ2hhbmdlQ29udHJvbCBjaGFuZ2VDb250cm9sLCBDaGFuZ2UgY2hhbmdlLCBATnVsbGFibGUgQ2hhbmdlRGF0YSBjZCwKKyAgICAgIGJvb2xlYW4gZmFzdEV2YWxMYWJlbHMsCisgICAgICBTdHJpbmcgdXNlclJ1bGVMb2NhdG9yTmFtZSwgU3RyaW5nIHVzZXJSdWxlV3JhcHBlck5hbWUsCisgICAgICBTdHJpbmcgZmlsdGVyUnVsZUxvY2F0b3JOYW1lLCBTdHJpbmcgZmlsdGVyUnVsZVdyYXBwZXJOYW1lLAorICAgICAgYm9vbGVhbiBza2lwU3VibWl0RmlsdGVycywgSW5wdXRTdHJlYW0gcnVsZXMpIHsKKyAgICB0aGlzLmRiID0gZGI7CisgICAgdGhpcy5wYXRjaFNldCA9IHBhdGNoU2V0OworICAgIHRoaXMucHJvamVjdENvbnRyb2wgPSBwcm9qZWN0Q29udHJvbDsKKyAgICB0aGlzLmNoYW5nZUNvbnRyb2wgPSBjaGFuZ2VDb250cm9sOworICAgIHRoaXMuY2hhbmdlID0gY2hhbmdlOworICAgIHRoaXMuY2QgPSBjZDsKKyAgICB0aGlzLmZhc3RFdmFsTGFiZWxzID0gZmFzdEV2YWxMYWJlbHM7CisgICAgdGhpcy51c2VyUnVsZUxvY2F0b3JOYW1lID0gdXNlclJ1bGVMb2NhdG9yTmFtZTsKKyAgICB0aGlzLnVzZXJSdWxlV3JhcHBlck5hbWUgPSB1c2VyUnVsZVdyYXBwZXJOYW1lOworICAgIHRoaXMuZmlsdGVyUnVsZUxvY2F0b3JOYW1lID0gZmlsdGVyUnVsZUxvY2F0b3JOYW1lOworICAgIHRoaXMuZmlsdGVyUnVsZVdyYXBwZXJOYW1lID0gZmlsdGVyUnVsZVdyYXBwZXJOYW1lOworICAgIHRoaXMuc2tpcEZpbHRlcnMgPSBza2lwU3VibWl0RmlsdGVyczsKKyAgICB0aGlzLnJ1bGVzSW5wdXRTdHJlYW0gPSBydWxlczsKKyAgfQorCisgIC8qKgorICAgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIHJ1bGUgYW5kIGZpbHRlcnMuCisgICAqCisgICAqIFNldHMgdGhlIHtAbGluayAjc3VibWl0UnVsZX0gdG8gdGhlIFRlcm0gZm91bmQgYnkgdGhlCisgICAqIHtAbGluayAjdXNlclJ1bGVMb2NhdG9yTmFtZX0uIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiByZXBvcnRpbmcgZXJyb3Iocykgb24KKyAgICogdW5leHBlY3RlZCByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QuCisgICAqCisgICAqIEByZXR1cm4gTGlzdCBvZiB7QGxpbmsgVGVybX0gb2JqZWN0cyByZXR1cm5lZCBmcm9tIHRoZSBldmFsdWF0ZWQgcnVsZXMuCisgICAqIEB0aHJvd3MgUnVsZUV2YWxFeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBMaXN0PFRlcm0+IGV2YWx1YXRlKCkgdGhyb3dzIFJ1bGVFdmFsRXhjZXB0aW9uIHsKKyAgICBQcm9sb2dFbnZpcm9ubWVudCBlbnYgPSBnZXRQcm9sb2dFbnZpcm9ubWVudCgpOworICAgIHRyeSB7CisgICAgICBzdWJtaXRSdWxlID0gZW52Lm9uY2UoImdlcnJpdCIsIHVzZXJSdWxlTG9jYXRvck5hbWUsIG5ldyBWYXJpYWJsZVRlcm0oKSk7CisgICAgICBpZiAoZmFzdEV2YWxMYWJlbHMpIHsKKyAgICAgICAgZW52Lm9uY2UoImdlcnJpdCIsICJhc3N1bWVfcmFuZ2VfZnJvbV9sYWJlbCIpOworICAgICAgfQorCisgICAgICBMaXN0PFRlcm0+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFRlcm0+KCk7CisgICAgICB0cnkgeworICAgICAgICBmb3IgKFRlcm1bXSB0ZW1wbGF0ZSA6IGVudi5hbGwoImdlcnJpdCIsIHVzZXJSdWxlV3JhcHBlck5hbWUsCisgICAgICAgICAgICBzdWJtaXRSdWxlLCBuZXcgVmFyaWFibGVUZXJtKCkpKSB7CisgICAgICAgICAgcmVzdWx0cy5hZGQodGVtcGxhdGVbMV0pOworICAgICAgICB9CisgICAgICB9IGNhdGNoIChQcm9sb2dFeGNlcHRpb24gZXJyKSB7CisgICAgICAgIHRocm93IG5ldyBSdWxlRXZhbEV4Y2VwdGlvbigiRXhjZXB0aW9uIGNhbGxpbmcgIiArIHN1Ym1pdFJ1bGUKKyAgICAgICAgICAgICsgIiBvbiBjaGFuZ2UgIiArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiICsgZ2V0UHJvamVjdE5hbWUoKSwKKyAgICAgICAgICAgIGVycik7CisgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGVycikgeworICAgICAgICB0aHJvdyBuZXcgUnVsZUV2YWxFeGNlcHRpb24oIkV4Y2VwdGlvbiBjYWxsaW5nICIgKyBzdWJtaXRSdWxlCisgICAgICAgICAgICArICIgb24gY2hhbmdlICIgKyBjaGFuZ2UuZ2V0SWQoKSArICIgb2YgIiArIGdldFByb2plY3ROYW1lKCksCisgICAgICAgICAgICBlcnIpOworICAgICAgfQorCisgICAgICBUZXJtIHJlc3VsdHNUZXJtID0gdG9MaXN0VGVybShyZXN1bHRzKTsKKyAgICAgIGlmICghc2tpcEZpbHRlcnMpIHsKKyAgICAgICAgcmVzdWx0c1Rlcm0gPSBydW5TdWJtaXRGaWx0ZXJzKHJlc3VsdHNUZXJtLCBlbnYpOworICAgICAgfQorICAgICAgaWYgKHJlc3VsdHNUZXJtLmlzTGlzdCgpKSB7CisgICAgICAgIExpc3Q8VGVybT4gciA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBmb3IgKFRlcm0gdCA9IHJlc3VsdHNUZXJtOyB0LmlzTGlzdCgpOykgeworICAgICAgICAgIExpc3RUZXJtIGwgPSAoTGlzdFRlcm0pIHQ7CisgICAgICAgICAgci5hZGQobC5jYXIoKS5kZXJlZmVyZW5jZSgpKTsKKyAgICAgICAgICB0ID0gbC5jZHIoKS5kZXJlZmVyZW5jZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByOworICAgICAgfQorICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBlbnYuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFByb2xvZ0Vudmlyb25tZW50IGdldFByb2xvZ0Vudmlyb25tZW50KCkgdGhyb3dzIFJ1bGVFdmFsRXhjZXB0aW9uIHsKKyAgICBQcm9qZWN0U3RhdGUgcHJvamVjdFN0YXRlID0gcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdFN0YXRlKCk7CisgICAgUHJvbG9nRW52aXJvbm1lbnQgZW52OworICAgIHRyeSB7CisgICAgICBpZiAocnVsZXNJbnB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgIGVudiA9IHByb2plY3RTdGF0ZS5uZXdQcm9sb2dFbnZpcm9ubWVudCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZW52ID0gcHJvamVjdFN0YXRlLm5ld1Byb2xvZ0Vudmlyb25tZW50KCJzdGRpbiIsIHJ1bGVzSW5wdXRTdHJlYW0pOworICAgICAgfQorICAgIH0gY2F0Y2ggKENvbXBpbGVFeGNlcHRpb24gZXJyKSB7CisgICAgICB0aHJvdyBuZXcgUnVsZUV2YWxFeGNlcHRpb24oIkNhbm5vdCBjb25zdWx0IHJ1bGVzLnBsIGZvciAiCisgICAgICAgICAgKyBnZXRQcm9qZWN0TmFtZSgpLCBlcnIpOworICAgIH0KKyAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5SRVZJRVdfREIsIGRiKTsKKyAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0UsIGNoYW5nZSk7CisgICAgZW52LnNldChTdG9yZWRWYWx1ZXMuQ0hBTkdFX0RBVEEsIGNkKTsKKyAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5QQVRDSF9TRVQsIHBhdGNoU2V0KTsKKyAgICBlbnYuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0VfQ09OVFJPTCwgY2hhbmdlQ29udHJvbCk7CisgICAgcmV0dXJuIGVudjsKKyAgfQorCisgIHByaXZhdGUgVGVybSBydW5TdWJtaXRGaWx0ZXJzKFRlcm0gcmVzdWx0cywgUHJvbG9nRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgUnVsZUV2YWxFeGNlcHRpb24geworICAgIFByb2plY3RTdGF0ZSBwcm9qZWN0U3RhdGUgPSBwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0U3RhdGUoKTsKKyAgICBQcm9sb2dFbnZpcm9ubWVudCBjaGlsZEVudiA9IGVudjsKKyAgICBmb3IgKFByb2plY3RTdGF0ZSBwYXJlbnRTdGF0ZSA6IHByb2plY3RTdGF0ZS5wYXJlbnRzKCkpIHsKKyAgICAgIFByb2xvZ0Vudmlyb25tZW50IHBhcmVudEVudjsKKyAgICAgIHRyeSB7CisgICAgICAgIHBhcmVudEVudiA9IHBhcmVudFN0YXRlLm5ld1Byb2xvZ0Vudmlyb25tZW50KCk7CisgICAgICB9IGNhdGNoIChDb21waWxlRXhjZXB0aW9uIGVycikgeworICAgICAgICB0aHJvdyBuZXcgUnVsZUV2YWxFeGNlcHRpb24oIkNhbm5vdCBjb25zdWx0IHJ1bGVzLnBsIGZvciAiCisgICAgICAgICAgICArIHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCksIGVycik7CisgICAgICB9CisKKyAgICAgIHBhcmVudEVudi5jb3B5U3RvcmVkVmFsdWVzKGNoaWxkRW52KTsKKyAgICAgIFRlcm0gZmlsdGVyUnVsZSA9CisgICAgICAgICAgcGFyZW50RW52Lm9uY2UoImdlcnJpdCIsIGZpbHRlclJ1bGVMb2NhdG9yTmFtZSwgbmV3IFZhcmlhYmxlVGVybSgpKTsKKyAgICAgIHRyeSB7CisgICAgICAgIGlmIChmYXN0RXZhbExhYmVscykgeworICAgICAgICAgIGVudi5vbmNlKCJnZXJyaXQiLCAiYXNzdW1lX3JhbmdlX2Zyb21fbGFiZWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlcm1bXSB0ZW1wbGF0ZSA9CisgICAgICAgICAgICBwYXJlbnRFbnYub25jZSgiZ2Vycml0IiwgZmlsdGVyUnVsZVdyYXBwZXJOYW1lLCBmaWx0ZXJSdWxlLAorICAgICAgICAgICAgICAgIHJlc3VsdHMsIG5ldyBWYXJpYWJsZVRlcm0oKSk7CisgICAgICAgIHJlc3VsdHMgPSB0ZW1wbGF0ZVsyXTsKKyAgICAgIH0gY2F0Y2ggKFByb2xvZ0V4Y2VwdGlvbiBlcnIpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJ1bGVFdmFsRXhjZXB0aW9uKCJFeGNlcHRpb24gY2FsbGluZyAiICsgZmlsdGVyUnVsZQorICAgICAgICAgICAgKyAiIG9uIGNoYW5nZSAiICsgY2hhbmdlLmdldElkKCkgKyAiIG9mICIKKyAgICAgICAgICAgICsgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgZXJyKTsKKyAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKSB7CisgICAgICAgIHRocm93IG5ldyBSdWxlRXZhbEV4Y2VwdGlvbigiRXhjZXB0aW9uIGNhbGxpbmcgIiArIGZpbHRlclJ1bGUKKyAgICAgICAgICAgICsgIiBvbiBjaGFuZ2UgIiArIGNoYW5nZS5nZXRJZCgpICsgIiBvZiAiCisgICAgICAgICAgICArIHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCksIGVycik7CisgICAgICB9CisgICAgICBjaGlsZEVudiA9IHBhcmVudEVudjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdHM7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBUZXJtIHRvTGlzdFRlcm0oTGlzdDxUZXJtPiB0ZXJtcykgeworICAgIFRlcm0gbGlzdCA9IFByb2xvZy5OaWw7CisgICAgZm9yIChpbnQgaSA9IHRlcm1zLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBsaXN0ID0gbmV3IExpc3RUZXJtKHRlcm1zLmdldChpKSwgbGlzdCk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworICB9CisKKyAgcHVibGljIFRlcm0gZ2V0U3VibWl0UnVsZSgpIHsKKyAgICByZXR1cm4gc3VibWl0UnVsZTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgeworICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsKSB7CisgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3RDb250cm9sLmdldFByb2plY3RTdGF0ZSgpLmdldFByb2plY3QoKS5nZXROYW1lKCk7CisgICAgfQorICAgIHJldHVybiBwcm9qZWN0TmFtZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9RdWVyeVJld3JpdGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L1F1ZXJ5UmV3cml0ZXIuamF2YQppbmRleCBiM2MxMGVmLi4yYTZiYWUwIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L1F1ZXJ5UmV3cml0ZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L1F1ZXJ5UmV3cml0ZXIuamF2YQpAQCAtNDc4LDI4ICs0NzgsNiBAQAogICAgIHJldHVybiByOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgPFQ+IHZvaWQgZXhwYW5kKGZpbmFsIExpc3Q8UHJlZGljYXRlPFQ+PiBvdXQsCi0gICAgICBmaW5hbCBMaXN0PFByZWRpY2F0ZTxUPj4gYWxsT1IsIGZpbmFsIExpc3Q8UHJlZGljYXRlPFQ+PiB0bXAsCi0gICAgICBmaW5hbCBMaXN0PFByZWRpY2F0ZTxUPj4gbm9uT1IpIHsKLSAgICBpZiAodG1wLnNpemUoKSA9PSBhbGxPUi5zaXplKCkpIHsKLSAgICAgIGZpbmFsIGludCBzeiA9IG5vbk9SLnNpemUoKSArIHRtcC5zaXplKCk7Ci0gICAgICBmaW5hbCBMaXN0PFByZWRpY2F0ZTxUPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8UHJlZGljYXRlPFQ+Pihzeik7Ci0gICAgICBuZXdMaXN0LmFkZEFsbChub25PUik7Ci0gICAgICBuZXdMaXN0LmFkZEFsbCh0bXApOwotICAgICAgb3V0LmFkZChQcmVkaWNhdGUuYW5kKG5ld0xpc3QpKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGZpbmFsIFByZWRpY2F0ZTxUPiBjIDogYWxsT1IuZ2V0KHRtcC5zaXplKCkpLmdldENoaWxkcmVuKCkpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICB0bXAuYWRkKGMpOwotICAgICAgICAgIGV4cGFuZChvdXQsIGFsbE9SLCB0bXAsIG5vbk9SKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICB0bXAucmVtb3ZlKHRtcC5zaXplKCkgLSAxKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCiAgIHByaXZhdGUgc3RhdGljIDxUPiBib29sZWFuIGlzQU5EKGZpbmFsIFByZWRpY2F0ZTxUPiBwKSB7CiAgICAgcmV0dXJuIHAgaW5zdGFuY2VvZiBBbmRQcmVkaWNhdGU7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0FuZFNvdXJjZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQW5kU291cmNlLmphdmEKaW5kZXggM2EwYmZhMy4uN2Y3MjZhNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQW5kU291cmNlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQW5kU291cmNlLmphdmEKQEAgLTE0LDExICsxNCwxOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2U7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkZsdWVudEl0ZXJhYmxlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5BbmRQcmVkaWNhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LlByZWRpY2F0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuTGlzdFJlc3VsdFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1SdW50aW1lRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5SZXN1bHRTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwpAQCAtMzUsMTQgKzQzLDYgQEAKICAgICAgICAgICBpbnQgYmkgPSBiIGluc3RhbmNlb2YgQ2hhbmdlRGF0YVNvdXJjZSA/IDAgOiAxOwogICAgICAgICAgIGludCBjbXAgPSBhaSAtIGJpOwogCi0gICAgICAgICAgaWYgKGNtcCA9PSAwIC8vCi0gICAgICAgICAgICAgICYmIGEgaW5zdGFuY2VvZiBDaGFuZ2VEYXRhU291cmNlIC8vCi0gICAgICAgICAgICAgICYmIGIgaW5zdGFuY2VvZiBDaGFuZ2VEYXRhU291cmNlKSB7Ci0gICAgICAgICAgICBhaSA9ICgoQ2hhbmdlRGF0YVNvdXJjZSkgYSkuaGFzQ2hhbmdlKCkgPyAwIDogMTsKLSAgICAgICAgICAgIGJpID0gKChDaGFuZ2VEYXRhU291cmNlKSBiKS5oYXNDaGFuZ2UoKSA/IDAgOiAxOwotICAgICAgICAgICAgY21wID0gYWkgLSBiaTsKLSAgICAgICAgICB9Ci0KICAgICAgICAgICBpZiAoY21wID09IDApIHsKICAgICAgICAgICAgIGNtcCA9IGEuZ2V0Q29zdCgpIC0gYi5nZXRDb3N0KCk7CiAgICAgICAgICAgfQpAQCAtNTMsNiArNTMsMTEgQEAKICAgICAgICAgICAgIENoYW5nZURhdGFTb3VyY2UgYXMgPSAoQ2hhbmdlRGF0YVNvdXJjZSkgYTsKICAgICAgICAgICAgIENoYW5nZURhdGFTb3VyY2UgYnMgPSAoQ2hhbmdlRGF0YVNvdXJjZSkgYjsKICAgICAgICAgICAgIGNtcCA9IGFzLmdldENhcmRpbmFsaXR5KCkgLSBicy5nZXRDYXJkaW5hbGl0eSgpOworCisgICAgICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgICAgY21wID0gKGFzLmhhc0NoYW5nZSgpID8gMCA6IDEpCisgICAgICAgICAgICAgICAgICAtIChicy5oYXNDaGFuZ2UoKSA/IDAgOiAxKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAKICAgICAgICAgICByZXR1cm4gY21wOwpAQCAtNjcsMTAgKzcyLDEyIEBACiAgICAgcmV0dXJuIHI7CiAgIH0KIAorICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYjsKICAgcHJpdmF0ZSBpbnQgY2FyZGluYWxpdHkgPSAtMTsKIAotICBBbmRTb3VyY2UoZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUHJlZGljYXRlPENoYW5nZURhdGE+PiB0aGF0KSB7CisgIEFuZFNvdXJjZShQcm92aWRlcjxSZXZpZXdEYj4gZGIsIENvbGxlY3Rpb248PyBleHRlbmRzIFByZWRpY2F0ZTxDaGFuZ2VEYXRhPj4gdGhhdCkgewogICAgIHN1cGVyKHNvcnQodGhhdCkpOworICAgIHRoaXMuZGIgPSBkYjsKICAgfQogCiAgIEBPdmVycmlkZQpAQCAtODEsMTcgKzg4LDI0IEBACiAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBSZXN1bHRTZXQ8Q2hhbmdlRGF0YT4gcmVhZCgpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZXR1cm4gcmVhZEltcGwoKTsKKyAgICB9IGNhdGNoIChPcm1SdW50aW1lRXhjZXB0aW9uIGVycikgeworICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGVJZkluc3RhbmNlT2YoZXJyLmdldENhdXNlKCksIE9ybUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGVycik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBSZXN1bHRTZXQ8Q2hhbmdlRGF0YT4gcmVhZEltcGwoKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICBDaGFuZ2VEYXRhU291cmNlIHNvdXJjZSA9IHNvdXJjZSgpOwogICAgIGlmIChzb3VyY2UgPT0gbnVsbCkgewogICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbigiTm8gQ2hhbmdlRGF0YVNvdXJjZTogIiArIHRoaXMpOwogICAgIH0KIAotICAgIC8vIFRPRE8oc3BlYXJjZSkgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgbW9yZSBsYXp5LgotICAgIC8vCi0gICAgQXJyYXlMaXN0PENoYW5nZURhdGE+IHIgPSBuZXcgQXJyYXlMaXN0PENoYW5nZURhdGE+KCk7CisgICAgTGlzdDxDaGFuZ2VEYXRhPiByID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CiAgICAgQ2hhbmdlRGF0YSBsYXN0ID0gbnVsbDsKICAgICBib29sZWFuIHNraXBwZWQgPSBmYWxzZTsKLSAgICBmb3IgKENoYW5nZURhdGEgZGF0YSA6IHNvdXJjZS5yZWFkKCkpIHsKKyAgICBmb3IgKENoYW5nZURhdGEgZGF0YSA6IGJ1ZmZlcihzb3VyY2UsIHNvdXJjZS5yZWFkKCkpKSB7CiAgICAgICBpZiAobWF0Y2goZGF0YSkpIHsKICAgICAgICAgci5hZGQoZGF0YSk7CiAgICAgICB9IGVsc2UgewpAQCAtMTAxLDcgKzExNSw3IEBACiAgICAgfQogCiAgICAgaWYgKHNraXBwZWQgJiYgbGFzdCAhPSBudWxsICYmIHNvdXJjZSBpbnN0YW5jZW9mIFBhZ2luYXRlZCkgewotICAgICAgLy8gSWYgd2Ugb3VyIHNvdXJjZSBpcyBhIHBhZ2luYXRlZCBzb3VyY2UgYW5kIHdlIHNraXBwZWQgYXQKKyAgICAgIC8vIElmIG91ciBzb3VyY2UgaXMgYSBwYWdpbmF0ZWQgc291cmNlIGFuZCB3ZSBza2lwcGVkIGF0CiAgICAgICAvLyBsZWFzdCBvbmUgb2YgaXRzIHJlc3VsdHMsIHdlIG1heSBub3QgaGF2ZSBmaWxsZWQgdGhlIGZ1bGwKICAgICAgIC8vIGxpbWl0IHRoZSBjYWxsZXIgd2FudHMuICBSZXN0YXJ0IHRoZSBzb3VyY2UgYW5kIGNvbnRpbnVlLgogICAgICAgLy8KQEAgLTExMCw3ICsxMjQsNyBAQAogICAgICAgICBDaGFuZ2VEYXRhIGxhc3RCZWZvcmVSZXN0YXJ0ID0gbGFzdDsKICAgICAgICAgc2tpcHBlZCA9IGZhbHNlOwogICAgICAgICBsYXN0ID0gbnVsbDsKLSAgICAgICAgZm9yIChDaGFuZ2VEYXRhIGRhdGEgOiBwLnJlc3RhcnQobGFzdEJlZm9yZVJlc3RhcnQpKSB7CisgICAgICAgIGZvciAoQ2hhbmdlRGF0YSBkYXRhIDogYnVmZmVyKHNvdXJjZSwgcC5yZXN0YXJ0KGxhc3RCZWZvcmVSZXN0YXJ0KSkpIHsKICAgICAgICAgICBpZiAobWF0Y2goZGF0YSkpIHsKICAgICAgICAgICAgIHIuYWRkKGRhdGEpOwogICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMjQsNiArMTM4LDI3IEBACiAgICAgcmV0dXJuIG5ldyBMaXN0UmVzdWx0U2V0PENoYW5nZURhdGE+KHIpOwogICB9CiAKKyAgcHJpdmF0ZSBJdGVyYWJsZTxDaGFuZ2VEYXRhPiBidWZmZXIoCisgICAgICBDaGFuZ2VEYXRhU291cmNlIHNvdXJjZSwKKyAgICAgIFJlc3VsdFNldDxDaGFuZ2VEYXRhPiBzY2FubmVyKSB7CisgICAgZmluYWwgYm9vbGVhbiBsb2FkQ2hhbmdlID0gIXNvdXJjZS5oYXNDaGFuZ2UoKTsKKyAgICByZXR1cm4gRmx1ZW50SXRlcmFibGUKKyAgICAgIC5mcm9tKEl0ZXJhYmxlcy5wYXJ0aXRpb24oc2Nhbm5lciwgNTApKQorICAgICAgLnRyYW5zZm9ybUFuZENvbmNhdChuZXcgRnVuY3Rpb248TGlzdDxDaGFuZ2VEYXRhPiwgTGlzdDxDaGFuZ2VEYXRhPj4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxDaGFuZ2VEYXRhPiBhcHBseShMaXN0PENoYW5nZURhdGE+IGJ1ZmZlcikgeworICAgICAgICAgIGlmIChsb2FkQ2hhbmdlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBDaGFuZ2VEYXRhLmVuc3VyZUNoYW5nZUxvYWRlZChkYiwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBPcm1SdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisgICAgICB9KTsKKyAgfQorCiAgIHByaXZhdGUgQ2hhbmdlRGF0YVNvdXJjZSBzb3VyY2UoKSB7CiAgICAgZm9yIChQcmVkaWNhdGU8Q2hhbmdlRGF0YT4gcCA6IGdldENoaWxkcmVuKCkpIHsKICAgICAgIGlmIChwIGluc3RhbmNlb2YgQ2hhbmdlRGF0YVNvdXJjZSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlRGF0YS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlRGF0YS5qYXZhCmluZGV4IGQ2NzYyZGIuLjUwNmZhYmMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZURhdGEuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9DaGFuZ2VEYXRhLmphdmEKQEAgLTE0LDE0ICsxNCwyMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2U7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdE11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2VNZXNzYWdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hMaW5lQ29tbWVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0LklkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5UcmFja2luZ0lkOwpAQCAtNDMsMTUgKzQ5LDI5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldldhbGs7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGNsYXNzIENoYW5nZURhdGEgeworICBwcml2YXRlIHN0YXRpYyBPcmRlcmluZzxQYXRjaFNldEFwcHJvdmFsPiBTT1JUX0FQUFJPVkFMUyA9IE9yZGVyaW5nLm5hdHVyYWwoKQorICAgICAgLm9uUmVzdWx0T2YobmV3IEZ1bmN0aW9uPFBhdGNoU2V0QXBwcm92YWwsIFRpbWVzdGFtcD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUaW1lc3RhbXAgYXBwbHkoUGF0Y2hTZXRBcHByb3ZhbCBhKSB7CisgICAgICAgICAgICAgIHJldHVybiBhLmdldEdyYW50ZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9KTsKKworICBwdWJsaWMgc3RhdGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gc29ydEFwcHJvdmFscygKKyAgICAgIEl0ZXJhYmxlPFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFscykgeworICAgIHJldHVybiBTT1JUX0FQUFJPVkFMUy5zb3J0ZWRDb3B5KGFwcHJvdmFscyk7CisgIH0KKwogICBwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlQ2hhbmdlTG9hZGVkKAogICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiLCBMaXN0PENoYW5nZURhdGE+IGNoYW5nZXMpIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIE1hcDxDaGFuZ2UuSWQsIENoYW5nZURhdGE+IG1pc3NpbmcgPSBNYXBzLm5ld0hhc2hNYXAoKTsKQEAgLTc5LDcgKzk5LDkgQEAKICAgICAgIGZvciAoUGF0Y2hTZXQgcHMgOiBkYi5nZXQoKS5wYXRjaFNldHMoKS5nZXQobWlzc2luZy5rZXlTZXQoKSkpIHsKICAgICAgICAgQ2hhbmdlRGF0YSBjZCA9IG1pc3NpbmcuZ2V0KHBzLmdldElkKCkpOwogICAgICAgICBjZC5jdXJyZW50UGF0Y2hTZXQgPSBwczsKLSAgICAgICAgY2QucGF0Y2hlcyA9IExpc3RzLm5ld0FycmF5TGlzdChwcyk7CisgICAgICAgIGlmIChjZC5saW1pdGVkSWRzID09IG51bGwpIHsKKyAgICAgICAgICBjZC5wYXRjaGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KHBzKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpAQCAtODgsNyArMTEwLDcgQEAKICAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYiwgTGlzdDxDaGFuZ2VEYXRhPiBjaGFuZ2VzKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICBMaXN0PFJlc3VsdFNldDxQYXRjaFNldEFwcHJvdmFsPj4gcGVuZGluZyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogICAgIGZvciAoQ2hhbmdlRGF0YSBjZCA6IGNoYW5nZXMpIHsKLSAgICAgIGlmIChjZC5jdXJyZW50QXBwcm92YWxzID09IG51bGwgJiYgY2QuYXBwcm92YWxzID09IG51bGwpIHsKKyAgICAgIGlmIChjZC5jdXJyZW50QXBwcm92YWxzID09IG51bGwgJiYgY2QubGltaXRlZEFwcHJvdmFscyA9PSBudWxsKSB7CiAgICAgICAgIHBlbmRpbmcuYWRkKGRiLmdldCgpLnBhdGNoU2V0QXBwcm92YWxzKCkKICAgICAgICAgICAgIC5ieVBhdGNoU2V0KGNkLmNoYW5nZShkYikuY3VycmVudFBhdGNoU2V0SWQoKSkpOwogICAgICAgfQpAQCAtOTYsOCArMTE4LDggQEAKICAgICBpZiAoIXBlbmRpbmcuaXNFbXB0eSgpKSB7CiAgICAgICBpbnQgaWR4ID0gMDsKICAgICAgIGZvciAoQ2hhbmdlRGF0YSBjZCA6IGNoYW5nZXMpIHsKLSAgICAgICAgaWYgKGNkLmN1cnJlbnRBcHByb3ZhbHMgPT0gbnVsbCAmJiBjZC5hcHByb3ZhbHMgPT0gbnVsbCkgewotICAgICAgICAgIGNkLmN1cnJlbnRBcHByb3ZhbHMgPSBwZW5kaW5nLmdldChpZHgrKykudG9MaXN0KCk7CisgICAgICAgIGlmIChjZC5jdXJyZW50QXBwcm92YWxzID09IG51bGwgJiYgY2QubGltaXRlZEFwcHJvdmFscyA9PSBudWxsKSB7CisgICAgICAgICAgY2QuY3VycmVudEFwcHJvdmFscyA9IHNvcnRBcHByb3ZhbHMocGVuZGluZy5nZXQoaWR4KyspKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTEwNywxNiArMTI5LDE4IEBACiAgIHByaXZhdGUgQ2hhbmdlIGNoYW5nZTsKICAgcHJpdmF0ZSBTdHJpbmcgY29tbWl0TWVzc2FnZTsKICAgcHJpdmF0ZSBQYXRjaFNldCBjdXJyZW50UGF0Y2hTZXQ7CisgIHByaXZhdGUgU2V0PFBhdGNoU2V0LklkPiBsaW1pdGVkSWRzOwogICBwcml2YXRlIENvbGxlY3Rpb248UGF0Y2hTZXQ+IHBhdGNoZXM7Ci0gIHByaXZhdGUgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHM7Ci0gIHByaXZhdGUgTWFwPFBhdGNoU2V0LklkLENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IGFwcHJvdmFsc01hcDsKLSAgcHJpdmF0ZSBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnRBcHByb3ZhbHM7CisgIHByaXZhdGUgTGlzdE11bHRpbWFwPFBhdGNoU2V0LklkLCBQYXRjaFNldEFwcHJvdmFsPiBsaW1pdGVkQXBwcm92YWxzOworICBwcml2YXRlIExpc3RNdWx0aW1hcDxQYXRjaFNldC5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzOworICBwcml2YXRlIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gY3VycmVudEFwcHJvdmFsczsKICAgcHJpdmF0ZSBTdHJpbmdbXSBjdXJyZW50RmlsZXM7CiAgIHByaXZhdGUgQ29sbGVjdGlvbjxQYXRjaExpbmVDb21tZW50PiBjb21tZW50czsKICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFRyYWNraW5nSWQ+IHRyYWNraW5nSWRzOwogICBwcml2YXRlIEN1cnJlbnRVc2VyIHZpc2libGVUbzsKICAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sIGNoYW5nZUNvbnRyb2w7CiAgIHByaXZhdGUgTGlzdDxDaGFuZ2VNZXNzYWdlPiBtZXNzYWdlczsKKyAgcHJpdmF0ZSBMaXN0PFN1Ym1pdFJlY29yZD4gc3VibWl0UmVjb3JkczsKIAogICBwdWJsaWMgQ2hhbmdlRGF0YShmaW5hbCBDaGFuZ2UuSWQgaWQpIHsKICAgICBsZWdhY3lJZCA9IGlkOwpAQCAtMTI3LDYgKzE1MSwyNyBAQAogICAgIGNoYW5nZSA9IGM7CiAgIH0KIAorICBwdWJsaWMgQ2hhbmdlRGF0YShmaW5hbCBDaGFuZ2VDb250cm9sIGMpIHsKKyAgICBsZWdhY3lJZCA9IGMuZ2V0Q2hhbmdlKCkuZ2V0SWQoKTsKKyAgICBjaGFuZ2UgPSBjLmdldENoYW5nZSgpOworICAgIGNoYW5nZUNvbnRyb2wgPSBjOworICB9CisKKyAgcHVibGljIHZvaWQgbGltaXRUb1BhdGNoU2V0cyhDb2xsZWN0aW9uPFBhdGNoU2V0LklkPiBpZHMpIHsKKyAgICBsaW1pdGVkSWRzID0gU2V0cy5uZXdMaW5rZWRIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShpZHMuc2l6ZSgpKTsKKyAgICBmb3IgKFBhdGNoU2V0LklkIGlkIDogaWRzKSB7CisgICAgICBpZiAoIWlkLmdldFBhcmVudEtleSgpLmVxdWFscyhsZWdhY3lJZCkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgImludmFsaWQgcGF0Y2ggc2V0ICVzIGZvciBjaGFuZ2UgJXMiLCBpZCwgbGVnYWN5SWQpKTsKKyAgICAgIH0KKyAgICAgIGxpbWl0ZWRJZHMuYWRkKGlkKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgQ29sbGVjdGlvbjxQYXRjaFNldC5JZD4gZ2V0TGltaXRlZFBhdGNoU2V0cygpIHsKKyAgICByZXR1cm4gbGltaXRlZElkczsKKyAgfQorCiAgIHB1YmxpYyB2b2lkIHNldEN1cnJlbnRGaWxlUGF0aHMoU3RyaW5nW10gZmlsZVBhdGhzKSB7CiAgICAgY3VycmVudEZpbGVzID0gZmlsZVBhdGhzOwogICB9CkBAIC0xNjMsMTAgKzIwOCwxNCBAQAogICAgICAgICAgIGNhc2UgQ09QSUVEOgogICAgICAgICAgICAgci5hZGQoZS5nZXROZXdOYW1lKCkpOwogICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICBjYXNlIFJFTkFNRUQ6CiAgICAgICAgICAgICByLmFkZChlLmdldE9sZE5hbWUoKSk7CiAgICAgICAgICAgICByLmFkZChlLmdldE5ld05hbWUoKSk7CiAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgUkVXUklURToKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBjdXJyZW50RmlsZXMgPSByLnRvQXJyYXkobmV3IFN0cmluZ1tyLnNpemUoKV0pOwpAQCAtMTkxLDcgKzI0MCw3IEBACiAgICAgcmV0dXJuIHZpc2libGVUbyA9PSB1c2VyOwogICB9CiAKLSAgQ2hhbmdlQ29udHJvbCBjaGFuZ2VDb250cm9sKCkgeworICBwdWJsaWMgQ2hhbmdlQ29udHJvbCBjaGFuZ2VDb250cm9sKCkgewogICAgIHJldHVybiBjaGFuZ2VDb250cm9sOwogICB9CiAKQEAgLTIyMywyMiArMjcyLDIwIEBACiAgICAgcmV0dXJuIGN1cnJlbnRQYXRjaFNldDsKICAgfQogCi0gIHB1YmxpYyBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGN1cnJlbnRBcHByb3ZhbHMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKQorICBwdWJsaWMgTGlzdDxQYXRjaFNldEFwcHJvdmFsPiBjdXJyZW50QXBwcm92YWxzKFByb3ZpZGVyPFJldmlld0RiPiBkYikKICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewogICAgIGlmIChjdXJyZW50QXBwcm92YWxzID09IG51bGwpIHsKICAgICAgIENoYW5nZSBjID0gY2hhbmdlKGRiKTsKICAgICAgIGlmIChjID09IG51bGwpIHsKICAgICAgICAgY3VycmVudEFwcHJvdmFscyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgfSBlbHNlIGlmIChhcHByb3ZhbHMgIT0gbnVsbCkgewotICAgICAgICBNYXA8SWQsIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4+IG1hcCA9IGFwcHJvdmFsc01hcChkYik7Ci0gICAgICAgIGN1cnJlbnRBcHByb3ZhbHMgPSBtYXAuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSk7Ci0gICAgICAgIGlmIChjdXJyZW50QXBwcm92YWxzID09IG51bGwpIHsKLSAgICAgICAgICBjdXJyZW50QXBwcm92YWxzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgbWFwLnB1dChjLmN1cnJlbnRQYXRjaFNldElkKCksIGN1cnJlbnRBcHByb3ZhbHMpOwotICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGFsbEFwcHJvdmFscyAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBhbGxBcHByb3ZhbHMuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSk7CisgICAgICB9IGVsc2UgaWYgKGxpbWl0ZWRBcHByb3ZhbHMgIT0gbnVsbCAmJgorICAgICAgICAgIChsaW1pdGVkSWRzID09IG51bGwgfHwgbGltaXRlZElkcy5jb250YWlucyhjLmN1cnJlbnRQYXRjaFNldElkKCkpKSkgeworICAgICAgICByZXR1cm4gbGltaXRlZEFwcHJvdmFscy5nZXQoYy5jdXJyZW50UGF0Y2hTZXRJZCgpKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGN1cnJlbnRBcHByb3ZhbHMgPSBkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpCi0gICAgICAgICAgICAuYnlQYXRjaFNldChjLmN1cnJlbnRQYXRjaFNldElkKCkpLnRvTGlzdCgpOworICAgICAgICBjdXJyZW50QXBwcm92YWxzID0gc29ydEFwcHJvdmFscyhkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpCisgICAgICAgICAgICAuYnlQYXRjaFNldChjLmN1cnJlbnRQYXRjaFNldElkKCkpKTsKICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGN1cnJlbnRBcHByb3ZhbHM7CkBAIC0yNjYsMzcgKzMxMyw5OCBAQAogICAgIHJldHVybiBjb21taXRNZXNzYWdlOwogICB9CiAKKyAgLyoqCisgICAqIEBwYXJhbSBkYiByZXZpZXcgZGF0YWJhc2UuCisgICAqIEByZXR1cm4gcGF0Y2hlcyBmb3IgdGhlIGNoYW5nZS4gSWYge0BsaW5rICNsaW1pdFRvUGF0Y2hTZXRzKENvbGxlY3Rpb24pfQorICAgKiAgICAgd2FzIHByZXZpb3VzbHkgY2FsbGVkLCBvbmx5IGNvbnRhaW5zIHBhdGNoZXMgd2l0aCB0aGUgc3BlY2lmaWVkIElEcy4KKyAgICogQHRocm93cyBPcm1FeGNlcHRpb24gYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB0aGUgZGF0YWJhc2UuCisgICAqLwogICBwdWJsaWMgQ29sbGVjdGlvbjxQYXRjaFNldD4gcGF0Y2hlcyhQcm92aWRlcjxSZXZpZXdEYj4gZGIpCiAgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKICAgICBpZiAocGF0Y2hlcyA9PSBudWxsKSB7Ci0gICAgICBwYXRjaGVzID0gZGIuZ2V0KCkucGF0Y2hTZXRzKCkuYnlDaGFuZ2UobGVnYWN5SWQpLnRvTGlzdCgpOworICAgICAgaWYgKGxpbWl0ZWRJZHMgIT0gbnVsbCkgeworICAgICAgICBwYXRjaGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgIGZvciAoUGF0Y2hTZXQgcHMgOiBkYi5nZXQoKS5wYXRjaFNldHMoKS5ieUNoYW5nZShsZWdhY3lJZCkpIHsKKyAgICAgICAgICBpZiAobGltaXRlZElkcy5jb250YWlucyhwcy5nZXRJZCgpKSkgeworICAgICAgICAgICAgcGF0Y2hlcy5hZGQocHMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGF0Y2hlcyA9IGRiLmdldCgpLnBhdGNoU2V0cygpLmJ5Q2hhbmdlKGxlZ2FjeUlkKS50b0xpc3QoKTsKKyAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHBhdGNoZXM7CiAgIH0KIAotICBwdWJsaWMgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBhcHByb3ZhbHMoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKQorICAvKioKKyAgICogQHBhcmFtIGRiIHJldmlldyBkYXRhYmFzZS4KKyAgICogQHJldHVybiBwYXRjaCBzZXQgYXBwcm92YWxzIGZvciB0aGUgY2hhbmdlIGluIHRpbWVzdGFtcCBvcmRlci4gSWYKKyAgICogICAgIHtAbGluayAjbGltaXRUb1BhdGNoU2V0cyhDb2xsZWN0aW9uKX0gd2FzIHByZXZpb3VzbHkgY2FsbGVkLCBvbmx5IGNvbnRhaW5zCisgICAqICAgICBhcHByb3ZhbHMgZm9yIHRoZSBwYXRjaGVzIHdpdGggdGhlIHNwZWNpZmllZCBJRHMuCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIGRhdGFiYXNlLgorICAgKi8KKyAgcHVibGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzKFByb3ZpZGVyPFJldmlld0RiPiBkYikKICAgICAgIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIGlmIChhcHByb3ZhbHMgPT0gbnVsbCkgewotICAgICAgYXBwcm92YWxzID0gZGIuZ2V0KCkucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShsZWdhY3lJZCkudG9MaXN0KCk7Ci0gICAgfQotICAgIHJldHVybiBhcHByb3ZhbHM7CisgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKGFwcHJvdmFsc01hcChkYikudmFsdWVzKCkpOwogICB9CiAKLSAgcHVibGljIE1hcDxQYXRjaFNldC5JZCxDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PiBhcHByb3ZhbHNNYXAoUHJvdmlkZXI8UmV2aWV3RGI+IGRiKQotICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgaWYgKGFwcHJvdmFsc01hcCA9PSBudWxsKSB7Ci0gICAgICBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFsbCA9IGFwcHJvdmFscyhkYik7Ci0gICAgICBhcHByb3ZhbHNNYXAgPSBuZXcgSGFzaE1hcDxQYXRjaFNldC5JZCxDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PihhbGwuc2l6ZSgpKTsKLSAgICAgIGZvciAoUGF0Y2hTZXRBcHByb3ZhbCBwc2EgOiBhbGwpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBjID0gYXBwcm92YWxzTWFwLmdldChwc2EuZ2V0UGF0Y2hTZXRJZCgpKTsKLSAgICAgICAgaWYgKGMgPT0gbnVsbCkgewotICAgICAgICAgIGMgPSBuZXcgQXJyYXlMaXN0PFBhdGNoU2V0QXBwcm92YWw+KCk7Ci0gICAgICAgICAgYXBwcm92YWxzTWFwLnB1dChwc2EuZ2V0UGF0Y2hTZXRJZCgpLCBjKTsKKyAgLyoqCisgICAqIEBwYXJhbSBkYiByZXZpZXcgZGF0YWJhc2UuCisgICAqIEByZXR1cm4gcGF0Y2ggc2V0IGFwcHJvdmFscyBmb3IgdGhlIGNoYW5nZSwga2V5ZWQgYnkgSUQsIG9yZGVyZWQgYnkKKyAgICogICAgIHRpbWVzdGFtcCB3aXRoaW4gZWFjaCBwYXRjaCBzZXQuIElmCisgICAqICAgICB7QGxpbmsgI2xpbWl0VG9QYXRjaFNldHMoQ29sbGVjdGlvbil9IHdhcyBwcmV2aW91c2x5IGNhbGxlZCwgb25seQorICAgKiAgICAgY29udGFpbnMgYXBwcm92YWxzIGZvciB0aGUgcGF0Y2hlcyB3aXRoIHRoZSBzcGVjaWZpZWQgSURzLgorICAgKiBAdGhyb3dzIE9ybUV4Y2VwdGlvbiBhbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHRoZSBkYXRhYmFzZS4KKyAgICovCisgIHB1YmxpYyBMaXN0TXVsdGltYXA8UGF0Y2hTZXQuSWQsIFBhdGNoU2V0QXBwcm92YWw+IGFwcHJvdmFsc01hcCgKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYikgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CisgICAgaWYgKGxpbWl0ZWRBcHByb3ZhbHMgPT0gbnVsbCkgeworICAgICAgbGltaXRlZEFwcHJvdmFscyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgICAgaWYgKGFsbEFwcHJvdmFscyAhPSBudWxsKSB7CisgICAgICAgIGZvciAoUGF0Y2hTZXQuSWQgaWQgOiBsaW1pdGVkSWRzKSB7CisgICAgICAgICAgbGltaXRlZEFwcHJvdmFscy5wdXRBbGwoaWQsIGFsbEFwcHJvdmFscy5nZXQoaWQpKTsKICAgICAgICAgfQotICAgICAgICBjLmFkZChwc2EpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBzYSA6IHNvcnRBcHByb3ZhbHMoCisgICAgICAgICAgICBkYi5nZXQoKS5wYXRjaFNldEFwcHJvdmFscygpLmJ5Q2hhbmdlKGxlZ2FjeUlkKSkpIHsKKyAgICAgICAgICBpZiAobGltaXRlZElkcyA9PSBudWxsIHx8IGxpbWl0ZWRJZHMuY29udGFpbnMobGVnYWN5SWQpKSB7CisgICAgICAgICAgICBsaW1pdGVkQXBwcm92YWxzLnB1dChwc2EuZ2V0UGF0Y2hTZXRJZCgpLCBwc2EpOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gYXBwcm92YWxzTWFwOworICAgIHJldHVybiBsaW1pdGVkQXBwcm92YWxzOworICB9CisKKyAgLyoqCisgICAqIEBwYXJhbSBkYiByZXZpZXcgZGF0YWJhc2UuCisgICAqIEByZXR1cm4gYWxsIHBhdGNoIHNldCBhcHByb3ZhbHMgZm9yIHRoZSBjaGFuZ2UgaW4gdGltZXN0YW1wIG9yZGVyCisgICAqICAgICAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHtAbGluayAjbGltaXRUb1BhdGNoU2V0cyhDb2xsZWN0aW9uKX0gd2FzCisgICAqICAgICBwcmV2aW91c2x5IGNhbGxlZCkuCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIGRhdGFiYXNlLgorICAgKi8KKyAgcHVibGljIExpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzKFByb3ZpZGVyPFJldmlld0RiPiBkYikKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHJldHVybiBJbW11dGFibGVMaXN0LmNvcHlPZihhbGxBcHByb3ZhbHNNYXAoZGIpLnZhbHVlcygpKTsKKyAgfQorCisgIC8qKgorICAgKiBAcGFyYW0gZGIgcmV2aWV3IGRhdGFiYXNlLgorICAgKiBAcmV0dXJuIGFsbCBwYXRjaCBzZXQgYXBwcm92YWxzIGZvciB0aGUgY2hhbmdlIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgICogICAgIHtAbGluayAjbGltaXRUb1BhdGNoU2V0cyhDb2xsZWN0aW9uKX0gd2FzIHByZXZpb3VzbHkgY2FsbGVkKSwga2V5ZWQgYnkKKyAgICogICAgIElELCBvcmRlcmVkIGJ5IHRpbWVzdGFtcCB3aXRoaW4gZWFjaCBwYXRjaCBzZXQuCisgICAqIEB0aHJvd3MgT3JtRXhjZXB0aW9uIGFuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhlIGRhdGFiYXNlLgorICAgKi8KKyAgcHVibGljIExpc3RNdWx0aW1hcDxQYXRjaFNldC5JZCwgUGF0Y2hTZXRBcHByb3ZhbD4gYWxsQXBwcm92YWxzTWFwKAorICAgICAgUHJvdmlkZXI8UmV2aWV3RGI+IGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpZiAoYWxsQXBwcm92YWxzID09IG51bGwpIHsKKyAgICAgIGFsbEFwcHJvdmFscyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOworICAgICAgZm9yIChQYXRjaFNldEFwcHJvdmFsIHBzYSA6IHNvcnRBcHByb3ZhbHMoCisgICAgICAgICAgZGIuZ2V0KCkucGF0Y2hTZXRBcHByb3ZhbHMoKS5ieUNoYW5nZShsZWdhY3lJZCkpKSB7CisgICAgICAgIGFsbEFwcHJvdmFscy5wdXQocHNhLmdldFBhdGNoU2V0SWQoKSwgcHNhKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFsbEFwcHJvdmFsczsKICAgfQogCiAgIHB1YmxpYyBDb2xsZWN0aW9uPFBhdGNoTGluZUNvbW1lbnQ+IGNvbW1lbnRzKFByb3ZpZGVyPFJldmlld0RiPiBkYikKQEAgLTMyMiw0ICs0MzAsMTIgQEAKICAgICB9CiAgICAgcmV0dXJuIG1lc3NhZ2VzOwogICB9CisKKyAgcHVibGljIHZvaWQgc2V0U3VibWl0UmVjb3JkcyhMaXN0PFN1Ym1pdFJlY29yZD4gcmVjb3JkcykgeworICAgIHN1Ym1pdFJlY29yZHMgPSByZWNvcmRzOworICB9CisKKyAgcHVibGljIExpc3Q8U3VibWl0UmVjb3JkPiBnZXRTdWJtaXRSZWNvcmRzKCkgeworICAgIHJldHVybiBzdWJtaXRSZWNvcmRzOworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9DaGFuZ2VRdWVyeUJ1aWxkZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZVF1ZXJ5QnVpbGRlci5qYXZhCmluZGV4IGU4MGFkNjcuLjdiYmIwNzMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZVF1ZXJ5QnVpbGRlci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZVF1ZXJ5QnVpbGRlci5qYXZhCkBAIC0xNSw3ICsxNSw2IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2U7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR3JvdXBSZWZlcmVuY2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKQEAgLTEwNywxMSArMTA2LDkgQEAKICAgICBmaW5hbCBQcm92aWRlcjxDaGFuZ2VRdWVyeVJld3JpdGVyPiByZXdyaXRlcjsKICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKICAgICBmaW5hbCBDYXBhYmlsaXR5Q29udHJvbC5GYWN0b3J5IGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeTsKLSAgICBmaW5hbCBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3Rvcnk7CiAgICAgZmluYWwgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjaGFuZ2VDb250cm9sR2VuZXJpY0ZhY3Rvcnk7CiAgICAgZmluYWwgQWNjb3VudFJlc29sdmVyIGFjY291bnRSZXNvbHZlcjsKICAgICBmaW5hbCBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kOwotICAgIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKICAgICBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lOwogICAgIGZpbmFsIFBhdGNoTGlzdENhY2hlIHBhdGNoTGlzdENhY2hlOwogICAgIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwpAQCAtMTIyLDExICsxMTksOSBAQAogICAgICAgICBQcm92aWRlcjxDaGFuZ2VRdWVyeVJld3JpdGVyPiByZXdyaXRlciwKICAgICAgICAgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgdXNlckZhY3RvcnksCiAgICAgICAgIENhcGFiaWxpdHlDb250cm9sLkZhY3RvcnkgY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5LAotICAgICAgICBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2hhbmdlQ29udHJvbEZhY3RvcnksCiAgICAgICAgIENoYW5nZUNvbnRyb2wuR2VuZXJpY0ZhY3RvcnkgY2hhbmdlQ29udHJvbEdlbmVyaWNGYWN0b3J5LAogICAgICAgICBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyLAogICAgICAgICBHcm91cEJhY2tlbmQgZ3JvdXBCYWNrZW5kLAotICAgICAgICBBcHByb3ZhbFR5cGVzIGFwcHJvdmFsVHlwZXMsCiAgICAgICAgIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0c05hbWUsCiAgICAgICAgIFBhdGNoTGlzdENhY2hlIHBhdGNoTGlzdENhY2hlLAogICAgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlciwKQEAgLTEzNSwxMSArMTMwLDkgQEAKICAgICAgIHRoaXMucmV3cml0ZXIgPSByZXdyaXRlcjsKICAgICAgIHRoaXMudXNlckZhY3RvcnkgPSB1c2VyRmFjdG9yeTsKICAgICAgIHRoaXMuY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5ID0gY2FwYWJpbGl0eUNvbnRyb2xGYWN0b3J5OwotICAgICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNoYW5nZUNvbnRyb2xGYWN0b3J5OwogICAgICAgdGhpcy5jaGFuZ2VDb250cm9sR2VuZXJpY0ZhY3RvcnkgPSBjaGFuZ2VDb250cm9sR2VuZXJpY0ZhY3Rvcnk7CiAgICAgICB0aGlzLmFjY291bnRSZXNvbHZlciA9IGFjY291bnRSZXNvbHZlcjsKICAgICAgIHRoaXMuZ3JvdXBCYWNrZW5kID0gZ3JvdXBCYWNrZW5kOwotICAgICAgdGhpcy5hcHByb3ZhbFR5cGVzID0gYXBwcm92YWxUeXBlczsKICAgICAgIHRoaXMuYWxsUHJvamVjdHNOYW1lID0gYWxsUHJvamVjdHNOYW1lOwogICAgICAgdGhpcy5wYXRjaExpc3RDYWNoZSA9IHBhdGNoTGlzdENhY2hlOwogICAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOwpAQCAtMzA0LDggKzI5Nyw5IEBACiAKICAgQE9wZXJhdG9yCiAgIHB1YmxpYyBQcmVkaWNhdGU8Q2hhbmdlRGF0YT4gbGFiZWwoU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gbmV3IExhYmVsUHJlZGljYXRlKGFyZ3MuY2hhbmdlQ29udHJvbEdlbmVyaWNGYWN0b3J5LAotICAgICAgICBhcmdzLnVzZXJGYWN0b3J5LCBhcmdzLmRiUHJvdmlkZXIsIGFyZ3MuYXBwcm92YWxUeXBlcywgbmFtZSk7CisgICAgcmV0dXJuIG5ldyBMYWJlbFByZWRpY2F0ZShhcmdzLnByb2plY3RDYWNoZSwKKyAgICAgICAgYXJncy5jaGFuZ2VDb250cm9sR2VuZXJpY0ZhY3RvcnksIGFyZ3MudXNlckZhY3RvcnksIGFyZ3MuZGJQcm92aWRlciwKKyAgICAgICAgbmFtZSk7CiAgIH0KIAogICBAT3BlcmF0b3IKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZVF1ZXJ5UmV3cml0ZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0NoYW5nZVF1ZXJ5UmV3cml0ZXIuamF2YQppbmRleCAzNGVjMmY0Li5lNjI1MWJjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9DaGFuZ2VRdWVyeVJld3JpdGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvQ2hhbmdlUXVlcnlSZXdyaXRlci5qYXZhCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgICAgICAgIG5ldyBDaGFuZ2VRdWVyeUJ1aWxkZXIuQXJndW1lbnRzKCAvLwogICAgICAgICAgICAgICAgICAgbmV3IEludmFsaWRQcm92aWRlcjxSZXZpZXdEYj4oKSwgLy8KICAgICAgICAgICAgICAgICAgIG5ldyBJbnZhbGlkUHJvdmlkZXI8Q2hhbmdlUXVlcnlSZXdyaXRlcj4oKSwgLy8KLSAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIC8vCisgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAvLwogICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCksIG51bGwpKTsKIAogICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyOwpAQCAtNTIsNyArNTIsNyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgUHJlZGljYXRlPENoYW5nZURhdGE+IGFuZChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQcmVkaWNhdGU8Q2hhbmdlRGF0YT4+IGwpIHsKLSAgICByZXR1cm4gaGFzU291cmNlKGwpID8gbmV3IEFuZFNvdXJjZShsKSA6IHN1cGVyLmFuZChsKTsKKyAgICByZXR1cm4gaGFzU291cmNlKGwpID8gbmV3IEFuZFNvdXJjZShkYlByb3ZpZGVyLCBsKSA6IHN1cGVyLmFuZChsKTsKICAgfQogCiAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvTGFiZWxQcmVkaWNhdGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL0xhYmVsUHJlZGljYXRlLmphdmEKaW5kZXggYmYyMTI2MS4uYjBkMDJmOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvTGFiZWxQcmVkaWNhdGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9MYWJlbFByZWRpY2F0ZS5qYXZhCkBAIC0xNCwxOSArMTQsMjQgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuT3BlcmF0b3JQcmVkaWNhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKQEAgLTU0LDM0ICs1OSwyNCBAQAogICAgIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2goaW50IHBzVmFsdWUsIGludCBleHBWYWx1ZSk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBBcHByb3ZhbENhdGVnb3J5IGNhdGVnb3J5KEFwcHJvdmFsVHlwZXMgdHlwZXMsIFN0cmluZyB0b0ZpbmQpIHsKKyAgcHJpdmF0ZSBzdGF0aWMgTGFiZWxUeXBlIHR5cGUoTGFiZWxUeXBlcyB0eXBlcywgU3RyaW5nIHRvRmluZCkgewogICAgIGlmICh0eXBlcy5ieUxhYmVsKHRvRmluZCkgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIHR5cGVzLmJ5TGFiZWwodG9GaW5kKS5nZXRDYXRlZ29yeSgpOworICAgICAgcmV0dXJuIHR5cGVzLmJ5TGFiZWwodG9GaW5kKTsKICAgICB9CiAKLSAgICBpZiAodHlwZXMuYnlJZChuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCh0b0ZpbmQpKSAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gdHlwZXMuYnlJZChuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCh0b0ZpbmQpKS5nZXRDYXRlZ29yeSgpOwotICAgIH0KLQotICAgIGZvciAoQXBwcm92YWxUeXBlIGF0IDogdHlwZXMuZ2V0QXBwcm92YWxUeXBlcygpKSB7Ci0gICAgICBBcHByb3ZhbENhdGVnb3J5IGNhdGVnb3J5ID0gYXQuZ2V0Q2F0ZWdvcnkoKTsKLQotICAgICAgaWYgKHRvRmluZC5lcXVhbHNJZ25vcmVDYXNlKGNhdGVnb3J5LmdldE5hbWUoKSkpIHsKLSAgICAgICAgcmV0dXJuIGNhdGVnb3J5OwotCi0gICAgICB9IGVsc2UgaWYgKHRvRmluZC5lcXVhbHNJZ25vcmVDYXNlKGNhdGVnb3J5LmdldE5hbWUoKS5yZXBsYWNlKCIgIiwgIiIpKSkgewotICAgICAgICByZXR1cm4gY2F0ZWdvcnk7CisgICAgZm9yIChMYWJlbFR5cGUgbHQgOiB0eXBlcy5nZXRMYWJlbFR5cGVzKCkpIHsKKyAgICAgIGlmICh0b0ZpbmQuZXF1YWxzSWdub3JlQ2FzZShsdC5nZXROYW1lKCkpKSB7CisgICAgICAgIHJldHVybiBsdDsKICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKEFwcHJvdmFsVHlwZSBhdCA6IHR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKSkgewotICAgICAgQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeSA9IGF0LmdldENhdGVnb3J5KCk7Ci0gICAgICBpZiAodG9GaW5kLmVxdWFsc0lnbm9yZUNhc2UoY2F0ZWdvcnkuZ2V0QWJicmV2aWF0ZWROYW1lKCkpKSB7Ci0gICAgICAgIHJldHVybiBjYXRlZ29yeTsKKyAgICBmb3IgKExhYmVsVHlwZSBsdCA6IHR5cGVzLmdldExhYmVsVHlwZXMoKSkgeworICAgICAgaWYgKHRvRmluZC5lcXVhbHNJZ25vcmVDYXNlKGx0LmdldEFiYnJldmlhdGlvbigpKSkgeworICAgICAgICByZXR1cm4gbHQ7CiAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG5ldyBBcHByb3ZhbENhdGVnb3J5KG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKHRvRmluZCksIHRvRmluZCk7CisgICAgcmV0dXJuIExhYmVsVHlwZS53aXRoRGVmYXVsdFZhbHVlcyh0b0ZpbmQpOwogICB9CiAKICAgcHJpdmF0ZSBzdGF0aWMgVGVzdCBvcChTdHJpbmcgb3ApIHsKQEAgLTEwNiw3MiArMTAxLDEwOCBAQAogICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKICAgfQogCisgIHByaXZhdGUgZmluYWwgUHJvamVjdENhY2hlIHByb2plY3RDYWNoZTsKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNjRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlcjsKICAgcHJpdmF0ZSBmaW5hbCBUZXN0IHRlc3Q7Ci0gIHByaXZhdGUgZmluYWwgQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeTsKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGVybWlzc2lvbk5hbWU7CisgIHByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGU7CiAgIHByaXZhdGUgZmluYWwgaW50IGV4cFZhbDsKIAotICBMYWJlbFByZWRpY2F0ZShDaGFuZ2VDb250cm9sLkdlbmVyaWNGYWN0b3J5IGNjRmFjdG9yeSwKLSAgICAgIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5LCBQcm92aWRlcjxSZXZpZXdEYj4gZGJQcm92aWRlciwKLSAgICAgIEFwcHJvdmFsVHlwZXMgdHlwZXMsIFN0cmluZyB2YWx1ZSkgeworICBMYWJlbFByZWRpY2F0ZShQcm9qZWN0Q2FjaGUgcHJvamVjdENhY2hlLAorICAgICAgQ2hhbmdlQ29udHJvbC5HZW5lcmljRmFjdG9yeSBjY0ZhY3RvcnksCisgICAgICBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKKyAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYlByb3ZpZGVyLAorICAgICAgU3RyaW5nIHZhbHVlKSB7CiAgICAgc3VwZXIoQ2hhbmdlUXVlcnlCdWlsZGVyLkZJRUxEX0xBQkVMLCB2YWx1ZSk7CiAgICAgdGhpcy5jY0ZhY3RvcnkgPSBjY0ZhY3Rvcnk7CisgICAgdGhpcy5wcm9qZWN0Q2FjaGUgPSBwcm9qZWN0Q2FjaGU7CiAgICAgdGhpcy51c2VyRmFjdG9yeSA9IHVzZXJGYWN0b3J5OwogICAgIHRoaXMuZGJQcm92aWRlciA9IGRiUHJvdmlkZXI7CiAKICAgICBNYXRjaGVyIG0xID0gUGF0dGVybi5jb21waWxlKCIoPXw+PXw8PSkoWystXT9cXGQrKSQiKS5tYXRjaGVyKHZhbHVlKTsKICAgICBNYXRjaGVyIG0yID0gUGF0dGVybi5jb21waWxlKCIoWystXVxcZCspJCIpLm1hdGNoZXIodmFsdWUpOwogICAgIGlmIChtMS5maW5kKCkpIHsKLSAgICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkodHlwZXMsIHZhbHVlLnN1YnN0cmluZygwLCBtMS5zdGFydCgpKSk7CisgICAgICB0eXBlID0gdmFsdWUuc3Vic3RyaW5nKDAsIG0xLnN0YXJ0KCkpOwogICAgICAgdGVzdCA9IG9wKG0xLmdyb3VwKDEpKTsKICAgICAgIGV4cFZhbCA9IHZhbHVlKG0xLmdyb3VwKDIpKTsKIAogICAgIH0gZWxzZSBpZiAobTIuZmluZCgpKSB7Ci0gICAgICBjYXRlZ29yeSA9IGNhdGVnb3J5KHR5cGVzLCB2YWx1ZS5zdWJzdHJpbmcoMCwgbTIuc3RhcnQoKSkpOworICAgICAgdHlwZSA9IHZhbHVlLnN1YnN0cmluZygwLCBtMi5zdGFydCgpKTsKICAgICAgIHRlc3QgPSBUZXN0LkVROwogICAgICAgZXhwVmFsID0gdmFsdWUobTIuZ3JvdXAoMSkpOwogCiAgICAgfSBlbHNlIHsKLSAgICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkodHlwZXMsIHZhbHVlKTsKKyAgICAgIHR5cGUgPSB2YWx1ZTsKICAgICAgIHRlc3QgPSBUZXN0LkVROwogICAgICAgZXhwVmFsID0gMTsKICAgICB9Ci0KLSAgICB0aGlzLnBlcm1pc3Npb25OYW1lID0gUGVybWlzc2lvbi5mb3JMYWJlbChjYXRlZ29yeS5nZXRMYWJlbE5hbWUoKSk7CiAgIH0KIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gbWF0Y2goZmluYWwgQ2hhbmdlRGF0YSBvYmplY3QpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIGZpbmFsIENoYW5nZSBjID0gb2JqZWN0LmNoYW5nZShkYlByb3ZpZGVyKTsKKyAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAvLyBUaGUgY2hhbmdlIGhhcyBkaXNhcHBlYXJlZC4KKyAgICAgIC8vCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZpbmFsIFByb2plY3RTdGF0ZSBwcm9qZWN0ID0gcHJvamVjdENhY2hlLmdldChjLmdldERlc3QoKS5nZXRQYXJlbnRLZXkoKSk7CisgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgeworICAgICAgLy8gVGhlIHByb2plY3QgaGFzIGRpc2FwcGVhcmVkLgorICAgICAgLy8KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZmluYWwgTGFiZWxUeXBlIGxhYmVsVHlwZSA9IHR5cGUocHJvamVjdC5nZXRMYWJlbFR5cGVzKCksIHR5cGUpOworICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBhbGxBcHByb3ZlcnMgPSBuZXcgSGFzaFNldDxBY2NvdW50LklkPigpOworICAgIGZpbmFsIFNldDxBY2NvdW50LklkPiBhcHByb3ZlcnNUaGF0Vm90ZWRJbkNhdGVnb3J5ID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oKTsKICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcCA6IG9iamVjdC5jdXJyZW50QXBwcm92YWxzKGRiUHJvdmlkZXIpKSB7Ci0gICAgICBpZiAocC5nZXRDYXRlZ29yeUlkKCkuZXF1YWxzKGNhdGVnb3J5LmdldElkKCkpKSB7Ci0gICAgICAgIGludCBwc1ZhbCA9IHAuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHRlc3QubWF0Y2gocHNWYWwsIGV4cFZhbCkpIHsKLSAgICAgICAgICAvLyBEb3VibGUgY2hlY2sgdGhlIHZhbHVlIGlzIHN0aWxsIHBlcm1pdHRlZCBmb3IgdGhlIHVzZXIuCi0gICAgICAgICAgLy8KLSAgICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2hhbmdlQ29udHJvbCBjYyA9IGNjRmFjdG9yeS5jb250cm9sRm9yKG9iamVjdC5jaGFuZ2UoZGJQcm92aWRlciksIC8vCi0gICAgICAgICAgICAgICAgdXNlckZhY3RvcnkuY3JlYXRlKGRiUHJvdmlkZXIsIHAuZ2V0QWNjb3VudElkKCkpKTsKLSAgICAgICAgICAgIGlmICghY2MuaXNWaXNpYmxlKGRiUHJvdmlkZXIuZ2V0KCkpKSB7Ci0gICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGNhbid0IHNlZSB0aGUgY2hhbmdlIGFueW1vcmUuCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHNWYWwgPSBjYy5nZXRSYW5nZShwZXJtaXNzaW9uTmFtZSkuc3F1YXNoKHBzVmFsKTsKLSAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gVGhlIHByb2plY3QgaGFzIGRpc2FwcGVhcmVkLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICh0ZXN0Lm1hdGNoKHBzVmFsLCBleHBWYWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9CisgICAgICBhbGxBcHByb3ZlcnMuYWRkKHAuZ2V0QWNjb3VudElkKCkpOworICAgICAgaWYgKGxhYmVsVHlwZS5tYXRjaGVzKHApKSB7CisgICAgICAgIGFwcHJvdmVyc1RoYXRWb3RlZEluQ2F0ZWdvcnkuYWRkKHAuZ2V0QWNjb3VudElkKCkpOworICAgICAgICBpZiAobWF0Y2goYywgcC5nZXRWYWx1ZSgpLCBwLmdldEFjY291bnRJZCgpLCBsYWJlbFR5cGUpKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisKKyAgICBmaW5hbCBTZXQ8QWNjb3VudC5JZD4gYXBwcm92ZXJzVGhhdERpZE5vdFZvdGVJbkNhdGVnb3J5ID0gbmV3IEhhc2hTZXQ8QWNjb3VudC5JZD4oYWxsQXBwcm92ZXJzKTsKKyAgICBhcHByb3ZlcnNUaGF0RGlkTm90Vm90ZUluQ2F0ZWdvcnkucmVtb3ZlQWxsKGFwcHJvdmVyc1RoYXRWb3RlZEluQ2F0ZWdvcnkpOworICAgIGZvciAoQWNjb3VudC5JZCBhIDogYXBwcm92ZXJzVGhhdERpZE5vdFZvdGVJbkNhdGVnb3J5KSB7CisgICAgICBpZiAobWF0Y2goYywgMCwgYSwgbGFiZWxUeXBlKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIGJvb2xlYW4gbWF0Y2goZmluYWwgQ2hhbmdlIGNoYW5nZSwgZmluYWwgaW50IHZhbHVlLAorICAgICAgZmluYWwgQWNjb3VudC5JZCBhcHByb3ZlciwgZmluYWwgTGFiZWxUeXBlIHR5cGUpCisgICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICBpbnQgcHNWYWwgPSB2YWx1ZTsKKyAgICBpZiAodGVzdC5tYXRjaChwc1ZhbCwgZXhwVmFsKSkgeworICAgICAgLy8gRG91YmxlIGNoZWNrIHRoZSB2YWx1ZSBpcyBzdGlsbCBwZXJtaXR0ZWQgZm9yIHRoZSB1c2VyLgorICAgICAgLy8KKyAgICAgIHRyeSB7CisgICAgICAgIENoYW5nZUNvbnRyb2wgY2MgPSBjY0ZhY3RvcnkuY29udHJvbEZvcihjaGFuZ2UsIC8vCisgICAgICAgICAgICB1c2VyRmFjdG9yeS5jcmVhdGUoZGJQcm92aWRlciwgYXBwcm92ZXIpKTsKKyAgICAgICAgaWYgKCFjYy5pc1Zpc2libGUoZGJQcm92aWRlci5nZXQoKSkpIHsKKyAgICAgICAgICAvLyBUaGUgdXNlciBjYW4ndCBzZWUgdGhlIGNoYW5nZSBhbnltb3JlLgorICAgICAgICAgIC8vCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzVmFsID0gY2MuZ2V0UmFuZ2UoUGVybWlzc2lvbi5mb3JMYWJlbCh0eXBlLmdldE5hbWUoKSkpLnNxdWFzaChwc1ZhbCk7CisgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgeworICAgICAgICAvLyBUaGUgcHJvamVjdCBoYXMgZGlzYXBwZWFyZWQuCisgICAgICAgIC8vCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKHRlc3QubWF0Y2gocHNWYWwsIGV4cFZhbCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9MaXN0Q2hhbmdlcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvTGlzdENoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlZDY2YS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9MaXN0Q2hhbmdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkFMTF9DT01NSVRTOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5BTExfRklMRVM7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkFMTF9SRVZJU0lPTlM7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5jaGFuZ2VzLkxpc3RDaGFuZ2VzT3B0aW9uLkNVUlJFTlRfQ09NTUlUOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5DVVJSRU5UX0ZJTEVTOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5DVVJSRU5UX1JFVklTSU9OOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uY2hhbmdlcy5MaXN0Q2hhbmdlc09wdGlvbi5MQUJFTFM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZU1lc3NhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEluZm8uUGFyZW50SW5mbzsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuVXNlcklkZW50aXR5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQW5vbnltb3VzVXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLklkZW50aWZpZWRVc2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5BY2NvdW50QXR0cmlidXRlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdENhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaExpc3RFbnRyeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGF0Y2guUGF0Y2hMaXN0Tm90QXZhaWxhYmxlRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9GYWN0b3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5QYXRjaFNldEluZm9Ob3RBdmFpbGFibGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LlF1ZXJ5UGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5yZWZsZWN0LlR5cGVUb2tlbjsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247Ci0KLWltcG9ydCBjb20uamNyYWZ0LmpzY2guSG9zdEtleTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuc3FsLlRpbWVzdGFtcDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGNsYXNzIExpc3RDaGFuZ2VzIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExpc3RDaGFuZ2VzLmNsYXNzKTsKLQotICBAU2luZ2xldG9uCi0gIHN0YXRpYyBjbGFzcyBVcmxzIHsKLSAgICBmaW5hbCBTdHJpbmcgZ2l0OwotICAgIGZpbmFsIFN0cmluZyBodHRwOwotCi0gICAgQEluamVjdAotICAgIFVybHMoQEdlcnJpdFNlcnZlckNvbmZpZyBDb25maWcgY2ZnKSB7Ci0gICAgICB0aGlzLmdpdCA9IGVuc3VyZVNsYXNoKGNmZy5nZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJjYW5vbmljYWxHaXRVcmwiKSk7Ci0gICAgICB0aGlzLmh0dHAgPSBlbnN1cmVTbGFzaChjZmcuZ2V0U3RyaW5nKCJnZXJyaXQiLCBudWxsLCAiZ2l0SHR0cFVybCIpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5zdXJlU2xhc2goU3RyaW5nIGluKSB7Ci0gICAgICBpZiAoaW4gIT0gbnVsbCAmJiAhaW4uZW5kc1dpdGgoIi8iKSkgewotICAgICAgICByZXR1cm4gaW4gKyAiLyI7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gaW47Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBRdWVyeVByb2Nlc3NvciBpbXA7Ci0gIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKLSAgcHJpdmF0ZSBmaW5hbCBDdXJyZW50VXNlciB1c2VyOwotICBwcml2YXRlIGZpbmFsIEFub255bW91c1VzZXIgYW5vbnltb3VzOwotICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKLSAgcHJpdmF0ZSBmaW5hbCBQYXRjaFNldEluZm9GYWN0b3J5IHBhdGNoU2V0SW5mb0ZhY3Rvcnk7Ci0gIHByaXZhdGUgZmluYWwgUGF0Y2hMaXN0Q2FjaGUgcGF0Y2hMaXN0Q2FjaGU7Ci0gIHByaXZhdGUgZmluYWwgU3NoSW5mbyBzc2hJbmZvOwotICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXI7Ci0gIHByaXZhdGUgZmluYWwgVXJscyB1cmxzOwotICBwcml2YXRlIGJvb2xlYW4gcmV2ZXJzZTsKLSAgcHJpdmF0ZSBNYXA8QWNjb3VudC5JZCwgQWNjb3VudEF0dHJpYnV0ZT4gYWNjb3VudHM7Ci0gIHByaXZhdGUgTWFwPENoYW5nZS5JZCwgQ2hhbmdlQ29udHJvbD4gY29udHJvbHM7Ci0gIHByaXZhdGUgRW51bVNldDxMaXN0Q2hhbmdlc09wdGlvbj4gb3B0aW9uczsKLQotICBAT3B0aW9uKG5hbWUgPSAiLS1mb3JtYXQiLCBtZXRhVmFyID0gIkZNVCIsIHVzYWdlID0gIk91dHB1dCBkaXNwbGF5IGZvcm1hdCIpCi0gIHByaXZhdGUgT3V0cHV0Rm9ybWF0IGZvcm1hdCA9IE91dHB1dEZvcm1hdC5URVhUOwotCi0gIEBPcHRpb24obmFtZSA9ICItLXF1ZXJ5IiwgYWxpYXNlcyA9IHsiLXEifSwgbWV0YVZhciA9ICJRVUVSWSIsIG11bHRpVmFsdWVkID0gdHJ1ZSwgdXNhZ2UgPSAiUXVlcnkgc3RyaW5nIikKLSAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcXVlcmllczsKLQotICBAT3B0aW9uKG5hbWUgPSAiLS1saW1pdCIsIGFsaWFzZXMgPSB7Ii1uIn0sIG1ldGFWYXIgPSAiQ05UIiwgdXNhZ2UgPSAiTWF4aW11bSBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4iKQotICBwdWJsaWMgdm9pZCBzZXRMaW1pdChpbnQgbGltaXQpIHsKLSAgICBpbXAuc2V0TGltaXQobGltaXQpOwotICB9Ci0KLSAgQE9wdGlvbihuYW1lID0gIi1vIiwgbXVsdGlWYWx1ZWQgPSB0cnVlLCB1c2FnZSA9ICJPdXRwdXQgb3B0aW9ucyBwZXIgY2hhbmdlIikKLSAgcHVibGljIHZvaWQgYWRkT3B0aW9uKExpc3RDaGFuZ2VzT3B0aW9uIG8pIHsKLSAgICBvcHRpb25zLmFkZChvKTsKLSAgfQotCi0gIEBPcHRpb24obmFtZSA9ICItTyIsIHVzYWdlID0gIk91dHB1dCBvcHRpb24gZmxhZ3MsIGluIGhleCIpCi0gIHZvaWQgc2V0T3B0aW9uRmxhZ3NIZXgoU3RyaW5nIGhleCkgewotICAgIG9wdGlvbnMuYWRkQWxsKExpc3RDaGFuZ2VzT3B0aW9uLmZyb21CaXRzKEludGVnZXIucGFyc2VJbnQoaGV4LCAxNikpKTsKLSAgfQotCi0gIEBPcHRpb24obmFtZSA9ICItUCIsIG1ldGFWYXIgPSAiU09SVEtFWSIsIHVzYWdlID0gIlByZXZpb3VzIGNoYW5nZXMgYmVmb3JlIFNPUlRLRVkiKQotICBwdWJsaWMgdm9pZCBzZXRTb3J0S2V5QWZ0ZXIoU3RyaW5nIGtleSkgewotICAgIC8vIFF1ZXJ5aW5nIGZvciB0aGUgcHJpb3IgcGFnZSBvZiBjaGFuZ2VzIHJlcXVpcmVzIHNvcnRrZXlfYWZ0ZXIgcHJlZGljYXRlLgotICAgIC8vIENoYW5nZXMgYXJlIHNob3duIG1vc3QgcmVjZW50LT5sZWFzdCByZWNlbnQuIFRoZSBwcmV2aW91cyBwYWdlIG9mCi0gICAgLy8gcmVzdWx0cyBjb250YWlucyBjaGFuZ2VzIHRoYXQgd2VyZSB1cGRhdGVkIGFmdGVyIHRoZSBnaXZlbiBrZXkuCi0gICAgaW1wLnNldFNvcnRrZXlBZnRlcihrZXkpOwotICAgIHJldmVyc2UgPSB0cnVlOwotICB9Ci0KLSAgQE9wdGlvbihuYW1lID0gIi1OIiwgbWV0YVZhciA9ICJTT1JUS0VZIiwgdXNhZ2UgPSAiTmV4dCBjaGFuZ2VzIGFmdGVyIFNPUlRLRVkiKQotICBwdWJsaWMgdm9pZCBzZXRTb3J0S2V5QmVmb3JlKFN0cmluZyBrZXkpIHsKLSAgICAvLyBRdWVyeWluZyBmb3IgdGhlIG5leHQgcGFnZSBvZiBjaGFuZ2VzIHJlcXVpcmVzIHNvcnRrZXlfYmVmb3JlIHByZWRpY2F0ZS4KLSAgICAvLyBDaGFuZ2VzIGFyZSBzaG93biBtb3N0IHJlY2VudC0+bGVhc3QgcmVjZW50LiBUaGUgbmV4dCBwYWdlIGNvbnRhaW5zCi0gICAgLy8gY2hhbmdlcyB0aGF0IHdlcmUgdXBkYXRlZCBiZWZvcmUgdGhlIGdpdmVuIGtleS4KLSAgICBpbXAuc2V0U29ydGtleUJlZm9yZShrZXkpOwotICB9Ci0KLSAgQEluamVjdAotICBMaXN0Q2hhbmdlcyhRdWVyeVByb2Nlc3NvciBxcCwKLSAgICAgIFByb3ZpZGVyPFJldmlld0RiPiBkYiwKLSAgICAgIEFwcHJvdmFsVHlwZXMgYXQsCi0gICAgICBDdXJyZW50VXNlciB1LAotICAgICAgQW5vbnltb3VzVXNlciBhdSwKLSAgICAgIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjZiwKLSAgICAgIFBhdGNoU2V0SW5mb0ZhY3RvcnkgcHNpLAotICAgICAgUGF0Y2hMaXN0Q2FjaGUgcGxjLAotICAgICAgU3NoSW5mbyBzc2hJbmZvLAotICAgICAgQENhbm9uaWNhbFdlYlVybCBQcm92aWRlcjxTdHJpbmc+IGN1cmwsCi0gICAgICBVcmxzIHVybHMpIHsKLSAgICB0aGlzLmltcCA9IHFwOwotICAgIHRoaXMuZGIgPSBkYjsKLSAgICB0aGlzLmFwcHJvdmFsVHlwZXMgPSBhdDsKLSAgICB0aGlzLnVzZXIgPSB1OwotICAgIHRoaXMuYW5vbnltb3VzID0gYXU7Ci0gICAgdGhpcy5jaGFuZ2VDb250cm9sRmFjdG9yeSA9IGNmOwotICAgIHRoaXMucGF0Y2hTZXRJbmZvRmFjdG9yeSA9IHBzaTsKLSAgICB0aGlzLnBhdGNoTGlzdENhY2hlID0gcGxjOwotICAgIHRoaXMuc3NoSW5mbyA9IHNzaEluZm87Ci0gICAgdGhpcy51cmxQcm92aWRlciA9IGN1cmw7Ci0gICAgdGhpcy51cmxzID0gdXJsczsKLQotICAgIGFjY291bnRzID0gTWFwcy5uZXdIYXNoTWFwKCk7Ci0gICAgY29udHJvbHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKLSAgICBvcHRpb25zID0gRW51bVNldC5ub25lT2YoTGlzdENoYW5nZXNPcHRpb24uY2xhc3MpOwotICB9Ci0KLSAgcHVibGljIE91dHB1dEZvcm1hdCBnZXRGb3JtYXQoKSB7Ci0gICAgcmV0dXJuIGZvcm1hdDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0Q2hhbmdlcyBzZXRGb3JtYXQoT3V0cHV0Rm9ybWF0IGZtdCkgewotICAgIHRoaXMuZm9ybWF0ID0gZm10OwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIExpc3RDaGFuZ2VzIGFkZFF1ZXJ5KFN0cmluZyBxdWVyeSkgewotICAgIGlmIChxdWVyaWVzID09IG51bGwpIHsKLSAgICAgIHF1ZXJpZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKLSAgICB9Ci0gICAgcXVlcmllcy5hZGQocXVlcnkpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcXVlcnkoV3JpdGVyIG91dCkKLSAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFF1ZXJ5UGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoaW1wLmlzRGlzYWJsZWQoKSkgewotICAgICAgdGhyb3cgbmV3IFF1ZXJ5UGFyc2VFeGNlcHRpb24oInF1ZXJ5IGRpc2FibGVkIik7Ci0gICAgfQotICAgIGlmIChxdWVyaWVzID09IG51bGwgfHwgcXVlcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgIHF1ZXJpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJzdGF0dXM6b3BlbiIpOwotICAgIH0gZWxzZSBpZiAocXVlcmllcy5zaXplKCkgPiAxMCkgewotICAgICAgLy8gSGFyZC1jb2RlIGEgZGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBxdWVyaWVzIHRvIHByZXZlbnQKLSAgICAgIC8vIHVzZXJzIGZyb20gc3VibWl0dGluZyB0b28gbXVjaCB0byB0aGUgc2VydmVyIGluIGEgc2luZ2xlIGNhbGwuCi0gICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUV4Y2VwdGlvbigibGltaXQgb2YgMTAgcXVlcmllcyIpOwotICAgIH0KLQotICAgIExpc3Q8TGlzdDxDaGFuZ2VJbmZvPj4gcmVzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KHF1ZXJpZXMuc2l6ZSgpKTsKLSAgICBmb3IgKFN0cmluZyBxdWVyeSA6IHF1ZXJpZXMpIHsKLSAgICAgIExpc3Q8Q2hhbmdlRGF0YT4gY2hhbmdlcyA9IGltcC5xdWVyeUNoYW5nZXMocXVlcnkpOwotICAgICAgYm9vbGVhbiBtb3JlQ2hhbmdlcyA9IGltcC5nZXRMaW1pdCgpID4gMCAmJiBjaGFuZ2VzLnNpemUoKSA+IGltcC5nZXRMaW1pdCgpOwotICAgICAgaWYgKG1vcmVDaGFuZ2VzKSB7Ci0gICAgICAgIGlmIChyZXZlcnNlKSB7Ci0gICAgICAgICAgY2hhbmdlcyA9IGNoYW5nZXMuc3ViTGlzdCgxLCBjaGFuZ2VzLnNpemUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2hhbmdlcyA9IGNoYW5nZXMuc3ViTGlzdCgwLCBpbXAuZ2V0TGltaXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIENoYW5nZURhdGEuZW5zdXJlQ2hhbmdlTG9hZGVkKGRiLCBjaGFuZ2VzKTsKLSAgICAgIENoYW5nZURhdGEuZW5zdXJlQ3VycmVudFBhdGNoU2V0TG9hZGVkKGRiLCBjaGFuZ2VzKTsKLSAgICAgIENoYW5nZURhdGEuZW5zdXJlQ3VycmVudEFwcHJvdmFsc0xvYWRlZChkYiwgY2hhbmdlcyk7Ci0KLSAgICAgIExpc3Q8Q2hhbmdlSW5mbz4gaW5mbyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShjaGFuZ2VzLnNpemUoKSk7Ci0gICAgICBmb3IgKENoYW5nZURhdGEgY2QgOiBjaGFuZ2VzKSB7Ci0gICAgICAgIGluZm8uYWRkKHRvQ2hhbmdlSW5mbyhjZCkpOwotICAgICAgfQotICAgICAgaWYgKG1vcmVDaGFuZ2VzICYmICFpbmZvLmlzRW1wdHkoKSkgewotICAgICAgICBpZiAocmV2ZXJzZSkgewotICAgICAgICAgIGluZm8uZ2V0KDApLl9tb3JlQ2hhbmdlcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW5mby5nZXQoaW5mby5zaXplKCkgLSAxKS5fbW9yZUNoYW5nZXMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXMuYWRkKGluZm8pOwotICAgIH0KLQotICAgIGlmICghYWNjb3VudHMuaXNFbXB0eSgpKSB7Ci0gICAgICBmb3IgKEFjY291bnQgYWNjb3VudCA6IGRiLmdldCgpLmFjY291bnRzKCkuZ2V0KGFjY291bnRzLmtleVNldCgpKSkgewotICAgICAgICBBY2NvdW50QXR0cmlidXRlIGEgPSBhY2NvdW50cy5nZXQoYWNjb3VudC5nZXRJZCgpKTsKLSAgICAgICAgYS5uYW1lID0gU3RyaW5ncy5lbXB0eVRvTnVsbChhY2NvdW50LmdldEZ1bGxOYW1lKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKLSAgICAgIGZvcm1hdC5uZXdHc29uKCkudG9Kc29uKAotICAgICAgICAgIHJlcy5zaXplKCkgPT0gMSA/IHJlcy5nZXQoMCkgOiByZXMsCi0gICAgICAgICAgbmV3IFR5cGVUb2tlbjxMaXN0PENoYW5nZUluZm8+PigpIHt9LmdldFR5cGUoKSwKLSAgICAgICAgICBvdXQpOwotICAgICAgb3V0LndyaXRlKCdcbicpOwotICAgIH0gZWxzZSB7Ci0gICAgICBib29sZWFuIGZpcnN0UXVlcnkgPSB0cnVlOwotICAgICAgZm9yIChMaXN0PENoYW5nZUluZm8+IGluZm8gOiByZXMpIHsKLSAgICAgICAgaWYgKGZpcnN0UXVlcnkpIHsKLSAgICAgICAgICBmaXJzdFF1ZXJ5ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgb3V0LndyaXRlKCdcbicpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoQ2hhbmdlSW5mbyBjIDogaW5mbykgewotICAgICAgICAgIFN0cmluZyBpZCA9IG5ldyBDaGFuZ2UuS2V5KGMuaWQpLmFiYnJldmlhdGUoKTsKLSAgICAgICAgICBTdHJpbmcgc3ViamVjdCA9IGMuc3ViamVjdDsKLSAgICAgICAgICBpZiAoc3ViamVjdC5sZW5ndGgoKSArIGlkLmxlbmd0aCgpID4gODApIHsKLSAgICAgICAgICAgIHN1YmplY3QgPSBzdWJqZWN0LnN1YnN0cmluZygwLCA4MCAtIGlkLmxlbmd0aCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0LndyaXRlKGlkKTsKLSAgICAgICAgICBvdXQud3JpdGUoJyAnKTsKLSAgICAgICAgICBvdXQud3JpdGUoc3ViamVjdC5yZXBsYWNlKCdcbicsICcgJykpOwotICAgICAgICAgIG91dC53cml0ZSgnXG4nKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgQ2hhbmdlSW5mbyB0b0NoYW5nZUluZm8oQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgQ2hhbmdlSW5mbyBvdXQgPSBuZXcgQ2hhbmdlSW5mbygpOwotICAgIENoYW5nZSBpbiA9IGNkLmNoYW5nZShkYik7Ci0gICAgb3V0LnByb2plY3QgPSBpbi5nZXRQcm9qZWN0KCkuZ2V0KCk7Ci0gICAgb3V0LmJyYW5jaCA9IGluLmdldERlc3QoKS5nZXRTaG9ydE5hbWUoKTsKLSAgICBvdXQudG9waWMgPSBpbi5nZXRUb3BpYygpOwotICAgIG91dC5pZCA9IGluLmdldEtleSgpLmdldCgpOwotICAgIG91dC5zdWJqZWN0ID0gaW4uZ2V0U3ViamVjdCgpOwotICAgIG91dC5zdGF0dXMgPSBpbi5nZXRTdGF0dXMoKTsKLSAgICBvdXQub3duZXIgPSBhc0FjY291bnRBdHRyaWJ1dGUoaW4uZ2V0T3duZXIoKSk7Ci0gICAgb3V0LmNyZWF0ZWQgPSBpbi5nZXRDcmVhdGVkT24oKTsKLSAgICBvdXQudXBkYXRlZCA9IGluLmdldExhc3RVcGRhdGVkT24oKTsKLSAgICBvdXQuX251bWJlciA9IGluLmdldElkKCkuZ2V0KCk7Ci0gICAgb3V0Ll9zb3J0a2V5ID0gaW4uZ2V0U29ydEtleSgpOwotICAgIG91dC5zdGFycmVkID0gdXNlci5nZXRTdGFycmVkQ2hhbmdlcygpLmNvbnRhaW5zKGluLmdldElkKCkpID8gdHJ1ZSA6IG51bGw7Ci0gICAgb3V0LnJldmlld2VkID0gaW4uZ2V0U3RhdHVzKCkuaXNPcGVuKCkgJiYgaXNDaGFuZ2VSZXZpZXdlZChjZCkgPyB0cnVlIDogbnVsbDsKLSAgICBvdXQubGFiZWxzID0gb3B0aW9ucy5jb250YWlucyhMQUJFTFMpID8gbGFiZWxzRm9yKGNkKSA6IG51bGw7Ci0KLSAgICBpZiAob3B0aW9ucy5jb250YWlucyhBTExfUkVWSVNJT05TKSB8fCBvcHRpb25zLmNvbnRhaW5zKENVUlJFTlRfUkVWSVNJT04pKSB7Ci0gICAgICBvdXQucmV2aXNpb25zID0gcmV2aXNpb25zKGNkKTsKLSAgICAgIGZvciAoU3RyaW5nIGNvbW1pdCA6IG91dC5yZXZpc2lvbnMua2V5U2V0KCkpIHsKLSAgICAgICAgaWYgKG91dC5yZXZpc2lvbnMuZ2V0KGNvbW1pdCkuaXNDdXJyZW50KSB7Ci0gICAgICAgICAgb3V0LmN1cnJlbnRfcmV2aXNpb24gPSBjb21taXQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0OwotICB9Ci0KLSAgcHJpdmF0ZSBBY2NvdW50QXR0cmlidXRlIGFzQWNjb3VudEF0dHJpYnV0ZShBY2NvdW50LklkIHVzZXIpIHsKLSAgICBpZiAodXNlciA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgQWNjb3VudEF0dHJpYnV0ZSBhID0gYWNjb3VudHMuZ2V0KHVzZXIpOwotICAgIGlmIChhID09IG51bGwpIHsKLSAgICAgIGEgPSBuZXcgQWNjb3VudEF0dHJpYnV0ZSgpOwotICAgICAgYWNjb3VudHMucHV0KHVzZXIsIGEpOwotICAgIH0KLSAgICByZXR1cm4gYTsKLSAgfQotCi0gIHByaXZhdGUgQ2hhbmdlQ29udHJvbCBjb250cm9sKENoYW5nZURhdGEgY2QpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIENoYW5nZUNvbnRyb2wgY3RybCA9IGNkLmNoYW5nZUNvbnRyb2woKTsKLSAgICBpZiAoY3RybCAhPSBudWxsICYmIGN0cmwuZ2V0Q3VycmVudFVzZXIoKSA9PSB1c2VyKSB7Ci0gICAgICByZXR1cm4gY3RybDsKLSAgICB9Ci0KLSAgICBjdHJsID0gY29udHJvbHMuZ2V0KGNkLmdldElkKCkpOwotICAgIGlmIChjdHJsICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBjdHJsOwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBjdHJsID0gY2hhbmdlQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihjZC5jaGFuZ2UoZGIpKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIGNvbnRyb2xzLnB1dChjZC5nZXRJZCgpLCBjdHJsKTsKLSAgICByZXR1cm4gY3RybDsKLSAgfQotCi0gIHByaXZhdGUgTWFwPFN0cmluZywgTGFiZWxJbmZvPiBsYWJlbHNGb3IoQ2hhbmdlRGF0YSBjZCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgQ2hhbmdlQ29udHJvbCBjdGwgPSBjb250cm9sKGNkKTsKLSAgICBpZiAoY3RsID09IG51bGwpIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotICAgIH0KLQotICAgIFBhdGNoU2V0IHBzID0gY2QuY3VycmVudFBhdGNoU2V0KGRiKTsKLSAgICBpZiAocHMgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgfQotCi0gICAgTWFwPFN0cmluZywgTGFiZWxJbmZvPiBsYWJlbHMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKLSAgICBmb3IgKFN1Ym1pdFJlY29yZCByZWMgOiBjdGwuY2FuU3VibWl0KGRiLmdldCgpLCBwcywgY2QsIHRydWUsIGZhbHNlKSkgewotICAgICAgaWYgKHJlYy5sYWJlbHMgPT0gbnVsbCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGZvciAoU3VibWl0UmVjb3JkLkxhYmVsIHIgOiByZWMubGFiZWxzKSB7Ci0gICAgICAgIExhYmVsSW5mbyBwID0gbGFiZWxzLmdldChyLmxhYmVsKTsKLSAgICAgICAgaWYgKHAgPT0gbnVsbCB8fCBwLl9zdGF0dXMuY29tcGFyZVRvKHIuc3RhdHVzKSA8IDApIHsKLSAgICAgICAgICBMYWJlbEluZm8gbiA9IG5ldyBMYWJlbEluZm8oKTsKLSAgICAgICAgICBuLl9zdGF0dXMgPSByLnN0YXR1czsKLSAgICAgICAgICBzd2l0Y2ggKHIuc3RhdHVzKSB7Ci0gICAgICAgICAgICBjYXNlIE9LOgotICAgICAgICAgICAgICBuLmFwcHJvdmVkID0gYXNBY2NvdW50QXR0cmlidXRlKHIuYXBwbGllZEJ5KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJFSkVDVDoKLSAgICAgICAgICAgICAgbi5yZWplY3RlZCA9IGFzQWNjb3VudEF0dHJpYnV0ZShyLmFwcGxpZWRCeSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBuLm9wdGlvbmFsID0gbi5fc3RhdHVzID09IFN1Ym1pdFJlY29yZC5MYWJlbC5TdGF0dXMuTUFZID8gdHJ1ZSA6IG51bGw7Ci0gICAgICAgICAgbGFiZWxzLnB1dChyLmxhYmVsLCBuKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzID0gbnVsbDsKLSAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExhYmVsSW5mbz4gZSA6IGxhYmVscy5lbnRyeVNldCgpKSB7Ci0gICAgICBpZiAoZS5nZXRWYWx1ZSgpLmFwcHJvdmVkICE9IG51bGwgfHwgZS5nZXRWYWx1ZSgpLnJlamVjdGVkICE9IG51bGwpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIEFwcHJvdmFsVHlwZSB0eXBlID0gYXBwcm92YWxUeXBlcy5ieUxhYmVsKGUuZ2V0S2V5KCkpOwotICAgICAgaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlLmdldE1pbigpID09IG51bGwgfHwgdHlwZS5nZXRNYXgoKSA9PSBudWxsKSB7Ci0gICAgICAgIC8vIFVua25vd24gb3IgbWlzY29uZmlndXJlZCB0eXBlIGNhbid0IGhhdmUgaW50ZXJtZWRpYXRlIHNjb3Jlcy4KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIHNob3J0IG1pbiA9IHR5cGUuZ2V0TWluKCkuZ2V0VmFsdWUoKTsKLSAgICAgIHNob3J0IG1heCA9IHR5cGUuZ2V0TWF4KCkuZ2V0VmFsdWUoKTsKLSAgICAgIGlmICgtMSA8PSBtaW4gJiYgbWF4IDw9IDEpIHsKLSAgICAgICAgLy8gVHlwZXMgd2l0aCBhIHJhbmdlIG9mIC0xLi4rMSBjYW4ndCBoYXZlIGludGVybWVkaWF0ZSBzY29yZXMuCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoYXBwcm92YWxzID09IG51bGwpIHsKLSAgICAgICAgYXBwcm92YWxzID0gY2QuY3VycmVudEFwcHJvdmFscyhkYik7Ci0gICAgICB9Ci0gICAgICBmb3IgKFBhdGNoU2V0QXBwcm92YWwgcHNhIDogYXBwcm92YWxzKSB7Ci0gICAgICAgIHNob3J0IHZhbCA9IHBzYS5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAodmFsICE9IDAgJiYgbWluIDwgdmFsICYmIHZhbCA8IG1heAotICAgICAgICAgICAgJiYgcHNhLmdldENhdGVnb3J5SWQoKS5lcXVhbHModHlwZS5nZXRDYXRlZ29yeSgpLmdldElkKCkpKSB7Ci0gICAgICAgICAgaWYgKDAgPCB2YWwpIHsKLSAgICAgICAgICAgIGUuZ2V0VmFsdWUoKS5yZWNvbW1lbmRlZCA9IGFzQWNjb3VudEF0dHJpYnV0ZShwc2EuZ2V0QWNjb3VudElkKCkpOwotICAgICAgICAgICAgZS5nZXRWYWx1ZSgpLnZhbHVlID0gdmFsICE9IDEgPyB2YWwgOiBudWxsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlLmdldFZhbHVlKCkuZGlzbGlrZWQgPSBhc0FjY291bnRBdHRyaWJ1dGUocHNhLmdldEFjY291bnRJZCgpKTsKLSAgICAgICAgICAgIGUuZ2V0VmFsdWUoKS52YWx1ZSA9IHZhbCAhPSAtMSA/IHZhbCA6IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsYWJlbHM7Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gaXNDaGFuZ2VSZXZpZXdlZChDaGFuZ2VEYXRhIGNkKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBpZiAodXNlciBpbnN0YW5jZW9mIElkZW50aWZpZWRVc2VyKSB7Ci0gICAgICBQYXRjaFNldCBjdXJyZW50UGF0Y2hTZXQgPSBjZC5jdXJyZW50UGF0Y2hTZXQoZGIpOwotICAgICAgaWYgKGN1cnJlbnRQYXRjaFNldCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgTGlzdDxDaGFuZ2VNZXNzYWdlPiBtZXNzYWdlcyA9Ci0gICAgICAgICAgZGIuZ2V0KCkuY2hhbmdlTWVzc2FnZXMoKS5ieVBhdGNoU2V0KGN1cnJlbnRQYXRjaFNldC5nZXRJZCgpKS50b0xpc3QoKTsKLQotICAgICAgaWYgKG1lc3NhZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFNvcnQgbWVzc2FnZXMgdG8gbGV0IHRoZSBtb3N0IHJlY2VudCBvbmVzIGF0IHRoZSBiZWdpbm5pbmcuCi0gICAgICBDb2xsZWN0aW9ucy5zb3J0KG1lc3NhZ2VzLCBuZXcgQ29tcGFyYXRvcjxDaGFuZ2VNZXNzYWdlPigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShDaGFuZ2VNZXNzYWdlIGEsIENoYW5nZU1lc3NhZ2UgYikgewotICAgICAgICAgIHJldHVybiBiLmdldFdyaXR0ZW5PbigpLmNvbXBhcmVUbyhhLmdldFdyaXR0ZW5PbigpKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0KLSAgICAgIEFjY291bnQuSWQgY3VycmVudFVzZXJJZCA9ICgoSWRlbnRpZmllZFVzZXIpIHVzZXIpLmdldEFjY291bnRJZCgpOwotICAgICAgQWNjb3VudC5JZCBjaGFuZ2VPd25lcklkID0gY2QuY2hhbmdlKGRiKS5nZXRPd25lcigpOwotICAgICAgZm9yIChDaGFuZ2VNZXNzYWdlIGNtIDogbWVzc2FnZXMpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRVc2VySWQuZXF1YWxzKGNtLmdldEF1dGhvcigpKSkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZU93bmVySWQuZXF1YWxzKGNtLmdldEF1dGhvcigpKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcml2YXRlIE1hcDxTdHJpbmcsIFJldmlzaW9uSW5mbz4gcmV2aXNpb25zKENoYW5nZURhdGEgY2QpIHRocm93cyBPcm1FeGNlcHRpb24gewotICAgIENoYW5nZUNvbnRyb2wgY3RsID0gY29udHJvbChjZCk7Ci0gICAgaWYgKGN0bCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICB9Ci0KLSAgICBDb2xsZWN0aW9uPFBhdGNoU2V0PiBzcmM7Ci0gICAgaWYgKG9wdGlvbnMuY29udGFpbnMoQUxMX1JFVklTSU9OUykpIHsKLSAgICAgIHNyYyA9IGNkLnBhdGNoZXMoZGIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcmMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNkLmN1cnJlbnRQYXRjaFNldChkYikpOwotICAgIH0KLSAgICBNYXA8U3RyaW5nLCBSZXZpc2lvbkluZm8+IHJlcyA9IE1hcHMubmV3TGlua2VkSGFzaE1hcCgpOwotICAgIGZvciAoUGF0Y2hTZXQgaW4gOiBzcmMpIHsKLSAgICAgIGlmIChjdGwuaXNQYXRjaFZpc2libGUoaW4sIGRiLmdldCgpKSkgewotICAgICAgICByZXMucHV0KGluLmdldFJldmlzaW9uKCkuZ2V0KCksIHRvUmV2aXNpb25JbmZvKGNkLCBpbikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgcHJpdmF0ZSBSZXZpc2lvbkluZm8gdG9SZXZpc2lvbkluZm8oQ2hhbmdlRGF0YSBjZCwgUGF0Y2hTZXQgaW4pCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBSZXZpc2lvbkluZm8gb3V0ID0gbmV3IFJldmlzaW9uSW5mbygpOwotICAgIG91dC5pc0N1cnJlbnQgPSBpbi5nZXRJZCgpLmVxdWFscyhjZC5jaGFuZ2UoZGIpLmN1cnJlbnRQYXRjaFNldElkKCkpOwotICAgIG91dC5fbnVtYmVyID0gaW4uZ2V0SWQoKS5nZXQoKTsKLSAgICBvdXQuZHJhZnQgPSBpbi5pc0RyYWZ0KCkgPyB0cnVlIDogbnVsbDsKLSAgICBvdXQuZmV0Y2ggPSBtYWtlRmV0Y2hNYXAoY2QsIGluKTsKLQotICAgIGlmIChvcHRpb25zLmNvbnRhaW5zKEFMTF9DT01NSVRTKQotICAgICAgICB8fCAob3V0LmlzQ3VycmVudCAmJiBvcHRpb25zLmNvbnRhaW5zKENVUlJFTlRfQ09NTUlUKSkpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIFBhdGNoU2V0SW5mbyBpbmZvID0gcGF0Y2hTZXRJbmZvRmFjdG9yeS5nZXQoZGIuZ2V0KCksIGluLmdldElkKCkpOwotICAgICAgICBvdXQuY29tbWl0ID0gbmV3IENvbW1pdEluZm8oKTsKLSAgICAgICAgb3V0LmNvbW1pdC5wYXJlbnRzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGluZm8uZ2V0UGFyZW50cygpLnNpemUoKSk7Ci0gICAgICAgIG91dC5jb21taXQuYXV0aG9yID0gdG9HaXRQZXJzb24oaW5mby5nZXRBdXRob3IoKSk7Ci0gICAgICAgIG91dC5jb21taXQuY29tbWl0dGVyID0gdG9HaXRQZXJzb24oaW5mby5nZXRDb21taXR0ZXIoKSk7Ci0gICAgICAgIG91dC5jb21taXQuc3ViamVjdCA9IGluZm8uZ2V0U3ViamVjdCgpOwotICAgICAgICBvdXQuY29tbWl0Lm1lc3NhZ2UgPSBpbmZvLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICBmb3IgKFBhcmVudEluZm8gcGFyZW50IDogaW5mby5nZXRQYXJlbnRzKCkpIHsKLSAgICAgICAgICBDb21taXRJbmZvIGkgPSBuZXcgQ29tbWl0SW5mbygpOwotICAgICAgICAgIGkuY29tbWl0ID0gcGFyZW50LmlkLmdldCgpOwotICAgICAgICAgIGkuc3ViamVjdCA9IHBhcmVudC5zaG9ydE1lc3NhZ2U7Ci0gICAgICAgICAgb3V0LmNvbW1pdC5wYXJlbnRzLmFkZChpKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoUGF0Y2hTZXRJbmZvTm90QXZhaWxhYmxlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgbG9nLndhcm4oIkNhbm5vdCBsb2FkIFBhdGNoU2V0SW5mbyAiICsgaW4uZ2V0SWQoKSwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG9wdGlvbnMuY29udGFpbnMoQUxMX0ZJTEVTKQotICAgICAgICB8fCAob3V0LmlzQ3VycmVudCAmJiBvcHRpb25zLmNvbnRhaW5zKENVUlJFTlRfRklMRVMpKSkgewotICAgICAgUGF0Y2hMaXN0IGxpc3Q7Ci0gICAgICB0cnkgewotICAgICAgICBsaXN0ID0gcGF0Y2hMaXN0Q2FjaGUuZ2V0KGNkLmNoYW5nZShkYiksIGluKTsKLSAgICAgIH0gY2F0Y2ggKFBhdGNoTGlzdE5vdEF2YWlsYWJsZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGxvZy53YXJuKCJDYW5ub3QgbG9hZCBQYXRjaExpc3QgIiArIGluLmdldElkKCksIGUpOwotICAgICAgICBsaXN0ID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgb3V0LmZpbGVzID0gTWFwcy5uZXdUcmVlTWFwKCk7Ci0gICAgICAgIGZvciAoUGF0Y2hMaXN0RW50cnkgZSA6IGxpc3QuZ2V0UGF0Y2hlcygpKSB7Ci0gICAgICAgICAgaWYgKFBhdGNoLkNPTU1JVF9NU0cuZXF1YWxzKGUuZ2V0TmV3TmFtZSgpKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRmlsZUluZm8gZCA9IG5ldyBGaWxlSW5mbygpOwotICAgICAgICAgIGQuc3RhdHVzID0gZS5nZXRDaGFuZ2VUeXBlKCkgIT0gUGF0Y2guQ2hhbmdlVHlwZS5NT0RJRklFRAotICAgICAgICAgICAgICA/IGUuZ2V0Q2hhbmdlVHlwZSgpLmdldENvZGUoKQotICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgZC5vbGRQYXRoID0gZS5nZXRPbGROYW1lKCk7Ci0gICAgICAgICAgaWYgKGUuZ2V0UGF0Y2hUeXBlKCkgPT0gUGF0Y2guUGF0Y2hUeXBlLkJJTkFSWSkgewotICAgICAgICAgICAgZC5iaW5hcnkgPSB0cnVlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkLmxpbmVzSW5zZXJ0ZWQgPSBlLmdldEluc2VydGlvbnMoKSA+IDAgPyBlLmdldEluc2VydGlvbnMoKSA6IG51bGw7Ci0gICAgICAgICAgICBkLmxpbmVzRGVsZXRlZCA9IGUuZ2V0RGVsZXRpb25zKCkgPiAwID8gZS5nZXREZWxldGlvbnMoKSA6IG51bGw7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRmlsZUluZm8gbyA9IG91dC5maWxlcy5wdXQoZS5nZXROZXdOYW1lKCksIGQpOwotICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGEgZGVsZXRlLWFkZCBicmVhayBjcmVhdGVkIGJ5IEpHaXQKLSAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpbGUgd2FzIHJld3JpdHRlbiBhbmQgdG9vIGxpdHRsZSBjb250ZW50IHN1cnZpdmVkLiBXcml0ZQotICAgICAgICAgICAgLy8gYSBzaW5nbGUgcmVjb3JkIHdpdGggZGF0YSBmcm9tIGJvdGggc2lkZXMuCi0gICAgICAgICAgICBkLnN0YXR1cyA9IFBhdGNoLkNoYW5nZVR5cGUuUkVXUklURS5nZXRDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoby5iaW5hcnkgIT0gbnVsbCAmJiBvLmJpbmFyeSkgewotICAgICAgICAgICAgICBkLmJpbmFyeSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoby5saW5lc0luc2VydGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZC5saW5lc0luc2VydGVkID0gby5saW5lc0luc2VydGVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG8ubGluZXNEZWxldGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgZC5saW5lc0RlbGV0ZWQgPSBvLmxpbmVzRGVsZXRlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG91dDsKLSAgfQotCi0gIHByaXZhdGUgTWFwPFN0cmluZywgRmV0Y2hJbmZvPiBtYWtlRmV0Y2hNYXAoQ2hhbmdlRGF0YSBjZCwgUGF0Y2hTZXQgaW4pCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBNYXA8U3RyaW5nLCBGZXRjaEluZm8+IHIgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKLSAgICBTdHJpbmcgcmVmTmFtZSA9IGluLmdldFJlZk5hbWUoKTsKLSAgICBDaGFuZ2VDb250cm9sIGN0bCA9IGNvbnRyb2woY2QpOwotICAgIGlmIChjdGwgIT0gbnVsbCAmJiBjdGwuZm9yVXNlcihhbm9ueW1vdXMpLmlzUGF0Y2hWaXNpYmxlKGluLCBkYi5nZXQoKSkpIHsKLSAgICAgIGlmICh1cmxzLmdpdCAhPSBudWxsKSB7Ci0gICAgICAgIHIucHV0KCJnaXQiLCBuZXcgRmV0Y2hJbmZvKHVybHMuZ2l0Ci0gICAgICAgICAgICArIGNkLmNoYW5nZShkYikuZ2V0UHJvamVjdCgpLmdldCgpLCByZWZOYW1lKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh1cmxzLmh0dHAgIT0gbnVsbCkgewotICAgICAgci5wdXQoImh0dHAiLCBuZXcgRmV0Y2hJbmZvKHVybHMuaHR0cAotICAgICAgICAgICsgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCksIHJlZk5hbWUpKTsKLSAgICB9IGVsc2UgewotICAgICAgU3RyaW5nIGh0dHAgPSB1cmxQcm92aWRlci5nZXQoKTsKLSAgICAgIGlmICghU3RyaW5ncy5pc051bGxPckVtcHR5KGh0dHApKSB7Ci0gICAgICAgIHIucHV0KCJodHRwIiwgbmV3IEZldGNoSW5mbyhodHRwCi0gICAgICAgICAgICArIGNkLmNoYW5nZShkYikuZ2V0UHJvamVjdCgpLmdldCgpLCByZWZOYW1lKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICghc3NoSW5mby5nZXRIb3N0S2V5cygpLmlzRW1wdHkoKSkgewotICAgICAgSG9zdEtleSBob3N0ID0gc3NoSW5mby5nZXRIb3N0S2V5cygpLmdldCgwKTsKLSAgICAgIHIucHV0KCJzc2giLCBuZXcgRmV0Y2hJbmZvKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgInNzaDovLyVzLyVzIiwKLSAgICAgICAgICBob3N0LmdldEhvc3QoKSwgY2QuY2hhbmdlKGRiKS5nZXRQcm9qZWN0KCkuZ2V0KCkpLAotICAgICAgICAgIHJlZk5hbWUpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEdpdFBlcnNvbiB0b0dpdFBlcnNvbihVc2VySWRlbnRpdHkgY29tbWl0dGVyKSB7Ci0gICAgR2l0UGVyc29uIHAgPSBuZXcgR2l0UGVyc29uKCk7Ci0gICAgcC5uYW1lID0gY29tbWl0dGVyLmdldE5hbWUoKTsKLSAgICBwLmVtYWlsID0gY29tbWl0dGVyLmdldEVtYWlsKCk7Ci0gICAgcC5kYXRlID0gY29tbWl0dGVyLmdldERhdGUoKTsKLSAgICBwLnR6ID0gY29tbWl0dGVyLmdldFRpbWVab25lKCk7Ci0gICAgcmV0dXJuIHA7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgQ2hhbmdlSW5mbyB7Ci0gICAgU3RyaW5nIHByb2plY3Q7Ci0gICAgU3RyaW5nIGJyYW5jaDsKLSAgICBTdHJpbmcgdG9waWM7Ci0gICAgU3RyaW5nIGlkOwotICAgIFN0cmluZyBzdWJqZWN0OwotICAgIENoYW5nZS5TdGF0dXMgc3RhdHVzOwotICAgIFRpbWVzdGFtcCBjcmVhdGVkOwotICAgIFRpbWVzdGFtcCB1cGRhdGVkOwotICAgIEJvb2xlYW4gc3RhcnJlZDsKLSAgICBCb29sZWFuIHJldmlld2VkOwotCi0gICAgU3RyaW5nIF9zb3J0a2V5OwotICAgIGludCBfbnVtYmVyOwotCi0gICAgQWNjb3VudEF0dHJpYnV0ZSBvd25lcjsKLSAgICBNYXA8U3RyaW5nLCBMYWJlbEluZm8+IGxhYmVsczsKLSAgICBTdHJpbmcgY3VycmVudF9yZXZpc2lvbjsKLSAgICBNYXA8U3RyaW5nLCBSZXZpc2lvbkluZm8+IHJldmlzaW9uczsKLQotICAgIEJvb2xlYW4gX21vcmVDaGFuZ2VzOwotICB9Ci0KLSAgc3RhdGljIGNsYXNzIFJldmlzaW9uSW5mbyB7Ci0gICAgcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBpc0N1cnJlbnQ7Ci0gICAgQm9vbGVhbiBkcmFmdDsKLSAgICBpbnQgX251bWJlcjsKLSAgICBNYXA8U3RyaW5nLCBGZXRjaEluZm8+IGZldGNoOwotICAgIENvbW1pdEluZm8gY29tbWl0OwotICAgIE1hcDxTdHJpbmcsIEZpbGVJbmZvPiBmaWxlczsKLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBGZXRjaEluZm8gewotICAgIFN0cmluZyB1cmw7Ci0gICAgU3RyaW5nIHJlZjsKLQotICAgIEZldGNoSW5mbyhTdHJpbmcgdXJsLCBTdHJpbmcgcmVmKSB7Ci0gICAgICB0aGlzLnVybCA9IHVybDsKLSAgICAgIHRoaXMucmVmID0gcmVmOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBHaXRQZXJzb24gewotICAgIFN0cmluZyBuYW1lOwotICAgIFN0cmluZyBlbWFpbDsKLSAgICBUaW1lc3RhbXAgZGF0ZTsKLSAgICBpbnQgdHo7Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgQ29tbWl0SW5mbyB7Ci0gICAgU3RyaW5nIGNvbW1pdDsKLSAgICBMaXN0PENvbW1pdEluZm8+IHBhcmVudHM7Ci0gICAgR2l0UGVyc29uIGF1dGhvcjsKLSAgICBHaXRQZXJzb24gY29tbWl0dGVyOwotICAgIFN0cmluZyBzdWJqZWN0OwotICAgIFN0cmluZyBtZXNzYWdlOwotICB9Ci0KLSAgc3RhdGljIGNsYXNzIEZpbGVJbmZvIHsKLSAgICBDaGFyYWN0ZXIgc3RhdHVzOwotICAgIEJvb2xlYW4gYmluYXJ5OwotICAgIFN0cmluZyBvbGRQYXRoOwotICAgIEludGVnZXIgbGluZXNJbnNlcnRlZDsKLSAgICBJbnRlZ2VyIGxpbmVzRGVsZXRlZDsKLSAgfQotCi0gIHN0YXRpYyBjbGFzcyBMYWJlbEluZm8gewotICAgIHRyYW5zaWVudCBTdWJtaXRSZWNvcmQuTGFiZWwuU3RhdHVzIF9zdGF0dXM7Ci0gICAgQWNjb3VudEF0dHJpYnV0ZSBhcHByb3ZlZDsKLSAgICBBY2NvdW50QXR0cmlidXRlIHJlamVjdGVkOwotCi0gICAgQWNjb3VudEF0dHJpYnV0ZSByZWNvbW1lbmRlZDsKLSAgICBBY2NvdW50QXR0cmlidXRlIGRpc2xpa2VkOwotICAgIFNob3J0IHZhbHVlOwotICAgIEJvb2xlYW4gb3B0aW9uYWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL1F1ZXJ5Q2hhbmdlcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvUXVlcnlDaGFuZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwNTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL1F1ZXJ5Q2hhbmdlcy5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmNoYW5nZXMuTGlzdENoYW5nZXNPcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkF1dGhFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RSZWFkVmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuVG9wTGV2ZWxSZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZUpzb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5DaGFuZ2VKc29uLkNoYW5nZUluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUXVlcnlQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK3B1YmxpYyBjbGFzcyBRdWVyeUNoYW5nZXMgaW1wbGVtZW50cyBSZXN0UmVhZFZpZXc8VG9wTGV2ZWxSZXNvdXJjZT4geworICBwcml2YXRlIGZpbmFsIENoYW5nZUpzb24ganNvbjsKKyAgcHJpdmF0ZSBmaW5hbCBRdWVyeVByb2Nlc3NvciBpbXA7CisgIHByaXZhdGUgYm9vbGVhbiByZXZlcnNlOworICBwcml2YXRlIEVudW1TZXQ8TGlzdENoYW5nZXNPcHRpb24+IG9wdGlvbnM7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tcXVlcnkiLCBhbGlhc2VzID0geyItcSJ9LCBtZXRhVmFyID0gIlFVRVJZIiwgbXVsdGlWYWx1ZWQgPSB0cnVlLCB1c2FnZSA9ICJRdWVyeSBzdHJpbmciKQorICBwcml2YXRlIExpc3Q8U3RyaW5nPiBxdWVyaWVzOworCisgIEBPcHRpb24obmFtZSA9ICItLWxpbWl0IiwgYWxpYXNlcyA9IHsiLW4ifSwgbWV0YVZhciA9ICJDTlQiLCB1c2FnZSA9ICJNYXhpbXVtIG51bWJlciBvZiByZXN1bHRzIHRvIHJldHVybiIpCisgIHB1YmxpYyB2b2lkIHNldExpbWl0KGludCBsaW1pdCkgeworICAgIGltcC5zZXRMaW1pdChsaW1pdCk7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLW8iLCBtdWx0aVZhbHVlZCA9IHRydWUsIHVzYWdlID0gIk91dHB1dCBvcHRpb25zIHBlciBjaGFuZ2UiKQorICBwdWJsaWMgdm9pZCBhZGRPcHRpb24oTGlzdENoYW5nZXNPcHRpb24gbykgeworICAgIG9wdGlvbnMuYWRkKG8pOworICB9CisKKyAgQE9wdGlvbihuYW1lID0gIi1PIiwgdXNhZ2UgPSAiT3V0cHV0IG9wdGlvbiBmbGFncywgaW4gaGV4IikKKyAgdm9pZCBzZXRPcHRpb25GbGFnc0hleChTdHJpbmcgaGV4KSB7CisgICAgb3B0aW9ucy5hZGRBbGwoTGlzdENoYW5nZXNPcHRpb24uZnJvbUJpdHMoSW50ZWdlci5wYXJzZUludChoZXgsIDE2KSkpOworICB9CisKKyAgQE9wdGlvbihuYW1lID0gIi1QIiwgbWV0YVZhciA9ICJTT1JUS0VZIiwgdXNhZ2UgPSAiUHJldmlvdXMgY2hhbmdlcyBiZWZvcmUgU09SVEtFWSIpCisgIHB1YmxpYyB2b2lkIHNldFNvcnRLZXlBZnRlcihTdHJpbmcga2V5KSB7CisgICAgLy8gUXVlcnlpbmcgZm9yIHRoZSBwcmlvciBwYWdlIG9mIGNoYW5nZXMgcmVxdWlyZXMgc29ydGtleV9hZnRlciBwcmVkaWNhdGUuCisgICAgLy8gQ2hhbmdlcyBhcmUgc2hvd24gbW9zdCByZWNlbnQtPmxlYXN0IHJlY2VudC4gVGhlIHByZXZpb3VzIHBhZ2Ugb2YKKyAgICAvLyByZXN1bHRzIGNvbnRhaW5zIGNoYW5nZXMgdGhhdCB3ZXJlIHVwZGF0ZWQgYWZ0ZXIgdGhlIGdpdmVuIGtleS4KKyAgICBpbXAuc2V0U29ydGtleUFmdGVyKGtleSk7CisgICAgcmV2ZXJzZSA9IHRydWU7CisgIH0KKworICBAT3B0aW9uKG5hbWUgPSAiLU4iLCBtZXRhVmFyID0gIlNPUlRLRVkiLCB1c2FnZSA9ICJOZXh0IGNoYW5nZXMgYWZ0ZXIgU09SVEtFWSIpCisgIHB1YmxpYyB2b2lkIHNldFNvcnRLZXlCZWZvcmUoU3RyaW5nIGtleSkgeworICAgIC8vIFF1ZXJ5aW5nIGZvciB0aGUgbmV4dCBwYWdlIG9mIGNoYW5nZXMgcmVxdWlyZXMgc29ydGtleV9iZWZvcmUgcHJlZGljYXRlLgorICAgIC8vIENoYW5nZXMgYXJlIHNob3duIG1vc3QgcmVjZW50LT5sZWFzdCByZWNlbnQuIFRoZSBuZXh0IHBhZ2UgY29udGFpbnMKKyAgICAvLyBjaGFuZ2VzIHRoYXQgd2VyZSB1cGRhdGVkIGJlZm9yZSB0aGUgZ2l2ZW4ga2V5LgorICAgIGltcC5zZXRTb3J0a2V5QmVmb3JlKGtleSk7CisgIH0KKworICBASW5qZWN0CisgIFF1ZXJ5Q2hhbmdlcyhDaGFuZ2VKc29uIGpzb24sCisgICAgICBRdWVyeVByb2Nlc3NvciBxcCwKKyAgICAgIFNzaEluZm8gc3NoSW5mbywKKyAgICAgIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjZikgeworICAgIHRoaXMuanNvbiA9IGpzb247CisgICAgdGhpcy5pbXAgPSBxcDsKKworICAgIG9wdGlvbnMgPSBFbnVtU2V0Lm5vbmVPZihMaXN0Q2hhbmdlc09wdGlvbi5jbGFzcyk7CisgICAganNvbi5zZXRTc2hJbmZvKHNzaEluZm8pOworICAgIGpzb24uc2V0Q2hhbmdlQ29udHJvbEZhY3RvcnkoY2YpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkUXVlcnkoU3RyaW5nIHF1ZXJ5KSB7CisgICAgaWYgKHF1ZXJpZXMgPT0gbnVsbCkgeworICAgICAgcXVlcmllcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIH0KKyAgICBxdWVyaWVzLmFkZChxdWVyeSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9iamVjdCBhcHBseShUb3BMZXZlbFJlc291cmNlIHJzcmMpCisgICAgICB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiwgQXV0aEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICBMaXN0PExpc3Q8Q2hhbmdlSW5mbz4+IG91dDsKKyAgICB0cnkgeworICAgICAgb3V0ID0gcXVlcnkoKTsKKyAgICB9IGNhdGNoIChRdWVyeVBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgIC8vIFRoaXMgaXMgYSBoYWNrIHRvIGRldGVjdCBhbiBvcGVyYXRvciB0aGF0IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uLgorICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKCJeRXJyb3IgaW4gb3BlcmF0b3IgKC4qOnNlbGYpJCIpOworICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgIGlmIChtLm1hdGNoZXMoKSkgeworICAgICAgICBTdHJpbmcgb3AgPSBtLmdyb3VwKDEpOworICAgICAgICB0aHJvdyBuZXcgQXV0aEV4Y2VwdGlvbigiTXVzdCBiZSBzaWduZWQtaW4gdG8gdXNlICIgKyBvcCk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIHJldHVybiBvdXQuc2l6ZSgpID09IDEgPyBvdXQuZ2V0KDApIDogb3V0OworICB9CisKKyAgcHJpdmF0ZSBMaXN0PExpc3Q8Q2hhbmdlSW5mbz4+IHF1ZXJ5KCkKKyAgICAgIHRocm93cyBPcm1FeGNlcHRpb24sIFF1ZXJ5UGFyc2VFeGNlcHRpb24geworICAgIGlmIChpbXAuaXNEaXNhYmxlZCgpKSB7CisgICAgICB0aHJvdyBuZXcgUXVlcnlQYXJzZUV4Y2VwdGlvbigicXVlcnkgZGlzYWJsZWQiKTsKKyAgICB9CisgICAgaWYgKHF1ZXJpZXMgPT0gbnVsbCB8fCBxdWVyaWVzLmlzRW1wdHkoKSkgeworICAgICAgcXVlcmllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInN0YXR1czpvcGVuIik7CisgICAgfSBlbHNlIGlmIChxdWVyaWVzLnNpemUoKSA+IDEwKSB7CisgICAgICAvLyBIYXJkLWNvZGUgYSBkZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIHF1ZXJpZXMgdG8gcHJldmVudAorICAgICAgLy8gdXNlcnMgZnJvbSBzdWJtaXR0aW5nIHRvbyBtdWNoIHRvIHRoZSBzZXJ2ZXIgaW4gYSBzaW5nbGUgY2FsbC4KKyAgICAgIHRocm93IG5ldyBRdWVyeVBhcnNlRXhjZXB0aW9uKCJsaW1pdCBvZiAxMCBxdWVyaWVzIik7CisgICAgfQorCisgICAgaW50IGNudCA9IHF1ZXJpZXMuc2l6ZSgpOworICAgIEJpdFNldCBtb3JlID0gbmV3IEJpdFNldChjbnQpOworICAgIExpc3Q8TGlzdDxDaGFuZ2VEYXRhPj4gZGF0YSA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShjbnQpOworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgY250OyBuKyspIHsKKyAgICAgIFN0cmluZyBxdWVyeSA9IHF1ZXJpZXMuZ2V0KG4pOworICAgICAgTGlzdDxDaGFuZ2VEYXRhPiBjaGFuZ2VzID0gaW1wLnF1ZXJ5Q2hhbmdlcyhxdWVyeSk7CisgICAgICBpZiAoaW1wLmdldExpbWl0KCkgPiAwICYmIGNoYW5nZXMuc2l6ZSgpID4gaW1wLmdldExpbWl0KCkpIHsKKyAgICAgICAgaWYgKHJldmVyc2UpIHsKKyAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zdWJMaXN0KDEsIGNoYW5nZXMuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zdWJMaXN0KDAsIGltcC5nZXRMaW1pdCgpKTsKKyAgICAgICAgfQorICAgICAgICBtb3JlLnNldChuLCB0cnVlKTsKKyAgICAgIH0KKyAgICAgIGRhdGEuYWRkKGNoYW5nZXMpOworICAgIH0KKworICAgIExpc3Q8TGlzdDxDaGFuZ2VJbmZvPj4gcmVzID0ganNvbi5hZGRPcHRpb25zKG9wdGlvbnMpLmZvcm1hdExpc3QyKGRhdGEpOworICAgIGZvciAoaW50IG4gPSAwOyBuIDwgY250OyBuKyspIHsKKyAgICAgIExpc3Q8Q2hhbmdlSW5mbz4gaW5mbyA9IHJlcy5nZXQobik7CisgICAgICBpZiAobW9yZS5nZXQobikgJiYgIWluZm8uaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChyZXZlcnNlKSB7CisgICAgICAgICAgaW5mby5nZXQoMCkuX21vcmVDaGFuZ2VzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpbmZvLmdldChpbmZvLnNpemUoKSAtIDEpLl9tb3JlQ2hhbmdlcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvUXVlcnlQcm9jZXNzb3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvcXVlcnkvY2hhbmdlL1F1ZXJ5UHJvY2Vzc29yLmphdmEKaW5kZXggZjQ0MjgyYS4uZmMzNWRmMyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvUXVlcnlQcm9jZXNzb3IuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9RdWVyeVByb2Nlc3Nvci5qYXZhCkBAIC0xNSw2ICsxNSw3IEBACiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5xdWVyeS5jaGFuZ2U7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuU3VibWl0UmVjb3JkOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwpAQCAtMjUsNiArMjYsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ldmVudHMuUGF0Y2hTZXRBdHRyaWJ1dGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5RdWVyeVN0YXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Ob1N1Y2hDaGFuZ2VFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LlByZWRpY2F0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuUXVlcnlQYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKQEAgLTkzLDYgKzk2LDcgQEAKICAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VRdWVyeVJld3JpdGVyIHF1ZXJ5UmV3cml0ZXI7CiAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmV2aWV3RGI+IGRiOwogICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOworICBwcml2YXRlIGZpbmFsIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGltaXQ7CiAKICAgcHJpdmF0ZSBPdXRwdXRGb3JtYXQgb3V0cHV0Rm9ybWF0ID0gT3V0cHV0Rm9ybWF0LlRFWFQ7CkBAIC0xMTAsMjAgKzExNCwyNCBAQAogCiAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IERpc2FibGVkT3V0cHV0U3RyZWFtLklOU1RBTkNFOwogICBwcml2YXRlIFByaW50V3JpdGVyIG91dDsKKyAgcHJpdmF0ZSBib29sZWFuIG1vcmVSZXN1bHRzOwogCiAgIEBJbmplY3QKICAgUXVlcnlQcm9jZXNzb3IoRXZlbnRGYWN0b3J5IGV2ZW50RmFjdG9yeSwKICAgICAgIENoYW5nZVF1ZXJ5QnVpbGRlci5GYWN0b3J5IHF1ZXJ5QnVpbGRlciwgQ3VycmVudFVzZXIgY3VycmVudFVzZXIsCiAgICAgICBDaGFuZ2VRdWVyeVJld3JpdGVyIHF1ZXJ5UmV3cml0ZXIsIFByb3ZpZGVyPFJldmlld0RiPiBkYiwKLSAgICAgIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyKSB7CisgICAgICBHaXRSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuYWdlciwKKyAgICAgIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeSkgewogICAgIHRoaXMuZXZlbnRGYWN0b3J5ID0gZXZlbnRGYWN0b3J5OwogICAgIHRoaXMucXVlcnlCdWlsZGVyID0gcXVlcnlCdWlsZGVyLmNyZWF0ZShjdXJyZW50VXNlcik7CiAgICAgdGhpcy5xdWVyeVJld3JpdGVyID0gcXVlcnlSZXdyaXRlcjsKICAgICB0aGlzLmRiID0gZGI7CiAgICAgdGhpcy5yZXBvTWFuYWdlciA9IHJlcG9NYW5hZ2VyOworICAgIHRoaXMuY2hhbmdlQ29udHJvbEZhY3RvcnkgPSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKICAgICB0aGlzLm1heExpbWl0ID0gY3VycmVudFVzZXIuZ2V0Q2FwYWJpbGl0aWVzKCkKICAgICAgIC5nZXRSYW5nZShHbG9iYWxDYXBhYmlsaXR5LlFVRVJZX0xJTUlUKQogICAgICAgLmdldE1heCgpOworICAgIHRoaXMubW9yZVJlc3VsdHMgPSBmYWxzZTsKICAgfQogCiAgIGludCBnZXRMaW1pdCgpIHsKQEAgLTIzNCw2ICsyNDIsOSBAQAogCiAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCBzb3J0a2V5QWZ0ZXIgIT0gbnVsbCA/IGNtcEFmdGVyIDogY21wQmVmb3JlKTsKICAgICBpbnQgbGltaXQgPSBsaW1pdChzKTsKKyAgICBpZiAocmVzdWx0cy5zaXplKCkgPiBtYXhMaW1pdCkgeworICAgICAgbW9yZVJlc3VsdHMgPSB0cnVlOworICAgIH0KICAgICBpZiAobGltaXQgPCByZXN1bHRzLnNpemUoKSkgewogICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc3ViTGlzdCgwLCBsaW1pdCk7CiAgICAgfQpAQCAtMjYwLDE3ICsyNzEsMTkgQEAKICAgICAgICAgc3RhdHMucnVuVGltZU1pbGxpc2Vjb25kcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCiAgICAgICAgIExpc3Q8Q2hhbmdlRGF0YT4gcmVzdWx0cyA9IHF1ZXJ5Q2hhbmdlcyhxdWVyeVN0cmluZyk7CisgICAgICAgIENoYW5nZUF0dHJpYnV0ZSBjID0gbnVsbDsKICAgICAgICAgZm9yIChDaGFuZ2VEYXRhIGQgOiByZXN1bHRzKSB7Ci0gICAgICAgICAgQ2hhbmdlQXR0cmlidXRlIGMgPSBldmVudEZhY3RvcnkuYXNDaGFuZ2VBdHRyaWJ1dGUoZC5nZXRDaGFuZ2UoKSk7CisgICAgICAgICAgTGFiZWxUeXBlcyBsYWJlbFR5cGVzID0gY2hhbmdlQ29udHJvbEZhY3RvcnkuY29udHJvbEZvcihkLmdldENoYW5nZSgpKQorICAgICAgICAgICAgICAuZ2V0TGFiZWxUeXBlcygpOworICAgICAgICAgIGMgPSBldmVudEZhY3RvcnkuYXNDaGFuZ2VBdHRyaWJ1dGUoZC5nZXRDaGFuZ2UoKSk7CiAgICAgICAgICAgZXZlbnRGYWN0b3J5LmV4dGVuZChjLCBkLmdldENoYW5nZSgpKTsKICAgICAgICAgICBldmVudEZhY3RvcnkuYWRkVHJhY2tpbmdJZHMoYywgZC50cmFja2luZ0lkcyhkYikpOwogCiAgICAgICAgICAgaWYgKGluY2x1ZGVTdWJtaXRSZWNvcmRzKSB7CiAgICAgICAgICAgICBQYXRjaFNldC5JZCBwc0lkID0gZC5nZXRDaGFuZ2UoKS5jdXJyZW50UGF0Y2hTZXRJZCgpOwogICAgICAgICAgICAgUGF0Y2hTZXQgcGF0Y2hTZXQgPSBkYi5nZXQoKS5wYXRjaFNldHMoKS5nZXQocHNJZCk7Ci0gICAgICAgICAgICBDaGFuZ2UuSWQgY2hhbmdlSWQgPSBwc0lkLmdldFBhcmVudEtleSgpOwogICAgICAgICAgICAgTGlzdDxTdWJtaXRSZWNvcmQ+IHN1Ym1pdFJlc3VsdCA9IGQuY2hhbmdlQ29udHJvbCgpLmNhblN1Ym1pdCggLy8KLSAgICAgICAgICAgICAgICBkYi5nZXQoKSwgcGF0Y2hTZXQsIG51bGwsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBkYi5nZXQoKSwgcGF0Y2hTZXQsIG51bGwsIGZhbHNlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgIGV2ZW50RmFjdG9yeS5hZGRTdWJtaXRSZWNvcmRzKGMsIHN1Ym1pdFJlc3VsdCk7CiAgICAgICAgICAgfQogCkBAIC0yODEsMTEgKzI5NCwxMiBAQAogICAgICAgICAgIGlmIChpbmNsdWRlUGF0Y2hTZXRzKSB7CiAgICAgICAgICAgICBpZiAoaW5jbHVkZUZpbGVzKSB7CiAgICAgICAgICAgICAgIGV2ZW50RmFjdG9yeS5hZGRQYXRjaFNldHMoYywgZC5wYXRjaGVzKGRiKSwKLSAgICAgICAgICAgICAgICBpbmNsdWRlQXBwcm92YWxzID8gZC5hcHByb3ZhbHNNYXAoZGIpIDogbnVsbCwKLSAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMsIGQuY2hhbmdlKGRiKSk7CisgICAgICAgICAgICAgICAgaW5jbHVkZUFwcHJvdmFscyA/IGQuYXBwcm92YWxzTWFwKGRiKS5hc01hcCgpIDogbnVsbCwKKyAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMsIGQuY2hhbmdlKGRiKSwgbGFiZWxUeXBlcyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICBldmVudEZhY3RvcnkuYWRkUGF0Y2hTZXRzKGMsIGQucGF0Y2hlcyhkYiksCi0gICAgICAgICAgICAgICAgICBpbmNsdWRlQXBwcm92YWxzID8gZC5hcHByb3ZhbHNNYXAoZGIpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgICBpbmNsdWRlQXBwcm92YWxzID8gZC5hcHByb3ZhbHNNYXAoZGIpLmFzTWFwKCkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgbGFiZWxUeXBlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogCkBAIC0yOTMsOCArMzA3LDggQEAKICAgICAgICAgICAgIFBhdGNoU2V0IGN1cnJlbnQgPSBkLmN1cnJlbnRQYXRjaFNldChkYik7CiAgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgIGMuY3VycmVudFBhdGNoU2V0ID0gZXZlbnRGYWN0b3J5LmFzUGF0Y2hTZXRBdHRyaWJ1dGUoY3VycmVudCk7Ci0gICAgICAgICAgICAgIGV2ZW50RmFjdG9yeS5hZGRBcHByb3ZhbHMoYy5jdXJyZW50UGF0Y2hTZXQsIC8vCi0gICAgICAgICAgICAgICAgICBkLmN1cnJlbnRBcHByb3ZhbHMoZGIpKTsKKyAgICAgICAgICAgICAgZXZlbnRGYWN0b3J5LmFkZEFwcHJvdmFscyhjLmN1cnJlbnRQYXRjaFNldCwKKyAgICAgICAgICAgICAgICAgIGQuY3VycmVudEFwcHJvdmFscyhkYiksIGxhYmVsVHlwZXMpOwogCiAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmlsZXMpIHsKICAgICAgICAgICAgICAgICBldmVudEZhY3RvcnkuYWRkUGF0Y2hTZXRGaWxlTmFtZXMoYy5jdXJyZW50UGF0Y2hTZXQsCkBAIC0zMjAsNiArMzM0LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIHN0YXRzLnJvd0NvdW50ID0gcmVzdWx0cy5zaXplKCk7CisgICAgICAgIGlmIChtb3JlUmVzdWx0cykgeworICAgICAgICAgIHN0YXRzLnJlc3VtZVNvcnRLZXkgPSBjLnNvcnRLZXk7CisgICAgICAgIH0KICAgICAgICAgc3RhdHMucnVuVGltZU1pbGxpc2Vjb25kcyA9CiAgICAgICAgICAgICBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXRzLnJ1blRpbWVNaWxsaXNlY29uZHM7CiAgICAgICAgIHNob3coc3RhdHMpOwpAQCAtMzM0LDYgKzM1MSwxMSBAQAogICAgICAgICBFcnJvck1lc3NhZ2UgbSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKICAgICAgICAgbS5tZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7CiAgICAgICAgIHNob3cobSk7CisgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgeworICAgICAgICBsb2cuZXJyb3IoIk1pc3NpbmcgY2hhbmdlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICBFcnJvck1lc3NhZ2UgbSA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKKyAgICAgICAgbS5tZXNzYWdlID0gIm1pc3NpbmcgY2hhbmdlICIgKyBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgc2hvdyhtKTsKICAgICAgIH0KICAgICB9IGZpbmFsbHkgewogICAgICAgdHJ5IHsKQEAgLTM1MCw3ICszNzIsNyBAQAogCiAgIHByaXZhdGUgaW50IGxpbWl0KFByZWRpY2F0ZTxDaGFuZ2VEYXRhPiBzKSB7CiAgICAgaW50IG4gPSBxdWVyeUJ1aWxkZXIuaGFzTGltaXQocykgPyBxdWVyeUJ1aWxkZXIuZ2V0TGltaXQocykgOiBtYXhMaW1pdDsKLSAgICByZXR1cm4gbGltaXQgPiAwID8gTWF0aC5taW4obiwgbGltaXQpICsgMSA6IG47CisgICAgcmV0dXJuIGxpbWl0ID4gMCA/IE1hdGgubWluKG4sIGxpbWl0KSArIDEgOiBuICsgMTsKICAgfQogCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9xdWVyeS9jaGFuZ2UvU2luZ2xlR3JvdXBVc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9TaW5nbGVHcm91cFVzZXIuamF2YQppbmRleCAyNzBiMmU3Li40YjcxNzE5IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9TaW5nbGVHcm91cFVzZXIuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3F1ZXJ5L2NoYW5nZS9TaW5nbGVHcm91cFVzZXIuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRQcm9qZWN0V2F0Y2g7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkNoYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQ2FwYWJpbGl0eUNvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBNZW1iZXJzaGlwOwpAQCAtMzcsNyArMzYsNyBAQAogCiAgIHB1YmxpYyBTaW5nbGVHcm91cFVzZXIoQ2FwYWJpbGl0eUNvbnRyb2wuRmFjdG9yeSBjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksCiAgICAgICBTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwcykgewotICAgIHN1cGVyKGNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSwgQWNjZXNzUGF0aC5VTktOT1dOKTsKKyAgICBzdXBlcihjYXBhYmlsaXR5Q29udHJvbEZhY3RvcnkpOwogICAgIHRoaXMuZ3JvdXBzID0gbmV3IExpc3RHcm91cE1lbWJlcnNoaXAoZ3JvdXBzKTsKICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9CYXNlRGF0YVNvdXJjZVR5cGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0Jhc2VEYXRhU291cmNlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MmMzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9CYXNlRGF0YVNvdXJjZVR5cGUuamF2YQpAQCAtMCwwICsxLDYxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VEYXRhU291cmNlVHlwZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VUeXBlIHsKKworICBwcml2YXRlIGZpbmFsIFN0cmluZyBkcml2ZXI7CisKKyAgcHJvdGVjdGVkIEJhc2VEYXRhU291cmNlVHlwZShTdHJpbmcgZHJpdmVyKSB7CisgICAgdGhpcy5kcml2ZXIgPSBkcml2ZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREcml2ZXIoKSB7CisgICAgcmV0dXJuIGRyaXZlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiB1c2VQb29sKCkgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTY3JpcHRSdW5uZXIgZ2V0SW5kZXhTY3JpcHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBnZXRTY3JpcHRSdW5uZXIoImluZGV4X2dlbmVyaWMuc3FsIik7CisgIH0KKworICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNjcmlwdFJ1bm5lciBnZXRTY3JpcHRSdW5uZXIoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgcmV0dXJuIFNjcmlwdFJ1bm5lci5OT09QOworICAgIH0KKyAgICBJbnB1dFN0cmVhbSBpbiA9ICBSZXZpZXdEYi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGgpOworICAgIGlmIChpbiA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTUUwgc2NyaXB0ICIgKyBwYXRoICsgIiBub3QgZm91bmQiKTsKKyAgICB9CisgICAgU2NyaXB0UnVubmVyIHJ1bm5lcjsKKyAgICB0cnkgeworICAgICAgcnVubmVyID0gbmV3IFNjcmlwdFJ1bm5lcihwYXRoLCBpbik7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGluLmNsb3NlKCk7CisgICAgfQorICAgIHJldHVybiBydW5uZXI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0RhdGFTb3VyY2VNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL0RhdGFTb3VyY2VNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY2YWQzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lczsKKworcHVibGljIGNsYXNzIERhdGFTb3VyY2VNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICBiaW5kKERhdGFTb3VyY2VUeXBlLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKE5hbWVzLm5hbWVkKCJoMiIpKS50byhIMi5jbGFzcyk7CisgICAgYmluZChEYXRhU291cmNlVHlwZS5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZCgiamRiYyIpKS50byhKREJDLmNsYXNzKTsKKyAgICBiaW5kKERhdGFTb3VyY2VUeXBlLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKE5hbWVzLm5hbWVkKCJteXNxbCIpKS50byhNeVNxbC5jbGFzcyk7CisgICAgYmluZChEYXRhU291cmNlVHlwZS5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZCgicG9zdGdyZXNxbCIpKS50byhQb3N0Z3JlU1FMLmNsYXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZVByb3ZpZGVyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlUHJvdmlkZXIuamF2YQppbmRleCBjYzQ4MDE5Li42YzljYTU5ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZVByb3ZpZGVyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZVByb3ZpZGVyLmphdmEKQEAgLTE0LDExICsxNCwxMiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdVdGlsLmdldEVudW07CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmV2ZW50cy5MaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1NlY3Rpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdVdGlsOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwpAQCAtMzEsOCArMzIsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kYmNwLkJhc2ljRGF0YVNvdXJjZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKQEAgLTQwLDE4ICszOSwzMCBAQAogCiAvKiogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBEYXRhU291cmNlLiAqLwogQFNpbmdsZXRvbgotcHVibGljIGZpbmFsIGNsYXNzIERhdGFTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPERhdGFTb3VyY2U+LAorcHVibGljIGNsYXNzIERhdGFTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPERhdGFTb3VyY2U+LAogICAgIExpZmVjeWNsZUxpc3RlbmVyIHsKLSAgcHJpdmF0ZSBmaW5hbCBEYXRhU291cmNlIGRzOworICBwcml2YXRlIGZpbmFsIFNpdGVQYXRocyBzaXRlOworICBwcml2YXRlIGZpbmFsIENvbmZpZyBjZmc7CisgIHByaXZhdGUgZmluYWwgQ29udGV4dCBjdHg7CisgIHByaXZhdGUgZmluYWwgRGF0YVNvdXJjZVR5cGUgZHN0OworICBwcml2YXRlIERhdGFTb3VyY2UgZHM7CiAKICAgQEluamVjdAotICBEYXRhU291cmNlUHJvdmlkZXIoZmluYWwgU2l0ZVBhdGhzIHNpdGUsCi0gICAgICBAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcsIENvbnRleHQgY3R4KSB7Ci0gICAgZHMgPSBvcGVuKHNpdGUsIGNmZywgY3R4KTsKKyAgcHJvdGVjdGVkIERhdGFTb3VyY2VQcm92aWRlcihTaXRlUGF0aHMgc2l0ZSwKKyAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZywKKyAgICAgIENvbnRleHQgY3R4LAorICAgICAgRGF0YVNvdXJjZVR5cGUgZHN0KSB7CisgICAgdGhpcy5zaXRlID0gc2l0ZTsKKyAgICB0aGlzLmNmZyA9IGNmZzsKKyAgICB0aGlzLmN0eCA9IGN0eDsKKyAgICB0aGlzLmRzdCA9IGRzdDsKICAgfQogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgc3luY2hyb25pemVkIERhdGFTb3VyY2UgZ2V0KCkgeworICAgIGlmIChkcyA9PSBudWxsKSB7CisgICAgICBkcyA9IG9wZW4oc2l0ZSwgY2ZnLCBjdHgsIGRzdCk7CisgICAgfQogICAgIHJldHVybiBkczsKICAgfQogCkBAIC03NCwxMDAgKzg1LDI3IEBACiAgICAgU0lOR0xFX1VTRVIsIE1VTFRJX1VTRVI7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGVudW0gVHlwZSB7Ci0gICAgSDIsIFBPU1RHUkVTUUwsIE1ZU1FMLCBKREJDOwotICB9Ci0KICAgcHJpdmF0ZSBEYXRhU291cmNlIG9wZW4oZmluYWwgU2l0ZVBhdGhzIHNpdGUsIGZpbmFsIENvbmZpZyBjZmcsCi0gICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICBUeXBlIHR5cGUgPSBnZXRFbnVtKGNmZywgImRhdGFiYXNlIiwgbnVsbCwgInR5cGUiLCBUeXBlLnZhbHVlcygpLCBudWxsKTsKLSAgICBTdHJpbmcgZHJpdmVyID0gb3B0aW9uYWwoY2ZnLCAiZHJpdmVyIik7Ci0gICAgU3RyaW5nIHVybCA9IG9wdGlvbmFsKGNmZywgInVybCIpOwotICAgIFN0cmluZyB1c2VybmFtZSA9IG9wdGlvbmFsKGNmZywgInVzZXJuYW1lIik7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gb3B0aW9uYWwoY2ZnLCAicGFzc3dvcmQiKTsKLQotICAgIGlmICh1cmwgPT0gbnVsbCB8fCB1cmwuaXNFbXB0eSgpKSB7Ci0gICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgIHR5cGUgPSBUeXBlLkgyOwotICAgICAgfQotCi0gICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBIMjogewotICAgICAgICAgIFN0cmluZyBkYXRhYmFzZSA9IG9wdGlvbmFsKGNmZywgImRhdGFiYXNlIik7Ci0gICAgICAgICAgaWYgKGRhdGFiYXNlID09IG51bGwgfHwgZGF0YWJhc2UuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBkYXRhYmFzZSA9ICJkYi9SZXZpZXdEQiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIEZpbGUgZGIgPSBzaXRlLnJlc29sdmUoZGF0YWJhc2UpOwotICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBkYiA9IGRiLmdldENhbm9uaWNhbEZpbGUoKTsKLSAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBkYiA9IGRiLmdldEFic29sdXRlRmlsZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICB1cmwgPSAiamRiYzpoMjoiICsgZGIudG9VUkkoKS50b1N0cmluZygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBQT1NUR1JFU1FMOiB7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICBiLmFwcGVuZCgiamRiYzpwb3N0Z3Jlc3FsOi8vIik7Ci0gICAgICAgICAgYi5hcHBlbmQoaG9zdG5hbWUob3B0aW9uYWwoY2ZnLCAiaG9zdG5hbWUiKSkpOwotICAgICAgICAgIGIuYXBwZW5kKHBvcnQob3B0aW9uYWwoY2ZnLCAicG9ydCIpKSk7Ci0gICAgICAgICAgYi5hcHBlbmQoIi8iKTsKLSAgICAgICAgICBiLmFwcGVuZChyZXF1aXJlZChjZmcsICJkYXRhYmFzZSIpKTsKLSAgICAgICAgICB1cmwgPSBiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE1ZU1FMOiB7Ci0gICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICBiLmFwcGVuZCgiamRiYzpteXNxbDovLyIpOwotICAgICAgICAgIGIuYXBwZW5kKGhvc3RuYW1lKG9wdGlvbmFsKGNmZywgImhvc3RuYW1lIikpKTsKLSAgICAgICAgICBiLmFwcGVuZChwb3J0KG9wdGlvbmFsKGNmZywgInBvcnQiKSkpOwotICAgICAgICAgIGIuYXBwZW5kKCIvIik7Ci0gICAgICAgICAgYi5hcHBlbmQocmVxdWlyZWQoY2ZnLCAiZGF0YWJhc2UiKSk7Ci0gICAgICAgICAgdXJsID0gYi50b1N0cmluZygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBKREJDOgotICAgICAgICAgIGRyaXZlciA9IHJlcXVpcmVkKGNmZywgImRyaXZlciIpOwotICAgICAgICAgIHVybCA9IHJlcXVpcmVkKGNmZywgInVybCIpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0eXBlICsgIiBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICB9CisgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQsIGZpbmFsIERhdGFTb3VyY2VUeXBlIGRzdCkgeworICAgIENvbmZpZ1NlY3Rpb24gZGJzID0gbmV3IENvbmZpZ1NlY3Rpb24oY2ZnLCAiZGF0YWJhc2UiKTsKKyAgICBTdHJpbmcgZHJpdmVyID0gZGJzLm9wdGlvbmFsKCJkcml2ZXIiKTsKKyAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KGRyaXZlcikpIHsKKyAgICAgIGRyaXZlciA9IGRzdC5nZXREcml2ZXIoKTsKICAgICB9CiAKLSAgICBpZiAoZHJpdmVyID09IG51bGwgfHwgZHJpdmVyLmlzRW1wdHkoKSkgewotICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOmgyOiIpKSB7Ci0gICAgICAgIGRyaXZlciA9ICJvcmcuaDIuRHJpdmVyIjsKLQotICAgICAgfSBlbHNlIGlmICh1cmwuc3RhcnRzV2l0aCgiamRiYzpwb3N0Z3Jlc3FsOiIpKSB7Ci0gICAgICAgIGRyaXZlciA9ICJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiOwotCi0gICAgICB9IGVsc2UgaWYgKHVybC5zdGFydHNXaXRoKCJqZGJjOm15c3FsOiIpKSB7Ci0gICAgICAgIGRyaXZlciA9ICJjb20ubXlzcWwuamRiYy5Ecml2ZXIiOwotCi0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkYXRhYmFzZS5kcml2ZXIgbXVzdCBiZSBzZXQiKTsKLSAgICAgIH0KKyAgICBTdHJpbmcgdXJsID0gZGJzLm9wdGlvbmFsKCJ1cmwiKTsKKyAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KHVybCkpIHsKKyAgICAgIHVybCA9IGRzdC5nZXRVcmwoKTsKICAgICB9CiAKKyAgICBTdHJpbmcgdXNlcm5hbWUgPSBkYnMub3B0aW9uYWwoInVzZXJuYW1lIik7CisgICAgU3RyaW5nIHBhc3N3b3JkID0gZGJzLm9wdGlvbmFsKCJwYXNzd29yZCIpOworCiAgICAgYm9vbGVhbiB1c2VQb29sOwotICAgIGlmICh1cmwuc3RhcnRzV2l0aCgiamRiYzpteXNxbDoiKSkgewotICAgICAgLy8gTXlTUUwgaGFzIGdpdmVuIHVzIHRyb3VibGUgd2l0aCB0aGUgY29ubmVjdGlvbiBwb29sLAotICAgICAgLy8gc29tZXRpbWVzIHRoZSBiYWNrZW5kIGRpc2Nvbm5lY3RzIGFuZCB0aGUgcG9vbCB3aW5kcwotICAgICAgLy8gdXAgd2l0aCBhIHN0YWxlIGNvbm5lY3Rpb24uIEZvcnR1bmF0ZWx5IG9wZW5pbmcgdXAKLSAgICAgIC8vIGEgbmV3IE15U1FMIGNvbm5lY3Rpb24gaXMgdXN1YWxseSB2ZXJ5IGZhc3QuCi0gICAgICAvLwotICAgICAgdXNlUG9vbCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICB1c2VQb29sID0gdHJ1ZTsKLSAgICB9Ci0gICAgdXNlUG9vbCA9IGNmZy5nZXRCb29sZWFuKCJkYXRhYmFzZSIsICJjb25uZWN0aW9ucG9vbCIsIHVzZVBvb2wpOwogICAgIGlmIChjb250ZXh0ID09IENvbnRleHQuU0lOR0xFX1VTRVIpIHsKICAgICAgIHVzZVBvb2wgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgdXNlUG9vbCA9IGNmZy5nZXRCb29sZWFuKCJkYXRhYmFzZSIsICJjb25uZWN0aW9ucG9vbCIsIGRzdC51c2VQb29sKCkpOwogICAgIH0KIAogICAgIGlmICh1c2VQb29sKSB7CkBAIC0yMDcsMzMgKzE0NSw0IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhvc3RuYW1lKFN0cmluZyBob3N0bmFtZSkgewotICAgIGlmIChob3N0bmFtZSA9PSBudWxsIHx8IGhvc3RuYW1lLmlzRW1wdHkoKSkgewotICAgICAgaG9zdG5hbWUgPSAibG9jYWxob3N0IjsKLQotICAgIH0gZWxzZSBpZiAoaG9zdG5hbWUuY29udGFpbnMoIjoiKSAmJiAhaG9zdG5hbWUuc3RhcnRzV2l0aCgiWyIpKSB7Ci0gICAgICBob3N0bmFtZSA9ICJbIiArIGhvc3RuYW1lICsgIl0iOwotICAgIH0KLSAgICByZXR1cm4gaG9zdG5hbWU7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcG9ydChTdHJpbmcgcG9ydCkgewotICAgIGlmIChwb3J0ICE9IG51bGwgJiYgIXBvcnQuaXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gIjoiICsgcG9ydDsKLSAgICB9Ci0gICAgcmV0dXJuICIiOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG9wdGlvbmFsKGZpbmFsIENvbmZpZyBjb25maWcsIGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIGNvbmZpZy5nZXRTdHJpbmcoImRhdGFiYXNlIiwgbnVsbCwgbmFtZSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVxdWlyZWQoZmluYWwgQ29uZmlnIGNvbmZpZywgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICBmaW5hbCBTdHJpbmcgdiA9IG9wdGlvbmFsKGNvbmZpZywgbmFtZSk7Ci0gICAgaWYgKHYgPT0gbnVsbCB8fCAiIi5lcXVhbHModikpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGRhdGFiYXNlLiIgKyBuYW1lICsgIiBjb25maWd1cmVkIik7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9EYXRhU291cmNlVHlwZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNiNzgwCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvRGF0YVNvdXJjZVR5cGUuamF2YQpAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKKworLyoqIEFic3RyYWN0aW9uIG9mIGEgc3VwcG9ydGVkIGRhdGFiYXNlIHBsYXRmb3JtICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFTb3VyY2VUeXBlIHsKKworICBwdWJsaWMgU3RyaW5nIGdldERyaXZlcigpOworCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCk7CisKKyAgcHVibGljIGJvb2xlYW4gdXNlUG9vbCgpOworCisgIC8qKgorICAgKiBSZXR1cm4gYSBTY3JpcHRSdW5uZXIgdGhhdCBydW5zIHRoZSBpbmRleCBzY3JpcHQuIE11c3Qgbm90IHJldHVybgorICAgKiA8Y29kZT5udWxsPC9jb2RlPiwgYnV0IG1heSByZXR1cm4gYSBTY3JpcHRSdW5uZXIgdGhhdCBkb2VzIG5vdGhpbmcuCisgICAqCisgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICovCisgIHB1YmxpYyBTY3JpcHRSdW5uZXIgZ2V0SW5kZXhTY3JpcHQoKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9IMi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvSDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDM1MzBmCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvSDIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitjbGFzcyBIMiBleHRlbmRzIEJhc2VEYXRhU291cmNlVHlwZSB7CisKKyAgcHJvdGVjdGVkIGZpbmFsIENvbmZpZyBjZmc7CisgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGU7CisKKyAgQEluamVjdAorICBIMihmaW5hbCBTaXRlUGF0aHMgc2l0ZSwgQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgY2ZnKSB7CisgICAgc3VwZXIoIm9yZy5oMi5Ecml2ZXIiKTsKKyAgICB0aGlzLmNmZyA9IGNmZzsKKyAgICB0aGlzLnNpdGUgPSBzaXRlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgIFN0cmluZyBkYXRhYmFzZSA9IGNmZy5nZXRTdHJpbmcoImRhdGFiYXNlIiwgbnVsbCwgImRhdGFiYXNlIik7CisgICAgaWYgKGRhdGFiYXNlID09IG51bGwgfHwgZGF0YWJhc2UuaXNFbXB0eSgpKSB7CisgICAgICBkYXRhYmFzZSA9ICJkYi9SZXZpZXdEQiI7CisgICAgfQorICAgIEZpbGUgZGIgPSBzaXRlLnJlc29sdmUoZGF0YWJhc2UpOworICAgIHRyeSB7CisgICAgICBkYiA9IGRiLmdldENhbm9uaWNhbEZpbGUoKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICBkYiA9IGRiLmdldEFic29sdXRlRmlsZSgpOworICAgIH0KKyAgICByZXR1cm4gImpkYmM6aDI6IiArIGRiLnRvVVJJKCkudG9TdHJpbmcoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvSkRCQy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvSkRCQy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjA1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9KREJDLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNvbmZpZ1V0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCitjbGFzcyBKREJDIGV4dGVuZHMgQmFzZURhdGFTb3VyY2VUeXBlIHsKKworICBwcm90ZWN0ZWQgZmluYWwgQ29uZmlnIGNmZzsKKworICBASW5qZWN0CisgIEpEQkMoQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgY2ZnKSB7CisgICAgc3VwZXIoQ29uZmlnVXRpbC5nZXRSZXF1aXJlZChjZmcsICJkYXRhYmFzZSIsICJkcml2ZXIiKSk7CisgICAgdGhpcy5jZmcgPSBjZmc7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyBnZXRVcmwoKSB7CisgICAgcmV0dXJuIENvbmZpZ1V0aWwuZ2V0UmVxdWlyZWQoY2ZnLCAiZGF0YWJhc2UiLCAidXJsIik7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9KZGJjVXRpbC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvSmRiY1V0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNhNDNkCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvSmRiY1V0aWwuamF2YQpAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworcHVibGljIGNsYXNzIEpkYmNVdGlsIHsKKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBob3N0bmFtZShTdHJpbmcgaG9zdG5hbWUpIHsKKyAgICBpZiAoaG9zdG5hbWUgPT0gbnVsbCB8fCBob3N0bmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgIGhvc3RuYW1lID0gImxvY2FsaG9zdCI7CisKKyAgICB9IGVsc2UgaWYgKGhvc3RuYW1lLmNvbnRhaW5zKCI6IikgJiYgIWhvc3RuYW1lLnN0YXJ0c1dpdGgoIlsiKSkgeworICAgICAgaG9zdG5hbWUgPSAiWyIgKyBob3N0bmFtZSArICJdIjsKKyAgICB9CisgICAgcmV0dXJuIGhvc3RuYW1lOworICB9CisKKyAgc3RhdGljIFN0cmluZyBwb3J0KFN0cmluZyBwb3J0KSB7CisgICAgaWYgKHBvcnQgIT0gbnVsbCAmJiAhcG9ydC5pc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiAiOiIgKyBwb3J0OworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL015U3FsLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9NeVNxbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOGNlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9NeVNxbC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuSmRiY1V0aWwuaG9zdG5hbWU7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuSmRiY1V0aWwucG9ydDsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ29uZmlnU2VjdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CisKK2NsYXNzIE15U3FsIGV4dGVuZHMgQmFzZURhdGFTb3VyY2VUeXBlIHsKKworICBwcml2YXRlIENvbmZpZyBjZmc7CisKKyAgQEluamVjdAorICBwdWJsaWMgTXlTcWwoQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgY2ZnKSB7CisgICAgc3VwZXIoImNvbS5teXNxbC5qZGJjLkRyaXZlciIpOworICAgIHRoaXMuY2ZnID0gY2ZnOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgZmluYWwgQ29uZmlnU2VjdGlvbiBkYnMgPSBuZXcgQ29uZmlnU2VjdGlvbihjZmcsICJkYXRhYmFzZSIpOworICAgIGIuYXBwZW5kKCJqZGJjOm15c3FsOi8vIik7CisgICAgYi5hcHBlbmQoaG9zdG5hbWUoZGJzLm9wdGlvbmFsKCJob3N0bmFtZSIpKSk7CisgICAgYi5hcHBlbmQocG9ydChkYnMub3B0aW9uYWwoInBvcnQiKSkpOworICAgIGIuYXBwZW5kKCIvIik7CisgICAgYi5hcHBlbmQoZGJzLnJlcXVpcmVkKCJkYXRhYmFzZSIpKTsKKyAgICByZXR1cm4gYi50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIHVzZVBvb2woKSB7CisgICAgLy8gTXlTUUwgaGFzIGdpdmVuIHVzIHRyb3VibGUgd2l0aCB0aGUgY29ubmVjdGlvbiBwb29sLAorICAgIC8vIHNvbWV0aW1lcyB0aGUgYmFja2VuZCBkaXNjb25uZWN0cyBhbmQgdGhlIHBvb2wgd2luZHMKKyAgICAvLyB1cCB3aXRoIGEgc3RhbGUgY29ubmVjdGlvbi4gRm9ydHVuYXRlbHkgb3BlbmluZyB1cAorICAgIC8vIGEgbmV3IE15U1FMIGNvbm5lY3Rpb24gaXMgdXN1YWxseSB2ZXJ5IGZhc3QuCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvUG9zdGdyZVNRTC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvUG9zdGdyZVNRTC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OGQwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9Qb3N0Z3JlU1FMLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5KZGJjVXRpbC5ob3N0bmFtZTsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5KZGJjVXRpbC5wb3J0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5Db25maWdTZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2NsYXNzIFBvc3RncmVTUUwgZXh0ZW5kcyBCYXNlRGF0YVNvdXJjZVR5cGUgeworCisgIHByaXZhdGUgQ29uZmlnIGNmZzsKKworICBASW5qZWN0CisgIHB1YmxpYyBQb3N0Z3JlU1FMKEBHZXJyaXRTZXJ2ZXJDb25maWcgZmluYWwgQ29uZmlnIGNmZykgeworICAgIHN1cGVyKCJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiKTsKKyAgICB0aGlzLmNmZyA9IGNmZzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZpbmFsIENvbmZpZ1NlY3Rpb24gZGJjID0gbmV3IENvbmZpZ1NlY3Rpb24oY2ZnLCAiZGF0YWJhc2UiKTsKKyAgICBiLmFwcGVuZCgiamRiYzpwb3N0Z3Jlc3FsOi8vIik7CisgICAgYi5hcHBlbmQoaG9zdG5hbWUoZGJjLm9wdGlvbmFsKCJob3N0bmFtZSIpKSk7CisgICAgYi5hcHBlbmQocG9ydChkYmMub3B0aW9uYWwoInBvcnQiKSkpOworICAgIGIuYXBwZW5kKCIvIik7CisgICAgYi5hcHBlbmQoZGJjLnJlcXVpcmVkKCJkYXRhYmFzZSIpKTsKKyAgICByZXR1cm4gYi50b1N0cmluZygpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTY3JpcHRSdW5uZXIgZ2V0SW5kZXhTY3JpcHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHJldHVybiBnZXRTY3JpcHRSdW5uZXIoImluZGV4X3Bvc3RncmVzLnNxbCIpOworICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hQ3JlYXRvci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hQ3JlYXRvci5qYXZhCmluZGV4IGZkMzc5YjIuLjQyODZiYTAgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYUNyZWF0b3IuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFDcmVhdG9yLmphdmEKQEAgLTE0LDE3ICsxNCwxOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLlZlcnNpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5HbG9iYWxDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFZhbHVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvblJ1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DdXJyZW50U2NoZW1hVmVyc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5Jbmhlcml0YWJsZUJvb2xlYW47CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlN5c3RlbUNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkdlcnJpdFBlcnNvbklkZW50OwpAQCAtMzgsMTAgKzQwLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uamRiYy5KZGJjRXhlY3V0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uamRiYy5KZGJjU2NoZW1hOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNjaGVtYS5zcWwuRGlhbGVjdEgyOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNjaGVtYS5zcWwuRGlhbGVjdE15U1FMOwotaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNjaGVtYS5zcWwuRGlhbGVjdFBvc3RncmVTUUw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2NoZW1hLnNxbC5TcWxEaWFsZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC01NCw3ICs1Miw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAogLyoqIENyZWF0ZXMgdGhlIGN1cnJlbnQgZGF0YWJhc2Ugc2NoZW1hIGFuZCBwb3B1bGF0ZXMgaW5pdGlhbCBjb2RlIHJvd3MuICovCkBAIC02NSwxMSArNjIsOSBAQAogICBwcml2YXRlIGZpbmFsIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIG1ncjsKICAgcHJpdmF0ZSBmaW5hbCBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHNOYW1lOwogICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IHNlcnZlclVzZXI7CisgIHByaXZhdGUgZmluYWwgRGF0YVNvdXJjZVR5cGUgZGF0YVNvdXJjZVR5cGU7CiAKICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbk5icjsKLSAgcHJpdmF0ZSBmaW5hbCBTY3JpcHRSdW5uZXIgaW5kZXhfZ2VuZXJpYzsKLSAgcHJpdmF0ZSBmaW5hbCBTY3JpcHRSdW5uZXIgaW5kZXhfcG9zdGdyZXM7Ci0gIHByaXZhdGUgZmluYWwgU2NyaXB0UnVubmVyIG15c3FsX25leHR2YWw7CiAKICAgcHJpdmF0ZSBBY2NvdW50R3JvdXAgYWRtaW47CiAgIHByaXZhdGUgQWNjb3VudEdyb3VwIGFub255bW91czsKQEAgLTgxLDIzICs3NiwyMyBAQAogICAgICAgQEN1cnJlbnQgU2NoZW1hVmVyc2lvbiB2ZXJzaW9uLAogICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgbWdyLAogICAgICAgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZSwKLSAgICAgIEBHZXJyaXRQZXJzb25JZGVudCBQZXJzb25JZGVudCBhdSkgewotICAgIHRoaXMoc2l0ZS5zaXRlX3BhdGgsIHZlcnNpb24sIG1nciwgYWxsUHJvamVjdHNOYW1lLCBhdSk7CisgICAgICBAR2Vycml0UGVyc29uSWRlbnQgUGVyc29uSWRlbnQgYXUsCisgICAgICBEYXRhU291cmNlVHlwZSBkc3QpIHsKKyAgICB0aGlzKHNpdGUuc2l0ZV9wYXRoLCB2ZXJzaW9uLCBtZ3IsIGFsbFByb2plY3RzTmFtZSwgYXUsIGRzdCk7CiAgIH0KIAogICBwdWJsaWMgU2NoZW1hQ3JlYXRvcihAU2l0ZVBhdGggRmlsZSBzaXRlLAogICAgICAgQEN1cnJlbnQgU2NoZW1hVmVyc2lvbiB2ZXJzaW9uLAogICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgZ2l0TWdyLAogICAgICAgQWxsUHJvamVjdHNOYW1lIGFwLAotICAgICAgQEdlcnJpdFBlcnNvbklkZW50IFBlcnNvbklkZW50IGF1KSB7CisgICAgICBAR2Vycml0UGVyc29uSWRlbnQgUGVyc29uSWRlbnQgYXUsCisgICAgICBEYXRhU291cmNlVHlwZSBkc3QpIHsKICAgICBzaXRlX3BhdGggPSBzaXRlOwogICAgIG1nciA9IGdpdE1ncjsKICAgICBhbGxQcm9qZWN0c05hbWUgPSBhcDsKICAgICBzZXJ2ZXJVc2VyID0gYXU7CisgICAgZGF0YVNvdXJjZVR5cGUgPSBkc3Q7CiAgICAgdmVyc2lvbk5iciA9IHZlcnNpb24uZ2V0VmVyc2lvbk5icigpOwotICAgIGluZGV4X2dlbmVyaWMgPSBuZXcgU2NyaXB0UnVubmVyKCJpbmRleF9nZW5lcmljLnNxbCIpOwotICAgIGluZGV4X3Bvc3RncmVzID0gbmV3IFNjcmlwdFJ1bm5lcigiaW5kZXhfcG9zdGdyZXMuc3FsIik7Ci0gICAgbXlzcWxfbmV4dHZhbCA9IG5ldyBTY3JpcHRSdW5uZXIoIm15c3FsX25leHR2YWwuc3FsIik7CiAgIH0KIAogICBwdWJsaWMgdm9pZCBjcmVhdGUoZmluYWwgUmV2aWV3RGIgZGIpIHRocm93cyBPcm1FeGNlcHRpb24sIElPRXhjZXB0aW9uLApAQCAtMTE0LDI5ICsxMDksOSBAQAogICAgIHNWZXIudmVyc2lvbk5iciA9IHZlcnNpb25OYnI7CiAgICAgZGIuc2NoZW1hVmVyc2lvbigpLmluc2VydChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc1ZlcikpOwogCi0gICAgZmluYWwgU3lzdGVtQ29uZmlnIHNDb25maWcgPSBpbml0U3lzdGVtQ29uZmlnKGRiKTsKLSAgICBpbml0VmVyaWZpZWRDYXRlZ29yeShkYik7Ci0gICAgaW5pdENvZGVSZXZpZXdDYXRlZ29yeShkYiwgc0NvbmZpZyk7Ci0KLSAgICBpZiAobWdyICE9IG51bGwpIHsKLSAgICAgIC8vIFRPRE8gVGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbCB3aGVuIGluaXRpYWxpemluZyBhIHNpdGUuCi0gICAgICBpbml0V2lsZENhcmRQcm9qZWN0KCk7Ci0gICAgfQotCi0gICAgZmluYWwgU3FsRGlhbGVjdCBkID0gamRiYy5nZXREaWFsZWN0KCk7Ci0gICAgaWYgKGQgaW5zdGFuY2VvZiBEaWFsZWN0SDIpIHsKLSAgICAgIGluZGV4X2dlbmVyaWMucnVuKGRiKTsKLQotICAgIH0gZWxzZSBpZiAoZCBpbnN0YW5jZW9mIERpYWxlY3RNeVNRTCkgewotICAgICAgaW5kZXhfZ2VuZXJpYy5ydW4oZGIpOwotICAgICAgbXlzcWxfbmV4dHZhbC5ydW4oZGIpOwotCi0gICAgfSBlbHNlIGlmIChkIGluc3RhbmNlb2YgRGlhbGVjdFBvc3RncmVTUUwpIHsKLSAgICAgIGluZGV4X3Bvc3RncmVzLnJ1bihkYik7Ci0KLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZGF0YWJhc2UgIiArIGQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgIH0KKyAgICBpbml0U3lzdGVtQ29uZmlnKGRiKTsKKyAgICBpbml0QWxsUHJvamVjdHMoKTsKKyAgICBkYXRhU291cmNlVHlwZS5nZXRJbmRleFNjcmlwdCgpLnJ1bihkYik7CiAgIH0KIAogICBwcml2YXRlIEFjY291bnRHcm91cCBuZXdHcm91cChSZXZpZXdEYiBjLCBTdHJpbmcgbmFtZSwgQWNjb3VudEdyb3VwLlVVSUQgdXVpZCkKQEAgLTIwMiwyMyArMTc3LDMyIEBACiAgICAgcmV0dXJuIHM7CiAgIH0KIAotICBwcml2YXRlIHZvaWQgaW5pdFdpbGRDYXJkUHJvamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7Ci0gICAgUmVwb3NpdG9yeSBnaXQ7CisgIHByaXZhdGUgdm9pZCBpbml0QWxsUHJvamVjdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworICAgIFJlcG9zaXRvcnkgZ2l0ID0gbnVsbDsKICAgICB0cnkgewogICAgICAgZ2l0ID0gbWdyLm9wZW5SZXBvc2l0b3J5KGFsbFByb2plY3RzTmFtZSk7CisgICAgICBpbml0QWxsUHJvamVjdHMoZ2l0KTsKICAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gbm90Rm91bmQpIHsKICAgICAgIC8vIEEgcmVwb3NpdG9yeSBtYXkgYmUgbWlzc2luZyBpZiB0aGlzIHByb2plY3QgZXhpc3RlZCBvbmx5IHRvIHN0b3JlCiAgICAgICAvLyBpbmhlcml0YWJsZSBwZXJtaXNzaW9ucy4gRm9yIGV4YW1wbGUgJ0FsbC1Qcm9qZWN0cycuCiAgICAgICB0cnkgewogICAgICAgICBnaXQgPSBtZ3IuY3JlYXRlUmVwb3NpdG9yeShhbGxQcm9qZWN0c05hbWUpOworICAgICAgICBpbml0QWxsUHJvamVjdHMoZ2l0KTsKICAgICAgICAgZmluYWwgUmVmVXBkYXRlIHUgPSBnaXQudXBkYXRlUmVmKENvbnN0YW50cy5IRUFEKTsKICAgICAgICAgdS5saW5rKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLlJFRl9DT05GSUcpOwogICAgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGVycikgewogICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGFsbFByb2plY3RzTmFtZS5nZXQoKTsKICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIHJlcG9zaXRvcnkgIiArIG5hbWUsIGVycik7CiAgICAgICB9CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIGlmIChnaXQgIT0gbnVsbCkgeworICAgICAgICBnaXQuY2xvc2UoKTsKKyAgICAgIH0KICAgICB9Ci0gICAgdHJ5IHsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBpbml0QWxsUHJvamVjdHMoUmVwb3NpdG9yeSBnaXQpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogICAgICAgTWV0YURhdGFVcGRhdGUgbWQgPQogICAgICAgICAgIG5ldyBNZXRhRGF0YVVwZGF0ZShHaXRSZWZlcmVuY2VVcGRhdGVkLkRJU0FCTEVELCBhbGxQcm9qZWN0c05hbWUsIGdpdCk7CiAgICAgICBtZC5nZXRDb21taXRCdWlsZGVyKCkuc2V0QXV0aG9yKHNlcnZlclVzZXIpOwpAQCAtMjI2LDQwICsyMTAsNzcgQEAKIAogICAgICAgUHJvamVjdENvbmZpZyBjb25maWcgPSBQcm9qZWN0Q29uZmlnLnJlYWQobWQpOwogICAgICAgUHJvamVjdCBwID0gY29uZmlnLmdldFByb2plY3QoKTsKLSAgICAgIHAuc2V0RGVzY3JpcHRpb24oIlJpZ2h0cyBpbmhlcml0ZWQgYnkgYWxsIG90aGVyIHByb2plY3RzIik7Ci0gICAgICBwLnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhmYWxzZSk7CisgICAgICBwLnNldERlc2NyaXB0aW9uKCJBY2Nlc3MgaW5oZXJpdGVkIGJ5IGFsbCBvdGhlciBwcm9qZWN0cy4iKTsKKyAgICAgIHAuc2V0UmVxdWlyZUNoYW5nZUlEKEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFKTsKKyAgICAgIHAuc2V0VXNlQ29udGVudE1lcmdlKEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFKTsKKyAgICAgIHAuc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKEluaGVyaXRhYmxlQm9vbGVhbi5GQUxTRSk7CisgICAgICBwLnNldFVzZVNpZ25lZE9mZkJ5KEluaGVyaXRhYmxlQm9vbGVhbi5GQUxTRSk7CiAKICAgICAgIEFjY2Vzc1NlY3Rpb24gY2FwID0gY29uZmlnLmdldEFjY2Vzc1NlY3Rpb24oQWNjZXNzU2VjdGlvbi5HTE9CQUxfQ0FQQUJJTElUSUVTLCB0cnVlKTsKICAgICAgIEFjY2Vzc1NlY3Rpb24gYWxsID0gY29uZmlnLmdldEFjY2Vzc1NlY3Rpb24oQWNjZXNzU2VjdGlvbi5BTEwsIHRydWUpOwogICAgICAgQWNjZXNzU2VjdGlvbiBoZWFkcyA9IGNvbmZpZy5nZXRBY2Nlc3NTZWN0aW9uKEFjY2Vzc1NlY3Rpb24uSEVBRFMsIHRydWUpOworICAgICAgQWNjZXNzU2VjdGlvbiB0YWdzID0gY29uZmlnLmdldEFjY2Vzc1NlY3Rpb24oInJlZnMvdGFncy8qIiwgdHJ1ZSk7CiAgICAgICBBY2Nlc3NTZWN0aW9uIG1ldGEgPSBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbihHaXRSZXBvc2l0b3J5TWFuYWdlci5SRUZfQ09ORklHLCB0cnVlKTsKKyAgICAgIEFjY2Vzc1NlY3Rpb24gbWFnaWMgPSBjb25maWcuZ2V0QWNjZXNzU2VjdGlvbigicmVmcy9mb3IvIiArIEFjY2Vzc1NlY3Rpb24uQUxMLCB0cnVlKTsKIAotICAgICAgY2FwLmdldFBlcm1pc3Npb24oR2xvYmFsQ2FwYWJpbGl0eS5BRE1JTklTVFJBVEVfU0VSVkVSLCB0cnVlKQotICAgICAgICAuYWRkKHJ1bGUoY29uZmlnLCBhZG1pbikpOworICAgICAgZ3JhbnQoY29uZmlnLCBjYXAsIEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUiwgYWRtaW4pOworICAgICAgZ3JhbnQoY29uZmlnLCBhbGwsIFBlcm1pc3Npb24uUkVBRCwgYWRtaW4sIGFub255bW91cyk7CiAKLSAgICAgIFBlcm1pc3Npb25SdWxlIHJldmlldyA9IHJ1bGUoY29uZmlnLCByZWdpc3RlcmVkKTsKLSAgICAgIHJldmlldy5zZXRSYW5nZSgtMSwgMSk7Ci0gICAgICBoZWFkcy5nZXRQZXJtaXNzaW9uKFBlcm1pc3Npb24uTEFCRUwgKyAiQ29kZS1SZXZpZXciLCB0cnVlKS5hZGQocmV2aWV3KTsKKyAgICAgIExhYmVsVHlwZSBjciA9IGluaXRDb2RlUmV2aWV3TGFiZWwoY29uZmlnKTsKKyAgICAgIGdyYW50KGNvbmZpZywgaGVhZHMsIGNyLCAtMSwgMSwgcmVnaXN0ZXJlZCk7CisgICAgICBncmFudChjb25maWcsIGhlYWRzLCBjciwgLTIsIDIsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBoZWFkcywgUGVybWlzc2lvbi5DUkVBVEUsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCBoZWFkcywgUGVybWlzc2lvbi5QVVNILCBhZG1pbiwgb3duZXJzKTsKKyAgICAgIGdyYW50KGNvbmZpZywgaGVhZHMsIFBlcm1pc3Npb24uU1VCTUlULCBhZG1pbiwgb3duZXJzKTsKKyAgICAgIGdyYW50KGNvbmZpZywgaGVhZHMsIFBlcm1pc3Npb24uRk9SR0VfQVVUSE9SLCByZWdpc3RlcmVkKTsKKyAgICAgIGdyYW50KGNvbmZpZywgaGVhZHMsIFBlcm1pc3Npb24uRk9SR0VfQ09NTUlUVEVSLCBhZG1pbiwgb3duZXJzKTsKKyAgICAgIGdyYW50KGNvbmZpZywgaGVhZHMsIFBlcm1pc3Npb24uRURJVF9UT1BJQ19OQU1FLCB0cnVlLCBhZG1pbiwgb3duZXJzKTsKIAotICAgICAgYWxsLmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5SRUFELCB0cnVlKSAvLwotICAgICAgICAgIC5hZGQocnVsZShjb25maWcsIGFkbWluKSk7Ci0gICAgICBhbGwuZ2V0UGVybWlzc2lvbihQZXJtaXNzaW9uLlJFQUQsIHRydWUpIC8vCi0gICAgICAgICAgLmFkZChydWxlKGNvbmZpZywgYW5vbnltb3VzKSk7CisgICAgICBncmFudChjb25maWcsIHRhZ3MsIFBlcm1pc3Npb24uUFVTSF9UQUcsIGFkbWluLCBvd25lcnMpOworICAgICAgZ3JhbnQoY29uZmlnLCB0YWdzLCBQZXJtaXNzaW9uLlBVU0hfU0lHTkVEX1RBRywgYWRtaW4sIG93bmVycyk7CiAKLSAgICAgIGNvbmZpZy5nZXRBY2Nlc3NTZWN0aW9uKCJyZWZzL2Zvci8iICsgQWNjZXNzU2VjdGlvbi5BTEwsIHRydWUpIC8vCi0gICAgICAgICAgLmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5QVVNILCB0cnVlKSAvLwotICAgICAgICAgIC5hZGQocnVsZShjb25maWcsIHJlZ2lzdGVyZWQpKTsKLSAgICAgIGFsbC5nZXRQZXJtaXNzaW9uKFBlcm1pc3Npb24uRk9SR0VfQVVUSE9SLCB0cnVlKSAvLwotICAgICAgICAgIC5hZGQocnVsZShjb25maWcsIHJlZ2lzdGVyZWQpKTsKKyAgICAgIGdyYW50KGNvbmZpZywgbWFnaWMsIFBlcm1pc3Npb24uUFVTSCwgcmVnaXN0ZXJlZCk7CisgICAgICBncmFudChjb25maWcsIG1hZ2ljLCBQZXJtaXNzaW9uLlBVU0hfTUVSR0UsIHJlZ2lzdGVyZWQpOwogCi0gICAgICBQZXJtaXNzaW9uIG1ldGFSZWFkUGVybWlzc2lvbiA9IG1ldGEuZ2V0UGVybWlzc2lvbihQZXJtaXNzaW9uLlJFQUQsIHRydWUpOwotICAgICAgbWV0YVJlYWRQZXJtaXNzaW9uLnNldEV4Y2x1c2l2ZUdyb3VwKHRydWUpOwotICAgICAgbWV0YVJlYWRQZXJtaXNzaW9uLmFkZChydWxlKGNvbmZpZywgb3duZXJzKSk7CisgICAgICBtZXRhLmdldFBlcm1pc3Npb24oUGVybWlzc2lvbi5SRUFELCB0cnVlKS5zZXRFeGNsdXNpdmVHcm91cCh0cnVlKTsKKyAgICAgIGdyYW50KGNvbmZpZywgbWV0YSwgUGVybWlzc2lvbi5SRUFELCBhZG1pbiwgb3duZXJzKTsKKyAgICAgIGdyYW50KGNvbmZpZywgbWV0YSwgY3IsIC0yLCAyLCBhZG1pbiwgb3duZXJzKTsKKyAgICAgIGdyYW50KGNvbmZpZywgbWV0YSwgUGVybWlzc2lvbi5QVVNILCBhZG1pbiwgb3duZXJzKTsKKyAgICAgIGdyYW50KGNvbmZpZywgbWV0YSwgUGVybWlzc2lvbi5TVUJNSVQsIGFkbWluLCBvd25lcnMpOwogCiAgICAgICBtZC5zZXRNZXNzYWdlKCJJbml0aWFsaXplZCBHZXJyaXQgQ29kZSBSZXZpZXcgIiArIFZlcnNpb24uZ2V0VmVyc2lvbigpKTsKICAgICAgIGNvbmZpZy5jb21taXQobWQpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBnaXQuY2xvc2UoKTsKKyAgfQorCisgIHByaXZhdGUgUGVybWlzc2lvblJ1bGUgZ3JhbnQoUHJvamVjdENvbmZpZyBjb25maWcsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbiwKKyAgICAgIFN0cmluZyBwZXJtaXNzaW9uLCBBY2NvdW50R3JvdXAgZ3JvdXAxLCBBY2NvdW50R3JvdXAuLi4gZ3JvdXBMaXN0KSB7CisgICAgcmV0dXJuIGdyYW50KGNvbmZpZywgc2VjdGlvbiwgcGVybWlzc2lvbiwgZmFsc2UsIGdyb3VwMSwgZ3JvdXBMaXN0KTsKKyAgfQorCisgIHByaXZhdGUgUGVybWlzc2lvblJ1bGUgZ3JhbnQoUHJvamVjdENvbmZpZyBjb25maWcsIEFjY2Vzc1NlY3Rpb24gc2VjdGlvbiwKKyAgICAgIFN0cmluZyBwZXJtaXNzaW9uLCBib29sZWFuIGZvcmNlLCBBY2NvdW50R3JvdXAgZ3JvdXAxLAorICAgICAgQWNjb3VudEdyb3VwLi4uIGdyb3VwTGlzdCkgeworICAgIFBlcm1pc3Npb24gcCA9IHNlY3Rpb24uZ2V0UGVybWlzc2lvbihwZXJtaXNzaW9uLCB0cnVlKTsKKyAgICBQZXJtaXNzaW9uUnVsZSBydWxlID0gcnVsZShjb25maWcsIGdyb3VwMSk7CisgICAgcnVsZS5zZXRGb3JjZShmb3JjZSk7CisgICAgcC5hZGQocnVsZSk7CisgICAgZm9yIChBY2NvdW50R3JvdXAgZ3JvdXAgOiBncm91cExpc3QpIHsKKyAgICAgIHJ1bGUgPSBydWxlKGNvbmZpZywgZ3JvdXApOworICAgICAgcnVsZS5zZXRGb3JjZShmb3JjZSk7CisgICAgICBwLmFkZChydWxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJ1bGU7CisgIH0KKworICBwcml2YXRlIHZvaWQgZ3JhbnQoUHJvamVjdENvbmZpZyBjb25maWcsCisgICAgICBBY2Nlc3NTZWN0aW9uIHNlY3Rpb24sIExhYmVsVHlwZSB0eXBlLAorICAgICAgaW50IG1pbiwgaW50IG1heCwgQWNjb3VudEdyb3VwLi4uIGdyb3VwTGlzdCkgeworICAgIFN0cmluZyBuYW1lID0gUGVybWlzc2lvbi5MQUJFTCArIHR5cGUuZ2V0TmFtZSgpOworICAgIFBlcm1pc3Npb24gcCA9IHNlY3Rpb24uZ2V0UGVybWlzc2lvbihuYW1lLCB0cnVlKTsKKyAgICBmb3IgKEFjY291bnRHcm91cCBncm91cCA6IGdyb3VwTGlzdCkgeworICAgICAgUGVybWlzc2lvblJ1bGUgciA9IHJ1bGUoY29uZmlnLCBncm91cCk7CisgICAgICByLnNldFJhbmdlKG1pbiwgbWF4KTsKKyAgICAgIHAuYWRkKHIpOwogICAgIH0KICAgfQogCkBAIC0yNjcsNDMgKzI4OCwxNiBAQAogICAgIHJldHVybiBuZXcgUGVybWlzc2lvblJ1bGUoY29uZmlnLnJlc29sdmUoZ3JvdXApKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBpbml0VmVyaWZpZWRDYXRlZ29yeShmaW5hbCBSZXZpZXdEYiBjKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdDsKLSAgICBmaW5hbCBBcnJheUxpc3Q8QXBwcm92YWxDYXRlZ29yeVZhbHVlPiB2YWxzOwotCi0gICAgY2F0ID0gbmV3IEFwcHJvdmFsQ2F0ZWdvcnkobmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoIlZSSUYiKSwgIlZlcmlmaWVkIik7Ci0gICAgY2F0LnNldFBvc2l0aW9uKChzaG9ydCkgMCk7Ci0gICAgY2F0LnNldEFiYnJldmlhdGVkTmFtZSgiViIpOwotICAgIHZhbHMgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4oKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDEsICJWZXJpZmllZCIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDAsICJObyBzY29yZSIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIC0xLCAiRmFpbHMiKSk7Ci0gICAgYy5hcHByb3ZhbENhdGVnb3JpZXMoKS5pbnNlcnQoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNhdCkpOwotICAgIGMuYXBwcm92YWxDYXRlZ29yeVZhbHVlcygpLmluc2VydCh2YWxzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0Q29kZVJldmlld0NhdGVnb3J5KGZpbmFsIFJldmlld0RiIGMsCi0gICAgICBmaW5hbCBTeXN0ZW1Db25maWcgc0NvbmZpZykgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeSBjYXQ7Ci0gICAgZmluYWwgQXJyYXlMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gdmFsczsKLQotICAgIGNhdCA9IG5ldyBBcHByb3ZhbENhdGVnb3J5KG5ldyBBcHByb3ZhbENhdGVnb3J5LklkKCJDUlZXIiksICJDb2RlIFJldmlldyIpOwotICAgIGNhdC5zZXRQb3NpdGlvbigoc2hvcnQpIDEpOwotICAgIGNhdC5zZXRBYmJyZXZpYXRlZE5hbWUoIlIiKTsKLSAgICBjYXQuc2V0Q29weU1pblNjb3JlKHRydWUpOwotICAgIHZhbHMgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4oKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDIsICJMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZCIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDEsICJMb29rcyBnb29kIHRvIG1lLCBidXQgc29tZW9uZSBlbHNlIG11c3QgYXBwcm92ZSIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDAsICJObyBzY29yZSIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIC0xLCAiSSB3b3VsZCBwcmVmZXIgdGhhdCB5b3UgZGlkbid0IHN1Ym1pdCB0aGlzIikpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgLTIsICJEbyBub3Qgc3VibWl0IikpOwotICAgIGMuYXBwcm92YWxDYXRlZ29yaWVzKCkuaW5zZXJ0KENvbGxlY3Rpb25zLnNpbmdsZXRvbihjYXQpKTsKLSAgICBjLmFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZXMoKS5pbnNlcnQodmFscyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBBcHByb3ZhbENhdGVnb3J5VmFsdWUgdmFsdWUoZmluYWwgQXBwcm92YWxDYXRlZ29yeSBjYXQsCi0gICAgICBmaW5hbCBpbnQgdmFsdWUsIGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIG5ldyBBcHByb3ZhbENhdGVnb3J5VmFsdWUobmV3IEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZChjYXQuZ2V0SWQoKSwKLSAgICAgICAgKHNob3J0KSB2YWx1ZSksIG5hbWUpOworICBwdWJsaWMgc3RhdGljIExhYmVsVHlwZSBpbml0Q29kZVJldmlld0xhYmVsKFByb2plY3RDb25maWcgYykgeworICAgIExhYmVsVHlwZSB0eXBlID0gbmV3IExhYmVsVHlwZSgiQ29kZS1SZXZpZXciLCBJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICBuZXcgTGFiZWxWYWx1ZSgoc2hvcnQpIDIsICJMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZCIpLAorICAgICAgICBuZXcgTGFiZWxWYWx1ZSgoc2hvcnQpIDEsICJMb29rcyBnb29kIHRvIG1lLCBidXQgc29tZW9uZSBlbHNlIG11c3QgYXBwcm92ZSIpLAorICAgICAgICBuZXcgTGFiZWxWYWx1ZSgoc2hvcnQpIDAsICJObyBzY29yZSIpLAorICAgICAgICBuZXcgTGFiZWxWYWx1ZSgoc2hvcnQpIC0xLCAiSSB3b3VsZCBwcmVmZXIgdGhhdCB5b3UgZGlkbid0IHN1Ym1pdCB0aGlzIiksCisgICAgICAgIG5ldyBMYWJlbFZhbHVlKChzaG9ydCkgLTIsICJEbyBub3Qgc3VibWl0IikpKTsKKyAgICB0eXBlLnNldEFiYnJldmlhdGlvbigiQ1IiKTsKKyAgICB0eXBlLnNldENvcHlNaW5TY29yZSh0cnVlKTsKKyAgICBjLmdldExhYmVsU2VjdGlvbnMoKS5wdXQodHlwZS5nZXROYW1lKCksIHR5cGUpOworICAgIHJldHVybiB0eXBlOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFWZXJzaW9uLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFWZXJzaW9uLmphdmEKaW5kZXggZjEyN2EyMS4uNGRlMzg4OCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hVmVyc2lvbi5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVZlcnNpb24uamF2YQpAQCAtMzIsNyArMzIsNyBAQAogLyoqIEEgdmVyc2lvbiBvZiB0aGUgZGF0YWJhc2Ugc2NoZW1hLiAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNjaGVtYVZlcnNpb24gewogICAvKiogVGhlIGN1cnJlbnQgc2NoZW1hIHZlcnNpb24uICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8U2NoZW1hXzczPiBDID0gU2NoZW1hXzczLmNsYXNzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFNjaGVtYV83Nz4gQyA9IFNjaGVtYV83Ny5jbGFzczsKIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZSBleHRlbmRzIEFic3RyYWN0TW9kdWxlIHsKICAgICBAT3ZlcnJpZGUKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICB0aGlzLnZlcnNpb25OYnIgPSBndWVzc1ZlcnNpb24oZ2V0Q2xhc3MoKSk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBpbnQgZ3Vlc3NWZXJzaW9uKENsYXNzPD8+IGMpIHsKKyAgcHVibGljIHN0YXRpYyBpbnQgZ3Vlc3NWZXJzaW9uKENsYXNzPD8+IGMpIHsKICAgICBTdHJpbmcgbiA9IGMuZ2V0TmFtZSgpOwogICAgIG4gPSBuLnN1YnN0cmluZyhuLmxhc3RJbmRleE9mKCdfJykgKyAxKTsKICAgICB3aGlsZSAobi5zdGFydHNXaXRoKCIwIikpCkBAIC04Myw2ICs4MywxMSBAQAogICAgICAgdGhyb3dzIE9ybUV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKICAgICBmaW5hbCBKZGJjU2NoZW1hIHMgPSAoSmRiY1NjaGVtYSkgZGI7CiAKKyAgICBpZiAoY3Vyci52ZXJzaW9uTmJyID4gdmVyc2lvbk5icikgeworICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbigiQ2Fubm90IGRvd25ncmFkZSBkYXRhYmFzZSBzY2hlbWEgZnJvbSB2ZXJzaW9uICIgKyBjdXJyLnZlcnNpb25OYnIKKyAgICAgICAgICArICIgdG8gIiArIHZlcnNpb25OYnIgKyAiLiIpOworICAgIH0KKwogICAgIHByaW9yLmdldCgpLmNoZWNrKHVpLCBjdXJyLCBkYiwgZmFsc2UpOwogCiAgICAgdWkubWVzc2FnZSgiVXBncmFkaW5nIGRhdGFiYXNlIHNjaGVtYSBmcm9tIHZlcnNpb24gIiArIGN1cnIudmVyc2lvbk5icgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hVmVyc2lvbkNoZWNrLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFWZXJzaW9uQ2hlY2suamF2YQppbmRleCAxMzNiODU2Li4yZTEyZjVjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFWZXJzaW9uQ2hlY2suamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFWZXJzaW9uQ2hlY2suamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmxpZmVjeWNsZS5MaWZlY3ljbGVNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkN1cnJlbnRTY2hlbWFWZXJzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoczsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTM3LDE0ICszOCwxNyBAQAogICB9CiAKICAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWE7CisgIHByaXZhdGUgZmluYWwgU2l0ZVBhdGhzIHNpdGU7CiAKICAgQEN1cnJlbnQKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTY2hlbWFWZXJzaW9uPiB2ZXJzaW9uOwogCiAgIEBJbmplY3QKICAgcHVibGljIFNjaGVtYVZlcnNpb25DaGVjayhTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWFGYWN0b3J5LAorICAgICAgZmluYWwgU2l0ZVBhdGhzIHNpdGUsCiAgICAgICBAQ3VycmVudCBQcm92aWRlcjxTY2hlbWFWZXJzaW9uPiB2ZXJzaW9uKSB7CiAgICAgdGhpcy5zY2hlbWEgPSBzY2hlbWFGYWN0b3J5OworICAgIHRoaXMuc2l0ZSA9IHNpdGU7CiAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKICAgfQogCkBAIC01MiwxNyArNTYsMjUgQEAKICAgICB0cnkgewogICAgICAgZmluYWwgUmV2aWV3RGIgZGIgPSBzY2hlbWEub3BlbigpOwogICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ3VycmVudFNjaGVtYVZlcnNpb24gc1ZlciA9IGdldFNjaGVtYVZlcnNpb24oZGIpOwotICAgICAgICBmaW5hbCBpbnQgZVZlciA9IHZlcnNpb24uZ2V0KCkuZ2V0VmVyc2lvbk5icigpOworICAgICAgICBmaW5hbCBDdXJyZW50U2NoZW1hVmVyc2lvbiBjdXJyZW50VmVyID0gZ2V0U2NoZW1hVmVyc2lvbihkYik7CisgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFZlciA9IHZlcnNpb24uZ2V0KCkuZ2V0VmVyc2lvbk5icigpOwogCi0gICAgICAgIGlmIChzVmVyID09IG51bGwpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRWZXIgPT0gbnVsbCkgewogICAgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIlNjaGVtYSBub3QgeWV0IGluaXRpYWxpemVkLiIKLSAgICAgICAgICAgICAgKyAiICBSdW4gaW5pdCB0byBpbml0aWFsaXplIHRoZSBzY2hlbWEuIik7CisgICAgICAgICAgICAgICsgIiAgUnVuIGluaXQgdG8gaW5pdGlhbGl6ZSB0aGUgc2NoZW1hOlxuIgorICAgICAgICAgICAgICArICIkIGphdmEgLWphciBnZXJyaXQud2FyIGluaXQgLWQgIgorICAgICAgICAgICAgICArIHNpdGUuc2l0ZV9wYXRoLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoc1Zlci52ZXJzaW9uTmJyICE9IGVWZXIpIHsKKyAgICAgICAgaWYgKGN1cnJlbnRWZXIudmVyc2lvbk5iciA8IGV4cGVjdGVkVmVyKSB7CiAgICAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgc2NoZW1hIHZlcnNpb24gIgotICAgICAgICAgICAgICArIHNWZXIudmVyc2lvbk5iciArICI7IGV4cGVjdGVkIHNjaGVtYSB2ZXJzaW9uICIgKyBlVmVyCi0gICAgICAgICAgICAgICsgIi4gIFJ1biBpbml0IHRvIHVwZ3JhZGUuIik7CisgICAgICAgICAgICAgICsgY3VycmVudFZlci52ZXJzaW9uTmJyICsgIjsgZXhwZWN0ZWQgc2NoZW1hIHZlcnNpb24gIiArIGV4cGVjdGVkVmVyCisgICAgICAgICAgICAgICsgIi4gIFJ1biBpbml0IHRvIHVwZ3JhZGU6XG4iCisgICAgICAgICAgICAgICsgIiQgamF2YSAtamFyICIgKyBzaXRlLmdlcnJpdF93YXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGluaXQgLWQgIgorICAgICAgICAgICAgICArIHNpdGUuc2l0ZV9wYXRoLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VmVyLnZlcnNpb25OYnIgPiBleHBlY3RlZFZlcikgeworICAgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIHNjaGVtYSB2ZXJzaW9uICIKKyAgICAgICAgICAgICAgKyBjdXJyZW50VmVyLnZlcnNpb25OYnIgKyAiOyBleHBlY3RlZCBzY2hlbWEgdmVyc2lvbiAiICsgZXhwZWN0ZWRWZXIKKyAgICAgICAgICAgICAgKyAiLiBEb3duZ3JhZGUgaXMgbm90IHN1cHBvcnRlZC4iKTsKICAgICAgICAgfQogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgZGIuY2xvc2UoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV81My5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzUzLmphdmEKaW5kZXggODIwN2MzMS4uZTRhYWUyYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzUzLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzUzLmphdmEKQEAgLTI4LDExICsyOCwxMyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQWNjZXNzU2VjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5Hcm91cFJlZmVyZW5jZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuUGVybWlzc2lvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uUnVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsLkxhYmVsSWQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5TeXN0ZW1Db25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKQEAgLTQxLDYgKzQzLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWV0YURhdGFVcGRhdGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Qcm9qZWN0Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuU2NoZW1hXzc3LkxlZ2FjeUxhYmVsVHlwZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uamRiYy5KZGJjU2NoZW1hOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtNjcsNyArNzAsNyBAQAogCiAgIHByaXZhdGUgU3lzdGVtQ29uZmlnIHN5c3RlbUNvbmZpZzsKICAgcHJpdmF0ZSBNYXA8QWNjb3VudEdyb3VwLklkLCBHcm91cFJlZmVyZW5jZT4gZ3JvdXBNYXA7Ci0gIHByaXZhdGUgTWFwPEFwcHJvdmFsQ2F0ZWdvcnkuSWQsIEFwcHJvdmFsQ2F0ZWdvcnk+IGNhdGVnb3J5TWFwOworICBwcml2YXRlIExlZ2FjeUxhYmVsVHlwZXMgbGFiZWxUeXBlczsKICAgcHJpdmF0ZSBHcm91cFJlZmVyZW5jZSBwcm9qZWN0T3duZXJzOwogCiAgIHByaXZhdGUgTWFwPFByb2plY3QuTmFtZUtleSwgUHJvamVjdC5OYW1lS2V5PiBwYXJlbnRzQnlQcm9qZWN0OwpAQCAtOTIsNyArOTUsNyBAQAogICBwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGF0YShSZXZpZXdEYiBkYiwgVXBkYXRlVUkgdWkpIHRocm93cyBPcm1FeGNlcHRpb24sCiAgICAgICBTUUxFeGNlcHRpb24gewogICAgIHN5c3RlbUNvbmZpZyA9IGRiLnN5c3RlbUNvbmZpZygpLmdldChuZXcgU3lzdGVtQ29uZmlnLktleSgpKTsKLSAgICBjYXRlZ29yeU1hcCA9IGRiLmFwcHJvdmFsQ2F0ZWdvcmllcygpLnRvTWFwKGRiLmFwcHJvdmFsQ2F0ZWdvcmllcygpLmFsbCgpKTsKKyAgICBsYWJlbFR5cGVzID0gU2NoZW1hXzc3LmdldExlZ2FjeVR5cGVzKGRiKTsKIAogICAgIGFzc2lnbkdyb3VwVVVJRHMoZGIpOwogICAgIHJlYWRPbGRSZWZSaWdodHMoZGIpOwpAQCAtMTAzLDEzICsxMDYsMTcgQEAKICAgfQogCiAgIHByaXZhdGUgdm9pZCBkZWxldGVBY3Rpb25DYXRlZ29yaWVzKFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBMaXN0PEFwcHJvdmFsQ2F0ZWdvcnk+IGRlbGV0ZSA9IG5ldyBBcnJheUxpc3Q8QXBwcm92YWxDYXRlZ29yeT4oKTsKLSAgICBmb3IgKEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnkgOiBjYXRlZ29yeU1hcC52YWx1ZXMoKSkgewotICAgICAgaWYgKGNhdGVnb3J5LmdldFBvc2l0aW9uKCkgPCAwKSB7Ci0gICAgICAgIGRlbGV0ZS5hZGQoY2F0ZWdvcnkpOworICAgIHRyeSB7CisgICAgICBTdGF0ZW1lbnQgc3RtdCA9ICgoSmRiY1NjaGVtYSkgZGIpLmdldENvbm5lY3Rpb24oKS5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICAgIHRyeSB7CisgICAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgKKyAgICAgICAgICAgICJERUxFVEUgRlJPTSBhcHByb3ZhbF9jYXRlZ29yaWVzIFdIRVJFIHBvc2l0aW9uIDwgMCIpOworICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgc3RtdC5jbG9zZSgpOwogICAgICAgfQorICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGUpOwogICAgIH0KLSAgICBkYi5hcHByb3ZhbENhdGVnb3JpZXMoKS5kZWxldGUoZGVsZXRlKTsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBhc3NpZ25Hcm91cFVVSURzKFJldmlld0RiIGRiKSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKQEAgLTIwMCw4ICsyMDcsNyBAQAogICBwcml2YXRlIHZvaWQgbG9hZFByb2plY3QoUmVzdWx0U2V0IHJzLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBTUUxFeGNlcHRpb24sCiAgICAgICBPcm1FeGNlcHRpb24gewogICAgIHByb2plY3Quc2V0RGVzY3JpcHRpb24ocnMuZ2V0U3RyaW5nKCJkZXNjcmlwdGlvbiIpKTsKLSAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygiWSIuZXF1YWxzKHJzCi0gICAgICAgIC5nZXRTdHJpbmcoInVzZV9jb250cmlidXRvcl9hZ3JlZW1lbnRzIikpKTsKKyAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhhc0luaGVyaXRhYmxlQm9vbGVhbihycywgInVzZV9jb250cmlidXRvcl9hZ3JlZW1lbnRzIikpOwogCiAgICAgc3dpdGNoIChycy5nZXRTdHJpbmcoInN1Ym1pdF90eXBlIikuY2hhckF0KDApKSB7CiAgICAgICBjYXNlICdGJzoKQEAgLTIyMSwxMiArMjI3LDE5IEBACiAgICAgICAgICAgICArIHJzLmdldFN0cmluZygic3VibWl0X3R5cGUiKSArICIgb24gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkpOwogICAgIH0KIAotICAgIHByb2plY3Quc2V0VXNlU2lnbmVkT2ZmQnkoIlkiLmVxdWFscyhycy5nZXRTdHJpbmcoInVzZV9zaWduZWRfb2ZmX2J5IikpKTsKLSAgICBwcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRCgiWSIuZXF1YWxzKHJzLmdldFN0cmluZygicmVxdWlyZV9jaGFuZ2VfaWQiKSkpOwotICAgIHByb2plY3Quc2V0VXNlQ29udGVudE1lcmdlKCJZIi5lcXVhbHMocnMuZ2V0U3RyaW5nKCJ1c2VfY29udGVudF9tZXJnZSIpKSk7CisgICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeShhc0luaGVyaXRhYmxlQm9vbGVhbihycywgInVzZV9zaWduZWRfb2ZmX2J5IikpOworICAgIHByb2plY3Quc2V0UmVxdWlyZUNoYW5nZUlEKGFzSW5oZXJpdGFibGVCb29sZWFuKHJzLCAicmVxdWlyZV9jaGFuZ2VfaWQiKSk7CisgICAgcHJvamVjdC5zZXRVc2VDb250ZW50TWVyZ2UoYXNJbmhlcml0YWJsZUJvb2xlYW4ocnMsICJ1c2VfY29udGVudF9tZXJnZSIpKTsKICAgICBwcm9qZWN0LnNldFBhcmVudE5hbWUocnMuZ2V0U3RyaW5nKCJwYXJlbnRfbmFtZSIpKTsKICAgfQogCisgIHByaXZhdGUgc3RhdGljIEluaGVyaXRhYmxlQm9vbGVhbiBhc0luaGVyaXRhYmxlQm9vbGVhbihSZXN1bHRTZXQgcnMsIFN0cmluZyBjb2wpCisgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICByZXR1cm4gIlkiLmVxdWFscyhycy5nZXRTdHJpbmcoY29sKSkKKyAgICAgICAgPyBQcm9qZWN0LkluaGVyaXRhYmxlQm9vbGVhbi5UUlVFCisgICAgICAgIDogUHJvamVjdC5Jbmhlcml0YWJsZUJvb2xlYW4uSU5IRVJJVDsKKyAgfQorCiAgIHByaXZhdGUgdm9pZCByZWFkT2xkUmVmUmlnaHRzKFJldmlld0RiIGRiKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKICAgICByaWdodHNCeVByb2plY3QgPSBuZXcgSGFzaE1hcDxQcm9qZWN0Lk5hbWVLZXksIExpc3Q8T2xkUmVmUmlnaHQ+PigpOwogCkBAIC0zNTgsOCArMzcxLDcgQEAKIAogICAgICAgICBpZiAoMyA8PSBvbGQubWF4X3ZhbHVlKSB7CiAgICAgICAgICAgYWRkKHNlY3Rpb24sIEZPUkdFX1NFUlZFUiwgb2xkLmV4Y2x1c2l2ZSwgcnVsZShncm91cCkpOwotICAgICAgICB9IGVsc2UgaWYgKDMgPD0gaW5oZXJpdGVkTWF4KGNvbmZpZywgb2xkKSkgewotICAgICAgICAgIGFkZChzZWN0aW9uLCBGT1JHRV9TRVJWRVIsIG9sZC5leGNsdXNpdmUsIGRlbnkoZ3JvdXApKTsKKyAgICAgICAgfSBlbHNlIGlmICgzIDw9IGluaGVyaXRlZE1heChjb25maWcsIG9sZCkpIHsgYWRkKHNlY3Rpb24sIEZPUkdFX1NFUlZFUiwgb2xkLmV4Y2x1c2l2ZSwgZGVueShncm91cCkpOwogICAgICAgICB9CiAKICAgICAgIH0gZWxzZSB7CkBAIC0zNjgsNyArMzgwLDkgQEAKICAgICAgICAgaWYgKG9sZC5taW5fdmFsdWUgPT0gMCAmJiBvbGQubWF4X3ZhbHVlID09IDApIHsKICAgICAgICAgICBydWxlLnNldERlbnkoKTsKICAgICAgICAgfQotICAgICAgICBhZGQoc2VjdGlvbiwgTEFCRUwgKyB2YXJOYW1lT2Yob2xkLmNhdGVnb3J5KSwgb2xkLmV4Y2x1c2l2ZSwgcnVsZSk7CisgICAgICAgIExhYmVsVHlwZSB0eXBlID0gbGFiZWxUeXBlcy5ieUxhYmVsKG5ldyBMYWJlbElkKG9sZC5jYXRlZ29yeSkpOworICAgICAgICBTdHJpbmcgbmFtZSA9IHR5cGUgIT0gbnVsbCA/IHR5cGUuZ2V0TmFtZSgpIDogb2xkLmNhdGVnb3J5OworICAgICAgICBhZGQoc2VjdGlvbiwgTEFCRUwgKyBuYW1lLCBvbGQuZXhjbHVzaXZlLCBydWxlKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTQzNiwxNCArNDUwLDYgQEAKICAgICByZXR1cm4gbWF4OwogICB9CiAKLSAgcHJpdmF0ZSBTdHJpbmcgdmFyTmFtZU9mKFN0cmluZyBpZCkgewotICAgIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjYXRlZ29yeU1hcC5nZXQobmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoaWQpKTsKLSAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgY2F0ZWdvcnkgPSBuZXcgQXBwcm92YWxDYXRlZ29yeShuZXcgQXBwcm92YWxDYXRlZ29yeS5JZChpZCksIGlkKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNhdGVnb3J5LmdldExhYmVsTmFtZSgpOwotICB9Ci0KICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGQoQWNjZXNzU2VjdGlvbiBzZWN0aW9uLCBTdHJpbmcgbmFtZSwKICAgICAgIGJvb2xlYW4gZXhjbHVzaXZlLCBQZXJtaXNzaW9uUnVsZSBydWxlKSB7CiAgICAgUGVybWlzc2lvbiBwID0gc2VjdGlvbi5nZXRQZXJtaXNzaW9uKG5hbWUsIHRydWUpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hXzU3LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNTcuamF2YQppbmRleCAzYTI4OGUyLi5iZjQ4OGUzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNTcuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNTcuamF2YQpAQCAtMzAsNiArMzAsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTG9jYWxEaXNrUmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uamRiYy5KZGJjU2NoZW1hOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwpAQCAtNDEsNiArNDIsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAogcHVibGljIGNsYXNzIFNjaGVtYV81NyBleHRlbmRzIFNjaGVtYVZlcnNpb24gewpAQCAtOTUsNiArOTgsMTEgQEAKIAogICAgICAgICAvLyBNb3ZlIHRoZSByZXBvc2l0b3J5LiouY3JlYXRlR3JvdXAgdG8gQ3JlYXRlIFByb2plY3QuCiAgICAgICAgIFN0cmluZ1tdIGNyZWF0ZUdyb3VwTGlzdCA9IGNmZy5nZXRTdHJpbmdMaXN0KCJyZXBvc2l0b3J5IiwgIioiLCAiY3JlYXRlR3JvdXAiKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBhY2NvdW50X2dyb3VwX2luY2x1ZGVzIHF1ZXJ5CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0bXQgPSAoKEpkYmNTY2hlbWEpIGRiKS5nZXRDb25uZWN0aW9uKCkuCisgICAgICAgICAgICBwcmVwYXJlU3RhdGVtZW50KCJTRUxFQ1QgKiBGUk9NIGFjY291bnRfZ3JvdXBfaW5jbHVkZXMgV0hFUkUgZ3JvdXBfaWQgPSA/Iik7CisKICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNyZWF0ZUdyb3VwTGlzdCkgewogICAgICAgICAgIEFjY291bnRHcm91cC5OYW1lS2V5IGtleSA9IG5ldyBBY2NvdW50R3JvdXAuTmFtZUtleShuYW1lKTsKICAgICAgICAgICBBY2NvdW50R3JvdXBOYW1lIGdyb3VwTmFtZSA9IGRiLmFjY291bnRHcm91cE5hbWVzKCkuZ2V0KGtleSk7CkBAIC0xMTcsOSArMTI1LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBBY2NvdW50R3JvdXAgYmF0Y2ggPSBkYi5hY2NvdW50R3JvdXBzKCkuZ2V0KHNjLmJhdGNoVXNlcnNHcm91cElkKTsKKyAgICAgICAgc3RtdC5zZXRJbnQoMSwgc2MuYmF0Y2hVc2Vyc0dyb3VwSWQuZ2V0KCkpOwogICAgICAgICBpZiAoYmF0Y2ggIT0gbnVsbAogICAgICAgICAgICAgJiYgZGIuYWNjb3VudEdyb3VwTWVtYmVycygpLmJ5R3JvdXAoc2MuYmF0Y2hVc2Vyc0dyb3VwSWQpLnRvTGlzdCgpLmlzRW1wdHkoKQotICAgICAgICAgICAgJiYgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzKCkuYnlHcm91cChzYy5iYXRjaFVzZXJzR3JvdXBJZCkudG9MaXN0KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAmJiAgc3RtdC5leGVjdXRlUXVlcnkoKS5maXJzdCgpICE9IGZhbHNlKSB7CiAgICAgICAgICAgLy8gSWYgdGhlIGJhdGNoIHVzZXIgZ3JvdXAgaXMgbm90IHVzZWQsIGRlbGV0ZSBpdC4KICAgICAgICAgICAvLwogICAgICAgICAgIGRiLmFjY291bnRHcm91cHMoKS5kZWxldGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGJhdGNoKSk7CkBAIC0xMzYsNiArMTQ1LDggQEAKIAogICAgICAgICBtZC5zZXRNZXNzYWdlKCJVcGdyYWRlIHRvIEdlcnJpdCBDb2RlIFJldmlldyBzY2hlbWEgNTdcbiIpOwogICAgICAgICBjb25maWcuY29tbWl0KG1kKTsKKyAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbiggIkNhbm5vdCByZWFkIGFjY291bnRfZ3JvdXBfaW5jbHVkZXMiLCBlcnIpOwogICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgZ2l0LmNsb3NlKCk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzQuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDEyZDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzQuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmpkYmMuSmRiY1NjaGVtYTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyogSGFuZGxlcyBjb3B5aW5nIGFsbCBlbnRyaWVzIGZyb20gQWNjb3VudEdyb3VwSW5jbHVkZXMoQXVkaXQpIHRvIHRoZSBuZXcgdGFibGVzICovCitwdWJsaWMgY2xhc3MgU2NoZW1hXzc0IGV4dGVuZHMgU2NoZW1hVmVyc2lvbiB7CisgIEBJbmplY3QKKyAgU2NoZW1hXzc0KFByb3ZpZGVyPFNjaGVtYV83Mz4gcHJpb3IpIHsKKyAgICBzdXBlcihwcmlvcik7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgbWlncmF0ZURhdGEoZmluYWwgUmV2aWV3RGIgZGIsIGZpbmFsIFVwZGF0ZVVJIHVpKQorICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgT3JtRXhjZXB0aW9uIHsKKyAgICAvLyBHcmFiIGFsbCB0aGUgZ3JvdXBzIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGNhY2hlIGF2YWlsYWJsZQorICAgIEhhc2hNYXA8QWNjb3VudEdyb3VwLklkLCBBY2NvdW50R3JvdXAuVVVJRD4gYWxsR3JvdXBzID0KKyAgICAgICAgbmV3IEhhc2hNYXA8QWNjb3VudEdyb3VwLklkLCBBY2NvdW50R3JvdXAuVVVJRD4oKTsKKyAgICBmb3IoIEFjY291bnRHcm91cCBhZyA6IGRiLmFjY291bnRHcm91cHMoKS5hbGwoKSApIHsKKyAgICAgIGFsbEdyb3Vwcy5wdXQoYWcuZ2V0SWQoKSwgYWcuZ2V0R3JvdXBVVUlEKCkpOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMKKyAgICBDb25uZWN0aW9uIGNvbm4gPSAoKEpkYmNTY2hlbWEpIGRiKS5nZXRDb25uZWN0aW9uKCk7CisgICAgQXJyYXlMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWQ+IG5ld0luY2x1ZGVzID0KKyAgICAgICAgbmV3IEFycmF5TGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkPigpOworICAgIEFycmF5TGlzdDxBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkQXVkaXQ+IG5ld0luY2x1ZGVBdWRpdHMgPQorICAgICAgICBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdD4oKTsKKworICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgZW50cmllcyBpbiBhY2NvdW50X2dyb3VwX2luY2x1ZGVzCisgICAgU3RhdGVtZW50IG9sZEdyb3VwSW5jbHVkZXNTdG10ID0gY29ubi5jcmVhdGVTdGF0ZW1lbnQoKTsKKyAgICBSZXN1bHRTZXQgb2xkR3JvdXBJbmNsdWRlcyA9IG9sZEdyb3VwSW5jbHVkZXNTdG10LgorICAgICAgICBleGVjdXRlUXVlcnkoIlNFTEVDVCAqIEZST00gYWNjb3VudF9ncm91cF9pbmNsdWRlcyIpOworICAgIHdoaWxlIChvbGRHcm91cEluY2x1ZGVzLm5leHQoKSkgeworICAgICAgQWNjb3VudEdyb3VwLklkIG9sZEdyb3VwSWQgPQorICAgICAgICAgIG5ldyBBY2NvdW50R3JvdXAuSWQob2xkR3JvdXBJbmNsdWRlcy5nZXRJbnQoImdyb3VwX2lkIikpOworICAgICAgQWNjb3VudEdyb3VwLklkIG9sZEluY2x1ZGVJZCA9CisgICAgICAgICAgbmV3IEFjY291bnRHcm91cC5JZChvbGRHcm91cEluY2x1ZGVzLmdldEludCgiaW5jbHVkZV9pZCIpKTsKKyAgICAgIEFjY291bnRHcm91cC5VVUlEIHV1aWRGcm9tSW5jbHVkZUlkID0gYWxsR3JvdXBzLmdldChvbGRJbmNsdWRlSWQpOworCisgICAgICAvLyBJZiB3ZSd2ZSBnb3QgYW4gaW5jbHVkZSwgYnV0IHRoZSBncm91cCBubyBsb25nZXIgZXhpc3RzLCBkb24ndCBib3RoZXIgY29udmVydGluZworICAgICAgaWYgKHV1aWRGcm9tSW5jbHVkZUlkID09IG51bGwpIHsKKyAgICAgICAgdWkubWVzc2FnZSgiU2tpcHBpbmcgZ3JvdXBfaWQgPSBcIiIgKyBvbGRJbmNsdWRlSWQuZ2V0KCkgKworICAgICAgICAgICAgIlwiLCBub3QgYSBjdXJyZW50IGdyb3VwIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBDcmVhdGUgdGhlIG5ldyBpbmNsdWRlIGVudHJ5CisgICAgICBBY2NvdW50R3JvdXBJbmNsdWRlQnlVdWlkIGRlc3RJbmNsdWRlRW50cnkgPSBuZXcgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZCgKKyAgICAgICAgICBuZXcgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZC5LZXkob2xkR3JvdXBJZCwgdXVpZEZyb21JbmNsdWRlSWQpKTsKKworICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYXVkaXRzIChmb3IgdGhpcyBncm91cCkKKyAgICAgIFByZXBhcmVkU3RhdGVtZW50IG9sZEF1ZGl0c1F1ZXJ5ID0gY29ubi5wcmVwYXJlU3RhdGVtZW50KAorICAgICAgICAgICJTRUxFQ1QgKiBGUk9NIGFjY291bnRfZ3JvdXBfaW5jbHVkZXNfYXVkaXQgV0hFUkUgZ3JvdXBfaWQ9PyBBTkQgaW5jbHVkZV9pZD0/Iik7CisgICAgICBvbGRBdWRpdHNRdWVyeS5zZXRJbnQoMSwgb2xkR3JvdXBJZC5nZXQoKSk7CisgICAgICBvbGRBdWRpdHNRdWVyeS5zZXRJbnQoMiwgb2xkSW5jbHVkZUlkLmdldCgpKTsKKyAgICAgIFJlc3VsdFNldCBvbGRHcm91cEluY2x1ZGVBdWRpdHMgPSBvbGRBdWRpdHNRdWVyeS5leGVjdXRlUXVlcnkoKTsKKyAgICAgIHdoaWxlIChvbGRHcm91cEluY2x1ZGVBdWRpdHMubmV4dCgpKSB7CisgICAgICAgIEFjY291bnQuSWQgYWRkZWRCeSA9IG5ldyBBY2NvdW50LklkKG9sZEdyb3VwSW5jbHVkZUF1ZGl0cy5nZXRJbnQoImFkZGVkX2J5IikpOworICAgICAgICBpbnQgcmVtb3ZlZEJ5ID0gb2xkR3JvdXBJbmNsdWRlQXVkaXRzLmdldEludCgicmVtb3ZlZF9ieSIpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IGF1ZGl0IGVudHJ5CisgICAgICAgIEFjY291bnRHcm91cEluY2x1ZGVCeVV1aWRBdWRpdCBkZXN0QXVkaXRFbnRyeSA9CisgICAgICAgICAgICBuZXcgQWNjb3VudEdyb3VwSW5jbHVkZUJ5VXVpZEF1ZGl0KGRlc3RJbmNsdWRlRW50cnksIGFkZGVkQnksCisgICAgICAgICAgICAgICAgb2xkR3JvdXBJbmNsdWRlQXVkaXRzLmdldFRpbWVzdGFtcCgiYWRkZWRfb24iKSk7CisKKyAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSAicmVtb3ZlZCBvbiIgZW50cnksIG5vdGUgdGhhdAorICAgICAgICBpZiAocmVtb3ZlZEJ5ID4gMCkgeworICAgICAgICAgIGRlc3RBdWRpdEVudHJ5LnJlbW92ZWQobmV3IEFjY291bnQuSWQocmVtb3ZlZEJ5KSwKKyAgICAgICAgICAgICAgb2xkR3JvdXBJbmNsdWRlQXVkaXRzLmdldFRpbWVzdGFtcCgicmVtb3ZlZF9vbiIpKTsKKyAgICAgICAgfQorICAgICAgICBuZXdJbmNsdWRlQXVkaXRzLmFkZChkZXN0QXVkaXRFbnRyeSk7CisgICAgICB9CisgICAgICBuZXdJbmNsdWRlcy5hZGQoZGVzdEluY2x1ZGVFbnRyeSk7CisgICAgICBvbGRBdWRpdHNRdWVyeS5jbG9zZSgpOworICAgICAgb2xkR3JvdXBJbmNsdWRlQXVkaXRzLmNsb3NlKCk7CisgICAgfQorICAgIG9sZEdyb3VwSW5jbHVkZXMuY2xvc2UoKTsKKyAgICBvbGRHcm91cEluY2x1ZGVzU3RtdC5jbG9zZSgpOworCisgICAgLy8gTm93IGluc2VydCBhbGwgb2YgdGhlIG5ldyBlbnRyaWVzIHRvIHRoZSBkYXRhYmFzZQorICAgIGRiLmFjY291bnRHcm91cEluY2x1ZGVzQnlVdWlkKCkuaW5zZXJ0KG5ld0luY2x1ZGVzKTsKKyAgICBkYi5hY2NvdW50R3JvdXBJbmNsdWRlc0J5VXVpZEF1ZGl0KCkuaW5zZXJ0KG5ld0luY2x1ZGVBdWRpdHMpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83NS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NDdmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzUuamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIFNjaGVtYV83NSBleHRlbmRzIFNjaGVtYVZlcnNpb24geworICBASW5qZWN0CisgIFNjaGVtYV83NShQcm92aWRlcjxTY2hlbWFfNzQ+IHByaW9yKSB7CisgICAgc3VwZXIocHJpb3IpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzYuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83Ni5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMGI1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzYuamF2YQpAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIFNjaGVtYV83NiBleHRlbmRzIFNjaGVtYVZlcnNpb24geworICBASW5qZWN0CisgIFNjaGVtYV83NihQcm92aWRlcjxTY2hlbWFfNzU+IHByaW9yKSB7CisgICAgc3VwZXIocHJpb3IpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzcuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYV83Ny5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MmJjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFfNzcuamF2YQpAQCAtMCwwICsxLDI2NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWE7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsLkxhYmVsSWQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXh0ZW5zaW9ucy5ldmVudHMuR2l0UmVmZXJlbmNlVXBkYXRlZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuTWV0YURhdGFVcGRhdGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Qcm9qZWN0Q29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmpkYmMuSmRiY1NjaGVtYTsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zY2hlbWEuc3FsLkRpYWxlY3RIMjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zY2hlbWEuc3FsLkRpYWxlY3RNeVNRTDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zY2hlbWEuc3FsLkRpYWxlY3RQb3N0Z3JlU1FMOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNjaGVtYS5zcWwuU3FsRGlhbGVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuT3JtRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc3FsLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBTY2hlbWFfNzcgZXh0ZW5kcyBTY2hlbWFWZXJzaW9uIHsKKyAgcHJpdmF0ZSBmaW5hbCBHaXRSZXBvc2l0b3J5TWFuYWdlciBtZ3I7CisgIHByaXZhdGUgZmluYWwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzOworICBwcml2YXRlIGZpbmFsIFBlcnNvbklkZW50IHNlcnZlclVzZXI7CisKKyAgQEluamVjdAorICBTY2hlbWFfNzcoUHJvdmlkZXI8U2NoZW1hXzc2PiBwcmlvciwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzLAorICAgICAgR2l0UmVwb3NpdG9yeU1hbmFnZXIgbWdyLCBAR2Vycml0UGVyc29uSWRlbnQgUGVyc29uSWRlbnQgc2VydmVyVXNlcikgeworICAgIHN1cGVyKHByaW9yKTsKKyAgICB0aGlzLmFsbFByb2plY3RzID0gYWxsUHJvamVjdHM7CisgICAgdGhpcy5tZ3IgPSBtZ3I7CisgICAgdGhpcy5zZXJ2ZXJVc2VyID0gc2VydmVyVXNlcjsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBtaWdyYXRlRGF0YShSZXZpZXdEYiBkYiwgVXBkYXRlVUkgdWkpIHRocm93cyBPcm1FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICBMZWdhY3lMYWJlbFR5cGVzIGxhYmVsVHlwZXMgPSBnZXRMZWdhY3lUeXBlcyhkYik7CisgICAgICBTcWxEaWFsZWN0IGRpYWxlY3QgPSAoKEpkYmNTY2hlbWEpIGRiKS5nZXREaWFsZWN0KCk7CisgICAgICBpZiAoZGlhbGVjdCBpbnN0YW5jZW9mIERpYWxlY3RIMikgeworICAgICAgICBhbHRlclRhYmxlKGRiLCAiQUxURVIgVEFCTEUgJXMgQUxURVIgQ09MVU1OICVzIHZhcmNoYXIoMjU1KSIpOworICAgICAgfSBlbHNlIGlmIChkaWFsZWN0IGluc3RhbmNlb2YgRGlhbGVjdFBvc3RncmVTUUwpIHsKKyAgICAgICAgYWx0ZXJUYWJsZShkYiwgIkFMVEVSIFRBQkxFICVzIEFMVEVSICVzIFRZUEUgdmFyY2hhcigyNTUpIik7CisgICAgICB9IGVsc2UgaWYgKGRpYWxlY3QgaW5zdGFuY2VvZiBEaWFsZWN0TXlTUUwpIHsKKyAgICAgICAgYWx0ZXJUYWJsZShkYiwgIkFMVEVSIFRBQkxFICVzIE1PRElGWSAlcyB2YXJjaGFyKDI1NSkgQklOQVJZIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBhbHRlclRhYmxlKGRiLCAiQUxURVIgVEFCTEUgJXMgTU9ESUZZICVzIHZhcmNoYXIoMjU1KSIpOworICAgICAgfQorICAgICAgbWlncmF0ZVBhdGNoU2V0QXBwcm92YWxzKGRiLCBsYWJlbFR5cGVzKTsKKyAgICAgIG1pZ3JhdGVMYWJlbHNUb0FsbFByb2plY3RzKGRiLCBsYWJlbFR5cGVzKTsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbihlKTsKKyAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGUpOworICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IE9ybUV4Y2VwdGlvbihlKTsKKyAgICB9CisgICAgdWkubWVzc2FnZSgKKyAgICAgICAgIk1pZ3JhdGVkIGxhYmVsIHR5cGVzIGZyb20gZGF0YWJhc2UgdG8gQWxsLVByb2plY3RzIHByb2plY3QuY29uZmlnIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgYWx0ZXJUYWJsZShSZXZpZXdEYiBkYiwgU3RyaW5nIHNxbEZvcm1hdCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgU3RhdGVtZW50IHN0bXQgPSAoKEpkYmNTY2hlbWEpIGRiKS5nZXRDb25uZWN0aW9uKCkuY3JlYXRlU3RhdGVtZW50KCk7CisgICAgdHJ5IHsKKyAgICAgIHN0bXQuZXhlY3V0ZVVwZGF0ZSgKKyAgICAgICAgICBTdHJpbmcuZm9ybWF0KHNxbEZvcm1hdCwgInBhdGNoX3NldF9hcHByb3ZhbHMiLCAiY2F0ZWdvcnlfaWQiKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHN0bXQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgbWlncmF0ZUxhYmVsc1RvQWxsUHJvamVjdHMoUmV2aWV3RGIgZGIsCisgICAgICBMZWdhY3lMYWJlbFR5cGVzIGxhYmVsVHlwZXMpIHRocm93cyBTUUxFeGNlcHRpb24sCisgICAgICBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKyAgICBSZXBvc2l0b3J5IGdpdCA9IG1nci5vcGVuUmVwb3NpdG9yeShhbGxQcm9qZWN0cyk7CisKKyAgICB0cnkgeworICAgICAgTWV0YURhdGFVcGRhdGUgbWQgPQorICAgICAgICAgIG5ldyBNZXRhRGF0YVVwZGF0ZShHaXRSZWZlcmVuY2VVcGRhdGVkLkRJU0FCTEVELCBhbGxQcm9qZWN0cywgZ2l0KTsKKyAgICAgIG1kLmdldENvbW1pdEJ1aWxkZXIoKS5zZXRBdXRob3Ioc2VydmVyVXNlcik7CisgICAgICBtZC5nZXRDb21taXRCdWlsZGVyKCkuc2V0Q29tbWl0dGVyKHNlcnZlclVzZXIpOworCisgICAgICBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IFByb2plY3RDb25maWcucmVhZChtZCk7CisgICAgICBNYXA8U3RyaW5nLCBMYWJlbFR5cGU+IGNvbmZpZ1R5cGVzID0gY29uZmlnLmdldExhYmVsU2VjdGlvbnMoKTsKKyAgICAgIExpc3Q8TGFiZWxUeXBlPiBuZXdUeXBlcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgZm9yIChMZWdhY3lMYWJlbFR5cGUgdHlwZSA6IGxhYmVsVHlwZXMuZ2V0TGVnYWN5TGFiZWxUeXBlcygpKSB7CisgICAgICAgIGlmICghY29uZmlnVHlwZXMuY29udGFpbnNLZXkodHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgbmV3VHlwZXMuYWRkKHR5cGUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBuZXdUeXBlcy5hZGRBbGwoY29uZmlnVHlwZXMudmFsdWVzKCkpOworICAgICAgY29uZmlnVHlwZXMuY2xlYXIoKTsKKyAgICAgIGZvciAoTGFiZWxUeXBlIHR5cGUgOiBuZXdUeXBlcykgeworICAgICAgICBjb25maWdUeXBlcy5wdXQodHlwZS5nZXROYW1lKCksIHR5cGUpOworICAgICAgfQorICAgICAgbWQuc2V0TWVzc2FnZSgiVXBncmFkZSB0byBHZXJyaXQgQ29kZSBSZXZpZXcgc2NoZW1hIDc3XG4iKTsKKyAgICAgIGNvbmZpZy5jb21taXQobWQpOworICAgIH0gZmluYWxseSB7CisgICAgICBnaXQuY2xvc2UoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgbWlncmF0ZVBhdGNoU2V0QXBwcm92YWxzKFJldmlld0RiIGRiLAorICAgICAgTGVnYWN5TGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKKyAgICBQcmVwYXJlZFN0YXRlbWVudCBzdG10ID0gKChKZGJjU2NoZW1hKSBkYikuZ2V0Q29ubmVjdGlvbigpLnByZXBhcmVTdGF0ZW1lbnQoCisgICAgICAgICJVUERBVEUgcGF0Y2hfc2V0X2FwcHJvdmFscyBTRVQgY2F0ZWdvcnlfaWQgPSA/IFdIRVJFIGNhdGVnb3J5X2lkID0gPyIpOworICAgIHRyeSB7CisgICAgICBmb3IgKExlZ2FjeUxhYmVsVHlwZSB0eXBlIDogbGFiZWxUeXBlcy5nZXRMZWdhY3lMYWJlbFR5cGVzKCkpIHsKKyAgICAgICAgc3RtdC5zZXRTdHJpbmcoMSwgdHlwZS5nZXROYW1lKCkpOworICAgICAgICBzdG10LnNldFN0cmluZygyLCB0eXBlLmdldElkKCkpOworICAgICAgICBzdG10LmFkZEJhdGNoKCk7CisgICAgICB9CisgICAgICBzdG10LmV4ZWN1dGVCYXRjaCgpOworICAgIH0gZmluYWxseSB7CisgICAgICBzdG10LmNsb3NlKCk7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIExlZ2FjeUxhYmVsVHlwZSBleHRlbmRzIExhYmVsVHlwZSB7CisgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKyAgICBwcml2YXRlIExlZ2FjeUxhYmVsVHlwZShTdHJpbmcgbmFtZSwgTGlzdDxMYWJlbFZhbHVlPiB2YWx1ZXMpIHsKKyAgICAgIHN1cGVyKG5hbWUsIHZhbHVlcyk7CisgICAgfQorCisgICAgU3RyaW5nIGdldElkKCkgeworICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgIGNoZWNrQXJndW1lbnQoaWQubGVuZ3RoKCkgPD0gNCwgIkludmFsaWQgbGVnYWN5IGxhYmVsIElEOiBcIiVzXCIiLCBpZCk7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorICB9CisKKyAgc3RhdGljIGNsYXNzIExlZ2FjeUxhYmVsVHlwZXMgZXh0ZW5kcyBMYWJlbFR5cGVzIHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TGVnYWN5TGFiZWxUeXBlPiBsZWdhY3lUeXBlczsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGVnYWN5TGFiZWxUeXBlPiBieUlkOworCisgICAgcHJpdmF0ZSBMZWdhY3lMYWJlbFR5cGVzKExpc3Q8TGVnYWN5TGFiZWxUeXBlPiB0eXBlcykgeworICAgICAgc3VwZXIodHlwZXMpOworICAgICAgbGVnYWN5VHlwZXMgPSB0eXBlczsKKyAgICAgIGJ5SWQgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgICAgIGZvciAoTGVnYWN5TGFiZWxUeXBlIHR5cGUgOiB0eXBlcykgeworICAgICAgICBieUlkLnB1dCh0eXBlLmdldElkKCksIHR5cGUpOworICAgICAgfQorICAgIH0KKworICAgIExpc3Q8TGVnYWN5TGFiZWxUeXBlPiBnZXRMZWdhY3lMYWJlbFR5cGVzKCkgeworICAgICAgcmV0dXJuIGxlZ2FjeVR5cGVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMZWdhY3lMYWJlbFR5cGUgYnlMYWJlbChMYWJlbElkIGxhYmVsSWQpIHsKKyAgICAgIExlZ2FjeUxhYmVsVHlwZSB0ID0gYnlJZC5nZXQobGFiZWxJZC5nZXQoKSk7CisgICAgICByZXR1cm4gdCAhPSBudWxsID8gdCA6IChMZWdhY3lMYWJlbFR5cGUpIHN1cGVyLmJ5TGFiZWwobGFiZWxJZCk7CisgICAgfQorCisgICAgTGVnYWN5TGFiZWxUeXBlIGJ5SWQoTGFiZWxJZCBpZCkgeworICAgICAgcmV0dXJuIGJ5SWQuZ2V0KGlkLmdldCgpKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgTGVnYWN5TGFiZWxUeXBlcyBnZXRMZWdhY3lUeXBlcyhSZXZpZXdEYiBkYikgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CisgICAgTGlzdDxMZWdhY3lMYWJlbFR5cGU+IHR5cGVzID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KDIpOworICAgIFN0YXRlbWVudCBjYXRTdG10ID0gbnVsbDsKKyAgICBQcmVwYXJlZFN0YXRlbWVudCB2YWxTdG10ID0gbnVsbDsKKyAgICBSZXN1bHRTZXQgY2F0UnMgPSBudWxsOworICAgIHRyeSB7CisgICAgICBjYXRTdG10ID0gKChKZGJjU2NoZW1hKSBkYikuZ2V0Q29ubmVjdGlvbigpLmNyZWF0ZVN0YXRlbWVudCgpOworICAgICAgY2F0UnMgPSBjYXRTdG10LmV4ZWN1dGVRdWVyeSgKKyAgICAgICAgICAiU0VMRUNUIGNhdGVnb3J5X2lkLCBuYW1lLCBhYmJyZXZpYXRlZF9uYW1lLCBmdW5jdGlvbl9uYW1lLCAiCisgICAgICAgICAgKyAiIGNvcHlfbWluX3Njb3JlIgorICAgICAgICAgICsgIiBGUk9NIGFwcHJvdmFsX2NhdGVnb3JpZXMiCisgICAgICAgICAgKyAiIE9SREVSIEJZIHBvc2l0aW9uLCBuYW1lIik7CisgICAgICB2YWxTdG10ID0gKChKZGJjU2NoZW1hKSBkYikuZ2V0Q29ubmVjdGlvbigpLnByZXBhcmVTdGF0ZW1lbnQoCisgICAgICAgICAgIlNFTEVDVCB2YWx1ZSwgbmFtZSIKKyAgICAgICAgICArICIgRlJPTSBhcHByb3ZhbF9jYXRlZ29yeV92YWx1ZXMiCisgICAgICAgICAgKyAiIFdIRVJFIGNhdGVnb3J5X2lkID0gPyIpOworICAgICAgd2hpbGUgKGNhdFJzLm5leHQoKSkgeworICAgICAgICBTdHJpbmcgaWQgPSBjYXRScy5nZXRTdHJpbmcoImNhdGVnb3J5X2lkIik7CisgICAgICAgIHZhbFN0bXQuc2V0U3RyaW5nKDEsIGlkKTsKKyAgICAgICAgTGlzdDxMYWJlbFZhbHVlPiB2YWx1ZXMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoNSk7CisgICAgICAgIFJlc3VsdFNldCB2YWxScyA9IHZhbFN0bXQuZXhlY3V0ZVF1ZXJ5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgd2hpbGUgKHZhbFJzLm5leHQoKSkgeworICAgICAgICAgICAgdmFsdWVzLmFkZChuZXcgTGFiZWxWYWx1ZSgKKyAgICAgICAgICAgICAgICB2YWxScy5nZXRTaG9ydCgidmFsdWUiKSwgdmFsUnMuZ2V0U3RyaW5nKCJuYW1lIikpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgdmFsUnMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBMZWdhY3lMYWJlbFR5cGUgdHlwZSA9CisgICAgICAgICAgICBuZXcgTGVnYWN5TGFiZWxUeXBlKGdldExhYmVsTmFtZShjYXRScy5nZXRTdHJpbmcoIm5hbWUiKSksIHZhbHVlcyk7CisgICAgICAgIHR5cGUuc2V0SWQoaWQpOworICAgICAgICB0eXBlLnNldEFiYnJldmlhdGlvbihjYXRScy5nZXRTdHJpbmcoImFiYnJldmlhdGVkX25hbWUiKSk7CisgICAgICAgIHR5cGUuc2V0RnVuY3Rpb25OYW1lKGNhdFJzLmdldFN0cmluZygiZnVuY3Rpb25fbmFtZSIpKTsKKyAgICAgICAgdHlwZS5zZXRDb3B5TWluU2NvcmUoIlkiLmVxdWFscyhjYXRScy5nZXRTdHJpbmcoImNvcHlfbWluX3Njb3JlIikpKTsKKyAgICAgICAgdHlwZXMuYWRkKHR5cGUpOworICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICBpZiAodmFsU3RtdCAhPSBudWxsKSB7CisgICAgICAgIHZhbFN0bXQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICAgIGlmIChjYXRScyAhPSBudWxsKSB7CisgICAgICAgIGNhdFJzLmNsb3NlKCk7CisgICAgICB9CisgICAgICBpZiAoY2F0U3RtdCAhPSBudWxsKSB7CisgICAgICAgIGNhdFN0bXQuY2xvc2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ldyBMZWdhY3lMYWJlbFR5cGVzKHR5cGVzKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYWJlbE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CisgICAgICBjaGFyIGMgPSBuYW1lLmNoYXJBdChpKTsKKyAgICAgIGlmICgoJzAnIDw9IGMgJiYgYyA8PSAnOScpIC8vCisgICAgICAgICAgfHwgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSAvLworICAgICAgICAgIHx8ICgnQScgPD0gYyAmJiBjIDw9ICdaJykgLy8KKyAgICAgICAgICB8fCAoYyA9PSAnLScpKSB7CisgICAgICAgIHIuYXBwZW5kKGMpOworICAgICAgfSBlbHNlIGlmIChjID09ICcgJykgeworICAgICAgICByLmFwcGVuZCgnLScpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gci50b1N0cmluZygpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY3JpcHRSdW5uZXIuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjcmlwdFJ1bm5lci5qYXZhCmluZGV4IDhjZjJmMjYuLmI1YWVhZDggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjcmlwdFJ1bm5lci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjcmlwdFJ1bm5lci5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CkBAIC0zNCwxMCArMzMsMTUgQEAKICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gY29tbWFuZHM7CiAKLSAgU2NyaXB0UnVubmVyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgIHN0YXRpYyBmaW5hbCBTY3JpcHRSdW5uZXIgTk9PUCA9IG5ldyBTY3JpcHRSdW5uZXIobnVsbCwgbnVsbCkgeworICAgIHZvaWQgcnVuKGZpbmFsIFJldmlld0RiIGRiKSB7CisgICAgfTsKKyAgfTsKKworICBTY3JpcHRSdW5uZXIoZmluYWwgU3RyaW5nIHNjcmlwdE5hbWUsIGZpbmFsIElucHV0U3RyZWFtIHNjcmlwdCkgeworICAgIHRoaXMubmFtZSA9IHNjcmlwdE5hbWU7CiAgICAgdHJ5IHsKLSAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICB0aGlzLmNvbW1hbmRzID0gcGFyc2UobmFtZSk7CisgICAgICB0aGlzLmNvbW1hbmRzID0gc2NyaXB0ICE9IG51bGwgPyBwYXJzZShzY3JpcHQpIDogbnVsbDsKICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgcGFyc2UgIiArIG5hbWUsIGUpOwogICAgIH0KQEAgLTYzLDEyICs2Nyw3IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyc2UoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgSW5wdXRTdHJlYW0gaW4gPSBSZXZpZXdEYi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOwotICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJTUUwgc2NyaXB0ICIgKyBuYW1lICsgIiBub3QgZm91bmQiKTsKLSAgICB9Ci0KKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAiVVRGLTgiKSk7CiAgICAgdHJ5IHsKICAgICAgIFN0cmluZyBkZWxpbWl0ZXIgPSAiOyI7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Ob1NzaEluZm8uamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoSW5mby5qYXZhCmluZGV4IDUxOWI5MjIuLjZjZWVjMmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoSW5mby5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoSW5mby5qYXZhCkBAIC0xOSw3ICsxOSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1jbGFzcyBOb1NzaEluZm8gaW1wbGVtZW50cyBTc2hJbmZvIHsKK3B1YmxpYyBjbGFzcyBOb1NzaEluZm8gaW1wbGVtZW50cyBTc2hJbmZvIHsKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBMaXN0PEhvc3RLZXk+IGdldEhvc3RLZXlzKCkgewogICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoS2V5Q2FjaGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoS2V5Q2FjaGUuamF2YQppbmRleCA2YTA3Y2E3Li4wOTU3NTk0IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Ob1NzaEtleUNhY2hlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hLZXlDYWNoZS5qYXZhCkBAIC0xNiw4ICsxNiwyMSBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5JbnZhbGlkU3NoS2V5RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50U3NoS2V5OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKIAotY2xhc3MgTm9Tc2hLZXlDYWNoZSBpbXBsZW1lbnRzIFNzaEtleUNhY2hlIHsKKworcHVibGljIGNsYXNzIE5vU3NoS2V5Q2FjaGUgaW1wbGVtZW50cyBTc2hLZXlDYWNoZSB7CisKKyAgcHVibGljIHN0YXRpYyBNb2R1bGUgbW9kdWxlKCkgeworICAgIHJldHVybiBuZXcgQWJzdHJhY3RNb2R1bGUoKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZChTc2hLZXlDYWNoZS5jbGFzcykudG8oTm9Tc2hLZXlDYWNoZS5jbGFzcyk7CisgICAgICB9CisgICAgfTsKKyAgfQorCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBldmljdChTdHJpbmcgdXNlcm5hbWUpIHsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL05vU3NoTW9kdWxlLmphdmEKaW5kZXggMjFiMWE1NC4uODc4MWQ0NiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvTm9Tc2hNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Ob1NzaE1vZHVsZS5qYXZhCkBAIC0yMyw2ICsyMyw1IEBACiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CiAgICAgYmluZChTc2hJbmZvLmNsYXNzKS50byhOb1NzaEluZm8uY2xhc3MpOwotICAgIGJpbmQoU3NoS2V5Q2FjaGUuY2xhc3MpLnRvKE5vU3NoS2V5Q2FjaGUuY2xhc3MpOwogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hBZGRyZXNzZXNNb2R1bGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc3NoL1NzaEFkZHJlc3Nlc01vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTI4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hBZGRyZXNzZXNNb2R1bGUuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2g7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlNvY2tldFV0aWw7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTc2hBZGRyZXNzZXNNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQorICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3NoQWRkcmVzc2VzTW9kdWxlLmNsYXNzKTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BPUlQgPSAyOTQxODsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSUFOQV9TU0hfUE9SVCA9IDIyOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQFNpbmdsZXRvbgorICBAU3NoTGlzdGVuQWRkcmVzc2VzCisgIExpc3Q8U29ja2V0QWRkcmVzcz4gZ2V0TGlzdGVuQWRkcmVzc2VzKEBHZXJyaXRTZXJ2ZXJDb25maWcgQ29uZmlnIGNmZykgeworICAgIExpc3Q8U29ja2V0QWRkcmVzcz4gbGlzdGVuID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aEV4cGVjdGVkU2l6ZSgyKTsKKyAgICBTdHJpbmdbXSB3YW50ID0gY2ZnLmdldFN0cmluZ0xpc3QoInNzaGQiLCBudWxsLCAibGlzdGVuYWRkcmVzcyIpOworICAgIGlmICh3YW50ID09IG51bGwgfHwgd2FudC5sZW5ndGggPT0gMCkgeworICAgICAgbGlzdGVuLmFkZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoREVGQVVMVF9QT1JUKSk7CisgICAgICByZXR1cm4gbGlzdGVuOworICAgIH0KKworICAgIGlmICh3YW50Lmxlbmd0aCA9PSAxICYmIGlzT2ZmKHdhbnRbMF0pKSB7CisgICAgICByZXR1cm4gbGlzdGVuOworICAgIH0KKworICAgIGZvciAoZmluYWwgU3RyaW5nIGRlc2MgOiB3YW50KSB7CisgICAgICB0cnkgeworICAgICAgICBsaXN0ZW4uYWRkKFNvY2tldFV0aWwucmVzb2x2ZShkZXNjLCBERUZBVUxUX1BPUlQpKTsKKyAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGxvZy5lcnJvcigiQmFkIHNzaGQubGlzdGVuYWRkcmVzczogIiArIGRlc2MgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGlzdGVuOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09mZihTdHJpbmcgbGlzdGVuSG9zdG5hbWUpIHsKKyAgICByZXR1cm4gIm9mZiIuZXF1YWxzSWdub3JlQ2FzZShsaXN0ZW5Ib3N0bmFtZSkKKyAgICAgICAgfHwgIm5vbmUiLmVxdWFsc0lnbm9yZUNhc2UobGlzdGVuSG9zdG5hbWUpCisgICAgICAgIHx8ICJubyIuZXF1YWxzSWdub3JlQ2FzZShsaXN0ZW5Ib3N0bmFtZSk7CisgIH0KKworICBAUHJvdmlkZXMKKyAgQFNpbmdsZXRvbgorICBAU3NoQWR2ZXJ0aXNlZEFkZHJlc3NlcworICBMaXN0PFN0cmluZz4gZ2V0QWR2ZXJ0aXNlZEFkZHJlc3NlcyhAR2Vycml0U2VydmVyQ29uZmlnIENvbmZpZyBjZmcsCisgICAgICBAU3NoTGlzdGVuQWRkcmVzc2VzIExpc3Q8U29ja2V0QWRkcmVzcz4gbGlzdGVuKSB7CisgICAgU3RyaW5nW10gd2FudCA9IGNmZy5nZXRTdHJpbmdMaXN0KCJzc2hkIiwgbnVsbCwgImFkdmVydGlzZWRhZGRyZXNzIik7CisgICAgaWYgKHdhbnQubGVuZ3RoID4gMCkgeworICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qod2FudCk7CisgICAgfQorICAgIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IHB1YiA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgIExpc3Q8SW5ldFNvY2tldEFkZHJlc3M+IGxvY2FsID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisKKyAgICBmb3IgKFNvY2tldEFkZHJlc3MgYWRkciA6IGxpc3RlbikgeworICAgICAgaWYgKGFkZHIgaW5zdGFuY2VvZiBJbmV0U29ja2V0QWRkcmVzcykgeworICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBpbmV0QWRkciA9IChJbmV0U29ja2V0QWRkcmVzcykgYWRkcjsKKyAgICAgICAgaWYgKGluZXRBZGRyLmdldEFkZHJlc3MoKS5pc0xvb3BiYWNrQWRkcmVzcygpKSB7CisgICAgICAgICAgbG9jYWwuYWRkKGluZXRBZGRyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwdWIuYWRkKGluZXRBZGRyKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAocHViLmlzRW1wdHkoKSkgeworICAgICAgcHViID0gbG9jYWw7CisgICAgfQorICAgIExpc3Q8U3RyaW5nPiBhZHYgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkocHViLnNpemUoKSk7CisgICAgZm9yIChJbmV0U29ja2V0QWRkcmVzcyBhZGRyIDogcHViKSB7CisgICAgICBhZHYuYWRkKFNvY2tldFV0aWwuZm9ybWF0KGFkZHIsIElBTkFfU1NIX1BPUlQpKTsKKyAgICB9CisgICAgcmV0dXJuIGFkdjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvU3NoQWR2ZXJ0aXNlZEFkZHJlc3Nlcy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvU3NoQWR2ZXJ0aXNlZEFkZHJlc3Nlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTkyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hBZHZlcnRpc2VkQWRkcmVzc2VzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2g7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5CaW5kaW5nQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKKworLyoqCisgKiBNYXJrZXIgb24gdGhlIGxpc3Qgb2Yge0BsaW5rIFNvY2tldEFkZHJlc3N9ZXMgY29uZmlndXJlZCB0byBiZSBhZHZlcnRpc2VkIGJ5CisgKiB0aGUgc2VydmVyLgorICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAQmluZGluZ0Fubm90YXRpb24KK3B1YmxpYyBAaW50ZXJmYWNlIFNzaEFkdmVydGlzZWRBZGRyZXNzZXMgeworfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvU3NoTGlzdGVuQWRkcmVzc2VzLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NzaC9Tc2hMaXN0ZW5BZGRyZXNzZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQwNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zc2gvU3NoTGlzdGVuQWRkcmVzc2VzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2g7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5CaW5kaW5nQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKKworLyoqCisgKiBNYXJrZXIgb24gdGhlIGxpc3Qgb2Yge0BsaW5rIFNvY2tldEFkZHJlc3N9ZXMgb24gd2hpY2ggdGhlIFNTSCBkYWVtb24gaXMKKyAqIGNvbmZpZ3VyZWQgdG8gbGlzdGVuLgorICovCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAQmluZGluZ0Fubm90YXRpb24KK3B1YmxpYyBAaW50ZXJmYWNlIFNzaExpc3RlbkFkZHJlc3NlcyB7Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvRmFsbGJhY2tSZXF1ZXN0Q29udGV4dC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL0ZhbGxiYWNrUmVxdWVzdENvbnRleHQuamF2YQppbmRleCA2ODZhMTA4Li41NTE0ZWY1IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvRmFsbGJhY2tSZXF1ZXN0Q29udGV4dC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9GYWxsYmFja1JlcXVlc3RDb250ZXh0LmphdmEKQEAgLTE0LDkgKzE0LDEyIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkFub255bW91c1VzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aXNpb25FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCiAvKioKQEAgLTM3LDQgKzQwLDE1IEBACiAgIHB1YmxpYyBDdXJyZW50VXNlciBnZXRDdXJyZW50VXNlcigpIHsKICAgICByZXR1cm4gdXNlcjsKICAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUHJvdmlkZXI8UmV2aWV3RGI+IGdldFJldmlld0RiUHJvdmlkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBQcm92aWRlcjxSZXZpZXdEYj4oKSB7CisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyBSZXZpZXdEYiBnZXQoKSB7CisgICAgICAgIHRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiQXV0b21hdGljIFJldmlld0RiIG9ubHkgYXZhaWxhYmxlIGluIHJlcXVlc3Qgc2NvcGUiKTsKKyAgICAgIH0KKyAgICB9OworICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvR3VpY2VSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvR3VpY2VSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEKaW5kZXggZmEwNzE3Ni4uNGI1ZDczNiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL0d1aWNlUmVxdWVzdFNjb3BlUHJvcGFnYXRvci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9HdWljZVJlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUmVtb3RlUGVlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5LZXk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CkBAIC00Miw4ICs0Myw5IEBACiAgIEd1aWNlUmVxdWVzdFNjb3BlUHJvcGFnYXRvcigKICAgICAgIEBDYW5vbmljYWxXZWJVcmwgQE51bGxhYmxlIFByb3ZpZGVyPFN0cmluZz4gdXJsUHJvdmlkZXIsCiAgICAgICBAUmVtb3RlUGVlciBQcm92aWRlcjxTb2NrZXRBZGRyZXNzPiByZW1vdGVQZWVyUHJvdmlkZXIsCi0gICAgICBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsKSB7Ci0gICAgc3VwZXIoU2VydmxldFNjb3Blcy5SRVFVRVNULCBsb2NhbCk7CisgICAgICBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsLAorICAgICAgUHJvdmlkZXI8UmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI+IGRiUHJvdmlkZXJQcm92aWRlcikgeworICAgIHN1cGVyKFNlcnZsZXRTY29wZXMuUkVRVUVTVCwgbG9jYWwsIGRiUHJvdmlkZXJQcm92aWRlcik7CiAgICAgdGhpcy51cmwgPSB1cmxQcm92aWRlciAhPSBudWxsID8gdXJsUHJvdmlkZXIuZ2V0KCkgOiBudWxsOwogICAgIHRoaXMucGVlciA9IHJlbW90ZVBlZXJQcm92aWRlci5nZXQoKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL0lkR2VuZXJhdG9yLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvSWRHZW5lcmF0b3IuamF2YQppbmRleCBiMjBiYmY2Li43OGViNjU3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvSWRHZW5lcmF0b3IuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvSWRHZW5lcmF0b3IuamF2YQpAQCAtNDgsOCArNDgsMTIgQEAKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgc2FsdCA9IDB4OWUzNzc5Yjk7CiAKKyAgc3RhdGljIGludCBtaXgoaW50IGluKSB7CisgICAgcmV0dXJuIG1peChzYWx0LCBpbik7CisgIH0KKwogICAvKiogQSB2ZXJ5IHNpbXBsZSBiaXQgcGVybXV0YXRpb24gdG8gbWFzayBhIHNpbXBsZSBpbmNyZW1lbnRlci4gKi8KLSAgc3RhdGljIGludCBtaXgoZmluYWwgaW50IGluKSB7CisgIHB1YmxpYyBzdGF0aWMgaW50IG1peChmaW5hbCBpbnQgc2FsdCwgZmluYWwgaW50IGluKSB7CiAgICAgc2hvcnQgdjAgPSBoaTE2KGluKTsKICAgICBzaG9ydCB2MSA9IGxvMTYoaW4pOwogICAgIHYwICs9ICgodjEgPDwgMikgKyAwIF4gdjEpICsgKHNhbHQgXiAodjEgPj4+IDMpKSArIDE7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvTWFnaWNCcmFuY2guamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9NYWdpY0JyYW5jaC5qYXZhCmluZGV4IDUxMGRlYWEwMi4uNjA4NDRlZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL01hZ2ljQnJhbmNoLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL01hZ2ljQnJhbmNoLmphdmEKQEAgLTQ2LDEyICs0NiwyMyBAQAogCiAgIC8qKiBDaGVja3MgaWYgdGhlIHN1cHBsaWVkIHJlZiBuYW1lIGlzIGEgbWFnaWMgYnJhbmNoICovCiAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hZ2ljQnJhbmNoKFN0cmluZyByZWZOYW1lKSB7Ci0gICAgaWYgKHJlZk5hbWUuc3RhcnRzV2l0aChORVdfRFJBRlRfQ0hBTkdFKSB8fAotICAgICAgICByZWZOYW1lLnN0YXJ0c1dpdGgoTkVXX1BVQkxJU0hfQ0hBTkdFKSB8fAotICAgICAgICByZWZOYW1lLnN0YXJ0c1dpdGgoTkVXX0NIQU5HRSkpIHsKLSAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiByZWZOYW1lLnN0YXJ0c1dpdGgoTkVXX0RSQUZUX0NIQU5HRSkKKyAgICAgICAgfHwgcmVmTmFtZS5zdGFydHNXaXRoKE5FV19QVUJMSVNIX0NIQU5HRSkKKyAgICAgICAgfHwgcmVmTmFtZS5zdGFydHNXaXRoKE5FV19DSEFOR0UpOworICB9CisKKyAgLyoqIFJldHVybnMgdGhlIHJlZiBuYW1lIHByZWZpeCBmb3IgYSBtYWdpYyBicmFuY2gsIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBicmFuY2ggaXMgbm90IG1hZ2ljICovCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1hZ2ljUmVmTmFtZVByZWZpeChTdHJpbmcgcmVmTmFtZSkgeworICAgIGlmIChyZWZOYW1lLnN0YXJ0c1dpdGgoTkVXX0RSQUZUX0NIQU5HRSkpIHsKKyAgICAgIHJldHVybiBORVdfRFJBRlRfQ0hBTkdFOwogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHJlZk5hbWUuc3RhcnRzV2l0aChORVdfUFVCTElTSF9DSEFOR0UpKSB7CisgICAgICByZXR1cm4gTkVXX1BVQkxJU0hfQ0hBTkdFOworICAgIH0KKyAgICBpZiAocmVmTmFtZS5zdGFydHNXaXRoKE5FV19DSEFOR0UpKSB7CisgICAgICByZXR1cm4gTkVXX0NIQU5HRTsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CiAgIH0KIAogICAvKioKQEAgLTgwLDExICs5MSw2IEBACiAgICAgcmV0dXJuIENhcGFibGUuT0s7CiAgIH0KIAotICAvKiogQ2hlY2tzIGlmIHJlZiBuYW1lIG1hdGNoZXMgdGhlIGRyYWZ0IG1hZ2ljIGJyYW5jaCAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEcmFmdChTdHJpbmcgcmVmTmFtZSkgewotICAgIHJldHVybiByZWZOYW1lLnN0YXJ0c1dpdGgoTWFnaWNCcmFuY2guTkVXX0RSQUZUX0NIQU5HRSk7Ci0gIH0KLQogICBwcml2YXRlIHN0YXRpYyBDYXBhYmxlIGNoZWNrTWFnaWNCcmFuY2hSZWYoU3RyaW5nIGJyYW5jaE5hbWUsIFJlcG9zaXRvcnkgcmVwbywKICAgICAgIFByb2plY3QgcHJvamVjdCkgewogICAgIE1hcDxTdHJpbmcsIFJlZj4gYmxvY2tpbmdGb3JzOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1BsdWdpblJlcXVlc3RDb250ZXh0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUGx1Z2luUmVxdWVzdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM2ZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1BsdWdpblJlcXVlc3RDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUGx1Z2luVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aXNpb25FeGNlcHRpb247CisKKy8qKiBSZXF1ZXN0Q29udGV4dCBhY3RpdmUgd2hpbGUgcGx1Z2lucyBsb2FkIG9yIHVubG9hZC4gKi8KK3B1YmxpYyBjbGFzcyBQbHVnaW5SZXF1ZXN0Q29udGV4dCBpbXBsZW1lbnRzIFJlcXVlc3RDb250ZXh0IHsKKyAgcHJpdmF0ZSBmaW5hbCBQbHVnaW5Vc2VyIHVzZXI7CisKKyAgcHVibGljIFBsdWdpblJlcXVlc3RDb250ZXh0KFBsdWdpblVzZXIgdXNlcikgeworICAgIHRoaXMudXNlciA9IHVzZXI7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIEN1cnJlbnRVc2VyIGdldEN1cnJlbnRVc2VyKCkgeworICAgIHJldHVybiB1c2VyOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBQcm92aWRlcjxSZXZpZXdEYj4gZ2V0UmV2aWV3RGJQcm92aWRlcigpIHsKKyAgICByZXR1cm4gbmV3IFByb3ZpZGVyPFJldmlld0RiPigpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFJldmlld0RiIGdldCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJBdXRvbWF0aWMgUmV2aWV3RGIgb25seSBhdmFpbGFibGUgaW4gcmVxdWVzdCBzY29wZSIpOworICAgICAgfQorICAgIH07CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9SZXF1ZXN0Q29udGV4dC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1JlcXVlc3RDb250ZXh0LmphdmEKaW5kZXggY2E4NTczZi4uODZjNzRlMCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1JlcXVlc3RDb250ZXh0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1JlcXVlc3RDb250ZXh0LmphdmEKQEAgLTE0LDEzICsxNCwxNSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsOwogCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAogLyoqCiAgKiBUaGUgUmVxdWVzdENvbnRleHQgaXMgYW4gaW50ZXJmYWNlIGV4cG9zaW5nIHRoZSBmaWVsZHMgdGhhdCBhcmUgbmVlZGVkCiAgKiBieSB0aGUgR2Vycml0R2xvYmFsTW9kdWxlIHNjb3BlLgogICovCiBwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHsKLQogICBDdXJyZW50VXNlciBnZXRDdXJyZW50VXNlcigpOworICBQcm92aWRlcjxSZXZpZXdEYj4gZ2V0UmV2aWV3RGJQcm92aWRlcigpOwogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1JlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEKaW5kZXggODRjNjFlOS4uZjYzZGE1NDM5IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvUmVxdWVzdFNjb3BlUHJvcGFnYXRvci5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9SZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEKQEAgLTE0LDggKzE0LDE0IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5OYW1lS2V5OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlJlcXVlc3RDbGVhbnVwOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuUmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Qcm9qZWN0UnVubmFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwpAQCAtNDMsMTkgKzQ5LDI2IEBACiAKICAgcHJpdmF0ZSBmaW5hbCBTY29wZSBzY29wZTsKICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsOworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyPiBkYlByb3ZpZGVyUHJvdmlkZXI7CiAKICAgcHJvdGVjdGVkIFJlcXVlc3RTY29wZVByb3BhZ2F0b3IoU2NvcGUgc2NvcGUsCi0gICAgICBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsKSB7CisgICAgICBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsLAorICAgICAgUHJvdmlkZXI8UmVxdWVzdFNjb3BlZFJldmlld0RiUHJvdmlkZXI+IGRiUHJvdmlkZXJQcm92aWRlcikgewogICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKICAgICB0aGlzLmxvY2FsID0gbG9jYWw7CisgICAgdGhpcy5kYlByb3ZpZGVyUHJvdmlkZXIgPSBkYlByb3ZpZGVyUHJvdmlkZXI7CiAgIH0KIAogICAvKioKLSAgICogV3JhcHMgY2FsbGFibGUgaW4gYSBuZXcge0BsaW5rIENhbGxhYmxlfSB0aGF0IHByb3BhZ2F0ZXMgdGhlIGN1cnJlbnQKLSAgICogcmVxdWVzdCBzdGF0ZSB3aGVuIHRoZSBjYWxsYWJsZSBpcyBpbnZva2VkLiBUaGUgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGluIGEKLSAgICogcmVxdWVzdCBzY29wZSBhbmQgdGhlIHJldHVybmVkIENhbGxhYmxlIG1heSBvbmx5IGJlIGludm9rZWQgaW4gYSB0aHJlYWQKLSAgICogdGhhdCBpcyBub3QgYWxyZWFkeSBpbiBhIHJlcXVlc3Qgc2NvcGUuIFRoZSByZXR1cm5lZCBDYWxsYWJsZSB3aWxsIGluaGVyaXQKLSAgICogdG9TdHJpbmcoKSBmcm9tIHRoZSBwYXNzZWQgaW4gQ2FsbGFibGUuIEEKKyAgICogRW5zdXJlcyB0aGF0IHRoZSBjdXJyZW50IHJlcXVlc3Qgc3RhdGUgaXMgYXZhaWxhYmxlIHdoZW4gdGhlIHBhc3NlZCBpbgorICAgKiBDYWxsYWJsZSBpcyBpbnZva2VkLgorICAgKgorICAgKiBJZiBuZWVkZWQgd3JhcHMgdGhlIHBhc3NlZCBpbiBDYWxsYWJsZSBpbiBhIG5ldyB7QGxpbmsgQ2FsbGFibGV9IHRoYXQKKyAgICogcHJvcGFnYXRlcyB0aGUgY3VycmVudCByZXF1ZXN0IHN0YXRlIHdoZW4gdGhlIHJldHVybmVkIENhbGxhYmxlIGlzIGludm9rZWQuCisgICAqIFRoZSBtZXRob2QgbXVzdCBiZSBjYWxsZWQgaW4gYSByZXF1ZXN0IHNjb3BlIGFuZCB0aGUgcmV0dXJuZWQgQ2FsbGFibGUgbWF5CisgICAqIG9ubHkgYmUgaW52b2tlZCBpbiBhIHRocmVhZCB0aGF0IGlzIG5vdCBhbHJlYWR5IGluIGEgcmVxdWVzdCBzY29wZSBvciBpcyBpbgorICAgKiB0aGUgc2FtZSByZXF1ZXN0IHNjb3BlLiBUaGUgcmV0dXJuZWQgQ2FsbGFibGUgd2lsbCBpbmhlcml0IHRvU3RyaW5nKCkgZnJvbQorICAgKiB0aGUgcGFzc2VkIGluIENhbGxhYmxlLiBBCiAgICAqIHtAbGluayBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZS5FeGVjdXRvcn0gZG9lcyBub3QgYWNjZXB0IGEKICAgICogQ2FsbGFibGUsIHNvIHRoZXJlIGlzIG5vIFByb2plY3RDYWxsYWJsZSBpbXBsZW1lbnRhdGlvbi4gSW1wbGVtZW50YXRpb25zIG9mCiAgICAqIHRoaXMgbWV0aG9kIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIEd1aWNlJ3MKQEAgLTczLDEyICs4NiwxNyBAQAogICAgKiBAcmV0dXJuIGEgbmV3IENhbGxhYmxlIHdoaWNoIHdpbGwgZXhlY3V0ZSBpbiB0aGUgY3VycmVudCByZXF1ZXN0IHNjb3BlLgogICAgKi8KICAgcHVibGljIGZpbmFsIDxUPiBDYWxsYWJsZTxUPiB3cmFwKGZpbmFsIENhbGxhYmxlPFQ+IGNhbGxhYmxlKSB7CisgICAgZmluYWwgUmVxdWVzdENvbnRleHQgY2FsbGVyQ29udGV4dCA9IGNoZWNrTm90TnVsbChsb2NhbC5nZXRDb250ZXh0KCkpOwogICAgIGZpbmFsIENhbGxhYmxlPFQ+IHdyYXBwZWQgPQotICAgICAgICB3cmFwSW1wbChjb250ZXh0KGxvY2FsLmdldENvbnRleHQoKSwgY2xlYW51cChjYWxsYWJsZSkpKTsKKyAgICAgICAgd3JhcEltcGwoY29udGV4dChjYWxsZXJDb250ZXh0LCBjbGVhbnVwKGNhbGxhYmxlKSkpOwogICAgIHJldHVybiBuZXcgQ2FsbGFibGU8VD4oKSB7CiAgICAgICBAT3ZlcnJpZGUKICAgICAgIHB1YmxpYyBUIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY2FsbCgpOworICAgICAgICBpZiAoY2FsbGVyQ29udGV4dCA9PSBsb2NhbC5nZXRDb250ZXh0KCkpIHsKKyAgICAgICAgICByZXR1cm4gY2FsbGFibGUuY2FsbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiB3cmFwcGVkLmNhbGwoKTsKKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICBAT3ZlcnJpZGUKQEAgLTExMSwxNSArMTI5LDE0IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgd3JhcHBlZC5jYWxsKCk7Ci0gICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZUlmUG9zc2libGUoZSk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgLy8gTm90IHBvc3NpYmxlLgogICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTmFtZUtleSBnZXRQcm9qZWN0TmFtZUtleSgpIHsKKyAgICAgICAgcHVibGljIFByb2plY3QuTmFtZUtleSBnZXRQcm9qZWN0TmFtZUtleSgpIHsKICAgICAgICAgICByZXR1cm4gKChQcm9qZWN0UnVubmFibGUpIHJ1bm5hYmxlKS5nZXRQcm9qZWN0TmFtZUtleSgpOwogICAgICAgICB9CiAKQEAgLTE2OSw3ICsxODYsMTcgQEAKICAgICByZXR1cm4gbmV3IENhbGxhYmxlPFQ+KCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgVCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlcXVlc3RDb250ZXh0IG9sZCA9IGxvY2FsLnNldENvbnRleHQoY29udGV4dCk7CisgICAgICAgIFJlcXVlc3RDb250ZXh0IG9sZCA9IGxvY2FsLnNldENvbnRleHQobmV3IFJlcXVlc3RDb250ZXh0KCkgeworICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgIHB1YmxpYyBDdXJyZW50VXNlciBnZXRDdXJyZW50VXNlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LmdldEN1cnJlbnRVc2VyKCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgcHVibGljIFByb3ZpZGVyPFJldmlld0RiPiBnZXRSZXZpZXdEYlByb3ZpZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGRiUHJvdmlkZXJQcm92aWRlci5nZXQoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgICB0cnkgewogICAgICAgICAgIHJldHVybiBjYWxsYWJsZS5jYWxsKCk7CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC0xOTEsNyArMjE4LDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RDbGVhbnVwKCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pLmdldCgpOwotCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgcmV0dXJuIGNhbGxhYmxlLmNhbGwoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9TdWJtb2R1bGVTZWN0aW9uUGFyc2VyLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvU3VibW9kdWxlU2VjdGlvblBhcnNlci5qYXZhCmluZGV4IDczMTA3MDMuLmZiZDgyMzYgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9TdWJtb2R1bGVTZWN0aW9uUGFyc2VyLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1N1Ym1vZHVsZVNlY3Rpb25QYXJzZXIuamF2YQpAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICYmIGJyYW5jaCAhPSBudWxsICYmIGJyYW5jaC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgLy8gQWxsIHJlcXVpcmVkIGZpZWxkcyBmaWxsZWQuCiAKLSAgICAgICAgYm9vbGVhbiB1cmxJc1JlbGF0aXZlID0gdXJsLnN0YXJ0c1dpdGgoIi8iKTsKKyAgICAgICAgYm9vbGVhbiB1cmxJc1JlbGF0aXZlID0gdXJsLnN0YXJ0c1dpdGgoIi4uLyIpOwogICAgICAgICBTdHJpbmcgc2VydmVyID0gbnVsbDsKICAgICAgICAgaWYgKCF1cmxJc1JlbGF0aXZlKSB7CiAgICAgICAgICAgLy8gSXQgaXMgYWN0dWFsbHkgYW4gVVJJLiBJdCBjb3VsZCBiZSBzc2g6Ly9sb2NhbGhvc3QvcHJvamVjdC1hLgpAQCAtMTAzLDggKzEwMyw5IEBACiAgICAgICAgICAgICBmcm9tSW5kZXggPSB1cmxFeHRyYWN0ZWRQYXRoLmxhc3RJbmRleE9mKCcvJywgZnJvbUluZGV4IC0gMSk7CiAgICAgICAgICAgICBwcm9qZWN0TmFtZSA9IHVybEV4dHJhY3RlZFBhdGguc3Vic3RyaW5nKGZyb21JbmRleCArIDEpOwogCi0gICAgICAgICAgICBpZiAocHJvamVjdE5hbWUuZW5kc1dpdGgoIi5naXQiKSkgewotICAgICAgICAgICAgICBwcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lLnN1YnN0cmluZygwLCBwcm9qZWN0TmFtZS5sZW5ndGgoKSAtIDQpOworICAgICAgICAgICAgaWYgKHByb2plY3ROYW1lLmVuZHNXaXRoKENvbnN0YW50cy5ET1RfR0lUX0VYVCkpIHsKKyAgICAgICAgICAgICAgcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZS5zdWJzdHJpbmcoMCwgLy8KKyAgICAgICAgICAgICAgICAgIHByb2plY3ROYW1lLmxlbmd0aCgpIC0gQ29uc3RhbnRzLkRPVF9HSVRfRVhULmxlbmd0aCgpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHJlcG9NYW5hZ2VyLmxpc3QoKS5jb250YWlucyhuZXcgUHJvamVjdC5OYW1lS2V5KHByb2plY3ROYW1lKSkpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9UaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dC5qYXZhCmluZGV4IGI0MTE1MTIuLmJkNDNlOWQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9UaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1RocmVhZExvY2FsUmVxdWVzdENvbnRleHQuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5lcnJvcnMuTm90U2lnbmVkSW5FeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CkBAIC02NCw2ICs2NSwxMSBAQAogICAgICAgICB0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKE5vdFNpZ25lZEluRXhjZXB0aW9uLk1FU1NBR0UsCiAgICAgICAgICAgICBuZXcgTm90U2lnbmVkSW5FeGNlcHRpb24oKSk7CiAgICAgICB9CisKKyAgICAgIEBQcm92aWRlcworICAgICAgUmV2aWV3RGIgcHJvdmlkZVJldmlld0RiKFJlcXVlc3RDb250ZXh0IGN0eCkgeworICAgICAgICByZXR1cm4gY3R4LmdldFJldmlld0RiUHJvdmlkZXIoKS5nZXQoKTsKKyAgICAgIH0KICAgICB9OwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9UaHJlYWRMb2NhbFJlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9UaHJlYWRMb2NhbFJlcXVlc3RTY29wZVByb3BhZ2F0b3IuamF2YQppbmRleCA3NzI4ZDZmLi5hMzFjN2M3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvVGhyZWFkTG9jYWxSZXF1ZXN0U2NvcGVQcm9wYWdhdG9yLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci91dGlsL1RocmVhZExvY2FsUmVxdWVzdFNjb3BlUHJvcGFnYXRvci5qYXZhCkBAIC0xNCw3ICsxNCw5IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWw7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk91dE9mU2NvcGVFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2NvcGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKQEAgLTMxLDggKzMzLDEwIEBACiAgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWw8Qz4gdGhyZWFkTG9jYWw7CiAKICAgcHJvdGVjdGVkIFRocmVhZExvY2FsUmVxdWVzdFNjb3BlUHJvcGFnYXRvcihTY29wZSBzY29wZSwKLSAgICAgIFRocmVhZExvY2FsPEM+IHRocmVhZExvY2FsLCBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsKSB7Ci0gICAgc3VwZXIoc2NvcGUsIGxvY2FsKTsKKyAgICAgIFRocmVhZExvY2FsPEM+IHRocmVhZExvY2FsLAorICAgICAgVGhyZWFkTG9jYWxSZXF1ZXN0Q29udGV4dCBsb2NhbCwKKyAgICAgIFByb3ZpZGVyPFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyPiBkYlByb3ZpZGVyUHJvdmlkZXIpIHsKKyAgICBzdXBlcihzY29wZSwgbG9jYWwsIGRiUHJvdmlkZXJQcm92aWRlcik7CiAgICAgdGhpcy50aHJlYWRMb2NhbCA9IHRocmVhZExvY2FsOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvQ2F0ZWdvcnlGdW5jdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9DYXRlZ29yeUZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZjFiZmIuLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9DYXRlZ29yeUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqIEZ1bmN0aW9uIHRvIGNvbnRyb2wge0BsaW5rIFBhdGNoU2V0QXBwcm92YWx9cyBpbiBhbiB7QGxpbmsgQXBwcm92YWxDYXRlZ29yeX0uICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2F0ZWdvcnlGdW5jdGlvbiB7Ci0gIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENhdGVnb3J5RnVuY3Rpb24+IGFsbCA9Ci0gICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIENhdGVnb3J5RnVuY3Rpb24+KCk7Ci0gIHN0YXRpYyB7Ci0gICAgYWxsLnB1dChNYXhXaXRoQmxvY2suTkFNRSwgbmV3IE1heFdpdGhCbG9jaygpKTsKLSAgICBhbGwucHV0KE1heE5vQmxvY2suTkFNRSwgbmV3IE1heE5vQmxvY2soKSk7Ci0gICAgYWxsLnB1dChOb09wRnVuY3Rpb24uTkFNRSwgbmV3IE5vT3BGdW5jdGlvbigpKTsKLSAgICBhbGwucHV0KE5vQmxvY2suTkFNRSwgbmV3IE5vQmxvY2soKSk7Ci0gIH0KLQotICAvKioKLSAgICogTG9jYXRlIGEgZnVuY3Rpb24gYnkgY2F0ZWdvcnkuCi0gICAqCi0gICAqIEBwYXJhbSBjYXRlZ29yeSB0aGUgY2F0ZWdvcnkgdGhlIGZ1bmN0aW9uIGlzIGZvci4KLSAgICogQHJldHVybiB0aGUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb247IHtAbGluayBOb09wRnVuY3Rpb259IGlmIHRoZSBmdW5jdGlvbgotICAgKiAgICAgICAgIGlzIG5vdCBrbm93biB0byBHZXJyaXQgYW5kIHRodXMgY2Fubm90IGJlIGV4ZWN1dGVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDYXRlZ29yeUZ1bmN0aW9uIGZvckNhdGVnb3J5KGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsKLSAgICBmaW5hbCBDYXRlZ29yeUZ1bmN0aW9uIHIgPSBhbGwuZ2V0KGNhdGVnb3J5LmdldEZ1bmN0aW9uTmFtZSgpKTsKLSAgICByZXR1cm4gciAhPSBudWxsID8gciA6IG5ldyBOb09wRnVuY3Rpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBOb3JtYWxpemUgQ2hhbmdlQXBwcm92YWxzIGFuZCBzZXQgdGhlIHZhbGlkIGZsYWcgZm9yIHRoaXMgY2F0ZWdvcnkuCi0gICAqIDxwPgotICAgKiBJbXBsZW1lbnRvcnMgc2hvdWxkIGludm9rZToKLSAgICoKLSAgICogPHByZT4KLSAgICogc3RhdGUudmFsaWQoYXQsIHRydWUpOwotICAgKiA8L3ByZT4KLSAgICogPHA+Ci0gICAqIElmIHRoZSBzZXQgb2YgYXBwcm92YWxzIGZyb20gPGNvZGU+c3RhdGUuZ2V0QXBwcm92YWxzKGF0KTwvY29kZT4gY292ZXJzIHRoZQotICAgKiByZXF1aXJlbWVudHMgZm9yIHRoZSBmdW5jdGlvbiwgaW5kaWNhdGluZyB0aGUgY2F0ZWdvcnkgaGFzIGJlZW4gY29tcGxldGVkLgotICAgKiA8cD4KLSAgICogQW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbiB3aGljaCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgcG9zaXRpdmUgYW5kIG5vCi0gICAqIG5lZ2F0aXZlcyBtaWdodCBiZToKLSAgICoKLSAgICogPHByZT4KLSAgICogYm9vbGVhbiBuZWcgPSBmYWxzZSwgcG9zID0gZmFsc2U7Ci0gICAqIGZvciAoZmluYWwgQ2hhbmdlQXBwcm92YWwgY2EgOiBzdGF0ZS5nZXRBcHByb3ZhbHMoYXQpKSB7Ci0gICAqICAgc3RhdGUubm9ybWFsaXplKGNhKTsKLSAgICogICBuZWcgfD0gY2EuZ2V0VmFsdWUoKSAmbHQ7IDA7Ci0gICAqICAgcG9zIHw9IGNhLmdldFZhbHVlKCkgJmd0OyAwOwotICAgKiB9Ci0gICAqIHN0YXRlLnZhbGlkKGF0LCAhbmVnICZhbXA7JmFtcDsgcG9zKTsKLSAgICogPC9wcmU+Ci0gICAqCi0gICAqIEBwYXJhbSBhdCB0aGUgY2FjaGVkIGNhdGVnb3J5IGRlc2NyaXB0aW9uIHRvIHByb2Nlc3MuCi0gICAqIEBwYXJhbSBzdGF0ZSBzdGF0ZSB0byByZWFkIGFwcHJvdmFscyBhbmQgcHJvamVjdCByaWdodHMgZnJvbSwgYW5kIHRvIHVwZGF0ZQotICAgKiAgICAgICAgdGhlIHZhbGlkIHN0YXR1cyBpbnRvLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgcnVuKEFwcHJvdmFsVHlwZSBhdCwgRnVuY3Rpb25TdGF0ZSBzdGF0ZSk7Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L0Z1bmN0aW9uU3RhdGUuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvRnVuY3Rpb25TdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGM5N2YzLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvRnVuY3Rpb25TdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIud29ya2Zsb3c7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb25SYW5nZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5LklkOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ2hhbmdlQ29udHJvbDsKLWltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYXNzaXN0ZWRpbmplY3QuQXNzaXN0ZWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKiogU3RhdGUgcGFzc2VkIHRocm91Z2ggdG8gYSB7QGxpbmsgQ2F0ZWdvcnlGdW5jdGlvbn0uICovCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25TdGF0ZSB7Ci0gIHB1YmxpYyBpbnRlcmZhY2UgRmFjdG9yeSB7Ci0gICAgRnVuY3Rpb25TdGF0ZSBjcmVhdGUoQ2hhbmdlQ29udHJvbCBjLCBQYXRjaFNldC5JZCBwc0lkLAotICAgICAgICBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFsbCk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZXMgYXBwcm92YWxUeXBlczsKLSAgcHJpdmF0ZSBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKLQotICBwcml2YXRlIGZpbmFsIE1hcDxBcHByb3ZhbENhdGVnb3J5LklkLCBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+PiBhcHByb3ZhbHMgPQotICAgICAgbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPj4oKTsKLSAgcHJpdmF0ZSBmaW5hbCBNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQm9vbGVhbj4gdmFsaWQgPQotICAgICAgbmV3IEhhc2hNYXA8QXBwcm92YWxDYXRlZ29yeS5JZCwgQm9vbGVhbj4oKTsKLSAgcHJpdmF0ZSBmaW5hbCBDaGFuZ2VDb250cm9sIGNhbGxlckNoYW5nZUNvbnRyb2w7Ci0gIHByaXZhdGUgZmluYWwgQ2hhbmdlIGNoYW5nZTsKLQotICBASW5qZWN0Ci0gIEZ1bmN0aW9uU3RhdGUoZmluYWwgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzLAotICAgICAgZmluYWwgSWRlbnRpZmllZFVzZXIuR2VuZXJpY0ZhY3RvcnkgdXNlckZhY3RvcnksCi0gICAgICBAQXNzaXN0ZWQgZmluYWwgQ2hhbmdlQ29udHJvbCBjLCBAQXNzaXN0ZWQgZmluYWwgUGF0Y2hTZXQuSWQgcHNJZCwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGFsbCkgewotICAgIHRoaXMuYXBwcm92YWxUeXBlcyA9IGFwcHJvdmFsVHlwZXM7Ci0gICAgdGhpcy51c2VyRmFjdG9yeSA9IHVzZXJGYWN0b3J5OwotCi0gICAgY2FsbGVyQ2hhbmdlQ29udHJvbCA9IGM7Ci0gICAgY2hhbmdlID0gYy5nZXRDaGFuZ2UoKTsKLQotICAgIGZvciAoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYSA6IGFsbCkgewotICAgICAgaWYgKHBzSWQuZXF1YWxzKGNhLmdldFBhdGNoU2V0SWQoKSkpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBsID0gYXBwcm92YWxzLmdldChjYS5nZXRDYXRlZ29yeUlkKCkpOwotICAgICAgICBpZiAobCA9PSBudWxsKSB7Ci0gICAgICAgICAgbCA9IG5ldyBBcnJheUxpc3Q8UGF0Y2hTZXRBcHByb3ZhbD4oKTsKLSAgICAgICAgICBhcHByb3ZhbHMucHV0KGNhLmdldENhdGVnb3J5SWQoKSwgbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbC5hZGQoY2EpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIExpc3Q8QXBwcm92YWxUeXBlPiBnZXRBcHByb3ZhbFR5cGVzKCkgewotICAgIHJldHVybiBhcHByb3ZhbFR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKTsKLSAgfQotCi0gIENoYW5nZSBnZXRDaGFuZ2UoKSB7Ci0gICAgcmV0dXJuIGNoYW5nZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZhbGlkKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCwgZmluYWwgYm9vbGVhbiB2KSB7Ci0gICAgdmFsaWQucHV0KGlkKGF0KSwgdik7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCkgewotICAgIHJldHVybiBpc1ZhbGlkKGlkKGF0KSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIEFwcHJvdmFsQ2F0ZWdvcnkuSWQgaWQpIHsKLSAgICBmaW5hbCBCb29sZWFuIGIgPSB2YWxpZC5nZXQoaWQpOwotICAgIHJldHVybiBiICE9IG51bGwgJiYgYjsKLSAgfQotCi0gIHB1YmxpYyBDb2xsZWN0aW9uPFBhdGNoU2V0QXBwcm92YWw+IGdldEFwcHJvdmFscyhmaW5hbCBBcHByb3ZhbFR5cGUgYXQpIHsKLSAgICByZXR1cm4gZ2V0QXBwcm92YWxzKGlkKGF0KSk7Ci0gIH0KLQotICBwdWJsaWMgQ29sbGVjdGlvbjxQYXRjaFNldEFwcHJvdmFsPiBnZXRBcHByb3ZhbHMoZmluYWwgQXBwcm92YWxDYXRlZ29yeS5JZCBpZCkgewotICAgIGZpbmFsIENvbGxlY3Rpb248UGF0Y2hTZXRBcHByb3ZhbD4gbCA9IGFwcHJvdmFscy5nZXQoaWQpOwotICAgIHJldHVybiBsICE9IG51bGwgPyBsIDogQ29sbGVjdGlvbnMuPFBhdGNoU2V0QXBwcm92YWw+IGVtcHR5U2V0KCk7Ci0gIH0KLQotICAvKioKLSAgICogTm9ybWFsaXplIHRoZSBhcHByb3ZhbCByZWNvcmQgZG93biB0byB0aGUgcmFuZ2UgcGVybWl0dGVkIGJ5IHRoZSB0eXBlLCBpbgotICAgKiBjYXNlIHRoZSB0eXBlIHdhcyBtb2RpZmllZCBzaW5jZSB0aGUgYXBwcm92YWwgd2FzIG9yaWdpbmFsbHkgZ3JhbnRlZC4KLSAgICogPHA+Ci0gICAqLwotICBwcml2YXRlIHZvaWQgYXBwbHlUeXBlRmxvb3IoZmluYWwgQXBwcm92YWxUeXBlIGF0LCBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGEpIHsKLSAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUgYXRNaW4gPSBhdC5nZXRNaW4oKTsKLQotICAgIGlmIChhdE1pbiAhPSBudWxsICYmIGEuZ2V0VmFsdWUoKSA8IGF0TWluLmdldFZhbHVlKCkpIHsKLSAgICAgIGEuc2V0VmFsdWUoYXRNaW4uZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIGF0TWF4ID0gYXQuZ2V0TWF4KCk7Ci0gICAgaWYgKGF0TWF4ICE9IG51bGwgJiYgYS5nZXRWYWx1ZSgpID4gYXRNYXguZ2V0VmFsdWUoKSkgewotICAgICAgYS5zZXRWYWx1ZShhdE1heC5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTm9ybWFsaXplIHRoZSBhcHByb3ZhbCByZWNvcmQgdG8gYmUgaW5zaWRlIHRoZSBtYXhpbXVtIHJhbmdlIHBlcm1pdHRlZCBieQotICAgKiB0aGUgUmVmUmlnaHRzIGdyYW50ZWQgdG8gZ3JvdXBzIHRoZSBhY2NvdW50IGlzIGEgbWVtYmVyIG9mLgotICAgKiA8cD4KLSAgICogSWYgbXVsdGlwbGUgUmVmUmlnaHRzIGFyZSBtYXRjaGVkIChhc3NpZ25lZCB0byBkaWZmZXJlbnQgZ3JvdXBzIHRoZSBhY2NvdW50Ci0gICAqIGlzIGEgbWVtYmVyIG9mKSB0aGUgbG93ZXN0IG1pblZhbHVlIGFuZCB0aGUgaGlnaGVzdCBtYXhWYWx1ZSBvZiB0aGUgdW5pb24KLSAgICogb2YgdGhlbSBpcyB1c2VkLgotICAgKiA8cD4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhcHBseVJpZ2h0Rmxvb3IoZmluYWwgQXBwcm92YWxUeXBlIGF0LCBmaW5hbCBQYXRjaFNldEFwcHJvdmFsIGEpIHsKLSAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdGVnb3J5ID0gYXQuZ2V0Q2F0ZWdvcnkoKTsKLSAgICBmaW5hbCBTdHJpbmcgcGVybWlzc2lvbiA9IFBlcm1pc3Npb24uZm9yTGFiZWwoY2F0ZWdvcnkuZ2V0TGFiZWxOYW1lKCkpOwotICAgIGZpbmFsIElkZW50aWZpZWRVc2VyIHVzZXIgPSB1c2VyRmFjdG9yeS5jcmVhdGUoYS5nZXRBY2NvdW50SWQoKSk7Ci0gICAgZmluYWwgUGVybWlzc2lvblJhbmdlIHJhbmdlID0gY29udHJvbEZvcih1c2VyKS5nZXRSYW5nZShwZXJtaXNzaW9uKTsKLSAgICBhLnNldFZhbHVlKChzaG9ydCkgcmFuZ2Uuc3F1YXNoKGEuZ2V0VmFsdWUoKSkpOwotICB9Ci0KLSAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sIGNvbnRyb2xGb3IoQ3VycmVudFVzZXIgdXNlcikgewotICAgIHJldHVybiBjYWxsZXJDaGFuZ2VDb250cm9sLmZvclVzZXIodXNlcik7Ci0gIH0KLQotICAvKiogUnVuIDxjb2RlPmFwcGx5VHlwZUZsb29yPC9jb2RlPiwgPGNvZGU+YXBwbHlSaWdodEZsb29yPC9jb2RlPi4gKi8KLSAgcHVibGljIHZvaWQgbm9ybWFsaXplKGZpbmFsIEFwcHJvdmFsVHlwZSBhdCwgZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBjYSkgewotICAgIGFwcGx5VHlwZUZsb29yKGF0LCBjYSk7Ci0gICAgYXBwbHlSaWdodEZsb29yKGF0LCBjYSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBJZCBpZChmaW5hbCBBcHByb3ZhbFR5cGUgYXQpIHsKLSAgICByZXR1cm4gYXQuZ2V0Q2F0ZWdvcnkoKS5nZXRJZCgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L01heE5vQmxvY2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTWF4Tm9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjcyZjhhLi4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTWF4Tm9CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci53b3JrZmxvdzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXRBcHByb3ZhbDsKLQotLyoqCi0gKiBDb21wdXRlcyBhbiB7QGxpbmsgQXBwcm92YWxDYXRlZ29yeX0gYnkgbG9va2luZyBhdCBtYXhpbXVtIHZhbHVlcy4KLSAqIDxwPgotICogSW4gb3JkZXIgdG8gYmUgY29uc2lkZXJlZCAiYXBwcm92ZWQiIHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhhdDoKLSAqIDx1bD4KLSAqIDxsaT5UaGUgbWF4aW11bSBwb3NpdGl2ZSB2YWx1ZSBpcyB1c2VkIGF0IGxlYXN0IG9uY2U7PC9saT4KLSAqIDxsaT5UaGUgdXNlciBhcHByb3ZpbmcgdGhlIG1heGltdW0gcG9zaXRpdmUgaGFzIGJlZW4gZ3JhbnRlZCB0aGF0LjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGFkdmlzb3J5IHJldmlldyBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXhOb0Jsb2NrIGV4dGVuZHMgQ2F0ZWdvcnlGdW5jdGlvbiB7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUUgPSAiTWF4Tm9CbG9jayI7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBBcHByb3ZhbFR5cGUgYXQsIGZpbmFsIEZ1bmN0aW9uU3RhdGUgc3RhdGUpIHsKLSAgICBib29sZWFuIHBhc3NlZCA9IGZhbHNlOwotICAgIGZvciAoZmluYWwgUGF0Y2hTZXRBcHByb3ZhbCBhIDogc3RhdGUuZ2V0QXBwcm92YWxzKGF0KSkgewotICAgICAgc3RhdGUubm9ybWFsaXplKGF0LCBhKTsKLQotICAgICAgcGFzc2VkIHw9IGF0LmlzTWF4UG9zaXRpdmUoYSk7Ci0gICAgfQotCi0gICAgLy8gVGhlIHR5cGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtYXggcG9zaXRpdmUgKGEgZnVsbCBhY2NlcHQpLgotICAgIC8vCi0gICAgc3RhdGUudmFsaWQoYXQsIHBhc3NlZCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTWF4V2l0aEJsb2NrLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L01heFdpdGhCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTg0NDk5Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTWF4V2l0aEJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLndvcmtmbG93OwotCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldEFwcHJvdmFsOwotCi0vKioKLSAqIENvbXB1dGVzIGFuIHtAbGluayBBcHByb3ZhbENhdGVnb3J5fSBieSBsb29raW5nIGF0IG1heGltdW0gdmFsdWVzLgotICogPHA+Ci0gKiBJbiBvcmRlciB0byBiZSBjb25zaWRlcmVkICJhcHByb3ZlZCIgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0OgotICogPHVsPgotICogPGxpPlRoZSBtYXhpbXVtIG5lZ2F0aXZlIHZhbHVlIGlzIG5ldmVyIHVzZWQ7PC9saT4KLSAqIDxsaT5UaGUgbWF4aW11bSBwb3NpdGl2ZSB2YWx1ZSBpcyB1c2VkIGF0IGxlYXN0IG9uY2U7PC9saT4KLSAqIDxsaT5UaGUgdXNlciBhcHByb3ZpbmcgdGhlIG1heGltdW0gcG9zaXRpdmUgaGFzIGJlZW4gZ3JhbnRlZCB0aGF0LjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHJldmlldyBmaWVsZHMsIHdpdGggdmFsdWVzIHN1Y2ggYXM6Ci0gKiA8dWw+Ci0gKiA8bGk+KzI6IEFwcHJvdmVkIGNoYW5nZS48L2xpPgotICogPGxpPisxOiBMb29rcyBvaywgYnV0IGdldCBhbm90aGVyIGFwcHJvdmFsIGZyb20gc29tZW9uZSB3aXRoIG1vcmUgZGVwdGguPC9saT4KLSAqIDxsaT4tMTogU29mdCByZWplY3QsIGl0IGlzbid0IGEgZ3JlYXQgY2hhbmdlIGJ1dCBpdHMgT0sgaWYgYXBwcm92ZWQuPC9saT4KLSAqIDxsaT4tMjogUmVqZWN0ZWQsIG11c3Qgbm90IGJlIHN1Ym1pdHRlZC4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIE5vdGUgdGhhdCBwcm9qZWN0cyB1c2luZyB0aGlzIGZ1bmN0aW9uIHdvdWxkIHR5cGljYWxseSB3YW50IHRvIGFzc2lnbiBvdXQgdGhlCi0gKiBtaWRkbGUgcmFuZ2UgKC0xIC4uICsxKSB0byBhbG1vc3QgZXZlcnlvbmUsIHNvIHBlb3BsZSBjYW4gaW5kaWNhdGUgaG93IHRoZXkKLSAqIGZlZWwgYWJvdXQgYSBjaGFuZ2UsIGJ1dCB0aGUgZXh0cmVtZXMgb2YgLTIgYW5kICsyIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgdGhlCi0gKiBwcm9qZWN0J3MgbG9uZy10ZXJtIG1haW50YWluZXJzLCB0aG9zZSB3aG8gYXJlIG1vc3QgZmFtaWxpYXIgd2l0aCBpdHMgY29kZS4KLSAqLwotcHVibGljIGNsYXNzIE1heFdpdGhCbG9jayBleHRlbmRzIENhdGVnb3J5RnVuY3Rpb24gewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FID0gIk1heFdpdGhCbG9jayI7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBBcHByb3ZhbFR5cGUgYXQsIGZpbmFsIEZ1bmN0aW9uU3RhdGUgc3RhdGUpIHsKLSAgICBib29sZWFuIHJlamVjdGVkID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBwYXNzZWQgPSBmYWxzZTsKLSAgICBmb3IgKGZpbmFsIFBhdGNoU2V0QXBwcm92YWwgYSA6IHN0YXRlLmdldEFwcHJvdmFscyhhdCkpIHsKLSAgICAgIHN0YXRlLm5vcm1hbGl6ZShhdCwgYSk7Ci0KLSAgICAgIHJlamVjdGVkIHw9IGF0LmlzTWF4TmVnYXRpdmUoYSk7Ci0gICAgICBwYXNzZWQgfD0gYXQuaXNNYXhQb3NpdGl2ZShhKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgdHlwZSBtdXN0IG5vdCBoYXZlIGhhZCBpdHMgbWF4IG5lZ2F0aXZlIChhIGZvcmNlZnVsIHJlamVjdCkKLSAgICAvLyBhbmQgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtYXggcG9zaXRpdmUgKGEgZnVsbCBhY2NlcHQpLgotICAgIC8vCi0gICAgc3RhdGUudmFsaWQoYXQsICFyZWplY3RlZCAmJiBwYXNzZWQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L05vQmxvY2suamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTm9CbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGQwNzA1Li4wMDAwMDAwCi0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvd29ya2Zsb3cvTm9CbG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci53b3JrZmxvdzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLQotLyoqIEEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcuICovCi1wdWJsaWMgY2xhc3MgTm9CbG9jayBleHRlbmRzIENhdGVnb3J5RnVuY3Rpb24gewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FID0gIk5vQmxvY2siOwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBydW4oZmluYWwgQXBwcm92YWxUeXBlIGF0LCBmaW5hbCBGdW5jdGlvblN0YXRlIHN0YXRlKSB7Ci0gICAgc3RhdGUudmFsaWQoYXQsIHRydWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L05vT3BGdW5jdGlvbi5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci93b3JrZmxvdy9Ob09wRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3NmNjNS4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3dvcmtmbG93L05vT3BGdW5jdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci53b3JrZmxvdzsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLQotLyoqIEEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcuICovCi1wdWJsaWMgY2xhc3MgTm9PcEZ1bmN0aW9uIGV4dGVuZHMgQ2F0ZWdvcnlGdW5jdGlvbiB7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE5BTUUgPSAiTm9PcCI7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBBcHByb3ZhbFR5cGUgYXQsIGZpbmFsIEZ1bmN0aW9uU3RhdGUgc3RhdGUpIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX19sb2FkX2NvbW1pdF9sYWJlbHNfMS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX19sb2FkX2NvbW1pdF9sYWJlbHNfMS5qYXZhCmluZGV4IGEyNmE0OTIuLmJlZTA0NmMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9fbG9hZF9jb21taXRfbGFiZWxzXzEuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfX2xvYWRfY29tbWl0X2xhYmVsc18xLmphdmEKQEAgLTIsMTIgKzIsMTEgQEAKIAogcGFja2FnZSBnZXJyaXQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUGF0Y2hTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0QXBwcm92YWw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlByb2xvZ0Vudmlyb25tZW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlN0b3JlZFZhbHVlczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucXVlcnkuY2hhbmdlLkNoYW5nZURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKQEAgLTQyLDExICs0MSwxMSBAQAogCiAgICAgVGVybSBsaXN0SGVhZCA9IFByb2xvZy5OaWw7CiAgICAgdHJ5IHsKLSAgICAgIFByb2xvZ0Vudmlyb25tZW50IGVudiA9IChQcm9sb2dFbnZpcm9ubWVudCkgZW5naW5lLmNvbnRyb2w7CiAgICAgICBSZXZpZXdEYiBkYiA9IFN0b3JlZFZhbHVlcy5SRVZJRVdfREIuZ2V0KGVuZ2luZSk7CiAgICAgICBQYXRjaFNldCBwYXRjaFNldCA9IFN0b3JlZFZhbHVlcy5QQVRDSF9TRVQuZ2V0KGVuZ2luZSk7CiAgICAgICBDaGFuZ2VEYXRhIGNkID0gU3RvcmVkVmFsdWVzLkNIQU5HRV9EQVRBLmdldE9yTnVsbChlbmdpbmUpOwotICAgICAgQXBwcm92YWxUeXBlcyB0eXBlcyA9IGVudi5nZXRJbmplY3RvcigpLmdldEluc3RhbmNlKEFwcHJvdmFsVHlwZXMuY2xhc3MpOworICAgICAgTGFiZWxUeXBlcyB0eXBlcyA9CisgICAgICAgICAgU3RvcmVkVmFsdWVzLkNIQU5HRV9DT05UUk9MLmdldChlbmdpbmUpLmdldExhYmVsVHlwZXMoKTsKIAogICAgICAgSXRlcmFibGU8UGF0Y2hTZXRBcHByb3ZhbD4gYXBwcm92YWxzOwogICAgICAgaWYgKGNkICE9IG51bGwpIHsKQEAgLTYwLDE0ICs1OSwxNCBAQAogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgQXBwcm92YWxUeXBlIHQgPSB0eXBlcy5ieUlkKGEuZ2V0Q2F0ZWdvcnlJZCgpKTsKKyAgICAgICAgTGFiZWxUeXBlIHQgPSB0eXBlcy5ieUxhYmVsKGEuZ2V0TGFiZWxJZCgpKTsKICAgICAgICAgaWYgKHQgPT0gbnVsbCkgewogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgU3RydWN0dXJlVGVybSBsYWJlbFRlcm0gPSBuZXcgU3RydWN0dXJlVGVybSgKICAgICAgICAgICAgIHN5bV9sYWJlbCwKLSAgICAgICAgICAgIFN5bWJvbFRlcm0uaW50ZXJuKHQuZ2V0Q2F0ZWdvcnkoKS5nZXRMYWJlbE5hbWUoKSksCisgICAgICAgICAgICBTeW1ib2xUZXJtLmludGVybih0LmdldE5hbWUoKSksCiAgICAgICAgICAgICBuZXcgSW50ZWdlclRlcm0oYS5nZXRWYWx1ZSgpKSk7CiAKICAgICAgICAgU3RydWN0dXJlVGVybSB1c2VyVGVybSA9IG5ldyBTdHJ1Y3R1cmVUZXJtKApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2NvbW1pdF9kZWx0YV80LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY29tbWl0X2RlbHRhXzQuamF2YQppbmRleCA5Y2U3MDk4Li41MWE4NzFjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY29tbWl0X2RlbHRhXzQuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfY29tbWl0X2RlbHRhXzQuamF2YQpAQCAtMTY5LDYgKzE2OSw4IEBACiAgICAgICAgIHJldHVybiByZW5hbWU7CiAgICAgICBjYXNlIENPUElFRDoKICAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgICBjYXNlIFJFV1JJVEU6CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDaGFuZ2VUeXBlIG5vdCByZWNvZ25pemVkIik7CiAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9jb21taXRfc3RhdHNfMy5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2NvbW1pdF9zdGF0c18zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmOTk0OAotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9jb21taXRfc3RhdHNfMy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBnZXJyaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5ydWxlcy5TdG9yZWRWYWx1ZXM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlBhdGNoTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLkludGVnZXJUZXJtOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuT3BlcmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVGVybTsKKworLyoqCisgKiBFeHBvcnRzIGJhc2ljIGNvbW1pdCBzdGF0aXN0aWNzLgorICoKKyAqIDxwcmU+CisgKiAgICdjb21taXRfc3RhdHMnKC1GaWxlcywgLUluc2VydGlvbnMsIC1EZWxldGlvbnMpCisgKiA8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIFBSRURfY29tbWl0X3N0YXRzXzMgZXh0ZW5kcyBQcmVkaWNhdGUuUDMgeworICBwdWJsaWMgUFJFRF9jb21taXRfc3RhdHNfMyhUZXJtIGExLCBUZXJtIGEyLCBUZXJtIGEzLCBPcGVyYXRpb24gbikgeworICAgIGFyZzEgPSBhMTsKKyAgICBhcmcyID0gYTI7CisgICAgYXJnMyA9IGEzOworICAgIGNvbnQgPSBuOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBPcGVyYXRpb24gZXhlYyhQcm9sb2cgZW5naW5lKSB0aHJvd3MgUHJvbG9nRXhjZXB0aW9uIHsKKyAgICBlbmdpbmUuc2V0QjAoKTsKKworICAgIFRlcm0gYTEgPSBhcmcxLmRlcmVmZXJlbmNlKCk7CisgICAgVGVybSBhMiA9IGFyZzIuZGVyZWZlcmVuY2UoKTsKKyAgICBUZXJtIGEzID0gYXJnMy5kZXJlZmVyZW5jZSgpOworCisgICAgUGF0Y2hMaXN0IHBsID0gU3RvcmVkVmFsdWVzLlBBVENIX0xJU1QuZ2V0KGVuZ2luZSk7CisgICAgaWYoIWExLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybShwbC5nZXRQYXRjaGVzKCkuc2l6ZSgpIC0xKSxlbmdpbmUudHJhaWwpKSB7IC8vQWNjb3VudCBmb3IgL0NPTU1JVF9NU0cuCisgICAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICB9CisgICAgaWYoIWEyLnVuaWZ5KG5ldyBJbnRlZ2VyVGVybShwbC5nZXRJbnNlcnRpb25zKCkpLGVuZ2luZS50cmFpbCkpIHsKKyAgICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworICAgIH0KKyAgICBpZighYTMudW5pZnkobmV3IEludGVnZXJUZXJtKHBsLmdldERlbGV0aW9ucygpKSxlbmdpbmUudHJhaWwpKSB7CisgICAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnQ7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9jdXJyZW50X3VzZXJfMS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2N1cnJlbnRfdXNlcl8xLmphdmEKaW5kZXggMDlhNDZmNy4uMTE5MTFiZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2N1cnJlbnRfdXNlcl8xLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2N1cnJlbnRfdXNlcl8xLmphdmEKQEAgLTM2LDcgKzM2LDYgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3ltYm9sVGVybSB1c2VyID0gU3ltYm9sVGVybS5pbnRlcm4oInVzZXIiLCAxKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3ltYm9sVGVybSBhbm9ueW1vdXMgPSBTeW1ib2xUZXJtLmludGVybigiYW5vbnltb3VzIik7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN5bWJvbFRlcm0gcGVlckRhZW1vbiA9IFN5bWJvbFRlcm0uaW50ZXJuKCJwZWVyX2RhZW1vbiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTeW1ib2xUZXJtIHJlcGxpY2F0aW9uID0gU3ltYm9sVGVybS5pbnRlcm4oInJlcGxpY2F0aW9uIik7CiAKICAgcHVibGljIFBSRURfY3VycmVudF91c2VyXzEoVGVybSBhMSwgT3BlcmF0aW9uIG4pIHsKICAgICBhcmcxID0gYTE7CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlc18xLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlc18xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTBmZDguLjAwMDAwMDAKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX2dldF9sZWdhY3lfYXBwcm92YWxfdHlwZXNfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1wYWNrYWdlIGdlcnJpdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlByb2xvZ0Vudmlyb25tZW50OwotCi1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5JbnRlZ2VyVGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLkxpc3RUZXJtOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuT3BlcmF0aW9uOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJlZGljYXRlOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuU3RydWN0dXJlVGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlN5bWJvbFRlcm07Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogT2J0YWluIGEgbGlzdCBvZiBhcHByb3ZhbCB0eXBlcyBmcm9tIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KLSAqIDxwPgotICogVW5pZmllcyB0byBhIFByb2xvZyBsaXN0IG9mOiB7QGNvZGUgYXBwcm92YWxfdHlwZShMYWJlbCwgSWQsIEZ1biwgTWluLCBNYXgpfQotICogd2hlcmU6Ci0gKiA8dWw+Ci0gKiA8bGk+e0Bjb2RlIExhYmVsfSAtIHRoZSBuZXdlciBzdHlsZSBsYWJlbCBuYW1lPC9saT4KLSAqIDxsaT57QGNvZGUgSWR9IC0gdGhlIGxlZ2FjeSBBcHByb3ZhbENhdGVnb3J5LklkIGZyb20gdGhlIGRhdGFiYXNlPC9saT4KLSAqIDxsaT57QGNvZGUgRnVufSAtIGxlZ2FjeSBmdW5jdGlvbiBuYW1lPC9saT4KLSAqIDxsaT57QGNvZGUgTWluLCBNYXh9IC0gdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGNvbmZpZ3VyZWQgdmFsdWVzLjwvbGk+Ci0gKiA8L3VsPgotICovCi1jbGFzcyBQUkVEX2dldF9sZWdhY3lfYXBwcm92YWxfdHlwZXNfMSBleHRlbmRzIFByZWRpY2F0ZS5QMSB7Ci0gIFBSRURfZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlc18xKFRlcm0gYTEsIE9wZXJhdGlvbiBuKSB7Ci0gICAgYXJnMSA9IGExOwotICAgIGNvbnQgPSBuOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBPcGVyYXRpb24gZXhlYyhQcm9sb2cgZW5naW5lKSB0aHJvd3MgUHJvbG9nRXhjZXB0aW9uIHsKLSAgICBlbmdpbmUuc2V0QjAoKTsKLSAgICBUZXJtIGExID0gYXJnMS5kZXJlZmVyZW5jZSgpOwotCi0gICAgUHJvbG9nRW52aXJvbm1lbnQgZW52ID0gKFByb2xvZ0Vudmlyb25tZW50KSBlbmdpbmUuY29udHJvbDsKLSAgICBBcHByb3ZhbFR5cGVzIHR5cGVzID0gZW52LmdldEluamVjdG9yKCkuZ2V0SW5zdGFuY2UoQXBwcm92YWxUeXBlcy5jbGFzcyk7Ci0KLSAgICBMaXN0PEFwcHJvdmFsVHlwZT4gbGlzdCA9IHR5cGVzLmdldEFwcHJvdmFsVHlwZXMoKTsKLSAgICBUZXJtIGhlYWQgPSBQcm9sb2cuTmlsOwotICAgIGZvciAoaW50IGlkeCA9IGxpc3Quc2l6ZSgpIC0gMTsgMCA8PSBpZHg7IGlkeC0tKSB7Ci0gICAgICBoZWFkID0gbmV3IExpc3RUZXJtKGV4cG9ydChsaXN0LmdldChpZHgpKSwgaGVhZCk7Ci0gICAgfQotCi0gICAgaWYgKCFhMS51bmlmeShoZWFkLCBlbmdpbmUudHJhaWwpKSB7Ci0gICAgICByZXR1cm4gZW5naW5lLmZhaWwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbnQ7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgU3ltYm9sVGVybSBzeW1BcHByb3ZhbFR5cGUgPSBTeW1ib2xUZXJtLmludGVybigKLSAgICAgICJhcHByb3ZhbF90eXBlIiwgNSk7Ci0KLSAgc3RhdGljIFRlcm0gZXhwb3J0KEFwcHJvdmFsVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJ1Y3R1cmVUZXJtKHN5bUFwcHJvdmFsVHlwZSwKLSAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4odHlwZS5nZXRDYXRlZ29yeSgpLmdldExhYmVsTmFtZSgpKSwKLSAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4odHlwZS5nZXRDYXRlZ29yeSgpLmdldElkKCkuZ2V0KCkpLAotICAgICAgICBTeW1ib2xUZXJtLmludGVybih0eXBlLmdldENhdGVnb3J5KCkuZ2V0RnVuY3Rpb25OYW1lKCkpLAotICAgICAgICBuZXcgSW50ZWdlclRlcm0odHlwZS5nZXRNaW4oKS5nZXRWYWx1ZSgpKSwKLSAgICAgICAgbmV3IEludGVnZXJUZXJtKHR5cGUuZ2V0TWF4KCkuZ2V0VmFsdWUoKSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfZ2V0X2xlZ2FjeV9sYWJlbF90eXBlc18xLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL2phdmEvZ2Vycml0L1BSRURfZ2V0X2xlZ2FjeV9sYWJlbF90eXBlc18xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZGE3OQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9nZXRfbGVnYWN5X2xhYmVsX3R5cGVzXzEuamF2YQpAQCAtMCwwICsxLDg1IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgZ2Vycml0OworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlByb2xvZ0Vudmlyb25tZW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlN0b3JlZFZhbHVlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5JbnRlZ2VyVGVybTsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLkxpc3RUZXJtOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuT3BlcmF0aW9uOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJlZGljYXRlOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuU3RydWN0dXJlVGVybTsKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlN5bWJvbFRlcm07CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5UZXJtOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogT2J0YWluIGEgbGlzdCBvZiBsYWJlbCB0eXBlcyBmcm9tIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbi4KKyAqIDxwPgorICogVW5pZmllcyB0byBhIFByb2xvZyBsaXN0IG9mOiB7QGNvZGUgbGFiZWxfdHlwZShMYWJlbCwgRnVuLCBNaW4sIE1heCl9CisgKiB3aGVyZToKKyAqIDx1bD4KKyAqIDxsaT57QGNvZGUgTGFiZWx9IC0gdGhlIG5ld2VyIHN0eWxlIGxhYmVsIG5hbWU8L2xpPgorICogPGxpPntAY29kZSBGdW59IC0gbGVnYWN5IGZ1bmN0aW9uIG5hbWU8L2xpPgorICogPGxpPntAY29kZSBNaW4sIE1heH0gLSB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgY29uZmlndXJlZCB2YWx1ZXMuPC9saT4KKyAqIDwvdWw+CisgKi8KK2NsYXNzIFBSRURfZ2V0X2xlZ2FjeV9sYWJlbF90eXBlc18xIGV4dGVuZHMgUHJlZGljYXRlLlAxIHsKKyAgUFJFRF9nZXRfbGVnYWN5X2xhYmVsX3R5cGVzXzEoVGVybSBhMSwgT3BlcmF0aW9uIG4pIHsKKyAgICBhcmcxID0gYTE7CisgICAgY29udCA9IG47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9wZXJhdGlvbiBleGVjKFByb2xvZyBlbmdpbmUpIHRocm93cyBQcm9sb2dFeGNlcHRpb24geworICAgIGVuZ2luZS5zZXRCMCgpOworICAgIFRlcm0gYTEgPSBhcmcxLmRlcmVmZXJlbmNlKCk7CisKKyAgICBQcm9sb2dFbnZpcm9ubWVudCBlbnYgPSAoUHJvbG9nRW52aXJvbm1lbnQpIGVuZ2luZS5jb250cm9sOworICAgIFByb2plY3RTdGF0ZSBzdGF0ZSA9IGVudi5nZXRJbmplY3RvcigpLmdldEluc3RhbmNlKFByb2plY3RDYWNoZS5jbGFzcykKKyAgICAgICAgLmdldChTdG9yZWRWYWx1ZXMuQ0hBTkdFLmdldChlbmdpbmUpLmdldERlc3QoKS5nZXRQYXJlbnRLZXkoKSk7CisgICAgaWYgKHN0YXRlID09IG51bGwpIHsKKyAgICAgIHJldHVybiBlbmdpbmUuZmFpbCgpOworICAgIH0KKyAgICBMaXN0PExhYmVsVHlwZT4gbGlzdCA9IHN0YXRlLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCk7CisgICAgVGVybSBoZWFkID0gUHJvbG9nLk5pbDsKKyAgICBmb3IgKGludCBpZHggPSBsaXN0LnNpemUoKSAtIDE7IDAgPD0gaWR4OyBpZHgtLSkgeworICAgICAgaGVhZCA9IG5ldyBMaXN0VGVybShleHBvcnQobGlzdC5nZXQoaWR4KSksIGhlYWQpOworICAgIH0KKworICAgIGlmICghYTEudW5pZnkoaGVhZCwgZW5naW5lLnRyYWlsKSkgeworICAgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgfQorICAgIHJldHVybiBjb250OworICB9CisKKyAgc3RhdGljIGZpbmFsIFN5bWJvbFRlcm0gc3ltTGFiZWxUeXBlID0gU3ltYm9sVGVybS5pbnRlcm4oCisgICAgICAibGFiZWxfdHlwZSIsIDQpOworCisgIHN0YXRpYyBUZXJtIGV4cG9ydChMYWJlbFR5cGUgdHlwZSkgeworICAgIHJldHVybiBuZXcgU3RydWN0dXJlVGVybShzeW1MYWJlbFR5cGUsCisgICAgICAgIFN5bWJvbFRlcm0uaW50ZXJuKHR5cGUuZ2V0TmFtZSgpKSwKKyAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4odHlwZS5nZXRGdW5jdGlvbk5hbWUoKSksCisgICAgICAgIG5ldyBJbnRlZ2VyVGVybSh0eXBlLmdldE1pbigpLmdldFZhbHVlKCkpLAorICAgICAgICBuZXcgSW50ZWdlclRlcm0odHlwZS5nZXRNYXgoKS5nZXRWYWx1ZSgpKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9wcm9qZWN0X2RlZmF1bHRfc3VibWl0X3R5cGVfMS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9qYXZhL2dlcnJpdC9QUkVEX3Byb2plY3RfZGVmYXVsdF9zdWJtaXRfdHlwZV8xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxNzNjNwotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vamF2YS9nZXJyaXQvUFJFRF9wcm9qZWN0X2RlZmF1bHRfc3VibWl0X3R5cGVfMS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBnZXJyaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdC5TdWJtaXRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzLlN0b3JlZFZhbHVlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5PcGVyYXRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5QcmVkaWNhdGU7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2c7CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5Qcm9sb2dFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5TeW1ib2xUZXJtOworaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVGVybTsKKworcHVibGljIGNsYXNzIFBSRURfcHJvamVjdF9kZWZhdWx0X3N1Ym1pdF90eXBlXzEgZXh0ZW5kcyBQcmVkaWNhdGUuUDEgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN5bWJvbFRlcm1bXSB0ZXJtOworCisgIHN0YXRpYyB7CisgICAgU3VibWl0VHlwZVtdIHZhbCA9IFN1Ym1pdFR5cGUudmFsdWVzKCk7CisgICAgdGVybSA9IG5ldyBTeW1ib2xUZXJtW3ZhbC5sZW5ndGhdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7CisgICAgICB0ZXJtW2ldID0gU3ltYm9sVGVybS5jcmVhdGUodmFsW2ldLm5hbWUoKSk7CisgICAgfQorICB9CisKKyAgcHVibGljIFBSRURfcHJvamVjdF9kZWZhdWx0X3N1Ym1pdF90eXBlXzEoVGVybSBhMSwgT3BlcmF0aW9uIG4pIHsKKyAgICBhcmcxID0gYTE7CisgICAgY29udCA9IG47CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIE9wZXJhdGlvbiBleGVjKFByb2xvZyBlbmdpbmUpIHRocm93cyBQcm9sb2dFeGNlcHRpb24geworICAgIGVuZ2luZS5zZXRCMCgpOworICAgIFRlcm0gYTEgPSBhcmcxLmRlcmVmZXJlbmNlKCk7CisKKyAgICBDaGFuZ2VDb250cm9sIGNvbnRyb2wgPSBTdG9yZWRWYWx1ZXMuQ0hBTkdFX0NPTlRST0wuZ2V0KGVuZ2luZSk7CisgICAgU3VibWl0VHlwZSBzdWJtaXRUeXBlID0gY29udHJvbC5nZXRQcm9qZWN0KCkuZ2V0U3VibWl0VHlwZSgpOworCisgICAgaWYgKCFhMS51bmlmeSh0ZXJtW3N1Ym1pdFR5cGUub3JkaW5hbCgpXSwgZW5naW5lLnRyYWlsKSkgeworICAgICAgcmV0dXJuIGVuZ2luZS5mYWlsKCk7CisgICAgfQorICAgIHJldHVybiBjb250OworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Byb2xvZy9nZXJyaXRfY29tbW9uLnBsIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9wcm9sb2cvZ2Vycml0X2NvbW1vbi5wbAppbmRleCBhNzVhY2MwLi43MWU3MzgzIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Byb2xvZy9nZXJyaXRfY29tbW9uLnBsCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcHJvbG9nL2dlcnJpdF9jb21tb24ucGwKQEAgLTE0MCwxMiArMTQwLDEyIEBACiA6LSBwdWJsaWMgY2FuX3N1Ym1pdC8yLgogJSUKIGNhbl9zdWJtaXQoU3VibWl0UnVsZSwgUykgOi0KLSAgY2FsbF9zdWJtaXRfcnVsZShTdWJtaXRSdWxlLCBUbXApLAorICBjYWxsX3J1bGUoU3VibWl0UnVsZSwgVG1wKSwKICAgVG1wID0uLiBbc3VibWl0IHwgTHNdLAogICAoIGlzX2FsbF9vayhMcykgLT4gUyA9IG9rKFRtcCksICEgOyBTID0gbm90X3JlYWR5KFRtcCkgKS4KIAotY2FsbF9zdWJtaXRfcnVsZShQOlgsIEFyZykgOi0gISwgRiA9Li4gW1gsIEFyZ10sIFA6Ri4KLWNhbGxfc3VibWl0X3J1bGUoWCwgQXJnKSA6LSAhLCBGID0uLiBbWCwgQXJnXSwgRi4KK2NhbGxfcnVsZShQOlgsIEFyZykgOi0gISwgRiA9Li4gW1gsIEFyZ10sIFA6Ri4KK2NhbGxfcnVsZShYLCBBcmcpIDotICEsIEYgPS4uIFtYLCBBcmddLCBGLgogCiBpc19hbGxfb2soW10pLgogaXNfYWxsX29rKFtsYWJlbChfLCBvayhfXykpIHwgTHNdKSA6LSBpc19hbGxfb2soTHMpLgpAQCAtMTU1LDYgKzE1NSwyMSBAQAogCiAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCiAlJQorJSUgbG9jYXRlX2hlbHBlcgorJSUKKyUlICAgUmV0dXJucyB1c2VyOkZ1bmMgaWYgaXQgZXhpc3RzIG90aGVyd2lzZSByZXR1cm5zIGdlcnJpdDpEZWZhdWx0CisKK2xvY2F0ZV9oZWxwZXIoRnVuYywgRGVmYXVsdCwgQXJpdHksIHVzZXI6RnVuYykgOi0KKyAgICAnJGNvbXBpbGVkX3ByZWRpY2F0ZScodXNlciwgRnVuYywgQXJpdHkpLCAhLgorbG9jYXRlX2hlbHBlcihGdW5jLCBEZWZhdWx0LCBBcml0eSwgdXNlcjpGdW5jKSA6LQorICAgIGxpc3ROKEFyaXR5LCBQKSwgQyA9Li4gW0Z1bmMgfCBQXSwgY2xhdXNlKHVzZXI6QywgXyksICEuCitsb2NhdGVfaGVscGVyKEZ1bmMsIERlZmF1bHQsIF8sIGdlcnJpdDpEZWZhdWx0KS4KKworbGlzdE4oMCwgW10pLgorbGlzdE4oTiwgW198VF0pIDotIE4gPiAwLCBOMSBpcyBOIC0gMSwgbGlzdE4oTjEsIFQpLgorCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislJQogJSUgbG9jYXRlX3N1Ym1pdF9ydWxlLzE6CiAlJQogJSUgICBGaW5kcyBhIHN1Ym1pdF9ydWxlIGRlcGVuZGluZyBvbiB3aGF0IHJ1bGVzIGFyZSBhdmFpbGFibGUuCkBAIC0xNjQsMTcgKzE3OSwzMiBAQAogJSUKIAogbG9jYXRlX3N1Ym1pdF9ydWxlKFJ1bGVOYW1lKSA6LQotICAnJGNvbXBpbGVkX3ByZWRpY2F0ZScodXNlciwgc3VibWl0X3J1bGUsIDEpLAotICAhLAotICBSdWxlTmFtZSA9IHVzZXI6c3VibWl0X3J1bGUKLSAgLgotbG9jYXRlX3N1Ym1pdF9ydWxlKFJ1bGVOYW1lKSA6LQotICBjbGF1c2UodXNlcjpzdWJtaXRfcnVsZShfKSwgXyksCi0gICEsCi0gIFJ1bGVOYW1lID0gdXNlcjpzdWJtaXRfcnVsZQotICAuCi1sb2NhdGVfc3VibWl0X3J1bGUoUnVsZU5hbWUpIDotCi0gIFJ1bGVOYW1lID0gZ2Vycml0OmRlZmF1bHRfc3VibWl0LgorICBsb2NhdGVfaGVscGVyKHN1Ym1pdF9ydWxlLCBkZWZhdWx0X3N1Ym1pdCwgMSwgUnVsZU5hbWUpLgorCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUlCislJSBnZXRfc3VibWl0X3R5cGUvMjoKKyUlCislJSAgIEV4ZWN1dGVzIHRoZSBTdWJtaXRUeXBlUnVsZSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBzb2x1dGlvbgorJSUKKzotIHB1YmxpYyBnZXRfc3VibWl0X3R5cGUvMi4KKyUlCitnZXRfc3VibWl0X3R5cGUoU3VibWl0VHlwZVJ1bGUsIEEpIDotCisgIGNhbGxfcnVsZShTdWJtaXRUeXBlUnVsZSwgQSksICEuCisKKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSUKKyUlIGxvY2F0ZV9zdWJtaXRfdHlwZS8xOgorJSUKKyUlICAgRmluZHMgYSBzdWJtaXRfdHlwZV9ydWxlIGRlcGVuZGluZyBvbiB3aGF0IHJ1bGVzIGFyZSBhdmFpbGFibGUuCislJSAgIElmIG5vbmUgYXJlIGF2YWlsYWJsZSwgdXNlIHByb2plY3RfZGVmYXVsdF9zdWJtaXRfdHlwZS8xLgorJSUKKzotIHB1YmxpYyBsb2NhdGVfc3VibWl0X3R5cGUvMS4KKyUlCitsb2NhdGVfc3VibWl0X3R5cGUoUnVsZU5hbWUpIDotCisgIGxvY2F0ZV9oZWxwZXIoc3VibWl0X3R5cGUsIHByb2plY3RfZGVmYXVsdF9zdWJtaXRfdHlwZSwgMSwgUnVsZU5hbWUpLgogCiAKICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKQEAgLTE4NCwyMiArMjE0LDIyIEBACiA6LSBwdWJsaWMgZGVmYXVsdF9zdWJtaXQvMS4KICUlCiBkZWZhdWx0X3N1Ym1pdChQKSA6LQotICBnZXRfbGVnYWN5X2FwcHJvdmFsX3R5cGVzKEFwcHJvdmFsVHlwZXMpLAotICBkZWZhdWx0X3N1Ym1pdChBcHByb3ZhbFR5cGVzLCBQKS4KKyAgZ2V0X2xlZ2FjeV9sYWJlbF90eXBlcyhMYWJlbFR5cGVzKSwKKyAgZGVmYXVsdF9zdWJtaXQoTGFiZWxUeXBlcywgUCkuCiAKICUgQXBwbHkgdGhlIG9sZCAiYWxsIGFwcHJvdmFsIGNhdGVnb3JpZXMgbXVzdCBiZSBzYXRpc2ZpZWQiCi0lIGxvb3AgYnkgc2Nhbm5pbmcgb3ZlciBhbGwgb2YgdGhlIGFwcHJvdmFsIHR5cGVzIHRvIGJ1aWxkCi0lIHVwIHRoZSBzdWJtaXQgcmVjb3JkLgorJSBsb29wIGJ5IHNjYW5uaW5nIG92ZXIgYWxsIG9mIHRoZSBsYWJlbCB0eXBlcyB0byBidWlsZCB1cCB0aGUKKyUgc3VibWl0IHJlY29yZC4KICUKLWRlZmF1bHRfc3VibWl0KEFwcHJvdmFsVHlwZXMsIFApIDotCi0gIGRlZmF1bHRfc3VibWl0KEFwcHJvdmFsVHlwZXMsIFtdLCBUbXApLAorZGVmYXVsdF9zdWJtaXQoTGFiZWxUeXBlcywgUCkgOi0KKyAgZGVmYXVsdF9zdWJtaXQoTGFiZWxUeXBlcywgW10sIFRtcCksCiAgIHJldmVyc2UoVG1wLCBMcyksCiAgIFAgPS4uIFsgc3VibWl0IHwgTHNdLgogCiBkZWZhdWx0X3N1Ym1pdChbXSwgT3V0LCBPdXQpLgogZGVmYXVsdF9zdWJtaXQoW1R5cGUgfCBUeXBlc10sIFRtcCwgT3V0KSA6LQotICBhcHByb3ZhbF90eXBlKExhYmVsLCBJZCwgRnVuLCBNaW4sIE1heCkgPSBUeXBlLAotICBsZWdhY3lfc3VibWl0X3J1bGUoRnVuLCBMYWJlbCwgSWQsIE1pbiwgTWF4LCBTdGF0dXMpLAorICBsYWJlbF90eXBlKExhYmVsLCBGdW4sIE1pbiwgTWF4KSA9IFR5cGUsCisgIGxlZ2FjeV9zdWJtaXRfcnVsZShGdW4sIExhYmVsLCBNaW4sIE1heCwgU3RhdHVzKSwKICAgUiA9IGxhYmVsKExhYmVsLCBTdGF0dXMpLAogICBkZWZhdWx0X3N1Ym1pdChUeXBlcywgW1IgfCBUbXBdLCBPdXQpLgogCkBAIC0yMDgsMTIgKzIzOCwxMSBAQAogJSUKICUlIEFwcGx5IHRoZSBvbGQgLTIuLisyIHN0eWxlIGxvZ2ljLgogJSUKLWxlZ2FjeV9zdWJtaXRfcnVsZSgnTWF4V2l0aEJsb2NrJywgTGFiZWwsIElkLCBNaW4sIE1heCwgVCkgOi0gISwgbWF4X3dpdGhfYmxvY2soTGFiZWwsIE1pbiwgTWF4LCBUKS4KLWxlZ2FjeV9zdWJtaXRfcnVsZSgnTWF4Tm9CbG9jaycsIExhYmVsLCBJZCwgTWluLCBNYXgsIFQpIDotICEsIG1heF9ub19ibG9jayhMYWJlbCwgTWF4LCBUKS4KLWxlZ2FjeV9zdWJtaXRfcnVsZSgnTm9CbG9jaycsIExhYmVsLCBJZCwgTWluLCBNYXgsIFQpIDotICEsIFQgPSBtYXkoXykuCi1sZWdhY3lfc3VibWl0X3J1bGUoJ05vT3AnLCBMYWJlbCwgSWQsIE1pbiwgTWF4LCBUKSA6LSAhLCBUID0gbWF5KF8pLgotbGVnYWN5X3N1Ym1pdF9ydWxlKEZ1biwgTGFiZWwsIElkLCBNaW4sIE1heCwgVCkgOi0gVCA9IGltcG9zc2libGUodW5zdXBwb3J0ZWQoRnVuKSkuCi0KK2xlZ2FjeV9zdWJtaXRfcnVsZSgnTWF4V2l0aEJsb2NrJywgTGFiZWwsIE1pbiwgTWF4LCBUKSA6LSAhLCBtYXhfd2l0aF9ibG9jayhMYWJlbCwgTWluLCBNYXgsIFQpLgorbGVnYWN5X3N1Ym1pdF9ydWxlKCdNYXhOb0Jsb2NrJywgTGFiZWwsIE1pbiwgTWF4LCBUKSA6LSAhLCBtYXhfbm9fYmxvY2soTGFiZWwsIE1heCwgVCkuCitsZWdhY3lfc3VibWl0X3J1bGUoJ05vQmxvY2snLCBMYWJlbCwgTWluLCBNYXgsIFQpIDotICEsIFQgPSBtYXkoXykuCitsZWdhY3lfc3VibWl0X3J1bGUoJ05vT3AnLCBMYWJlbCwgTWluLCBNYXgsIFQpIDotICEsIFQgPSBtYXkoXykuCitsZWdhY3lfc3VibWl0X3J1bGUoRnVuLCBMYWJlbCwgTWluLCBNYXgsIFQpIDotIFQgPSBpbXBvc3NpYmxlKHVuc3VwcG9ydGVkKEZ1bikpLgogCiAlJSBtYXhfd2l0aF9ibG9jazoKICUlCkBAIC0yMjIsNiArMjUxLDEwIEBACiAlJQogOi0gcHVibGljIG1heF93aXRoX2Jsb2NrLzQuCiAlJQorbWF4X3dpdGhfYmxvY2soTWluLCBNYXgsIExhYmVsLCBsYWJlbChMYWJlbCwgUykpIDotCisgIG51bWJlcihNaW4pLCBudW1iZXIoTWF4KSwgYXRvbShMYWJlbCksCisgICEsCisgIG1heF93aXRoX2Jsb2NrKExhYmVsLCBNaW4sIE1heCwgUykuCiBtYXhfd2l0aF9ibG9jayhMYWJlbCwgTWluLCBNYXgsIHJlamVjdChXaG8pKSA6LQogICBjaGVja19sYWJlbF9yYW5nZV9wZXJtaXNzaW9uKExhYmVsLCBNaW4sIG9rKFdobykpLAogICAhCkBAIC0zMDYsNiArMzM5LDE3IEBACiBjYWxsX3N1Ym1pdF9maWx0ZXIoUDpYLCBSLCBTKSA6LSAhLCBGID0uLiBbWCwgUiwgU10sIFA6Ri4KIGNhbGxfc3VibWl0X2ZpbHRlcihYLCBSLCBTKSA6LSBGID0uLiBbWCwgUiwgU10sIEYuCiAKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUlCislJSBmaWx0ZXJfc3VibWl0X3R5cGVfcmVzdWx0cy8zOgorJSUKKyUlICAgRXhlY3V0ZXMgdGhlIHN1Ym1pdF90eXBlX2ZpbHRlciBhZ2FpbnN0IHRoZSByZXN1bHQsCislJSAgIHJldHVybnMgdGhlIGZpbHRlcmVkIHJlc3VsdC4KKyUlCis6LSBwdWJsaWMgZmlsdGVyX3N1Ym1pdF90eXBlX3Jlc3VsdHMvMy4KKyUlCitmaWx0ZXJfc3VibWl0X3R5cGVfcmVzdWx0cyhGaWx0ZXIsIEluLCBPdXQpIDotIGNhbGxfc3VibWl0X2ZpbHRlcihGaWx0ZXIsIEluLCBPdXQpLgorCiAKICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKICUlCkBAIC0zMTYsMTUgKzM2MCwyNiBAQAogOi0gcHVibGljIGxvY2F0ZV9zdWJtaXRfZmlsdGVyLzEuCiAlJQogbG9jYXRlX3N1Ym1pdF9maWx0ZXIoRmlsdGVyTmFtZSkgOi0KLSAgJyRjb21waWxlZF9wcmVkaWNhdGUnKHVzZXIsIHN1Ym1pdF9maWx0ZXIsIDIpLAotICAhLAotICBGaWx0ZXJOYW1lID0gdXNlcjpzdWJtaXRfZmlsdGVyCi0gIC4KLWxvY2F0ZV9zdWJtaXRfZmlsdGVyKEZpbHRlck5hbWUpIDotCi0gIGNsYXVzZSh1c2VyOnN1Ym1pdF9maWx0ZXIoXyxfKSwgXyksCi0gIEZpbHRlck5hbWUgPSB1c2VyOnN1Ym1pdF9maWx0ZXIKLSAgLgorICBsb2NhdGVfaGVscGVyKHN1Ym1pdF9maWx0ZXIsIG5vb3BfZmlsdGVyLCAyLCBGaWx0ZXJOYW1lKS4KIAorJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSUKKyUlIG5vb3BfZmlsdGVyLzI6CislJQorOi0gcHVibGljIG5vb3BfZmlsdGVyLzIuCislJQorbm9vcF9maWx0ZXIoSW4sIEluKS4KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSUKKyUlIGxvY2F0ZV9zdWJtaXRfdHlwZV9maWx0ZXIvMToKKyUlCislJSAgIEZpbmRzIGEgc3VibWl0X3R5cGVfZmlsdGVyIGlmIGF2YWlsYWJsZS4KKyUlCis6LSBwdWJsaWMgbG9jYXRlX3N1Ym1pdF90eXBlX2ZpbHRlci8xLgorJSUKK2xvY2F0ZV9zdWJtaXRfdHlwZV9maWx0ZXIoRmlsdGVyTmFtZSkgOi0KKyAgbG9jYXRlX2hlbHBlcihzdWJtaXRfdHlwZV9maWx0ZXIsIG5vb3BfZmlsdGVyLCAyLCBGaWx0ZXJOYW1lKS4KIAogJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQogJSUKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlTWVzc2FnZXMucHJvcGVydGllcyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9jaGFuZ2UvQ2hhbmdlTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDVmMjNiCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL2NoYW5nZS9DaGFuZ2VNZXNzYWdlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsOCBAQAorIyBDaGFuZ2VzIHRvIHRoaXMgZmlsZSBzaG91bGQgYWxzbyBiZSBtYWRlIGluCisjIGdlcnJpdC1nd3R1aS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L2NsaWVudC9jaGFuZ2VzL0NoYW5nZU1lc3NhZ2VzLnByb3BlcnRpZXMKK3JldmVydENoYW5nZURlZmF1bHRNZXNzYWdlID0gUmV2ZXJ0IFwiezB9XCJcblxuVGhpcyByZXZlcnRzIGNvbW1pdCB7MX0uCityZXZpZXdlck5vdEZvdW5kID0gezB9IGRvZXMgbm90IGlkZW50aWZ5IGEgcmVnaXN0ZXJlZCB1c2VyIG9yIGdyb3VwCisKK2dyb3VwSXNOb3RBbGxvd2VkID0gIFRoZSBncm91cCB7MH0gY2Fubm90IGJlIGFkZGVkIGFzIHJldmlld2VyLgorZ3JvdXBIYXNUb29NYW55TWVtYmVycyA9IFRoZSBncm91cCB7MH0gaGFzIHRvbyBtYW55IG1lbWJlcnMgdG8gYWRkIHRoZW0gYWxsIGFzIHJldmlld2Vycy4KK2dyb3VwTWFueU1lbWJlcnNDb25maXJtYXRpb24gPSBUaGUgZ3JvdXAgezB9IGhhcyB7MX0gbWVtYmVycy4gRG8geW91IHdhbnQgdG8gYWRkIHRoZW0gYWxsIGFzIHJldmlld2Vycz8KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NoYW5nZVN1YmplY3Qudm0gYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9DaGFuZ2VTdWJqZWN0LnZtCmluZGV4IGE2N2MzOGMuLmFjZWMxZDEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NoYW5nZVN1YmplY3Qudm0KKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ2hhbmdlU3ViamVjdC52bQpAQCAtMzEsNyArMzEsNyBAQAogIyMgVGhlIENoYW5nZVN1YmplY3Qudm0gdGVtcGxhdGUgd2lsbCBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbWFpbAogIyMgc3ViamVjdCBsaW5lIGZvciBBTEwgZW1haWxzIHJlbGF0ZWQgdG8gY2hhbmdlcy4KICMjCi0jbWFjcm8oZWxpcHNlcyAkbGVuZ3RoICRzdHIpCi0jaWYoJHN0ci5sZW5ndGgoKSA+ICRsZW5ndGgpJHtzdHIuc3Vic3RyaW5nKDAsJGxlbmd0aCl9Li4uI2Vsc2Ukc3RyI2VuZAorI21hY3JvKGVsbGlwc2lzICRsZW5ndGggJHN0cikKKyNpZigkc3RyLmxlbmd0aCgpID4gJGxlbmd0aCkjc2V0KCRsZW5ndGggPSAkbGVuZ3RoIC0gMykke3N0ci5zdWJzdHJpbmcoMCwkbGVuZ3RoKX0uLi4jZWxzZSRzdHIjZW5kCiAjZW5kCi1DaGFuZ2UgaW4gJHByb2plY3ROYW1lLnJlcGxhY2VBbGwoJy8uKi8nLCAnLi4uJylbJGJyYW5jaC5zaG9ydE5hbWVdOiAjZWxpcHNlcyg2MCwgJGNoYW5nZS5zdWJqZWN0KQorQ2hhbmdlIGluICRwcm9qZWN0TmFtZS5yZXBsYWNlQWxsKCcvLiovJywgJy4uLicpWyRicmFuY2guc2hvcnROYW1lXTogI2VsbGlwc2lzKDYzLCAkY2hhbmdlLnN1YmplY3QpCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50LnZtIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvQ29tbWVudC52bQppbmRleCA5YWY5OGE2Li5lNjQ2NzdkIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50LnZtCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1lbnQudm0KQEAgLTMwLDkgKzMwLDkgQEAKICMjIC0tLS0tLS0tLS0tLS0tCiAjIyBUaGUgQ29tbWVudC52bSB0ZW1wbGF0ZSB3aWxsIGRldGVybWluZSB0aGUgY29udGVudHMgb2YgdGhlIGVtYWlsIHJlbGF0ZWQgdG8KICMjIGEgdXNlciBzdWJtaXR0aW5nIGNvbW1lbnRzIG9uIGNoYW5nZXMuICBJdCBpcyBhIENoYW5nZUVtYWlsOiBzZWUKLSMjIENoYW5nZVN1YmplY3Qudm0gYW5kIENoYW5nZUZvb3Rlci52bS4KKyMjIENoYW5nZVN1YmplY3Qudm0sIENoYW5nZUZvb3Rlci52bSBhbmQgQ29tbWVudEZvb3Rlci52bS4KICMjCi0jaWYgKCRlbWFpbC5jb3ZlckxldHRlciB8fCAkZW1haWwuaW5saW5lQ29tbWVudHMpCisjaWYgKCRlbWFpbC5jb3ZlckxldHRlciB8fCAkZW1haWwuaGFzSW5saW5lQ29tbWVudHMoKSkKICRmcm9tTmFtZSBoYXMgcG9zdGVkIGNvbW1lbnRzIG9uIHRoaXMgY2hhbmdlLgogCiBDaGFuZ2Ugc3ViamVjdDogJGNoYW5nZS5zdWJqZWN0CkBAIC00NSw5ICs0NSw5IEBACiAjZW5kCiAjIwogIyMgSXQgaXMgcG9zc2libGUgdG8gaW5jcmVhc2UgdGhlIHNwYW4gb2YgdGhlIHF1b3RlZCBsaW5lcyBieSB1c2luZyB0aGUgbGluZQotIyMgY291bnQgcGFyYW1ldGVyIHdoZW4gY2FsbGluZyAkZW1haWwuaW5saW5lQ29tbWVudHMgYXMgYSBmdW5jdGlvbi4KKyMjIGNvdW50IHBhcmFtZXRlciB3aGVuIGNhbGxpbmcgJGVtYWlsLmdldElubGluZUNvbW1lbnRzIGFzIGEgZnVuY3Rpb24uCiAjIwotIyMgRXhhbXBsZTogI2lmKCRlbWFpbC5pbmxpbmVDb21tZW50cykkZW1haWwuZ2V0SW5saW5lQ29tbWVudHMoNSkjZW5kCisjIyBFeGFtcGxlOiAjaWYoJGVtYWlsLmhhc0lubGluZUNvbW1lbnRzKCkpJGVtYWlsLmdldElubGluZUNvbW1lbnRzKDUpI2VuZAogIyMKLSNpZigkZW1haWwuaW5saW5lQ29tbWVudHMpJGVtYWlsLmlubGluZUNvbW1lbnRzI2VuZAorI2lmKCRlbWFpbC5oYXNJbmxpbmVDb21tZW50cygpKSRlbWFpbC5pbmxpbmVDb21tZW50cyNlbmQKICNlbmQKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1lbnRGb290ZXIudm0gYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50Rm9vdGVyLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODMyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21tZW50Rm9vdGVyLnZtCkBAIC0wLDAgKzEsNDAgQEAKKyMjIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIworIyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjIworIyMgVGVtcGxhdGUgVHlwZToKKyMjIC0tLS0tLS0tLS0tLS0KKyMjIFRoaXMgaXMgYSB2ZWxvY2l0eSBtYWlsIHRlbXBsYXRlLCBzZWU6IGh0dHA6Ly92ZWxvY2l0eS5hcGFjaGUub3JnIGFuZCB0aGUKKyMjIGdlcnJpdC1kb2NzOmNvbmZpZy1tYWlsLnR4dCBmb3IgbW9yZSBpbmZvIG9uIG1vZGlmeWluZyBnZXJyaXQgbWFpbCB0ZW1wbGF0ZXMuCisjIworIyMgVGVtcGxhdGUgRmlsZSBOYW1lcyBhbmQgZXh0ZW5zaW9uczoKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEdlcnJpdCB3aWxsIHVzZSB0ZW1wbGF0ZXMgZW5kaW5nIGluICIudm0iIGJ1dCB3aWxsIGlnbm9yZSB0ZW1wbGF0ZXMgZW5kaW5nCisjIyBpbiAiLnZtLmV4YW1wbGUiLiAgSWYgYSAudm0gdGVtcGxhdGUgZG9lcyBub3QgZXhpc3QsIHRoZSBkZWZhdWx0IGludGVybmFsCisjIyBnZXJyaXQgdGVtcGxhdGUgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIC52bS5leGFtcGxlIHdpbGwgYmUgdXNlZC4gIElmIHlvdQorIyMgd2FudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSwgY29weSB0aGUgLnZtLmV4YW1wbGUgZmlsZSB0byBhIC52bQorIyMgZmlsZSBhbmQgZWRpdCBpdCBhcHByb3ByaWF0ZWx5LgorIyMKKyMjIFRoaXMgVGVtcGxhdGU6CisjIyAtLS0tLS0tLS0tLS0tLQorIyMgVGhlIENvbW1lbnRGb290ZXIudm0gdGVtcGxhdGUgd2lsbCBkZXRlcm1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmb290ZXIKKyMjIHRleHQgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIGVtYWlscyByZWxhdGVkIHRvIGEgdXNlciBzdWJtaXR0aW5nIGNvbW1lbnRzCisjIyBvbiBjaGFuZ2VzLgorIyMKKyMjIFNlZSBDaGFuZ2VTdWJqZWN0LnZtIGFuZCBDaGFuZ2VGb290ZXIudm0uCisjaWYoJGVtYWlsLmhhc0lubGluZUNvbW1lbnRzKCkpCitHZXJyaXQtSGFzQ29tbWVudHM6IFllcworI2Vsc2UKK0dlcnJpdC1IYXNDb21tZW50czogTm8KKyNlbmQKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0NvbW1pdE1lc3NhZ2VFZGl0ZWQudm0gYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21taXRNZXNzYWdlRWRpdGVkLnZtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODMxMDEKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9Db21taXRNZXNzYWdlRWRpdGVkLnZtCkBAIC0wLDAgKzEsNTQgQEAKKyMjIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIworIyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMjCisjIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMjCisjIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMjCisjIworIyMgVGVtcGxhdGUgVHlwZToKKyMjIC0tLS0tLS0tLS0tLS0KKyMjIFRoaXMgaXMgYSB2ZWxvY2l0eSBtYWlsIHRlbXBsYXRlLCBzZWU6IGh0dHA6Ly92ZWxvY2l0eS5hcGFjaGUub3JnIGFuZCB0aGUKKyMjIGdlcnJpdC1kb2NzOmNvbmZpZy1tYWlsLnR4dCBmb3IgbW9yZSBpbmZvIG9uIG1vZGlmeWluZyBnZXJyaXQgbWFpbCB0ZW1wbGF0ZXMuCisjIworIyMgVGVtcGxhdGUgRmlsZSBOYW1lcyBhbmQgZXh0ZW5zaW9uczoKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIEdlcnJpdCB3aWxsIHVzZSB0ZW1wbGF0ZXMgZW5kaW5nIGluICIudm0iIGJ1dCB3aWxsIGlnbm9yZSB0ZW1wbGF0ZXMgZW5kaW5nCisjIyBpbiAiLnZtLmV4YW1wbGUiLiAgSWYgYSAudm0gdGVtcGxhdGUgZG9lcyBub3QgZXhpc3QsIHRoZSBkZWZhdWx0IGludGVybmFsCisjIyBnZXJyaXQgdGVtcGxhdGUgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIC52bS5leGFtcGxlIHdpbGwgYmUgdXNlZC4gIElmIHlvdQorIyMgd2FudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSwgY29weSB0aGUgLnZtLmV4YW1wbGUgZmlsZSB0byBhIC52bQorIyMgZmlsZSBhbmQgZWRpdCBpdCBhcHByb3ByaWF0ZWx5LgorIyMKKyMjIFRoaXMgVGVtcGxhdGU6CisjIyAtLS0tLS0tLS0tLS0tLQorIyMgVGhlIENvbW1pdE1lc3NhZ2VVcGRhdGVkLnZtIHRlbXBsYXRlIHdpbGwgZGV0ZXJtaW5lIHRoZSBjb250ZW50cyBvZiB0aGUgZW1haWwKKyMjIHJlbGF0ZWQgdG8gYSB1c2VyIGVkaXRpbmcgdGhlIGNvbW1pdCBtZXNzYWdlIGZvciBhIGNoYW5nZSB0aHJvdWdoIHRoZSBHZXJyaXQgVUkuCisjIyBJdCBpcyBhIENoYW5nZUVtYWlsOiBzZWUgQ2hhbmdlU3ViamVjdC52bSBhbmQgQ2hhbmdlRm9vdGVyLnZtLgorIyMKKyNpZigkZW1haWwucmV2aWV3ZXJOYW1lcykKK0hlbGxvICRlbWFpbC5qb2luU3RyaW5ncygkZW1haWwucmV2aWV3ZXJOYW1lcywgJywgJyksCisKK0knZCBsaWtlIHlvdSB0byByZWV4YW1pbmUgYSBjaGFuZ2UuI2lmKCRlbWFpbC5jaGFuZ2VVcmwpICBQbGVhc2UgdmlzaXQKKworICAgICRlbWFpbC5jaGFuZ2VVcmwKKwordG8gbG9vayBhdCB0aGUgbmV3IHBhdGNoIHNldCB3aXRoIGVkaXRlZCBjb21taXQgbWVzc2FnZSAoIyRwYXRjaFNldC5wYXRjaFNldElkKS4KKyNlbmQKKyNlbHNlCiskZnJvbU5hbWUgaGFzIGNyZWF0ZWQgYSBuZXcgcGF0Y2ggc2V0IGJ5IGVkaXRpbmcgdGhlIGNvbW1pdCBtZXNzYWdlIGluIEdlcnJpdCAoIyRwYXRjaFNldC5wYXRjaFNldElkKS4KKyNlbmQKKworQ2hhbmdlIHN1YmplY3Q6ICRjaGFuZ2Uuc3ViamVjdAorLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgorCiskZW1haWwuY2hhbmdlRGV0YWlsCisjaWYoJGVtYWlsLnNzaEhvc3QpCisgIGdpdCBwdWxsIHNzaDovLyRlbWFpbC5zc2hIb3N0LyRwcm9qZWN0TmFtZSAkcGF0Y2hTZXQucmVmTmFtZQorI2VuZApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VkLnZtIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvTWVyZ2VkLnZtCmluZGV4IGJjYmM3YmQuLjIyZTI5ZTggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL01lcmdlZC52bQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvbWFpbC9NZXJnZWQudm0KQEAgLTMyLDkgKzMyLDYgQEAKICMjIGEgY2hhbmdlIHN1Y2Nlc3NmdWxseSBtZXJnZWQgdG8gdGhlIGhlYWQuICBJdCBpcyBhIENoYW5nZUVtYWlsOiBzZWUKICMjIENoYW5nZVN1YmplY3Qudm0gYW5kIENoYW5nZUZvb3Rlci52bS4KICMjCi0jbWFjcm8oZWxpcHNlcyAkbGVuZ3RoICRzdHIpCi0jaWYoJHN0ci5sZW5ndGgoKSA+ICRsZW5ndGgpJHtzdHIuc3Vic3RyaW5nKDAsJGxlbmd0aCl9Li4uI2Vsc2Ukc3RyI2VuZAotI2VuZAogJGZyb21OYW1lIGhhcyBzdWJtaXR0ZWQgdGhpcyBjaGFuZ2UgYW5kIGl0IHdhcyBtZXJnZWQuCiAKIENoYW5nZSBzdWJqZWN0OiAkY2hhbmdlLnN1YmplY3QKQEAgLTQyLDMgKzM5LDcgQEAKIAogCiAkZW1haWwuY2hhbmdlRGV0YWlsJGVtYWlsLmFwcHJvdmFscworCisjaWYoJGVtYWlsLmluY2x1ZGVEaWZmKQorJGVtYWlsLlVuaWZpZWREaWZmCisjZW5kCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdG9vbHMvcm9vdC9ob29rcy9jb21taXQtbXNnIGIvZ2Vycml0LXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Rvb2xzL3Jvb3QvaG9va3MvY29tbWl0LW1zZwppbmRleCAwNjkyNmRmLi5iMjllMjVjIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdG9vbHMvcm9vdC9ob29rcy9jb21taXQtbXNnCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci90b29scy9yb290L2hvb2tzL2NvbW1pdC1tc2cKQEAgLTE1Myw3ICsxNTMsNyBAQAogCQlpZiAodW5wcmludGVkKSB7CiAJCQlwcmludCAiQ2hhbmdlLUlkOiBJJyIkaWQiJyIKIAkJfQotCX0nICIkTVNHIiA+ICRUICYmIG12ICRUICIkTVNHIiB8fCBybSAtZiAkVAorCX0nICIkTVNHIiA+ICIkVCIgJiYgbXYgIiRUIiAiJE1TRyIgfHwgcm0gLWYgIiRUIgogfQogX2dlbl9DaGFuZ2VJZElucHV0KCkgewogCWVjaG8gInRyZWUgYGdpdCB3cml0ZS10cmVlYCIKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9HZXJyaXRDb21tb25UZXN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvR2Vycml0Q29tbW9uVGVzdC5qYXZhCmluZGV4IDlmMmNjYmYuLjk4YjBiNGEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9HZXJyaXRDb21tb25UZXN0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL0dlcnJpdENvbW1vblRlc3QuamF2YQpAQCAtMTQsNjggKzE0LDExNSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnJ1bGVzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFwcHJvdmFsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQWxsUHJvamVjdHNOYW1lOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUHJvamVjdENvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdFN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIHB1YmxpYyBjbGFzcyBHZXJyaXRDb21tb25UZXN0IGV4dGVuZHMgUHJvbG9nVGVzdENhc2UgeworICBwcml2YXRlIFByb2plY3RzIHByb2plY3RzOworCiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgIHN1cGVyLnNldFVwKCk7Ci0KLSAgICBmaW5hbCBBcHByb3ZhbFR5cGVzIHR5cGVzID0gbmV3IEFwcHJvdmFsVHlwZXMoQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgY29kZVJldmlld0NhdGVnb3J5KCksCi0gICAgICAgIHZlcmlmaWVkQ2F0ZWdvcnkoKQotICAgICkpOwotCisgICAgcHJvamVjdHMgPSBuZXcgUHJvamVjdHMobmV3IExhYmVsVHlwZXMoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgY2F0ZWdvcnkoIkNvZGUtUmV2aWV3IiwKKyAgICAgICAgICAgIHZhbHVlKDIsICJMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZCIpLAorICAgICAgICAgICAgdmFsdWUoMSwgIkxvb2tzIGdvb2QgdG8gbWUsIGJ1dCBzb21lb25lIGVsc2UgbXVzdCBhcHByb3ZlIiksCisgICAgICAgICAgICB2YWx1ZSgwLCAiTm8gc2NvcmUiKSwKKyAgICAgICAgICAgIHZhbHVlKC0xLCAiSSB3b3VsZCBwcmVmZXIgdGhhdCB5b3UgZGlkbid0IHN1Ym1pdCB0aGlzIiksCisgICAgICAgICAgICB2YWx1ZSgtMiwgIkRvIG5vdCBzdWJtaXQiKSksCisgICAgICAgIGNhdGVnb3J5KCJWZXJpZmllZCIsIHZhbHVlKDEsICJWZXJpZmllZCIpLAorICAgICAgICAgICAgdmFsdWUoMCwgIk5vIHNjb3JlIiksIHZhbHVlKC0xLCAiRmFpbHMiKSkpKSk7CiAgICAgbG9hZCgiZ2Vycml0IiwgImdlcnJpdF9jb21tb25fdGVzdC5wbCIsIG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKICAgICAgIEBPdmVycmlkZQogICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewotICAgICAgICBiaW5kKEFwcHJvdmFsVHlwZXMuY2xhc3MpLnRvSW5zdGFuY2UodHlwZXMpOworICAgICAgICBiaW5kKFByb2plY3RDYWNoZS5jbGFzcykudG9JbnN0YW5jZShwcm9qZWN0cyk7CiAgICAgICB9CiAgICAgfSk7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBBcHByb3ZhbFR5cGUgY29kZVJldmlld0NhdGVnb3J5KCkgewotICAgIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ID0gY2F0ZWdvcnkoMCwgIkNSVlciLCAiQ29kZSBSZXZpZXciKTsKLSAgICBMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gdmFscyA9IG5ld0xpc3QoKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDIsICJMb29rcyBnb29kIHRvIG1lLCBhcHByb3ZlZCIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDEsICJMb29rcyBnb29kIHRvIG1lLCBidXQgc29tZW9uZSBlbHNlIG11c3QgYXBwcm92ZSIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDAsICJObyBzY29yZSIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIC0xLCAiSSB3b3VsZCBwcmVmZXIgdGhhdCB5b3UgZGlkbid0IHN1Ym1pdCB0aGlzIikpOwotICAgIHZhbHMuYWRkKHZhbHVlKGNhdCwgLTIsICJEbyBub3Qgc3VibWl0IikpOwotICAgIHJldHVybiBuZXcgQXBwcm92YWxUeXBlKGNhdCwgdmFscyk7CisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBzZXRVcEVudmlyb25tZW50KFByb2xvZ0Vudmlyb25tZW50IGVudikgeworICAgIGVudi5zZXQoU3RvcmVkVmFsdWVzLkNIQU5HRSwgbmV3IENoYW5nZSgKKyAgICAgICAgbmV3IENoYW5nZS5LZXkoIkliZWVmIiksIG5ldyBDaGFuZ2UuSWQoMSksIG5ldyBBY2NvdW50LklkKDIpLAorICAgICAgICBuZXcgQnJhbmNoLk5hbWVLZXkocHJvamVjdHMuYWxsUHJvamVjdHNOYW1lLCAibWFzdGVyIikpKTsKICAgfQogCi0gIHByaXZhdGUgc3RhdGljIEFwcHJvdmFsVHlwZSB2ZXJpZmllZENhdGVnb3J5KCkgewotICAgIEFwcHJvdmFsQ2F0ZWdvcnkgY2F0ID0gY2F0ZWdvcnkoMSwgIlZSSUYiLCAiVmVyaWZpZWQiKTsKLSAgICBMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gdmFscyA9IG5ld0xpc3QoKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDEsICJWZXJpZmllZCIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIDAsICJObyBzY29yZSIpKTsKLSAgICB2YWxzLmFkZCh2YWx1ZShjYXQsIC0xLCAiRmFpbHMiKSk7Ci0gICAgcmV0dXJuIG5ldyBBcHByb3ZhbFR5cGUoY2F0LCB2YWxzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgTGFiZWxWYWx1ZSB2YWx1ZShpbnQgdmFsdWUsIFN0cmluZyB0ZXh0KSB7CisgICAgcmV0dXJuIG5ldyBMYWJlbFZhbHVlKChzaG9ydCkgdmFsdWUsIHRleHQpOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeShpbnQgcG9zLCBTdHJpbmcgaWQsIFN0cmluZyBuYW1lKSB7Ci0gICAgQXBwcm92YWxDYXRlZ29yeSBjYXQ7Ci0gICAgY2F0ID0gbmV3IEFwcHJvdmFsQ2F0ZWdvcnkobmV3IEFwcHJvdmFsQ2F0ZWdvcnkuSWQoaWQpLCBuYW1lKTsKLSAgICBjYXQuc2V0UG9zaXRpb24oKHNob3J0KSBwb3MpOwotICAgIHJldHVybiBjYXQ7CisgIHByaXZhdGUgc3RhdGljIExhYmVsVHlwZSBjYXRlZ29yeShTdHJpbmcgbmFtZSwgTGFiZWxWYWx1ZS4uLiB2YWx1ZXMpIHsKKyAgICByZXR1cm4gbmV3IExhYmVsVHlwZShuYW1lLCBBcnJheXMuYXNMaXN0KHZhbHVlcykpOwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZT4gbmV3TGlzdCgpIHsKLSAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxBcHByb3ZhbENhdGVnb3J5VmFsdWU+KCk7Ci0gIH0KKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvamVjdHMgaW1wbGVtZW50cyBQcm9qZWN0Q2FjaGUgeworICAgIHByaXZhdGUgZmluYWwgQWxsUHJvamVjdHNOYW1lIGFsbFByb2plY3RzTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFByb2plY3RTdGF0ZSBhbGxQcm9qZWN0czsKIAotICBwcml2YXRlIHN0YXRpYyBBcHByb3ZhbENhdGVnb3J5VmFsdWUgdmFsdWUoQXBwcm92YWxDYXRlZ29yeSBjLCBpbnQgdiwgU3RyaW5nIG4pIHsKLSAgICByZXR1cm4gbmV3IEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSgKLSAgICAgICAgbmV3IEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZChjLmdldElkKCksIChzaG9ydCkgdiksCi0gICAgICAgIG4pOworICAgIHByaXZhdGUgUHJvamVjdHMoTGFiZWxUeXBlcyBsYWJlbFR5cGVzKSB7CisgICAgICBhbGxQcm9qZWN0c05hbWUgPSBuZXcgQWxsUHJvamVjdHNOYW1lKCJBbGwtUHJvamVjdHMiKTsKKyAgICAgIFByb2plY3RDb25maWcgY29uZmlnID0gbmV3IFByb2plY3RDb25maWcoYWxsUHJvamVjdHNOYW1lKTsKKyAgICAgIGNvbmZpZy5jcmVhdGVJbk1lbW9yeSgpOworICAgICAgZm9yIChMYWJlbFR5cGUgbGFiZWwgOiBsYWJlbFR5cGVzLmdldExhYmVsVHlwZXMoKSkgeworICAgICAgICBjb25maWcuZ2V0TGFiZWxTZWN0aW9ucygpLnB1dChsYWJlbC5nZXROYW1lKCksIGxhYmVsKTsKKyAgICAgIH0KKyAgICAgIGFsbFByb2plY3RzID0gbmV3IFByb2plY3RTdGF0ZSh0aGlzLCBhbGxQcm9qZWN0c05hbWUsIG51bGwsCisgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCwgY29uZmlnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvamVjdFN0YXRlIGdldEFsbFByb2plY3RzKCkgeworICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByb2plY3RTdGF0ZSBnZXQoUHJvamVjdC5OYW1lS2V5IHByb2plY3ROYW1lKSB7CisgICAgICBhc3NlcnRFcXVhbHMoYWxsUHJvamVjdHNOYW1lLCBwcm9qZWN0TmFtZSk7CisgICAgICByZXR1cm4gYWxsUHJvamVjdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXZpY3QoUHJvamVjdCBwKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoUHJvamVjdCBwKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8UHJvamVjdC5OYW1lS2V5PiBhbGwoKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEFjY291bnRHcm91cC5VVUlEPiBndWVzc1JlbGV2YW50R3JvdXBVVUlEcygpIHsKKyAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYWJsZTxQcm9qZWN0Lk5hbWVLZXk+IGJ5TmFtZShTdHJpbmcgcHJlZml4KSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZVByb2plY3QoUHJvamVjdC5OYW1lS2V5IG5ld1Byb2plY3ROYW1lKSB7CisgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9Qcm9sb2dUZXN0Q2FzZS5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1Byb2xvZ1Rlc3RDYXNlLmphdmEKaW5kZXggY2M5ZDQwZi4uODM4MDlhNCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1Byb2xvZ1Rlc3RDYXNlLmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL1Byb2xvZ1Rlc3RDYXNlLmphdmEKQEAgLTc5LDYgKzc5LDkgQEAKICAgICBtYWNoaW5lID0gUHJvbG9nTWFjaGluZUNvcHkuc2F2ZShlbnYpOwogICB9CiAKKyAgcHJvdGVjdGVkIHZvaWQgc2V0VXBFbnZpcm9ubWVudChQcm9sb2dFbnZpcm9ubWVudCBlbnYpIHsKKyAgfQorCiAgIHByaXZhdGUgUHJvbG9nTWFjaGluZUNvcHkgbmV3TWFjaGluZSgpIHsKICAgICBCdWZmZXJpbmdQcm9sb2dDb250cm9sIGN0bCA9IG5ldyBCdWZmZXJpbmdQcm9sb2dDb250cm9sKCk7CiAgICAgY3RsLnNldE1heERhdGFiYXNlU2l6ZSgxNiAqIDEwMjQpOwpAQCAtMTE3LDYgKzEyMCw3IEBACiAKICAgICBmb3IgKFRlcm0gdGVzdCA6IHRlc3RzKSB7CiAgICAgICBQcm9sb2dFbnZpcm9ubWVudCBlbnYgPSBlbnZGYWN0b3J5LmNyZWF0ZShtYWNoaW5lKTsKKyAgICAgIHNldFVwRW52aXJvbm1lbnQoZW52KTsKICAgICAgIGVudi5zZXRFbmFibGVkKFByb2xvZy5GZWF0dXJlLklPLCB0cnVlKTsKIAogICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIlByb2xvZyAlLTYwcyAuLi4iLCByZW1vdmVQYWNrYWdlKHRlc3QpKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvZ2l0L1N1Ym1vZHVsZU9wVGVzdC5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibW9kdWxlT3BUZXN0LmphdmEKaW5kZXggOGQwNjFlYi4uMzIyZmZlMiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibW9kdWxlT3BUZXN0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9naXQvU3VibW9kdWxlT3BUZXN0LmphdmEKQEAgLTE0LDEwICsxNCwxMyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmNhcHR1cmU7CiBpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5jcmVhdGVTdHJpY3RNb2NrOworaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXE7CiBpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7CiBpbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkJyYW5jaDsKQEAgLTM0LDYgKzM3LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU3RhbmRhcmRLZXlFbmNvZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCitpbXBvcnQgb3JnLmVhc3ltb2NrLkNhcHR1cmU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVCdWlsZGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVFbnRyeTsKQEAgLTQzLDYgKzQ3LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJbnNlcnRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZVcGRhdGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5SZXZXYWxrOwpAQCAtNzIsNyArNzcsNyBAQAogICBwcml2YXRlIFJldmlld0RiIHNjaGVtYTsKICAgcHJpdmF0ZSBQcm92aWRlcjxTdHJpbmc+IHVybFByb3ZpZGVyOwogICBwcml2YXRlIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOwotICBwcml2YXRlIEdpdFJlZmVyZW5jZVVwZGF0ZWQgcmVwbGljYXRpb247CisgIHByaXZhdGUgR2l0UmVmZXJlbmNlVXBkYXRlZCBnaXRSZWZVcGRhdGVkOwogCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICBAT3ZlcnJpZGUKQEAgLTg1LDIyICs5MCwyMiBAQAogICAgIHN1YnNjcmlwdGlvbnMgPSBjcmVhdGVTdHJpY3RNb2NrKFN1Ym1vZHVsZVN1YnNjcmlwdGlvbkFjY2Vzcy5jbGFzcyk7CiAgICAgdXJsUHJvdmlkZXIgPSBjcmVhdGVTdHJpY3RNb2NrKFByb3ZpZGVyLmNsYXNzKTsKICAgICByZXBvTWFuYWdlciA9IGNyZWF0ZVN0cmljdE1vY2soR2l0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MpOwotICAgIHJlcGxpY2F0aW9uID0gY3JlYXRlU3RyaWN0TW9jayhHaXRSZWZlcmVuY2VVcGRhdGVkLmNsYXNzKTsKKyAgICBnaXRSZWZVcGRhdGVkID0gY3JlYXRlU3RyaWN0TW9jayhHaXRSZWZlcmVuY2VVcGRhdGVkLmNsYXNzKTsKICAgfQogCiAgIHByaXZhdGUgdm9pZCBkb1JlcGxheSgpIHsKICAgICByZXBsYXkoc2NoZW1hRmFjdG9yeSwgc2NoZW1hLCBzdWJzY3JpcHRpb25zLCB1cmxQcm92aWRlciwgcmVwb01hbmFnZXIsCi0gICAgICAgIHJlcGxpY2F0aW9uKTsKKyAgICAgICAgZ2l0UmVmVXBkYXRlZCk7CiAgIH0KIAogICBwcml2YXRlIHZvaWQgZG9WZXJpZnkoKSB7CiAgICAgdmVyaWZ5KHNjaGVtYUZhY3RvcnksIHNjaGVtYSwgc3Vic2NyaXB0aW9ucywgdXJsUHJvdmlkZXIsIHJlcG9NYW5hZ2VyLAotICAgICAgICByZXBsaWNhdGlvbik7CisgICAgICAgIGdpdFJlZlVwZGF0ZWQpOwogICB9CiAKICAgLyoqCiAgICAqIEl0IHRlc3RzIFN1Ym1vZHVsZS51cGRhdGUgaW4gdGhlIHNjZW5hcmlvIGEgbWVyZ2VkIGNvbW1pdCBpcyBhbiBlbXB0eSBvbmUKLSAgICogKGl0IGRvZXMgbm90IGhhdmUgYSAuZ2l0bW9kdWxlIGZpbGUpIGFuZCB0aGUgcHJvamVjdCB0aGUgY29tbWl0IHdhcyBtZXJnZWQKKyAgICogKGl0IGRvZXMgbm90IGhhdmUgYSAuZ2l0bW9kdWxlcyBmaWxlKSBhbmQgdGhlIHByb2plY3QgdGhlIGNvbW1pdCB3YXMgbWVyZ2VkCiAgICAqIGlzIG5vdCBhIHN1Ym1vZHVsZSBvZiBvdGhlciBwcm9qZWN0LgogICAgKgogICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJZiBhbiBleGNlcHRpb24gb2NjdXJzLgpAQCAtNjAzLDE3ICs2MDgsMTcgQEAKIAogICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgY29kZVJldmlld0NvbW1pdCA9CiAgICAgICAgIG5ldyBDb2RlUmV2aWV3Q29tbWl0KHNvdXJjZU1lcmdlVGlwLnRvT2JqZWN0SWQoKSk7Ci0gICAgZmluYWwgQ2hhbmdlIHN1Ym1pdGVkQ2hhbmdlID0KKyAgICBmaW5hbCBDaGFuZ2Ugc3VibWl0dGVkQ2hhbmdlID0KICAgICAgICAgbmV3IENoYW5nZShuZXcgQ2hhbmdlLktleShzb3VyY2VNZXJnZVRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSwKICAgICAgICAgICAgIG5ldyBDaGFuZ2UuSWQoMSksIG5ldyBBY2NvdW50LklkKDEpLCBzb3VyY2VCcmFuY2hOYW1lS2V5KTsKLSAgICBjb2RlUmV2aWV3Q29tbWl0LmNoYW5nZSA9IHN1Ym1pdGVkQ2hhbmdlOworICAgIGNvZGVSZXZpZXdDb21taXQuY2hhbmdlID0gc3VibWl0dGVkQ2hhbmdlOwogCiAgICAgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gbWVyZ2VkQ29tbWl0cyA9CiAgICAgICAgIG5ldyBIYXNoTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4oKTsKICAgICBtZXJnZWRDb21taXRzLnB1dChjb2RlUmV2aWV3Q29tbWl0LmNoYW5nZS5nZXRJZCgpLCBjb2RlUmV2aWV3Q29tbWl0KTsKIAotICAgIGZpbmFsIExpc3Q8Q2hhbmdlPiBzdWJtaXRlZCA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlPigpOwotICAgIHN1Ym1pdGVkLmFkZChzdWJtaXRlZENoYW5nZSk7CisgICAgZmluYWwgTGlzdDxDaGFuZ2U+IHN1Ym1pdHRlZCA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlPigpOworICAgIHN1Ym1pdHRlZC5hZGQoc3VibWl0dGVkQ2hhbmdlKTsKIAogICAgIGZpbmFsIFJlcG9zaXRvcnkgdGFyZ2V0UmVwb3NpdG9yeSA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CiAgICAgZmluYWwgR2l0IHRhcmdldEdpdCA9IG5ldyBHaXQodGFyZ2V0UmVwb3NpdG9yeSk7CkBAIC02MzksOCArNjQ0LDkgQEAKICAgICBleHBlY3QocmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkodGFyZ2V0QnJhbmNoTmFtZUtleS5nZXRQYXJlbnRLZXkoKSkpCiAgICAgICAgIC5hbmRSZXR1cm4odGFyZ2V0UmVwb3NpdG9yeSk7CiAKLSAgICByZXBsaWNhdGlvbi5maXJlKHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCksCi0gICAgICAgIHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0KCkpOworICAgIENhcHR1cmU8UmVmVXBkYXRlPiBydUNhcHR1cmUgPSBuZXcgQ2FwdHVyZTxSZWZVcGRhdGU+KCk7CisgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGVxKHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCkpLAorICAgICAgICBjYXB0dXJlKHJ1Q2FwdHVyZSkpOwogCiAgICAgZXhwZWN0KHNjaGVtYS5zdWJtb2R1bGVTdWJzY3JpcHRpb25zKCkpLmFuZFJldHVybihzdWJzY3JpcHRpb25zKTsKICAgICBmaW5hbCBSZXN1bHRTZXQ8U3VibW9kdWxlU3Vic2NyaXB0aW9uPiBlbXB0eVN1YnNjcmlwdGlvbnMgPQpAQCAtNjU4LDEyICs2NjQsMTQgQEAKICAgICBmaW5hbCBTdWJtb2R1bGVPcCBzdWJtb2R1bGVPcCA9CiAgICAgICAgIG5ldyBTdWJtb2R1bGVPcChzb3VyY2VCcmFuY2hOYW1lS2V5LCBzb3VyY2VNZXJnZVRpcCwgbmV3IFJldldhbGsoCiAgICAgICAgICAgICBzb3VyY2VSZXBvc2l0b3J5KSwgdXJsUHJvdmlkZXIsIHNjaGVtYUZhY3RvcnksIHNvdXJjZVJlcG9zaXRvcnksCi0gICAgICAgICAgICBuZXcgUHJvamVjdChzb3VyY2VCcmFuY2hOYW1lS2V5LmdldFBhcmVudEtleSgpKSwgc3VibWl0ZWQsCi0gICAgICAgICAgICBtZXJnZWRDb21taXRzLCBteUlkZW50LCByZXBvTWFuYWdlciwgcmVwbGljYXRpb24pOworICAgICAgICAgICAgbmV3IFByb2plY3Qoc291cmNlQnJhbmNoTmFtZUtleS5nZXRQYXJlbnRLZXkoKSksIHN1Ym1pdHRlZCwKKyAgICAgICAgICAgIG1lcmdlZENvbW1pdHMsIG15SWRlbnQsIHJlcG9NYW5hZ2VyLCBnaXRSZWZVcGRhdGVkKTsKIAogICAgIHN1Ym1vZHVsZU9wLnVwZGF0ZSgpOwogCiAgICAgZG9WZXJpZnkoKTsKKyAgICBSZWZVcGRhdGUgcnUgPSBydUNhcHR1cmUuZ2V0VmFsdWUoKTsKKyAgICBhc3NlcnRFcXVhbHMocnUuZ2V0TmFtZSgpLCB0YXJnZXRCcmFuY2hOYW1lS2V5LmdldCgpKTsKICAgfQogCiAgIC8qKgpAQCAtNzA0LDE3ICs3MTIsMTcgQEAKIAogICAgIGZpbmFsIENvZGVSZXZpZXdDb21taXQgY29kZVJldmlld0NvbW1pdCA9CiAgICAgICAgIG5ldyBDb2RlUmV2aWV3Q29tbWl0KHNvdXJjZU1lcmdlVGlwLnRvT2JqZWN0SWQoKSk7Ci0gICAgZmluYWwgQ2hhbmdlIHN1Ym1pdGVkQ2hhbmdlID0KKyAgICBmaW5hbCBDaGFuZ2Ugc3VibWl0dGVkQ2hhbmdlID0KICAgICAgICAgbmV3IENoYW5nZShuZXcgQ2hhbmdlLktleShzb3VyY2VNZXJnZVRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSwKICAgICAgICAgICAgIG5ldyBDaGFuZ2UuSWQoMSksIG5ldyBBY2NvdW50LklkKDEpLCBzb3VyY2VCcmFuY2hOYW1lS2V5KTsKLSAgICBjb2RlUmV2aWV3Q29tbWl0LmNoYW5nZSA9IHN1Ym1pdGVkQ2hhbmdlOworICAgIGNvZGVSZXZpZXdDb21taXQuY2hhbmdlID0gc3VibWl0dGVkQ2hhbmdlOwogCiAgICAgZmluYWwgTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4gbWVyZ2VkQ29tbWl0cyA9CiAgICAgICAgIG5ldyBIYXNoTWFwPENoYW5nZS5JZCwgQ29kZVJldmlld0NvbW1pdD4oKTsKICAgICBtZXJnZWRDb21taXRzLnB1dChjb2RlUmV2aWV3Q29tbWl0LmNoYW5nZS5nZXRJZCgpLCBjb2RlUmV2aWV3Q29tbWl0KTsKIAotICAgIGZpbmFsIExpc3Q8Q2hhbmdlPiBzdWJtaXRlZCA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlPigpOwotICAgIHN1Ym1pdGVkLmFkZChzdWJtaXRlZENoYW5nZSk7CisgICAgZmluYWwgTGlzdDxDaGFuZ2U+IHN1Ym1pdHRlZCA9IG5ldyBBcnJheUxpc3Q8Q2hhbmdlPigpOworICAgIHN1Ym1pdHRlZC5hZGQoc3VibWl0dGVkQ2hhbmdlKTsKIAogICAgIGZpbmFsIFJlcG9zaXRvcnkgdGFyZ2V0UmVwb3NpdG9yeSA9IGNyZWF0ZVdvcmtSZXBvc2l0b3J5KCk7CiAgICAgZmluYWwgR2l0IHRhcmdldEdpdCA9IG5ldyBHaXQodGFyZ2V0UmVwb3NpdG9yeSk7CkBAIC03NDAsOCArNzQ4LDkgQEAKICAgICBleHBlY3QocmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkodGFyZ2V0QnJhbmNoTmFtZUtleS5nZXRQYXJlbnRLZXkoKSkpCiAgICAgICAgIC5hbmRSZXR1cm4odGFyZ2V0UmVwb3NpdG9yeSk7CiAKLSAgICByZXBsaWNhdGlvbi5maXJlKHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCksCi0gICAgICAgIHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0KCkpOworICAgIENhcHR1cmU8UmVmVXBkYXRlPiBydUNhcHR1cmUgPSBuZXcgQ2FwdHVyZTxSZWZVcGRhdGU+KCk7CisgICAgZ2l0UmVmVXBkYXRlZC5maXJlKGVxKHRhcmdldEJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCkpLAorICAgICAgICBjYXB0dXJlKHJ1Q2FwdHVyZSkpOwogCiAgICAgZXhwZWN0KHNjaGVtYS5zdWJtb2R1bGVTdWJzY3JpcHRpb25zKCkpLmFuZFJldHVybihzdWJzY3JpcHRpb25zKTsKICAgICBmaW5hbCBSZXN1bHRTZXQ8U3VibW9kdWxlU3Vic2NyaXB0aW9uPiBpbmNvcnJlY3RTdWJzY3JpcHRpb25zID0KQEAgLTc2MSwxMiArNzcwLDE0IEBACiAgICAgZmluYWwgU3VibW9kdWxlT3Agc3VibW9kdWxlT3AgPQogICAgICAgICBuZXcgU3VibW9kdWxlT3Aoc291cmNlQnJhbmNoTmFtZUtleSwgc291cmNlTWVyZ2VUaXAsIG5ldyBSZXZXYWxrKAogICAgICAgICAgICAgc291cmNlUmVwb3NpdG9yeSksIHVybFByb3ZpZGVyLCBzY2hlbWFGYWN0b3J5LCBzb3VyY2VSZXBvc2l0b3J5LAotICAgICAgICAgICAgbmV3IFByb2plY3Qoc291cmNlQnJhbmNoTmFtZUtleS5nZXRQYXJlbnRLZXkoKSksIHN1Ym1pdGVkLAotICAgICAgICAgICAgbWVyZ2VkQ29tbWl0cywgbXlJZGVudCwgcmVwb01hbmFnZXIsIHJlcGxpY2F0aW9uKTsKKyAgICAgICAgICAgIG5ldyBQcm9qZWN0KHNvdXJjZUJyYW5jaE5hbWVLZXkuZ2V0UGFyZW50S2V5KCkpLCBzdWJtaXR0ZWQsCisgICAgICAgICAgICBtZXJnZWRDb21taXRzLCBteUlkZW50LCByZXBvTWFuYWdlciwgZ2l0UmVmVXBkYXRlZCk7CiAKICAgICBzdWJtb2R1bGVPcC51cGRhdGUoKTsKIAogICAgIGRvVmVyaWZ5KCk7CisgICAgUmVmVXBkYXRlIHJ1ID0gcnVDYXB0dXJlLmdldFZhbHVlKCk7CisgICAgYXNzZXJ0RXF1YWxzKHJ1LmdldE5hbWUoKSwgdGFyZ2V0QnJhbmNoTmFtZUtleS5nZXQoKSk7CiAgIH0KIAogICAvKioKQEAgLTc4NCw3ICs3OTUsNyBAQAogICAgKiBAcGFyYW0gZ2l0TW9kdWxlc0ZpbGVDb250ZW50IFRoZSAuZ2l0bW9kdWxlcyBmaWxlIGNvbnRlbnQuIER1cmluZyB0aGUgdGVzdAogICAgKiAgICAgICAgdGhpcyBmaWxlIGlzIGNyZWF0ZWQsIHNvIHRoZSBjb21taXQgY29udGFpbmluZyBpdC4KICAgICogQHBhcmFtIHNvdXJjZUJyYW5jaE5hbWUgVGhlIGJyYW5jaCBuYW1lIG9mIHNvdXJjZSBwcm9qZWN0ICJwb2ludGVkIGJ5IgotICAgKiAgICAgICAgLmdpdG1vZHVsZSBmaWxlLgorICAgKiAgICAgICAgLmdpdG1vZHVsZXMgZmlsZS4KICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW4gZXhjZXB0aW9uIG9jY3Vycy4KICAgICovCiAgIHByaXZhdGUgdm9pZCBkb09uZVN1YnNjcmlwdGlvbkluc2VydChmaW5hbCBTdHJpbmcgZ2l0TW9kdWxlc0ZpbGVDb250ZW50LApAQCAtODE1LDcgKzgyNiw3IEBACiAgICAqIHNvdXJjZSBvZiBhbm90aGVyIHByb2plY3QgKG5vIHN1YnNjcmliZXJzIGZvdW5kIHRvIHRoaXMgcHJvamVjdCkuCiAgICAqIDwvcD4KICAgICoKLSAgICogQHBhcmFtIGdpdE1vZHVsZXNGaWxlQ29udGVudCBUaGUgLmdpdG1vZHVsZSBmaWxlIGNvbnRlbnQuCisgICAqIEBwYXJhbSBnaXRNb2R1bGVzRmlsZUNvbnRlbnQgVGhlIC5naXRtb2R1bGVzIGZpbGUgY29udGVudC4KICAgICogQHBhcmFtIG1lcmdlZEJyYW5jaCBUaGUge0BsaW5rIEJyYW5jaC5OYW1lS2V5fSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlCiAgICAqICAgICAgICBwcm9qZWN0L2JyYW5jaCB0aGUgY29tbWl0IHdhcyBtZXJnZWQuCiAgICAqIEBwYXJhbSBleHRyYWN0ZWRTdWJzY3JpcHRpb25zIFRoZSBzdWJzY3JpcHRpb24gcm93cyBleHRyYWN0ZWQgZnJvbQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9tYWlsL0Zyb21BZGRyZXNzR2VuZXJhdG9yUHJvdmlkZXJUZXN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRnJvbUFkZHJlc3NHZW5lcmF0b3JQcm92aWRlclRlc3QuamF2YQppbmRleCAyOWUzZGYwLi4yZGIyYjY3IDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRnJvbUFkZHJlc3NHZW5lcmF0b3JQcm92aWRlclRlc3QuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL21haWwvRnJvbUFkZHJlc3NHZW5lcmF0b3JQcm92aWRlclRlc3QuamF2YQpAQCAtMTAyLDEyICsxMDIsMTMgQEAKICAgcHVibGljIHZvaWQgdGVzdFVTRVJfTm9QcmVmZXJyZWRFbWFpbFVzZXIoKSB7CiAgICAgc2V0RnJvbSgiVVNFUiIpOwogCi0gICAgZmluYWwgQWNjb3VudC5JZCB1c2VyID0gdXNlcigiQSBVLiBUaG9yIiwgbnVsbCk7CisgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAiQSBVLiBUaG9yIjsKKyAgICBmaW5hbCBBY2NvdW50LklkIHVzZXIgPSB1c2VyKG5hbWUsIG51bGwpOwogCiAgICAgcmVwbGF5KGFjY291bnRDYWNoZSk7CiAgICAgZmluYWwgQWRkcmVzcyByID0gY3JlYXRlKCkuZnJvbSh1c2VyKTsKICAgICBhc3NlcnROb3ROdWxsKHIpOwotICAgIGFzc2VydEVxdWFscyhpZGVudC5nZXROYW1lKCksIHIubmFtZSk7CisgICAgYXNzZXJ0RXF1YWxzKG5hbWUsIHIubmFtZSk7CiAgICAgYXNzZXJ0RXF1YWxzKGlkZW50LmdldEVtYWlsQWRkcmVzcygpLCByLmVtYWlsKTsKICAgICB2ZXJpZnkoYWNjb3VudENhY2hlKTsKICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9wcm9qZWN0L1JlZkNvbnRyb2xUZXN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbFRlc3QuamF2YQppbmRleCBkNGIwN2FlLi41MWVhNWEyIDEwMDY0NAotLS0gYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbFRlc3QuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3Byb2plY3QvUmVmQ29udHJvbFRlc3QuamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0OwogCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlBlcm1pc3Npb24uRURJVF9UT1BJQ19OQU1FOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLkxBQkVMOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLk9XTkVSOwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5QZXJtaXNzaW9uLlBVU0g7CkBAIC0zMyw3ICszNCw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUnVsZXNDYWNoZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQ2FwYWJpbGl0eUNvbnRyb2w7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBNZW1iZXJzaGlwOwpAQCAtMjU0LDYgKzI1NCwxMzkgQEAKICAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCB2b3RlIC0yIiwgcmFuZ2UuY29udGFpbnMoLTIpKTsKICAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCB2b3RlIDIiLCByYW5nZS5jb250YWlucygyKSk7CiAgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja05vRm9yY2UoKSB7CisgICAgZ3JhbnQobG9jYWwsIFBVU0gsIGFub255bW91cywgInJlZnMvaGVhZHMvKiIpLnNldEJsb2NrKCk7CisgICAgZ3JhbnQobG9jYWwsIFBVU0gsIGRldnMsICJyZWZzL2hlYWRzLyoiKTsKKworICAgIFByb2plY3RDb250cm9sIHUgPSB1c2VyKGRldnMpOworICAgIGFzc2VydFRydWUoInUgY2FuIHB1c2giLCB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuY2FuVXBkYXRlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tGb3JjZSgpIHsKKyAgICBQZXJtaXNzaW9uUnVsZSByID0gZ3JhbnQobG9jYWwsIFBVU0gsIGFub255bW91cywgInJlZnMvaGVhZHMvKiIpOworICAgIHIuc2V0QmxvY2soKTsKKyAgICByLnNldEZvcmNlKHRydWUpOworICAgIGdyYW50KGxvY2FsLCBQVVNILCBkZXZzLCAicmVmcy9oZWFkcy8qIikuc2V0Rm9yY2UodHJ1ZSk7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBhc3NlcnRUcnVlKCJ1IGNhbiBmb3JjZSBwdXNoIiwgdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmNhbkZvcmNlVXBkYXRlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tGb3JjZVdpdGhBbGxvd05vRm9yY2VfTm90UG9zc2libGUoKSB7CisgICAgUGVybWlzc2lvblJ1bGUgciA9IGdyYW50KGxvY2FsLCBQVVNILCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKTsKKyAgICByLnNldEJsb2NrKCk7CisgICAgci5zZXRGb3JjZSh0cnVlKTsKKyAgICBncmFudChsb2NhbCwgUFVTSCwgZGV2cywgInJlZnMvaGVhZHMvKiIpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIoZGV2cyk7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3QgZm9yY2UgcHVzaCIsIHUuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5jYW5Gb3JjZVVwZGF0ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrTW9yZVNwZWNpZmljUmVmX0ZhaWxzKCkgeworICAgIGdyYW50KGxvY2FsLCBQVVNILCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBQVVNILCBkZXZzLCAicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKworICAgIFByb2plY3RDb250cm9sIHUgPSB1c2VyKGRldnMpOworICAgIGFzc2VydEZhbHNlKCJ1IGNhbid0IHB1c2giLCB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuY2FuVXBkYXRlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tMYXJnZXJTY29wZV9GYWlscygpIHsKKyAgICBncmFudChsb2NhbCwgUFVTSCwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy9tYXN0ZXIiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBQVVNILCBkZXZzLCAicmVmcy9oZWFkcy8qIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCBwdXNoIiwgdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmNhblVwZGF0ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrSW5Mb2NhbF9GYWlscygpIHsKKyAgICBncmFudChwYXJlbnQsIFBVU0gsIGFub255bW91cywgInJlZnMvaGVhZHMvKiIpLnNldEJsb2NrKCk7CisgICAgZ3JhbnQobG9jYWwsIFBVU0gsIGZpeGVycywgInJlZnMvaGVhZHMvKiIpOworCisgICAgUHJvamVjdENvbnRyb2wgZiA9IHVzZXIoZml4ZXJzKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCBwdXNoIiwgZi5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmNhblVwZGF0ZSgpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrSW5QYXJlbnRCbG9ja0luTG9jYWwoKSB7CisgICAgZ3JhbnQocGFyZW50LCBQVVNILCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KHBhcmVudCwgUFVTSCwgZGV2cywgInJlZnMvaGVhZHMvKiIpOworICAgIGdyYW50KGxvY2FsLCBQVVNILCBkZXZzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKworICAgIFByb2plY3RDb250cm9sIGQgPSB1c2VyKGRldnMpOworICAgIGFzc2VydEZhbHNlKCJ1IGNhbid0IHB1c2giLCBkLmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuY2FuVXBkYXRlKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tWaXNpYmlsaXR5QnlSZWdpc3RlcmVkVXNlcnMoKSB7CisgICAgZ3JhbnQobG9jYWwsIFJFQUQsIGFub255bW91cywgInJlZnMvaGVhZHMvKiIpLnNldEJsb2NrKCk7CisgICAgZ3JhbnQobG9jYWwsIFJFQUQsIHJlZ2lzdGVyZWQsICJyZWZzL2hlYWRzLyoiKTsKKworICAgIFByb2plY3RDb250cm9sIHUgPSB1c2VyKHJlZ2lzdGVyZWQpOworICAgIGFzc2VydFRydWUoInUgY2FuIHJlYWQiLCB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuaXNWaXNpYmxlQnlSZWdpc3RlcmVkVXNlcnMoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja0luTG9jYWxWaXNpYmlsaXR5QnlSZWdpc3RlcmVkVXNlcnNfRmFpbHMoKSB7CisgICAgZ3JhbnQocGFyZW50LCBSRUFELCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBSRUFELCByZWdpc3RlcmVkLCAicmVmcy9oZWFkcy8qIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihyZWdpc3RlcmVkKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCByZWFkIiwgdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmlzVmlzaWJsZUJ5UmVnaXN0ZXJlZFVzZXJzKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tGb3JjZUVkaXRUb3BpY05hbWUoKSB7CisgICAgZ3JhbnQobG9jYWwsIEVESVRfVE9QSUNfTkFNRSwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgRURJVF9UT1BJQ19OQU1FLCBkZXZzLCAicmVmcy9oZWFkcy8qIikuc2V0Rm9yY2UodHJ1ZSk7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBhc3NlcnRUcnVlKCJ1IGNhbiBlZGl0IHRvcGljIG5hbWUiLCB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuY2FuRm9yY2VFZGl0VG9waWNOYW1lKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgdGVzdFVuYmxvY2tJbkxvY2FsRm9yY2VFZGl0VG9waWNOYW1lX0ZhaWxzKCkgeworICAgIGdyYW50KHBhcmVudCwgRURJVF9UT1BJQ19OQU1FLCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBFRElUX1RPUElDX05BTUUsIGRldnMsICJyZWZzL2hlYWRzLyoiKS5zZXRGb3JjZSh0cnVlKTsKKworICAgIFByb2plY3RDb250cm9sIHUgPSB1c2VyKHJlZ2lzdGVyZWQpOworICAgIGFzc2VydEZhbHNlKCJ1IGNhbid0IGVkaXQgdG9waWMgbmFtZSIsIHUuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5jYW5Gb3JjZUVkaXRUb3BpY05hbWUoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja1JhbmdlKCkgeworICAgIGdyYW50KGxvY2FsLCBMQUJFTCArICJDb2RlLVJldmlldyIsIC0xLCArMSwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy8qIikuc2V0QmxvY2soKTsKKyAgICBncmFudChsb2NhbCwgTEFCRUwgKyAiQ29kZS1SZXZpZXciLCAtMiwgKzIsIGRldnMsICJyZWZzL2hlYWRzLyoiKTsKKworICAgIFByb2plY3RDb250cm9sIHUgPSB1c2VyKGRldnMpOworICAgIFBlcm1pc3Npb25SYW5nZSByYW5nZSA9IHUuY29udHJvbEZvclJlZigicmVmcy9oZWFkcy9tYXN0ZXIiKS5nZXRSYW5nZShMQUJFTCArICJDb2RlLVJldmlldyIpOworICAgIGFzc2VydFRydWUoInUgY2FuIHZvdGUgLTIiLCByYW5nZS5jb250YWlucygtMikpOworICAgIGFzc2VydFRydWUoInUgY2FuIHZvdGUgKzIiLCByYW5nZS5jb250YWlucygyKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja1JhbmdlT25Nb3JlU3BlY2lmaWNSZWZfRmFpbHMoKSB7CisgICAgZ3JhbnQobG9jYWwsIExBQkVMICsgIkNvZGUtUmV2aWV3IiwgLTEsICsxLCBhbm9ueW1vdXMsICJyZWZzL2hlYWRzLyoiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBMQUJFTCArICJDb2RlLVJldmlldyIsIC0yLCArMiwgZGV2cywgInJlZnMvaGVhZHMvbWFzdGVyIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UgPSB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuZ2V0UmFuZ2UoTEFCRUwgKyAiQ29kZS1SZXZpZXciKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCB2b3RlIC0yIiwgcmFuZ2UuY29udGFpbnMoLTIpKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCB2b3RlICsyIiwgcmFuZ2UuY29udGFpbnMoLTIpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHRlc3RVbmJsb2NrUmFuZ2VPbkxhcmdlclNjb3BlX0ZhaWxzKCkgeworICAgIGdyYW50KGxvY2FsLCBMQUJFTCArICJDb2RlLVJldmlldyIsIC0xLCArMSwgYW5vbnltb3VzLCAicmVmcy9oZWFkcy9tYXN0ZXIiKS5zZXRCbG9jaygpOworICAgIGdyYW50KGxvY2FsLCBMQUJFTCArICJDb2RlLVJldmlldyIsIC0yLCArMiwgZGV2cywgInJlZnMvaGVhZHMvKiIpOworCisgICAgUHJvamVjdENvbnRyb2wgdSA9IHVzZXIoZGV2cyk7CisgICAgUGVybWlzc2lvblJhbmdlIHJhbmdlID0gdS5jb250cm9sRm9yUmVmKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJhbmdlKExBQkVMICsgIkNvZGUtUmV2aWV3Iik7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSAtMiIsIHJhbmdlLmNvbnRhaW5zKC0yKSk7CisgICAgYXNzZXJ0RmFsc2UoInUgY2FuJ3Qgdm90ZSArMiIsIHJhbmdlLmNvbnRhaW5zKC0yKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB0ZXN0VW5ibG9ja0luTG9jYWxSYW5nZV9GYWlscygpIHsKKyAgICBncmFudChwYXJlbnQsIExBQkVMICsgIkNvZGUtUmV2aWV3IiwgLTEsIDEsIGFub255bW91cywgInJlZnMvaGVhZHMvKiIpLnNldEJsb2NrKCk7CisgICAgZ3JhbnQobG9jYWwsIExBQkVMICsgIkNvZGUtUmV2aWV3IiwgLTIsICsyLCBkZXZzLCAicmVmcy9oZWFkcy8qIik7CisKKyAgICBQcm9qZWN0Q29udHJvbCB1ID0gdXNlcihkZXZzKTsKKyAgICBQZXJtaXNzaW9uUmFuZ2UgcmFuZ2UgPSB1LmNvbnRyb2xGb3JSZWYoInJlZnMvaGVhZHMvbWFzdGVyIikuZ2V0UmFuZ2UoTEFCRUwgKyAiQ29kZS1SZXZpZXciKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCB2b3RlIC0yIiwgcmFuZ2UuY29udGFpbnMoLTIpKTsKKyAgICBhc3NlcnRGYWxzZSgidSBjYW4ndCB2b3RlIDIiLCByYW5nZS5jb250YWlucygyKSk7CisgIH0KICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICBwcml2YXRlIGZpbmFsIE1hcDxQcm9qZWN0Lk5hbWVLZXksIFByb2plY3RTdGF0ZT4gYWxsOwpAQCAtMzA3LDYgKzQ0MCwxMSBAQAogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZVByb2plY3QoUHJvamVjdC5OYW1lS2V5IG5ld1Byb2plY3ROYW1lKSB7CiAgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIFNldDxBY2NvdW50R3JvdXAuVVVJRD4gZ3Vlc3NSZWxldmFudEdyb3VwVVVJRHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgfQogICAgIH07CiAKICAgICBJbmplY3RvciBpbmplY3RvciA9IEd1aWNlLmNyZWF0ZUluamVjdG9yKG5ldyBGYWN0b3J5TW9kdWxlKCkgewpAQCAtNDE1LDcgKzU1Myw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBHcm91cE1lbWJlcnNoaXAgZ3JvdXBzOwogCiAgICAgTW9ja1VzZXIoU3RyaW5nIG5hbWUsIEFjY291bnRHcm91cC5VVUlEW10gZ3JvdXBJZCkgewotICAgICAgc3VwZXIoUmVmQ29udHJvbFRlc3QudGhpcy5jYXBhYmlsaXR5Q29udHJvbEZhY3RvcnksIEFjY2Vzc1BhdGguVU5LTk9XTik7CisgICAgICBzdXBlcihSZWZDb250cm9sVGVzdC50aGlzLmNhcGFiaWxpdHlDb250cm9sRmFjdG9yeSk7CiAgICAgICB1c2VybmFtZSA9IG5hbWU7CiAgICAgICBBcnJheUxpc3Q8QWNjb3VudEdyb3VwLlVVSUQ+IGdyb3VwSWRzID0gTGlzdHMubmV3QXJyYXlMaXN0KGdyb3VwSWQpOwogICAgICAgZ3JvdXBJZHMuYWRkKHJlZ2lzdGVyZWQpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hQ3JlYXRvclRlc3QuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYUNyZWF0b3JUZXN0LmphdmEKaW5kZXggODc1MGVlNC4uYjM3NmQxMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hQ3JlYXRvclRlc3QuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFDcmVhdG9yVGVzdC5qYXZhCkBAIC0xNCwyMyArMTQsMzEgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFR5cGVzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5BbGxQcm9qZWN0c05hbWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQudGVzdHV0aWwuSW5NZW1vcnlEYXRhYmFzZTsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5qZGJjLkpkYmNTY2hlbWE7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CiBpbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBTY2hlbWFDcmVhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBBcHByb3ZhbENhdGVnb3J5LklkIGNvZGVSZXZpZXcgPSBuZXcgQXBwcm92YWxDYXRlZ29yeS5JZCgiQ1JWVyIpOwogICBwcml2YXRlIEluTWVtb3J5RGF0YWJhc2UgZGI7CiAKICAgQE92ZXJyaWRlCkBAIC03OSw1MyArODcsNDYgQEAKICAgICBhc3NlcnRFcXVhbHMoc2l0ZVBhdGguZ2V0Q2Fub25pY2FsUGF0aCgpLCBkYi5nZXRTeXN0ZW1Db25maWcoKS5zaXRlUGF0aCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2NoZW1hX0FwcHJvdmFsQ2F0ZWdvcnlfQ29kZVJldmlldygpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBSZXZpZXdEYiBjID0gZGIuY3JlYXRlKCkub3BlbigpOworICBwcml2YXRlIExhYmVsVHlwZXMgZ2V0TGFiZWxUeXBlcygpIHRocm93cyBFeGNlcHRpb24geworICAgIGRiLmNyZWF0ZSgpOworICAgIEFsbFByb2plY3RzTmFtZSBhbGxQcm9qZWN0cyA9IGRiLmdldEluc3RhbmNlKEFsbFByb2plY3RzTmFtZS5jbGFzcyk7CisgICAgUHJvamVjdENvbmZpZyBjID0gbmV3IFByb2plY3RDb25maWcoYWxsUHJvamVjdHMpOworICAgIFJlcG9zaXRvcnkgcmVwbyA9IGRiLmdldEluc3RhbmNlKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzKQorICAgICAgICAub3BlblJlcG9zaXRvcnkoYWxsUHJvamVjdHMpOwogICAgIHRyeSB7Ci0gICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5IGNhdDsKLQotICAgICAgY2F0ID0gYy5hcHByb3ZhbENhdGVnb3JpZXMoKS5nZXQoY29kZVJldmlldyk7Ci0gICAgICBhc3NlcnROb3ROdWxsKGNhdCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoY29kZVJldmlldywgY2F0LmdldElkKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKCJDb2RlIFJldmlldyIsIGNhdC5nZXROYW1lKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKCJSIiwgY2F0LmdldEFiYnJldmlhdGVkTmFtZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscygiTWF4V2l0aEJsb2NrIiwgY2F0LmdldEZ1bmN0aW9uTmFtZSgpKTsKLSAgICAgIGFzc2VydFRydWUoY2F0LmlzQ29weU1pblNjb3JlKCkpOwotICAgICAgYXNzZXJ0VHJ1ZSgwIDw9IGNhdC5nZXRQb3NpdGlvbigpKTsKKyAgICAgIGMubG9hZChyZXBvKTsKKyAgICAgIHJldHVybiBuZXcgTGFiZWxUeXBlcygKKyAgICAgICAgICBJbW11dGFibGVMaXN0LmNvcHlPZihjLmdldExhYmVsU2VjdGlvbnMoKS52YWx1ZXMoKSkpOwogICAgIH0gZmluYWxseSB7Ci0gICAgICBjLmNsb3NlKCk7CisgICAgICByZXBvLmNsb3NlKCk7CiAgICAgfQotICAgIGFzc2VydFZhbHVlUmFuZ2UoY29kZVJldmlldywgLTIsIC0xLCAwLCAxLCAyKTsKICAgfQogCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRWYWx1ZVJhbmdlKEFwcHJvdmFsQ2F0ZWdvcnkuSWQgY2F0LCBpbnQuLi4gcmFuZ2UpCi0gICAgICB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBIYXNoU2V0PEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZS5JZD4gYWN0ID0KLSAgICAgICAgbmV3IEhhc2hTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPigpOwotICAgIGZpbmFsIFJldmlld0RiIGMgPSBkYi5vcGVuKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGZvciAoQXBwcm92YWxDYXRlZ29yeVZhbHVlIHYgOiBjLmFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZXMoKS5ieUNhdGVnb3J5KGNhdCkpIHsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh2LmdldElkKCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHYuZ2V0TmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhdCwgdi5nZXRDYXRlZ29yeUlkKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSh2LmdldE5hbWUoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIGFjdC5hZGQodi5nZXRJZCgpKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgYy5jbG9zZSgpOworICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU2NoZW1hX0xhYmVsVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBMaXN0PFN0cmluZz4gbGFiZWxzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgZm9yIChMYWJlbFR5cGUgbGFiZWwgOiBnZXRMYWJlbFR5cGVzKCkuZ2V0TGFiZWxUeXBlcygpKSB7CisgICAgICBsYWJlbHMuYWRkKGxhYmVsLmdldE5hbWUoKSk7CiAgICAgfQorICAgIGFzc2VydEVxdWFscyhJbW11dGFibGVMaXN0Lm9mKCJDb2RlLVJldmlldyIpLCBsYWJlbHMpOworICB9CiAKLSAgICBmb3IgKGludCB2YWx1ZSA6IHJhbmdlKSB7Ci0gICAgICBmaW5hbCBBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQgZXhwID0KLSAgICAgICAgICBuZXcgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkKGNhdCwgKHNob3J0KSB2YWx1ZSk7Ci0gICAgICBpZiAoIWFjdC5yZW1vdmUoZXhwKSkgewotICAgICAgICBmYWlsKCJDYXRlZ29yeSAiICsgY2F0ICsgIiBsYWNrcyB2YWx1ZSAiICsgdmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIWFjdC5pc0VtcHR5KCkpIHsKLSAgICAgIGZhaWwoIkNhdGVnb3J5ICIgKyBjYXQgKyAiIGhhcyBhZGRpdGlvbmFsIHZhbHVlczogIiArIGFjdCk7CisgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTY2hlbWFfTGFiZWxfQ29kZVJldmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgIExhYmVsVHlwZSBjb2RlUmV2aWV3ID0gZ2V0TGFiZWxUeXBlcygpLmJ5TGFiZWwoIkNvZGUtUmV2aWV3Iik7CisgICAgYXNzZXJ0Tm90TnVsbChjb2RlUmV2aWV3KTsKKyAgICBhc3NlcnRFcXVhbHMoIkNvZGUtUmV2aWV3IiwgY29kZVJldmlldy5nZXROYW1lKCkpOworICAgIGFzc2VydEVxdWFscygiQ1IiLCBjb2RlUmV2aWV3LmdldEFiYnJldmlhdGlvbigpKTsKKyAgICBhc3NlcnRFcXVhbHMoIk1heFdpdGhCbG9jayIsIGNvZGVSZXZpZXcuZ2V0RnVuY3Rpb25OYW1lKCkpOworICAgIGFzc2VydFRydWUoY29kZVJldmlldy5pc0NvcHlNaW5TY29yZSgpKTsKKyAgICBhc3NlcnRWYWx1ZVJhbmdlKGNvZGVSZXZpZXcsIDIsIDEsIDAsIC0xLCAtMik7CisgIH0KKworICBwcml2YXRlIHZvaWQgYXNzZXJ0VmFsdWVSYW5nZShMYWJlbFR5cGUgbGFiZWwsIEludGVnZXIuLi4gcmFuZ2UpIHsKKyAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChyYW5nZSksIGxhYmVsLmdldFZhbHVlc0FzTGlzdCgpKTsKKyAgICBhc3NlcnRFcXVhbHMocmFuZ2VbMF0sIEludGVnZXIudmFsdWVPZihsYWJlbC5nZXRNYXgoKS5nZXRWYWx1ZSgpKSk7CisgICAgYXNzZXJ0RXF1YWxzKHJhbmdlW3JhbmdlLmxlbmd0aCAtIDFdLAorICAgICAgSW50ZWdlci52YWx1ZU9mKGxhYmVsLmdldE1pbigpLmdldFZhbHVlKCkpKTsKKyAgICBmb3IgKExhYmVsVmFsdWUgdiA6IGxhYmVsLmdldFZhbHVlcygpKSB7CisgICAgICBhc3NlcnRGYWxzZShTdHJpbmdzLmlzTnVsbE9yRW1wdHkodi5nZXRUZXh0KCkpKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVVwZGF0ZXJUZXN0LmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3NjaGVtYS9TY2hlbWFVcGRhdGVyVGVzdC5qYXZhCmluZGV4IGNjOGQ0N2QuLmJkZDIyNTggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvc2NoZW1hL1NjaGVtYVVwZGF0ZXJUZXN0LmphdmEKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NlcnZlci9zY2hlbWEvU2NoZW1hVXBkYXRlclRlc3QuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC50ZXN0dXRpbC5Jbk1lbW9yeURhdGFiYXNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnRlc3R1dGlsLkluTWVtb3J5SDJUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlN0YXRlbWVudEV4ZWN1dG9yOwpAQCAtOTQsNiArOTUsOCBAQAogICAgICAgICBiaW5kKFN0cmluZy5jbGFzcykgLy8KICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChBbm9ueW1vdXNDb3dhcmROYW1lLmNsYXNzKSAvLwogICAgICAgICAgIC50b1Byb3ZpZGVyKEFub255bW91c0Nvd2FyZE5hbWVQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgYmluZChEYXRhU291cmNlVHlwZS5jbGFzcykudG8oSW5NZW1vcnlIMlR5cGUuY2xhc3MpOwogICAgICAgfQogICAgIH0pLmdldEluc3RhbmNlKFNjaGVtYVVwZGF0ZXIuY2xhc3MpOwogCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc2VydmVyL3V0aWwvU3VibW9kdWxlU2VjdGlvblBhcnNlclRlc3QuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9TdWJtb2R1bGVTZWN0aW9uUGFyc2VyVGVzdC5qYXZhCmluZGV4IDkzZDg2ZTUuLjcyOTRkNGMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9TdWJtb2R1bGVTZWN0aW9uUGFyc2VyVGVzdC5qYXZhCisrKyBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zZXJ2ZXIvdXRpbC9TdWJtb2R1bGVTZWN0aW9uUGFyc2VyVGVzdC5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5CbG9iQmFzZWRDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTIxNCw4ICsyMTUsOSBAQAogICAgICAgICB3aGlsZSAoZnJvbUluZGV4ID4gMCkgewogICAgICAgICAgIGZyb21JbmRleCA9IHVybEV4dHJhY3RlZFBhdGgubGFzdEluZGV4T2YoJy8nLCBmcm9tSW5kZXggLSAxKTsKICAgICAgICAgICBwcm9qZWN0TmFtZUNhbmRpZGF0ZSA9IHVybEV4dHJhY3RlZFBhdGguc3Vic3RyaW5nKGZyb21JbmRleCArIDEpOwotICAgICAgICAgIGlmIChwcm9qZWN0TmFtZUNhbmRpZGF0ZS5lbmRzV2l0aCgiLmdpdCIpKSB7Ci0gICAgICAgICAgICBwcm9qZWN0TmFtZUNhbmRpZGF0ZSA9IHByb2plY3ROYW1lQ2FuZGlkYXRlLnN1YnN0cmluZygwLCBwcm9qZWN0TmFtZUNhbmRpZGF0ZS5sZW5ndGgoKSAtIDQpOworICAgICAgICAgIGlmIChwcm9qZWN0TmFtZUNhbmRpZGF0ZS5lbmRzV2l0aChDb25zdGFudHMuRE9UX0dJVF9FWFQpKSB7CisgICAgICAgICAgICBwcm9qZWN0TmFtZUNhbmRpZGF0ZSA9IHByb2plY3ROYW1lQ2FuZGlkYXRlLnN1YnN0cmluZygwLCAvLworICAgICAgICAgICAgICAgIHByb2plY3ROYW1lQ2FuZGlkYXRlLmxlbmd0aCgpIC0gQ29uc3RhbnRzLkRPVF9HSVRfRVhULmxlbmd0aCgpKTsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKHByb2plY3ROYW1lQ2FuZGlkYXRlLmVxdWFscyhyZXBvc1RvQmVGb3VuZC5nZXQoaWQpKSkgewogICAgICAgICAgICAgZXhwZWN0KHJlcG9NYW5hZ2VyLmxpc3QoKSkuYW5kUmV0dXJuKApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5RGF0YWJhc2UuamF2YSBiL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL2dlcnJpdC90ZXN0dXRpbC9Jbk1lbW9yeURhdGFiYXNlLmphdmEKaW5kZXggYjFmOTU2Zi4uMzAzYzQ5NyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5RGF0YWJhc2UuamF2YQorKysgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvdGVzdHV0aWwvSW5NZW1vcnlEYXRhYmFzZS5qYXZhCkBAIC0xNCwxOSArMTQsMjIgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC50ZXN0dXRpbDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmluamVjdC5TY29wZXMuU0lOR0xFVE9OOworCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkN1cnJlbnRTY2hlbWFWZXJzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5TeXN0ZW1Db25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5HZXJyaXRQZXJzb25JZGVudDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuR2Vycml0UGVyc29uSWRlbnRQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZVByb3ZpZGVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFub255bW91c0Nvd2FyZE5hbWVQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuR2l0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Mb2NhbERpc2tSZXBvc2l0b3J5TWFuYWdlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkN1cnJlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5EYXRhU291cmNlVHlwZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLlNjaGVtYUNyZWF0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFWZXJzaW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLmpkYmMuRGF0YWJhc2U7CkBAIC0zNSw2ICszOCw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLlNjaGVtYUZhY3Rvcnk7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwpAQCAtODEsNiArODUsNyBAQAogICBwcml2YXRlIERhdGFiYXNlPFJldmlld0RiPiBkYXRhYmFzZTsKICAgcHJpdmF0ZSBib29sZWFuIGNyZWF0ZWQ7CiAgIHByaXZhdGUgU2NoZW1hVmVyc2lvbiBzY2hlbWFWZXJzaW9uOworICBwcml2YXRlIEluamVjdG9yIGluamVjdG9yOwogCiAgIHB1YmxpYyBJbk1lbW9yeURhdGFiYXNlKCkgdGhyb3dzIE9ybUV4Y2VwdGlvbiB7CiAgICAgdHJ5IHsKQEAgLTk2LDQ2ICsxMDEsNTQgQEAKICAgICAgIC8vCiAgICAgICBkYXRhYmFzZSA9IG5ldyBEYXRhYmFzZTxSZXZpZXdEYj4oZGF0YVNvdXJjZSwgUmV2aWV3RGIuY2xhc3MpOwogCi0gICAgICBzY2hlbWFWZXJzaW9uID0KLSAgICAgICAgICBHdWljZS5jcmVhdGVJbmplY3RvcihuZXcgQWJzdHJhY3RNb2R1bGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKLSAgICAgICAgICAgICAgaW5zdGFsbChuZXcgU2NoZW1hVmVyc2lvbi5Nb2R1bGUoKSk7CisgICAgICBpbmplY3RvciA9IEd1aWNlLmNyZWF0ZUluamVjdG9yKG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICBpbnN0YWxsKG5ldyBTY2hlbWFWZXJzaW9uLk1vZHVsZSgpKTsKIAotICAgICAgICAgICAgICBiaW5kKEZpbGUuY2xhc3MpIC8vCi0gICAgICAgICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChTaXRlUGF0aC5jbGFzcykgLy8KLSAgICAgICAgICAgICAgICAgIC50b0luc3RhbmNlKG5ldyBGaWxlKCIuIikpOworICAgICAgICAgIGJpbmQoRmlsZS5jbGFzcykgLy8KKyAgICAgICAgICAgICAgLmFubm90YXRlZFdpdGgoU2l0ZVBhdGguY2xhc3MpIC8vCisgICAgICAgICAgICAgIC50b0luc3RhbmNlKG5ldyBGaWxlKCIuIikpOwogCi0gICAgICAgICAgICAgIENvbmZpZyBjZmcgPSBuZXcgQ29uZmlnKCk7Ci0gICAgICAgICAgICAgIGNmZy5zZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJiYXNlUGF0aCIsICJnaXQiKTsKLSAgICAgICAgICAgICAgY2ZnLnNldFN0cmluZygidXNlciIsIG51bGwsICJuYW1lIiwgIkdlcnJpdCBDb2RlIFJldmlldyIpOwotICAgICAgICAgICAgICBjZmcuc2V0U3RyaW5nKCJ1c2VyIiwgbnVsbCwgImVtYWlsIiwgImdlcnJpdEBsb2NhbGhvc3QiKTsKKyAgICAgICAgICBDb25maWcgY2ZnID0gbmV3IENvbmZpZygpOworICAgICAgICAgIGNmZy5zZXRTdHJpbmcoImdlcnJpdCIsIG51bGwsICJiYXNlUGF0aCIsICJnaXQiKTsKKyAgICAgICAgICBjZmcuc2V0U3RyaW5nKCJnZXJyaXQiLCBudWxsLCAiYWxsUHJvamVjdHMiLCAiVGVzdC1Qcm9qZWN0cyIpOworICAgICAgICAgIGNmZy5zZXRTdHJpbmcoInVzZXIiLCBudWxsLCAibmFtZSIsICJHZXJyaXQgQ29kZSBSZXZpZXciKTsKKyAgICAgICAgICBjZmcuc2V0U3RyaW5nKCJ1c2VyIiwgbnVsbCwgImVtYWlsIiwgImdlcnJpdEBsb2NhbGhvc3QiKTsKIAotICAgICAgICAgICAgICBiaW5kKENvbmZpZy5jbGFzcykgLy8KLSAgICAgICAgICAgICAgICAgIC5hbm5vdGF0ZWRXaXRoKEdlcnJpdFNlcnZlckNvbmZpZy5jbGFzcykgLy8KLSAgICAgICAgICAgICAgICAgIC50b0luc3RhbmNlKGNmZyk7CisgICAgICAgICAgYmluZChDb25maWcuY2xhc3MpIC8vCisgICAgICAgICAgICAgIC5hbm5vdGF0ZWRXaXRoKEdlcnJpdFNlcnZlckNvbmZpZy5jbGFzcykgLy8KKyAgICAgICAgICAgICAgLnRvSW5zdGFuY2UoY2ZnKTsKIAotICAgICAgICAgICAgICBiaW5kKFBlcnNvbklkZW50LmNsYXNzKSAvLwotICAgICAgICAgICAgICAgICAgLmFubm90YXRlZFdpdGgoR2Vycml0UGVyc29uSWRlbnQuY2xhc3MpIC8vCi0gICAgICAgICAgICAgICAgICAudG9Qcm92aWRlcihHZXJyaXRQZXJzb25JZGVudFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgICBiaW5kKFBlcnNvbklkZW50LmNsYXNzKSAvLworICAgICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChHZXJyaXRQZXJzb25JZGVudC5jbGFzcykgLy8KKyAgICAgICAgICAgICAgLnRvUHJvdmlkZXIoR2Vycml0UGVyc29uSWRlbnRQcm92aWRlci5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgYmluZChBbGxQcm9qZWN0c05hbWUuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAudG9JbnN0YW5jZShuZXcgQWxsUHJvamVjdHNOYW1lKCJBbGwtUHJvamVjdHMiKSk7CisgICAgICAgICAgYmluZChBbGxQcm9qZWN0c05hbWUuY2xhc3MpIC8vCisgICAgICAgICAgICAgIC50b1Byb3ZpZGVyKEFsbFByb2plY3RzTmFtZVByb3ZpZGVyLmNsYXNzKTsKIAotICAgICAgICAgICAgICBiaW5kKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzKSAvLwotICAgICAgICAgICAgICAgICAgLnRvKExvY2FsRGlza1JlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzKTsKKyAgICAgICAgICBiaW5kKEdpdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzKSAvLworICAgICAgICAgICAgICAudG8oSW5NZW1vcnlSZXBvc2l0b3J5TWFuYWdlci5jbGFzcykuaW4oU0lOR0xFVE9OKTsKIAotICAgICAgICAgICAgICBiaW5kKFN0cmluZy5jbGFzcykgLy8KLSAgICAgICAgICAgICAgICAuYW5ub3RhdGVkV2l0aChBbm9ueW1vdXNDb3dhcmROYW1lLmNsYXNzKSAvLwotICAgICAgICAgICAgICAgIC50b1Byb3ZpZGVyKEFub255bW91c0Nvd2FyZE5hbWVQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSkuZ2V0QmluZGluZyhLZXkuZ2V0KFNjaGVtYVZlcnNpb24uY2xhc3MsIEN1cnJlbnQuY2xhc3MpKQotICAgICAgICAgICAgICAuZ2V0UHJvdmlkZXIoKS5nZXQoKTsKKyAgICAgICAgICBiaW5kKFN0cmluZy5jbGFzcykgLy8KKyAgICAgICAgICAgIC5hbm5vdGF0ZWRXaXRoKEFub255bW91c0Nvd2FyZE5hbWUuY2xhc3MpIC8vCisgICAgICAgICAgICAudG9Qcm92aWRlcihBbm9ueW1vdXNDb3dhcmROYW1lUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgICAgYmluZChEYXRhU291cmNlVHlwZS5jbGFzcykgLy8KKyAgICAgICAgICAgIC50byhJbk1lbW9yeUgyVHlwZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgIH0pOworICAgICAgc2NoZW1hVmVyc2lvbiA9IGluamVjdG9yLmdldEluc3RhbmNlKAorICAgICAgICAgIEtleS5nZXQoU2NoZW1hVmVyc2lvbi5jbGFzcywgQ3VycmVudC5jbGFzcykpOwogICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICB0aHJvdyBuZXcgT3JtRXhjZXB0aW9uKGUpOwogICAgIH0KICAgfQogCisgIHB1YmxpYyA8VD4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiBjbGF6eikgeworICAgIHJldHVybiBpbmplY3Rvci5nZXRJbnN0YW5jZShjbGF6eik7CisgIH0KKwogICBwdWJsaWMgRGF0YWJhc2U8UmV2aWV3RGI+IGdldERhdGFiYXNlKCkgewogICAgIHJldHVybiBkYXRhYmFzZTsKICAgfQpAQCAtMTUyLDEyICsxNjUsNyBAQAogICAgICAgZmluYWwgUmV2aWV3RGIgYyA9IG9wZW4oKTsKICAgICAgIHRyeSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgbmV3IFNjaGVtYUNyZWF0b3IoCi0gICAgICAgICAgICAgIG5ldyBGaWxlKCIuIiksCi0gICAgICAgICAgICAgIHNjaGVtYVZlcnNpb24sCi0gICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgIG5ldyBBbGxQcm9qZWN0c05hbWUoIlRlc3QtUHJvamVjdHMiKSwKLSAgICAgICAgICAgICAgbmV3IFBlcnNvbklkZW50KCJuYW1lIiwgImVtYWlsQHNpdGUiKSkuY3JlYXRlKGMpOworICAgICAgICAgIGdldEluc3RhbmNlKFNjaGVtYUNyZWF0b3IuY2xhc3MpLmNyZWF0ZShjKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgIHRocm93IG5ldyBPcm1FeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgaW4tbWVtb3J5IGRhdGFiYXNlIiwgZSk7CiAgICAgICAgIH0gY2F0Y2ggKENvbmZpZ0ludmFsaWRFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5SDJUeXBlLmphdmEgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvdGVzdHV0aWwvSW5NZW1vcnlIMlR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWE2NTM0Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5SDJUeXBlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnRlc3R1dGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5CYXNlRGF0YVNvdXJjZVR5cGU7CisKK3B1YmxpYyBjbGFzcyBJbk1lbW9yeUgyVHlwZSBleHRlbmRzIEJhc2VEYXRhU291cmNlVHlwZSB7CisKKyAgcHJvdGVjdGVkIEluTWVtb3J5SDJUeXBlKCkgeworICAgIHN1cGVyKG51bGwpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgeworICAgIC8vIG5vdCB1c2VkCisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9nZXJyaXQvdGVzdHV0aWwvSW5NZW1vcnlSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5UmVwb3NpdG9yeU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJiY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3Rlc3R1dGlsL0luTWVtb3J5UmVwb3NpdG9yeU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnRlc3R1dGlsOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTb3J0ZWRTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdpdFJlcG9zaXRvcnlNYW5hZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUmVwb3NpdG9yeUNhc2VNaXNtYXRjaEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKKworLyoqIFJlcG9zaXRvcnkgbWFuYWdlciB0aGF0IHVzZXMgaW4tbWVtb3J5IHJlcG9zaXRvcmllcy4gKi8KK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVJlcG9zaXRvcnlNYW5hZ2VyIGltcGxlbWVudHMgR2l0UmVwb3NpdG9yeU1hbmFnZXIgeworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZXNjcmlwdGlvbiBleHRlbmRzIERmc1JlcG9zaXRvcnlEZXNjcmlwdGlvbiB7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzYzsKKworICAgIHByaXZhdGUgRGVzY3JpcHRpb24oUHJvamVjdC5OYW1lS2V5IG5hbWUpIHsKKyAgICAgIHN1cGVyKG5hbWUuZ2V0KCkpOworICAgICAgZGVzYyA9ICJJbi1tZW1vcnkgcmVwb3NpdG9yeSAiICsgbmFtZS5nZXQoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBvIGV4dGVuZHMgSW5NZW1vcnlSZXBvc2l0b3J5IHsKKyAgICBwcml2YXRlIFJlcG8oUHJvamVjdC5OYW1lS2V5IG5hbWUpIHsKKyAgICAgIHN1cGVyKG5ldyBEZXNjcmlwdGlvbihuYW1lKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgcmV0dXJuIChEZXNjcmlwdGlvbikgc3VwZXIuZ2V0RGVzY3JpcHRpb24oKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlcG8+IHJlcG9zID0gTWFwcy5uZXdIYXNoTWFwKCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBSZXBvc2l0b3J5IG9wZW5SZXBvc2l0b3J5KFByb2plY3QuTmFtZUtleSBuYW1lKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgcmV0dXJuIGdldChuYW1lKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgUmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KFByb2plY3QuTmFtZUtleSBuYW1lKQorICAgICAgdGhyb3dzIFJlcG9zaXRvcnlDYXNlTWlzbWF0Y2hFeGNlcHRpb24sIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgUmVwbyByZXBvOworICAgIHRyeSB7CisgICAgICByZXBvID0gZ2V0KG5hbWUpOworICAgICAgaWYgKCFyZXBvLmdldERlc2NyaXB0aW9uKCkuZ2V0UmVwb3NpdG9yeU5hbWUoKS5lcXVhbHMobmFtZS5nZXQoKSkpIHsKKyAgICAgICAgdGhyb3cgbmV3IFJlcG9zaXRvcnlDYXNlTWlzbWF0Y2hFeGNlcHRpb24obmFtZSk7CisgICAgICB9CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHJlcG8gPSBuZXcgUmVwbyhuYW1lKTsKKyAgICAgIHJlcG9zLnB1dChuYW1lLmdldCgpLnRvTG93ZXJDYXNlKCksIHJlcG8pOworICAgIH0KKyAgICByZXR1cm4gcmVwbzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU29ydGVkU2V0PFByb2plY3QuTmFtZUtleT4gbGlzdCgpIHsKKyAgICBTb3J0ZWRTZXQ8UHJvamVjdC5OYW1lS2V5PiBuYW1lcyA9IFNldHMubmV3VHJlZVNldCgpOworICAgIGZvciAoRGZzUmVwb3NpdG9yeSByZXBvIDogcmVwb3MudmFsdWVzKCkpIHsKKyAgICAgIG5hbWVzLmFkZChuZXcgUHJvamVjdC5OYW1lS2V5KHJlcG8uZ2V0RGVzY3JpcHRpb24oKS5nZXRSZXBvc2l0b3J5TmFtZSgpKSk7CisgICAgfQorICAgIHJldHVybiBJbW11dGFibGVTb3J0ZWRTZXQuY29weU9mKG5hbWVzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3REZXNjcmlwdGlvbihQcm9qZWN0Lk5hbWVLZXkgbmFtZSkKKyAgICAgIHRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24geworICAgIHJldHVybiBnZXQobmFtZSkuZ2V0RGVzY3JpcHRpb24oKS5kZXNjOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIHNldFByb2plY3REZXNjcmlwdGlvbihQcm9qZWN0Lk5hbWVLZXkgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgdHJ5IHsKKyAgICAgIGdldChuYW1lKS5nZXREZXNjcmlwdGlvbigpLmRlc2MgPSBkZXNjcmlwdGlvbjsKKyAgICB9IGNhdGNoIChSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgLy8gSWdub3JlLgorICAgIH0KKyAgfQorCisgIHByaXZhdGUgUmVwbyBnZXQoUHJvamVjdC5OYW1lS2V5IG5hbWUpIHRocm93cyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24geworICAgIFJlcG8gcmVwbyA9IHJlcG9zLmdldChuYW1lLmdldCgpLnRvTG93ZXJDYXNlKCkpOworICAgIGlmIChyZXBvICE9IG51bGwpIHsKKyAgICAgIHJldHVybiByZXBvOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKG5hbWUuZ2V0KCkpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvZ2Vycml0X2NvbW1vbl90ZXN0LnBsIGIvZ2Vycml0LXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvY29tL2dvb2dsZS9nZXJyaXQvcnVsZXMvZ2Vycml0X2NvbW1vbl90ZXN0LnBsCmluZGV4IGRiODk5YTcuLmM5OTMzOTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbS9nb29nbGUvZ2Vycml0L3J1bGVzL2dlcnJpdF9jb21tb25fdGVzdC5wbAorKysgYi9nZXJyaXQtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9jb20vZ29vZ2xlL2dlcnJpdC9ydWxlcy9nZXJyaXRfY29tbW9uX3Rlc3QucGwKQEAgLTIyLDEzICsyMiwxMyBAQAogICBub3Rfc2FtZShsYWJlbChlLCBvayhhKSksIGxhYmVsKGUsIG9rKGIpKSkuCiAKIAotJSUgZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlcworJSUgZ2V0X2xlZ2FjeV9sYWJlbF90eXBlcwogJSUKLXRlc3QoZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlcykgOi0KLSAgZ2V0X2xlZ2FjeV9hcHByb3ZhbF90eXBlcyhUKSwKK3Rlc3QoZ2V0X2xlZ2FjeV9sYWJlbF90eXBlcykgOi0KKyAgZ2V0X2xlZ2FjeV9sYWJlbF90eXBlcyhUKSwKICAgVCA9IFtDLCBWXSwKLSAgQyA9IGFwcHJvdmFsX3R5cGUoJ0NvZGUtUmV2aWV3JywgJ0NSVlcnLCAnTWF4V2l0aEJsb2NrJywgLTIsIDIpLAotICBWID0gYXBwcm92YWxfdHlwZSgnVmVyaWZpZWQnLCAnVlJJRicsICdNYXhXaXRoQmxvY2snLCAtMSwgMSkuCisgIEMgPSBsYWJlbF90eXBlKCdDb2RlLVJldmlldycsICdNYXhXaXRoQmxvY2snLCAtMiwgMiksCisgIFYgPSBsYWJlbF90eXBlKCdWZXJpZmllZCcsICdNYXhXaXRoQmxvY2snLCAtMSwgMSkuCiAKIAogJSUgY29tbWl0X2xhYmVsCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9nZXJyaXQtc3NoZC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggNDcwOTQyZC4uOTQxZmIzMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyBiL2dlcnJpdC1zc2hkLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpAQCAtNyw2ICs3LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPWlnbm9yZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT13YXJuaW5nCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9wb20ueG1sIGIvZ2Vycml0LXNzaGQvcG9tLnhtbAppbmRleCBhMjZiMWIyLi5mMDI2OTIwIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9wb20ueG1sCisrKyBiL2dlcnJpdC1zc2hkL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC1zc2hkPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Fic3RyYWN0R2l0Q29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Fic3RyYWN0R2l0Q29tbWFuZC5qYXZhCmluZGV4IGFmNWRmMjUuLjkwZmZlYmQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9BYnN0cmFjdEdpdENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQWJzdHJhY3RHaXRDb21tYW5kLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaFNjb3BlLkNvbnRleHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5FbnZpcm9ubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CkBAIC0yOSw3ICsyOCw2IEBACiBpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHaXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQgewogICBAQXJndW1lbnQoaW5kZXggPSAwLCBtZXRhVmFyID0gIlBST0pFQ1QuZ2l0IiwgcmVxdWlyZWQgPSB0cnVlLCB1c2FnZSA9ICJwcm9qZWN0IG5hbWUiKQpAQCAtODQsMTMgKzgyLDEwIEBACiAgIH0KIAogICBwcml2YXRlIFNzaFNlc3Npb24gbmV3U2Vzc2lvbigpIHsKLSAgICByZXR1cm4gbmV3IFNzaFNlc3Npb24oc2Vzc2lvbiwgc2Vzc2lvbi5nZXRSZW1vdGVBZGRyZXNzKCksIHVzZXJGYWN0b3J5Ci0gICAgICAgIC5jcmVhdGUoQWNjZXNzUGF0aC5HSVQsIG5ldyBQcm92aWRlcjxTb2NrZXRBZGRyZXNzPigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgU29ja2V0QWRkcmVzcyBnZXQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi5nZXRSZW1vdGVBZGRyZXNzKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9LCB1c2VyLmdldEFjY291bnRJZCgpKSk7CisgICAgU3NoU2Vzc2lvbiBuID0gbmV3IFNzaFNlc3Npb24oc2Vzc2lvbiwgc2Vzc2lvbi5nZXRSZW1vdGVBZGRyZXNzKCksCisgICAgICAgIHVzZXJGYWN0b3J5LmNyZWF0ZShzZXNzaW9uLmdldFJlbW90ZUFkZHJlc3MoKSwgdXNlci5nZXRBY2NvdW50SWQoKSkpOworICAgIG4uc2V0QWNjZXNzUGF0aChBY2Nlc3NQYXRoLkdJVCk7CisgICAgcmV0dXJuIG47CiAgIH0KIAogICBwcml2YXRlIHZvaWQgc2VydmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmFpbHVyZSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQWxpYXNDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQWxpYXNDb21tYW5kLmphdmEKaW5kZXggOTU4MmM5My4uYjQ2ZmNlZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0FsaWFzQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9BbGlhc0NvbW1hbmQuamF2YQpAQCAtNjAsMjYgKzYwLDI2IEBACiAgIH0KIAogICBwcml2YXRlIHZvaWQgYmVnaW4oRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlLCBJT0V4Y2VwdGlvbiB7Ci0gICAgTWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IG1hcCA9IHJvb3QuZ2V0TWFwKCk7CisgICAgTWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBtYXAgPSByb290LmdldE1hcCgpOwogICAgIGZvciAoU3RyaW5nIG5hbWUgOiBjaGFpbihjb21tYW5kKSkgewotICAgICAgUHJvdmlkZXI8PyBleHRlbmRzIENvbW1hbmQ+IHAgPSBtYXAuZ2V0KG5hbWUpOworICAgICAgQ29tbWFuZFByb3ZpZGVyIHAgPSBtYXAuZ2V0KG5hbWUpOwogICAgICAgaWYgKHAgPT0gbnVsbCkgewogICAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKDEsIGdldE5hbWUoKSArICI6IG5vdCBmb3VuZCIpOwogICAgICAgfQogCi0gICAgICBDb21tYW5kIGNtZCA9IHAuZ2V0KCk7CisgICAgICBDb21tYW5kIGNtZCA9IHAuZ2V0UHJvdmlkZXIoKS5nZXQoKTsKICAgICAgIGlmICghKGNtZCBpbnN0YW5jZW9mIERpc3BhdGNoQ29tbWFuZCkpIHsKICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCBnZXROYW1lKCkgKyAiOiBub3QgZm91bmQiKTsKICAgICAgIH0KICAgICAgIG1hcCA9ICgoRGlzcGF0Y2hDb21tYW5kKSBjbWQpLmdldE1hcCgpOwogICAgIH0KIAotICAgIFByb3ZpZGVyPD8gZXh0ZW5kcyBDb21tYW5kPiBwID0gbWFwLmdldChjb21tYW5kLnZhbHVlKCkpOworICAgIENvbW1hbmRQcm92aWRlciBwID0gbWFwLmdldChjb21tYW5kLnZhbHVlKCkpOwogICAgIGlmIChwID09IG51bGwpIHsKICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgZ2V0TmFtZSgpICsgIjogbm90IGZvdW5kIik7CiAgICAgfQogCi0gICAgQ29tbWFuZCBjbWQgPSBwLmdldCgpOworICAgIENvbW1hbmQgY21kID0gcC5nZXRQcm92aWRlcigpLmdldCgpOwogICAgIGNoZWNrUmVxdWlyZXNDYXBhYmlsaXR5KGNtZCk7CiAgICAgaWYgKGNtZCBpbnN0YW5jZW9mIEJhc2VDb21tYW5kKSB7CiAgICAgICBCYXNlQ29tbWFuZCBiYyA9IChCYXNlQ29tbWFuZCljbWQ7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQmFzZUNvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9CYXNlQ29tbWFuZC5qYXZhCmluZGV4IDllMDRmMDUuLjk4Yjc0MGMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9CYXNlQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9CYXNlQ29tbWFuZC5qYXZhCkBAIC02Miw3ICs2Miw2IEBACiAgIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PVF9GT1VORCA9IFBSSVZBVEVfU1RBVFVTIHwgMjsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX05PVF9BRE1JTiA9IFBSSVZBVEVfU1RBVFVTIHwgMzsKIAotICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgQE9wdGlvbihuYW1lID0gIi0tIiwgdXNhZ2UgPSAiZW5kIG9mIG9wdGlvbnMiLCBoYW5kbGVyID0gRW5kT2ZPcHRpb25zSGFuZGxlci5jbGFzcykKICAgcHJpdmF0ZSBib29sZWFuIGVuZE9mT3B0aW9uczsKIApAQCAtNDI5LDcgKzQyOCw3IEBACiAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHRodW5rLnJ1bigpOwogICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb2plY3RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCBlLmdldE1lc3NhZ2UoKSArICIgbm8gc3VjaCBwcm9qZWN0Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKDEsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hDaGFuZ2VFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCBlLmdldE1lc3NhZ2UoKSArICIgbm8gc3VjaCBjaGFuZ2UiKTsKICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZEZhY3RvcnlQcm92aWRlci5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRGYWN0b3J5UHJvdmlkZXIuamF2YQppbmRleCA3ZjA4ZDQ5Li45MTBmNWYzIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZEZhY3RvcnlQcm92aWRlci5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kRmFjdG9yeVByb3ZpZGVyLmphdmEKQEAgLTE2LDkgKzE2LDExIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQXRvbWljczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuR2Vycml0U2VydmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoU2NvcGUuQ29udGV4dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKQEAgLTU2LDE1ICs1OCwxNyBAQAogICBwcml2YXRlIGZpbmFsIFNzaFNjb3BlIHNzaFNjb3BlOwogICBwcml2YXRlIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzdGFydEV4ZWN1dG9yOwogICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIGRlc3Ryb3lFeGVjdXRvcjsKKyAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWFGYWN0b3J5OwogCiAgIEBJbmplY3QKICAgQ29tbWFuZEZhY3RvcnlQcm92aWRlcigKICAgICAgIEBDb21tYW5kTmFtZShDb21tYW5kcy5ST09UKSBmaW5hbCBEaXNwYXRjaENvbW1hbmRQcm92aWRlciBkLAogICAgICAgQEdlcnJpdFNlcnZlckNvbmZpZyBmaW5hbCBDb25maWcgY2ZnLCBmaW5hbCBXb3JrUXVldWUgd29ya1F1ZXVlLAotICAgICAgZmluYWwgU3NoTG9nIGwsIGZpbmFsIFNzaFNjb3BlIHMpIHsKKyAgICAgIGZpbmFsIFNzaExvZyBsLCBmaW5hbCBTc2hTY29wZSBzLCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzZikgewogICAgIGRpc3BhdGNoZXIgPSBkOwogICAgIGxvZyA9IGw7CiAgICAgc3NoU2NvcGUgPSBzOworICAgIHNjaGVtYUZhY3RvcnkgPSBzZjsKIAogICAgIGludCB0aHJlYWRzID0gY2ZnLmdldEludCgic3NoZCIsImNvbW1hbmRTdGFydFRocmVhZHMiLCAyKTsKICAgICBzdGFydEV4ZWN1dG9yID0gd29ya1F1ZXVlLmNyZWF0ZVF1ZXVlKHRocmVhZHMsICJTc2hDb21tYW5kU3RhcnQiKTsKQEAgLTEyMiw3ICsxMjYsNyBAQAogCiAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbihmaW5hbCBTZXJ2ZXJTZXNzaW9uIHNlc3Npb24pIHsKICAgICAgIGZpbmFsIFNzaFNlc3Npb24gcyA9IHNlc3Npb24uZ2V0QXR0cmlidXRlKFNzaFNlc3Npb24uS0VZKTsKLSAgICAgIHRoaXMuY3R4ID0gc3NoU2NvcGUubmV3Q29udGV4dChzLCBjb21tYW5kTGluZSk7CisgICAgICB0aGlzLmN0eCA9IHNzaFNjb3BlLm5ld0NvbnRleHQoc2NoZW1hRmFjdG9yeSwgcywgY29tbWFuZExpbmUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIEVudmlyb25tZW50IGVudikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTE5Miw3ICsxOTYsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGxvZyhmaW5hbCBpbnQgcmMpIHsKICAgICAgIGlmIChsb2dnZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKLSAgICAgICAgbG9nLm9uRXhlY3V0ZShyYyk7CisgICAgICAgIGxvZy5vbkV4ZWN1dGUoY21kLCByYyk7CiAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZE1ldGFEYXRhLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZE1ldGFEYXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZjZWU2YQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kTWV0YURhdGEuamF2YQpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQW5ub3RhdGlvbiB0YWdnZWQgb24gYSBjb25jcmV0ZSBDb21tYW5kIHRvIGRlc2NyaWJlIHdoYXQgaXQgaXMgZG9pbmcKKyAqLworQFRhcmdldCgge0VsZW1lbnRUeXBlLlRZUEV9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgQ29tbWFuZE1ldGFEYXRhIHsKKyAgU3RyaW5nIG5hbWUoKTsKKyAgU3RyaW5nIGRlc2NyKCkgZGVmYXVsdCAiIjsKK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kTW9kdWxlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZE1vZHVsZS5qYXZhCmluZGV4IDc2OTliZGQuLmU3ZThhNDQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Db21tYW5kTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRNb2R1bGUuamF2YQpAQCAtNDgsNyArNDgsNyBAQAogICAvKioKICAgICogQ29uZmlndXJlIGEgY29tbWFuZCB0byBiZSBpbnZva2VkIGJ5IG5hbWUuCiAgICAqCi0gICAqQHBhcmFtIHBhcmVudCBjb250ZXh0IG9mIHRoZSBwYXJlbnQgY29tbWFuZCwgdGhhdCB0aGlzIGNvbW1hbmQgaXMgYQorICAgKiBAcGFyYW0gcGFyZW50IGNvbnRleHQgb2YgdGhlIHBhcmVudCBjb21tYW5kLCB0aGF0IHRoaXMgY29tbWFuZCBpcyBhCiAgICAqICAgICAgICBzdWJjb21tYW5kIG9mLgogICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0aGUgY2xpZW50IHdpbGwgcHJvdmlkZSBpbiBvcmRlciB0bwogICAgKiAgICAgICAgY2FsbCB0aGUgY29tbWFuZC4KQEAgLTYxLDYgKzYxLDQyIEBACiAgIH0KIAogICAvKioKKyAgICogQ29uZmlndXJlIGEgY29tbWFuZCB0byBiZSBpbnZva2VkIGJ5IG5hbWUuIFRoZSBjb21tYW5kIGlzIGJvdW5kIHRvIHRoZSBwYXNzZWQgY2xhc3MuCisgICAqCisgICAqIEBwYXJhbSBwYXJlbnQgY29udGV4dCBvZiB0aGUgcGFyZW50IGNvbW1hbmQsIHRoYXQgdGhpcyBjb21tYW5kIGlzIGEKKyAgICogICAgICAgIHN1YmNvbW1hbmQgb2YuCisgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBvZiB0aGUgY29tbWFuZCB3aXRoIHtAbGluayBDb21tYW5kTWV0YURhdGF9IGFubm90YXRpb24KKyAgICogICAgICAgIHRvIHJldHJpZXZlIHRoZSBuYW1lIGFuZCB0aGUgZGVzY3JpcHRpb24gZnJvbQorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgY29tbWFuZChmaW5hbCBDb21tYW5kTmFtZSBwYXJlbnQsCisgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQmFzZUNvbW1hbmQ+IGNsYXp6KSB7CisgICAgQ29tbWFuZE1ldGFEYXRhIG1ldGEgPSAoQ29tbWFuZE1ldGFEYXRhKWNsYXp6LmdldEFubm90YXRpb24oQ29tbWFuZE1ldGFEYXRhLmNsYXNzKTsKKyAgICBpZiAobWV0YSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJubyBDb21tYW5kTWV0YURhdGEgYW5ub3RhdGlvbiBmb3VuZCIpOworICAgIH0KKyAgICBiaW5kKENvbW1hbmRzLmtleShwYXJlbnQsIG1ldGEubmFtZSgpLCBtZXRhLmRlc2NyKCkpKS50byhjbGF6eik7CisgIH0KKworICAvKioKKyAgICogQWxpYXMgb25lIGNvbW1hbmQgdG8gYW5vdGhlci4gVGhlIGFsaWFzIGlzIGJvdW5kIHRvIHRoZSBwYXNzZWQgY2xhc3MuCisgICAqCisgICAqIEBwYXJhbSBwYXJlbnQgY29udGV4dCBvZiB0aGUgcGFyZW50IGNvbW1hbmQsIHRoYXQgdGhpcyBjb21tYW5kIGlzIGEKKyAgICogICAgICAgIHN1YmNvbW1hbmQgb2YuCisgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIHRoZSBjbGllbnQgd2lsbCBwcm92aWRlIGluIG9yZGVyIHRvCisgICAqICAgICAgICBjYWxsIHRoZSBjb21tYW5kLgorICAgKiBAcGFyYW0gY2xhenogY2xhc3Mgb2YgdGhlIGNvbW1hbmQgd2l0aCB7QGxpbmsgQ29tbWFuZE1ldGFEYXRhfSBhbm5vdGF0aW9uCisgICAqICAgICAgICB0byByZXRyaWV2ZSB0aGUgZGVzY3JpcHRpb24gZnJvbQorICAgKi8KKyAgcHJvdGVjdGVkIHZvaWQgYWxpYXMoZmluYWwgQ29tbWFuZE5hbWUgcGFyZW50LCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCYXNlQ29tbWFuZD4gY2xhenopIHsKKyAgICBDb21tYW5kTWV0YURhdGEgbWV0YSA9IChDb21tYW5kTWV0YURhdGEpY2xhenouZ2V0QW5ub3RhdGlvbihDb21tYW5kTWV0YURhdGEuY2xhc3MpOworICAgIGlmIChtZXRhID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vIENvbW1hbmRNZXRhRGF0YSBhbm5vdGF0aW9uIGZvdW5kIik7CisgICAgfQorICAgIGJpbmQoQ29tbWFuZHMua2V5KHBhcmVudCwgbmFtZSwgbWV0YS5kZXNjcigpKSkudG8oY2xhenopOworICB9CisKKyAgLyoqCiAgICAqIEFsaWFzIG9uZSBjb21tYW5kIHRvIGFub3RoZXIuCiAgICAqCiAgICAqIEBwYXJhbSBmcm9tIHRoZSBuZXcgY29tbWFuZCBuYW1lIHRoYXQgd2hlbiBjYWxsZWQgd2lsbCBhY3R1YWxseSBkZWxlZ2F0ZSB0bwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRQcm92aWRlci5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhN2M5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuQ29tbWFuZDsKKworZmluYWwgY2xhc3MgQ29tbWFuZFByb3ZpZGVyIHsKKworICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPENvbW1hbmQ+IHByb3ZpZGVyOworICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICBDb21tYW5kUHJvdmlkZXIoZmluYWwgUHJvdmlkZXI8Q29tbWFuZD4gcCwgZmluYWwgU3RyaW5nIGQpIHsKKyAgICB0aGlzLnByb3ZpZGVyID0gcDsKKyAgICB0aGlzLmRlc2NyaXB0aW9uID0gZDsKKyAgfQorCisgIHB1YmxpYyBQcm92aWRlcjxDb21tYW5kPiBnZXRQcm92aWRlcigpIHsKKyAgICByZXR1cm4gcHJvdmlkZXI7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0NvbW1hbmRzLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZHMuamF2YQppbmRleCA1MzQwZDZmLi45MjlhODk1IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZHMuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvQ29tbWFuZHMuamF2YQpAQCAtMTYsNiArMTYsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5Db21tYW5kOwogCiBpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKQEAgLTQxLDYgKzQyLDExIEBACiAgICAgcmV0dXJuIEtleS5nZXQoQ29tbWFuZC5jbGFzcywgbmFtZWQocGFyZW50LCBuYW1lKSk7CiAgIH0KIAorICBwdWJsaWMgc3RhdGljIEtleTxDb21tYW5kPiBrZXkoZmluYWwgQ29tbWFuZE5hbWUgcGFyZW50LAorICAgICAgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjcikgeworICAgIHJldHVybiBLZXkuZ2V0KENvbW1hbmQuY2xhc3MsIG5hbWVkKHBhcmVudCwgbmFtZSwgZGVzY3IpKTsKKyAgfQorCiAgIC8qKiBDcmVhdGUgYSBDb21tYW5kTmFtZSBhbm5vdGF0aW9uIGZvciB0aGUgc3VwcGxpZWQgbmFtZS4gKi8KICAgcHVibGljIHN0YXRpYyBDb21tYW5kTmFtZSBuYW1lZChmaW5hbCBTdHJpbmcgbmFtZSkgewogICAgIHJldHVybiBuZXcgQ29tbWFuZE5hbWUoKSB7CkBAIC03OCw2ICs4NCwxMiBAQAogICAgIHJldHVybiBuZXcgTmVzdGVkQ29tbWFuZE5hbWVJbXBsKHBhcmVudCwgbmFtZSk7CiAgIH0KIAorICAvKiogQ3JlYXRlIGEgQ29tbWFuZE5hbWUgYW5ub3RhdGlvbiBmb3IgdGhlIHN1cHBsaWVkIG5hbWUgYW5kIGRlc2NyaXB0aW9uLiAqLworICBwdWJsaWMgc3RhdGljIENvbW1hbmROYW1lIG5hbWVkKGZpbmFsIENvbW1hbmROYW1lIHBhcmVudCwgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICBmaW5hbCBTdHJpbmcgZGVzY3IpIHsKKyAgICByZXR1cm4gbmV3IE5lc3RlZENvbW1hbmROYW1lSW1wbChwYXJlbnQsIG5hbWUsIGRlc2NyKTsKKyAgfQorCiAgIC8qKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21tYW5kLCBwb3NzaWJseSBpbmNsdWRpbmcgYW55IHBhcmVudHMuICovCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG5hbWVPZihmaW5hbCBDb21tYW5kTmFtZSBuYW1lKSB7CiAgICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBOZXN0ZWRDb21tYW5kTmFtZUltcGwpIHsKQEAgLTEwNCwxMyArMTE2LDIyIEBACiAgICAgcmV0dXJuIG51bGw7CiAgIH0KIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOZXN0ZWRDb21tYW5kTmFtZUltcGwgaW1wbGVtZW50cyBDb21tYW5kTmFtZSB7CisgIHN0YXRpYyBmaW5hbCBjbGFzcyBOZXN0ZWRDb21tYW5kTmFtZUltcGwgaW1wbGVtZW50cyBDb21tYW5kTmFtZSB7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kTmFtZSBwYXJlbnQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcjsKIAogICAgIE5lc3RlZENvbW1hbmROYW1lSW1wbChmaW5hbCBDb21tYW5kTmFtZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lKSB7CiAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICB0aGlzLmRlc2NyID0gU3RyaW5nVXRpbHMuRU1QVFk7CisgICAgfQorCisgICAgTmVzdGVkQ29tbWFuZE5hbWVJbXBsKGZpbmFsIENvbW1hbmROYW1lIHBhcmVudCwgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcikgeworICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgdGhpcy5kZXNjciA9IGRlc2NyOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTE4LDYgKzEzOSwxMCBAQAogICAgICAgcmV0dXJuIG5hbWU7CiAgICAgfQogCisgICAgcHVibGljIFN0cmluZyBkZXNjcigpIHsKKyAgICAgIHJldHVybiBkZXNjcjsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgewogICAgICAgcmV0dXJuIENvbW1hbmROYW1lLmNsYXNzOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0RhdGFiYXNlUHViS2V5QXV0aC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0RhdGFiYXNlUHViS2V5QXV0aC5qYXZhCmluZGV4IGE2OWEyZjEuLjgzYmM4YTUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EYXRhYmFzZVB1YktleUF1dGguamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGF0YWJhc2VQdWJLZXlBdXRoLmphdmEKQEAgLTE1LDcgKzE1LDYgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50U3NoS2V5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlBlZXJEYWVtb25Vc2VyOwpAQCAtMjMsNyArMjIsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuU2l0ZVBhdGhzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoU2NvcGUuQ29udGV4dDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQ7CkBAIC00Myw3ICs0MSw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CkBAIC0xNzMsNyArMTcwLDcgQEAKICAgICAgIC8vIHNlc3Npb24sIHJlY29yZCBhIGxvZ2luIGV2ZW50IGluIHRoZSBsb2cgYW5kIGFkZAogICAgICAgLy8gYSBjbG9zZSBsaXN0ZW5lciB0byByZWNvcmQgYSBsb2dvdXQgZXZlbnQuCiAgICAgICAvLwotICAgICAgQ29udGV4dCBjdHggPSBzc2hTY29wZS5uZXdDb250ZXh0KHNkLCBudWxsKTsKKyAgICAgIENvbnRleHQgY3R4ID0gc3NoU2NvcGUubmV3Q29udGV4dChudWxsLCBzZCwgbnVsbCk7CiAgICAgICBDb250ZXh0IG9sZCA9IHNzaFNjb3BlLnNldChjdHgpOwogICAgICAgdHJ5IHsKICAgICAgICAgc3NoTG9nLm9uTG9naW4oKTsKQEAgLTE4NSw3ICsxODIsNyBAQAogICAgICAgICAgIG5ldyBJb0Z1dHVyZUxpc3RlbmVyPElvRnV0dXJlPigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb3BlcmF0aW9uQ29tcGxldGUoSW9GdXR1cmUgZnV0dXJlKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY3R4ID0gc3NoU2NvcGUubmV3Q29udGV4dChzZCwgbnVsbCk7CisgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY3R4ID0gc3NoU2NvcGUubmV3Q29udGV4dChudWxsLCBzZCwgbnVsbCk7CiAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHQgb2xkID0gc3NoU2NvcGUuc2V0KGN0eCk7CiAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgc3NoTG9nLm9uTG9nb3V0KCk7CkBAIC0yMDEsMTMgKzE5OCw3IEBACiAKICAgcHJpdmF0ZSBJZGVudGlmaWVkVXNlciBjcmVhdGVVc2VyKGZpbmFsIFNzaFNlc3Npb24gc2QsCiAgICAgICBmaW5hbCBTc2hLZXlDYWNoZUVudHJ5IGtleSkgewotICAgIHJldHVybiB1c2VyRmFjdG9yeS5jcmVhdGUoQWNjZXNzUGF0aC5TU0hfQ09NTUFORCwKLSAgICAgICAgbmV3IFByb3ZpZGVyPFNvY2tldEFkZHJlc3M+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBzZC5nZXRSZW1vdGVBZGRyZXNzKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9LCBrZXkuZ2V0QWNjb3VudCgpKTsKKyAgICByZXR1cm4gdXNlckZhY3RvcnkuY3JlYXRlKHNkLmdldFJlbW90ZUFkZHJlc3MoKSwga2V5LmdldEFjY291bnQoKSk7CiAgIH0KIAogICBwcml2YXRlIFNzaEtleUNhY2hlRW50cnkgZmluZChmaW5hbCBJdGVyYWJsZTxTc2hLZXlDYWNoZUVudHJ5PiBrZXlMaXN0LApkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Rpc3BhdGNoQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL0Rpc3BhdGNoQ29tbWFuZC5qYXZhCmluZGV4IDY5MWYzYTAuLjQ1NWI3MzIgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EaXNwYXRjaENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGlzcGF0Y2hDb21tYW5kLmphdmEKQEAgLTE0LDYgKzE0LDcgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuQXRvbWljczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKQEAgLTI5LDYgKzMwLDcgQEAKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTM5LDE0ICs0MSwxNCBAQAogICovCiBmaW5hbCBjbGFzcyBEaXNwYXRjaENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7CiAgIGludGVyZmFjZSBGYWN0b3J5IHsKLSAgICBEaXNwYXRjaENvbW1hbmQgY3JlYXRlKE1hcDxTdHJpbmcsIFByb3ZpZGVyPENvbW1hbmQ+PiBtYXApOworICAgIERpc3BhdGNoQ29tbWFuZCBjcmVhdGUoTWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBtYXApOwogICB9CiAKICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDdXJyZW50VXNlcj4gY3VycmVudFVzZXI7Ci0gIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IGNvbW1hbmRzOworICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENvbW1hbmRQcm92aWRlcj4gY29tbWFuZHM7CiAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPENvbW1hbmQ+IGF0b21pY0NtZDsKIAotICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIG1ldGFWYXIgPSAiQ09NTUFORCIsIGhhbmRsZXIgPSBTdWJjb21tYW5kSGFuZGxlci5jbGFzcykKKyAgQEFyZ3VtZW50KGluZGV4ID0gMCwgcmVxdWlyZWQgPSBmYWxzZSwgbWV0YVZhciA9ICJDT01NQU5EIiwgaGFuZGxlciA9IFN1YmNvbW1hbmRIYW5kbGVyLmNsYXNzKQogICBwcml2YXRlIFN0cmluZyBjb21tYW5kTmFtZTsKIAogICBAQXJndW1lbnQoaW5kZXggPSAxLCBtdWx0aVZhbHVlZCA9IHRydWUsIG1ldGFWYXIgPSAiQVJHIikKQEAgLTU0LDEzICs1NiwxMyBAQAogCiAgIEBJbmplY3QKICAgRGlzcGF0Y2hDb21tYW5kKGZpbmFsIFByb3ZpZGVyPEN1cnJlbnRVc2VyPiBjdSwKLSAgICAgIEBBc3Npc3RlZCBmaW5hbCBNYXA8U3RyaW5nLCBQcm92aWRlcjxDb21tYW5kPj4gYWxsKSB7CisgICAgICBAQXNzaXN0ZWQgZmluYWwgTWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBhbGwpIHsKICAgICBjdXJyZW50VXNlciA9IGN1OwogICAgIGNvbW1hbmRzID0gYWxsOwogICAgIGF0b21pY0NtZCA9IEF0b21pY3MubmV3UmVmZXJlbmNlKCk7CiAgIH0KIAotICBNYXA8U3RyaW5nLCBQcm92aWRlcjxDb21tYW5kPj4gZ2V0TWFwKCkgeworICBNYXA8U3RyaW5nLCBDb21tYW5kUHJvdmlkZXI+IGdldE1hcCgpIHsKICAgICByZXR1cm4gY29tbWFuZHM7CiAgIH0KIApAQCAtNjgsOCArNzAsMTMgQEAKICAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIHRyeSB7CiAgICAgICBwYXJzZUNvbW1hbmRMaW5lKCk7CisgICAgICBpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KGNvbW1hbmROYW1lKSkgeworICAgICAgICBTdHJpbmdXcml0ZXIgbXNnID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBtc2cud3JpdGUodXNhZ2UoKSk7CisgICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgbXNnLnRvU3RyaW5nKCkpOworICAgICAgfQogCi0gICAgICBmaW5hbCBQcm92aWRlcjxDb21tYW5kPiBwID0gY29tbWFuZHMuZ2V0KGNvbW1hbmROYW1lKTsKKyAgICAgIGZpbmFsIENvbW1hbmRQcm92aWRlciBwID0gY29tbWFuZHMuZ2V0KGNvbW1hbmROYW1lKTsKICAgICAgIGlmIChwID09IG51bGwpIHsKICAgICAgICAgU3RyaW5nIG1zZyA9CiAgICAgICAgICAgICAoZ2V0TmFtZSgpLmlzRW1wdHkoKSA/ICJHZXJyaXQgQ29kZSBSZXZpZXciIDogZ2V0TmFtZSgpKSArICI6ICIKQEAgLTc3LDcgKzg0LDcgQEAKICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCBtc2cpOwogICAgICAgfQogCi0gICAgICBmaW5hbCBDb21tYW5kIGNtZCA9IHAuZ2V0KCk7CisgICAgICBmaW5hbCBDb21tYW5kIGNtZCA9IHAuZ2V0UHJvdmlkZXIoKS5nZXQoKTsKICAgICAgIGNoZWNrUmVxdWlyZXNDYXBhYmlsaXR5KGNtZCk7CiAgICAgICBpZiAoY21kIGluc3RhbmNlb2YgQmFzZUNvbW1hbmQpIHsKICAgICAgICAgZmluYWwgQmFzZUNvbW1hbmQgYmMgPSAoQmFzZUNvbW1hbmQpIGNtZDsKQEAgLTEzOCw5ICsxNDUsMTcgQEAKICAgICB9CiAgICAgdXNhZ2UuYXBwZW5kKCIgYXJlOlxuIik7CiAgICAgdXNhZ2UuYXBwZW5kKCJcbiIpOworCisgICAgaW50IG1heExlbmd0aCA9IC0xOworICAgIGZvciAoU3RyaW5nIG5hbWUgOiBjb21tYW5kcy5rZXlTZXQoKSkgeworICAgICAgbWF4TGVuZ3RoID0gTWF0aC5tYXgobWF4TGVuZ3RoLCBuYW1lLmxlbmd0aCgpKTsKKyAgICB9CisgICAgU3RyaW5nIGZvcm1hdCA9ICIlLSIgKyBtYXhMZW5ndGggKyAicyAgICVzIjsKICAgICBmb3IgKFN0cmluZyBuYW1lIDogU2V0cy5uZXdUcmVlU2V0KGNvbW1hbmRzLmtleVNldCgpKSkgeworICAgICAgZmluYWwgQ29tbWFuZFByb3ZpZGVyIHAgPSBjb21tYW5kcy5nZXQobmFtZSk7CiAgICAgICB1c2FnZS5hcHBlbmQoIiAgICIpOwotICAgICAgdXNhZ2UuYXBwZW5kKG5hbWUpOworICAgICAgdXNhZ2UuYXBwZW5kKFN0cmluZy5mb3JtYXQoZm9ybWF0LCBuYW1lLAorICAgICAgICAgIFN0cmluZ3MubnVsbFRvRW1wdHkocC5nZXREZXNjcmlwdGlvbigpKSkpOwogICAgICAgdXNhZ2UuYXBwZW5kKCJcbiIpOwogICAgIH0KICAgICB1c2FnZS5hcHBlbmQoIlxuIik7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EaXNwYXRjaENvbW1hbmRQcm92aWRlci5qYXZhCmluZGV4IGI3NmZmNzEuLmU5YTMxYzkgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EaXNwYXRjaENvbW1hbmRQcm92aWRlci5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9EaXNwYXRjaENvbW1hbmRQcm92aWRlci5qYXZhCkBAIC0zOSw3ICszOSw3IEBACiAgIHByaXZhdGUgRGlzcGF0Y2hDb21tYW5kLkZhY3RvcnkgZmFjdG9yeTsKIAogICBwcml2YXRlIGZpbmFsIENvbW1hbmROYW1lIHBhcmVudDsKLSAgcHJpdmF0ZSB2b2xhdGlsZSBDb25jdXJyZW50TWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IG1hcDsKKyAgcHJpdmF0ZSB2b2xhdGlsZSBDb25jdXJyZW50TWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBtYXA7CiAKICAgcHVibGljIERpc3BhdGNoQ29tbWFuZFByb3ZpZGVyKGZpbmFsIENvbW1hbmROYW1lIGNuKSB7CiAgICAgdGhpcy5wYXJlbnQgPSBjbjsKQEAgLTUyLDggKzUyLDggQEAKIAogICBwdWJsaWMgUmVnaXN0cmF0aW9uSGFuZGxlIHJlZ2lzdGVyKGZpbmFsIENvbW1hbmROYW1lIG5hbWUsCiAgICAgICBmaW5hbCBQcm92aWRlcjxDb21tYW5kPiBjbWQpIHsKLSAgICBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgUHJvdmlkZXI8Q29tbWFuZD4+IG0gPSBnZXRNYXAoKTsKLSAgICBpZiAobS5wdXRJZkFic2VudChuYW1lLnZhbHVlKCksIGNtZCkgIT0gbnVsbCkgeworICAgIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBDb21tYW5kUHJvdmlkZXI+IG0gPSBnZXRNYXAoKTsKKyAgICBpZiAobS5wdXRJZkFic2VudChuYW1lLnZhbHVlKCksIG5ldyBDb21tYW5kUHJvdmlkZXIoY21kLCBudWxsKSkgIT0gbnVsbCkgewogICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuYW1lLnZhbHVlKCkgKyAiIGV4aXN0cyIpOwogICAgIH0KICAgICByZXR1cm4gbmV3IFJlZ2lzdHJhdGlvbkhhbmRsZSgpIHsKQEAgLTY2LDggKzY2LDggQEAKIAogICBwdWJsaWMgUmVnaXN0cmF0aW9uSGFuZGxlIHJlcGxhY2UoZmluYWwgQ29tbWFuZE5hbWUgbmFtZSwKICAgICAgIGZpbmFsIFByb3ZpZGVyPENvbW1hbmQ+IGNtZCkgewotICAgIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBQcm92aWRlcjxDb21tYW5kPj4gbSA9IGdldE1hcCgpOwotICAgIG0ucHV0KG5hbWUudmFsdWUoKSwgY21kKTsKKyAgICBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBtID0gZ2V0TWFwKCk7CisgICAgbS5wdXQobmFtZS52YWx1ZSgpLCBuZXcgQ29tbWFuZFByb3ZpZGVyKGNtZCwgbnVsbCkpOwogICAgIHJldHVybiBuZXcgUmVnaXN0cmF0aW9uSGFuZGxlKCkgewogICAgICAgQE92ZXJyaWRlCiAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CkBAIC03Niw3ICs3Niw3IEBACiAgICAgfTsKICAgfQogCi0gIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBQcm92aWRlcjxDb21tYW5kPj4gZ2V0TWFwKCkgeworICBDb25jdXJyZW50TWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBnZXRNYXAoKSB7CiAgICAgaWYgKG1hcCA9PSBudWxsKSB7CiAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7CkBAIC04OCwxNCArODgsMjEgQEAKICAgfQogCiAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBQcm92aWRlcjxDb21tYW5kPj4gY3JlYXRlTWFwKCkgewotICAgIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBQcm92aWRlcjxDb21tYW5kPj4gbSA9IE1hcHMubmV3Q29uY3VycmVudE1hcCgpOworICBwcml2YXRlIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBDb21tYW5kUHJvdmlkZXI+IGNyZWF0ZU1hcCgpIHsKKyAgICBDb25jdXJyZW50TWFwPFN0cmluZywgQ29tbWFuZFByb3ZpZGVyPiBtID0gTWFwcy5uZXdDb25jdXJyZW50TWFwKCk7CiAgICAgZm9yIChmaW5hbCBCaW5kaW5nPD8+IGIgOiBhbGxDb21tYW5kcygpKSB7CiAgICAgICBmaW5hbCBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBiLmdldEtleSgpLmdldEFubm90YXRpb24oKTsKICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgQ29tbWFuZE5hbWUpIHsKICAgICAgICAgZmluYWwgQ29tbWFuZE5hbWUgbiA9IChDb21tYW5kTmFtZSkgYW5ub3RhdGlvbjsKICAgICAgICAgaWYgKCFDb21tYW5kcy5DTURfUk9PVC5lcXVhbHMobikgJiYgQ29tbWFuZHMuaXNDaGlsZChwYXJlbnQsIG4pKSB7Ci0gICAgICAgICAgbS5wdXQobi52YWx1ZSgpLCAoUHJvdmlkZXI8Q29tbWFuZD4pIGIuZ2V0UHJvdmlkZXIoKSk7CisgICAgICAgICAgU3RyaW5nIGRlc2NyID0gbnVsbDsKKyAgICAgICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENvbW1hbmRzLk5lc3RlZENvbW1hbmROYW1lSW1wbCkgeworICAgICAgICAgICAgQ29tbWFuZHMuTmVzdGVkQ29tbWFuZE5hbWVJbXBsIGltcGwgPQorICAgICAgICAgICAgICAgICgoQ29tbWFuZHMuTmVzdGVkQ29tbWFuZE5hbWVJbXBsKSBhbm5vdGF0aW9uKTsKKyAgICAgICAgICAgIGRlc2NyID0gaW1wbC5kZXNjcigpOworICAgICAgICAgIH0KKyAgICAgICAgICBtLnB1dChuLnZhbHVlKCksCisgICAgICAgICAgICAgIG5ldyBDb21tYW5kUHJvdmlkZXIoKFByb3ZpZGVyPENvbW1hbmQ+KSBiLmdldFByb3ZpZGVyKCksIGRlc2NyKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvTm9TaGVsbC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL05vU2hlbGwuamF2YQppbmRleCBkMmZkZjc4Li5jZGU3YWU4IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvTm9TaGVsbC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Ob1NoZWxsLmphdmEKQEAgLTE1LDEwICsxNSwxMiBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkNhbm9uaWNhbFdlYlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEluZm87CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hTY29wZS5Db250ZXh0OworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5TY2hlbWFGYWN0b3J5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIApAQCAtNTgsNiArNjAsNyBAQAogCiAgIHN0YXRpYyBjbGFzcyBTZW5kTWVzc2FnZSBpbXBsZW1lbnRzIENvbW1hbmQsIFNlc3Npb25Bd2FyZSB7CiAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxNZXNzYWdlRmFjdG9yeT4gbWVzc2FnZUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzY2hlbWFGYWN0b3J5OwogICAgIHByaXZhdGUgZmluYWwgU3NoU2NvcGUgc3NoU2NvcGU7CiAKICAgICBwcml2YXRlIElucHV0U3RyZWFtIGluOwpAQCAtNjcsOCArNzAsMTAgQEAKICAgICBwcml2YXRlIENvbnRleHQgY29udGV4dDsKIAogICAgIEBJbmplY3QKLSAgICBTZW5kTWVzc2FnZShQcm92aWRlcjxNZXNzYWdlRmFjdG9yeT4gbWVzc2FnZUZhY3RvcnksIFNzaFNjb3BlIHNzaFNjb3BlKSB7CisgICAgU2VuZE1lc3NhZ2UoUHJvdmlkZXI8TWVzc2FnZUZhY3Rvcnk+IG1lc3NhZ2VGYWN0b3J5LAorICAgICAgICBTY2hlbWFGYWN0b3J5PFJldmlld0RiPiBzZiwgU3NoU2NvcGUgc3NoU2NvcGUpIHsKICAgICAgIHRoaXMubWVzc2FnZUZhY3RvcnkgPSBtZXNzYWdlRmFjdG9yeTsKKyAgICAgIHRoaXMuc2NoZW1hRmFjdG9yeSA9IHNmOwogICAgICAgdGhpcy5zc2hTY29wZSA9IHNzaFNjb3BlOwogICAgIH0KIApAQCAtODksNyArOTQsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb24oZmluYWwgU2VydmVyU2Vzc2lvbiBzZXNzaW9uKSB7Ci0gICAgICB0aGlzLmNvbnRleHQgPSBzc2hTY29wZS5uZXdDb250ZXh0KHNlc3Npb24uZ2V0QXR0cmlidXRlKFNzaFNlc3Npb24uS0VZKSwgIiIpOworICAgICAgU3NoU2Vzc2lvbiBzID0gc2Vzc2lvbi5nZXRBdHRyaWJ1dGUoU3NoU2Vzc2lvbi5LRVkpOworICAgICAgdGhpcy5jb250ZXh0ID0gc3NoU2NvcGUubmV3Q29udGV4dChzY2hlbWFGYWN0b3J5LCBzLCAiIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc3RhcnQoZmluYWwgRW52aXJvbm1lbnQgZW52KSB0aHJvd3MgSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1BsdWdpbkNvbW1hbmRNb2R1bGUuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9QbHVnaW5Db21tYW5kTW9kdWxlLmphdmEKaW5kZXggNGRiYjhkNy4uMDEzZjA3MCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1BsdWdpbkNvbW1hbmRNb2R1bGUuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvUGx1Z2luQ29tbWFuZE1vZHVsZS5qYXZhCkBAIC0xNiwyMSArMTYsMTcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlBsdWdpbk5hbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQWJzdHJhY3RNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuYmluZGVyLkxpbmtlZEJpbmRpbmdCdWlsZGVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5Db21tYW5kOwogCiBpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKIAotcHVibGljIGFic3RyYWN0IGNsYXNzIFBsdWdpbkNvbW1hbmRNb2R1bGUgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZSB7CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGx1Z2luQ29tbWFuZE1vZHVsZSBleHRlbmRzIENvbW1hbmRNb2R1bGUgewogICBwcml2YXRlIENvbW1hbmROYW1lIGNvbW1hbmQ7CiAKICAgQEluamVjdAotICB2b2lkIHNldFBsdWdpbk5hbWUoQFBsdWdpbk5hbWUgU3RyaW5nIG5hbWUpIHsKKyAgdm9pZCBzZXRQbHVnaW5OYW1lKEBQbHVnaW5OYW1lIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3IpIHsKICAgICB0aGlzLmNvbW1hbmQgPSBDb21tYW5kcy5uYW1lZChuYW1lKTsKICAgfQogCkBAIC00Niw0ICs0MiwxMyBAQAogICBwcm90ZWN0ZWQgTGlua2VkQmluZGluZ0J1aWxkZXI8Q29tbWFuZD4gY29tbWFuZChTdHJpbmcgc3ViQ21kKSB7CiAgICAgcmV0dXJuIGJpbmQoQ29tbWFuZHMua2V5KGNvbW1hbmQsIHN1YkNtZCkpOwogICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgY29tbWFuZChDbGFzczw/IGV4dGVuZHMgQmFzZUNvbW1hbmQ+IGNsYXp6KSB7CisgICAgY29tbWFuZChjb21tYW5kLCBjbGF6eik7CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBhbGlhcyhmaW5hbCBTdHJpbmcgbmFtZSwgQ2xhc3M8PyBleHRlbmRzIEJhc2VDb21tYW5kPiBjbGF6eikgeworICAgIGFsaWFzKGNvbW1hbmQsIG5hbWUsIGNsYXp6KTsKKyAgfQorCiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoQXV0b1JlZ2lzdGVyTW9kdWxlR2VuZXJhdG9yLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoQXV0b1JlZ2lzdGVyTW9kdWxlR2VuZXJhdG9yLmphdmEKaW5kZXggMDM0ODVmNy4uYWZiMjUzNyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaEF1dG9SZWdpc3Rlck1vZHVsZUdlbmVyYXRvci5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hBdXRvUmVnaXN0ZXJNb2R1bGVHZW5lcmF0b3IuamF2YQpAQCAtMTQsMjIgKzE0LDI5IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5BdXRvUmVnaXN0ZXJVdGlsLmNhbGN1bGF0ZUJpbmRBbm5vdGF0aW9uOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlua2VkTGlzdE11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuRXhwb3J0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLkludmFsaWRQbHVnaW5FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuTW9kdWxlR2VuZXJhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5UeXBlTGl0ZXJhbDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuQ29tbWFuZDsKIAoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogY2xhc3MgU3NoQXV0b1JlZ2lzdGVyTW9kdWxlR2VuZXJhdG9yCiAgICAgZXh0ZW5kcyBBYnN0cmFjdE1vZHVsZQogICAgIGltcGxlbWVudHMgTW9kdWxlR2VuZXJhdG9yIHsKICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBDbGFzczxDb21tYW5kPj4gY29tbWFuZHMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKKyAgcHJpdmF0ZSBmaW5hbCBNdWx0aW1hcDxUeXBlTGl0ZXJhbDw/PiwgQ2xhc3M8Pz4+IGxpc3RlbmVycyA9IExpbmtlZExpc3RNdWx0aW1hcC5jcmVhdGUoKTsKICAgcHJpdmF0ZSBDb21tYW5kTmFtZSBjb21tYW5kOwogCiAgIEBPdmVycmlkZQpAQCAtMzksNiArNDYsMTYgQEAKICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENsYXNzPENvbW1hbmQ+PiBlIDogY29tbWFuZHMuZW50cnlTZXQoKSkgewogICAgICAgYmluZChDb21tYW5kcy5rZXkoY29tbWFuZCwgZS5nZXRLZXkoKSkpLnRvKGUuZ2V0VmFsdWUoKSk7CiAgICAgfQorICAgIGZvciAoTWFwLkVudHJ5PFR5cGVMaXRlcmFsPD8+LCBDbGFzczw/Pj4gZSA6IGxpc3RlbmVycy5lbnRyaWVzKCkpIHsKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgVHlwZUxpdGVyYWw8T2JqZWN0PiB0eXBlID0gKFR5cGVMaXRlcmFsPE9iamVjdD4pIGUuZ2V0S2V5KCk7CisKKyAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgQ2xhc3M8T2JqZWN0PiBpbXBsID0gKENsYXNzPE9iamVjdD4pIGUuZ2V0VmFsdWUoKTsKKworICAgICAgQW5ub3RhdGlvbiBuID0gY2FsY3VsYXRlQmluZEFubm90YXRpb24oaW1wbCk7CisgICAgICBiaW5kKHR5cGUpLmFubm90YXRlZFdpdGgobikudG8oaW1wbCk7CisgICAgfQogICB9CiAKICAgcHVibGljIHZvaWQgc2V0UGx1Z2luTmFtZShTdHJpbmcgbmFtZSkgewpAQCAtNjYsNiArODMsMTIgQEAKICAgICB9CiAgIH0KIAorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBsaXN0ZW4oVHlwZUxpdGVyYWw8Pz4gdGwsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgbGlzdGVuZXJzLnB1dCh0bCwgY2xhenopOworICB9CisKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBNb2R1bGUgY3JlYXRlKCkgdGhyb3dzIEludmFsaWRQbHVnaW5FeGNlcHRpb24gewogICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShjb21tYW5kICE9IG51bGwsICJwbHVnaW5OYW1lIG11c3QgYmUgcHJvdmlkZWQiKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hEYWVtb24uamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hEYWVtb24uamF2YQppbmRleCA2NjRjZTQ1Li5jNDNkZTYwIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoRGFlbW9uLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaERhZW1vbi5qYXZhCkBAIC0xNCw2ICsxNCw4IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEFkZHJlc3Nlc01vZHVsZS5JQU5BX1NTSF9QT1JUOworCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKIApAQCAtMjEsNyArMjMsOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuZXZlbnRzLkxpZmVjeWNsZUxpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQ29uZmlnVXRpbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFNlcnZlckNvbmZpZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEFkdmVydGlzZWRBZGRyZXNzZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNzaC5Tc2hJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoTGlzdGVuQWRkcmVzc2VzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLklkR2VuZXJhdG9yOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlNvY2tldFV0aWw7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMTE0LDEzICsxMTgsMTAgQEAKICAqLwogQFNpbmdsZXRvbgogcHVibGljIGNsYXNzIFNzaERhZW1vbiBleHRlbmRzIFNzaFNlcnZlciBpbXBsZW1lbnRzIFNzaEluZm8sIExpZmVjeWNsZUxpc3RlbmVyIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElBTkFfU1NIX1BPUlQgPSAyMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1JUID0gMjk0MTg7Ci0KICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNzaERhZW1vbi5jbGFzcyk7CiAKICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNvY2tldEFkZHJlc3M+IGxpc3RlbjsKLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gYWR2ZXJ0aXNlZEFkZHJlc3M7CisgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGFkdmVydGlzZWQ7CiAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBrZWVwQWxpdmU7CiAgIHByaXZhdGUgZmluYWwgTGlzdDxIb3N0S2V5PiBob3N0S2V5czsKICAgcHJpdmF0ZSB2b2xhdGlsZSBJb0FjY2VwdG9yIGFjY2VwdG9yOwpAQCAtMTI5LDExICsxMzAsMTMgQEAKICAgU3NoRGFlbW9uKGZpbmFsIENvbW1hbmRGYWN0b3J5IGNvbW1hbmRGYWN0b3J5LCBmaW5hbCBOb1NoZWxsIG5vU2hlbGwsCiAgICAgICBmaW5hbCBQdWJsaWNrZXlBdXRoZW50aWNhdG9yIHVzZXJBdXRoLAogICAgICAgZmluYWwgS2V5UGFpclByb3ZpZGVyIGhvc3RLZXlQcm92aWRlciwgZmluYWwgSWRHZW5lcmF0b3IgaWRHZW5lcmF0b3IsCi0gICAgICBAR2Vycml0U2VydmVyQ29uZmlnIGZpbmFsIENvbmZpZyBjZmcsIGZpbmFsIFNzaExvZyBzc2hMb2cpIHsKKyAgICAgIEBHZXJyaXRTZXJ2ZXJDb25maWcgZmluYWwgQ29uZmlnIGNmZywgZmluYWwgU3NoTG9nIHNzaExvZywKKyAgICAgIEBTc2hMaXN0ZW5BZGRyZXNzZXMgZmluYWwgTGlzdDxTb2NrZXRBZGRyZXNzPiBsaXN0ZW4sCisgICAgICBAU3NoQWR2ZXJ0aXNlZEFkZHJlc3NlcyBmaW5hbCBMaXN0PFN0cmluZz4gYWR2ZXJ0aXNlZCkgewogICAgIHNldFBvcnQoSUFOQV9TU0hfUE9SVCAvKiBuZXZlciB1c2VkICovKTsKIAotICAgIGxpc3RlbiA9IHBhcnNlTGlzdGVuKGNmZyk7Ci0gICAgYWR2ZXJ0aXNlZEFkZHJlc3MgPSBwYXJzZUFkdmVydGlzZWRBZGRyZXNzKGNmZyk7CisgICAgdGhpcy5saXN0ZW4gPSBsaXN0ZW47CisgICAgdGhpcy5hZHZlcnRpc2VkID0gYWR2ZXJ0aXNlZDsKICAgICByZXVzZUFkZHJlc3MgPSBjZmcuZ2V0Qm9vbGVhbigic3NoZCIsICJyZXVzZWFkZHJlc3MiLCB0cnVlKTsKICAgICBrZWVwQWxpdmUgPSBjZmcuZ2V0Qm9vbGVhbigic3NoZCIsICJ0Y3BrZWVwYWxpdmUiLCB0cnVlKTsKIApAQCAtMTQ5LDYgKzE1MiwxOCBAQAogICAgICAgICBTdHJpbmcudmFsdWVPZihNSUxMSVNFQ09ORFMuY29udmVydChDb25maWdVdGlsLmdldFRpbWVVbml0KGNmZywgInNzaGQiLAogICAgICAgICAgICAgbnVsbCwgImxvZ2luR3JhY2VUaW1lIiwgMTIwLCBTRUNPTkRTKSwgU0VDT05EUykpKTsKIAorICAgIGxvbmcgaWRsZVRpbWVvdXRTZWNvbmRzID0gQ29uZmlnVXRpbC5nZXRUaW1lVW5pdChjZmcsICJzc2hkIiwgbnVsbCwKKyAgICAgICAgImlkbGVUaW1lb3V0IiwgMCwgU0VDT05EUyk7CisgICAgaWYgKGlkbGVUaW1lb3V0U2Vjb25kcyA9PSAwKSB7CisgICAgICAvLyBTaW5jZSBBcGFjaGUgU1NIRCBkb2VzIG5vdCBhbGxvdyB0byB0dXJuIG9mZiBjbG9zaW5nIGlkbGUgY29ubmVjdGlvbnMsCisgICAgICAvLyB3ZSBmYWtlIGl0IGJ5IHVzaW5nIHRoZSBoaWdoZXN0IHRpbWVvdXQgYWxsb3dlZCBieSBBcGFjaGUgU1NIRCwgd2hpY2gKKyAgICAgIC8vIGFtb3VudHMgdG8gfjI0IGRheXMuCisgICAgICBpZGxlVGltZW91dFNlY29uZHMgPSBNSUxMSVNFQ09ORFMudG9TZWNvbmRzKEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICB9CisgICAgZ2V0UHJvcGVydGllcygpLnB1dCgKKyAgICAgICAgSURMRV9USU1FT1VULAorICAgICAgICBTdHJpbmcudmFsdWVPZihTRUNPTkRTLnRvTWlsbGlzKGlkbGVUaW1lb3V0U2Vjb25kcykpKTsKKwogICAgIGZpbmFsIGludCBtYXhDb25uZWN0aW9uc1BlclVzZXIgPQogICAgICAgICBjZmcuZ2V0SW50KCJzc2hkIiwgIm1heENvbm5lY3Rpb25zUGVyVXNlciIsIDY0KTsKICAgICBpZiAoMCA8IG1heENvbm5lY3Rpb25zUGVyVXNlcikgewpAQCAtMjY4LDcgKzI4Myw3IEBACiAgICAgICBidWYucHV0UmF3UHVibGljS2V5KHB1Yik7CiAgICAgICBmaW5hbCBieXRlW10ga2V5QmluID0gYnVmLmdldENvbXBhY3REYXRhKCk7CiAKLSAgICAgIGZvciAoZmluYWwgU3RyaW5nIGFkZHIgOiBteUFkdmVydGlzZWRBZGRyZXNzZXMoKSkgeworICAgICAgZm9yIChmaW5hbCBTdHJpbmcgYWRkciA6IGFkdmVydGlzZWQpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICByLmFkZChuZXcgSG9zdEtleShhZGRyLCBrZXlCaW4pKTsKICAgICAgICAgfSBjYXRjaCAoSlNjaEV4Y2VwdGlvbiBlKSB7CkBAIC0yNzksMzYgKzI5NCw2IEBACiAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qocik7CiAgIH0KIAotICBwcml2YXRlIExpc3Q8U3RyaW5nPiBteUFkdmVydGlzZWRBZGRyZXNzZXMoKSB7Ci0gICAgaWYgKGFkdmVydGlzZWRBZGRyZXNzICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBhZHZlcnRpc2VkQWRkcmVzczsKLSAgICB9IGVsc2UgewotICAgICAgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gYWRkcnMgPSBteUFkZHJlc3NlcygpOwotICAgICAgTGlzdDxTdHJpbmc+IHN0ckFkZHJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFkZHJzLnNpemUoKSk7Ci0gICAgICBmb3IgKGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgOiBhZGRycykgewotICAgICAgICBzdHJBZGRycy5hZGQoU29ja2V0VXRpbC5mb3JtYXQoYWRkciwgSUFOQV9TU0hfUE9SVCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHN0ckFkZHJzOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgTGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gbXlBZGRyZXNzZXMoKSB7Ci0gICAgQXJyYXlMaXN0PEluZXRTb2NrZXRBZGRyZXNzPiBwdWIgPSBuZXcgQXJyYXlMaXN0PEluZXRTb2NrZXRBZGRyZXNzPigpOwotICAgIEFycmF5TGlzdDxJbmV0U29ja2V0QWRkcmVzcz4gbG9jYWwgPSBuZXcgQXJyYXlMaXN0PEluZXRTb2NrZXRBZGRyZXNzPigpOwotCi0gICAgZm9yIChmaW5hbCBTb2NrZXRBZGRyZXNzIGFkZHIgOiBsaXN0ZW4pIHsKLSAgICAgIGlmIChhZGRyIGluc3RhbmNlb2YgSW5ldFNvY2tldEFkZHJlc3MpIHsKLSAgICAgICAgZmluYWwgSW5ldFNvY2tldEFkZHJlc3MgaW5ldEFkZHIgPSAoSW5ldFNvY2tldEFkZHJlc3MpIGFkZHI7Ci0gICAgICAgIGlmIChpbmV0QWRkci5nZXRBZGRyZXNzKCkuaXNMb29wYmFja0FkZHJlc3MoKSkgewotICAgICAgICAgIGxvY2FsLmFkZChpbmV0QWRkcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHViLmFkZChpbmV0QWRkcik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHB1Yi5pc0VtcHR5KCkgPyBsb2NhbCA6IHB1YjsKLSAgfQotCiAgIHByaXZhdGUgTGlzdDxQdWJsaWNLZXk+IG15SG9zdEtleXMoKSB7CiAgICAgZmluYWwgS2V5UGFpclByb3ZpZGVyIHAgPSBnZXRLZXlQYWlyUHJvdmlkZXIoKTsKICAgICBmaW5hbCBMaXN0PFB1YmxpY0tleT4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8UHVibGljS2V5PigyKTsKQEAgLTMzNiw0MiArMzIxLDYgQEAKICAgICByZXR1cm4gci50b1N0cmluZygpOwogICB9CiAKLSAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyc2VBZHZlcnRpc2VkQWRkcmVzcyhmaW5hbCBDb25maWcgY2ZnKSB7Ci0gICAgZmluYWwgU3RyaW5nW10gd2FudCA9IGNmZy5nZXRTdHJpbmdMaXN0KCJzc2hkIiwgbnVsbCwgImFkdmVydGlzZWRhZGRyZXNzIik7Ci0gICAgaWYgKHdhbnQubGVuZ3RoID09IDApIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh3YW50KTsKLSAgfQotCi0gIHByaXZhdGUgTGlzdDxTb2NrZXRBZGRyZXNzPiBwYXJzZUxpc3RlbihmaW5hbCBDb25maWcgY2ZnKSB7Ci0gICAgZmluYWwgQXJyYXlMaXN0PFNvY2tldEFkZHJlc3M+IGJpbmQgPSBuZXcgQXJyYXlMaXN0PFNvY2tldEFkZHJlc3M+KDIpOwotICAgIGZpbmFsIFN0cmluZ1tdIHdhbnQgPSBjZmcuZ2V0U3RyaW5nTGlzdCgic3NoZCIsIG51bGwsICJsaXN0ZW5hZGRyZXNzIik7Ci0gICAgaWYgKHdhbnQgPT0gbnVsbCB8fCB3YW50Lmxlbmd0aCA9PSAwKSB7Ci0gICAgICBiaW5kLmFkZChuZXcgSW5ldFNvY2tldEFkZHJlc3MoREVGQVVMVF9QT1JUKSk7Ci0gICAgICByZXR1cm4gYmluZDsKLSAgICB9Ci0KLSAgICBpZiAod2FudC5sZW5ndGggPT0gMSAmJiBpc09mZih3YW50WzBdKSkgewotICAgICAgcmV0dXJuIGJpbmQ7Ci0gICAgfQotCi0gICAgZm9yIChmaW5hbCBTdHJpbmcgZGVzYyA6IHdhbnQpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJpbmQuYWRkKFNvY2tldFV0aWwucmVzb2x2ZShkZXNjLCBERUZBVUxUX1BPUlQpKTsKLSAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGxvZy5lcnJvcigiQmFkIHNzaGQubGlzdGVuYWRkcmVzczogIiArIGRlc2MgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmluZDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPZmYoU3RyaW5nIGxpc3Rlbkhvc3RuYW1lKSB7Ci0gICAgcmV0dXJuICJvZmYiLmVxdWFsc0lnbm9yZUNhc2UobGlzdGVuSG9zdG5hbWUpCi0gICAgICAgIHx8ICJub25lIi5lcXVhbHNJZ25vcmVDYXNlKGxpc3Rlbkhvc3RuYW1lKQotICAgICAgICB8fCAibm8iLmVxdWFsc0lnbm9yZUNhc2UobGlzdGVuSG9zdG5hbWUpOwotICB9Ci0KICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgIHByaXZhdGUgdm9pZCBpbml0UHJvdmlkZXJCb3VuY3lDYXN0bGUoKSB7CiAgICAgc2V0S2V5RXhjaGFuZ2VGYWN0b3JpZXMoQXJyYXlzLjxOYW1lZEZhY3Rvcnk8S2V5RXhjaGFuZ2U+PiBhc0xpc3QoCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoTG9nLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoTG9nLmphdmEKaW5kZXggYzlhYzNlNy4uMzM2NDkwYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaExvZy5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hMb2cuamF2YQpAQCAtMTQsOSArMTQsMTEgQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQuQXVkaXRFdmVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFycmF5TGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuYXVkaXQuQXVkaXRTZXJ2aWNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmF1ZGl0LlNzaEF1ZGl0RXZlbnQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5ldmVudHMuTGlmZWN5Y2xlTGlzdGVuZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUGVlckRhZW1vblVzZXI7CkBAIC00Miw3ICs0NCw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwpAQCAtMTAxLDcgKzEwMiw3IEBACiAKICAgdm9pZCBvbkxvZ2luKCkgewogICAgIGFzeW5jLmFwcGVuZChsb2coIkxPR0lOIEZST00gIiArIHNlc3Npb24uZ2V0KCkuZ2V0UmVtb3RlQWRkcmVzc0FzU3RyaW5nKCkpKTsKLSAgICBhdWRpdChjb250ZXh0LmdldCgpLCAiMCIsICJMT0dJTiIsIG5ldyBTdHJpbmdbXSB7fSk7CisgICAgYXVkaXQoY29udGV4dC5nZXQoKSwgIjAiLCAiTE9HSU4iKTsKICAgfQogCiAgIHZvaWQgb25BdXRoRmFpbChmaW5hbCBTc2hTZXNzaW9uIHNkKSB7CkBAIC0xMjcsMTggKzEyOCwxNCBAQAogICAgIH0KIAogICAgIGFzeW5jLmFwcGVuZChldmVudCk7Ci0gICAgYXVkaXQobnVsbCwgIkZBSUwiLCAiQVVUSCIsIG5ldyBTdHJpbmdbXSB7c2QuZ2V0UmVtb3RlQWRkcmVzc0FzU3RyaW5nKCl9KTsKKyAgICBhdWRpdChudWxsLCAiRkFJTCIsICJBVVRIIik7CiAgIH0KIAotICB2b2lkIG9uRXhlY3V0ZShpbnQgZXhpdFZhbHVlKSB7CisgIHZvaWQgb25FeGVjdXRlKERpc3BhdGNoQ29tbWFuZCBkY21kLCBpbnQgZXhpdFZhbHVlKSB7CiAgICAgZmluYWwgQ29udGV4dCBjdHggPSBjb250ZXh0LmdldCgpOwogICAgIGN0eC5maW5pc2hlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogCi0gICAgZmluYWwgU3RyaW5nIGNvbW1hbmRMaW5lID0gY3R4LmdldENvbW1hbmRMaW5lKCk7Ci0gICAgU3RyaW5nIGNtZCA9IFF1b3RlZFN0cmluZy5CT1VSTkUucXVvdGUoY29tbWFuZExpbmUpOwotICAgIGlmIChjbWQgPT0gY29tbWFuZExpbmUpIHsKLSAgICAgIGNtZCA9ICInIiArIGNvbW1hbmRMaW5lICsgIiciOwotICAgIH0KKyAgICBTdHJpbmcgY21kID0gZXh0cmFjdFdoYXQoZGNtZCk7CiAKICAgICBmaW5hbCBMb2dnaW5nRXZlbnQgZXZlbnQgPSBsb2coY21kKTsKICAgICBldmVudC5zZXRQcm9wZXJ0eShQX1dBSVQsIChjdHguc3RhcnRlZCAtIGN0eC5jcmVhdGVkKSArICJtcyIpOwpAQCAtMTY1LDE5ICsxNjIsNTQgQEAKICAgICBldmVudC5zZXRQcm9wZXJ0eShQX1NUQVRVUywgc3RhdHVzKTsKIAogICAgIGFzeW5jLmFwcGVuZChldmVudCk7Ci0gICAgYXVkaXQoY29udGV4dC5nZXQoKSwgc3RhdHVzLCBnZXRDb21tYW5kKGNvbW1hbmRMaW5lKSwKLSAgICAgICAgQ29tbWFuZEZhY3RvcnlQcm92aWRlci5zcGxpdChjb21tYW5kTGluZSkpOworICAgIGF1ZGl0KGNvbnRleHQuZ2V0KCksIHN0YXR1cywgZGNtZCk7CiAgIH0KIAotICBwcml2YXRlIFN0cmluZyBnZXRDb21tYW5kKFN0cmluZyBjb21tYW5kTGluZSkgewotICAgIGNvbW1hbmRMaW5lID0gY29tbWFuZExpbmUudHJpbSgpOwotICAgIGludCBzcGFjZVBvcyA9IGNvbW1hbmRMaW5lLmluZGV4T2YoJyAnKTsKLSAgICByZXR1cm4gKHNwYWNlUG9zID4gMCA/IGNvbW1hbmRMaW5lLnN1YnN0cmluZygwLCBzcGFjZVBvcyk6Y29tbWFuZExpbmUpOworICBwcml2YXRlIE11bHRpbWFwPFN0cmluZywgPz4gZXh0cmFjdFBhcmFtZXRlcnMoRGlzcGF0Y2hDb21tYW5kIGRjbWQpIHsKKyAgICBTdHJpbmdbXSBjbWRBcmdzID0gZGNtZC5nZXRBcmd1bWVudHMoKTsKKyAgICBTdHJpbmcgcGFyYW1OYW1lID0gbnVsbDsKKyAgICBpbnQgYXJnUG9zID0gMDsKKyAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFybXMgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICBmb3IgKGludCBpID0gMjsgaSA8IGNtZEFyZ3MubGVuZ3RoOyBpKyspIHsKKyAgICAgIFN0cmluZyBhcmcgPSBjbWRBcmdzW2ldOworICAgICAgLy8gLS0gc3RvcCBwYXJhbWV0ZXJzIHBhcnNpbmcKKyAgICAgIGlmIChhcmcuZXF1YWxzKCItLSIpKSB7CisgICAgICAgIGZvciAoaSsrOyBpIDwgY21kQXJncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgIHBhcm1zLnB1dCgiJCIgKyBhcmdQb3MrKywgY21kQXJnc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICAvLyAtLXBhcmFtPXZhbHVlCisgICAgICBpbnQgZXFQb3MgPSBhcmcuaW5kZXhPZignPScpOworICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKCItLSIpICYmIGVxUG9zID4gMCkgeworICAgICAgICBwYXJtcy5wdXQoYXJnLnN1YnN0cmluZygwLCBlcVBvcyksIGFyZy5zdWJzdHJpbmcoZXFQb3MgKyAxKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gLXAgdmFsdWUgb3IgLS1wYXJhbSB2YWx1ZQorICAgICAgaWYgKGFyZy5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgaWYgKHBhcmFtTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgcGFybXMucHV0KHBhcmFtTmFtZSwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW1OYW1lID0gYXJnOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIC8vIHZhbHVlCisgICAgICBpZiAocGFyYW1OYW1lID09IG51bGwpIHsKKyAgICAgICAgcGFybXMucHV0KCIkIiArIGFyZ1BvcysrLCBhcmcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFybXMucHV0KHBhcmFtTmFtZSwgYXJnKTsKKyAgICAgICAgcGFyYW1OYW1lID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcmFtTmFtZSAhPSBudWxsKSB7CisgICAgICBwYXJtcy5wdXQocGFyYW1OYW1lLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIHBhcm1zOwogICB9CiAKICAgdm9pZCBvbkxvZ291dCgpIHsKICAgICBhc3luYy5hcHBlbmQobG9nKCJMT0dPVVQiKSk7Ci0gICAgYXVkaXQoY29udGV4dC5nZXQoKSwgIjAiLCAiTE9HT1VUIiwgbmV3IFN0cmluZ1tdIHt9KTsKKyAgICBhdWRpdChjb250ZXh0LmdldCgpLCAiMCIsICJMT0dPVVQiKTsKICAgfQogCiAgIHByaXZhdGUgTG9nZ2luZ0V2ZW50IGxvZyhmaW5hbCBTdHJpbmcgbXNnKSB7CkBAIC00MTYsMjEgKzQ0OCwyOCBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgYXVkaXQoQ29udGV4dCBjdHgsIE9iamVjdCByZXN1bHQsIFN0cmluZyBjb21tYW5kTmFtZSwgU3RyaW5nW10gYXJncykgeworICB2b2lkIGF1ZGl0KENvbnRleHQgY3R4LCBPYmplY3QgcmVzdWx0LCBTdHJpbmcgY21kKSB7CiAgICAgZmluYWwgU3RyaW5nIHNpZCA9IGV4dHJhY3RTZXNzaW9uSWQoY3R4KTsKICAgICBmaW5hbCBsb25nIGNyZWF0ZWQgPSBleHRyYWN0Q3JlYXRlZChjdHgpOwotICAgIGZpbmFsIFN0cmluZyB3aGF0ID0gZXh0cmFjdFdoYXQoY29tbWFuZE5hbWUsIGFyZ3MpOwotICAgIGF1ZGl0U2VydmljZS5kaXNwYXRjaChuZXcgQXVkaXRFdmVudChzaWQsIGV4dHJhY3RDdXJyZW50VXNlcihjdHgpLCAic3NoOiIKLSAgICAgICAgKyB3aGF0LCBjcmVhdGVkLCBBcnJheXMuYXNMaXN0KGFyZ3MpLCByZXN1bHQpKTsKKyAgICBhdWRpdFNlcnZpY2UuZGlzcGF0Y2gobmV3IFNzaEF1ZGl0RXZlbnQoc2lkLCBleHRyYWN0Q3VycmVudFVzZXIoY3R4KSwgY21kLAorICAgICAgICBjcmVhdGVkLCBudWxsLCByZXN1bHQpKTsKICAgfQogCi0gIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RXaGF0KFN0cmluZyBjb21tYW5kTmFtZSwgU3RyaW5nW10gYXJncykgewotICAgIFN0cmluZyByZXN1bHQgPSBjb21tYW5kTmFtZTsKLSAgICBpZiAoImdlcnJpdCIuZXF1YWxzKGNvbW1hbmROYW1lKSkgewotICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkKLSAgICAgICAgcmVzdWx0ID0gImdlcnJpdCIrIi4iK2FyZ3NbMV07CisgIHZvaWQgYXVkaXQoQ29udGV4dCBjdHgsIE9iamVjdCByZXN1bHQsIERpc3BhdGNoQ29tbWFuZCBjbWQpIHsKKyAgICBmaW5hbCBTdHJpbmcgc2lkID0gZXh0cmFjdFNlc3Npb25JZChjdHgpOworICAgIGZpbmFsIGxvbmcgY3JlYXRlZCA9IGV4dHJhY3RDcmVhdGVkKGN0eCk7CisgICAgYXVkaXRTZXJ2aWNlLmRpc3BhdGNoKG5ldyBTc2hBdWRpdEV2ZW50KHNpZCwgZXh0cmFjdEN1cnJlbnRVc2VyKGN0eCksCisgICAgICAgIGV4dHJhY3RXaGF0KGNtZCksIGNyZWF0ZWQsIGV4dHJhY3RQYXJhbWV0ZXJzKGNtZCksIHJlc3VsdCkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFdoYXQoRGlzcGF0Y2hDb21tYW5kIGRjbWQpIHsKKyAgICBTdHJpbmcgY29tbWFuZE5hbWUgPSBkY21kLmdldENvbW1hbmROYW1lKCk7CisgICAgU3RyaW5nW10gYXJncyA9IGRjbWQuZ2V0QXJndW1lbnRzKCk7CisgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkgeworICAgICAgcmV0dXJuIGNvbW1hbmROYW1lICsgIi4iICsgYXJnc1sxXTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGNvbW1hbmROYW1lOwogICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwogICB9CiAKICAgcHJpdmF0ZSBsb25nIGV4dHJhY3RDcmVhdGVkKGZpbmFsIENvbnRleHQgY3R4KSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoTW9kdWxlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoTW9kdWxlLmphdmEKaW5kZXggN2Y0YTFmNy4uNmZhZDQyYiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hNb2R1bGUuamF2YQpAQCAtMjIsMTEgKzIyLDEwIEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkNtZExpbmVQYXJzZXJNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlBlZXJEYWVtb25Vc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5SZW1vdGVQZWVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRNYW5hZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkNoYW5nZVVzZXJOYW1lOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuRmFjdG9yeU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkdlcnJpdFJlcXVlc3RNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Bc3luY1JlY2VpdmVDb21taXRzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuUXVldWVQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5Nb2R1bGVHZW5lcmF0b3I7CkBAIC00NCw2ICs0Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5Db21tYW5kRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLlB1YmxpY2tleUF1dGhlbnRpY2F0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOworCiBpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC02NiwxMCArNjYsMTAgQEAKICAgICBiaW5kKFNzaFNjb3BlLmNsYXNzKS5pbihTSU5HTEVUT04pOwogCiAgICAgY29uZmlndXJlUmVxdWVzdFNjb3BlKCk7CisgICAgaW5zdGFsbChuZXcgQXN5bmNSZWNlaXZlQ29tbWl0cy5Nb2R1bGUoKSk7CiAgICAgaW5zdGFsbChuZXcgQ21kTGluZVBhcnNlck1vZHVsZSgpKTsKICAgICBjb25maWd1cmVBbGlhc2VzKCk7CiAKLSAgICBpbnN0YWxsKFNzaEtleUNhY2hlSW1wbC5tb2R1bGUoKSk7CiAgICAgYmluZChTc2hMb2cuY2xhc3MpOwogICAgIGJpbmQoU3NoSW5mby5jbGFzcykudG8oU3NoRGFlbW9uLmNsYXNzKS5pbihTSU5HTEVUT04pOwogICAgIGZhY3RvcnkoRGlzcGF0Y2hDb21tYW5kLkZhY3RvcnkuY2xhc3MpOwpAQCAtODMsOCArODMsNiBAQAogICAgIGJpbmQoV29ya1F1ZXVlLkV4ZWN1dG9yLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKFN0cmVhbUNvbW1hbmRFeGVjdXRvci5jbGFzcykKICAgICAgICAgLnRvUHJvdmlkZXIoU3RyZWFtQ29tbWFuZEV4ZWN1dG9yUHJvdmlkZXIuY2xhc3MpLmluKFNJTkdMRVRPTik7CiAgICAgYmluZChRdWV1ZVByb3ZpZGVyLmNsYXNzKS50byhDb21tYW5kRXhlY3V0b3JRdWV1ZVByb3ZpZGVyLmNsYXNzKS5pbihTSU5HTEVUT04pOwotICAgIGJpbmQoQWNjb3VudE1hbmFnZXIuY2xhc3MpOwotICAgIGZhY3RvcnkoQ2hhbmdlVXNlck5hbWUuRmFjdG9yeS5jbGFzcyk7CiAKICAgICBiaW5kKFB1YmxpY2tleUF1dGhlbnRpY2F0b3IuY2xhc3MpLnRvKERhdGFiYXNlUHViS2V5QXV0aC5jbGFzcyk7CiAgICAgYmluZChLZXlQYWlyUHJvdmlkZXIuY2xhc3MpLnRvUHJvdmlkZXIoSG9zdEtleVByb3ZpZGVyLmNsYXNzKS5pbihTSU5HTEVUT04pOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaFNjb3BlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoU2NvcGUuamF2YQppbmRleCBkNmY2NmNhLi4wYWU0MGE1IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoU2NvcGUuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoU2NvcGUuamF2YQpAQCAtMTQsMTkgKzE0LDIzIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLkN1cnJlbnRVc2VyOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuUmVxdWVzdENsZWFudXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5SZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5SZXF1ZXN0Q29udGV4dDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5UaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci51dGlsLlRocmVhZExvY2FsUmVxdWVzdFNjb3BlUHJvcGFnYXRvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuU2NoZW1hRmFjdG9yeTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk91dE9mU2NvcGVFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2NvcGU7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QudXRpbC5Qcm92aWRlcnM7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAvKiogR3VpY2Ugc2NvcGVzIGZvciBzdGF0ZSBkdXJpbmcgYW4gU1NIIGNvbm5lY3Rpb24uICovCkBAIC0zNCwyOSArMzgsMzQgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgS2V5PFJlcXVlc3RDbGVhbnVwPiBSQ19LRVkgPQogICAgICAgS2V5LmdldChSZXF1ZXN0Q2xlYW51cC5jbGFzcyk7CiAKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgS2V5PFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyPiBEQl9LRVkgPQorICAgICAgS2V5LmdldChSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlci5jbGFzcyk7CisKICAgY2xhc3MgQ29udGV4dCBpbXBsZW1lbnRzIFJlcXVlc3RDb250ZXh0IHsKLSAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3RDbGVhbnVwIGNsZWFudXA7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0Q2xlYW51cCBjbGVhbnVwID0gbmV3IFJlcXVlc3RDbGVhbnVwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8S2V5PD8+LCBPYmplY3Q+IG1hcCA9IE1hcHMubmV3SGFzaE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2NoZW1hRmFjdG9yeTsKICAgICBwcml2YXRlIGZpbmFsIFNzaFNlc3Npb24gc2Vzc2lvbjsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb21tYW5kTGluZTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxLZXk8Pz4sIE9iamVjdD4gbWFwOwogCiAgICAgZmluYWwgbG9uZyBjcmVhdGVkOwogICAgIHZvbGF0aWxlIGxvbmcgc3RhcnRlZDsKICAgICB2b2xhdGlsZSBsb25nIGZpbmlzaGVkOwogCi0gICAgcHJpdmF0ZSBDb250ZXh0KGZpbmFsIFNzaFNlc3Npb24gcywgZmluYWwgU3RyaW5nIGMsIGZpbmFsIGxvbmcgYXQpIHsKLSAgICAgIGNsZWFudXAgPSBuZXcgUmVxdWVzdENsZWFudXAoKTsKKyAgICBwcml2YXRlIENvbnRleHQoU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YsIGZpbmFsIFNzaFNlc3Npb24gcywKKyAgICAgICAgZmluYWwgU3RyaW5nIGMsIGZpbmFsIGxvbmcgYXQpIHsKKyAgICAgIHNjaGVtYUZhY3RvcnkgPSBzZjsKICAgICAgIHNlc3Npb24gPSBzOwogICAgICAgY29tbWFuZExpbmUgPSBjOwotCi0gICAgICBtYXAgPSBuZXcgSGFzaE1hcDxLZXk8Pz4sIE9iamVjdD4oKTsKLSAgICAgIG1hcC5wdXQoUkNfS0VZLCBjbGVhbnVwKTsKLQogICAgICAgY3JlYXRlZCA9IHN0YXJ0ZWQgPSBmaW5pc2hlZCA9IGF0OworICAgICAgbWFwLnB1dChSQ19LRVksIGNsZWFudXApOworICAgICAgbWFwLnB1dChEQl9LRVksIG5ldyBSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcigKKyAgICAgICAgICBzY2hlbWFGYWN0b3J5LAorICAgICAgICAgIFByb3ZpZGVycy5vZihjbGVhbnVwKSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgQ29udGV4dChDb250ZXh0IHAsIFNzaFNlc3Npb24gcywgU3RyaW5nIGMpIHsKLSAgICAgIHRoaXMocywgYywgcC5jcmVhdGVkKTsKKyAgICAgIHRoaXMocC5zY2hlbWFGYWN0b3J5LCBzLCBjLCBwLmNyZWF0ZWQpOwogICAgICAgc3RhcnRlZCA9IHAuc3RhcnRlZDsKICAgICAgIGZpbmlzaGVkID0gcC5maW5pc2hlZDsKICAgICB9CkBAIC03MywxMiArODIsMTggQEAKICAgICBwdWJsaWMgQ3VycmVudFVzZXIgZ2V0Q3VycmVudFVzZXIoKSB7CiAgICAgICBmaW5hbCBDdXJyZW50VXNlciB1c2VyID0gc2Vzc2lvbi5nZXRDdXJyZW50VXNlcigpOwogICAgICAgaWYgKHVzZXIgaW5zdGFuY2VvZiBJZGVudGlmaWVkVXNlcikgewotICAgICAgICByZXR1cm4gdXNlckZhY3RvcnkuY3JlYXRlKHVzZXIuZ2V0QWNjZXNzUGF0aCgpLCAvLwotICAgICAgICAgICAgKChJZGVudGlmaWVkVXNlcikgdXNlcikuZ2V0QWNjb3VudElkKCkpOworICAgICAgICBJZGVudGlmaWVkVXNlciBpZGVudGlmaWVkVXNlciA9IHVzZXJGYWN0b3J5LmNyZWF0ZSgoKElkZW50aWZpZWRVc2VyKSB1c2VyKS5nZXRBY2NvdW50SWQoKSk7CisgICAgICAgIGlkZW50aWZpZWRVc2VyLnNldEFjY2Vzc1BhdGgodXNlci5nZXRBY2Nlc3NQYXRoKCkpOworICAgICAgICByZXR1cm4gaWRlbnRpZmllZFVzZXI7CiAgICAgICB9CiAgICAgICByZXR1cm4gdXNlcjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvdmlkZXI8UmV2aWV3RGI+IGdldFJldmlld0RiUHJvdmlkZXIoKSB7CisgICAgICByZXR1cm4gKFJlcXVlc3RTY29wZWRSZXZpZXdEYlByb3ZpZGVyKSBtYXAuZ2V0KERCX0tFWSk7CisgICAgfQorCiAgICAgc3luY2hyb25pemVkIDxUPiBUIGdldChLZXk8VD4ga2V5LCBQcm92aWRlcjxUPiBjcmVhdG9yKSB7CiAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgIFQgdCA9IChUKSBtYXAuZ2V0KGtleSk7CkBAIC0xMTQsOCArMTI5LDkgQEAKICAgICBwcml2YXRlIGZpbmFsIFNzaFNjb3BlIHNzaFNjb3BlOwogCiAgICAgQEluamVjdAotICAgIFByb3BhZ2F0b3IoU3NoU2NvcGUgc3NoU2NvcGUsIFRocmVhZExvY2FsUmVxdWVzdENvbnRleHQgbG9jYWwpIHsKLSAgICAgIHN1cGVyKFJFUVVFU1QsIGN1cnJlbnQsIGxvY2FsKTsKKyAgICBQcm9wYWdhdG9yKFNzaFNjb3BlIHNzaFNjb3BlLCBUaHJlYWRMb2NhbFJlcXVlc3RDb250ZXh0IGxvY2FsLAorICAgICAgICBQcm92aWRlcjxSZXF1ZXN0U2NvcGVkUmV2aWV3RGJQcm92aWRlcj4gZGJQcm92aWRlclByb3ZpZGVyKSB7CisgICAgICBzdXBlcihSRVFVRVNULCBjdXJyZW50LCBsb2NhbCwgZGJQcm92aWRlclByb3ZpZGVyKTsKICAgICAgIHRoaXMuc3NoU2NvcGUgPSBzc2hTY29wZTsKICAgICB9CiAKQEAgLTE0OCw4ICsxNjQsOCBAQAogICAgIHRoaXMudXNlckZhY3RvcnkgPSB1c2VyRmFjdG9yeTsKICAgfQogCi0gIENvbnRleHQgbmV3Q29udGV4dChTc2hTZXNzaW9uIHNlc3Npb24sIFN0cmluZyBjb21tYW5kTGluZSkgewotICAgIHJldHVybiBuZXcgQ29udGV4dChzZXNzaW9uLCBjb21tYW5kTGluZSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICBDb250ZXh0IG5ld0NvbnRleHQoU2NoZW1hRmFjdG9yeTxSZXZpZXdEYj4gc2YsIFNzaFNlc3Npb24gcywgU3RyaW5nIGNtZCkgeworICAgIHJldHVybiBuZXcgQ29udGV4dChzZiwgcywgY21kLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgIH0KIAogICBwcml2YXRlIENvbnRleHQgbmV3Q29udGludWluZ0NvbnRleHQoQ29udGV4dCBjdHgpIHsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hTZXNzaW9uLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3NoU2Vzc2lvbi5qYXZhCmluZGV4IDNjNGQ0ZjguLjJjYzE2YjUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9Tc2hTZXNzaW9uLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1NzaFNlc3Npb24uamF2YQpAQCAtMTQsNiArMTQsNyBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQWNjZXNzUGF0aDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuQ3VycmVudFVzZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuY29tbW9uLlNlc3Npb24uQXR0cmlidXRlS2V5OwpAQCAtNDMsNiArNDQsNyBAQAogICB9CiAKICAgU3NoU2Vzc2lvbihTc2hTZXNzaW9uIHBhcmVudCwgU29ja2V0QWRkcmVzcyBwZWVyLCBDdXJyZW50VXNlciB1c2VyKSB7CisgICAgdXNlci5zZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGguU1NIX0NPTU1BTkQpOwogICAgIHRoaXMuc2Vzc2lvbklkID0gcGFyZW50LnNlc3Npb25JZDsKICAgICB0aGlzLnJlbW90ZUFkZHJlc3MgPSBwZWVyOwogICAgIGlmIChwYXJlbnQucmVtb3RlQWRkcmVzcyA9PSBwZWVyKSB7CkBAIC04Myw2ICs4NSwxMCBAQAogICAgIGF1dGhFcnJvciA9IGVycm9yOwogICB9CiAKKyAgdm9pZCBzZXRBY2Nlc3NQYXRoKEFjY2Vzc1BhdGggcGF0aCkgeworICAgIGlkZW50aXR5LnNldEFjY2Vzc1BhdGgocGF0aCk7CisgIH0KKwogICAvKiogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGF1dGhlbnRpY2F0aW9uIGRpZCBub3Qgc3VjY2VlZC4gKi8KICAgYm9vbGVhbiBpc0F1dGhlbnRpY2F0aW9uRXJyb3IoKSB7CiAgICAgcmV0dXJuIGF1dGhFcnJvciAhPSBudWxsOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1N1RXhlYy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL1N1RXhlYy5qYXZhCmluZGV4IDMzNDU5YzIuLmNjZjIzZTEgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9TdUV4ZWMuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvU3VFeGVjLmphdmEKQEAgLTE2LDcgKzE2LDYgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BdG9taWNzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5BY2Nlc3NQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLlBlZXJEYWVtb25Vc2VyOwpAQCAtMTE2LDE0ICsxMTUsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICBwZWVyID0gcGVlckFkZHJlc3M7CiAgICAgfQotCi0gICAgcmV0dXJuIG5ldyBTc2hTZXNzaW9uKHNlc3Npb24uZ2V0KCksIHBlZXIsIHVzZXJGYWN0b3J5LmNyZWF0ZSgKLSAgICAgICAgQWNjZXNzUGF0aC5TU0hfQ09NTUFORCwgbmV3IFByb3ZpZGVyPFNvY2tldEFkZHJlc3M+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBTb2NrZXRBZGRyZXNzIGdldCgpIHsKLSAgICAgICAgICAgIHJldHVybiBwZWVyOwotICAgICAgICAgIH0KLSAgICAgICAgfSwgYWNjb3VudElkKSk7CisgICAgcmV0dXJuIG5ldyBTc2hTZXNzaW9uKHNlc3Npb24uZ2V0KCksIHBlZXIsCisgICAgICAgIHVzZXJGYWN0b3J5LmNyZWF0ZShwZWVyLCBhY2NvdW50SWQpKTsKICAgfQogCiAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBqb2luKExpc3Q8U3RyaW5nPiBhcmdzKSB7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5RdWVyeVNoZWxsLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5RdWVyeVNoZWxsLmphdmEKaW5kZXggMDhjNjUwYy4uMTUyMjlkYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0FkbWluUXVlcnlTaGVsbC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9BZG1pblF1ZXJ5U2hlbGwuamF2YQpAQCAtMTUsOCArMTUsMTEgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmVycm9ycy5QZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkFkbWluSGlnaFByaW9yaXR5Q29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0yNCwxMSArMjcsMTUgQEAKIAogLyoqIE9wZW5zIGEgcXVlcnkgcHJvY2Vzc29yLiAqLwogQEFkbWluSGlnaFByaW9yaXR5Q29tbWFuZAotQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQUNDRVNTX0RBVEFCQVNFKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImdzcWwiLCBkZXNjciA9ICJBZG1pbmlzdHJhdGl2ZSBpbnRlcmZhY2UgdG8gYWN0aXZlIGRhdGFiYXNlIikKIGZpbmFsIGNsYXNzIEFkbWluUXVlcnlTaGVsbCBleHRlbmRzIFNzaENvbW1hbmQgewogICBASW5qZWN0CiAgIHByaXZhdGUgUXVlcnlTaGVsbC5GYWN0b3J5IGZhY3Rvcnk7CiAKKyAgQEluamVjdAorICBwcml2YXRlIElkZW50aWZpZWRVc2VyIGN1cnJlbnRVc2VyOworCiAgIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIHVzYWdlID0gIlNldCBvdXRwdXQgZm9ybWF0IikKICAgcHJpdmF0ZSBRdWVyeVNoZWxsLk91dHB1dEZvcm1hdCBmb3JtYXQgPSBRdWVyeVNoZWxsLk91dHB1dEZvcm1hdC5QUkVUVFk7CiAKQEAgLTM2LDEzICs0MywzNyBAQAogICBwcml2YXRlIFN0cmluZyBxdWVyeTsKIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgewotICAgIGZpbmFsIFF1ZXJ5U2hlbGwgc2hlbGwgPSBmYWN0b3J5LmNyZWF0ZShpbiwgb3V0KTsKLSAgICBzaGVsbC5zZXRPdXRwdXRGb3JtYXQoZm9ybWF0KTsKLSAgICBpZiAocXVlcnkgIT0gbnVsbCkgewotICAgICAgc2hlbGwuZXhlY3V0ZShxdWVyeSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNoZWxsLnJ1bigpOworICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRmFpbHVyZSB7CisgICAgdHJ5IHsKKyAgICAgIGNoZWNrUGVybWlzc2lvbigpOworCisgICAgICBmaW5hbCBRdWVyeVNoZWxsIHNoZWxsID0gZmFjdG9yeS5jcmVhdGUoaW4sIG91dCk7CisgICAgICBzaGVsbC5zZXRPdXRwdXRGb3JtYXQoZm9ybWF0KTsKKyAgICAgIGlmIChxdWVyeSAhPSBudWxsKSB7CisgICAgICAgIHNoZWxsLmV4ZWN1dGUocXVlcnkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2hlbGwucnVuKCk7CisgICAgICB9CisgICAgfSBjYXRjaCAoUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbiBlcnIpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoImZhdGFsOiAiICsgZXJyLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIEFzc2VydCB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaXMgcGVybWl0dGVkIHRvIHBlcmZvcm0gcmF3IHF1ZXJpZXMuCisgICAqIDxwPgorICAgKiBBcyB0aGUgQFJlcXVpcmVDYXBhYmlsaXR5IGd1YXJkcyBhdCB2YXJpb3VzIGVudHJ5IHBvaW50cyBvZiBpbnRlcm5hbAorICAgKiBjb21tYW5kcyBpbXBsaWNpdGx5IGFkZCBhZG1pbmlzdHJhdG9ycyAod2hpY2ggd2Ugd2FudCB0byBhdm9pZCksIHdlIGFsc28KKyAgICogY2hlY2sgcGVybWlzc2lvbnMgd2l0aGluIFF1ZXJ5U2hlbGwgYW5kIGdyYW50IGFjY2VzcyBvbmx5IHRvIHRob3NlIHdobworICAgKiBjYW5QZXJmb3JtUmF3UXVlcnksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBhZG1pbmlzdHJhdG9ycyBvciBub3QuCisgICAqCisgICAqIEB0aHJvd3MgUGVybWlzc2lvbkRlbmllZEV4Y2VwdGlvbgorICAgKi8KKyAgcHJpdmF0ZSB2b2lkIGNoZWNrUGVybWlzc2lvbigpIHRocm93cyBQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uIHsKKyAgICBpZiAoIWN1cnJlbnRVc2VyLmdldENhcGFiaWxpdGllcygpLmNhbkFjY2Vzc0RhdGFiYXNlKCkpIHsKKyAgICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRGVuaWVkRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgIiVzIGRvZXMgbm90IGhhdmUgXCJBY2Nlc3MgRGF0YWJhc2VcIiBjYXBhYmlsaXR5LiIsCisgICAgICAgICAgY3VycmVudFVzZXIuZ2V0VXNlck5hbWUoKSkpOwogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0FkbWluU2V0UGFyZW50LmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5TZXRQYXJlbnQuamF2YQppbmRleCA2NDgzZTI0Li5mYWYyMjI0IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5TZXRQYXJlbnQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQWRtaW5TZXRQYXJlbnQuamF2YQpAQCAtMTQsNiArMTQsOSBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuY29tbWFuZHM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CkBAIC0yMyw2ICsyNiw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zNSwxMSArMzksMTMgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAic2V0LXByb2plY3QtcGFyZW50IiwgZGVzY3IgPSAiQ2hhbmdlIHRoZSBwcm9qZWN0IHBlcm1pc3Npb25zIGFyZSBpbmhlcml0ZWQgZnJvbSIpCiBmaW5hbCBjbGFzcyBBZG1pblNldFBhcmVudCBleHRlbmRzIFNzaENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWRtaW5TZXRQYXJlbnQuY2xhc3MpOwogCkBAIC0xOTcsMTcgKzIwMywxNSBAQAogICB9CiAKICAgcHJpdmF0ZSBTZXQ8UHJvamVjdC5OYW1lS2V5PiBnZXRBbGxQYXJlbnRzKGZpbmFsIFByb2plY3QuTmFtZUtleSBwcm9qZWN0TmFtZSkgewotICAgIGZpbmFsIFNldDxQcm9qZWN0Lk5hbWVLZXk+IHBhcmVudHMgPSBuZXcgSGFzaFNldDxQcm9qZWN0Lk5hbWVLZXk+KCk7Ci0gICAgUHJvamVjdC5OYW1lS2V5IHAgPSBwcm9qZWN0TmFtZTsKLSAgICB3aGlsZSAocCAhPSBudWxsICYmIHBhcmVudHMuYWRkKHApKSB7Ci0gICAgICBmaW5hbCBQcm9qZWN0U3RhdGUgZSA9IHByb2plY3RDYWNoZS5nZXQocCk7Ci0gICAgICBpZiAoZSA9PSBudWxsKSB7Ci0gICAgICAgIC8vIElmIHdlIGNhbid0IGdldCBpdCBmcm9tIHRoZSBjYWNoZSwgcHJldGVuZCBpdCdzIG5vdCBwcmVzZW50LgotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHAgPSBlLmdldFByb2plY3QoKS5nZXRQYXJlbnQoYWxsUHJvamVjdHNOYW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmVudHM7CisgICAgUHJvamVjdFN0YXRlIHBzID0gcHJvamVjdENhY2hlLmdldChwcm9qZWN0TmFtZSk7CisgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoSXRlcmFibGVzLnRyYW5zZm9ybSgKKyAgICAgIHBzICE9IG51bGwgPyBwcy5wYXJlbnRzKCkgOiBDb2xsZWN0aW9ucy48UHJvamVjdFN0YXRlPiBlbXB0eVNldCgpLAorICAgICAgbmV3IEZ1bmN0aW9uPFByb2plY3RTdGF0ZSwgUHJvamVjdC5OYW1lS2V5PiAoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUHJvamVjdC5OYW1lS2V5IGFwcGx5KFByb2plY3RTdGF0ZSBpbikgeworICAgICAgICAgIHJldHVybiBpbi5nZXRQcm9qZWN0KCkuZ2V0TmFtZUtleSgpOworICAgICAgICB9CisgICAgICB9KSk7CiAgIH0KIAogICBwcml2YXRlIExpc3Q8UHJvamVjdD4gZ2V0Q2hpbGRyZW4oZmluYWwgUHJvamVjdC5OYW1lS2V5IHBhcmVudE5hbWUpIHsKQEAgLTIxOSw3ICsyMjMsNyBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAotICAgICAgaWYgKHBhcmVudE5hbWUuZXF1YWxzKGUuZ2V0UHJvamVjdCgpLmdldFBhcmVudChwcm9qZWN0TmFtZSkpKSB7CisgICAgICBpZiAocGFyZW50TmFtZS5lcXVhbHMoZS5nZXRQcm9qZWN0KCkuZ2V0UGFyZW50KGFsbFByb2plY3RzTmFtZSkpKSB7CiAgICAgICAgIGNoaWxkUHJvamVjdHMuYWRkKGUuZ2V0UHJvamVjdCgpKTsKICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQXBwcm92ZU9wdGlvbi5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0FwcHJvdmVPcHRpb24uamF2YQppbmRleCBhMWI4OTg4Li4yOTI1MGQzIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQXBwcm92ZU9wdGlvbi5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9BcHByb3ZlT3B0aW9uLmphdmEKQEAgLTE0LDkgKzE0LDggQEAKIAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5OwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BcHByb3ZhbENhdGVnb3J5VmFsdWU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuTGFiZWxUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVmFsdWU7CiAKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQ21kTGluZVBhcnNlcjsKQEAgLTMxLDExICszMCwxMSBAQAogZmluYWwgY2xhc3MgQXBwcm92ZU9wdGlvbiBpbXBsZW1lbnRzIE9wdGlvbiwgU2V0dGVyPFNob3J0PiB7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CiAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVzYWdlOwotICBwcml2YXRlIGZpbmFsIEFwcHJvdmFsVHlwZSB0eXBlOworICBwcml2YXRlIGZpbmFsIExhYmVsVHlwZSB0eXBlOwogCiAgIHByaXZhdGUgU2hvcnQgdmFsdWU7CiAKLSAgQXBwcm92ZU9wdGlvbihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHVzYWdlLCBmaW5hbCBBcHByb3ZhbFR5cGUgdHlwZSkgeworICBBcHByb3ZlT3B0aW9uKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgdXNhZ2UsIGZpbmFsIExhYmVsVHlwZSB0eXBlKSB7CiAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICB0aGlzLnVzYWdlID0gdXNhZ2U7CiAgICAgdGhpcy50eXBlID0gdHlwZTsKQEAgLTEwMCw4ICs5OSw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgQXBwcm92YWxDYXRlZ29yeS5JZCBnZXRDYXRlZ29yeUlkKCkgewotICAgIHJldHVybiB0eXBlLmdldENhdGVnb3J5KCkuZ2V0SWQoKTsKKyAgU3RyaW5nIGdldExhYmVsTmFtZSgpIHsKKyAgICByZXR1cm4gdHlwZS5nZXROYW1lKCk7CiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIEhhbmRsZXIgZXh0ZW5kcyBPbmVBcmd1bWVudE9wdGlvbkhhbmRsZXI8U2hvcnQ+IHsKQEAgLTEyMiw4ICsxMjEsOCBAQAogICAgICAgfQogCiAgICAgICBmaW5hbCBzaG9ydCB2YWx1ZSA9IFNob3J0LnBhcnNlU2hvcnQoYXJndW1lbnQpOwotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIG1pbiA9IGNtZE9wdGlvbi50eXBlLmdldE1pbigpOwotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeVZhbHVlIG1heCA9IGNtZE9wdGlvbi50eXBlLmdldE1heCgpOworICAgICAgZmluYWwgTGFiZWxWYWx1ZSBtaW4gPSBjbWRPcHRpb24udHlwZS5nZXRNaW4oKTsKKyAgICAgIGZpbmFsIExhYmVsVmFsdWUgbWF4ID0gY21kT3B0aW9uLnR5cGUuZ2V0TWF4KCk7CiAKICAgICAgIGlmICh2YWx1ZSA8IG1pbi5nZXRWYWx1ZSgpIHx8IHZhbHVlID4gbWF4LmdldFZhbHVlKCkpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBjbWRPcHRpb24ubmFtZSgpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0JhbkNvbW1pdENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9CYW5Db21taXRDb21tYW5kLmphdmEKaW5kZXggOTM5ZDY4YS4uMDI2OGJjMCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0JhbkNvbW1pdENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQmFuQ29tbWl0Q29tbWFuZC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5CYW5Db21taXRSZXN1bHQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXJnZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zMiw2ICszMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImJhbi1jb21taXQiLCBkZXNjciA9ICJCYW4gYSBjb21taXQgZnJvbSBhIHByb2plY3QncyByZXBvc2l0b3J5IikKIHB1YmxpYyBjbGFzcyBCYW5Db21taXRDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBPcHRpb24obmFtZSA9ICItLXJlYXNvbiIsIGFsaWFzZXMgPSB7Ii1yIn0sIG1ldGFWYXIgPSAiUkVBU09OIiwgdXNhZ2UgPSAicmVhc29uIGZvciBiYW5uaW5nIHRoZSBjb21taXQiKQogICBwcml2YXRlIFN0cmluZyByZWFzb247CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQmFzZVRlc3RQcm9sb2dDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQmFzZVRlc3RQcm9sb2dDb21tYW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxM2ZkNgotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9CYXNlVGVzdFByb2xvZ0NvbW1hbmQuamF2YQpAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKKworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5JZFN0cmluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlRvcExldmVsUmVzb3VyY2U7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLk91dHB1dEZvcm1hdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZXNDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aXNpb25SZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJldmlzaW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlRlc3RTdWJtaXRSdWxlLkZpbHRlcnM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5UZXN0U3VibWl0UnVsZS5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLklPOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdQYXJzZVV0aWxzOworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKK2ltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworYWJzdHJhY3QgY2xhc3MgQmFzZVRlc3RQcm9sb2dDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CisgIHByaXZhdGUgSW5wdXQgaW5wdXQgPSBuZXcgSW5wdXQoKTsKKworICBASW5qZWN0CisgIHByaXZhdGUgQ2hhbmdlc0NvbGxlY3Rpb24gY2hhbmdlczsKKworICBASW5qZWN0CisgIHByaXZhdGUgUmV2aXNpb25zIHJldmlzaW9uczsKKworICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIHVzYWdlID0gIkNoYW5nZUlkIHRvIGxvYWQgaW4gcHJvbG9nIGVudmlyb25tZW50IikKKyAgcHJvdGVjdGVkIFN0cmluZyBjaGFuZ2VJZDsKKworICBAT3B0aW9uKG5hbWUgPSAiLXMiLAorICAgICAgdXNhZ2UgPSAiUmVhZCBwcm9sb2cgc2NyaXB0IGZyb20gc3RkaW4gaW5zdGVhZCBvZiByZWFkaW5nIHJ1bGVzLnBsIGZyb20gdGhlIHJlZnMvbWV0YS9jb25maWcgYnJhbmNoIikKKyAgcHJvdGVjdGVkIGJvb2xlYW4gdXNlU3RkaW47CisKKyAgQE9wdGlvbihuYW1lID0gIi0tbm8tZmlsdGVycyIsIGFsaWFzZXMgPSB7Ii1uIn0sCisgICAgICB1c2FnZSA9ICJEb24ndCBydW4gdGhlIHN1Ym1pdF9maWx0ZXIvMiBmcm9tIHRoZSBwYXJlbnQgcHJvamVjdHMiKQorICB2b2lkIHNldE5vRmlsdGVycyhib29sZWFuIG5vKSB7CisgICAgaW5wdXQuZmlsdGVycyA9IG5vID8gRmlsdGVycy5TS0lQIDogRmlsdGVycy5SVU47CisgIH0KKworICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVzdE1vZGlmeVZpZXc8UmV2aXNpb25SZXNvdXJjZSwgSW5wdXQ+IGNyZWF0ZVZpZXcoKTsKKworICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBydW4oKSB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlIHsKKyAgICB0cnkgeworICAgICAgUmV2aXNpb25SZXNvdXJjZSByZXZpc2lvbiA9IHJldmlzaW9ucy5wYXJzZSgKKyAgICAgICAgICBjaGFuZ2VzLnBhcnNlKAorICAgICAgICAgICAgICBUb3BMZXZlbFJlc291cmNlLklOU1RBTkNFLAorICAgICAgICAgICAgICBJZFN0cmluZy5mcm9tVXJsKGNoYW5nZUlkKSksCisgICAgICAgICAgSWRTdHJpbmcuZnJvbVVybCgiY3VycmVudCIpKTsKKyAgICAgIGlmICh1c2VTdGRpbikgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IElPLnJlYWRXaG9sZVN0cmVhbShpbiwgNDA5Nik7CisgICAgICAgIGlucHV0LnJ1bGUgPSBSYXdQYXJzZVV0aWxzLmRlY29kZSgKKyAgICAgICAgICAgIGJ1Zi5hcnJheSgpLAorICAgICAgICAgICAgYnVmLmFycmF5T2Zmc2V0KCksCisgICAgICAgICAgICBidWYubGltaXQoKSk7CisgICAgICB9CisgICAgICBPYmplY3QgcmVzdWx0ID0gY3JlYXRlVmlldygpLmFwcGx5KHJldmlzaW9uLCBpbnB1dCk7CisgICAgICBPdXRwdXRGb3JtYXQuSlNPTi5uZXdHc29uKCkudG9Kc29uKHJlc3VsdCwgc3Rkb3V0KTsKKyAgICAgIHN0ZG91dC5wcmludCgnXG4nKTsKKyAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgiUHJvY2Vzc2luZyBvZiBwcm9sb2cgc2NyaXB0IGZhaWxlZDogIiArIGUpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZUFjY291bnRDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlQWNjb3VudENvbW1hbmQuamF2YQppbmRleCBkNmZlY2FiLi5jMjA5MjQ5IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlQWNjb3VudENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlQWNjb3VudENvbW1hbmQuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LkFjY291bnRCeUVtYWlsQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zc2guU3NoS2V5Q2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1EdXBsaWNhdGVLZXlFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKQEAgLTQ3LDYgKzQ4LDcgQEAKIAogLyoqIENyZWF0ZSBhIG5ldyB1c2VyIGFjY291bnQuICoqLwogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkNSRUFURV9BQ0NPVU5UKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImNyZWF0ZS1hY2NvdW50IiwgZGVzY3IgPSAiQ3JlYXRlIGEgbmV3IGJhdGNoL3JvbGUgYWNjb3VudCIpCiBmaW5hbCBjbGFzcyBDcmVhdGVBY2NvdW50Q29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAT3B0aW9uKG5hbWUgPSAiLS1ncm91cCIsIGFsaWFzZXMgPSB7Ii1nIn0sIG1ldGFWYXIgPSAiR1JPVVAiLCB1c2FnZSA9ICJncm91cHMgdG8gYWRkIGFjY291bnQgdG8iKQogICBwcml2YXRlIExpc3Q8QWNjb3VudEdyb3VwLklkPiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PEFjY291bnRHcm91cC5JZD4oKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9DcmVhdGVHcm91cENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9DcmVhdGVHcm91cENvbW1hbmQuamF2YQppbmRleCA3MjhjMjBjLi42NjA0NjBhIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvQ3JlYXRlR3JvdXBDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZUdyb3VwQ29tbWFuZC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LkFjY291bnRHcm91cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5QZXJmb3JtQ3JlYXRlR3JvdXA7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwpAQCAtMzcsNiArMzgsNyBAQAogICogT3B0aW9uYWxseSwgcHV0cyBhbiBpbml0aWFsIHNldCBvZiB1c2VyIGluIHRoZSBuZXdseSBjcmVhdGVkIGdyb3VwLgogICovCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX0dST1VQKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImNyZWF0ZS1ncm91cCIsIGRlc2NyID0gIkNyZWF0ZSBhIG5ldyBhY2NvdW50IGdyb3VwIikKIGZpbmFsIGNsYXNzIENyZWF0ZUdyb3VwQ29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAT3B0aW9uKG5hbWUgPSAiLS1vd25lciIsIGFsaWFzZXMgPSB7Ii1vIn0sIG1ldGFWYXIgPSAiR1JPVVAiLCB1c2FnZSA9ICJvd25pbmcgZ3JvdXAsIGlmIG5vdCBzcGVjaWZpZWQgdGhlIGdyb3VwIHdpbGwgYmUgc2VsZi1vd25pbmciKQogICBwcml2YXRlIEFjY291bnRHcm91cC5JZCBvd25lckdyb3VwSWQ7CkBAIC01NywxMCArNTksMTAgQEAKICAgQE9wdGlvbihuYW1lID0gIi0tdmlzaWJsZS10by1hbGwiLCB1c2FnZSA9ICJ0byBtYWtlIHRoZSBncm91cCB2aXNpYmxlIHRvIGFsbCByZWdpc3RlcmVkIHVzZXJzIikKICAgcHJpdmF0ZSBib29sZWFuIHZpc2libGVUb0FsbDsKIAotICBwcml2YXRlIGZpbmFsIFNldDxBY2NvdW50R3JvdXAuSWQ+IGluaXRpYWxHcm91cHMgPSBuZXcgSGFzaFNldDxBY2NvdW50R3JvdXAuSWQ+KCk7CisgIHByaXZhdGUgZmluYWwgU2V0PEFjY291bnRHcm91cC5VVUlEPiBpbml0aWFsR3JvdXBzID0gbmV3IEhhc2hTZXQ8QWNjb3VudEdyb3VwLlVVSUQ+KCk7CiAKICAgQE9wdGlvbihuYW1lID0gIi0tZ3JvdXAiLCBhbGlhc2VzID0gIi1nIiwgbWV0YVZhciA9ICJHUk9VUCIsIHVzYWdlID0gImluaXRpYWwgc2V0IG9mIGdyb3VwcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZ3JvdXAiKQotICB2b2lkIGFkZEdyb3VwKGZpbmFsIEFjY291bnRHcm91cC5JZCBpZCkgeworICB2b2lkIGFkZEdyb3VwKGZpbmFsIEFjY291bnRHcm91cC5VVUlEIGlkKSB7CiAgICAgaW5pdGlhbEdyb3Vwcy5hZGQoaWQpOwogICB9CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9DcmVhdGVQcm9qZWN0Q29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZVByb2plY3RDb21tYW5kLmphdmEKaW5kZXggNWY1YjFlMy4uYmQ2MjRhZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZVByb2plY3RDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0NyZWF0ZVByb2plY3RDb21tYW5kLmphdmEKQEAgLTE5LDExICsxOSwxMyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50R3JvdXA7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuQ3JlYXRlUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5QZXJmb3JtQ3JlYXRlUHJvamVjdDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DcmVhdGVQcm9qZWN0QXJnczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5TdWdnZXN0UGFyZW50Q2FuZGlkYXRlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zNCw2ICszNiw3IEBACiAKIC8qKiBDcmVhdGUgYSBuZXcgcHJvamVjdC4gKiovCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQ1JFQVRFX1BST0pFQ1QpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAiY3JlYXRlLXByb2plY3QiLCBkZXNjciA9ICJDcmVhdGUgYSBuZXcgcHJvamVjdCBhbmQgYXNzb2NpYXRlZCBHaXQgcmVwb3NpdG9yeSIpCiBmaW5hbCBjbGFzcyBDcmVhdGVQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAT3B0aW9uKG5hbWUgPSAiLS1uYW1lIiwgYWxpYXNlcyA9IHsiLW4ifSwgbWV0YVZhciA9ICJOQU1FIiwgdXNhZ2UgPSAibmFtZSBvZiBwcm9qZWN0IHRvIGJlIGNyZWF0ZWQgKGRlcHJlY2F0ZWQgb3B0aW9uKSIpCiAgIHZvaWQgc2V0UHJvamVjdE5hbWVGcm9tT3B0aW9uKFN0cmluZyBuYW1lKSB7CkBAIC02NCwxNyArNjcsMzcgQEAKICAgICAgICsgIihkZWZhdWx0OiBNRVJHRV9JRl9ORUNFU1NBUlkpIikKICAgcHJpdmF0ZSBTdWJtaXRUeXBlIHN1Ym1pdFR5cGUgPSBTdWJtaXRUeXBlLk1FUkdFX0lGX05FQ0VTU0FSWTsKIAorICBAT3B0aW9uKG5hbWUgPSAiLS1jb250cmlidXRvci1hZ3JlZW1lbnRzIiwgdXNhZ2UgPSAiaWYgY29udHJpYnV0b3IgYWdyZWVtZW50IGlzIHJlcXVpcmVkIikKKyAgcHJpdmF0ZSBJbmhlcml0YWJsZUJvb2xlYW4gY29udHJpYnV0b3JBZ3JlZW1lbnRzID0gSW5oZXJpdGFibGVCb29sZWFuLklOSEVSSVQ7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tc2lnbmVkLW9mZi1ieSIsIHVzYWdlID0gImlmIHNpZ25lZC1vZmYtYnkgaXMgcmVxdWlyZWQiKQorICBwcml2YXRlIEluaGVyaXRhYmxlQm9vbGVhbiBzaWduZWRPZmZCeSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworCisgIEBPcHRpb24obmFtZSA9ICItLWNvbnRlbnQtbWVyZ2UiLCB1c2FnZSA9ICJhbGxvdyBhdXRvbWF0aWMgY29uZmxpY3QgcmVzb2x2aW5nIHdpdGhpbiBmaWxlcyIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIGNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworCisgIEBPcHRpb24obmFtZSA9ICItLWNoYW5nZS1pZCIsIHVzYWdlID0gImlmIGNoYW5nZS1pZCBpcyByZXF1aXJlZCIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIHJlcXVpcmVDaGFuZ2VJRCA9IEluaGVyaXRhYmxlQm9vbGVhbi5JTkhFUklUOworCiAgIEBPcHRpb24obmFtZSA9ICItLXVzZS1jb250cmlidXRvci1hZ3JlZW1lbnRzIiwgYWxpYXNlcyA9IHsiLS1jYSJ9LCB1c2FnZSA9ICJpZiBjb250cmlidXRvciBhZ3JlZW1lbnQgaXMgcmVxdWlyZWQiKQotICBwcml2YXRlIGJvb2xlYW4gY29udHJpYnV0b3JBZ3JlZW1lbnRzOworICB2b2lkIHNldFVzZUNvbnRyaWJ1dG9yQXJncmVlbWVudHMoYm9vbGVhbiBvbikgeworICAgIGNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tdXNlLXNpZ25lZC1vZmYtYnkiLCBhbGlhc2VzID0geyItLXNvIn0sIHVzYWdlID0gImlmIHNpZ25lZC1vZmYtYnkgaXMgcmVxdWlyZWQiKQotICBwcml2YXRlIGJvb2xlYW4gc2lnbmVkT2ZmQnk7CisgIHZvaWQgc2V0VXNlU2lnbmVkT2ZmQnkoYm9vbGVhbiBvbikgeworICAgIHNpZ25lZE9mZkJ5ID0gSW5oZXJpdGFibGVCb29sZWFuLlRSVUU7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS11c2UtY29udGVudC1tZXJnZSIsIHVzYWdlID0gImFsbG93IGF1dG9tYXRpYyBjb25mbGljdCByZXNvbHZpbmcgd2l0aGluIGZpbGVzIikKLSAgcHJpdmF0ZSBib29sZWFuIGNvbnRlbnRNZXJnZTsKKyAgdm9pZCBzZXRVc2VDb250ZW50TWVyZ2UoYm9vbGVhbiBvbikgeworICAgIGNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tcmVxdWlyZS1jaGFuZ2UtaWQiLCBhbGlhc2VzID0geyItLWlkIn0sIHVzYWdlID0gImlmIGNoYW5nZS1pZCBpcyByZXF1aXJlZCIpCi0gIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlQ2hhbmdlSUQ7CisgIHZvaWQgc2V0UmVxdWlyZUNoYW5nZUlkKGJvb2xlYW4gb24pIHsKKyAgICByZXF1aXJlQ2hhbmdlSUQgPSBJbmhlcml0YWJsZUJvb2xlYW4uVFJVRTsKKyAgfQogCiAgIEBPcHRpb24obmFtZSA9ICItLWJyYW5jaCIsIGFsaWFzZXMgPSB7Ii1iIn0sIG1ldGFWYXIgPSAiQlJBTkNIIiwgdXNhZ2UgPSAiaW5pdGlhbCBicmFuY2ggbmFtZVxuIgogICAgICAgKyAiKGRlZmF1bHQ6IG1hc3RlcikiKQpAQCAtOTUsNyArMTE4LDcgQEAKICAgfQogCiAgIEBJbmplY3QKLSAgcHJpdmF0ZSBDcmVhdGVQcm9qZWN0LkZhY3RvcnkgQ3JlYXRlUHJvamVjdEZhY3Rvcnk7CisgIHByaXZhdGUgUGVyZm9ybUNyZWF0ZVByb2plY3QuRmFjdG9yeSBmYWN0b3J5OwogCiAgIEBJbmplY3QKICAgcHJpdmF0ZSBTdWdnZXN0UGFyZW50Q2FuZGlkYXRlcy5GYWN0b3J5IHN1Z2dlc3RQYXJlbnRDYW5kaWRhdGVzRmFjdG9yeTsKQEAgLTEyMSw4ICsxNDQsNyBAQAogICAgICAgICBhcmdzLmJyYW5jaCA9IGJyYW5jaDsKICAgICAgICAgYXJncy5jcmVhdGVFbXB0eUNvbW1pdCA9IGNyZWF0ZUVtcHR5Q29tbWl0OwogCi0gICAgICAgIGZpbmFsIENyZWF0ZVByb2plY3QgY3JlYXRlUHJvamVjdCA9Ci0gICAgICAgICAgICBDcmVhdGVQcm9qZWN0RmFjdG9yeS5jcmVhdGUoYXJncyk7CisgICAgICAgIGZpbmFsIFBlcmZvcm1DcmVhdGVQcm9qZWN0IGNyZWF0ZVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZShhcmdzKTsKICAgICAgICAgY3JlYXRlUHJvamVjdC5jcmVhdGVQcm9qZWN0KCk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBMaXN0PFByb2plY3QuTmFtZUtleT4gcGFyZW50Q2FuZGlkYXRlcyA9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvRGVmYXVsdENvbW1hbmRNb2R1bGUuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9EZWZhdWx0Q29tbWFuZE1vZHVsZS5qYXZhCmluZGV4IDJhNGRlZGMuLjM1YTRlMTQgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9EZWZhdWx0Q29tbWFuZE1vZHVsZS5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9EZWZhdWx0Q29tbWFuZE1vZHVsZS5qYXZhCkBAIC0zNiwyNSArMzYsMjggQEAKICAgICAvLyBTbGF2ZUNvbW1hbmRNb2R1bGUuCiAKICAgICBjb21tYW5kKGdlcnJpdCkudG9Qcm92aWRlcihuZXcgRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIoZ2Vycml0KSk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJiYW4tY29tbWl0IikudG8oQmFuQ29tbWl0Q29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJmbHVzaC1jYWNoZXMiKS50byhGbHVzaENhY2hlcy5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJscy1wcm9qZWN0cyIpLnRvKExpc3RQcm9qZWN0c0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAibHMtZ3JvdXBzIikudG8oTGlzdEdyb3Vwc0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAicXVlcnkiKS50byhRdWVyeS5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJzaG93LWNhY2hlcyIpLnRvKFNob3dDYWNoZXMuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAic2hvdy1jb25uZWN0aW9ucyIpLnRvKFNob3dDb25uZWN0aW9ucy5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJzaG93LXF1ZXVlIikudG8oU2hvd1F1ZXVlLmNsYXNzKTsKLSAgICBjb21tYW5kKGdlcnJpdCwgInN0cmVhbS1ldmVudHMiKS50byhTdHJlYW1FdmVudHMuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAidmVyc2lvbiIpLnRvKFZlcnNpb25Db21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgQmFuQ29tbWl0Q29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIEZsdXNoQ2FjaGVzLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgTGlzdFByb2plY3RzQ29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIExpc3RHcm91cHNDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgTHNVc2VyUmVmcy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFF1ZXJ5LmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgU2hvd0NhY2hlcy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFNob3dDb25uZWN0aW9ucy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFNob3dRdWV1ZS5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFN0cmVhbUV2ZW50cy5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIFZlcnNpb25Db21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgR2FyYmFnZUNvbGxlY3Rpb25Db21tYW5kLmNsYXNzKTsKIAogICAgIGNvbW1hbmQoZ2Vycml0LCAicGx1Z2luIikudG9Qcm92aWRlcihuZXcgRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIocGx1Z2luKSk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJscyIpLnRvKFBsdWdpbkxzQ29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJlbmFibGUiKS50byhQbHVnaW5FbmFibGVDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKHBsdWdpbiwgImluc3RhbGwiKS50byhQbHVnaW5JbnN0YWxsQ29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJyZWxvYWQiKS50byhQbHVnaW5SZWxvYWRDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKHBsdWdpbiwgInJlbW92ZSIpLnRvKFBsdWdpblJlbW92ZUNvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQocGx1Z2luLCAiYWRkIikudG8oQ29tbWFuZHMua2V5KHBsdWdpbiwgImluc3RhbGwiKSk7Ci0gICAgY29tbWFuZChwbHVnaW4sICJybSIpLnRvKENvbW1hbmRzLmtleShwbHVnaW4sICJyZW1vdmUiKSk7CisKKyAgICBjb21tYW5kKHBsdWdpbiwgUGx1Z2luTHNDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKHBsdWdpbiwgUGx1Z2luRW5hYmxlQ29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChwbHVnaW4sIFBsdWdpbkluc3RhbGxDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKHBsdWdpbiwgUGx1Z2luUmVsb2FkQ29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChwbHVnaW4sIFBsdWdpblJlbW92ZUNvbW1hbmQuY2xhc3MpOworICAgIGFsaWFzKHBsdWdpbiwgImFkZCIsIFBsdWdpbkluc3RhbGxDb21tYW5kLmNsYXNzKTsKKyAgICBhbGlhcyhwbHVnaW4sICJybSIsIFBsdWdpblJlbW92ZUNvbW1hbmQuY2xhc3MpOwogCiAgICAgY29tbWFuZChnaXQpLnRvUHJvdmlkZXIobmV3IERpc3BhdGNoQ29tbWFuZFByb3ZpZGVyKGdpdCkpOwogICAgIGNvbW1hbmQoZ2l0LCAicmVjZWl2ZS1wYWNrIikudG8oQ29tbWFuZHMua2V5KGdlcnJpdCwgInJlY2VpdmUtcGFjayIpKTsKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9GbHVzaENhY2hlcy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0ZsdXNoQ2FjaGVzLmphdmEKaW5kZXggZmE2MzA0MS4uMTNhYmRmNCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0ZsdXNoQ2FjaGVzLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0ZsdXNoQ2FjaGVzLmphdmEKQEAgLTE5LDYgKzE5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5CYXNlQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKQEAgLTMxLDYgKzMyLDcgQEAKIAogLyoqIENhdXNlcyB0aGUgY2FjaGVzIHRvIHB1cmdlIGFsbCBlbnRyaWVzIGFuZCByZWxvYWQuICovCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuRkxVU0hfQ0FDSEVTKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImZsdXNoLWNhY2hlcyIsIGRlc2NyID0gIkZsdXNoIHNvbWUvYWxsIHNlcnZlciBjYWNoZXMgZnJvbSBtZW1vcnkiKQogZmluYWwgY2xhc3MgRmx1c2hDYWNoZXMgZXh0ZW5kcyBDYWNoZUNvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1NFU1NJT05TID0gIndlYl9zZXNzaW9ucyI7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9HYXJiYWdlQ29sbGVjdGlvbkNvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9HYXJiYWdlQ29sbGVjdGlvbkNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTYxMTUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0dhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LkdhcmJhZ2VDb2xsZWN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDYWNoZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkJhc2VDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OworaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqIFJ1bnMgdGhlIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24uICovCitAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuUlVOX0dDKQorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gImdjIiwgZGVzY3IgPSAiUnVuIEdpdCBnYXJiYWdlIGNvbGxlY3Rpb24iKQorcHVibGljIGNsYXNzIEdhcmJhZ2VDb2xsZWN0aW9uQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kIHsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1hbGwiLCB1c2FnZSA9ICJydW5zIHRoZSBHaXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBhbGwgcHJvamVjdHMiKQorICBwcml2YXRlIGJvb2xlYW4gYWxsOworCisgIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gZmFsc2UsIG11bHRpVmFsdWVkID0gdHJ1ZSwgbWV0YVZhciA9ICJOQU1FIiwKKyAgICAgIHVzYWdlID0gInByb2plY3RzIGZvciB3aGljaCB0aGUgR2l0IGdhcmJhZ2UgY29sbGVjdGlvbiBzaG91bGQgYmUgcnVuIikKKyAgcHJpdmF0ZSBMaXN0PFByb2plY3RDb250cm9sPiBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8UHJvamVjdENvbnRyb2w+KCk7CisKKyAgQEluamVjdAorICBwcml2YXRlIFByb2plY3RDYWNoZSBwcm9qZWN0Q2FjaGU7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdhcmJhZ2VDb2xsZWN0aW9uLkZhY3RvcnkgZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5OworCisgIHByaXZhdGUgUHJpbnRXcml0ZXIgc3Rkb3V0OworCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBzdGFydChFbnZpcm9ubWVudCBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgc3RhcnRUaHJlYWQobmV3IENvbW1hbmRSdW5uYWJsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0ZG91dCA9IHRvUHJpbnRXcml0ZXIob3V0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBwYXJzZUNvbW1hbmRMaW5lKCk7CisgICAgICAgICAgdmVyaWZ5Q29tbWFuZExpbmUoKTsKKyAgICAgICAgICBydW5HQygpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgICB9CisgICAgICB9CisgICAgfSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29tbWFuZExpbmUoKSB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlIHsKKyAgICBpZiAoIWFsbCAmJiBwcm9qZWN0cy5pc0VtcHR5KCkpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwKKyAgICAgICAgICAibmVlZHMgcHJvamVjdHMgYXMgY29tbWFuZCBhcmd1bWVudHMgb3IgLS1hbGwgb3B0aW9uIik7CisgICAgfQorICAgIGlmIChhbGwgJiYgIXByb2plY3RzLmlzRW1wdHkoKSkgeworICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLAorICAgICAgICAgICJlaXRoZXIgc3BlY2lmeSBwcm9qZWN0cyBhcyBjb21tYW5kIGFyZ3VtZW50cyBvciB1c2UgLS1hbGwgb3B0aW9uIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJ1bkdDKCkgeworICAgIExpc3Q8UHJvamVjdC5OYW1lS2V5PiBwcm9qZWN0TmFtZXM7CisgICAgaWYgKGFsbCkgeworICAgICAgcHJvamVjdE5hbWVzID0gTGlzdHMubmV3QXJyYXlMaXN0KHByb2plY3RDYWNoZS5hbGwoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHByb2plY3ROYW1lcyA9IExpc3RzLm5ld0FycmF5TGlzdFdpdGhDYXBhY2l0eShwcm9qZWN0cy5zaXplKCkpOworICAgICAgZm9yIChQcm9qZWN0Q29udHJvbCBwYyA6IHByb2plY3RzKSB7CisgICAgICAgIHByb2plY3ROYW1lcy5hZGQocGMuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgICB9CisgICAgfQorCisgICAgR2FyYmFnZUNvbGxlY3Rpb25SZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgZ2FyYmFnZUNvbGxlY3Rpb25GYWN0b3J5LmNyZWF0ZSgpLnJ1bihwcm9qZWN0TmFtZXMsIHN0ZG91dCk7CisgICAgaWYgKHJlc3VsdC5oYXNFcnJvcnMoKSkgeworICAgICAgZm9yIChHYXJiYWdlQ29sbGVjdGlvblJlc3VsdC5FcnJvciBlIDogcmVzdWx0LmdldEVycm9ycygpKSB7CisgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgIHN3aXRjaCAoZS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICBjYXNlIFJFUE9TSVRPUllfTk9UX0ZPVU5EOgorICAgICAgICAgICAgbXNnID0gImVycm9yOiBwcm9qZWN0IFwiIiArIGUuZ2V0UHJvamVjdE5hbWUoKSArICJcIiBub3QgZm91bmQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBHQ19BTFJFQURZX1NDSEVEVUxFRDoKKyAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBwcm9qZWN0IFwiIgorICAgICAgICAgICAgICAgICsgZS5nZXRQcm9qZWN0TmFtZSgpICsgIlwiIHdhcyBhbHJlYWR5IHNjaGVkdWxlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIEdDX0ZBSUxFRDoKKyAgICAgICAgICAgIG1zZyA9ICJlcnJvcjogZ2FyYmFnZSBjb2xsZWN0aW9uIGZvciBwcm9qZWN0IFwiIiArIGUuZ2V0UHJvamVjdE5hbWUoKQorICAgICAgICAgICAgICAgICsgIlwiIGZhaWxlZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbXNnID0gImVycm9yOiBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIHByb2plY3QgXCIiICsgZS5nZXRQcm9qZWN0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiXCIgZmFpbGVkOiAiICsgZS5nZXRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgc3Rkb3V0LnByaW50KG1zZyArICJcbiIpOworICAgICAgfQorICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0xpc3RHcm91cHNDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdEdyb3Vwc0NvbW1hbmQuamF2YQppbmRleCBmODg1NmYyLi5lNWI0MjAzIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdEdyb3Vwc0NvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdEdyb3Vwc0NvbW1hbmQuamF2YQpAQCAtMTQsOTMgKzE0LDkxIEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdyb3VwTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlVybDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudEdyb3VwOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5JZGVudGlmaWVkVXNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5HZXRHcm91cHM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuR3JvdXBDYWNoZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5WaXNpYmxlR3JvdXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50Lkdyb3VwQ29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ3JvdXAuR3JvdXBKc29uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5Hcm91cEpzb24uR3JvdXBJbmZvOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5ncm91cC5MaXN0R3JvdXBzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5pb3V0aWwuQ29sdW1uRm9ybWF0dGVyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKLWltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5jbGllbnQuS2V5VXRpbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkJhc2VDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOworaW1wb3J0IGNvbS5nb29nbGUuZ3d0b3JtLnNlcnZlci5Pcm1FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5FbnZpcm9ubWVudDsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogCi1wdWJsaWMgY2xhc3MgTGlzdEdyb3Vwc0NvbW1hbmQgZXh0ZW5kcyBTc2hDb21tYW5kIHsKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJscy1ncm91cHMiLCBkZXNjciA9ICJMaXN0IGdyb3VwcyB2aXNpYmxlIHRvIHRoZSBjYWxsZXIiKQorcHVibGljIGNsYXNzIExpc3RHcm91cHNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQgewogICBASW5qZWN0Ci0gIHByaXZhdGUgR3JvdXBDYWNoZSBncm91cENhY2hlOwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBWaXNpYmxlR3JvdXBzLkZhY3RvcnkgdmlzaWJsZUdyb3Vwc0ZhY3Rvcnk7Ci0KLSAgQEluamVjdAotICBwcml2YXRlIElkZW50aWZpZWRVc2VyLkdlbmVyaWNGYWN0b3J5IHVzZXJGYWN0b3J5OwotCi0gIEBPcHRpb24obmFtZSA9ICItLXByb2plY3QiLCBhbGlhc2VzID0geyItcCJ9LAotICAgICAgdXNhZ2UgPSAicHJvamVjdHMgZm9yIHdoaWNoIHRoZSBncm91cHMgc2hvdWxkIGJlIGxpc3RlZCIpCi0gIHByaXZhdGUgZmluYWwgTGlzdDxQcm9qZWN0Q29udHJvbD4gcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PFByb2plY3RDb250cm9sPigpOwotCi0gIEBPcHRpb24obmFtZSA9ICItLXZpc2libGUtdG8tYWxsIiwgdXNhZ2UgPSAidG8gbGlzdCBvbmx5IGdyb3VwcyB0aGF0IGFyZSB2aXNpYmxlIHRvIGFsbCByZWdpc3RlcmVkIHVzZXJzIikKLSAgcHJpdmF0ZSBib29sZWFuIHZpc2libGVUb0FsbDsKLQotICBAT3B0aW9uKG5hbWUgPSAiLS10eXBlIiwgdXNhZ2UgPSAidHlwZSBvZiBncm91cCIpCi0gIHByaXZhdGUgQWNjb3VudEdyb3VwLlR5cGUgZ3JvdXBUeXBlOwotCi0gIEBPcHRpb24obmFtZSA9ICItLXVzZXIiLCBhbGlhc2VzID0geyItdSJ9LAotICAgICAgdXNhZ2UgPSAidXNlciBmb3Igd2hpY2ggdGhlIGdyb3VwcyBzaG91bGQgYmUgbGlzdGVkIikKLSAgcHJpdmF0ZSBBY2NvdW50LklkIHVzZXI7Ci0KLSAgQE9wdGlvbihuYW1lID0gIi0tdmVyYm9zZSIsIGFsaWFzZXMgPSB7Ii12In0sCi0gICAgICB1c2FnZSA9ICJ2ZXJib3NlIG91dHB1dCBmb3JtYXQgd2l0aCB0YWItc2VwYXJhdGVkIGNvbHVtbnMgZm9yIHRoZSAiICsKLSAgICAgICAgICAiZ3JvdXAgbmFtZSwgVVVJRCwgZGVzY3JpcHRpb24sIHR5cGUsIG93bmVyIGdyb3VwIG5hbWUsICIgKwotICAgICAgICAgICJvd25lciBncm91cCBVVUlELCBhbmQgd2hldGhlciB0aGUgZ3JvdXAgaXMgdmlzaWJsZSB0byBhbGwiKQotICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZU91dHB1dDsKKyAgcHJpdmF0ZSBNeUxpc3RHcm91cHMgaW1wbDsKIAogICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEZhaWx1cmUgewotICAgIHRyeSB7Ci0gICAgICBpZiAodXNlciAhPSBudWxsICYmICFwcm9qZWN0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCAiZmF0YWw6IC0tdXNlciBhbmQgLS1wcm9qZWN0IG9wdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlLiIpOworICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBFbnZpcm9ubWVudCBlbnYpIHsKKyAgICBzdGFydFRocmVhZChuZXcgQ29tbWFuZFJ1bm5hYmxlKCkgeworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2VDb21tYW5kTGluZShpbXBsKTsKKyAgICAgICAgaWYgKGltcGwuZ2V0VXNlcigpICE9IG51bGwgJiYgIWltcGwuZ2V0UHJvamVjdHMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKDEsICJmYXRhbDogLS11c2VyIGFuZCAtLXByb2plY3Qgb3B0aW9ucyBhcmUgbm90IGNvbXBhdGlibGUuIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgc3Rkb3V0ID0gdG9QcmludFdyaXRlcihvdXQpOworICAgICAgICB0cnkgeworICAgICAgICAgIGltcGwuZGlzcGxheShzdGRvdXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgICB9CiAgICAgICB9CisgICAgfSk7CisgIH0KIAotICAgICAgZmluYWwgVmlzaWJsZUdyb3VwcyB2aXNpYmxlR3JvdXBzID0gdmlzaWJsZUdyb3Vwc0ZhY3RvcnkuY3JlYXRlKCk7Ci0gICAgICB2aXNpYmxlR3JvdXBzLnNldE9ubHlWaXNpYmxlVG9BbGwodmlzaWJsZVRvQWxsKTsKLSAgICAgIHZpc2libGVHcm91cHMuc2V0R3JvdXBUeXBlKGdyb3VwVHlwZSk7Ci0gICAgICBmaW5hbCBHcm91cExpc3QgZ3JvdXBMaXN0OwotICAgICAgaWYgKCFwcm9qZWN0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgZ3JvdXBMaXN0ID0gdmlzaWJsZUdyb3Vwcy5nZXQocHJvamVjdHMpOwotICAgICAgfSBlbHNlIGlmICh1c2VyICE9IG51bGwpIHsKLSAgICAgICAgZ3JvdXBMaXN0ID0gdmlzaWJsZUdyb3Vwcy5nZXQodXNlckZhY3RvcnkuY3JlYXRlKHVzZXIpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdyb3VwTGlzdCA9IHZpc2libGVHcm91cHMuZ2V0KCk7Ci0gICAgICB9CisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15TGlzdEdyb3VwcyBleHRlbmRzIExpc3RHcm91cHMgeworICAgIEBPcHRpb24obmFtZSA9ICItLXZlcmJvc2UiLCBhbGlhc2VzID0geyItdiJ9LAorICAgICAgICB1c2FnZSA9ICJ2ZXJib3NlIG91dHB1dCBmb3JtYXQgd2l0aCB0YWItc2VwYXJhdGVkIGNvbHVtbnMgZm9yIHRoZSAiICsKKyAgICAgICAgICAgICJncm91cCBuYW1lLCBVVUlELCBkZXNjcmlwdGlvbiwgb3duZXIgZ3JvdXAgbmFtZSwgIiArCisgICAgICAgICAgICAib3duZXIgZ3JvdXAgVVVJRCwgYW5kIHdoZXRoZXIgdGhlIGdyb3VwIGlzIHZpc2libGUgdG8gYWxsIikKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZU91dHB1dDsKIAotICAgICAgZmluYWwgQ29sdW1uRm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBDb2x1bW5Gb3JtYXR0ZXIoc3Rkb3V0LCAnXHQnKTsKLSAgICAgIGZvciAoZmluYWwgQWNjb3VudEdyb3VwIGcgOiBncm91cExpc3QuZ2V0R3JvdXBzKCkpIHsKLSAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihnLmdldE5hbWUoKSk7CisgICAgQEluamVjdAorICAgIE15TGlzdEdyb3VwcyhmaW5hbCBHcm91cENhY2hlIGdyb3VwQ2FjaGUsCisgICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbC5GYWN0b3J5IGdyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICAgIGZpbmFsIEdyb3VwQ29udHJvbC5HZW5lcmljRmFjdG9yeSBnZW5lcmljR3JvdXBDb250cm9sRmFjdG9yeSwKKyAgICAgICAgZmluYWwgUHJvdmlkZXI8SWRlbnRpZmllZFVzZXI+IGlkZW50aWZpZWRVc2VyLAorICAgICAgICBmaW5hbCBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeSwKKyAgICAgICAgZmluYWwgUHJvdmlkZXI8R2V0R3JvdXBzPiBhY2NvdW50R2V0R3JvdXBzLAorICAgICAgICBmaW5hbCBHcm91cEpzb24ganNvbikgeworICAgICAgc3VwZXIoZ3JvdXBDYWNoZSwgZ3JvdXBDb250cm9sRmFjdG9yeSwgZ2VuZXJpY0dyb3VwQ29udHJvbEZhY3RvcnksCisgICAgICAgICAgaWRlbnRpZmllZFVzZXIsIHVzZXJGYWN0b3J5LCBhY2NvdW50R2V0R3JvdXBzLCBqc29uKTsKKyAgICB9CisKKyAgICB2b2lkIGRpc3BsYXkoZmluYWwgUHJpbnRXcml0ZXIgb3V0KSB0aHJvd3MgT3JtRXhjZXB0aW9uIHsKKyAgICAgIGZpbmFsIENvbHVtbkZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgQ29sdW1uRm9ybWF0dGVyKG91dCwgJ1x0Jyk7CisgICAgICBmb3IgKGZpbmFsIEdyb3VwSW5mbyBpbmZvIDogZ2V0KCkpIHsKKyAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihPYmplY3RzLmZpcnN0Tm9uTnVsbChpbmZvLm5hbWUsICJuL2EiKSk7CiAgICAgICAgIGlmICh2ZXJib3NlT3V0cHV0KSB7Ci0gICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihLZXlVdGlsLmRlY29kZShnLmdldEdyb3VwVVVJRCgpLnRvU3RyaW5nKCkpKTsKLSAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKAotICAgICAgICAgICAgICBnLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCA/IGcuZ2V0RGVzY3JpcHRpb24oKSA6ICIiKTsKLSAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKGcuZ2V0VHlwZSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGZpbmFsIEFjY291bnRHcm91cCBvd25pbmdHcm91cCA9Ci0gICAgICAgICAgICAgIGdyb3VwQ2FjaGUuZ2V0KGcuZ2V0T3duZXJHcm91cFVVSUQoKSk7Ci0gICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbigKLSAgICAgICAgICAgICAgb3duaW5nR3JvdXAgIT0gbnVsbCA/IG93bmluZ0dyb3VwLmdldE5hbWUoKSA6ICJuL2EiKTsKLSAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKEtleVV0aWwuZGVjb2RlKGcuZ2V0T3duZXJHcm91cFVVSUQoKS50b1N0cmluZygpKSk7Ci0gICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihCb29sZWFuLnRvU3RyaW5nKGcuaXNWaXNpYmxlVG9BbGwoKSkpOworICAgICAgICAgIEFjY291bnRHcm91cCBvID0gaW5mby5vd25lcklkICE9IG51bGwKKyAgICAgICAgICAgICAgPyBncm91cENhY2hlLmdldChuZXcgQWNjb3VudEdyb3VwLlVVSUQoVXJsLmRlY29kZShpbmZvLm93bmVySWQpKSkKKyAgICAgICAgICAgICAgOiBudWxsOworCisgICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihVcmwuZGVjb2RlKGluZm8uaWQpKTsKKyAgICAgICAgICBmb3JtYXR0ZXIuYWRkQ29sdW1uKFN0cmluZ3MubnVsbFRvRW1wdHkoaW5mby5kZXNjcmlwdGlvbikpOworICAgICAgICAgIGZvcm1hdHRlci5hZGRDb2x1bW4obyAhPSBudWxsID8gby5nZXROYW1lKCkgOiAibi9hIik7CisgICAgICAgICAgZm9ybWF0dGVyLmFkZENvbHVtbihvICE9IG51bGwgPyBvLmdldEdyb3VwVVVJRCgpLmdldCgpIDogIiIpOworICAgICAgICAgIGZvcm1hdHRlci5hZGRDb2x1bW4oQm9vbGVhbi50b1N0cmluZyhPYmplY3RzLmZpcnN0Tm9uTnVsbCgKKyAgICAgICAgICAgICAgaW5mby5vcHRpb25zLnZpc2libGVUb0FsbCwgQm9vbGVhbi5GQUxTRSkpKTsKICAgICAgICAgfQogICAgICAgICBmb3JtYXR0ZXIubmV4dExpbmUoKTsKICAgICAgIH0KICAgICAgIGZvcm1hdHRlci5maW5pc2goKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hHcm91cEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBkaWUoZSk7CiAgICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdFByb2plY3RzQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0xpc3RQcm9qZWN0c0NvbW1hbmQuamF2YQppbmRleCAxM2UzZjE3Li5hYjcwMzk1IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTGlzdFByb2plY3RzQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9MaXN0UHJvamVjdHNDb21tYW5kLmphdmEKQEAgLTE2LDEwICsxNiwxNCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTGlzdFByb2plY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQmFzZUNvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5zc2hkLnNlcnZlci5FbnZpcm9ubWVudDsKIAoraW1wb3J0IGphdmEudXRpbC5MaXN0OworCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAibHMtcHJvamVjdHMiLCBkZXNjciA9ICJMaXN0IHByb2plY3RzIHZpc2libGUgdG8gdGhlIGNhbGxlciIpCiBmaW5hbCBjbGFzcyBMaXN0UHJvamVjdHNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQgewogICBASW5qZWN0CiAgIHByaXZhdGUgTGlzdFByb2plY3RzIGltcGw7CkBAIC0zMSw3ICszNSw4IEBACiAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgcGFyc2VDb21tYW5kTGluZShpbXBsKTsKICAgICAgICAgaWYgKCFpbXBsLmdldEZvcm1hdCgpLmlzSnNvbigpKSB7Ci0gICAgICAgICAgaWYgKGltcGwuaXNTaG93VHJlZSgpICYmIChpbXBsLmdldFNob3dCcmFuY2goKSAhPSBudWxsKSkgeworICAgICAgICAgIExpc3Q8U3RyaW5nPiBzaG93QnJhbmNoID0gaW1wbC5nZXRTaG93QnJhbmNoKCk7CisgICAgICAgICAgaWYgKGltcGwuaXNTaG93VHJlZSgpICYmIChzaG93QnJhbmNoICE9IG51bGwpICYmICFzaG93QnJhbmNoLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCAiZmF0YWw6IC0tdHJlZSBhbmQgLS1zaG93LWJyYW5jaCBvcHRpb25zIGFyZSBub3QgY29tcGF0aWJsZS4iKTsKICAgICAgICAgICB9CiAgICAgICAgICAgaWYgKGltcGwuaXNTaG93VHJlZSgpICYmIGltcGwuaXNTaG93RGVzY3JpcHRpb24oKSkgewpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL0xzVXNlclJlZnMuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9Mc1VzZXJSZWZzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhYmY5NQotLS0gL2Rldi9udWxsCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9Mc1VzZXJSZWZzLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuR2xvYmFsQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQnJhbmNoOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLnNlcnZlci5SZXZpZXdEYjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudFJlc29sdmVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQ2hhbmdlQ2FjaGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5HaXRSZXBvc2l0b3J5TWFuYWdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlRhZ0NhY2hlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuVmlzaWJsZVJlZkZpbHRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLk9wdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAibHMtdXNlci1yZWZzIiwgZGVzY3IgPSAiTGlzdCByZWZzIHZpc2libGUgdG8gYSBzcGVjaWZpYyB1c2VyIikKK3B1YmxpYyBjbGFzcyBMc1VzZXJSZWZzIGV4dGVuZHMgU3NoQ29tbWFuZCB7CisgIEBJbmplY3QKKyAgcHJpdmF0ZSBBY2NvdW50UmVzb2x2ZXIgYWNjb3VudFJlc29sdmVyOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBJZGVudGlmaWVkVXNlci5HZW5lcmljRmFjdG9yeSB1c2VyRmFjdG9yeTsKKworICBASW5qZWN0CisgIHByaXZhdGUgUmV2aWV3RGIgZGI7CisKKyAgQEluamVjdAorICBwcml2YXRlIFRhZ0NhY2hlIHRhZ0NhY2hlOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1wcm9qZWN0IiwgYWxpYXNlcyA9IHsiLXAifSwgbWV0YVZhciA9ICJQUk9KRUNUIiwKKyAgICAgIHJlcXVpcmVkID0gdHJ1ZSwgdXNhZ2UgPSAicHJvamVjdCBmb3Igd2hpY2ggdGhlIHJlZnMgc2hvdWxkIGJlIGxpc3RlZCIpCisgIHByaXZhdGUgUHJvamVjdENvbnRyb2wgcHJvamVjdENvbnRyb2w7CisKKyAgQE9wdGlvbihuYW1lID0gIi0tdXNlciIsIGFsaWFzZXMgPSB7Ii11In0sICBtZXRhVmFyID0gIlVTRVIiLAorICAgICAgcmVxdWlyZWQgPSB0cnVlLCB1c2FnZSA9ICJ1c2VyIGZvciB3aGljaCB0aGUgZ3JvdXBzIHNob3VsZCBiZSBsaXN0ZWQiKQorICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1vbmx5LXJlZnMtaGVhZHMiLCB1c2FnZSA9ICJsaXN0IG9ubHkgcmVmcyB1bmRlciByZWZzL2hlYWRzIikKKyAgcHJpdmF0ZSBib29sZWFuIG9ubHlSZWZzSGVhZHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIEdpdFJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW5hZ2VyOworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRmFpbHVyZSB7CisgICAgQWNjb3VudCB1c2VyQWNjb3VudCA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIHVzZXJBY2NvdW50ID0gYWNjb3VudFJlc29sdmVyLmZpbmQodXNlck5hbWUpOworICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CisgICAgICB0aHJvdyBkaWUoZSk7CisgICAgfQorCisgICAgaWYgKHVzZXJBY2NvdW50ID09IG51bGwpIHsKKyAgICAgIHN0ZG91dC5wcmludCgiTm8gc2luZ2xlIHVzZXIgY291bGQgYmUgZm91bmQgd2hlbiBzZWFyY2hpbmcgZm9yOiAiICsgdXNlck5hbWUgKyAnXG4nKTsKKyAgICAgIHN0ZG91dC5mbHVzaCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIElkZW50aWZpZWRVc2VyIHVzZXIgPSB1c2VyRmFjdG9yeS5jcmVhdGUodXNlckFjY291bnQuZ2V0SWQoKSk7CisgICAgUHJvamVjdENvbnRyb2wgdXNlclByb2plY3RDb250cm9sID0gcHJvamVjdENvbnRyb2wuZm9yVXNlcih1c2VyKTsKKyAgICBSZXBvc2l0b3J5IHJlcG8gPSBudWxsOworICAgIHRyeSB7CisgICAgICByZXBvID0gcmVwb01hbmFnZXIub3BlblJlcG9zaXRvcnkodXNlclByb2plY3RDb250cm9sLmdldFByb2plY3QoKQorICAgICAgICAgICAgICAuZ2V0TmFtZUtleSgpKTsKKworICAgICAgTWFwPFN0cmluZywgUmVmPiByZWZzTWFwID0KKyAgICAgICAgICBuZXcgVmlzaWJsZVJlZkZpbHRlcih0YWdDYWNoZSwgY2hhbmdlQ2FjaGUsIHJlcG8sIHVzZXJQcm9qZWN0Q29udHJvbCwKKyAgICAgICAgICAgICAgZGIsIHRydWUpLmZpbHRlcihyZXBvLmdldEFsbFJlZnMoKSwgZmFsc2UpOworCisgICAgICBmb3IgKGZpbmFsIFN0cmluZyByZWYgOiByZWZzTWFwLmtleVNldCgpKSB7CisgICAgICAgIGlmICghb25seVJlZnNIZWFkcyB8fCByZWYuc3RhcnRzV2l0aChCcmFuY2guUl9IRUFEUykpIHsKKyAgICAgICAgICBzdGRvdXQucHJpbnRsbihyZWYpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoImZhdGFsOiAnIgorICAgICAgICAgICsgcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSArICInOiBub3QgYSBnaXQgYXJjaGl2ZSIpOworICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoImZhdGFsOiBFcnJvciBvcGVuaW5nOiAnIgorICAgICAgICAgICsgcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7CisgICAgfSBmaW5hbGx5IHsKKyAgICAgIHJlcG8uY2xvc2UoKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9NYXN0ZXJDb21tYW5kTW9kdWxlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvTWFzdGVyQ29tbWFuZE1vZHVsZS5qYXZhCmluZGV4IDkwYmMwN2UuLjMwZjNjOTUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9NYXN0ZXJDb21tYW5kTW9kdWxlLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL01hc3RlckNvbW1hbmRNb2R1bGUuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmROYW1lOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZHM7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5EaXNwYXRjaENvbW1hbmRQcm92aWRlcjsKIAogCiAvKiogUmVnaXN0ZXIgdGhlIGNvbW1hbmRzIGEgR2Vycml0IHNlcnZlciBpbiBtYXN0ZXIgbW9kZSBzdXBwb3J0cy4gKi8KQEAgLTI0LDE5ICsyNSwyNCBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgIGZpbmFsIENvbW1hbmROYW1lIGdlcnJpdCA9IENvbW1hbmRzLm5hbWVkKCJnZXJyaXQiKTsKKyAgICBmaW5hbCBDb21tYW5kTmFtZSB0ZXN0U3VibWl0ID0gQ29tbWFuZHMubmFtZWQoZ2Vycml0LCAidGVzdC1zdWJtaXQiKTsKIAotICAgIGNvbW1hbmQoZ2Vycml0LCAiYXBwcm92ZSIpLnRvKFJldmlld0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAiY3JlYXRlLWFjY291bnQiKS50byhDcmVhdGVBY2NvdW50Q29tbWFuZC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJjcmVhdGUtZ3JvdXAiKS50byhDcmVhdGVHcm91cENvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAicmVuYW1lLWdyb3VwIikudG8oUmVuYW1lR3JvdXBDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKGdlcnJpdCwgImNyZWF0ZS1wcm9qZWN0IikudG8oQ3JlYXRlUHJvamVjdENvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAiZ3NxbCIpLnRvKEFkbWluUXVlcnlTaGVsbC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJ0ZXN0LXN1Ym1pdC1ydWxlIikudG8oVGVzdFN1Ym1pdFJ1bGUuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAic2V0LXJldmlld2VycyIpLnRvKFNldFJldmlld2Vyc0NvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAicmVjZWl2ZS1wYWNrIikudG8oUmVjZWl2ZS5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJzZXQtcHJvamVjdC1wYXJlbnQiKS50byhBZG1pblNldFBhcmVudC5jbGFzcyk7Ci0gICAgY29tbWFuZChnZXJyaXQsICJyZXZpZXciKS50byhSZXZpZXdDb21tYW5kLmNsYXNzKTsKLSAgICBjb21tYW5kKGdlcnJpdCwgInNldC1hY2NvdW50IikudG8oU2V0QWNjb3VudENvbW1hbmQuY2xhc3MpOwotICAgIGNvbW1hbmQoZ2Vycml0LCAic2V0LXByb2plY3QiKS50byhTZXRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIENyZWF0ZUFjY291bnRDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgQ3JlYXRlR3JvdXBDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgUmVuYW1lR3JvdXBDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgQ3JlYXRlUHJvamVjdENvbW1hbmQuY2xhc3MpOworICAgIGNvbW1hbmQoZ2Vycml0LCBBZG1pblF1ZXJ5U2hlbGwuY2xhc3MpOworICAgIGNvbW1hbmQoZ2Vycml0LCBTZXRSZXZpZXdlcnNDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgUmVjZWl2ZS5jbGFzcyk7CisgICAgY29tbWFuZChnZXJyaXQsIEFkbWluU2V0UGFyZW50LmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgUmV2aWV3Q29tbWFuZC5jbGFzcyk7CisgICAgLy8gZGVwcmVjYXRlZCBhbGlhcyB0byByZXZpZXcgY29tbWFuZAorICAgIGFsaWFzKGdlcnJpdCwgImFwcHJvdmUiLCBSZXZpZXdDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKGdlcnJpdCwgU2V0QWNjb3VudENvbW1hbmQuY2xhc3MpOworICAgIGNvbW1hbmQoZ2Vycml0LCBTZXRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7CisKKyAgICBjb21tYW5kKGdlcnJpdCwgInRlc3Qtc3VibWl0IikudG9Qcm92aWRlcihuZXcgRGlzcGF0Y2hDb21tYW5kUHJvdmlkZXIodGVzdFN1Ym1pdCkpOworICAgIGNvbW1hbmQodGVzdFN1Ym1pdCwgVGVzdFN1Ym1pdFJ1bGVDb21tYW5kLmNsYXNzKTsKKyAgICBjb21tYW5kKHRlc3RTdWJtaXQsIFRlc3RTdWJtaXRUeXBlQ29tbWFuZC5jbGFzcyk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5FbmFibGVDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luRW5hYmxlQ29tbWFuZC5qYXZhCmluZGV4IDRkZjNhZWUuLjcwOWUzMzcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5FbmFibGVDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpbkVuYWJsZUNvbW1hbmQuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMuYW5ub3RhdGlvbnMuUmVxdWlyZXNDYXBhYmlsaXR5OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpbkluc3RhbGxFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luTG9hZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTI3LDYgKzI4LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAiZW5hYmxlIiwgZGVzY3IgPSAiRW5hYmxlIHBsdWdpbnMiKQogZmluYWwgY2xhc3MgUGx1Z2luRW5hYmxlQ29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBAQXJndW1lbnQoaW5kZXggPSAwLCBtZXRhVmFyID0gIk5BTUUiLCByZXF1aXJlZCA9IHRydWUsIHVzYWdlID0gInBsdWdpbihzKSB0byBlbmFibGUiKQogICBMaXN0PFN0cmluZz4gbmFtZXM7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luSW5zdGFsbENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5JbnN0YWxsQ29tbWFuZC5qYXZhCmluZGV4IDEyNzIyZWMuLmZjMDM2ZmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5JbnN0YWxsQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5JbnN0YWxsQ29tbWFuZC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luSW5zdGFsbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW5Mb2FkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIApAQCAtMzQsNiArMzUsNyBAQAogaW1wb3J0IGphdmEubmV0LlVSTDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAiaW5zdGFsbCIsIGRlc2NyID0gIkluc3RhbGwvQWRkIGEgcGx1Z2luIikKIGZpbmFsIGNsYXNzIFBsdWdpbkluc3RhbGxDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBPcHRpb24obmFtZSA9ICItLW5hbWUiLCBhbGlhc2VzID0geyItbiJ9LCB1c2FnZSA9ICJpbnN0YWxsIHVuZGVyIG5hbWUiKQogICBwcml2YXRlIFN0cmluZyBuYW1lOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpbkxzQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpbkxzQ29tbWFuZC5qYXZhCmluZGV4IDZkNzQ5MGYuLmFiNmM5NzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5Mc0NvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luTHNDb21tYW5kLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5MaXN0UGx1Z2luczsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkJhc2VDb21tYW5kOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuc3NoZC5zZXJ2ZXIuRW52aXJvbm1lbnQ7CkBAIC0yNSw2ICsyNiw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAibHMiLCBkZXNjciA9ICJMaXN0IHRoZSBpbnN0YWxsZWQgcGx1Z2lucyIpCiBmaW5hbCBjbGFzcyBQbHVnaW5Mc0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7CiAgIEBJbmplY3QKICAgcHJpdmF0ZSBMaXN0UGx1Z2lucyBpbXBsOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbG9hZENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5SZWxvYWRDb21tYW5kLmphdmEKaW5kZXggZDI0MjlhOS4uODVhZGUwMyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbG9hZENvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUGx1Z2luUmVsb2FkQ29tbWFuZC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luSW5zdGFsbEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLmFubm90YXRpb25zLlJlcXVpcmVzQ2FwYWJpbGl0eTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucGx1Z2lucy5QbHVnaW5Mb2FkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKIApAQCAtMjcsNiArMjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUikKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJyZWxvYWQiLCBkZXNjciA9ICJSZWxvYWQvUmVzdGFydCBwbHVnaW5zIikKIGZpbmFsIGNsYXNzIFBsdWdpblJlbG9hZENvbW1hbmQgZXh0ZW5kcyBTc2hDb21tYW5kIHsKICAgQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJOQU1FIiwgdXNhZ2UgPSAicGx1Z2lucyB0byByZWxvYWQvcmVzdGFydCIpCiAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG5hbWVzOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbW92ZUNvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5SZW1vdmVDb21tYW5kLmphdmEKaW5kZXggOGJhYWI3Ny4uOTZhZGI4ZmUgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9QbHVnaW5SZW1vdmVDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1BsdWdpblJlbW92ZUNvbW1hbmQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luTG9hZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTI2LDYgKzI3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LkFETUlOSVNUUkFURV9TRVJWRVIpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAicmVtb3ZlIiwgZGVzY3IgPSAiRGlzYWJsZSBwbHVnaW5zIikKIGZpbmFsIGNsYXNzIFBsdWdpblJlbW92ZUNvbW1hbmQgZXh0ZW5kcyBTc2hDb21tYW5kIHsKICAgQEFyZ3VtZW50KGluZGV4ID0gMCwgbWV0YVZhciA9ICJOQU1FIiwgcmVxdWlyZWQgPSB0cnVlLCB1c2FnZSA9ICJwbHVnaW4gdG8gcmVtb3ZlIikKICAgTGlzdDxTdHJpbmc+IG5hbWVzOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1F1ZXJ5LmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnkuamF2YQppbmRleCA2MzY4MGY4Li4yZDE3ODc2IDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnkuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnkuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnF1ZXJ5LmNoYW5nZS5RdWVyeVByb2Nlc3NvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0yMyw2ICsyNCw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gInF1ZXJ5IiwgZGVzY3IgPSAiUXVlcnkgdGhlIGNoYW5nZSBkYXRhYmFzZSIpCiBjbGFzcyBRdWVyeSBleHRlbmRzIFNzaENvbW1hbmQgewogICBASW5qZWN0CiAgIHByaXZhdGUgUXVlcnlQcm9jZXNzb3IgcHJvY2Vzc29yOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1F1ZXJ5U2hlbGwuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9RdWVyeVNoZWxsLmphdmEKaW5kZXggMThjZTc3Zi4uMTYzMGQxMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1F1ZXJ5U2hlbGwuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUXVlcnlTaGVsbC5qYXZhCkBAIC02Myw5ICs2Myw4IEBACiAKICAgQEluamVjdAogICBRdWVyeVNoZWxsKGZpbmFsIFNjaGVtYUZhY3Rvcnk8UmV2aWV3RGI+IGRiRmFjdG9yeSwKLQotICBAQXNzaXN0ZWQgZmluYWwgSW5wdXRTdHJlYW0gaW4sIEBBc3Npc3RlZCBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KQotICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgQEFzc2lzdGVkIGZpbmFsIElucHV0U3RyZWFtIGluLCBAQXNzaXN0ZWQgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CiAgICAgdGhpcy5kYkZhY3RvcnkgPSBkYkZhY3Rvcnk7CiAgICAgdGhpcy5pbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpKTsKICAgICB0aGlzLm91dCA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURi04IikpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1JlY2VpdmUuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZWNlaXZlLmphdmEKaW5kZXggYjRkZTc1Yi4uZTBkZDM4ZiAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1JlY2VpdmUuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmVjZWl2ZS5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5UcmFuc2ZlckNvbmZpZzsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlZpc2libGVSZWZGaWx0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5BYnN0cmFjdEdpdENvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVG9vTGFyZ2VPYmplY3RJblBhY2tFeGNlcHRpb247CkBAIC00MSw2ICs0Miw3IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogLyoqIFJlY2VpdmVzIGNoYW5nZSB1cGxvYWQgb3ZlciBTU0ggdXNpbmcgdGhlIEdpdCByZWNlaXZlLXBhY2sgcHJvdG9jb2wuICovCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAicmVjZWl2ZS1wYWNrIiwgZGVzY3IgPSAiU3RhbmRhcmQgR2l0IHNlcnZlciBzaWRlIGNvbW1hbmQgZm9yIGNsaWVudCBzaWRlIGdpdCBwdXNoIikKIGZpbmFsIGNsYXNzIFJlY2VpdmUgZXh0ZW5kcyBBYnN0cmFjdEdpdENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVjZWl2ZS5jbGFzcyk7CiAKZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZW5hbWVHcm91cENvbW1hbmQuamF2YSBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZW5hbWVHcm91cENvbW1hbmQuamF2YQppbmRleCBiOWFiYzkyLi5mM2MxYmIzIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmVuYW1lR3JvdXBDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1JlbmFtZUdyb3VwQ29tbWFuZC5qYXZhCkBAIC0xOCwxMiArMTgsMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5hbWVBbHJlYWR5VXNlZEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZXJyb3JzLk5vU3VjaEdyb3VwRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5hY2NvdW50LlBlcmZvcm1SZW5hbWVHcm91cDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouQXJndW1lbnQ7CiAKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJyZW5hbWUtZ3JvdXAiLCBkZXNjciA9ICJSZW5hbWUgYW4gYWNjb3VudCBncm91cCIpCiBwdWJsaWMgY2xhc3MgUmVuYW1lR3JvdXBDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gdHJ1ZSwgbWV0YVZhciA9ICJHUk9VUCIsIHVzYWdlID0gIm5hbWUgb2YgdGhlIGdyb3VwIHRvIGJlIHJlbmFtZWQiKQogICBwcml2YXRlIFN0cmluZyBncm91cE5hbWU7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmV2aWV3Q29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Jldmlld0NvbW1hbmQuamF2YQppbmRleCA1ZWJiNmM3Li41NzY5YTIyIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvUmV2aWV3Q29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9SZXZpZXdDb21tYW5kLmphdmEKQEAgLTE0LDI1ICsxNCwzNiBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuY29tbWFuZHM7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5BcHByb3ZhbFR5cGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuY29tbW9uLmRhdGEuQXBwcm92YWxUeXBlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkxhYmVsVHlwZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uZGF0YS5MYWJlbFZhbHVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQXBwcm92YWxDYXRlZ29yeVZhbHVlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld1Jlc3VsdC5FcnJvci5UeXBlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5BdXRoRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZUNvbmZsaWN0RXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5BYmFuZG9uQ2hhbmdlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuQWJhbmRvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZVJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUG9zdFJldmlldzsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlJlc3RvcmU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXZpc2lvblJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuU3VibWl0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2VkZXRhaWwuRGVsZXRlRHJhZnRQYXRjaFNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlB1Ymxpc2hEcmFmdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlZGV0YWlsLlJlc3RvcmVDaGFuZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZWRldGFpbC5TdWJtaXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuRW1haWxFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLlB1Ymxpc2hDb21tZW50czsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkFsbFByb2plY3RzTmFtZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LkludmFsaWRDaGFuZ2VPcGVyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuTm9TdWNoQ2hhbmdlRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaFByb2plY3RFeGNlcHRpb247CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENvbnRyb2w7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnV0aWwuY2xpLkNtZExpbmVQYXJzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKQEAgLTQwLDcgKzUxLDYgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmtvaHN1a2UuYXJnczRqLkFyZ3VtZW50OwogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKQEAgLTQ4LDExICs1OCwxMiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJyZXZpZXciLCBkZXNjciA9ICJWZXJpZnksIGFwcHJvdmUgYW5kL29yIHN1Ym1pdCBvbmUgb3IgbW9yZSBwYXRjaCBzZXRzIikKIHB1YmxpYyBjbGFzcyBSZXZpZXdDb21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPQogICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmV2aWV3Q29tbWFuZC5jbGFzcyk7CkBAIC02NiwxMyArNzcsMTIgQEAKICAgICByZXR1cm4gcGFyc2VyOwogICB9CiAKLSAgcHJpdmF0ZSBmaW5hbCBTZXQ8UGF0Y2hTZXQuSWQ+IHBhdGNoU2V0SWRzID0gbmV3IEhhc2hTZXQ8UGF0Y2hTZXQuSWQ+KCk7CisgIHByaXZhdGUgZmluYWwgU2V0PFBhdGNoU2V0PiBwYXRjaFNldHMgPSBuZXcgSGFzaFNldDxQYXRjaFNldD4oKTsKIAotICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIG11bHRpVmFsdWVkID0gdHJ1ZSwgbWV0YVZhciA9ICJ7Q09NTUlUIHwgQ0hBTkdFLFBBVENIU0VUfSIsCi0gICAgICB1c2FnZSA9ICJsaXN0IG9mIGNvbW1pdHMgb3IgcGF0Y2ggc2V0cyB0byByZXZpZXciKQorICBAQXJndW1lbnQoaW5kZXggPSAwLCByZXF1aXJlZCA9IHRydWUsIG11bHRpVmFsdWVkID0gdHJ1ZSwgbWV0YVZhciA9ICJ7Q09NTUlUIHwgQ0hBTkdFLFBBVENIU0VUfSIsIHVzYWdlID0gImxpc3Qgb2YgY29tbWl0cyBvciBwYXRjaCBzZXRzIHRvIHJldmlldyIpCiAgIHZvaWQgYWRkUGF0Y2hTZXRJZChmaW5hbCBTdHJpbmcgdG9rZW4pIHsKICAgICB0cnkgewotICAgICAgcGF0Y2hTZXRJZHMuYWRkQWxsKHBhcnNlUGF0Y2hTZXRJZCh0b2tlbikpOworICAgICAgcGF0Y2hTZXRzLmFkZChwYXJzZVBhdGNoU2V0KHRva2VuKSk7CiAgICAgfSBjYXRjaCAoVW5sb2dnZWRGYWlsdXJlIGUpIHsKICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogICAgIH0gY2F0Y2ggKE9ybUV4Y2VwdGlvbiBlKSB7CkBAIC0xMDUsMzEgKzExNSw1NCBAQAogICBAT3B0aW9uKG5hbWUgPSAiLS1kZWxldGUiLCB1c2FnZSA9ICJkZWxldGUgdGhlIHNwZWNpZmllZCBkcmFmdCBwYXRjaCBzZXQocykiKQogICBwcml2YXRlIGJvb2xlYW4gZGVsZXRlRHJhZnRQYXRjaFNldDsKIAotICBASW5qZWN0Ci0gIHByaXZhdGUgUmV2aWV3RGIgZGI7CisgIEBPcHRpb24obmFtZSA9ICItLWxhYmVsIiwgYWxpYXNlcyA9ICItbCIsIHVzYWdlID0gImN1c3RvbSBsYWJlbChzKSB0byBhc3NpZ24iLCBtZXRhVmFyID0gIkxBQkVMPVZBTFVFIikKKyAgdm9pZCBhZGRMYWJlbChmaW5hbCBTdHJpbmcgdG9rZW4pIHsKKyAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBJbW11dGFibGVMaXN0LmNvcHlPZihTcGxpdHRlci5vbignPScpLnNwbGl0KHRva2VuKSk7CisgICAgaWYgKHBhcnRzLnNpemUoKSAhPSAyKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGN1c3RvbSBsYWJlbCAiICsgdG9rZW4pOworICAgIH0KKyAgICBzaG9ydCB2YWx1ZTsKKyAgICB0cnkgeworICAgICAgdmFsdWUgPSBTaG9ydC5wYXJzZVNob3J0KHBhcnRzLmdldCgxKSk7CisgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgY3VzdG9tIGxhYmVsIHZhbHVlICIKKyAgICAgICAgICArIHBhcnRzLmdldCgxKSk7CisgICAgfQorICAgIGN1c3RvbUxhYmVscy5wdXQocGFydHMuZ2V0KDApLCB2YWx1ZSk7CisgIH0KIAogICBASW5qZWN0Ci0gIHByaXZhdGUgQXBwcm92YWxUeXBlcyBhcHByb3ZhbFR5cGVzOworICBwcml2YXRlIFJldmlld0RiIGRiOwogCiAgIEBJbmplY3QKICAgcHJpdmF0ZSBEZWxldGVEcmFmdFBhdGNoU2V0LkZhY3RvcnkgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3Rvcnk7CiAKICAgQEluamVjdAotICBwcml2YXRlIFByb3ZpZGVyPEFiYW5kb25DaGFuZ2U+IGFiYW5kb25DaGFuZ2VQcm92aWRlcjsKKyAgcHJpdmF0ZSBQcm9qZWN0Q29udHJvbC5GYWN0b3J5IHByb2plY3RDb250cm9sRmFjdG9yeTsKIAogICBASW5qZWN0Ci0gIHByaXZhdGUgUHVibGlzaENvbW1lbnRzLkZhY3RvcnkgcHVibGlzaENvbW1lbnRzRmFjdG9yeTsKKyAgcHJpdmF0ZSBBbGxQcm9qZWN0c05hbWUgYWxsUHJvamVjdHM7CisKKyAgQEluamVjdAorICBwcml2YXRlIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKKworICBASW5qZWN0CisgIHByaXZhdGUgUHJvdmlkZXI8QWJhbmRvbj4gYWJhbmRvblByb3ZpZGVyOworCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBQcm92aWRlcjxQb3N0UmV2aWV3PiByZXZpZXdQcm92aWRlcjsKIAogICBASW5qZWN0CiAgIHByaXZhdGUgUHVibGlzaERyYWZ0LkZhY3RvcnkgcHVibGlzaERyYWZ0RmFjdG9yeTsKIAogICBASW5qZWN0Ci0gIHByaXZhdGUgUHJvdmlkZXI8UmVzdG9yZUNoYW5nZT4gcmVzdG9yZUNoYW5nZVByb3ZpZGVyOworICBwcml2YXRlIFByb3ZpZGVyPFJlc3RvcmU+IHJlc3RvcmVQcm92aWRlcjsKIAogICBASW5qZWN0Ci0gIHByaXZhdGUgU3VibWl0LkZhY3Rvcnkgc3VibWl0RmFjdG9yeTsKKyAgcHJpdmF0ZSBQcm92aWRlcjxTdWJtaXQ+IHN1Ym1pdFByb3ZpZGVyOwogCiAgIHByaXZhdGUgTGlzdDxBcHByb3ZlT3B0aW9uPiBvcHRpb25MaXN0OworICBwcml2YXRlIE1hcDxTdHJpbmcsIFNob3J0PiBjdXN0b21MYWJlbHM7CiAKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewpAQCAtMTYwLDIwICsxOTMsMjAgQEAKICAgICB9CiAKICAgICBib29sZWFuIG9rID0gdHJ1ZTsKLSAgICBmb3IgKGZpbmFsIFBhdGNoU2V0LklkIHBhdGNoU2V0SWQgOiBwYXRjaFNldElkcykgeworICAgIGZvciAoZmluYWwgUGF0Y2hTZXQgcGF0Y2hTZXQgOiBwYXRjaFNldHMpIHsKICAgICAgIHRyeSB7Ci0gICAgICAgIGFwcHJvdmVPbmUocGF0Y2hTZXRJZCk7CisgICAgICAgIGFwcHJvdmVPbmUocGF0Y2hTZXQpOwogICAgICAgfSBjYXRjaCAoVW5sb2dnZWRGYWlsdXJlIGUpIHsKICAgICAgICAgb2sgPSBmYWxzZTsKICAgICAgICAgd3JpdGVFcnJvcigiZXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSArICJcbiIpOwogICAgICAgfSBjYXRjaCAoTm9TdWNoQ2hhbmdlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgb2sgPSBmYWxzZTsKLSAgICAgICAgd3JpdGVFcnJvcigibm8gc3VjaCBjaGFuZ2UgIiArIHBhdGNoU2V0SWQuZ2V0UGFyZW50S2V5KCkuZ2V0KCkpOworICAgICAgICB3cml0ZUVycm9yKCJubyBzdWNoIGNoYW5nZSAiICsgcGF0Y2hTZXQuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKS5nZXQoKSk7CiAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICBvayA9IGZhbHNlOwogICAgICAgICB3cml0ZUVycm9yKCJmYXRhbDogaW50ZXJuYWwgc2VydmVyIGVycm9yIHdoaWxlIGFwcHJvdmluZyAiCi0gICAgICAgICAgICArIHBhdGNoU2V0SWQgKyAiXG4iKTsKLSAgICAgICAgbG9nLmVycm9yKCJpbnRlcm5hbCBlcnJvciB3aGlsZSBhcHByb3ZpbmcgIiArIHBhdGNoU2V0SWQsIGUpOworICAgICAgICAgICAgKyBwYXRjaFNldC5nZXRJZCgpICsgIlxuIik7CisgICAgICAgIGxvZy5lcnJvcigiaW50ZXJuYWwgZXJyb3Igd2hpbGUgYXBwcm92aW5nICIgKyBwYXRjaFNldC5nZXRJZCgpLCBlKTsKICAgICAgIH0KICAgICB9CiAKQEAgLTE4Myw1NCArMjE2LDk3IEBACiAgICAgfQogICB9CiAKLSAgcHJpdmF0ZSB2b2lkIGFwcHJvdmVPbmUoZmluYWwgUGF0Y2hTZXQuSWQgcGF0Y2hTZXRJZCkKLSAgICAgIHRocm93cyBOb1N1Y2hDaGFuZ2VFeGNlcHRpb24sIE9ybUV4Y2VwdGlvbiwgRW1haWxFeGNlcHRpb24sIEZhaWx1cmUsCi0gICAgICBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgcHJpdmF0ZSB2b2lkIGFwcGx5UmV2aWV3KGZpbmFsIENoYW5nZUNvbnRyb2wgY3RsLCBmaW5hbCBQYXRjaFNldCBwYXRjaFNldCwKKyAgICAgIGZpbmFsIFBvc3RSZXZpZXcuSW5wdXQgcmV2aWV3KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICByZXZpZXdQcm92aWRlci5nZXQoKS5hcHBseShuZXcgUmV2aXNpb25SZXNvdXJjZSgKKyAgICAgICAgbmV3IENoYW5nZVJlc291cmNlKGN0bCksIHBhdGNoU2V0KSwgcmV2aWV3KTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBhcHByb3ZlT25lKGZpbmFsIFBhdGNoU2V0IHBhdGNoU2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogICAgIGlmIChjaGFuZ2VDb21tZW50ID09IG51bGwpIHsKICAgICAgIGNoYW5nZUNvbW1lbnQgPSAiIjsKICAgICB9CiAKLSAgICBTZXQ8QXBwcm92YWxDYXRlZ29yeVZhbHVlLklkPiBhcHMgPSBuZXcgSGFzaFNldDxBcHByb3ZhbENhdGVnb3J5VmFsdWUuSWQ+KCk7CisgICAgUG9zdFJldmlldy5JbnB1dCByZXZpZXcgPSBuZXcgUG9zdFJldmlldy5JbnB1dCgpOworICAgIHJldmlldy5tZXNzYWdlID0gU3RyaW5ncy5lbXB0eVRvTnVsbChjaGFuZ2VDb21tZW50KTsKKyAgICByZXZpZXcubGFiZWxzID0gTWFwcy5uZXdUcmVlTWFwKCk7CisgICAgcmV2aWV3LmRyYWZ0cyA9IFBvc3RSZXZpZXcuRHJhZnRIYW5kbGluZy5QVUJMSVNIOworICAgIHJldmlldy5zdHJpY3RMYWJlbHMgPSBmYWxzZTsKICAgICBmb3IgKEFwcHJvdmVPcHRpb24gYW8gOiBvcHRpb25MaXN0KSB7CiAgICAgICBTaG9ydCB2ID0gYW8udmFsdWUoKTsKICAgICAgIGlmICh2ICE9IG51bGwpIHsKLSAgICAgICAgYXBzLmFkZChuZXcgQXBwcm92YWxDYXRlZ29yeVZhbHVlLklkKGFvLmdldENhdGVnb3J5SWQoKSwgdikpOworICAgICAgICByZXZpZXcubGFiZWxzLnB1dChhby5nZXRMYWJlbE5hbWUoKSwgdik7CiAgICAgICB9CiAgICAgfQorICAgIHJldmlldy5sYWJlbHMucHV0QWxsKGN1c3RvbUxhYmVscyk7CisKKyAgICAvLyBJZiByZXZpZXcgbGFiZWxzIGFyZSBiZWluZyBhcHBsaWVkLCB0aGUgY29tbWVudCB3aWxsIGJlIGluY2x1ZGVkCisgICAgLy8gb24gdGhlIHJldmlldyBub3RlLiBXZSBkb24ndCBuZWVkIHRvIGFkZCBpdCBhZ2FpbiBvbiB0aGUgYWJhbmRvbgorICAgIC8vIG9yIHJlc3RvcmUgY29tbWVudC4KKyAgICBpZiAoIXJldmlldy5sYWJlbHMuaXNFbXB0eSgpICYmIChhYmFuZG9uQ2hhbmdlIHx8IHJlc3RvcmVDaGFuZ2UpKSB7CisgICAgICBjaGFuZ2VDb21tZW50ID0gbnVsbDsKKyAgICB9CiAKICAgICB0cnkgewotICAgICAgcHVibGlzaENvbW1lbnRzRmFjdG9yeS5jcmVhdGUocGF0Y2hTZXRJZCwgY2hhbmdlQ29tbWVudCwgYXBzLCBmb3JjZU1lc3NhZ2UpLmNhbGwoKTsKKyAgICAgIENoYW5nZUNvbnRyb2wgY3RsID0KKyAgICAgICAgICBjaGFuZ2VDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKHBhdGNoU2V0LmdldElkKCkuZ2V0UGFyZW50S2V5KCkpOwogCiAgICAgICBpZiAoYWJhbmRvbkNoYW5nZSkgewotICAgICAgICBmaW5hbCBBYmFuZG9uQ2hhbmdlIGFiYW5kb25DaGFuZ2UgPSBhYmFuZG9uQ2hhbmdlUHJvdmlkZXIuZ2V0KCk7Ci0gICAgICAgIGFiYW5kb25DaGFuZ2Uuc2V0Q2hhbmdlSWQocGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgICAgIGFiYW5kb25DaGFuZ2Uuc2V0TWVzc2FnZShjaGFuZ2VDb21tZW50KTsKLSAgICAgICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IGFiYW5kb25DaGFuZ2UuY2FsbCgpOwotICAgICAgICBoYW5kbGVSZXZpZXdSZXN1bHRFcnJvcnMocmVzdWx0KTsKKyAgICAgICAgZmluYWwgQWJhbmRvbiBhYmFuZG9uID0gYWJhbmRvblByb3ZpZGVyLmdldCgpOworICAgICAgICBmaW5hbCBBYmFuZG9uLklucHV0IGlucHV0ID0gbmV3IEFiYW5kb24uSW5wdXQoKTsKKyAgICAgICAgaW5wdXQubWVzc2FnZSA9IGNoYW5nZUNvbW1lbnQ7CisgICAgICAgIGFwcGx5UmV2aWV3KGN0bCwgcGF0Y2hTZXQsIHJldmlldyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgYWJhbmRvbi5hcHBseShuZXcgQ2hhbmdlUmVzb3VyY2UoY3RsKSwgaW5wdXQpOworICAgICAgICB9IGNhdGNoIChBdXRoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB3cml0ZUVycm9yKCJlcnJvcjogIiArIHBhcnNlRXJyb3IoVHlwZS5BQkFORE9OX05PVF9QRVJNSVRURUQpICsgIlxuIik7CisgICAgICAgIH0gY2F0Y2ggKFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24gZSkgeworICAgICAgICAgIHdyaXRlRXJyb3IoImVycm9yOiAiICsgcGFyc2VFcnJvcihUeXBlLkNIQU5HRV9JU19DTE9TRUQpICsgIlxuIik7CisgICAgICAgIH0KICAgICAgIH0gZWxzZSBpZiAocmVzdG9yZUNoYW5nZSkgewotICAgICAgICBmaW5hbCBSZXN0b3JlQ2hhbmdlIHJlc3RvcmVDaGFuZ2UgPSByZXN0b3JlQ2hhbmdlUHJvdmlkZXIuZ2V0KCk7Ci0gICAgICAgIHJlc3RvcmVDaGFuZ2Uuc2V0Q2hhbmdlSWQocGF0Y2hTZXRJZC5nZXRQYXJlbnRLZXkoKSk7Ci0gICAgICAgIHJlc3RvcmVDaGFuZ2Uuc2V0TWVzc2FnZShjaGFuZ2VDb21tZW50KTsKLSAgICAgICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IHJlc3RvcmVDaGFuZ2UuY2FsbCgpOwotICAgICAgICBoYW5kbGVSZXZpZXdSZXN1bHRFcnJvcnMocmVzdWx0KTsKKyAgICAgICAgZmluYWwgUmVzdG9yZSByZXN0b3JlID0gcmVzdG9yZVByb3ZpZGVyLmdldCgpOworICAgICAgICBmaW5hbCBSZXN0b3JlLklucHV0IGlucHV0ID0gbmV3IFJlc3RvcmUuSW5wdXQoKTsKKyAgICAgICAgaW5wdXQubWVzc2FnZSA9IGNoYW5nZUNvbW1lbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmVzdG9yZS5hcHBseShuZXcgQ2hhbmdlUmVzb3VyY2UoY3RsKSwgaW5wdXQpOworICAgICAgICAgIGFwcGx5UmV2aWV3KGN0bCwgcGF0Y2hTZXQsIHJldmlldyk7CisgICAgICAgIH0gY2F0Y2ggKEF1dGhFeGNlcHRpb24gZSkgeworICAgICAgICAgIHdyaXRlRXJyb3IoImVycm9yOiAiICsgcGFyc2VFcnJvcihUeXBlLlJFU1RPUkVfTk9UX1BFUk1JVFRFRCkgKyAiXG4iKTsKKyAgICAgICAgfSBjYXRjaCAoUmVzb3VyY2VDb25mbGljdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgd3JpdGVFcnJvcigiZXJyb3I6ICIgKyBwYXJzZUVycm9yKFR5cGUuQ0hBTkdFX05PVF9BQkFORE9ORUQpICsgIlxuIik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFwcGx5UmV2aWV3KGN0bCwgcGF0Y2hTZXQsIHJldmlldyk7CiAgICAgICB9CisKICAgICAgIGlmIChzdWJtaXRDaGFuZ2UpIHsKLSAgICAgICAgZmluYWwgUmV2aWV3UmVzdWx0IHJlc3VsdCA9IHN1Ym1pdEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0SWQpLmNhbGwoKTsKLSAgICAgICAgaGFuZGxlUmV2aWV3UmVzdWx0RXJyb3JzKHJlc3VsdCk7CisgICAgICAgIFN1Ym1pdCBzdWJtaXQgPSBzdWJtaXRQcm92aWRlci5nZXQoKTsKKyAgICAgICAgU3VibWl0LklucHV0IGlucHV0ID0gbmV3IFN1Ym1pdC5JbnB1dCgpOworICAgICAgICBpbnB1dC53YWl0Rm9yTWVyZ2UgPSB0cnVlOworICAgICAgICBzdWJtaXQuYXBwbHkobmV3IFJldmlzaW9uUmVzb3VyY2UoCisgICAgICAgICAgICBuZXcgQ2hhbmdlUmVzb3VyY2UoY3RsKSwgcGF0Y2hTZXQpLAorICAgICAgICAgIGlucHV0KTsKICAgICAgIH0KICAgICB9IGNhdGNoIChJbnZhbGlkQ2hhbmdlT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKICAgICAgIHRocm93IGVycm9yKGUuZ2V0TWVzc2FnZSgpKTsKICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewogICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEF1dGhFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKEJhZFJlcXVlc3RFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOworICAgIH0gY2F0Y2ggKFJlc291cmNlQ29uZmxpY3RFeGNlcHRpb24gZSkgeworICAgICAgdGhyb3cgZXJyb3IoZS5nZXRNZXNzYWdlKCkpOwogICAgIH0KIAogICAgIGlmIChwdWJsaXNoUGF0Y2hTZXQpIHsKLSAgICAgIGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQgPSBwdWJsaXNoRHJhZnRGYWN0b3J5LmNyZWF0ZShwYXRjaFNldElkKS5jYWxsKCk7CisgICAgICBmaW5hbCBSZXZpZXdSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgICBwdWJsaXNoRHJhZnRGYWN0b3J5LmNyZWF0ZShwYXRjaFNldC5nZXRJZCgpKS5jYWxsKCk7CiAgICAgICBoYW5kbGVSZXZpZXdSZXN1bHRFcnJvcnMocmVzdWx0KTsKICAgICB9IGVsc2UgaWYgKGRlbGV0ZURyYWZ0UGF0Y2hTZXQpIHsKICAgICAgIGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQgPQotICAgICAgICAgIGRlbGV0ZURyYWZ0UGF0Y2hTZXRGYWN0b3J5LmNyZWF0ZShwYXRjaFNldElkKS5jYWxsKCk7CisgICAgICAgICAgZGVsZXRlRHJhZnRQYXRjaFNldEZhY3RvcnkuY3JlYXRlKHBhdGNoU2V0LmdldElkKCkpLmNhbGwoKTsKICAgICAgIGhhbmRsZVJldmlld1Jlc3VsdEVycm9ycyhyZXN1bHQpOwogICAgIH0KICAgfQpAQCAtMjM4LDQ2ICszMTQsNyBAQAogICBwcml2YXRlIHZvaWQgaGFuZGxlUmV2aWV3UmVzdWx0RXJyb3JzKGZpbmFsIFJldmlld1Jlc3VsdCByZXN1bHQpIHsKICAgICBmb3IgKFJldmlld1Jlc3VsdC5FcnJvciByZXN1bHRFcnJvciA6IHJlc3VsdC5nZXRFcnJvcnMoKSkgewogICAgICAgU3RyaW5nIGVyck1zZyA9ICJlcnJvcjogKGNoYW5nZSAiICsgcmVzdWx0LmdldENoYW5nZUlkKCkgKyAiKSAiOwotICAgICAgc3dpdGNoIChyZXN1bHRFcnJvci5nZXRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBBQkFORE9OX05PVF9QRVJNSVRURUQ6Ci0gICAgICAgICAgZXJyTXNnICs9ICJub3QgcGVybWl0dGVkIHRvIGFiYW5kb24gY2hhbmdlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVNUT1JFX05PVF9QRVJNSVRURUQ6Ci0gICAgICAgICAgZXJyTXNnICs9ICJub3QgcGVybWl0dGVkIHRvIHJlc3RvcmUgY2hhbmdlIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVUJNSVRfTk9UX1BFUk1JVFRFRDoKLSAgICAgICAgICBlcnJNc2cgKz0gIm5vdCBwZXJtaXR0ZWQgdG8gc3VibWl0IGNoYW5nZSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1VCTUlUX05PVF9SRUFEWToKLSAgICAgICAgICBlcnJNc2cgKz0gImFwcHJvdmFscyBvciBkZXBlbmRlbmNpZXMgbGFja2luZyI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hBTkdFX0lTX0NMT1NFRDoKLSAgICAgICAgICBlcnJNc2cgKz0gImNoYW5nZSBpcyBjbG9zZWQiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5HRV9OT1RfQUJBTkRPTkVEOgotICAgICAgICAgIGVyck1zZyArPSAiY2hhbmdlIGlzIG5vdCBhYmFuZG9uZWQiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBVQkxJU0hfTk9UX1BFUk1JVFRFRDoKLSAgICAgICAgICBlcnJNc2cgKz0gIm5vdCBwZXJtaXR0ZWQgdG8gcHVibGlzaCBjaGFuZ2UiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFTEVURV9OT1RfUEVSTUlUVEVEOgotICAgICAgICAgIGVyck1zZyArPSAibm90IHBlcm1pdHRlZCB0byBkZWxldGUgY2hhbmdlL3BhdGNoIHNldCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlVMRV9FUlJPUjoKLSAgICAgICAgICBlcnJNc2cgKz0gInJ1bGUgZXJyb3IiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5PVF9BX0RSQUZUOgotICAgICAgICAgIGVyck1zZyArPSAiY2hhbmdlL3BhdGNoIHNldCBpcyBub3QgYSBkcmFmdCI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR0lUX0VSUk9SOgotICAgICAgICAgIGVyck1zZyArPSAiZXJyb3Igd3JpdGluZyBjaGFuZ2UgdG8gZ2l0IHJlcG9zaXRvcnkiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFU1RfQlJBTkNIX05PVF9GT1VORDoKLSAgICAgICAgICBlcnJNc2cgKz0gImRlc3RpbmF0aW9uIGJyYW5jaCBub3QgZm91bmQiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGVyck1zZyArPSAiZmFpbHVyZSBpbiByZXZpZXciOwotICAgICAgfQorICAgICAgZXJyTXNnICs9IHBhcnNlRXJyb3IocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKTsKICAgICAgIGlmIChyZXN1bHRFcnJvci5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgewogICAgICAgICBlcnJNc2cgKz0gIjogIiArIHJlc3VsdEVycm9yLmdldE1lc3NhZ2UoKTsKICAgICAgIH0KQEAgLTI4NSw3ICszMjIsMzggQEAKICAgICB9CiAgIH0KIAotICBwcml2YXRlIFNldDxQYXRjaFNldC5JZD4gcGFyc2VQYXRjaFNldElkKGZpbmFsIFN0cmluZyBwYXRjaElkZW50aXR5KQorICBwcml2YXRlIFN0cmluZyBwYXJzZUVycm9yKFR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBBQkFORE9OX05PVF9QRVJNSVRURUQ6CisgICAgICAgIHJldHVybiAibm90IHBlcm1pdHRlZCB0byBhYmFuZG9uIGNoYW5nZSI7CisgICAgICBjYXNlIFJFU1RPUkVfTk9UX1BFUk1JVFRFRDoKKyAgICAgICAgcmV0dXJuICJub3QgcGVybWl0dGVkIHRvIHJlc3RvcmUgY2hhbmdlIjsKKyAgICAgIGNhc2UgU1VCTUlUX05PVF9QRVJNSVRURUQ6CisgICAgICAgIHJldHVybiAibm90IHBlcm1pdHRlZCB0byBzdWJtaXQgY2hhbmdlIjsKKyAgICAgIGNhc2UgU1VCTUlUX05PVF9SRUFEWToKKyAgICAgICAgcmV0dXJuICJhcHByb3ZhbHMgb3IgZGVwZW5kZW5jaWVzIGxhY2tpbmciOworICAgICAgY2FzZSBDSEFOR0VfSVNfQ0xPU0VEOgorICAgICAgICByZXR1cm4gImNoYW5nZSBpcyBjbG9zZWQiOworICAgICAgY2FzZSBDSEFOR0VfTk9UX0FCQU5ET05FRDoKKyAgICAgICAgcmV0dXJuICJjaGFuZ2UgaXMgbm90IGFiYW5kb25lZCI7CisgICAgICBjYXNlIFBVQkxJU0hfTk9UX1BFUk1JVFRFRDoKKyAgICAgICAgcmV0dXJuICJub3QgcGVybWl0dGVkIHRvIHB1Ymxpc2ggY2hhbmdlIjsKKyAgICAgIGNhc2UgREVMRVRFX05PVF9QRVJNSVRURUQ6CisgICAgICAgIHJldHVybiAibm90IHBlcm1pdHRlZCB0byBkZWxldGUgY2hhbmdlL3BhdGNoIHNldCI7CisgICAgICBjYXNlIFJVTEVfRVJST1I6CisgICAgICAgIHJldHVybiAicnVsZSBlcnJvciI7CisgICAgICBjYXNlIE5PVF9BX0RSQUZUOgorICAgICAgICByZXR1cm4gImNoYW5nZS9wYXRjaCBzZXQgaXMgbm90IGEgZHJhZnQiOworICAgICAgY2FzZSBHSVRfRVJST1I6CisgICAgICAgIHJldHVybiAiZXJyb3Igd3JpdGluZyBjaGFuZ2UgdG8gZ2l0IHJlcG9zaXRvcnkiOworICAgICAgY2FzZSBERVNUX0JSQU5DSF9OT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiAiZGVzdGluYXRpb24gYnJhbmNoIG5vdCBmb3VuZCI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gImZhaWx1cmUgaW4gcmV2aWV3IjsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFBhdGNoU2V0IHBhcnNlUGF0Y2hTZXQoZmluYWwgU3RyaW5nIHBhdGNoSWRlbnRpdHkpCiAgICAgICB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlLCBPcm1FeGNlcHRpb24gewogICAgIC8vIEJ5IGNvbW1pdD8KICAgICAvLwpAQCAtMjk4LDE3ICszNjYsMTcgQEAKICAgICAgICAgcGF0Y2hlcyA9IGRiLnBhdGNoU2V0cygpLmJ5UmV2aXNpb25SYW5nZShpZCwgaWQubWF4KCkpOwogICAgICAgfQogCi0gICAgICBmaW5hbCBTZXQ8UGF0Y2hTZXQuSWQ+IG1hdGNoZXMgPSBuZXcgSGFzaFNldDxQYXRjaFNldC5JZD4oKTsKKyAgICAgIGZpbmFsIFNldDxQYXRjaFNldD4gbWF0Y2hlcyA9IG5ldyBIYXNoU2V0PFBhdGNoU2V0PigpOwogICAgICAgZm9yIChmaW5hbCBQYXRjaFNldCBwcyA6IHBhdGNoZXMpIHsKICAgICAgICAgZmluYWwgQ2hhbmdlIGNoYW5nZSA9IGRiLmNoYW5nZXMoKS5nZXQocHMuZ2V0SWQoKS5nZXRQYXJlbnRLZXkoKSk7CiAgICAgICAgIGlmIChpblByb2plY3QoY2hhbmdlKSkgewotICAgICAgICAgIG1hdGNoZXMuYWRkKHBzLmdldElkKCkpOworICAgICAgICAgIG1hdGNoZXMuYWRkKHBzKTsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgICBzd2l0Y2ggKG1hdGNoZXMuc2l6ZSgpKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICByZXR1cm4gbWF0Y2hlczsKKyAgICAgICAgICByZXR1cm4gbWF0Y2hlcy5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgY2FzZSAwOgogICAgICAgICAgIHRocm93IGVycm9yKCJcIiIgKyBwYXRjaElkZW50aXR5ICsgIlwiIG5vIHN1Y2ggcGF0Y2ggc2V0Iik7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zMjUsNyArMzkzLDggQEAKICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgIHRocm93IGVycm9yKCJcIiIgKyBwYXRjaElkZW50aXR5ICsgIlwiIGlzIG5vdCBhIHZhbGlkIHBhdGNoIHNldCIpOwogICAgICAgfQotICAgICAgaWYgKGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKSA9PSBudWxsKSB7CisgICAgICBmaW5hbCBQYXRjaFNldCBwYXRjaFNldCA9IGRiLnBhdGNoU2V0cygpLmdldChwYXRjaFNldElkKTsKKyAgICAgIGlmIChwYXRjaFNldCA9PSBudWxsKSB7CiAgICAgICAgIHRocm93IGVycm9yKCJcIiIgKyBwYXRjaElkZW50aXR5ICsgIlwiIG5vIHN1Y2ggcGF0Y2ggc2V0Iik7CiAgICAgICB9CiAgICAgICBpZiAocHJvamVjdENvbnRyb2wgIT0gbnVsbCkgewpAQCAtMzM1LDcgKzQwNCw3IEBACiAgICAgICAgICAgICAgICsgcHJvamVjdENvbnRyb2wuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGF0Y2hTZXRJZCk7CisgICAgICByZXR1cm4gcGF0Y2hTZXQ7CiAgICAgfQogCiAgICAgdGhyb3cgZXJyb3IoIlwiIiArIHBhdGNoSWRlbnRpdHkgKyAiXCIgaXMgbm90IGEgdmFsaWQgcGF0Y2ggc2V0Iik7CkBAIC0zNTIsMTggKzQyMSwyNCBAQAogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgcGFyc2VDb21tYW5kTGluZSgpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewogICAgIG9wdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PEFwcHJvdmVPcHRpb24+KCk7CisgICAgY3VzdG9tTGFiZWxzID0gTWFwcy5uZXdIYXNoTWFwKCk7CiAKLSAgICBmb3IgKEFwcHJvdmFsVHlwZSB0eXBlIDogYXBwcm92YWxUeXBlcy5nZXRBcHByb3ZhbFR5cGVzKCkpIHsKKyAgICBQcm9qZWN0Q29udHJvbCBhbGxQcm9qZWN0c0NvbnRyb2w7CisgICAgdHJ5IHsKKyAgICAgIGFsbFByb2plY3RzQ29udHJvbCA9IHByb2plY3RDb250cm9sRmFjdG9yeS5jb250cm9sRm9yKGFsbFByb2plY3RzKTsKKyAgICB9IGNhdGNoIChOb1N1Y2hQcm9qZWN0RXhjZXB0aW9uIGUpIHsKKyAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoIm1pc3NpbmcgIiArIGFsbFByb2plY3RzLmdldCgpKTsKKyAgICB9CisKKyAgICBmb3IgKExhYmVsVHlwZSB0eXBlIDogYWxsUHJvamVjdHNDb250cm9sLmdldExhYmVsVHlwZXMoKS5nZXRMYWJlbFR5cGVzKCkpIHsKICAgICAgIFN0cmluZyB1c2FnZSA9ICIiOwotICAgICAgZmluYWwgQXBwcm92YWxDYXRlZ29yeSBjYXRlZ29yeSA9IHR5cGUuZ2V0Q2F0ZWdvcnkoKTsKLSAgICAgIHVzYWdlID0gInNjb3JlIGZvciAiICsgY2F0ZWdvcnkuZ2V0TmFtZSgpICsgIlxuIjsKKyAgICAgIHVzYWdlID0gInNjb3JlIGZvciAiICsgdHlwZS5nZXROYW1lKCkgKyAiXG4iOwogCi0gICAgICBmb3IgKEFwcHJvdmFsQ2F0ZWdvcnlWYWx1ZSB2IDogdHlwZS5nZXRWYWx1ZXMoKSkgeworICAgICAgZm9yIChMYWJlbFZhbHVlIHYgOiB0eXBlLmdldFZhbHVlcygpKSB7CiAgICAgICAgIHVzYWdlICs9IHYuZm9ybWF0KCkgKyAiXG4iOwogICAgICAgfQogCi0gICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9Ci0gICAgICAgICAgIi0tIiArIGNhdGVnb3J5LmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJyAnLCAnLScpOworICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAiLS0iICsgdHlwZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKICAgICAgIG9wdGlvbkxpc3QuYWRkKG5ldyBBcHByb3ZlT3B0aW9uKG5hbWUsIHVzYWdlLCB0eXBlKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2NwQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NjcENvbW1hbmQuamF2YQppbmRleCAwOWMyNWZmLi45ODczODBmIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2NwQ29tbWFuZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TY3BDb21tYW5kLmphdmEKQEAgLTkyLDYgKzkyLDcgQEAKIAogICBwcml2YXRlIHZvaWQgcnVuSW1wKCkgewogICAgIHRyeSB7CisgICAgICByZWFkQWNrKCk7CiAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgewogICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TZXRBY2NvdW50Q29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldEFjY291bnRDb21tYW5kLmphdmEKaW5kZXggOTk0MGZjOC4uYTNlOWQ2ZSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldEFjY291bnRDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldEFjY291bnRDb21tYW5kLmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuYWNjb3VudC5SZWFsbTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc3NoLlNzaEtleUNhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQmFzZUNvbW1hbmQ7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKQEAgLTQ2LDYgKzQ3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqIFNldCBhIHVzZXIncyBhY2NvdW50IHNldHRpbmdzLiAqKi8KK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzZXQtYWNjb3VudCIsIGRlc2NyID0gIkNoYW5nZSBhbiBhY2NvdW50J3Mgc2V0dGluZ3MiKQogZmluYWwgY2xhc3MgU2V0QWNjb3VudENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7CiAKICAgQEFyZ3VtZW50KGluZGV4ID0gMCwgcmVxdWlyZWQgPSB0cnVlLCBtZXRhVmFyID0gIlVTRVIiLCB1c2FnZSA9ICJmdWxsIG5hbWUsIGVtYWlsLWFkZHJlc3MsIHNzaCB1c2VybmFtZSBvciBhY2NvdW50IGlkIikKQEAgLTE0NSw2ICsxNDcsNyBAQAogICAgIGlmIChmdWxsTmFtZSAhPSBudWxsKSB7CiAgICAgICBpZiAocmVhbG0uYWxsb3dzRWRpdChGaWVsZE5hbWUuRlVMTF9OQU1FKSkgewogICAgICAgICBhY2NvdW50LnNldEZ1bGxOYW1lKGZ1bGxOYW1lKTsKKyAgICAgICAgYWNjb3VudFVwZGF0ZWQgPSB0cnVlOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgxLCAiVGhlIHJlYWxtIGRvZXNuJ3QgYWxsb3cgZWRpdGluZyBuYW1lcyIpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFByb2plY3RDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2V0UHJvamVjdENvbW1hbmQuamF2YQppbmRleCA5MTQzZjViLi44YzA2Yzk3ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFByb2plY3RDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFByb2plY3RDb21tYW5kLmphdmEKQEAgLTE3LDEyICsxNywxNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkdsb2JhbENhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5hbm5vdGF0aW9ucy5SZXF1aXJlc0NhcGFiaWxpdHk7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlByb2plY3QuSW5oZXJpdGFibGVCb29sZWFuOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN0YXRlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5Qcm9qZWN0LlN1Ym1pdFR5cGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5NZXRhRGF0YVVwZGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlByb2plY3RDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnByb2plY3QuUHJvamVjdENhY2hlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RDb250cm9sOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiAKQEAgLTM2LDYgKzM4LDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBAUmVxdWlyZXNDYXBhYmlsaXR5KEdsb2JhbENhcGFiaWxpdHkuQURNSU5JU1RSQVRFX1NFUlZFUikKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzZXQtcHJvamVjdCIsIGRlc2NyID0gIkNoYW5nZSBhIHByb2plY3QncyBzZXR0aW5ncyIpCiBmaW5hbCBjbGFzcyBTZXRQcm9qZWN0Q29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyRmFjdG9yeQogICAgICAgLmdldExvZ2dlcihTZXRQcm9qZWN0Q29tbWFuZC5jbGFzcyk7CkBAIC01MCwyOSArNTMsNTcgQEAKICAgICAgICsgIihkZWZhdWx0OiBNRVJHRV9JRl9ORUNFU1NBUlkpIikKICAgcHJpdmF0ZSBTdWJtaXRUeXBlIHN1Ym1pdFR5cGU7CiAKKyAgQE9wdGlvbihuYW1lID0gIi0tY29udHJpYnV0b3ItYWdyZWVtZW50cyIsIHVzYWdlID0gImlmIGNvbnRyaWJ1dG9yIGFncmVlbWVudCBpcyByZXF1aXJlZCIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIGNvbnRyaWJ1dG9yQWdyZWVtZW50czsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1zaWduZWQtb2ZmLWJ5IiwgdXNhZ2UgPSAiaWYgc2lnbmVkLW9mZi1ieSBpcyByZXF1aXJlZCIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIHNpZ25lZE9mZkJ5OworCisgIEBPcHRpb24obmFtZSA9ICItLWNvbnRlbnQtbWVyZ2UiLCB1c2FnZSA9ICJhbGxvdyBhdXRvbWF0aWMgY29uZmxpY3QgcmVzb2x2aW5nIHdpdGhpbiBmaWxlcyIpCisgIHByaXZhdGUgSW5oZXJpdGFibGVCb29sZWFuIGNvbnRlbnRNZXJnZTsKKworICBAT3B0aW9uKG5hbWUgPSAiLS1jaGFuZ2UtaWQiLCB1c2FnZSA9ICJpZiBjaGFuZ2UtaWQgaXMgcmVxdWlyZWQiKQorICBwcml2YXRlIEluaGVyaXRhYmxlQm9vbGVhbiByZXF1aXJlQ2hhbmdlSUQ7CisKICAgQE9wdGlvbihuYW1lID0gIi0tdXNlLWNvbnRyaWJ1dG9yLWFncmVlbWVudHMiLCBhbGlhc2VzID0geyItLWNhIn0sIHVzYWdlID0gImlmIGNvbnRyaWJ1dG9yIGFncmVlbWVudCBpcyByZXF1aXJlZCIpCi0gIHByaXZhdGUgQm9vbGVhbiBjb250cmlidXRvckFncmVlbWVudHM7CisgIHZvaWQgc2V0VXNlQ29udHJpYnV0b3JBcmdyZWVtZW50cyhib29sZWFuIG9uKSB7CisgICAgY29udHJpYnV0b3JBZ3JlZW1lbnRzID0gSW5oZXJpdGFibGVCb29sZWFuLlRSVUU7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1uby1jb250cmlidXRvci1hZ3JlZW1lbnRzIiwgYWxpYXNlcyA9IHsiLS1uY2EifSwgdXNhZ2UgPSAiaWYgY29udHJpYnV0b3IgYWdyZWVtZW50IGlzIG5vdCByZXF1aXJlZCIpCi0gIHByaXZhdGUgQm9vbGVhbiBub0NvbnRyaWJ1dG9yQWdyZWVtZW50czsKKyAgdm9pZCBzZXROb0NvbnRyaWJ1dG9yQXJncmVlbWVudHMoYm9vbGVhbiBvbikgeworICAgIGNvbnRyaWJ1dG9yQWdyZWVtZW50cyA9IEluaGVyaXRhYmxlQm9vbGVhbi5GQUxTRTsKKyAgfQogCiAgIEBPcHRpb24obmFtZSA9ICItLXVzZS1zaWduZWQtb2ZmLWJ5IiwgYWxpYXNlcyA9IHsiLS1zbyJ9LCB1c2FnZSA9ICJpZiBzaWduZWQtb2ZmLWJ5IGlzIHJlcXVpcmVkIikKLSAgcHJpdmF0ZSBCb29sZWFuIHNpZ25lZE9mZkJ5OworICB2b2lkIHNldFVzZVNpZ25lZE9mZkJ5KGJvb2xlYW4gb24pIHsKKyAgICBzaWduZWRPZmZCeSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tbm8tc2lnbmVkLW9mZi1ieSIsIGFsaWFzZXMgPSB7Ii0tbnNvIn0sIHVzYWdlID0gImlmIHNpZ25lZC1vZmYtYnkgaXMgbm90IHJlcXVpcmVkIikKLSAgcHJpdmF0ZSBCb29sZWFuIG5vU2lnbmVkT2ZmQnk7CisgIHZvaWQgc2V0Tm9TaWduZWRPZmZCeShib29sZWFuIG9uKSB7CisgICAgc2lnbmVkT2ZmQnkgPSBJbmhlcml0YWJsZUJvb2xlYW4uRkFMU0U7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS11c2UtY29udGVudC1tZXJnZSIsIHVzYWdlID0gImFsbG93IGF1dG9tYXRpYyBjb25mbGljdCByZXNvbHZpbmcgd2l0aGluIGZpbGVzIikKLSAgcHJpdmF0ZSBCb29sZWFuIGNvbnRlbnRNZXJnZTsKKyAgdm9pZCBzZXRVc2VDb250ZW50TWVyZ2UoYm9vbGVhbiBvbikgeworICAgIGNvbnRlbnRNZXJnZSA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tbm8tY29udGVudC1tZXJnZSIsIHVzYWdlID0gImRvbid0IGFsbG93IGF1dG9tYXRpYyBjb25mbGljdCByZXNvbHZpbmcgd2l0aGluIGZpbGVzIikKLSAgcHJpdmF0ZSBCb29sZWFuIG5vQ29udGVudE1lcmdlOworICB2b2lkIHNldE5vQ29udGVudE1lcmdlKGJvb2xlYW4gb24pIHsKKyAgICBjb250ZW50TWVyZ2UgPSBJbmhlcml0YWJsZUJvb2xlYW4uRkFMU0U7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1yZXF1aXJlLWNoYW5nZS1pZCIsIGFsaWFzZXMgPSB7Ii0taWQifSwgdXNhZ2UgPSAiaWYgY2hhbmdlLWlkIGlzIHJlcXVpcmVkIikKLSAgcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVDaGFuZ2VJRDsKKyAgdm9pZCBzZXRSZXF1aXJlQ2hhbmdlSWQoYm9vbGVhbiBvbikgeworICAgIHJlcXVpcmVDaGFuZ2VJRCA9IEluaGVyaXRhYmxlQm9vbGVhbi5UUlVFOworICB9CiAKICAgQE9wdGlvbihuYW1lID0gIi0tbm8tY2hhbmdlLWlkIiwgYWxpYXNlcyA9IHsiLS1uaWQifSwgdXNhZ2UgPSAiaWYgY2hhbmdlLWlkIGlzIG5vdCByZXF1aXJlZCIpCi0gIHByaXZhdGUgQm9vbGVhbiBub1JlcXVpcmVDaGFuZ2VJRDsKKyAgdm9pZCBzZXROb0NoYW5nZUlkKGJvb2xlYW4gb24pIHsKKyAgICByZXF1aXJlQ2hhbmdlSUQgPSBJbmhlcml0YWJsZUJvb2xlYW4uRkFMU0U7CisgIH0KIAogICBAT3B0aW9uKG5hbWUgPSAiLS1wcm9qZWN0LXN0YXRlIiwgYWxpYXNlcyA9IHsiLS1wcyJ9LCB1c2FnZSA9ICJwcm9qZWN0J3MgdmlzaWJpbGl0eSBzdGF0ZSIpCiAgIHByaXZhdGUgU3RhdGUgc3RhdGU7CkBAIC04NSw3ICsxMTYsNiBAQAogCiAgIEBPdmVycmlkZQogICBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRmFpbHVyZSB7Ci0gICAgdmFsaWRhdGUoKTsKICAgICBQcm9qZWN0IGN0bFByb2plY3QgPSBwcm9qZWN0Q29udHJvbC5nZXRQcm9qZWN0KCk7CiAgICAgUHJvamVjdC5OYW1lS2V5IG5hbWVLZXkgPSBjdGxQcm9qZWN0LmdldE5hbWVLZXkoKTsKICAgICBTdHJpbmcgbmFtZSA9IGN0bFByb2plY3QuZ2V0TmFtZSgpOwpAQCAtOTcsMzggKzEyNywyNyBAQAogICAgICAgICBQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IFByb2plY3RDb25maWcucmVhZChtZCk7CiAgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGNvbmZpZy5nZXRQcm9qZWN0KCk7CiAKLSAgICAgICAgcHJvamVjdC5zZXRSZXF1aXJlQ2hhbmdlSUQocmVxdWlyZUNoYW5nZUlEICE9IG51bGwgPyByZXF1aXJlQ2hhbmdlSUQKLSAgICAgICAgICAgIDogcHJvamVjdC5pc1JlcXVpcmVDaGFuZ2VJRCgpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChub1JlcXVpcmVDaGFuZ2VJRCAhPSBudWxsCi0gICAgICAgICAgICA/ICFub1JlcXVpcmVDaGFuZ2VJRCA6IHByb2plY3QuaXNSZXF1aXJlQ2hhbmdlSUQoKSk7Ci0KLSAgICAgICAgcHJvamVjdC5zZXRTdWJtaXRUeXBlKHN1Ym1pdFR5cGUgIT0gbnVsbCA/IHN1Ym1pdFR5cGUgOiBwcm9qZWN0Ci0gICAgICAgICAgICAuZ2V0U3VibWl0VHlwZSgpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFVzZUNvbnRlbnRNZXJnZShjb250ZW50TWVyZ2UgIT0gbnVsbCA/IGNvbnRlbnRNZXJnZQotICAgICAgICAgICAgOiBwcm9qZWN0LmlzVXNlQ29udGVudE1lcmdlKCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0VXNlQ29udGVudE1lcmdlKG5vQ29udGVudE1lcmdlICE9IG51bGwgPyAhbm9Db250ZW50TWVyZ2UKLSAgICAgICAgICAgIDogcHJvamVjdC5pc1VzZUNvbnRlbnRNZXJnZSgpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhjb250cmlidXRvckFncmVlbWVudHMgIT0gbnVsbAotICAgICAgICAgICAgPyBjb250cmlidXRvckFncmVlbWVudHMgOiBwcm9qZWN0LmlzVXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0VXNlQ29udHJpYnV0b3JBZ3JlZW1lbnRzKG5vQ29udHJpYnV0b3JBZ3JlZW1lbnRzICE9IG51bGwKLSAgICAgICAgICAgID8gIW5vQ29udHJpYnV0b3JBZ3JlZW1lbnRzIDogcHJvamVjdC5pc1VzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cygpKTsKLQotICAgICAgICBwcm9qZWN0LnNldFVzZVNpZ25lZE9mZkJ5KHNpZ25lZE9mZkJ5ICE9IG51bGwgPyBzaWduZWRPZmZCeSA6IHByb2plY3QKLSAgICAgICAgICAgIC5pc1VzZVNpZ25lZE9mZkJ5KCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0VXNlQ29udGVudE1lcmdlKG5vU2lnbmVkT2ZmQnkgIT0gbnVsbCA/ICFub1NpZ25lZE9mZkJ5Ci0gICAgICAgICAgICA6IHByb2plY3QuaXNVc2VDb250ZW50TWVyZ2UoKSk7Ci0KLSAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihwcm9qZWN0RGVzY3JpcHRpb24gIT0gbnVsbCA/IHByb2plY3REZXNjcmlwdGlvbgotICAgICAgICAgICAgOiBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkpOwotCi0gICAgICAgIHByb2plY3Quc2V0U3RhdGUoc3RhdGUgIT0gbnVsbCA/IHN0YXRlIDogcHJvamVjdC5nZXRTdGF0ZSgpKTsKLQorICAgICAgICBpZiAocmVxdWlyZUNoYW5nZUlEICE9IG51bGwpIHsKKyAgICAgICAgICBwcm9qZWN0LnNldFJlcXVpcmVDaGFuZ2VJRChyZXF1aXJlQ2hhbmdlSUQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdWJtaXRUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICBwcm9qZWN0LnNldFN1Ym1pdFR5cGUoc3VibWl0VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRlbnRNZXJnZSAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXRVc2VDb250ZW50TWVyZ2UoY29udGVudE1lcmdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udHJpYnV0b3JBZ3JlZW1lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICBwcm9qZWN0LnNldFVzZUNvbnRyaWJ1dG9yQWdyZWVtZW50cyhjb250cmlidXRvckFncmVlbWVudHMpOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduZWRPZmZCeSAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXRVc2VTaWduZWRPZmZCeShzaWduZWRPZmZCeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2plY3REZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXREZXNjcmlwdGlvbihwcm9qZWN0RGVzY3JpcHRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgcHJvamVjdC5zZXRTdGF0ZShzdGF0ZSk7CisgICAgICAgIH0KICAgICAgICAgbWQuc2V0TWVzc2FnZSgiUHJvamVjdCBzZXR0aW5ncyB1cGRhdGVkIik7CiAgICAgICAgIGNvbmZpZy5jb21taXQobWQpOwogICAgICAgfSBmaW5hbGx5IHsKQEAgLTE1NCwxOCArMTczLDQgQEAKICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgZXJyLnRvU3RyaW5nKCkpOwogICAgIH0KICAgfQotCi0gIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewotICAgIGNoZWNrRXhjbHVzaXZpdHkoY29udGVudE1lcmdlLCAiLS11c2UtY29udGVudC1tZXJnZSIsCi0gICAgICAgIG5vQ29udGVudE1lcmdlLCAiLS1uby1jb250ZW50LW1lcmdlIik7Ci0KLSAgICBjaGVja0V4Y2x1c2l2aXR5KGNvbnRyaWJ1dG9yQWdyZWVtZW50cywgIi0tdXNlLWNvbnRyaWJ1dG9yLWFncmVlbWVudHMiLAotICAgICAgICBub0NvbnRyaWJ1dG9yQWdyZWVtZW50cywgIi0tbm8tY29udHJpYnV0b3ItYWdyZWVtZW50cyIpOwotCi0gICAgY2hlY2tFeGNsdXNpdml0eShzaWduZWRPZmZCeSwgIi0tdXNlLXNpZ25lZC1vZmYtYnkiLAotICAgICAgICBub1NpZ25lZE9mZkJ5LCAiLS1uby1zaWduZWQtb2ZmLWJ5Iik7Ci0KLSAgICBjaGVja0V4Y2x1c2l2aXR5KHJlcXVpcmVDaGFuZ2VJRCwgIi0tcmVxdWlyZS1jaGFuZ2UtaWQiLAotICAgICAgICBub1JlcXVpcmVDaGFuZ2VJRCwgIi0tbm8tY2hhbmdlLWlkIik7Ci0gIH0KIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TZXRSZXZpZXdlcnNDb21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2V0UmV2aWV3ZXJzQ29tbWFuZC5qYXZhCmluZGV4IGY4NzM4MjQuLjhlOWJjYWMgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TZXRSZXZpZXdlcnNDb21tYW5kLmphdmEKKysrIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1NldFJldmlld2Vyc0NvbW1hbmQuamF2YQpAQCAtMTQsMjEgKzE0LDI1IEBACiAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlJldmlld2VyUmVzdWx0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmV4dGVuc2lvbnMucmVzdGFwaS5SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5BY2NvdW50OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5DaGFuZ2U7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuY2xpZW50LlBhdGNoU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5SZXZJZDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBhdGNoLkFkZFJldmlld2VyOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5SZW1vdmVSZXZpZXdlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLkNoYW5nZVJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuRGVsZXRlUmV2aWV3ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5Qb3N0UmV2aWV3ZXJzOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aWV3ZXJSZXNvdXJjZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0Lk5vU3VjaENoYW5nZUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5Qcm9qZWN0Q29udHJvbDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nd3Rvcm0uc2VydmVyLk9ybUV4Y2VwdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmd3dG9ybS5zZXJ2ZXIuUmVzdWx0U2V0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKIAogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKIGltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwpAQCAtMzYsMTIgKzQwLDEyIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gInNldC1yZXZpZXdlcnMiLCBkZXNjciA9ICJBZGQgb3IgcmVtb3ZlIHJldmlld2VycyBvbiBhIGNoYW5nZSIpCiBwdWJsaWMgY2xhc3MgU2V0UmV2aWV3ZXJzQ29tbWFuZCBleHRlbmRzIFNzaENvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0KICAgICAgIExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNldFJldmlld2Vyc0NvbW1hbmQuY2xhc3MpOwpAQCAtNzIsMTAgKzc2LDEzIEBACiAgIHByaXZhdGUgUmV2aWV3RGIgZGI7CiAKICAgQEluamVjdAotICBwcml2YXRlIEFkZFJldmlld2VyLkZhY3RvcnkgYWRkUmV2aWV3ZXJGYWN0b3J5OworICBwcml2YXRlIFJldmlld2VyUmVzb3VyY2UuRmFjdG9yeSByZXZpZXdlckZhY3Rvcnk7CiAKICAgQEluamVjdAotICBwcml2YXRlIFJlbW92ZVJldmlld2VyLkZhY3RvcnkgcmVtb3ZlUmV2aWV3ZXJGYWN0b3J5OworICBwcml2YXRlIFByb3ZpZGVyPFBvc3RSZXZpZXdlcnM+IHBvc3RSZXZpZXdlcnNQcm92aWRlcjsKKworICBASW5qZWN0CisgIHByaXZhdGUgUHJvdmlkZXI8RGVsZXRlUmV2aWV3ZXI+IGRlbGV0ZVJldmlld2VyUHJvdmlkZXI7CiAKICAgQEluamVjdAogICBwcml2YXRlIENoYW5nZUNvbnRyb2wuRmFjdG9yeSBjaGFuZ2VDb250cm9sRmFjdG9yeTsKQEAgLTEwMiw2MiArMTA5LDQ4IEBACiAgIH0KIAogICBwcml2YXRlIGJvb2xlYW4gbW9kaWZ5T25lKENoYW5nZS5JZCBjaGFuZ2VJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpOwotCi0gICAgUmV2aWV3ZXJSZXN1bHQgcmVzdWx0OworICAgIENoYW5nZVJlc291cmNlIGNoYW5nZVJzcmMgPQorICAgICAgICBuZXcgQ2hhbmdlUmVzb3VyY2UoY2hhbmdlQ29udHJvbEZhY3RvcnkudmFsaWRhdGVGb3IoY2hhbmdlSWQpKTsKICAgICBib29sZWFuIG9rID0gdHJ1ZTsKIAogICAgIC8vIFJlbW92ZSByZXZpZXdlcnMKICAgICAvLwotICAgIHJlc3VsdCA9IHJlbW92ZVJldmlld2VyRmFjdG9yeS5jcmVhdGUoY2hhbmdlSWQsIHRvUmVtb3ZlKS5jYWxsKCk7Ci0gICAgb2sgJj0gcmVzdWx0LmdldEVycm9ycygpLmlzRW1wdHkoKTsKLSAgICBmb3IgKFJldmlld2VyUmVzdWx0LkVycm9yIHJlc3VsdEVycm9yIDogcmVzdWx0LmdldEVycm9ycygpKSB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgIHN3aXRjaCAocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUkVNT1ZFX05PVF9QRVJNSVRURUQ6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJub3QgcGVybWl0dGVkIHRvIHJlbW92ZSB7MH0gZnJvbSB7MX0iOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENPVUxEX05PVF9SRU1PVkU6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJjb3VsZCBub3QgcmVtb3ZlIHswfSBmcm9tIHsxfSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJjb3VsZCBub3QgcmVtb3ZlIHswfTogezJ9IjsKKyAgICBEZWxldGVSZXZpZXdlciBkZWxldGUgPSBkZWxldGVSZXZpZXdlclByb3ZpZGVyLmdldCgpOworICAgIGZvciAoQWNjb3VudC5JZCByZXZpZXdlciA6IHRvUmVtb3ZlKSB7CisgICAgICBSZXZpZXdlclJlc291cmNlIHJzcmMgPSByZXZpZXdlckZhY3RvcnkuY3JlYXRlKGNoYW5nZVJzcmMsIHJldmlld2VyKTsKKyAgICAgIFN0cmluZyBlcnJvciA9IG51bGw7OworICAgICAgdHJ5IHsKKyAgICAgICAgZGVsZXRlLmFwcGx5KHJzcmMsIG5ldyBEZWxldGVSZXZpZXdlci5JbnB1dCgpKTsKKyAgICAgIH0gY2F0Y2ggKFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICBlcnJvciA9IFN0cmluZy5mb3JtYXQoImNvdWxkIG5vdCByZW1vdmUgJXM6IG5vdCBmb3VuZCIsIHJldmlld2VyKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGVycm9yID0gU3RyaW5nLmZvcm1hdCgiY291bGQgbm90IHJlbW92ZSAlczogJXMiLAorICAgICAgICAgICAgcmV2aWV3ZXIsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgIH0KLSAgICAgIHdyaXRlRXJyb3IoImVycm9yIiwgTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwKLSAgICAgICAgICByZXN1bHRFcnJvci5nZXROYW1lKCksIGNoYW5nZUlkLCByZXN1bHRFcnJvci5nZXRUeXBlKCkpKTsKKyAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7CisgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIHdyaXRlRXJyb3IoImVycm9yIiwgZXJyb3IpOworICAgICAgfQogICAgIH0KIAogICAgIC8vIEFkZCByZXZpZXdlcnMKICAgICAvLwotICAgIHJlc3VsdCA9Ci0gICAgICAgIGFkZFJldmlld2VyRmFjdG9yeS5jcmVhdGUoY2hhbmdlSWQsIHRvQWRkLCB0cnVlKS5jYWxsKCk7Ci0gICAgb2sgJj0gcmVzdWx0LmdldEVycm9ycygpLmlzRW1wdHkoKTsKLSAgICBmb3IgKFJldmlld2VyUmVzdWx0LkVycm9yIHJlc3VsdEVycm9yIDogcmVzdWx0LmdldEVycm9ycygpKSB7Ci0gICAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICAgIHN3aXRjaCAocmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgUkVWSUVXRVJfTk9UX0ZPVU5EOgotICAgICAgICAgIG1lc3NhZ2UgPSAiYWNjb3VudCBvciBncm91cCB7MH0gbm90IGZvdW5kIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQ0NPVU5UX0lOQUNUSVZFOgotICAgICAgICAgIG1lc3NhZ2UgPSAiYWNjb3VudCB7MH0gaW5hY3RpdmUiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENIQU5HRV9OT1RfVklTSUJMRToKLSAgICAgICAgICBtZXNzYWdlID0gImNoYW5nZSB7MX0gbm90IHZpc2libGUgdG8gezB9IjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUk9VUF9FTVBUWToKLSAgICAgICAgICBtZXNzYWdlID0gImdyb3VwIHswfSBpcyBlbXB0eSI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1JPVVBfSEFTX1RPT19NQU5ZX01FTUJFUlM6Ci0gICAgICAgICAgbWVzc2FnZSA9ICJncm91cCB7MH0gaGFzIHRvbyBtYW55IG1lbWJlcnMiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdST1VQX05PVF9BTExPV0VEOgotICAgICAgICAgIG1lc3NhZ2UgPSAiZ3JvdXAgezB9IGlzIG5vdCBhbGxvd2VkIGFzIHJldmlld2VyIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBtZXNzYWdlID0gImNvdWxkIG5vdCBhZGQgezB9OiB7Mn0iOworICAgIFBvc3RSZXZpZXdlcnMgcG9zdCA9IHBvc3RSZXZpZXdlcnNQcm92aWRlci5nZXQoKTsKKyAgICBmb3IgKFN0cmluZyByZXZpZXdlciA6IHRvQWRkKSB7CisgICAgICBQb3N0UmV2aWV3ZXJzLklucHV0IGlucHV0ID0gbmV3IFBvc3RSZXZpZXdlcnMuSW5wdXQoKTsKKyAgICAgIGlucHV0LnJldmlld2VyID0gcmV2aWV3ZXI7CisgICAgICBTdHJpbmcgZXJyb3I7CisgICAgICB0cnkgeworICAgICAgICBlcnJvciA9IHBvc3QuYXBwbHkoY2hhbmdlUnNyYywgaW5wdXQpLmVycm9yOworICAgICAgfSBjYXRjaCAoUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIGVycm9yID0gU3RyaW5nLmZvcm1hdCgiY291bGQgbm90IGFkZCAlczogbm90IGZvdW5kIiwgcmV2aWV3ZXIpOworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgZXJyb3IgPSBTdHJpbmcuZm9ybWF0KCJjb3VsZCBub3QgYWRkICVzOiAlcyIsIHJldmlld2VyLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICB9Ci0gICAgICB3cml0ZUVycm9yKCJlcnJvciIsIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsCi0gICAgICAgICAgcmVzdWx0RXJyb3IuZ2V0TmFtZSgpLCBjaGFuZ2VJZCwgcmVzdWx0RXJyb3IuZ2V0VHlwZSgpKSk7CisgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgeworICAgICAgICBvayA9IGZhbHNlOworICAgICAgICB3cml0ZUVycm9yKCJlcnJvciIsIGVycm9yKTsKKyAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gb2s7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0NhY2hlcy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Nob3dDYWNoZXMuamF2YQppbmRleCBiZGNiNGZiLi4zMzY2ODQxIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0NhY2hlcy5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TaG93Q2FjaGVzLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuV29ya1F1ZXVlLlRhc2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hEYWVtb247CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOwpAQCAtMzIsNyArMzMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUubWluYS5jb3JlLnNlcnZpY2UuSW9BY2NlcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1pbmEuY29yZS5zZXNzaW9uLklvU2Vzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnNzaGQuc2VydmVyLkVudmlyb25tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlU3RhdEFjY2Vzc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlLldpbmRvd0NhY2hlU3RhdEFjY2Vzc29yOwogaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5PcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC01MCw2ICs1MSw3IEBACiAKIC8qKiBTaG93IHRoZSBjdXJyZW50IGNhY2hlIHN0YXRlcy4gKi8KIEBSZXF1aXJlc0NhcGFiaWxpdHkoR2xvYmFsQ2FwYWJpbGl0eS5WSUVXX0NBQ0hFUykKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzaG93LWNhY2hlcyIsIGRlc2NyID0gIkRpc3BsYXkgY3VycmVudCBjYWNoZSBzdGF0aXN0aWNzIikKIGZpbmFsIGNsYXNzIFNob3dDYWNoZXMgZXh0ZW5kcyBDYWNoZUNvbW1hbmQgewogICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBsb25nIHNlcnZlclN0YXJ0ZWQ7CiAKQEAgLTI1MCw2ICsyNTIsMTAgQEAKICAgICAgICAgY2FzZSBSVU5OSU5HOiB0YXNrc1J1bm5pbmcrKzsgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVBRFk6IHRhc2tzUmVhZHkrKzsgYnJlYWs7CiAgICAgICAgIGNhc2UgU0xFRVBJTkc6IHRhc2tzU2xlZXBpbmcrKzsgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FOQ0VMTEVEOgorICAgICAgICBjYXNlIERPTkU6CisgICAgICAgIGNhc2UgT1RIRVI6CisgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICAgIHN0ZG91dC5mb3JtYXQoCmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0Nvbm5lY3Rpb25zLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd0Nvbm5lY3Rpb25zLmphdmEKaW5kZXggYTFhNWI4Zi4uMWMzZDgyOCAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Nob3dDb25uZWN0aW9ucy5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TaG93Q29ubmVjdGlvbnMuamF2YQpAQCAtMTksNiArMTksNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5DdXJyZW50VXNlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuSWRlbnRpZmllZFVzZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnV0aWwuSWRHZW5lcmF0b3I7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hDb21tYW5kOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoRGFlbW9uOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoU2Vzc2lvbjsKQEAgLTQxLDYgKzQyLDcgQEAKIAogLyoqIFNob3cgdGhlIGN1cnJlbnQgU1NIIGNvbm5lY3Rpb25zLiAqLwogQFJlcXVpcmVzQ2FwYWJpbGl0eShHbG9iYWxDYXBhYmlsaXR5LlZJRVdfQ09OTkVDVElPTlMpCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAic2hvdy1jb25uZWN0aW9ucyIsIGRlc2NyID0gIkRpc3BsYXkgYWN0aXZlIGNsaWVudCBTU0ggY29ubmVjdGlvbnMiKQogZmluYWwgY2xhc3MgU2hvd0Nvbm5lY3Rpb25zIGV4dGVuZHMgU3NoQ29tbWFuZCB7CiAgIEBPcHRpb24obmFtZSA9ICItLW51bWVyaWMiLCBhbGlhc2VzID0geyItbiJ9LCB1c2FnZSA9ICJkb24ndCByZXNvbHZlIG5hbWVzIikKICAgcHJpdmF0ZSBib29sZWFuIG51bWVyaWM7CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd1F1ZXVlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU2hvd1F1ZXVlLmphdmEKaW5kZXggZjg2MjQ4NC4uZmVlNTI3NSAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Nob3dRdWV1ZS5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TaG93UXVldWUuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIudXRpbC5JZEdlbmVyYXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkFkbWluSGlnaFByaW9yaXR5Q29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OwogCkBAIC0zOSw2ICs0MCw3IEBACiAKIC8qKiBEaXNwbGF5IHRoZSBjdXJyZW50IHdvcmsgcXVldWUuICovCiBAQWRtaW5IaWdoUHJpb3JpdHlDb21tYW5kCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAic2hvdy1xdWV1ZSIsIGRlc2NyID0gIkRpc3BsYXkgdGhlIGJhY2tncm91bmQgd29yayBxdWV1ZXMsIGluY2x1ZGluZyByZXBsaWNhdGlvbiIpCiBmaW5hbCBjbGFzcyBTaG93UXVldWUgZXh0ZW5kcyBTc2hDb21tYW5kIHsKICAgQE9wdGlvbihuYW1lID0gIi13IiwgdXNhZ2UgPSAiZGlzcGxheSB3aXRob3V0IGxpbmUgd2lkdGggdHJ1bmNhdGlvbiIpCiAgIHByaXZhdGUgYm9vbGVhbiB3aWRlOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1N0cmVhbUV2ZW50cy5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1N0cmVhbUV2ZW50cy5qYXZhCmluZGV4IGZmNmRlYTkuLjFiODFhNDcgMTAwNjQ0Ci0tLSBhL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9TdHJlYW1FdmVudHMuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvU3RyZWFtRXZlbnRzLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LldvcmtRdWV1ZS5DYW5jZWxhYmxlUnVubmFibGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5CYXNlQ29tbWFuZDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlN0cmVhbUNvbW1hbmRFeGVjdXRvcjsKIGltcG9ydCBjb20uZ29vZ2xlLmdzb24uR3NvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CkBAIC0zMiw2ICszMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiAKK0BDb21tYW5kTWV0YURhdGEobmFtZSA9ICJzdHJlYW0tZXZlbnRzIiwgZGVzY3IgPSAiTW9uaXRvciBldmVudHMgb2NjdXJyaW5nIGluIHJlYWwgdGltZSIpCiBmaW5hbCBjbGFzcyBTdHJlYW1FdmVudHMgZXh0ZW5kcyBCYXNlQ29tbWFuZCB7CiAgIC8qKiBNYXhpbXVtIG51bWJlciBvZiBldmVudHMgdGhhdCBtYXkgYmUgcXVldWVkIHVwIGZvciBlYWNoIGNvbm5lY3Rpb24uICovCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRVZFTlRTID0gMTI4OwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRSdWxlLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1NDRlNC4uMDAwMDAwMAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKLQotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLkFjY291bnRJbmZvOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5kYXRhLlN1Ym1pdFJlY29yZDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQWNjb3VudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuQ2hhbmdlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnJldmlld2RiLmNsaWVudC5QYXRjaFNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5jbGllbnQuUHJvamVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5yZXZpZXdkYi5zZXJ2ZXIuUmV2aWV3RGI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuUHJvbG9nRW52aXJvbm1lbnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucnVsZXMuU3RvcmVkVmFsdWVzOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5PdXRwdXRGb3JtYXQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmFjY291bnQuQWNjb3VudENhY2hlOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jb25maWcuQW5vbnltb3VzQ293YXJkTmFtZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLkFjY291bnRBdHRyaWJ1dGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmV2ZW50cy5TdWJtaXRMYWJlbEF0dHJpYnV0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZXZlbnRzLlN1Ym1pdFJlY29yZEF0dHJpYnV0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIucHJvamVjdC5DaGFuZ2VDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wcm9qZWN0LlByb2plY3RTdGF0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLlNzaENvbW1hbmQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLnJlZmxlY3QuVHlwZVRva2VuOwotaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKLQotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmNvbXBpbGVyLkNvbXBpbGVFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5CdWZmZXJpbmdQcm9sb2dDb250cm9sOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuSmF2YU9iamVjdFRlcm07Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5MaXN0VGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZzsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlByb2xvZ0NsYXNzTG9hZGVyOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuUHJvbG9nTWFjaGluZUNvcHk7Ci1pbXBvcnQgY29tLmdvb2dsZWNvZGUucHJvbG9nX2NhZmUubGFuZy5TeW1ib2xUZXJtOwotaW1wb3J0IGNvbS5nb29nbGVjb2RlLnByb2xvZ19jYWZlLmxhbmcuVGVybTsKLWltcG9ydCBjb20uZ29vZ2xlY29kZS5wcm9sb2dfY2FmZS5sYW5nLlZhcmlhYmxlVGVybTsKLQotaW1wb3J0IG9yZy5rb2hzdWtlLmFyZ3M0ai5Bcmd1bWVudDsKLWltcG9ydCBvcmcua29oc3VrZS5hcmdzNGouT3B0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlB1c2hiYWNrUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqIENvbW1hbmQgdGhhdCBhbGxvd3MgdGVzdGluZyBvZiBwcm9sb2cgc3VibWl0LXJ1bGVzIGluIGEgbGl2ZSBpbnN0YW5jZS4gKi8KLWZpbmFsIGNsYXNzIFRlc3RTdWJtaXRSdWxlIGV4dGVuZHMgU3NoQ29tbWFuZCB7Ci0gIEBJbmplY3QKLSAgcHJpdmF0ZSBSZXZpZXdEYiBkYjsKLQotICBASW5qZWN0Ci0gIHByaXZhdGUgUHJvbG9nRW52aXJvbm1lbnQuRmFjdG9yeSBlbnZGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBDaGFuZ2VDb250cm9sLkZhY3RvcnkgY2NGYWN0b3J5OwotCi0gIEBJbmplY3QKLSAgcHJpdmF0ZSBBY2NvdW50Q2FjaGUgYWNjb3VudENhY2hlOwotCi0gIGZpbmFsIEBBbm9ueW1vdXNDb3dhcmROYW1lIFN0cmluZyBhbm9ueW1vdXNDb3dhcmROYW1lOwotCi0gIEBBcmd1bWVudChpbmRleCA9IDAsIHJlcXVpcmVkID0gdHJ1ZSwgdXNhZ2UgPSAiQ2hhbmdlSWQgdG8gbG9hZCBpbiBwcm9sb2cgZW52aXJvbm1lbnQiKQotICBwcml2YXRlIFN0cmluZyBjaGFuZ2VJZDsKLQotICBAT3B0aW9uKG5hbWUgPSAiLXMiLAotICAgICAgdXNhZ2UgPSAiUmVhZCBwcm9sb2cgc2NyaXB0IGZyb20gc3RkaW4gaW5zdGVhZCBvZiByZWFkaW5nIHJ1bGVzLnBsIGZyb20gdGhlIHJlZnMvbWV0YS9jb25maWcgYnJhbmNoIikKLSAgcHJpdmF0ZSBib29sZWFuIHVzZVN0ZGluOwotCi0gIEBPcHRpb24obmFtZSA9ICItLWZvcm1hdCIsIG1ldGFWYXIgPSAiRk1UIiwgdXNhZ2UgPSAiT3V0cHV0IGRpc3BsYXkgZm9ybWF0IikKLSAgcHJpdmF0ZSBPdXRwdXRGb3JtYXQgZm9ybWF0ID0gT3V0cHV0Rm9ybWF0LlRFWFQ7Ci0KLSAgQE9wdGlvbihuYW1lID0gIi0tbm8tZmlsdGVycyIsIGFsaWFzZXMgPSB7Ii1uIn0sCi0gICAgICB1c2FnZSA9ICJEb24ndCBydW4gdGhlIHN1Ym1pdF9maWx0ZXIvMiBmcm9tIHRoZSBwYXJlbnQgcHJvamVjdHMiKQotICBwcml2YXRlIGJvb2xlYW4gc2tpcFN1Ym1pdEZpbHRlcnM7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFDS0FHRV9MSVNUID0ge1Byb2xvZy5CVUlMVElOLCAiZ2Vycml0In07Ci0KLSAgQEluamVjdAotICBwdWJsaWMgVGVzdFN1Ym1pdFJ1bGUoQEFub255bW91c0Nvd2FyZE5hbWUgU3RyaW5nIGFub255bW91cykgewotICAgIGFub255bW91c0Nvd2FyZE5hbWUgPSBhbm9ueW1vdXM7Ci0gIH0KLSAgcHJpdmF0ZSBQcm9sb2dNYWNoaW5lQ29weSBuZXdNYWNoaW5lKCkgewotICAgIEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2wgY3RsID0gbmV3IEJ1ZmZlcmluZ1Byb2xvZ0NvbnRyb2woKTsKLSAgICBjdGwuc2V0TWF4RGF0YWJhc2VTaXplKDE2ICogMTAyNCk7Ci0gICAgY3RsLnNldFByb2xvZ0NsYXNzTG9hZGVyKG5ldyBQcm9sb2dDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpKTsKLSAgICByZXR1cm4gUHJvbG9nTWFjaGluZUNvcHkuc2F2ZShjdGwpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBVbmxvZ2dlZEZhaWx1cmUgewotICAgIFB1c2hiYWNrUmVhZGVyIGluUmVhZGVyID0gbmV3IFB1c2hiYWNrUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCi0gICAgdHJ5IHsKLSAgICAgIFByb2xvZ0Vudmlyb25tZW50IHBjbDsKLQotICAgICAgTGlzdDxDaGFuZ2U+IGNoYW5nZUxpc3QgPQotICAgICAgICAgIGRiLmNoYW5nZXMoKS5ieUtleShuZXcgQ2hhbmdlLktleShjaGFuZ2VJZCkpLnRvTGlzdCgpOwotICAgICAgaWYgKGNoYW5nZUxpc3Quc2l6ZSgpICE9IDEpCi0gICAgICAgIHRocm93IG5ldyBVbmxvZ2dlZEZhaWx1cmUoMSwgIkludmFsaWQgQ2hhbmdlSWQiKTsKLQotICAgICAgQ2hhbmdlIGMgPSBjaGFuZ2VMaXN0LmdldCgwKTsKLSAgICAgIFBhdGNoU2V0IHBzID0gZGIucGF0Y2hTZXRzKCkuZ2V0KGMuY3VycmVudFBhdGNoU2V0SWQoKSk7Ci0gICAgICAvLyBXaWxsIHRocm93IGV4Y2VwdGlvbiBpZiBjdXJyZW50IHVzZXIgY2FuIG5vdCBhY2Nlc3MgdGhpcyBjaGFuZ2UsIGFuZAotICAgICAgLy8gdGh1cyB3aWxsIGxlYWsgaW5mb3JtYXRpb24gdGhhdCBhIGNoYW5nZS1pZCBpcyB2YWxpZCBldmVuIHRob3VnaCB0aGUKLSAgICAgIC8vIHVzZXIgYXJlIG5vdCBhbGxvd2VkIHRvIHNlZSB0aGUgY2hhbmdlLgotICAgICAgLy8gU2VlIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nZXJyaXQvaXNzdWVzL2RldGFpbD9pZD0xNTg2Ci0gICAgICBDaGFuZ2VDb250cm9sIGNjID0gY2NGYWN0b3J5LmNvbnRyb2xGb3IoYyk7Ci0gICAgICBQcm9qZWN0U3RhdGUgcHJvamVjdFN0YXRlID0gY2MuZ2V0UHJvamVjdENvbnRyb2woKS5nZXRQcm9qZWN0U3RhdGUoKTsKLQotICAgICAgaWYgKHVzZVN0ZGluKSB7Ci0gICAgICAgIHBjbCA9IGVudkZhY3RvcnkuY3JlYXRlKG5ld01hY2hpbmUoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwY2wgPSBwcm9qZWN0U3RhdGUubmV3UHJvbG9nRW52aXJvbm1lbnQoKTsKLSAgICAgIH0KLQotICAgICAgcGNsLnNldChTdG9yZWRWYWx1ZXMuUkVWSUVXX0RCLCBkYik7Ci0gICAgICBwY2wuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0UsIGMpOwotICAgICAgcGNsLnNldChTdG9yZWRWYWx1ZXMuUEFUQ0hfU0VULCBwcyk7Ci0gICAgICBwY2wuc2V0KFN0b3JlZFZhbHVlcy5DSEFOR0VfQ09OVFJPTCwgY2MpOwotICAgICAgaWYgKHVzZVN0ZGluKSB7Ci0gICAgICAgIHBjbC5pbml0aWFsaXplKFBBQ0tBR0VfTElTVCk7Ci0gICAgICAgIHBjbC5leGVjdXRlKFByb2xvZy5CVUlMVElOLCAiY29uc3VsdF9zdHJlYW0iLAotICAgICAgICAgICAgU3ltYm9sVGVybS5pbnRlcm4oInN0ZGluIiksIG5ldyBKYXZhT2JqZWN0VGVybShpblJlYWRlcikpOwotICAgICAgfQotCi0gICAgICBMaXN0PFRlcm0+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFRlcm0+KCk7Ci0gICAgICBUZXJtIHN1Ym1pdFJ1bGUgPQotICAgICAgICAgIHBjbC5vbmNlKCJnZXJyaXQiLCAibG9jYXRlX3N1Ym1pdF9ydWxlIiwgbmV3IFZhcmlhYmxlVGVybSgpKTsKLQotICAgICAgZm9yIChUZXJtW10gdGVtcGxhdGUgOiBwY2wuYWxsKCJnZXJyaXQiLCAiY2FuX3N1Ym1pdCIsIHN1Ym1pdFJ1bGUsCi0gICAgICAgICAgbmV3IFZhcmlhYmxlVGVybSgpKSkgewotICAgICAgICByZXN1bHRzLmFkZCh0ZW1wbGF0ZVsxXSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghc2tpcFN1Ym1pdEZpbHRlcnMpIHsKLSAgICAgICAgcnVuU3VibWl0RmlsdGVycyhwcm9qZWN0U3RhdGUsIHJlc3VsdHMsIHBjbCk7Ci0gICAgICB9Ci0KLSAgICAgIExpc3Q8U3VibWl0UmVjb3JkPiByZXMgPSBjYy5yZXN1bHRzVG9TdWJtaXRSZWNvcmQoc3VibWl0UnVsZSwgcmVzdWx0cyk7Ci0gICAgICBmb3IgKFN1Ym1pdFJlY29yZCByIDogcmVzKSB7Ci0gICAgICAgIGlmIChmb3JtYXQuaXNKc29uKCkpIHsKLSAgICAgICAgICBTdWJtaXRSZWNvcmRBdHRyaWJ1dGUgc3VibWl0UmVjb3JkID0gbmV3IFN1Ym1pdFJlY29yZEF0dHJpYnV0ZSgpOwotICAgICAgICAgIHN1Ym1pdFJlY29yZC5zdGF0dXMgPSByLnN0YXR1cy5uYW1lKCk7Ci0KLSAgICAgICAgICBMaXN0PFN1Ym1pdExhYmVsQXR0cmlidXRlPiBzdWJtaXRMYWJlbHMgPSBuZXcgTGlua2VkTGlzdDxTdWJtaXRMYWJlbEF0dHJpYnV0ZT4oKTsKLSAgICAgICAgICBmb3IoU3VibWl0UmVjb3JkLkxhYmVsIGwgOiByLmxhYmVscykgewotICAgICAgICAgICAgU3VibWl0TGFiZWxBdHRyaWJ1dGUgbGFiZWwgPSBuZXcgU3VibWl0TGFiZWxBdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgIGxhYmVsLmxhYmVsID0gbC5sYWJlbDsKLSAgICAgICAgICAgIGxhYmVsLnN0YXR1cz0gbC5zdGF0dXMubmFtZSgpOwotICAgICAgICAgICAgaWYobC5hcHBsaWVkQnkgIT0gbnVsbCkgewotICAgICAgICAgICAgICBBY2NvdW50IGEgPSBhY2NvdW50Q2FjaGUuZ2V0KGwuYXBwbGllZEJ5KS5nZXRBY2NvdW50KCk7Ci0gICAgICAgICAgICAgIGxhYmVsLmJ5ID0gbmV3IEFjY291bnRBdHRyaWJ1dGUoKTsKLSAgICAgICAgICAgICAgbGFiZWwuYnkuZW1haWwgPSBhLmdldFByZWZlcnJlZEVtYWlsKCk7Ci0gICAgICAgICAgICAgIGxhYmVsLmJ5Lm5hbWUgPSBhLmdldEZ1bGxOYW1lKCk7Ci0gICAgICAgICAgICAgIGxhYmVsLmJ5LnVzZXJuYW1lID0gYS5nZXRVc2VyTmFtZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VibWl0TGFiZWxzLmFkZChsYWJlbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN1Ym1pdFJlY29yZC5sYWJlbHMgPSBzdWJtaXRMYWJlbHM7Ci0gICAgICAgICAgZm9ybWF0Lm5ld0dzb24oKS50b0pzb24oc3VibWl0UmVjb3JkLCBuZXcgVHlwZVRva2VuPFN1Ym1pdFJlY29yZEF0dHJpYnV0ZT4oKSB7fS5nZXRUeXBlKCksIHN0ZG91dCk7Ci0gICAgICAgICAgc3Rkb3V0LnByaW50KCdcbicpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvcihTdWJtaXRSZWNvcmQuTGFiZWwgbCA6IHIubGFiZWxzKSB7Ci0gICAgICAgICAgICBzdGRvdXQucHJpbnQobC5sYWJlbCArICI6ICIgKyBsLnN0YXR1cyk7Ci0gICAgICAgICAgICBpZihsLmFwcGxpZWRCeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIEFjY291bnRJbmZvIGEgPSBuZXcgQWNjb3VudEluZm8oYWNjb3VudENhY2hlLmdldChsLmFwcGxpZWRCeSkuZ2V0QWNjb3VudCgpKTsKLSAgICAgICAgICAgICAgc3Rkb3V0LnByaW50KCIgYnkgIiArIGEuZ2V0TmFtZUVtYWlsKGFub255bW91c0Nvd2FyZE5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ZG91dC5wcmludCgnXG4nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3Rkb3V0LnByaW50KCJcbiIgKyByLnN0YXR1cy5uYW1lKCkgKyAiXG4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKCJQcm9jZXNzaW5nIG9mIHByb2xvZyBzY3JpcHQgZmFpbGVkOiAiICsgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJ1blN1Ym1pdEZpbHRlcnMoUHJvamVjdFN0YXRlIHByb2plY3RTdGF0ZSwgTGlzdDxUZXJtPiByZXN1bHRzLAotICAgICAgUHJvbG9nRW52aXJvbm1lbnQgcGNsKSB0aHJvd3MgVW5sb2dnZWRGYWlsdXJlIHsKLSAgICBQcm9qZWN0U3RhdGUgcGFyZW50U3RhdGUgPSBwcm9qZWN0U3RhdGUuZ2V0UGFyZW50U3RhdGUoKTsKLSAgICBQcm9sb2dFbnZpcm9ubWVudCBjaGlsZEVudiA9IHBjbDsKLSAgICBTZXQ8UHJvamVjdC5OYW1lS2V5PiBwcm9qZWN0c1NlZW4gPSBuZXcgSGFzaFNldDxQcm9qZWN0Lk5hbWVLZXk+KCk7Ci0gICAgcHJvamVjdHNTZWVuLmFkZChwcm9qZWN0U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWVLZXkoKSk7Ci0KLSAgICB3aGlsZSAocGFyZW50U3RhdGUgIT0gbnVsbCkgewotICAgICAgaWYgKCFwcm9qZWN0c1NlZW4uYWRkKHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lS2V5KCkpKSB7Ci0gICAgICAgIC8vIHBhcmVudCBoYXMgYmVlbiBzZWVuIGJlZm9yZSwgc3RvcCB3YWxrIHVwIGluaGVyaXRhbmNlIHRyZWUKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBQcm9sb2dFbnZpcm9ubWVudCBwYXJlbnRFbnY7Ci0gICAgICB0cnkgewotICAgICAgICBwYXJlbnRFbnYgPSBwYXJlbnRTdGF0ZS5uZXdQcm9sb2dFbnZpcm9ubWVudCgpOwotICAgICAgfSBjYXRjaCAoQ29tcGlsZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgiQ2Fubm90IGNvbnN1bHQgcnVsZXMucGwgZm9yICIKLSAgICAgICAgICAgICsgcGFyZW50U3RhdGUuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSArIGVycik7Ci0gICAgICB9Ci0KLSAgICAgIHBhcmVudEVudi5jb3B5U3RvcmVkVmFsdWVzKGNoaWxkRW52KTsKLSAgICAgIFRlcm0gZmlsdGVyUnVsZSA9Ci0gICAgICAgICAgcGFyZW50RW52Lm9uY2UoImdlcnJpdCIsICJsb2NhdGVfc3VibWl0X2ZpbHRlciIsIG5ldyBWYXJpYWJsZVRlcm0oKSk7Ci0gICAgICBpZiAoZmlsdGVyUnVsZSAhPSBudWxsKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgVGVybSByZXN1bHRzVGVybSA9IENoYW5nZUNvbnRyb2wudG9MaXN0VGVybShyZXN1bHRzKTsKLSAgICAgICAgICByZXN1bHRzLmNsZWFyKCk7Ci0gICAgICAgICAgVGVybVtdIHRlbXBsYXRlID0KLSAgICAgICAgICAgICAgcGFyZW50RW52Lm9uY2UoImdlcnJpdCIsICJmaWx0ZXJfc3VibWl0X3Jlc3VsdHMiLCBmaWx0ZXJSdWxlLAotICAgICAgICAgICAgICAgICAgcmVzdWx0c1Rlcm0sIG5ldyBWYXJpYWJsZVRlcm0oKSk7Ci0gICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgZmluYWwgTGlzdDw/IGV4dGVuZHMgVGVybT4gdGVybUxpc3QgPQotICAgICAgICAgICAgICAoKExpc3RUZXJtKSB0ZW1wbGF0ZVsyXSkudG9KYXZhKCk7Ci0gICAgICAgICAgcmVzdWx0cy5hZGRBbGwodGVybUxpc3QpOwotICAgICAgICB9IGNhdGNoIChQcm9sb2dFeGNlcHRpb24gZXJyKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFVubG9nZ2VkRmFpbHVyZSgiRXhjZXB0aW9uIGNhbGxpbmcgIiArIGZpbHRlclJ1bGUgKyAiIG9mICIKLSAgICAgICAgICAgICAgKyBwYXJlbnRTdGF0ZS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpICsgZXJyKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlcnIpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgVW5sb2dnZWRGYWlsdXJlKCJFeGNlcHRpb24gY2FsbGluZyAiICsgZmlsdGVyUnVsZSArICIgb2YgIgotICAgICAgICAgICAgICArIHBhcmVudFN0YXRlLmdldFByb2plY3QoKS5nZXROYW1lKCkgKyBlcnIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHBhcmVudFN0YXRlID0gcGFyZW50U3RhdGUuZ2V0UGFyZW50U3RhdGUoKTsKLSAgICAgIGNoaWxkRW52ID0gcGFyZW50RW52OwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRSdWxlQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRSdWxlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzUxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFJ1bGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuY29tbWFuZHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5leHRlbnNpb25zLnJlc3RhcGkuUmVzdE1vZGlmeVZpZXc7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5SZXZpc2lvblJlc291cmNlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuVGVzdFN1Ym1pdFJ1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNoYW5nZS5UZXN0U3VibWl0UnVsZS5JbnB1dDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLkNvbW1hbmRNZXRhRGF0YTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CisKKy8qKiBDb21tYW5kIHRoYXQgYWxsb3dzIHRlc3Rpbmcgb2YgcHJvbG9nIHN1Ym1pdC1ydWxlcyBpbiBhIGxpdmUgaW5zdGFuY2UuICovCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAicnVsZSIsIGRlc2NyID0gIlRlc3QgcHJvbG9nIHN1Ym1pdCBydWxlcyIpCitmaW5hbCBjbGFzcyBUZXN0U3VibWl0UnVsZUNvbW1hbmQgZXh0ZW5kcyBCYXNlVGVzdFByb2xvZ0NvbW1hbmQgeworICBASW5qZWN0CisgIHByaXZhdGUgUHJvdmlkZXI8VGVzdFN1Ym1pdFJ1bGU+IHZpZXc7CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBSZXN0TW9kaWZ5VmlldzxSZXZpc2lvblJlc291cmNlLCBJbnB1dD4gY3JlYXRlVmlldygpIHsKKyAgICByZXR1cm4gdmlldy5nZXQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRUeXBlQ29tbWFuZC5qYXZhIGIvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1Rlc3RTdWJtaXRUeXBlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNmZmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVGVzdFN1Ym1pdFR5cGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOworCitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuZXh0ZW5zaW9ucy5yZXN0YXBpLlJlc3RNb2RpZnlWaWV3OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuUmV2aXNpb25SZXNvdXJjZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY2hhbmdlLlRlc3RTdWJtaXRSdWxlLklucHV0OworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5jaGFuZ2UuVGVzdFN1Ym1pdFR5cGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Db21tYW5kTWV0YURhdGE7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyOworCitAQ29tbWFuZE1ldGFEYXRhKG5hbWUgPSAidHlwZSIsIGRlc2NyID0gIlRlc3QgcHJvbG9nIHN1Ym1pdCB0eXBlIikKK2ZpbmFsIGNsYXNzIFRlc3RTdWJtaXRUeXBlQ29tbWFuZCBleHRlbmRzIEJhc2VUZXN0UHJvbG9nQ29tbWFuZCB7CisgIEBJbmplY3QKKyAgcHJpdmF0ZSBQcm92aWRlcjxUZXN0U3VibWl0VHlwZT4gdmlldzsKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIFJlc3RNb2RpZnlWaWV3PFJldmlzaW9uUmVzb3VyY2UsIElucHV0PiBjcmVhdGVWaWV3KCkgeworICAgIHJldHVybiB2aWV3LmdldCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVXBsb2FkLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVXBsb2FkLmphdmEKaW5kZXggNDZlYjc4OC4uZmMxMjdlYyAxMDA2NDQKLS0tIGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1VwbG9hZC5qYXZhCisrKyBiL2dlcnJpdC1zc2hkL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvc3NoZC9jb21tYW5kcy9VcGxvYWQuamF2YQpAQCAtMTUsNiArMTUsNyBAQAogcGFja2FnZSBjb20uZ29vZ2xlLmdlcnJpdC5zc2hkLmNvbW1hbmRzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQucmV2aWV3ZGIuc2VydmVyLlJldmlld0RiOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuQ2hhbmdlQ2FjaGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5UYWdDYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuZ2l0LlRyYW5zZmVyQ29uZmlnOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5naXQuVmlzaWJsZVJlZkZpbHRlcjsKQEAgLTM3LDYgKzM4LDkgQEAKICAgQEluamVjdAogICBwcml2YXRlIFRhZ0NhY2hlIHRhZ0NhY2hlOwogCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBDaGFuZ2VDYWNoZSBjaGFuZ2VDYWNoZTsKKwogICBAT3ZlcnJpZGUKICAgcHJvdGVjdGVkIHZvaWQgcnVuSW1wbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRmFpbHVyZSB7CiAgICAgaWYgKCFwcm9qZWN0Q29udHJvbC5jYW5SdW5VcGxvYWRQYWNrKCkpIHsKQEAgLTQ1LDcgKzQ5LDcgQEAKIAogICAgIGZpbmFsIFVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhyZXBvKTsKICAgICBpZiAoIXByb2plY3RDb250cm9sLmFsbFJlZnNBcmVWaXNpYmxlKCkpIHsKLSAgICAgIHVwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBWaXNpYmxlUmVmRmlsdGVyKHRhZ0NhY2hlLCByZXBvLAorICAgICAgdXAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IFZpc2libGVSZWZGaWx0ZXIodGFnQ2FjaGUsIGNoYW5nZUNhY2hlLCByZXBvLAogICAgICAgICAgIHByb2plY3RDb250cm9sLCBkYi5nZXQoKSwgdHJ1ZSkpOwogICAgIH0KICAgICB1cC5zZXRQYWNrQ29uZmlnKGNvbmZpZy5nZXRQYWNrQ29uZmlnKCkpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXNzaGQvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9zc2hkL2NvbW1hbmRzL1ZlcnNpb25Db21tYW5kLmphdmEgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVmVyc2lvbkNvbW1hbmQuamF2YQppbmRleCBhZGRiYjg0Li4yMDY2Y2MyIDEwMDY0NAotLS0gYS9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVmVyc2lvbkNvbW1hbmQuamF2YQorKysgYi9nZXJyaXQtc3NoZC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3NzaGQvY29tbWFuZHMvVmVyc2lvbkNvbW1hbmQuamF2YQpAQCAtMTUsOSArMTUsMTIgQEAKIHBhY2thZ2UgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kczsKIAogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LmNvbW1vbi5WZXJzaW9uOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuQ29tbWFuZE1ldGFEYXRhOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNzaGQuU3NoQ29tbWFuZDsKIAorQENvbW1hbmRNZXRhRGF0YShuYW1lID0gInZlcnNpb24iLCBkZXNjciA9ICJEaXNwbGF5IGdlcnJpdCB2ZXJzaW9uIikKIGZpbmFsIGNsYXNzIFZlcnNpb25Db21tYW5kIGV4dGVuZHMgU3NoQ29tbWFuZCB7CisKICAgQE92ZXJyaWRlCiAgIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBGYWlsdXJlIHsKICAgICBTdHJpbmcgdiA9IFZlcnNpb24uZ2V0VmVyc2lvbigpOwpkaWZmIC0tZ2l0IGEvZ2Vycml0LXV0aWwtY2xpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2dlcnJpdC11dGlsLWNsaS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKaW5kZXggNDcwOTQyZC4uOTQxZmIzMSAxMDA2NDQKLS0tIGEvZ2Vycml0LXV0aWwtY2xpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgYi9nZXJyaXQtdXRpbC1jbGkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC03LDYgKzcsNyBAQAogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQorb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9aWdub3JlCiBvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPXdhcm5pbmcKZGlmZiAtLWdpdCBhL2dlcnJpdC11dGlsLWNsaS9wb20ueG1sIGIvZ2Vycml0LXV0aWwtY2xpL3BvbS54bWwKaW5kZXggNDg4NmQwOS4uNmFjZjI3NCAxMDA2NDQKLS0tIGEvZ2Vycml0LXV0aWwtY2xpL3BvbS54bWwKKysrIGIvZ2Vycml0LXV0aWwtY2xpL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC11dGlsLWNsaTwvYXJ0aWZhY3RJZD4KQEAgLTM5LDYgKzM5LDExIEBACiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmluamVjdDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmd1aWNlPC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KZGlmZiAtLWdpdCBhL2dlcnJpdC11dGlsLWNsaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3V0aWwvY2xpL0NtZExpbmVQYXJzZXIuamF2YSBiL2dlcnJpdC11dGlsLWNsaS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvZ2Vycml0L3V0aWwvY2xpL0NtZExpbmVQYXJzZXIuamF2YQppbmRleCBhOWY1MjI5Li42OTU5OGNlIDEwMDY0NAotLS0gYS9nZXJyaXQtdXRpbC1jbGkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC91dGlsL2NsaS9DbWRMaW5lUGFyc2VyLmphdmEKKysrIGIvZ2Vycml0LXV0aWwtY2xpL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvdXRpbC9jbGkvQ21kTGluZVBhcnNlci5qYXZhCkBAIC0zNCw2ICszNCwxMCBAQAogCiBwYWNrYWdlIGNvbS5nb29nbGUuZ2Vycml0LnV0aWwuY2xpOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaW5rZWRIYXNoTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CiBpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuS2V5OwpAQCAtNTQsMTEgKzU4LDkgQEAKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIC8qKgogICogRXh0ZW5kZWQgY29tbWFuZCBsaW5lIHBhcnNlciB3aGljaCBoYW5kbGVzIC0tZm9vPXZhbHVlIGFyZ3VtZW50cy4KQEAgLTc2LDYgKzc4LDkgQEAKICAgcHJpdmF0ZSBmaW5hbCBJbmplY3RvciBpbmplY3RvcjsKICAgcHJpdmF0ZSBmaW5hbCBNeVBhcnNlciBwYXJzZXI7CiAKKyAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPcHRpb25IYW5kbGVyPiBvcHRpb25zOworCiAgIC8qKgogICAgKiBDcmVhdGVzIGEgbmV3IGNvbW1hbmQgbGluZSBvd25lciB0aGF0IHBhcnNlcyBhcmd1bWVudHMvb3B0aW9ucyBhbmQgc2V0IHRoZW0KICAgICogaW50byB0aGUgZ2l2ZW4gb2JqZWN0LgpAQCAtMTg2LDcgKzE5MSw3IEBACiAgIH0KIAogICBwdWJsaWMgdm9pZCBwYXJzZUFyZ3VtZW50KGZpbmFsIFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gdG1wID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFyZ3MubGVuZ3RoKTsKKyAgICBMaXN0PFN0cmluZz4gdG1wID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KGFyZ3MubGVuZ3RoKTsKICAgICBmb3IgKGludCBhcmdpID0gMDsgYXJnaSA8IGFyZ3MubGVuZ3RoOyBhcmdpKyspIHsKICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSBhcmdzW2FyZ2ldOwogICAgICAgaWYgKHN0ci5lcXVhbHMoIi0tIikpIHsKQEAgLTIxMSwzNiArMjE2LDMyIEBACiAKICAgcHVibGljIHZvaWQgcGFyc2VPcHRpb25NYXAoTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcmFtZXRlcnMpCiAgICAgICB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7Ci0gICAgcGFyc2VPcHRpb25NYXAocGFyYW1ldGVycywgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpKTsKKyAgICBNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gTGlua2VkSGFzaE11bHRpbWFwLmNyZWF0ZSgpOworICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGVudCA6IHBhcmFtZXRlcnMuZW50cnlTZXQoKSkgeworICAgICAgZm9yIChTdHJpbmcgdmFsIDogZW50LmdldFZhbHVlKCkpIHsKKyAgICAgICAgbWFwLnB1dChlbnQuZ2V0S2V5KCksIHZhbCk7CisgICAgICB9CisgICAgfQorICAgIHBhcnNlT3B0aW9uTWFwKG1hcCk7CiAgIH0KIAotICBwdWJsaWMgdm9pZCBwYXJzZU9wdGlvbk1hcChNYXA8U3RyaW5nLCBTdHJpbmdbXT4gcGFyYW1ldGVycywKLSAgICAgIFNldDxTdHJpbmc+IGFyZ05hbWVzKQorICBwdWJsaWMgdm9pZCBwYXJzZU9wdGlvbk1hcChNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zKQogICAgICAgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewotICAgIEFycmF5TGlzdDxTdHJpbmc+IHRtcCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGVudCA6IHBhcmFtZXRlcnMuZW50cnlTZXQoKSkgewotICAgICAgU3RyaW5nIG5hbWUgPSBlbnQuZ2V0S2V5KCk7Ci0gICAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDEpIHsKLSAgICAgICAgICBuYW1lID0gIi0iICsgbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuYW1lID0gIi0tIiArIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgICBMaXN0PFN0cmluZz4gdG1wID0gTGlzdHMubmV3QXJyYXlMaXN0V2l0aENhcGFjaXR5KDIgKiBwYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGZpbmFsIFN0cmluZyBrZXkgOiBwYXJhbXMua2V5U2V0KCkpIHsKKyAgICAgIFN0cmluZyBuYW1lID0gbWFrZU9wdGlvbihrZXkpOwogCi0gICAgICBpZiAoZmluZEhhbmRsZXIobmFtZSkgaW5zdGFuY2VvZiBCb29sZWFuT3B0aW9uSGFuZGxlcikgeworICAgICAgaWYgKGlzQm9vbGVhbihuYW1lKSkgewogICAgICAgICBib29sZWFuIG9uID0gZmFsc2U7Ci0gICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogZW50LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICBvbiA9IHRvQm9vbGVhbihlbnQuZ2V0S2V5KCksIHZhbHVlKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwYXJhbXMuZ2V0KGtleSkpIHsKKyAgICAgICAgICBvbiA9IHRvQm9vbGVhbihrZXksIHZhbHVlKTsKICAgICAgICAgfQogICAgICAgICBpZiAob24pIHsKICAgICAgICAgICB0bXAuYWRkKG5hbWUpOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGVudC5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgaWYgKCFhcmdOYW1lcy5jb250YWlucyhlbnQuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICB0bXAuYWRkKG5hbWUpOwotICAgICAgICAgIH0KKyAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwYXJhbXMuZ2V0KGtleSkpIHsKKyAgICAgICAgICB0bXAuYWRkKG5hbWUpOwogICAgICAgICAgIHRtcC5hZGQodmFsdWUpOwogICAgICAgICB9CiAgICAgICB9CkBAIC0yNDgsMjIgKzI0OSw0NCBAQAogICAgIHBhcnNlci5wYXJzZUFyZ3VtZW50KHRtcC50b0FycmF5KG5ldyBTdHJpbmdbdG1wLnNpemUoKV0pKTsKICAgfQogCisgIHB1YmxpYyBib29sZWFuIGlzQm9vbGVhbihTdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBmaW5kSGFuZGxlcihtYWtlT3B0aW9uKG5hbWUpKSBpbnN0YW5jZW9mIEJvb2xlYW5PcHRpb25IYW5kbGVyOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbWFrZU9wdGlvbihTdHJpbmcgbmFtZSkgeworICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDEpIHsKKyAgICAgICAgbmFtZSA9ICItIiArIG5hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gIi0tIiArIG5hbWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuYW1lOworICB9CisKICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKICAgcHJpdmF0ZSBPcHRpb25IYW5kbGVyIGZpbmRIYW5kbGVyKFN0cmluZyBuYW1lKSB7Ci0gICAgZm9yIChPcHRpb25IYW5kbGVyIGhhbmRsZXIgOiBwYXJzZXIub3B0aW9ucykgeworICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKKyAgICAgIG9wdGlvbnMgPSBpbmRleChwYXJzZXIub3B0aW9ucyk7CisgICAgfQorICAgIHJldHVybiBvcHRpb25zLmdldChuYW1lKTsKKyAgfQorCisgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9wdGlvbkhhbmRsZXI+IGluZGV4KExpc3Q8T3B0aW9uSGFuZGxlcj4gaW4pIHsKKyAgICBNYXA8U3RyaW5nLCBPcHRpb25IYW5kbGVyPiBtID0gTWFwcy5uZXdIYXNoTWFwKCk7CisgICAgZm9yIChPcHRpb25IYW5kbGVyIGhhbmRsZXIgOiBpbikgewogICAgICAgaWYgKGhhbmRsZXIub3B0aW9uIGluc3RhbmNlb2YgTmFtZWRPcHRpb25EZWYpIHsKICAgICAgICAgTmFtZWRPcHRpb25EZWYgZGVmID0gKE5hbWVkT3B0aW9uRGVmKSBoYW5kbGVyLm9wdGlvbjsKLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGRlZi5uYW1lKCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIGhhbmRsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTdHJpbmcgYWxpYXMgOiBkZWYuYWxpYXNlcygpKSB7Ci0gICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKGFsaWFzKSkgewotICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgICAgIGlmICghZGVmLmlzQXJndW1lbnQoKSkgeworICAgICAgICAgIG0ucHV0KGRlZi5uYW1lKCksIGhhbmRsZXIpOworICAgICAgICAgIGZvciAoU3RyaW5nIGFsaWFzIDogZGVmLmFsaWFzZXMoKSkgeworICAgICAgICAgICAgbS5wdXQoYWxpYXMsIGhhbmRsZXIpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbnVsbDsKKyAgICByZXR1cm4gbTsKICAgfQogCiAgIHByaXZhdGUgYm9vbGVhbiB0b0Jvb2xlYW4oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewpAQCAtMzI0LDExICszNDcsMTAgQEAKICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCiAgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU9wdGlvbnNJbml0aWFsaXplZCgpIHsKICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHsKICAgICAgICAgaGVscCA9IG5ldyBIZWxwT3B0aW9uKCk7Ci0gICAgICAgIG9wdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9wdGlvbkhhbmRsZXI+KCk7CisgICAgICAgIG9wdGlvbnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKICAgICAgICAgYWRkT3B0aW9uKGhlbHAsIGhlbHApOwogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2dlcnJpdC11dGlsLXNzbC9wb20ueG1sIGIvZ2Vycml0LXV0aWwtc3NsL3BvbS54bWwKaW5kZXggYmVlZGI4Zi4uMDQ3NDRhYSAxMDA2NDQKLS0tIGEvZ2Vycml0LXV0aWwtc3NsL3BvbS54bWwKKysrIGIvZ2Vycml0LXV0aWwtc3NsL3BvbS54bWwKQEAgLTIyLDcgKzIyLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmdlcnJpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjIuNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPmdlcnJpdC11dGlsLXNzbDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL2dlcnJpdC13YXIvcG9tLnhtbCBiL2dlcnJpdC13YXIvcG9tLnhtbAppbmRleCAxZjM3NTBlLi42OTA4NjBkIDEwMDY0NAotLS0gYS9nZXJyaXQtd2FyL3BvbS54bWwKKysrIGIvZ2Vycml0LXdhci9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5nZXJyaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5nZXJyaXQtd2FyPC9hcnRpZmFjdElkPgpAQCAtMzYsOSArMzYsOCBAQAogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS50b21jYXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDwhLS0gY29tcGlsZSwgbm90IHByb3ZpZGVkLiBvdXIgZW1iZWRkZWQgSmV0dHkgbmVlZHMgdGhpcyAtLT4KLSAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgIDxhcnRpZmFjdElkPnRvbWNhdC1zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CkBAIC01OSwxNCArNTgsMTIgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmJvdW5jeWNhc3RsZTwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmJjcHJvdi1qZGsxNTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE0MDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5ib3VuY3ljYXN0bGU8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5iY3BnLWpkazE1PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MTQwPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAKQEAgLTEwMiwxMCArOTksODkgQEAKICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+Z2Vycml0LXBnbTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDxleGNsdXNpb25zPgorICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudG9tY2F0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPnBsdWdpbnM8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICA8bmFtZT4hZ2Vycml0LnBsdWdpbnMuc2tpcDwvbmFtZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDwhLS0gQ09SRSBQTFVHSU4gTElTVCAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZXNvdXJjZS5nZXJyaXQucGx1Z2lucy5yZXBsaWNhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5yZXBsaWNhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlc291cmNlLmdlcnJpdC5wbHVnaW5zLnJldmlld25vdGVzPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPnJldmlld25vdGVzPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGVzb3VyY2UuZ2Vycml0LnBsdWdpbnMudmFsaWRhdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8L3Byb2ZpbGU+CisgIDwvcHJvZmlsZXM+CisKICAgPGJ1aWxkPgorCTxwbHVnaW5NYW5hZ2VtZW50PgorCSAgPHBsdWdpbnM+CisJICAgIDxwbHVnaW4+CisJICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UubTJlPC9ncm91cElkPgorCSAgICAgIDxhcnRpZmFjdElkPmxpZmVjeWNsZS1tYXBwaW5nPC9hcnRpZmFjdElkPgorCSAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgorCSAgICAgIDxjb25maWd1cmF0aW9uPgorCSAgICAgICAgPGxpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKwkgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbnM+CisJICAgICAgICAgICAgPHBsdWdpbkV4ZWN1dGlvbj4KKwkgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb25GaWx0ZXI+CisJICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKwkgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisJICAgICAgICAgICAgICAgIDx2ZXJzaW9uUmFuZ2U+WzIuMCwpPC92ZXJzaW9uUmFuZ2U+CisJICAgICAgICAgICAgICAgIDxnb2Fscz4KKwkgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5LWRlcGVuZGVuY2llczwvZ29hbD4KKwkgICAgICAgICAgICAgICAgICA8Z29hbD51bnBhY2s8L2dvYWw+Z29hbD4KKwkgICAgICAgICAgICAgICAgPC9nb2Fscz4KKwkgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uRmlsdGVyPgorCSAgICAgICAgICAgICAgPGFjdGlvbj4KKwkgICAgICAgICAgICAgICAgPGV4ZWN1dGUgLz4KKwkgICAgICAgICAgICAgIDwvYWN0aW9uPgorCSAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uPgorCSAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbnM+CisJICAgICAgICA8L2xpZmVjeWNsZU1hcHBpbmdNZXRhZGF0YT4KKwkgICAgICA8L2NvbmZpZ3VyYXRpb24+CisJICAgIDwvcGx1Z2luPgorCSAgPC9wbHVnaW5zPgorCTwvcGx1Z2luTWFuYWdlbWVudD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KQEAgLTEzOCw5ICsyMTQsNTkgQEAKIAogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jb3B5LXNlcnZsZXQtYXBpPC9pZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8aW5jbHVkZUdyb3VwSWRzPm9yZy5hcGFjaGUudG9tY2F0LG9yZy5lY2xpcHNlLmpldHR5PC9pbmNsdWRlR3JvdXBJZHM+CisgICAgICAgICAgICAgIDxleGNsdWRlQXJ0aWZhY3RJZHM+c2VydmxldC1hcGk8L2V4Y2x1ZGVBcnRpZmFjdElkcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Y29weS1wbHVnaW5zPC9pZD4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8IS0tIENPUkUgUExVR0lOIExJU1QgLS0+CisgICAgICAgICAgICAgIDxpbmNsdWRlQXJ0aWZhY3RJZHM+Y29tbWl0LW1lc3NhZ2UtbGVuZ3RoLXZhbGlkYXRvcixyZXBsaWNhdGlvbixyZXZpZXdub3RlczwvaW5jbHVkZUFydGlmYWN0SWRzPgorICAgICAgICAgICAgICA8aW5jbHVkZVR5cGVzPmphcjwvaW5jbHVkZVR5cGVzPgorICAgICAgICAgICAgICA8c3RyaXBWZXJzaW9uPnRydWU8L3N0cmlwVmVyc2lvbj4KKyAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS9XRUItSU5GL3BsdWdpbnM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKworICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8ZXhlY3V0aW9ucz4KICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNvcHktc2VydmxldC1hcGk8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHRhcmdldD4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiBsb2NhdGlvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeSIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZHN0IiBsb2NhdGlvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0vV0VCLUlORi9wZ20tbGliIiAvPgorCisgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtkc3R9IiAvPgorICAgICAgICAgICAgICAgIDxjb3B5IG92ZXJ3cml0ZT0idHJ1ZSIgdG9kaXI9IiR7ZHN0fSI+CisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouamFyIiAvPgorICAgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICAgIDwvY29weT4KKyAgICAgICAgICAgICAgPC90YXJnZXQ+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KICAgICAgICAgICAgIDxpZD5jb3B5LWxpY2Vuc2U8L2lkPgogICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CiAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KQEAgLTE2MSw3ICsyODcsNyBAQAogICAgICAgICAgICAgPGlkPmluY2x1ZGUtZG9jdW1lbnRhdGlvbjwvaWQ+CiAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8dGFyZ2V0IGlmPSJnZXJyaXQuaW5jbHVkZS1kb2N1bWVudGF0aW9uIj4KKyAgICAgICAgICAgICAgPHRhcmdldCB1bmxlc3M9ImdlcnJpdC5kb2N1bWVudGF0aW9uLnNraXAiPgogICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9Ly4uL0RvY3VtZW50YXRpb24iIC8+CiAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im91dCIgbG9jYXRpb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IiAvPgogICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkc3QiIGxvY2F0aW9uPSIke291dH0vRG9jdW1lbnRhdGlvbiIgLz4KQEAgLTE4NCw2ICszMTAsMzMgQEAKICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgogICAgICAgICAgICAgPC9nb2Fscz4KICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmluY2x1ZGUtcmVsZWFzZS1ub3RlczwvaWQ+CisgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8dGFyZ2V0IHVubGVzcz0iZ2Vycml0LmRvY3VtZW50YXRpb24uc2tpcCI+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249IiR7YmFzZWRpcn0vLi4vUmVsZWFzZU5vdGVzIiAvPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXQiIGxvY2F0aW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIgLz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZHN0IiBsb2NhdGlvbj0iJHtvdXR9L1JlbGVhc2VOb3RlcyIgLz4KKworICAgICAgICAgICAgICAgIDxleGVjIGRpcj0iJHtzcmN9IiBleGVjdXRhYmxlPSJtYWtlIj4KKyAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9IlZFUlNJT049JHtwcm9qZWN0LnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iY2xlYW4iIC8+CisgICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJhbGwiIC8+CisgICAgICAgICAgICAgICAgPC9leGVjPgorCisgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtkc3R9IiAvPgorICAgICAgICAgICAgICAgIDxjb3B5IG92ZXJ3cml0ZT0idHJ1ZSIgdG9kaXI9IiR7ZHN0fSI+CisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjfSI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiouaHRtbCIgLz4KKyAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgICAgICAgIDwvdGFyZ2V0PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICA8L2V4ZWN1dGlvbnM+CiAgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CmRpZmYgLS1naXQgYS9nZXJyaXQtd2FyL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9nZXJyaXQvaHR0cGQvV2ViQXBwSW5pdGlhbGl6ZXIuamF2YSBiL2dlcnJpdC13YXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJBcHBJbml0aWFsaXplci5qYXZhCmluZGV4IDFhNTU2YzIuLmQwYjhjMzggMTAwNjQ0Ci0tLSBhL2dlcnJpdC13YXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJBcHBJbml0aWFsaXplci5qYXZhCisrKyBiL2dlcnJpdC13YXIvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL2dlcnJpdC9odHRwZC9XZWJBcHBJbml0aWFsaXplci5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuaW5qZWN0LlN0YWdlLlBST0RVQ1RJT047CiAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5jb21tb24uQ2hhbmdlSG9va1J1bm5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5odHRwZC5HZXJyaXRVaU9wdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuaHR0cGQuYXV0aC5vcGVuaWQuT3BlbklkTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0Lmh0dHBkLnBsdWdpbnMuSHR0cFBsdWdpbk1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5saWZlY3ljbGUuTGlmZWN5Y2xlTWFuYWdlcjsKQEAgLTI4LDYgKzI5LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLkF1dGhDb25maWdNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5DYW5vbmljYWxXZWJVcmxNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRHbG9iYWxNb2R1bGU7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWc7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5HZXJyaXRTZXJ2ZXJDb25maWdNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmNvbmZpZy5NYXN0ZXJOb2RlU3RhcnR1cDsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuY29uZmlnLlNpdGVQYXRoOwpAQCAtMzcsMTIgKzM5LDE2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLmdpdC5Xb3JrUXVldWU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuU2lnbmVkVG9rZW5FbWFpbFRva2VuVmVyaWZpZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLm1haWwuU210cEVtYWlsU2VuZGVyOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wYXRjaC5JbnRyYUxpbmVXb3JrZXJQb29sOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5wbHVnaW5zLlBsdWdpbkd1aWNlRW52aXJvbm1lbnQ7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnBsdWdpbnMuUGx1Z2luTW9kdWxlOworaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YVNvdXJjZU1vZHVsZTsKIGltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VQcm92aWRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmdlcnJpdC5zZXJ2ZXIuc2NoZW1hLkRhdGFTb3VyY2VUeXBlOwogaW1wb3J0IGNvbS5nb29nbGUuZ2Vycml0LnNlcnZlci5zY2hlbWEuRGF0YWJhc2VNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc2VydmVyLnNjaGVtYS5TY2hlbWFWZXJzaW9uQ2hlY2s7CitpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hLZXlDYWNoZUltcGw7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5Tc2hNb2R1bGU7CiBpbXBvcnQgY29tLmdvb2dsZS5nZXJyaXQuc3NoZC5jb21tYW5kcy5NYXN0ZXJDb21tYW5kTW9kdWxlOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkFic3RyYWN0TW9kdWxlOwpAQCAtNTYsNiArNjIsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNlcnZsZXQuR3VpY2VTZXJ2bGV0Q29udGV4dExpc3RlbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LnNwaS5NZXNzYWdlOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTE0NCwxMCArMTUxLDM1IEBACiAgIHByaXZhdGUgSW5qZWN0b3IgY3JlYXRlRGJJbmplY3RvcigpIHsKICAgICBmaW5hbCBMaXN0PE1vZHVsZT4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8TW9kdWxlPigpOwogICAgIGlmIChzaXRlUGF0aCAhPSBudWxsKSB7Ci0gICAgICBtb2R1bGVzLmFkZChuZXcgTGlmZWN5Y2xlTW9kdWxlKCkgeworICAgICAgTW9kdWxlIHNpdGVQYXRoTW9kdWxlID0gbmV3IEFic3RyYWN0TW9kdWxlKCkgewogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgewogICAgICAgICAgIGJpbmQoRmlsZS5jbGFzcykuYW5ub3RhdGVkV2l0aChTaXRlUGF0aC5jbGFzcykudG9JbnN0YW5jZShzaXRlUGF0aCk7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBtb2R1bGVzLmFkZChzaXRlUGF0aE1vZHVsZSk7CisKKyAgICAgIE1vZHVsZSBjb25maWdNb2R1bGUgPSBuZXcgR2Vycml0U2VydmVyQ29uZmlnTW9kdWxlKCk7CisgICAgICBtb2R1bGVzLmFkZChjb25maWdNb2R1bGUpOworCisgICAgICBJbmplY3RvciBjZmdJbmplY3RvciA9IEd1aWNlLmNyZWF0ZUluamVjdG9yKHNpdGVQYXRoTW9kdWxlLCBjb25maWdNb2R1bGUpOworICAgICAgQ29uZmlnIGNmZyA9IGNmZ0luamVjdG9yLmdldEluc3RhbmNlKEtleS5nZXQoQ29uZmlnLmNsYXNzLAorICAgICAgICAgIEdlcnJpdFNlcnZlckNvbmZpZy5jbGFzcykpOworICAgICAgU3RyaW5nIGRiVHlwZSA9IGNmZy5nZXRTdHJpbmcoImRhdGFiYXNlIiwgbnVsbCwgInR5cGUiKTsKKworICAgICAgZmluYWwgRGF0YVNvdXJjZVR5cGUgZHN0ID0gR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IERhdGFTb3VyY2VNb2R1bGUoKSwKKyAgICAgICAgICBjb25maWdNb2R1bGUsIHNpdGVQYXRoTW9kdWxlKS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgIEtleS5nZXQoRGF0YVNvdXJjZVR5cGUuY2xhc3MsIE5hbWVzLm5hbWVkKGRiVHlwZS50b0xvd2VyQ2FzZSgpKSkpOworICAgICAgbW9kdWxlcy5hZGQobmV3IEFic3RyYWN0TW9kdWxlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgIGJpbmQoRGF0YVNvdXJjZVR5cGUuY2xhc3MpLnRvSW5zdGFuY2UoZHN0KTsKKyAgICAgICAgfQorICAgICAgfSk7CisKKyAgICAgIG1vZHVsZXMuYWRkKG5ldyBMaWZlY3ljbGVNb2R1bGUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CiAgICAgICAgICAgYmluZChEYXRhU291cmNlUHJvdmlkZXIuQ29udGV4dC5jbGFzcykudG9JbnN0YW5jZSgKICAgICAgICAgICAgICAgRGF0YVNvdXJjZVByb3ZpZGVyLkNvbnRleHQuTVVMVElfVVNFUik7CiAgICAgICAgICAgYmluZChLZXkuZ2V0KERhdGFTb3VyY2UuY2xhc3MsIE5hbWVzLm5hbWVkKCJSZXZpZXdEYiIpKSkudG9Qcm92aWRlcigKQEAgLTE1NSw3ICsxODcsNiBAQAogICAgICAgICAgIGxpc3RlbmVyKCkudG8oRGF0YVNvdXJjZVByb3ZpZGVyLmNsYXNzKTsKICAgICAgICAgfQogICAgICAgfSk7Ci0gICAgICBtb2R1bGVzLmFkZChuZXcgR2Vycml0U2VydmVyQ29uZmlnTW9kdWxlKCkpOwogCiAgICAgfSBlbHNlIHsKICAgICAgIG1vZHVsZXMuYWRkKG5ldyBMaWZlY3ljbGVNb2R1bGUoKSB7CkBAIC0xOTksMTEgKzIzMCwxMSBAQAogICAgIG1vZHVsZXMuYWRkKG5ldyBXb3JrUXVldWUuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBDaGFuZ2VIb29rUnVubmVyLk1vZHVsZSgpKTsKICAgICBtb2R1bGVzLmFkZChuZXcgUmVjZWl2ZUNvbW1pdHNFeGVjdXRvck1vZHVsZSgpKTsKKyAgICBtb2R1bGVzLmFkZChuZXcgSW50cmFMaW5lV29ya2VyUG9vbC5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQoY2ZnSW5qZWN0b3IuZ2V0SW5zdGFuY2UoR2Vycml0R2xvYmFsTW9kdWxlLmNsYXNzKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IERlZmF1bHRDYWNoZUZhY3RvcnkuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBTbXRwRW1haWxTZW5kZXIuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBTaWduZWRUb2tlbkVtYWlsVG9rZW5WZXJpZmllci5Nb2R1bGUoKSk7Ci0gICAgbW9kdWxlcy5hZGQobmV3IFNpZ25lZFRva2VuUmVzdFRva2VuVmVyaWZpZXIuTW9kdWxlKCkpOwogICAgIG1vZHVsZXMuYWRkKG5ldyBQbHVnaW5Nb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IENhbm9uaWNhbFdlYlVybE1vZHVsZSgpIHsKICAgICAgIEBPdmVycmlkZQpAQCAtMjExLDcgKzI0MiwxNCBAQAogICAgICAgICByZXR1cm4gSHR0cENhbm9uaWNhbFdlYlVybFByb3ZpZGVyLmNsYXNzOwogICAgICAgfQogICAgIH0pOworICAgIG1vZHVsZXMuYWRkKFNzaEtleUNhY2hlSW1wbC5tb2R1bGUoKSk7CiAgICAgbW9kdWxlcy5hZGQobmV3IE1hc3Rlck5vZGVTdGFydHVwKCkpOworICAgIG1vZHVsZXMuYWRkKG5ldyBBYnN0cmFjdE1vZHVsZSgpIHsKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kKEdlcnJpdFVpT3B0aW9ucy5jbGFzcykudG9JbnN0YW5jZShuZXcgR2Vycml0VWlPcHRpb25zKGZhbHNlKSk7CisgICAgICB9CisgICAgfSk7CiAgICAgcmV0dXJuIGNmZ0luamVjdG9yLmNyZWF0ZUNoaWxkSW5qZWN0b3IobW9kdWxlcyk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZ2Vycml0LXdhci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcyBiL2dlcnJpdC13YXIvc3JjL21haW4vcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKaW5kZXggNDVmNjMwZS4uMWZjY2E2ZCAxMDA2NDQKLS0tIGEvZ2Vycml0LXdhci9zcmMvbWFpbi9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcworKysgYi9nZXJyaXQtd2FyL3NyYy9tYWluL3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0zOCwxMCArMzgsOCBAQAogCiAjIFNpbGVuY2Ugbm9uLWNyaXRpY2FsIG1lc3NhZ2VzIGZyb20gb3BlbmlkNGphdmEKICMKK2xvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmh0dHA9V0FSTgogbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUueG1sPVdBUk4KLWxvZzRqLmxvZ2dlci5odHRwY2xpZW50LndpcmU9V0FSTgotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50PVdBUk4KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5IdHRwTWV0aG9kQmFzZT1FUlJPUgogbG9nNGoubG9nZ2VyLm9yZy5vcGVuaWQ0amF2YT1XQVJOCiBsb2c0ai5sb2dnZXIub3JnLm9wZW5pZDRqYXZhLmNvbnN1bWVyLkNvbnN1bWVyTWFuYWdlcj1GQVRBTAogbG9nNGoubG9nZ2VyLm9yZy5vcGVuaWQ0amF2YS5kaXNjb3ZlcnkuRGlzY292ZXJ5PUVSUk9SCkBAIC01NywzICs1NSw2IEBACiAjIFNpbGVuY2Ugbm9uLWNyaXRpY2FsIG1lc3NhZ2VzIGZyb20gVmVsb2NpdHkKICMKIGxvZzRqLmxvZ2dlci52ZWxvY2l0eT1XQVJOCisKKyMgU2lsZW5jZSBub24tY3JpdGljYWwgbWVzc2FnZXMgZnJvbSBhcGFjaGUuaHR0cAorbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuaHR0cD1XQVJOCmRpZmYgLS1naXQgYS9wbHVnaW5zL1JFQURNRSBiL3BsdWdpbnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZGYzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL1JFQURNRQpAQCAtMCwwICsxLDExIEBACitJZiB5b3UgYXJlIGFkZGluZyBhIGRpcmVjdG9yeSBoZXJlOgorCistIFNlYXJjaCBhbGwgcG9tLnhtbCBmaWxlcyBmb3IgIkNPUkUgUExVR0lOIExJU1QiLgorLSBBZGQgdGhlIG5ldyBwbHVnaW4gdG8gdGhhdCBsb2NhdGlvbi4KKy0gKG9wdGlvbmFsKSBUaGFuayB0aGUgTWF2ZW4gZGV2ZWxvcGVycyBmb3IgbWFraW5nIHRoaXMgZWFzeS4KKworLSBFbnN1cmUgdGhlIHBsdWdpbidzIHBvbS54bWwgPHZlcnNpb24+IGlzIHRoZSBzYW1lIGFzIEdlcnJpdCdzCisgIG93biBwb20ueG1sKHMpLiBHZXJyaXQgd2lsbCBvbmx5IGVtYmVkIGEgcGx1Z2luIHRoYXQgaGFzIHRoZQorICBzYW1lIHZlcnNpb24gYXMgaXRzZWxmLgorCistIFJlZ2lzdGVyIHRoZSBwbHVnaW4gYXMgYSBzdWJtb2R1bGUgd2l0aCBnaXQgc3VibW9kdWxlLgpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yIGIvcGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yCm5ldyBmaWxlIG1vZGUgMTYwMDAwCmluZGV4IDAwMDAwMDAuLmEyYWFmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL2NvbW1pdC1tZXNzYWdlLWxlbmd0aC12YWxpZGF0b3IKQEAgLTAsMCArMSBAQAorU3VicHJvamVjdCBjb21taXQgYTJhYWYxYTAxNTE5NTllNjllOGY1NzhkMmY2MGY2YTYwODA1MmU5YQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXBsaWNhdGlvbiBiL3BsdWdpbnMvcmVwbGljYXRpb24KbmV3IGZpbGUgbW9kZSAxNjAwMDAKaW5kZXggMDAwMDAwMC4uZTdiNGJjZQotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvcmVwbGljYXRpb24KQEAgLTAsMCArMSBAQAorU3VicHJvamVjdCBjb21taXQgZTdiNGJjZTcxZGFiZmUxY2MyMTE1YjAwNzkxNjA3ZTY4ZDYxYWNiOApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXZpZXdub3RlcyBiL3BsdWdpbnMvcmV2aWV3bm90ZXMKbmV3IGZpbGUgbW9kZSAxNjAwMDAKaW5kZXggMDAwMDAwMC4uYzg2OGMxZgotLS0gL2Rldi9udWxsCisrKyBiL3BsdWdpbnMvcmV2aWV3bm90ZXMKQEAgLTAsMCArMSBAQAorU3VicHJvamVjdCBjb21taXQgYzg2OGMxZmNjOWZhNWQxMjE2ZWNjMmNlZTI0YjkxM2RmNzUwY2NkZgpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggNzU0ZWFlMC4uZmVjMmZjOCAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5nZXJyaXQtcGFyZW50PC9hcnRpZmFjdElkPgogICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4yLjUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KIAogICA8bmFtZT5HZXJyaXQgQ29kZSBSZXZpZXcgLSBQYXJlbnQ8L25hbWU+CiAgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2dlcnJpdC88L3VybD4KQEAgLTQ2LDE0ICs0NiwxNSBAQAogICA8L2lzc3VlTWFuYWdlbWVudD4KIAogICA8cHJvcGVydGllcz4KLSAgICA8amdpdFZlcnNpb24+Mi4wLjAuMjAxMjA2MTMwOTAwLXIuMjQtZzZjYzUxYTU8L2pnaXRWZXJzaW9uPgotICAgIDxnd3Rvcm1WZXJzaW9uPjEuNDwvZ3d0b3JtVmVyc2lvbj4KKyAgICA8amdpdFZlcnNpb24+Mi4zLjEuMjAxMzAyMjAxODM4LXIuMjA5LWcxODAzMGY5PC9qZ2l0VmVyc2lvbj4KKyAgICA8Z3d0b3JtVmVyc2lvbj4xLjY8L2d3dG9ybVZlcnNpb24+CiAgICAgPGd3dGpzb25ycGNWZXJzaW9uPjEuMzwvZ3d0anNvbnJwY1ZlcnNpb24+Ci0gICAgPGd3dGV4cHVpVmVyc2lvbj4xLjIuNjwvZ3d0ZXhwdWlWZXJzaW9uPgotICAgIDxnd3RWZXJzaW9uPjIuNC4wPC9nd3RWZXJzaW9uPgorICAgIDxnd3RleHB1aVZlcnNpb24+MS4zLjI8L2d3dGV4cHVpVmVyc2lvbj4KKyAgICA8Z3d0VmVyc2lvbj4yLjUuMDwvZ3d0VmVyc2lvbj4KKyAgICA8Ym91bmN5Q2FzdGxlVmVyc2lvbj4xNDA8L2JvdW5jeUNhc3RsZVZlcnNpb24+CiAgICAgPHNsZjRqVmVyc2lvbj4xLjYuMTwvc2xmNGpWZXJzaW9uPgogICAgIDxndWljZVZlcnNpb24+My4wPC9ndWljZVZlcnNpb24+Ci0gICAgPGpldHR5VmVyc2lvbj43LjIuMS52MjAxMDExMTE8L2pldHR5VmVyc2lvbj4KKyAgICA8amV0dHlWZXJzaW9uPjguMS43LnYyMDEyMDkxMDwvamV0dHlWZXJzaW9uPgogCiAgICAgPGd3dC5jb21waWxlUmVwb3J0PmZhbHNlPC9nd3QuY29tcGlsZVJlcG9ydD4KIApAQCAtNzYsNiArNzcsNyBAQAogICAgIDxtb2R1bGU+Z2Vycml0LWNvbW1vbjwvbW9kdWxlPgogICAgIDxtb2R1bGU+Z2Vycml0LWNhY2hlLWgyPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5nZXJyaXQtaHR0cGQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPmdlcnJpdC1nd3R1aTwvbW9kdWxlPgogICAgIDxtb2R1bGU+Z2Vycml0LWxhdW5jaGVyPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5nZXJyaXQtbWFpbjwvbW9kdWxlPgogICAgIDxtb2R1bGU+Z2Vycml0LW9wZW5pZDwvbW9kdWxlPgpAQCAtODcsMjQgKzg5LDI5IEBACiAgICAgPG1vZHVsZT5nZXJyaXQtZ3d0ZGVidWc8L21vZHVsZT4KICAgICA8bW9kdWxlPmdlcnJpdC13YXI8L21vZHVsZT4KIAorICAgIDxtb2R1bGU+Z2Vycml0LWFjY2VwdGFuY2UtdGVzdHM8L21vZHVsZT4KICAgICA8bW9kdWxlPmdlcnJpdC1leHRlbnNpb24tYXBpPC9tb2R1bGU+Ci0KLSAgICA8bW9kdWxlPmdlcnJpdC1nd3R1aTwvbW9kdWxlPgorICAgIDxtb2R1bGU+Z2Vycml0LXBsdWdpbi1hcGk8L21vZHVsZT4KKyAgICA8bW9kdWxlPmdlcnJpdC1wbHVnaW4tYXJjaGV0eXBlPC9tb2R1bGU+CisgICAgPG1vZHVsZT5nZXJyaXQtcGx1Z2luLWd3dHVpPC9tb2R1bGU+CisgICAgPG1vZHVsZT5nZXJyaXQtcGx1Z2luLWpzLWFyY2hldHlwZTwvbW9kdWxlPgorICAgIDxtb2R1bGU+Z2Vycml0LXBsdWdpbi1nd3QtYXJjaGV0eXBlPC9tb2R1bGU+CiAgIDwvbW9kdWxlcz4KIAogICA8cHJvZmlsZXM+CiAgICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+YWxsPC9pZD4KLSAgICAgIDxtb2R1bGVzPgotICAgICAgICA8bW9kdWxlPmdlcnJpdC1wbHVnaW4tYXBpPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+Z2Vycml0LXBsdWdpbi1hcmNoZXR5cGU8L21vZHVsZT4KLSAgICAgIDwvbW9kdWxlcz4KLSAgICA8L3Byb2ZpbGU+Ci0gICAgPHByb2ZpbGU+CisgICAgICA8aWQ+cGx1Z2luczwvaWQ+CiAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICA8bmFtZT4hZ2Vycml0LnBsdWdpbnMuc2tpcDwvbmFtZT4KKyAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgIDxpZD5uby1wbHVnaW5zPC9pZD4KKyAgICAgIDxtb2R1bGVzPgorICAgICAgICA8IS0tIENPUkUgUExVR0lOIExJU1QgLS0+CisgICAgICAgIDxtb2R1bGU+cGx1Z2lucy9jb21taXQtbWVzc2FnZS1sZW5ndGgtdmFsaWRhdG9yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cGx1Z2lucy9yZXBsaWNhdGlvbjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBsdWdpbnMvcmV2aWV3bm90ZXM8L21vZHVsZT4KKyAgICAgIDwvbW9kdWxlcz4KICAgICA8L3Byb2ZpbGU+CiAgIDwvcHJvZmlsZXM+CiAKQEAgLTM2OSw3ICszNzYsMTMgQEAKICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+Mi4xMzwvdmVyc2lvbj4KICAgICAgICAgPC9wbHVnaW4+CiAKICAgICAgICAgPHBsdWdpbj4KQEAgLTM4MSw3ICszOTQsNyBAQAogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPmd3dC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi40LjA8L3ZlcnNpb24+CisgICAgICAgICAgPHZlcnNpb24+Mi41LjA8L3ZlcnNpb24+CiAgICAgICAgIDwvcGx1Z2luPgogCiAgICAgICAgIDxwbHVnaW4+CkBAIC00MDksNyArNDIyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KICAgICAgICAgICAgICAgICAgIDxhY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZ25vcmUvPgorICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGU+CisgICAgICAgICAgICAgICAgICAgICAgPHJ1bk9uSW5jcmVtZW50YWw+ZmFsc2U8L3J1bk9uSW5jcmVtZW50YWw+CisgICAgICAgICAgICAgICAgICAgICAgPHJ1bk9uQ29uZmlndXJhdGlvbj50cnVlPC9ydW5PbkNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0ZT4KICAgICAgICAgICAgICAgICAgIDwvYWN0aW9uPgogICAgICAgICAgICAgICAgIDwvcGx1Z2luRXhlY3V0aW9uPgogICAgICAgICAgICAgICAgIDxwbHVnaW5FeGVjdXRpb24+CkBAIC00MjIsNyArNDM4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbkZpbHRlcj4KICAgICAgICAgICAgICAgICAgIDxhY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxpZ25vcmUvPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0ZT4KKyAgICAgICAgICAgICAgICAgICAgICA8cnVuT25JbmNyZW1lbnRhbD5mYWxzZTwvcnVuT25JbmNyZW1lbnRhbD4KKyAgICAgICAgICAgICAgICAgICAgICA8cnVuT25Db25maWd1cmF0aW9uPnRydWU8L3J1bk9uQ29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGU+CiAgICAgICAgICAgICAgICAgICA8L2FjdGlvbj4KICAgICAgICAgICAgICAgICA8L3BsdWdpbkV4ZWN1dGlvbj4KICAgICAgICAgICAgICAgPC9wbHVnaW5FeGVjdXRpb25zPgpAQCAtNDQ2LDkgKzQ2NSw5IEBACiAKICAgICA8ZXh0ZW5zaW9ucz4KICAgICAgIDxleHRlbnNpb24+Ci0gICAgICAgIDxncm91cElkPm5ldC5hbnppeC5hd3M8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnMzLW1hdmVuLXdhZ29uPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+CisgICAgICAgIDxncm91cElkPmNvbS5nb29nbGVzb3VyY2UuZ2Vycml0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ncy1tYXZlbi13YWdvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4zPC92ZXJzaW9uPgogICAgICAgPC9leHRlbnNpb24+CiAgICAgPC9leHRlbnNpb25zPgogICA8L2J1aWxkPgpAQCAtNDc4LDcgKzQ5Nyw3IEBACiAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEyLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+MTQuMDwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CkBAIC01NjMsNyArNTgyLDcgQEAKICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnNzaGQ8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnNzaGQtY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MC41LjEtcjEwOTU4MDk8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjAuNi4wPC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICA8ZGVwZW5kZW5jeT4KQEAgLTY4OCw3ICs3MDcsMTMgQEAKICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5ib3VuY3ljYXN0bGU8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPmJjcGctamRrMTU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjE0MDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+JHtib3VuY3lDYXN0bGVWZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmJvdW5jeWNhc3RsZTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YmNwcm92LWpkazE1PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2JvdW5jeUNhc3RsZVZlcnNpb259PC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICA8ZGVwZW5kZW5jeT4KQEAgLTc2MSwxOSArNzg2LDE5IEBACiAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj40LjguMTwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+NC4xMTwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPmNvbS5oMmRhdGFiYXNlPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5oMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4yLjE0NzwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+MS4zLjE2ODwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPnBvc3RncmVzcWw8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnBvc3RncmVzcWw8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjkuMC04MDEuamRiYzQ8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPjkuMS05MDEtMS5qZGJjNDwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+CkBAIC03ODMsOCArODA4LDggQEAKICAgICAgICAgPGV4Y2x1c2lvbnM+CiAgICAgICAgICAgPGV4Y2x1c2lvbj4KICAgICAgICAgICAgIDwhLS0gdXNlIEFwYWNoZSBqYXZheC5zZXJ2bGV0IG5vdCBDRERMIC0tPgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHkub3JiaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0PC9hcnRpZmFjdElkPgogICAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgICA8L2RlcGVuZGVuY3k+CkBAIC04MDIsNiArODI3LDEyIEBACiAgICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnRvbWNhdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+dG9tY2F0LXNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj43LjAuMzI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd3dDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+Z3d0LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CiAgICAgICAgIDx2ZXJzaW9uPiR7Z3d0VmVyc2lvbn08L3ZlcnNpb24+CkBAIC04MjYsNyArODU3LDcgQEAKICAgICAgIDwvZGVwZW5kZW5jeT4KIAogICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ2Vycml0PC9ncm91cElkPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5qdW5pdmVyc2FsY2hhcmRldDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXZlcnNhbGNoYXJkZXQ8L2FydGlmYWN0SWQ+CiAgICAgICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgpAQCAtODQ4LDYgKzg3OSwxNyBAQAogICAgICAgICA8YXJ0aWZhY3RJZD5wZWdkb3duPC9hcnRpZmFjdElkPgogICAgICAgICA8dmVyc2lvbj4xLjEuMDwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5wYXJib2lsZWQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnBhcmJvaWxlZC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjEuMzwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcucGFyYm9pbGVkPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wYXJib2lsZWQtamF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xLjM8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPC9kZXBlbmRlbmNpZXM+CiAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CiAKQEAgLTg2OCwxMSArOTEwLDYgQEAKICAgICA8L3JlcG9zaXRvcnk+CiAKICAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxpZD5vYmplY3R3ZWItcmVwb3NpdG9yeTwvaWQ+Ci0gICAgICA8dXJsPmh0dHA6Ly9tYXZlbi5vYmplY3R3ZWIub3JnL21hdmVuMi88L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0KLSAgICA8cmVwb3NpdG9yeT4KICAgICAgIDxpZD5jbG9qYXJzLXJlcG88L2lkPgogICAgICAgPHVybD5odHRwOi8vY2xvamFycy5vcmcvcmVwbzwvdXJsPgogICAgIDwvcmVwb3NpdG9yeT4KZGlmZiAtLWdpdCBhL3Rvb2xzL2RlcGxveV9hcGkuc2ggYi90b29scy9kZXBsb3lfYXBpLnNoCmluZGV4IGU1OTA5ZTU0Li4yNmJhYTMxIDEwMDc1NQotLS0gYS90b29scy9kZXBsb3lfYXBpLnNoCisrKyBiL3Rvb2xzL2RlcGxveV9hcGkuc2gKQEAgLTE1LDcgKzE1LDcgQEAKICAgOzsKICotWzAtOV0qLWcqKSB0eXBlPXNuYXBzaG90IDs7CiBlc2FjCi1VUkw9czM6Ly9nZXJyaXQtYXBpQGNvbW1vbmRhdGFzdG9yYWdlLmdvb2dsZWFwaXMuY29tLyR0eXBlCitVUkw9Z3M6Ly9nZXJyaXQtYXBpLyR0eXBlCiAKIAogZWNobyAiRGVwbG95aW5nICR0eXBlIGdlcnJpdC1leHRlbnNpb24tYXBpICRWRVIiCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNlLnNoIGIvdG9vbHMvcmVsZWFzZS5zaAppbmRleCBkZTE4MzU3Li44OGU0YTAwIDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNlLnNoCisrKyBiL3Rvb2xzL3JlbGVhc2Uuc2gKQEAgLTEsMTYgKzEsMjUgQEAKICMhL2Jpbi9zaAogCi1pbmNsdWRlX2RvY3M9LURnZXJyaXQuaW5jbHVkZS1kb2N1bWVudGF0aW9uPTEKK2ZsYWdzPQogCiB3aGlsZSBbICQjIC1ndCAwIF0KIGRvCiAJY2FzZSAiJDEiIGluCiAJLS1uby1kb2N1bWVudGF0aW9ufC0td2l0aG91dC1kb2N1bWVudGF0aW9uKQotCQlpbmNsdWRlX2RvY3M9CisJCWZsYWdzPSIkZmxhZ3MgLURnZXJyaXQuZG9jdW1lbnRhdGlvbi5za2lwPXRydWUiCisJCXNoaWZ0CisJCTs7CisJLS1uby1wbHVnaW5zfC0td2l0aG91dC1wbHVnaW5zKQorCQlmbGFncz0iJGZsYWdzIC1EZ2Vycml0LnBsdWdpbnMuc2tpcD10cnVlIgorCQlzaGlmdAorCQk7OworCS0tbm8tdGVzdHN8LS13aXRob3V0LXRlc3RzKQorCQlmbGFncz0iJGZsYWdzIC1EZ2Vycml0LmFjY2VwdGFuY2UtdGVzdHMuc2tpcD10cnVlIgorCQlmbGFncz0iJGZsYWdzIC1EbWF2ZW4udGVzdHMuc2tpcD10cnVlIgogCQlzaGlmdAogCQk7OwogCSopCi0JCWVjaG8gPiYyICJ1c2FnZTogJDAgWy0td2l0aG91dC1kb2N1bWVudGF0aW9uXSIKKwkJZWNobyA+JjIgInVzYWdlOiAkMCBbLS1uby1kb2N1bWVudGF0aW9uXSBbLS1uby1wbHVnaW5zXSBbLS1uby10ZXN0c10iCiAJCWV4aXQgMQogCWVzYWMKIGRvbmUKQEAgLTI1LDcgKzM0LDcgQEAKIGZpCiAKIC4vdG9vbHMvdmVyc2lvbi5zaCAtLXJlbGVhc2UgJiYKLW12biBjbGVhbiBpbnN0YWxsICRpbmNsdWRlX2RvY3MgLVAgYWxsCittdm4gY2xlYW4gcGFja2FnZSB2ZXJpZnkgJGZsYWdzCiByYz0kPwogLi90b29scy92ZXJzaW9uLnNoIC0tcmVzZXQKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdmVyc2lvbi5zaCBiL3Rvb2xzL3ZlcnNpb24uc2gKaW5kZXggZDNlNGNkNS4uZGVmMDk5ZCAxMDA3NTUKLS0tIGEvdG9vbHMvdmVyc2lvbi5zaAorKysgYi90b29scy92ZXJzaW9uLnNoCkBAIC02LDcgKzYsMTUgQEAKICMgSmF2YSBiYXNlZCBNYXZlbiBwbHVnaW4gc28gaXRzIGZ1bGx5IHBvcnRhYmxlLgogIwogCi1QT01fRklMRVM9JChnaXQgbHMtZmlsZXMgfCBncmVwIHBvbS54bWwgfCBncmVwIC12IGdlcnJpdC1wbHVnaW4tYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwpCitTRVJWRVJfUE9NUz0kKGdpdCBscy1maWxlcyB8IGdyZXAgcG9tLnhtbCB8IGdyZXAgLXYgL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwpCitQT01fRklMRVM9JFNFUlZFUl9QT01TCisKKyMgQ09SRSBQTFVHSU4gTElTVAorUExVR0lOUz0iY29tbWl0LW1lc3NhZ2UtbGVuZ3RoLXZhbGlkYXRvciByZXBsaWNhdGlvbiByZXZpZXdub3RlcyIKK2ZvciBwIGluICRQTFVHSU5TCitkbworCVBPTV9GSUxFUz0iJFBPTV9GSUxFUyAkKGNkIHBsdWdpbnMvJHAgJiYgZ2l0IGxzLWZpbGVzIHwgZ3JlcCBwb20ueG1sIHwgc2VkIHMsXixwbHVnaW5zLyRwLywpIgorZG9uZQogCiBjYXNlICIkMSIgaW4KIC0tc25hcHNob3Q9KikKQEAgLTI3LDcgKzM1LDExIEBACiAJOzsKIAogLS1yZXNldCkKLQlnaXQgY2hlY2tvdXQgSEVBRCAtLSAkUE9NX0ZJTEVTCisJZ2l0IGNoZWNrb3V0IEhFQUQgLS0gJFNFUlZFUl9QT01TCisJZm9yIHAgaW4gJFBMVUdJTlMKKwlkbworCQkoY2QgcGx1Z2lucy8kcDsgZ2l0IGNoZWNrb3V0ICQoZ2l0IGxzLWZpbGVzIHwgZ3JlcCBwb20ueG1sKSkKKwlkb25lCiAJZXhpdCAkPwogCTs7CiAKQEAgLTQwLDcgKzUyLDcgQEAKIHYqKSBWPSQoZWNobyAiJFYiIHwgcGVybCAtcGUgcy9edi8vKSA7OwogZXNhYwogCi1wZXJsIC1waSAtZSAnCitwZXJsIC1waS5iYWsgLWUgJwogCWlmICgkQVJHViBuZSAkb2xkX2FyZ3YpIHsKIAkJJHNlZW5fdmVyc2lvbiA9IDA7CiAJCSRvbGRfYXJndiA9ICRBUkdWOwpAQCAtNTAsMyArNjIsOCBAQAogCQlzeyg8dmVyc2lvbj4pLiooPC92ZXJzaW9uPil9eyR7MX0nIiRWIickezJ9fTsKIAl9CiAJJyAkUE9NX0ZJTEVTCisKK2ZvciBwb20gaW4gJFBPTV9GSUxFUworZG8KKwlybSAtZiAke3BvbX0uYmFrCitkb25lCg==